@@ -626,6 +626,7 @@ void set_romsize(char *size)
626626{
627627 if (!strncmp (size , "32k\0" , 3 ))
628628 {
629+ romsize = 32 ;
629630 strcpy (redefined_variables [numredefvars ++ ], "ROM32K = 1" );
630631 if (strncmp (size + 3 , "RAM" , 3 ) == 0 )
631632 {
@@ -636,23 +637,28 @@ void set_romsize(char *size)
636637
637638 else if (!strncmp (size , "16k\0" , 3 ))
638639 {
640+ romsize = 16 ;
639641 strcpy (redefined_variables [numredefvars ++ ], "ROM16K = 1" );
640642 }
641643 else if (!strncmp (size , "8k\0" , 2 ))
642644 {
645+ romsize = 8 ;
643646 strcpy (redefined_variables [numredefvars ++ ], "ROM8K = 1" );
644647 }
645648
646649 else if (!strncmp (size , "48k\0" , 3 ))
647650 {
651+ romsize = 48 ;
648652 strcpy (redefined_variables [numredefvars ++ ], "ROM48K = 1" );
649653 }
650654 else if (!strncmp (size , "52k\0" , 3 ))
651655 {
656+ romsize = 52 ;
652657 strcpy (redefined_variables [numredefvars ++ ], "ROM52K = 1" );
653658 }
654659 else if (!strncmp (size , "144k\0" , 4 ))
655660 {
661+ romsize = 144 ;
656662 strcpy (redefined_variables [numredefvars ++ ], "ROM144K = 1" );
657663 strcpy (redefined_variables [numredefvars ++ ], "ROMAT4K = 1" );
658664 strcpy (redefined_variables [numredefvars ++ ], "bankswitchmode = 9" );
@@ -664,6 +670,7 @@ void set_romsize(char *size)
664670 }
665671 else if (!strncmp (size , "128k\0" , 4 ))
666672 {
673+ romsize = 128 ;
667674 strcpy (redefined_variables [numredefvars ++ ], "ROM128K = 1" );
668675 strcpy (redefined_variables [numredefvars ++ ], "bankswitchmode = 8" );
669676 bankcount = 8 ;
@@ -683,6 +690,7 @@ void set_romsize(char *size)
683690 }
684691 else if (!strncmp (size , "256k\0" , 4 ))
685692 {
693+ romsize = 256 ;
686694 strcpy (redefined_variables [numredefvars ++ ], "ROM256K = 1" );
687695 strcpy (redefined_variables [numredefvars ++ ], "bankswitchmode = 16" );
688696 bankcount = 16 ;
@@ -703,6 +711,7 @@ void set_romsize(char *size)
703711 }
704712 else if (!strncmp (size , "272k\0" , 4 ))
705713 {
714+ romsize = 272 ;
706715 strcpy (redefined_variables [numredefvars ++ ], "ROM272K = 1" );
707716 strcpy (redefined_variables [numredefvars ++ ], "ROMAT4K = 1" );
708717 strcpy (redefined_variables [numredefvars ++ ], "bankswitchmode = 17" );
@@ -714,6 +723,7 @@ void set_romsize(char *size)
714723 }
715724 else if (!strncmp (size , "512k\0" , 4 ))
716725 {
726+ romsize = 512 ;
717727 strcpy (redefined_variables [numredefvars ++ ], "ROM512K = 1" );
718728 strcpy (redefined_variables [numredefvars ++ ], "bankswitchmode = 32" );
719729 bankcount = 32 ;
@@ -734,6 +744,7 @@ void set_romsize(char *size)
734744 }
735745 else if (!strncmp (size , "528k\0" , 4 ))
736746 {
747+ romsize = 528 ;
737748 strcpy (redefined_variables [numredefvars ++ ], "ROM528K = 1" );
738749 strcpy (redefined_variables [numredefvars ++ ], "ROMAT4K = 1" );
739750 strcpy (redefined_variables [numredefvars ++ ], "bankswitchmode = 33" );
@@ -1329,8 +1340,23 @@ int inlinealphadata(char **statement)
13291340 if (statement [2 ][t ] == '^' )
13301341 statement [2 ][t ] = ' ' ;
13311342
1332- printf (" JMP skipalphadata%d\n" , templabel );
1333- printf ("alphadata%d\n" , templabel );
1343+ if (banksetrom == 0 )
1344+ {
1345+ printf (" JMP skipalphadata%d\n" , templabel );
1346+ printf ("alphadata%d\n" , templabel );
1347+ }
1348+ else
1349+ {
1350+ char banklabel [32 ];
1351+ int stringsize ;
1352+ snprintf (banklabel ,32 ,"alphadata%d" , templabel );
1353+ for (t = 1 ; (statement [2 ][t ] != '\'' ) && (statement [2 ][t ] != '\0' ); t ++ )
1354+ ;
1355+ stringsize = t - 1 ;
1356+ if ((doublewide == 1 )|| (strncmp (statement [6 ], "extrawide" , 9 ) == 0 ))
1357+ stringsize = stringsize * 2 ;
1358+ banksetdataopen (banklabel ,stringsize );
1359+ }
13341360
13351361 for (t = 1 ; (statement [2 ][t ] != '\'' ) && (statement [2 ][t ] != '\0' ); t ++ )
13361362 {
@@ -1349,18 +1375,81 @@ int inlinealphadata(char **statement)
13491375 }
13501376 if (quotelen > 32 )
13511377 prerror ("greater than 32 characters used in plotchars statement" );
1352- printf (" .byte (<%s + $%02x)\n" , currentcharset , charoffset );
1378+ gfxprintf (" .byte (<%s + $%02x)\n" , currentcharset , charoffset );
13531379 if (strncmp (statement [6 ], "extrawide" , 9 ) == 0 )
13541380 {
1355- printf (" .byte (<%s + $%02x)\n" , currentcharset , charoffset + 1 );
1381+ gfxprintf (" .byte (<%s + $%02x)\n" , currentcharset , charoffset + 1 );
13561382 }
13571383 }
1358- printf ("skipalphadata%d\n" , templabel );
1384+ if (banksetrom == 0 )
1385+ {
1386+ printf ("skipalphadata%d\n" , templabel );
1387+ }
1388+ else
1389+ {
1390+ banksetdataclose ();
1391+ }
13591392 sprintf (statement [2 ], "alphadata%d" , templabel );
13601393 templabel ++ ;
13611394 return (quotelen );
13621395}
13631396
1397+ int banksetdataopen (char * datalabel , int sizeofdata )
1398+ {
1399+ // utility function. updatates the bankset assembly with an ORG between the
1400+ // graphics banks
1401+ static long banksetdatastart = -1 ;
1402+ static long banksetdatacurrent = -1 ;
1403+ static int banksetbank = 0 ;
1404+
1405+ if (banksetdatastart == -1 )
1406+ {
1407+ // This is the first time we were called. Setup the start address for where
1408+ // we'll stuff string data. We don't start at the very bottom of the rom,
1409+ // because dmaholes don't exist that far down, and we want to leave rom
1410+ // between gfx areas as zero, so sprites can go there.
1411+
1412+ banksetdatastart = 0x8000 + (zoneheight * 256 ) ;
1413+ banksetdatacurrent = banksetdatastart ;
1414+ }
1415+
1416+ // check if the user has bankswitched since we were last called. If so, change
1417+ // change our address to the start of the current bank...
1418+ if ( banksetbank != currentbank )
1419+ {
1420+ banksetdatastart = 0x8000 + (zoneheight * 256 ) + (currentbank * 0x4000 ) ;
1421+ banksetdatacurrent = banksetdatastart ;
1422+ }
1423+
1424+ // check if storing this data would overflow the dmaplain. If so, advance to
1425+ // to the next plain.
1426+ if ( (banksetdatacurrent + sizeofdata ) >= (banksetdatastart + (zoneheight * 256 ) ) )
1427+ {
1428+ banksetdatastart = banksetdatastart + (2 * zoneheight * 256 );
1429+ banksetdatacurrent = banksetdatastart ;
1430+ }
1431+
1432+ gfxprintf ("BANKSETSAVEORG set .\n" );
1433+ gfxprintf (" ORG $%X \n" ,banksetdatacurrent );
1434+
1435+ // set data label to memory address it's found at
1436+ if (bankcount == 0 )
1437+ snprintf (redefined_variables [numredefvars ++ ],99 , "%s = $%lX\n" ,datalabel ,banksetdatacurrent );
1438+ else if (currentbank < (bankcount - 1 )) // if we're not in the last bank, $8000 is the base.
1439+ snprintf (redefined_variables [numredefvars ++ ],99 , "%s = $%lX\n" ,datalabel ,banksetdatacurrent - (currentbank * 0x4000 ));
1440+ else // if we're in the last bank, $c000 is the base
1441+ snprintf (redefined_variables [numredefvars ++ ],99 , "%s = $%lX\n" ,datalabel ,banksetdatacurrent - (currentbank * 0x4000 )+ 0x4000 );
1442+
1443+ // advance to the next bit of empty rom
1444+ banksetdatacurrent = banksetdatacurrent + sizeofdata ;
1445+ }
1446+
1447+
1448+ void banksetdataclose (void )
1449+ {
1450+ gfxprintf (" ORG (BANKSETSAVEORG)\n" );
1451+ }
1452+
13641453void plotchars (char * * statement )
13651454{
13661455 // 1 2 3 4 5 6
@@ -4172,12 +4261,23 @@ void barf_graphic_file(void)
41724261 DMASIZE = 8192 ;
41734262 if (bankcount == 0 )
41744263 {
4175- BANKSTART = 0xE000 ;
4264+ if ((banksetrom == 1 )&& (zoneheight == 8 ))
4265+ BANKSTART = 0xF000 ;
4266+ else
4267+ BANKSTART = 0xE000 ;
41764268 }
41774269 else if (currentbank == (bankcount - 1 )) // last bank
41784270 {
4179- BANKSTART = 0xE000 ;
4180- REALSTART = 0x8000 ;
4271+ if ((banksetrom == 1 )&& (zoneheight == 8 ))
4272+ {
4273+ BANKSTART = 0xF000 ;
4274+ REALSTART = 0x9000 ;
4275+ }
4276+ else
4277+ {
4278+ BANKSTART = 0xE000 ;
4279+ REALSTART = 0x8000 ;
4280+ }
41814281 }
41824282 else if ((romat4k == 1 ) && (currentbank == 0 ))
41834283 {
0 commit comments