107 char * p = strstr( originalBinaryFile,
".dsk" );
113 FILE * fh = fopen( originalBinaryFile,
"rb" );
114 int executableBinaryFileSize = 0;
116 fseek( fh, 0, SEEK_END );
117 executableBinaryFileSize = ftell( fh );
131 executableBinaryFileSize -= 5;
132 char * originalBinaryFileContent =
malloc( executableBinaryFileSize );
133 fh = fopen( originalBinaryFile,
"rb" );
134 (void)!fread( originalBinaryFileContent, 1, 5, fh);
135 (void)!fread( originalBinaryFileContent, 1, executableBinaryFileSize, fh);
139 if ( executableBinaryFileSize < programExeSize ) {
140 programExeSize = executableBinaryFileSize;
142 char * programExe =
malloc( programExeSize );
143 memcpy( programExe, originalBinaryFileContent, programExeSize );
144 executableBinaryFileSize -= programExeSize;
148 int programDataCount = 0;
150 int blockSize = 0x2000;
151 if ( executableBinaryFileSize ) {
152 char * originalBinaryFileContentPtr = originalBinaryFileContent + programExeSize;
153 while( executableBinaryFileSize ) {
154 if ( blockSize > executableBinaryFileSize ) {
155 blockSize = executableBinaryFileSize;
156 executableBinaryFileSize = blockSize;
158 programDats[programDataCount] =
malloc( blockSize );
159 programDatsSize[programDataCount] = blockSize;
160 memcpy( programDats[programDataCount], originalBinaryFileContentPtr, blockSize );
161 executableBinaryFileSize -= blockSize;
162 originalBinaryFileContentPtr += blockSize;
171 strcat( temporaryPath,
" " );
186 sprintf( outputFileName,
"%sprogram.exe", temporaryPath);
187 fh = fopen( outputFileName,
"wb" );
189 fputc( programExeSize >> 8, fh );
190 fputc( programExeSize & 0xff, fh );
193 fwrite( programExe, 1, programExeSize, fh );
201 if ( programDataCount ) {
202 for(
int i=0; i<programDataCount; ++i ) {
214 sprintf( outputFileName,
"%sprogram.%03d", temporaryPath, i);
215 fh = fopen( outputFileName,
"wb" );
217 fputc( programDatsSize[i] >> 8, fh );
218 fputc( programDatsSize[i] & 0xff, fh );
221 fwrite( programDats[i], 1, programDatsSize[i], fh );
236 sprintf( basFileName,
"%sloader.bas", temporaryPath);
237 fh = fopen( basFileName,
"wb" );
238 fprintf( fh,
"1 REM ugBASIC loader\n" );
239 fprintf( fh,
"2 REM --[ PROLOGUE ]--\n" );
240 fprintf( fh,
"3 DATA 26, 80, 52, 16, 52, 6,142, 14\n");
241 fprintf( fh,
"4 DATA 0,191, 0, 31, 31, 65, 16,206\n");
242 fprintf( fh,
"5 DATA 15, 0, 16,255, 0, 33,198,255\n");
243 fprintf( fh,
"6 DATA 166,133,167,229, 90, 38,249, 53\n");
244 fprintf( fh,
"7 DATA 6, 53, 16, 28,159, 57, 26, 80\n");
245 fprintf( fh,
"8 DATA 206, 16, 0,142, 42, 0, 16,142\n");
246 fprintf( fh,
"9 DATA 42, 0,183,255,223,166,128,167\n");
247 fprintf( fh,
"10DATA 160, 51, 95, 17,131, 0, 0, 38\n");
248 fprintf( fh,
"11DATA 244,183,255,222, 28,159, 57, 26\n");
249 fprintf( fh,
"12DATA 80,206, 16, 0,142, 42, 0, 16\n");
250 fprintf( fh,
"13DATA 142,192, 0,183,255,223,134, 0\n");
251 fprintf( fh,
"14DATA 183,255,166,166,128,167,160, 51\n");
252 fprintf( fh,
"15DATA 95, 17,131, 0, 0, 38,244,134\n");
253 fprintf( fh,
"16DATA 62,183,255,166,183,255,222, 28\n");
254 fprintf( fh,
"17DATA 159, 57, 0\n" );
255 fprintf( fh,
"18FORA=&HE00 TO &HE71:READX:POKEA,X:NEXTA\n" );
256 fprintf( fh,
"19REM --[ MAIN ]--\n" );
257 fprintf( fh,
"20CLEAR 999: EXEC &HE00: PRINT \"LOADING, PLEASE WAIT\";\n" );
267 if ( bankSize > blockSize ) {
268 fprintf( fh,
"%dLOADM\"BANK0.%03d\":PRINT\".\";\n", lineNr, bank->
id);
271 fprintf( fh,
"%dPOKE &HE51, &HC0: POKE &HE57, %d: EXEC &HE47\n", lineNr, bank->
id);
274 fprintf( fh,
"%dLOADM\"BANK1.%03d\":PRINT\".\";\n", lineNr, bank->
id);
277 fprintf( fh,
"%dPOKE &HE51, &HD0: EXEC &HE47\n", lineNr);
281 fprintf( fh,
"%dEXEC &HE46: LOADM\"BANK0.%03d\":PRINT\".\";\n", lineNr, bank->
id);
284 fprintf( fh,
"%dPOKE &HE51, &HC0: POKE &HE57, %d: EXEC &HE47\n", lineNr, bank->
id);
293 for(
int i=0; i<programDataCount; ++i ) {
294 fprintf( fh,
"%dLOADM\"PROGRAM.%03d\":?\".\";\n", lineNr, i);
296 int address = 0x4d + i*32;
297 int sizeHi = ( programDatsSize[i] >> 8 ) & 0xff;
298 int sizeLo = ( programDatsSize[i] ) & 0xff;
299 fprintf( fh,
"%dPOKE3632,%d:POKE3625,%d:POKE3626,%d:EXEC3620\n", lineNr, address, sizeHi, sizeLo );
302 fprintf( fh,
"90PRINT \"...\";: LOADM\"PROGRAM.EXE\": PRINT \"...\": EXEC\n" );
321 strcat( basePath, storage->
fileName );
323 strcat( basePath,
"disk%d.dsk" );
329 strcopy( filemask,
"disk%d.dsk" );
332 sprintf( buffer, filemask, 0 );
333 if ( !strstr( buffer,
".dsk" ) ) {
334 strcat( buffer,
".dsk" );
339 char * p = strstr( binaryName,
".bin" );
348 sprintf( commandLine,
"\"%s\" dskini \"%s\"", executableName, _environment->
exeFileName );
350 printf(
"The compilation of assembly program failed.\n\n");
351 printf(
"Please use option '-I' to install chain tool.\n\n");
354 sprintf( commandLine,
"\"%s\" copy -0 -t \"%s\" \"%s,LOADER.BAS\"",
359 printf(
"The compilation of assembly program failed.\n\n");
360 printf(
"Please use option '-I' to install chain tool.\n\n");
363 remove( basFileName );
365 sprintf( commandLine,
"\"%s\" copy -2 \"%sprogram.exe\" \"%s,PROGRAM.EXE\"",
370 printf(
"The compilation of assembly program failed.\n\n");
371 printf(
"Please use option '-I' to install chain tool.\n\n");
374 if ( programDataCount ) {
375 for(
int i=0; i<programDataCount; ++i ) {
376 sprintf( commandLine,
"\"%s\" copy -2 \"%sprogram.%03d\" \"%s,PROGRAM.%03d\"",
383 printf(
"The compilation of assembly program failed.\n\n");
384 printf(
"Please use option '-I' to install chain tool.\n\n");
400 while( fileStorage ) {
407 memset( buffer, 0,
size );
408 memcpy( buffer, fileStorage->
content, fileStorage->
size );
410 FILE * file = fopen( fileStorage->
sourceName,
"rb" );
414 fseek( file, 0, SEEK_END );
415 size = ftell( file );
416 fseek( file, 0, SEEK_SET );
418 memset( buffer, 0,
size + 2 );
419 (void)!fread( buffer,
size, 1, file );
423 sprintf( dataFilename,
"%s%s", temporaryPath, fileStorage->
targetName );
424 FILE * fileOut = fopen( dataFilename,
"wb" );
426 fwrite( buffer, 1,
size, fileOut );
429 sprintf( commandLine,
"\"%s\" copy -1 -b \"%s\" \"%s,%s\"",
435 printf(
"The compilation of assembly program failed.\n\n");
436 printf(
"Please use option '-I' to install chain tool.\n\n");
439 remove( dataFilename );
440 fileStorage = fileStorage->
next;
443 storage = storage->
next;
455 strcat( basePath, storage->
fileName );
457 strcat( basePath,
"disk%d.dsk" );
463 strcopy( filemask,
"disk%d.dsk" );
466 sprintf( buffer, filemask, i );
467 if ( !strstr( buffer,
".dsk" ) ) {
468 strcat( buffer,
".dsk" );
471 sprintf( commandLine,
"\"%s\" dskini \"%s\"", executableName, buffer );
473 printf(
"The compilation of assembly program failed.\n\n");
474 printf(
"Please use option '-I' to install chain tool.\n\n");
477 printf(
"%s\n", buffer );
488 if ( bankSize > 0 ) {
489 int effectiveSize = blockSize > bankSize ? bankSize : blockSize;
491 sprintf( bankFileName,
"%sbank0.%03d", temporaryPath, bank->
id );
492 fh = fopen( bankFileName,
"wb" );
494 fputc( (
unsigned char) ( ( effectiveSize >> 8 ) & 0xff ), fh );
495 fputc( (
unsigned char) ( ( effectiveSize ) & 0xff ), fh );
498 fwrite( &bank->
data[0], 1, effectiveSize, fh );
507 sprintf( commandLine,
"\"%s\" copy -2 \"%sbank0.%03d\" \"%s,BANK0.%03d\"",
514 printf(
"The compilation of assembly program failed.\n\n");
515 printf(
"Please use option '-I' to install chain tool.\n\n");
519 if ( bankSize > blockSize ) {
520 effectiveSize = bankSize - blockSize;
521 sprintf( bankFileName,
"%sbank1.%03d", temporaryPath, bank->
id );
522 fh = fopen( bankFileName,
"wb" );
524 fputc( (
unsigned char) ( ( effectiveSize >> 8 ) & 0xff ), fh );
525 fputc( (
unsigned char) ( ( effectiveSize ) & 0xff ), fh );
528 fwrite( &bank->
data[blockSize], 1, bankSize - blockSize, fh );
536 sprintf( commandLine,
"\"%s\" copy -2 \"%sbank1.%03d\" \"%s,BANK1.%03d\"",
543 printf(
"The compilation of assembly program failed.\n\n");
544 printf(
"Please use option '-I' to install chain tool.\n\n");
556 remove( originalBinaryFile );