Previous 15994 Revisions Next

r800 Wednesday 8th August, 2007 at 17:09:26 UTC by Wilbert Pol
[A2600] Added support for JVP 2-in-1 banking mechanism.
[src/mess/drivers]a2600.c

src/mess/drivers/a2600.c
r799r800
3939   modeSS,
4040   modeFV,
4141   modeDPC,
42   mode32in1
42   mode32in1,
43   modeJVP
4344};
4445
4546struct DPC_DF {
r799r800
8384static unsigned modeSS_diff_adjust;
8485static unsigned FVlocked;
8586
87static UINT16 current_screen_height;
88static const UINT16 supported_screen_heights[4] = { 262, 312, 328, 342 };
89
8690// try to detect 2600 controller setup. returns 32bits with left/right controller info
8791
8892static unsigned long detect_2600controllers(void)
r799r800
563567void modeFV_switch(UINT16 offset, UINT8 data)
564568{
565569   //printf("ModeFV %04x\n",offset);
566   if (!FVlocked) {
570   if (!FVlocked && ( activecpu_get_pc() & 0x1F00 ) == 0x1F00 ) {
567571      FVlocked = 1;
568572      current_bank = current_bank ^ 0x01;
569573      bank_base[1] = CART + 0x1000 * current_bank;
570574      memory_set_bankptr(1, bank_base[1]);
571575   }
572576}
577void modeJVP_switch(UINT16 offset, UINT8 data)
578{
579   switch( offset ) {
580   case 0x00:
581   case 0x20:
582      current_bank ^= 1;
583      break;
584   default:
585      printf("%04X: write to unknown mapper address %02X\n", activecpu_get_pc(), 0xfa0 + offset );
586      break;
587   }
588   bank_base[1] = CART + 0x1000 * current_bank;
589   memory_set_bankptr( 1, bank_base[1] );
590}
573591
574592
575593/* These read handlers will return the byte from the new bank */
r799r800
583601static  READ8_HANDLER(modeUA_switch_r) { modeUA_switch(offset, 0); return 0; }
584602static  READ8_HANDLER(modeDC_switch_r) { modeDC_switch(offset, 0); return bank_base[1][0xff0 + offset]; }
585603static  READ8_HANDLER(modeFV_switch_r) { modeFV_switch(offset, 0); return bank_base[1][0xfd0 + offset]; }
604static  READ8_HANDLER(modeJVP_switch_r) { modeJVP_switch(offset, 0); return riot_ram[ 0x20 + offset ]; }
586605
587606
588607static WRITE8_HANDLER(mode8K_switch_w) { mode8K_switch(offset, data); }
r799r800
603622   }
604623}
605624static WRITE8_HANDLER(modeFV_switch_w) { modeFV_switch(offset, data); }
625static WRITE8_HANDLER(modeJVP_switch_w) { modeJVP_switch(offset, data); riot_ram[ 0x20 + offset ] = data; }
606626
607627
608628OPBASE_HANDLER( modeSS_opbase )
r799r800
10111031   return val;
10121032}
10131033
1034static WRITE8_HANDLER( switch_B_w ) {
1035}
10141036
1037static void irq_callback(int state) {
1038}
1039
10151040static const struct riot6532_interface r6532_interface =
10161041{
10171042   switch_A_r,
10181043   input_port_8_r,
10191044   switch_A_w,
1020   NULL,
1021   NULL
1045   switch_B_w,
1046   irq_callback
10221047};
10231048
10241049
r799r800
12241249   return last_byte;
12251250}
12261251
1252static const rectangle visarea[4] = {
1253   { 26, 26 + 160 + 16, 24, 24 + 192 + 31 },   /* 262 */
1254   { 26, 26 + 160 + 16, 32, 32 + 228 + 31 },   /* 312 */
1255   { 26, 26 + 160 + 16, 45, 45 + 240 + 31 },   /* 328 */
1256   { 26, 26 + 160 + 16, 48, 48 + 240 + 31 }   /* 342 */
1257};
1258
1259static WRITE16_HANDLER( a2600_tia_vsync_callback ) {
1260   int i;
1261
1262   for ( i = 0; i < sizeof( supported_screen_heights ) / sizeof( supported_screen_heights[0] ); i++ ) {
1263      if ( data >= supported_screen_heights[i] - 3 && data <= supported_screen_heights[i] + 3 ) {
1264         if ( supported_screen_heights[i] != current_screen_height ) {
1265            current_screen_height = supported_screen_heights[i];
1266//            video_screen_configure( 0, 228, current_screen_height, &visarea[i], HZ_TO_SUBSECONDS( MASTER_CLOCK_NTSC ) * 228 * current_screen_height );
1267         }
1268      }
1269   }
1270}
1271
1272static WRITE16_HANDLER( a2600_tia_vsync_callback_pal ) {
1273   int i;
1274
1275   for ( i = 0; i < sizeof( supported_screen_heights ) / sizeof( supported_screen_heights[0] ); i++ ) {
1276      if ( data >= supported_screen_heights[i] - 3 && data <= supported_screen_heights[i] + 3 ) {
1277         if ( supported_screen_heights[i] != current_screen_height ) {
1278            current_screen_height = supported_screen_heights[i];
1279//            video_screen_configure( 0, 228, current_screen_height, &visarea[i], HZ_TO_SUBSECONDS( MASTER_CLOCK_PAL ) * 228 * current_screen_height );
1280         }
1281      }
1282   }
1283}
1284
12271285static struct tia_interface tia_interface =
12281286{
12291287   a2600_read_input_port,
1230   a2600_get_databus_contents
1288   a2600_get_databus_contents,
1289   a2600_tia_vsync_callback
12311290};
12321291
1292static struct tia_interface tia_interface_pal =
1293{
1294   a2600_read_input_port,
1295   a2600_get_databus_contents,
1296   a2600_tia_vsync_callback_pal
1297};
1298
12331299static MACHINE_START( a2600 )
12341300{
1301   current_screen_height = machine->screen[0].height;
12351302   extra_RAM = new_memory_region( machine, REGION_USER2, 0x8600, ROM_REQUIRED );
12361303   tia_init( &tia_interface );
12371304   r6532_config( 0, &r6532_interface );
r799r800
12431310
12441311static MACHINE_START( a2600p )
12451312{
1313   current_screen_height = machine->screen[0].height;
12461314   extra_RAM = new_memory_region( machine, REGION_USER2, 0x8600, ROM_REQUIRED );
1247   tia_init( &tia_interface );
1315   tia_init( &tia_interface_pal );
12481316   r6532_config( 0, &r6532_interface );
12491317   r6532_set_clock( 0, MASTER_CLOCK_PAL / 3 );
12501318   r6532_reset(0);
r799r800
14151483      install_banks(2, 0x0000);
14161484      current_32in1_bank = ( current_32in1_bank + 1 ) & 0x1F;
14171485      break;
1486
1487   case modeJVP:
1488      install_banks(1, 0x0000);
1489      current_bank = 0;
1490      break;
14181491   }
14191492
14201493   /* set up bank counter */
r799r800
15281601      memory_set_bankptr( 1, CART + current_32in1_bank * 0x800 );
15291602      memory_set_bankptr( 2, CART + current_32in1_bank * 0x800 );
15301603      break;
1604
1605   case modeJVP:
1606      memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x0FA0, 0x0FFF, 0, 0, modeJVP_switch_r);
1607      memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x0FA0, 0x0FFF, 0, 0, modeJVP_switch_w);
1608      break;
15311609   }
15321610
15331611   /* set up extra RAM */

Previous 15994 Revisions Next


© 1998-2018 The MESS Team