trunk/src/mame/drivers/maxaflex.c
| r31963 | r31964 | |
| 59 | 59 | DECLARE_READ8_MEMBER(mcu_tcr_r); |
| 60 | 60 | DECLARE_WRITE8_MEMBER(mcu_tcr_w); |
| 61 | 61 | DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); |
| 62 | | DECLARE_READ8_MEMBER(maxaflex_atari_pia_pa_r); |
| 63 | | DECLARE_READ8_MEMBER(maxaflex_atari_pia_pb_r); |
| 64 | | WRITE8_MEMBER(a600xl_pia_pb_w) { mmu(data); } |
| 65 | | WRITE_LINE_MEMBER(atari_pia_cb2_w) { } // This is used by Floppy drive on Atari 8bits Home Computers |
| 66 | | DECLARE_DRIVER_INIT(a600xl); |
| 67 | | DECLARE_MACHINE_RESET(supervisor_board); |
| 62 | DECLARE_READ8_MEMBER(pia_pa_r); |
| 63 | DECLARE_READ8_MEMBER(pia_pb_r); |
| 64 | WRITE8_MEMBER(pia_pb_w) { mmu(data); } |
| 65 | WRITE_LINE_MEMBER(pia_cb2_w) { } // This is used by Floppy drive on Atari 8bits Home Computers |
| 68 | 66 | TIMER_DEVICE_CALLBACK_MEMBER(mcu_timer_proc); |
| 69 | 67 | int atari_input_disabled(); |
| 70 | 68 | virtual void machine_start(); |
| r31963 | r31964 | |
| 78 | 76 | void maxaflex_state::mmu(UINT8 new_mmu) |
| 79 | 77 | { |
| 80 | 78 | /* check if self-test ROM changed */ |
| 81 | | if ( new_mmu & 0x80 ) |
| 79 | if (new_mmu & 0x80) |
| 82 | 80 | { |
| 83 | 81 | logerror("%s MMU SELFTEST RAM\n", machine().system().name); |
| 84 | 82 | machine().device("maincpu")->memory().space(AS_PROGRAM).nop_readwrite(0x5000, 0x57ff); |
| r31963 | r31964 | |
| 88 | 86 | logerror("%s MMU SELFTEST ROM\n", machine().system().name); |
| 89 | 87 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_bank(0x5000, 0x57ff, "bank2"); |
| 90 | 88 | machine().device("maincpu")->memory().space(AS_PROGRAM).unmap_write(0x5000, 0x57ff); |
| 91 | | machine().root_device().membank("bank2")->set_base(machine().root_device().memregion("maincpu")->base() + 0x5000); |
| 89 | machine().root_device().membank("bank2")->set_base(machine().root_device().memregion("maincpu")->base() + 0xd000); |
| 92 | 90 | } |
| 93 | 91 | } |
| 94 | 92 | |
| r31963 | r31964 | |
| 269 | 267 | } |
| 270 | 268 | } |
| 271 | 269 | |
| 272 | | MACHINE_RESET_MEMBER(maxaflex_state,supervisor_board) |
| 273 | | { |
| 274 | | m_portA_in = m_portA_out = m_ddrA = 0; |
| 275 | | m_portB_in = m_portB_out = m_ddrB = 0; |
| 276 | | m_portC_in = m_portC_out = m_ddrC = 0; |
| 277 | | m_tdr = m_tcr = 0; |
| 278 | | m_mcu_timer = machine().device<timer_device>("mcu_timer"); |
| 279 | | |
| 280 | | output_set_lamp_value(0, 0); |
| 281 | | output_set_lamp_value(1, 0); |
| 282 | | output_set_lamp_value(2, 0); |
| 283 | | output_set_lamp_value(3, 0); |
| 284 | | output_set_digit_value(0, 0x00); |
| 285 | | output_set_digit_value(1, 0x00); |
| 286 | | output_set_digit_value(2, 0x00); |
| 287 | | } |
| 288 | | |
| 289 | 270 | INPUT_CHANGED_MEMBER(maxaflex_state::coin_inserted) |
| 290 | 271 | { |
| 291 | 272 | if (!newval) |
| r31963 | r31964 | |
| 301 | 282 | |
| 302 | 283 | static ADDRESS_MAP_START(a600xl_mem, AS_PROGRAM, 8, maxaflex_state ) |
| 303 | 284 | AM_RANGE(0x0000, 0x3fff) AM_RAM |
| 304 | | AM_RANGE(0x5000, 0x57ff) AM_ROM AM_REGION("maincpu", 0x5000) /* self test */ |
| 285 | AM_RANGE(0x5000, 0x57ff) AM_ROM AM_REGION("maincpu", 0xd000) /* self test */ |
| 305 | 286 | AM_RANGE(0x8000, 0xbfff) AM_ROM /* game cartridge */ |
| 306 | 287 | AM_RANGE(0xc000, 0xcfff) AM_ROM /* OS */ |
| 307 | | AM_RANGE(0xd000, 0xd0ff) AM_READWRITE(atari_gtia_r, atari_gtia_w) |
| 288 | AM_RANGE(0xd000, 0xd0ff) AM_DEVREADWRITE("gtia", gtia_device, read, write) |
| 308 | 289 | AM_RANGE(0xd100, 0xd1ff) AM_NOP |
| 309 | 290 | AM_RANGE(0xd200, 0xd2ff) AM_DEVREADWRITE("pokey", pokey_device, read, write) |
| 310 | 291 | AM_RANGE(0xd300, 0xd3ff) AM_DEVREADWRITE("pia", pia6821_device, read_alt, write_alt) |
| r31963 | r31964 | |
| 315 | 296 | |
| 316 | 297 | static ADDRESS_MAP_START( mcu_mem, AS_PROGRAM, 8, maxaflex_state ) |
| 317 | 298 | ADDRESS_MAP_GLOBAL_MASK(0x7ff) |
| 318 | | AM_RANGE(0x0000, 0x0000) AM_READ(mcu_portA_r ) AM_WRITE(mcu_portA_w ) |
| 319 | | AM_RANGE(0x0001, 0x0001) AM_READ(mcu_portB_r ) AM_WRITE(mcu_portB_w ) |
| 320 | | AM_RANGE(0x0002, 0x0002) AM_READ(mcu_portC_r ) AM_WRITE(mcu_portC_w ) |
| 321 | | AM_RANGE(0x0004, 0x0004) AM_READ(mcu_ddr_r ) AM_WRITE(mcu_portA_ddr_w ) |
| 322 | | AM_RANGE(0x0005, 0x0005) AM_READ(mcu_ddr_r ) AM_WRITE(mcu_portB_ddr_w ) |
| 323 | | AM_RANGE(0x0006, 0x0006) AM_READ(mcu_ddr_r ) AM_WRITE(mcu_portC_ddr_w ) |
| 324 | | AM_RANGE(0x0008, 0x0008) AM_READ(mcu_tdr_r ) AM_WRITE(mcu_tdr_w ) |
| 325 | | AM_RANGE(0x0009, 0x0009) AM_READ(mcu_tcr_r ) AM_WRITE(mcu_tcr_w ) |
| 299 | AM_RANGE(0x0000, 0x0000) AM_READ(mcu_portA_r) AM_WRITE(mcu_portA_w) |
| 300 | AM_RANGE(0x0001, 0x0001) AM_READ(mcu_portB_r) AM_WRITE(mcu_portB_w) |
| 301 | AM_RANGE(0x0002, 0x0002) AM_READ(mcu_portC_r) AM_WRITE(mcu_portC_w) |
| 302 | AM_RANGE(0x0004, 0x0004) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portA_ddr_w) |
| 303 | AM_RANGE(0x0005, 0x0005) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portB_ddr_w) |
| 304 | AM_RANGE(0x0006, 0x0006) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portC_ddr_w) |
| 305 | AM_RANGE(0x0008, 0x0008) AM_READ(mcu_tdr_r) AM_WRITE(mcu_tdr_w) |
| 306 | AM_RANGE(0x0009, 0x0009) AM_READ(mcu_tcr_r) AM_WRITE(mcu_tcr_w) |
| 326 | 307 | AM_RANGE(0x0010, 0x007f) AM_RAM |
| 327 | 308 | AM_RANGE(0x0080, 0x07ff) AM_ROM |
| 328 | 309 | ADDRESS_MAP_END |
| r31963 | r31964 | |
| 330 | 311 | |
| 331 | 312 | static INPUT_PORTS_START( a600xl ) |
| 332 | 313 | |
| 333 | | PORT_START("console") /* IN0 console keys & switch settings */ |
| 314 | PORT_START("console") |
| 334 | 315 | PORT_BIT(0x04, 0x04, IPT_KEYPAD) PORT_NAME("Option") PORT_CODE(KEYCODE_F2) |
| 335 | 316 | PORT_BIT(0x02, 0x02, IPT_KEYPAD) PORT_NAME("Select") PORT_CODE(KEYCODE_F1) |
| 336 | 317 | PORT_BIT(0x01, 0x01, IPT_START1 ) |
| 337 | 318 | |
| 338 | | PORT_START("djoy_0_1") /* IN1 digital joystick #1 + #2 (PIA port A) */ |
| 319 | PORT_START("djoy_0_1") |
| 339 | 320 | PORT_BIT(0x01, 0x01, IPT_JOYSTICK_UP) PORT_PLAYER(1) |
| 340 | 321 | PORT_BIT(0x02, 0x02, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) |
| 341 | 322 | PORT_BIT(0x04, 0x04, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) |
| r31963 | r31964 | |
| 346 | 327 | PORT_BIT(0x40, 0x40, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) |
| 347 | 328 | PORT_BIT(0x80, 0x80, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) |
| 348 | 329 | |
| 349 | | PORT_START("djoy_2_3") /* IN2 digital joystick #3 + #4 (PIA port B) */ |
| 330 | PORT_START("djoy_2_3") |
| 350 | 331 | /* not connected */ |
| 351 | 332 | PORT_BIT(0x01, 0x01, IPT_JOYSTICK_UP) PORT_PLAYER(3) |
| 352 | 333 | PORT_BIT(0x02, 0x02, IPT_JOYSTICK_DOWN) PORT_PLAYER(3) |
| r31963 | r31964 | |
| 357 | 338 | PORT_BIT(0x40, 0x40, IPT_JOYSTICK_LEFT) PORT_PLAYER(4) |
| 358 | 339 | PORT_BIT(0x80, 0x80, IPT_JOYSTICK_RIGHT) PORT_PLAYER(4) |
| 359 | 340 | |
| 360 | | PORT_START("djoy_b") /* IN3 digital joystick buttons (GTIA button bits) */ |
| 341 | PORT_START("djoy_b") |
| 361 | 342 | PORT_BIT(0x01, 0x01, IPT_BUTTON1) PORT_PLAYER(1) |
| 362 | 343 | PORT_BIT(0x02, 0x02, IPT_BUTTON1) PORT_PLAYER(2) |
| 363 | 344 | PORT_BIT(0x04, 0x04, IPT_BUTTON1) PORT_PLAYER(3) |
| r31963 | r31964 | |
| 368 | 349 | PORT_BIT(0x80, 0x80, IPT_BUTTON2) PORT_PLAYER(4) |
| 369 | 350 | |
| 370 | 351 | /* Max-A-Flex specific ports */ |
| 371 | | PORT_START("coin") /* IN4 coin */ |
| 352 | PORT_START("coin") |
| 372 | 353 | PORT_BIT(0x1, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, maxaflex_state,coin_inserted, 0) |
| 373 | 354 | |
| 374 | | PORT_START("dsw") /* IN5 DSW */ |
| 355 | PORT_START("dsw") |
| 375 | 356 | PORT_DIPNAME(0xf, 0x9, "Coin/Time" ) |
| 376 | 357 | PORT_DIPSETTING( 0x0, "30 sec" ) |
| 377 | 358 | PORT_DIPSETTING( 0x1, "60 sec" ) |
| r31963 | r31964 | |
| 393 | 374 | INPUT_PORTS_END |
| 394 | 375 | |
| 395 | 376 | |
| 396 | | READ8_MEMBER(maxaflex_state::maxaflex_atari_pia_pa_r) |
| 377 | READ8_MEMBER(maxaflex_state::pia_pa_r) |
| 397 | 378 | { |
| 398 | | return atari_input_disabled() ? 0xFF : ioport("djoy_0_1")->read_safe(0); |
| 379 | return atari_input_disabled() ? 0xff : ioport("djoy_0_1")->read_safe(0); |
| 399 | 380 | } |
| 400 | 381 | |
| 401 | | READ8_MEMBER(maxaflex_state::maxaflex_atari_pia_pb_r) |
| 382 | READ8_MEMBER(maxaflex_state::pia_pb_r) |
| 402 | 383 | { |
| 403 | | return atari_input_disabled() ? 0xFF : ioport("djoy_2_3")->read_safe(0); |
| 384 | return atari_input_disabled() ? 0xff : ioport("djoy_2_3")->read_safe(0); |
| 404 | 385 | } |
| 405 | 386 | |
| 406 | 387 | |
| 407 | 388 | void maxaflex_state::machine_start() |
| 408 | 389 | { |
| 409 | | /* GTIA */ |
| 410 | | gtia_interface gtia_intf; |
| 411 | | memset(>ia_intf, 0, sizeof(gtia_intf)); |
| 412 | | gtia_init(machine(), >ia_intf); |
| 413 | | |
| 414 | 390 | /* ANTIC */ |
| 415 | 391 | antic_start(machine()); |
| 416 | 392 | } |
| r31963 | r31964 | |
| 420 | 396 | pokey_device *pokey = machine().device<pokey_device>("pokey"); |
| 421 | 397 | pokey->write(15,0); |
| 422 | 398 | antic_reset(); |
| 399 | |
| 400 | // Supervisor board reset |
| 401 | m_portA_in = m_portA_out = m_ddrA = 0; |
| 402 | m_portB_in = m_portB_out = m_ddrB = 0; |
| 403 | m_portC_in = m_portC_out = m_ddrC = 0; |
| 404 | m_tdr = m_tcr = 0; |
| 405 | m_mcu_timer = machine().device<timer_device>("mcu_timer"); |
| 406 | |
| 407 | output_set_lamp_value(0, 0); |
| 408 | output_set_lamp_value(1, 0); |
| 409 | output_set_lamp_value(2, 0); |
| 410 | output_set_lamp_value(3, 0); |
| 411 | output_set_digit_value(0, 0x00); |
| 412 | output_set_digit_value(1, 0x00); |
| 413 | output_set_digit_value(2, 0x00); |
| 423 | 414 | } |
| 424 | 415 | |
| 425 | 416 | |
| 426 | | static MACHINE_CONFIG_START( a600xl, maxaflex_state ) |
| 417 | static MACHINE_CONFIG_START( maxaflex, maxaflex_state ) |
| 427 | 418 | /* basic machine hardware */ |
| 428 | 419 | MCFG_CPU_ADD("maincpu", M6502, FREQ_17_EXACT) |
| 429 | 420 | MCFG_CPU_PROGRAM_MAP(a600xl_mem) |
| r31963 | r31964 | |
| 432 | 423 | MCFG_CPU_ADD("mcu", M68705, 3579545) |
| 433 | 424 | MCFG_CPU_PROGRAM_MAP(mcu_mem) |
| 434 | 425 | |
| 426 | MCFG_DEVICE_ADD("gtia", ATARI_GTIA, 0) |
| 427 | MCFG_GTIA_READ_CB(IOPORT("console")) |
| 428 | |
| 435 | 429 | MCFG_DEVICE_ADD("pia", PIA6821, 0) |
| 436 | | MCFG_PIA_READPA_HANDLER(READ8(maxaflex_state, maxaflex_atari_pia_pa_r)) |
| 437 | | MCFG_PIA_READPB_HANDLER(READ8(maxaflex_state, maxaflex_atari_pia_pb_r)) |
| 438 | | MCFG_PIA_WRITEPB_HANDLER(WRITE8(maxaflex_state, a600xl_pia_pb_w)) |
| 439 | | MCFG_PIA_CB2_HANDLER(WRITELINE(maxaflex_state, atari_pia_cb2_w)) |
| 430 | MCFG_PIA_READPA_HANDLER(READ8(maxaflex_state, pia_pa_r)) |
| 431 | MCFG_PIA_READPB_HANDLER(READ8(maxaflex_state, pia_pb_r)) |
| 432 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(maxaflex_state, pia_pb_w)) |
| 433 | MCFG_PIA_CB2_HANDLER(WRITELINE(maxaflex_state, pia_cb2_w)) |
| 440 | 434 | |
| 441 | 435 | MCFG_TIMER_DRIVER_ADD("mcu_timer", maxaflex_state, mcu_timer_proc) |
| 442 | 436 | |
| r31963 | r31964 | |
| 466 | 460 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |
| 467 | 461 | MACHINE_CONFIG_END |
| 468 | 462 | |
| 469 | | static MACHINE_CONFIG_DERIVED( maxaflex, a600xl ) |
| 470 | | MCFG_MACHINE_RESET_OVERRIDE(maxaflex_state, supervisor_board ) |
| 471 | | MACHINE_CONFIG_END |
| 472 | 463 | |
| 473 | 464 | ROM_START(maxaflex) |
| 474 | 465 | ROM_REGION(0x10000,"maincpu",0) /* 64K for the CPU */ |
| r31963 | r31964 | |
| 530 | 521 | ROM_LOAD("maxprom.prm", 0x0000, 0x0200, CRC(edf5c950) SHA1(9ad046ea41a61585dd8d2f2d4167a3cc39d2928f)) /* for simulating keystrokes ?*/ |
| 531 | 522 | ROM_END |
| 532 | 523 | |
| 533 | | DRIVER_INIT_MEMBER(maxaflex_state,a600xl) |
| 534 | | { |
| 535 | | UINT8 *rom = memregion("maincpu")->base(); |
| 536 | | memcpy( rom + 0x5000, rom + 0xd000, 0x800 ); |
| 537 | | } |
| 538 | 524 | |
| 539 | | GAME( 1984, maxaflex, 0, maxaflex, a600xl, maxaflex_state, a600xl, ROT0, "Exidy", "Max-A-Flex", GAME_IS_BIOS_ROOT ) |
| 540 | | GAME( 1982, mf_achas, maxaflex, maxaflex, a600xl, maxaflex_state, a600xl, ROT0, "Exidy / First Star Software", "Astro Chase (Max-A-Flex)", 0 ) |
| 541 | | GAME( 1983, mf_brist, maxaflex, maxaflex, a600xl, maxaflex_state, a600xl, ROT0, "Exidy / First Star Software", "Bristles (Max-A-Flex)", 0 ) |
| 542 | | GAME( 1983, mf_flip, maxaflex, maxaflex, a600xl, maxaflex_state, a600xl, ROT0, "Exidy / First Star Software", "Flip & Flop (Max-A-Flex)", 0 ) |
| 543 | | GAME( 1984, mf_bdash, maxaflex, maxaflex, a600xl, maxaflex_state, a600xl, ROT0, "Exidy / First Star Software", "Boulder Dash (Max-A-Flex)", 0 ) |
| 525 | GAME( 1984, maxaflex, 0, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy", "Max-A-Flex", GAME_IS_BIOS_ROOT ) |
| 526 | GAME( 1982, mf_achas, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Astro Chase (Max-A-Flex)", 0 ) |
| 527 | GAME( 1983, mf_brist, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Bristles (Max-A-Flex)", 0 ) |
| 528 | GAME( 1983, mf_flip, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Flip & Flop (Max-A-Flex)", 0 ) |
| 529 | GAME( 1984, mf_bdash, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Boulder Dash (Max-A-Flex)", 0 ) |
trunk/src/mame/video/gtia.c
| r31963 | r31964 | |
| 9 | 9 | ***************************************************************************/ |
| 10 | 10 | |
| 11 | 11 | #include "emu.h" |
| 12 | | #include "cpu/m6502/m6502.h" |
| 13 | | #include "includes/atari.h" |
| 14 | 12 | #include "video/gtia.h" |
| 15 | 13 | |
| 16 | | gtia_struct gtia; |
| 14 | #define GTIA_P0 0x01 |
| 15 | #define GTIA_P1 0x02 |
| 16 | #define GTIA_P2 0x04 |
| 17 | #define GTIA_P3 0x08 |
| 18 | #define GTIA_M0 0x10 |
| 19 | #define GTIA_M1 0x20 |
| 20 | #define GTIA_M2 0x40 |
| 21 | #define GTIA_M3 0x80 |
| 17 | 22 | |
| 18 | | #define P0 0x01 |
| 19 | | #define P1 0x02 |
| 20 | | #define P2 0x04 |
| 21 | | #define P3 0x08 |
| 22 | | #define M0 0x10 |
| 23 | | #define M1 0x20 |
| 24 | | #define M2 0x40 |
| 25 | | #define M3 0x80 |
| 23 | #define GTIA_HWIDTH 48 /* total characters per line */ |
| 24 | #define GTIA_TRIGGER 0x04 |
| 26 | 25 | |
| 27 | 26 | #define CHECK_GRACTL 0 |
| 28 | 27 | #define VERBOSE 0 |
| 29 | 28 | |
| 30 | | static void gtia_reset(running_machine &machine); |
| 31 | | static void gtia_state(running_machine &machine); |
| 32 | | static void gtia_state_postload(running_machine &machine); |
| 29 | #define PFD 0x00 /* 00000000b playfield default color */ |
| 33 | 30 | |
| 31 | #define PBK 0x00 /* 00000000b playfield background */ |
| 32 | #define PF0 0x01 /* 00000001b playfield color #0 */ |
| 33 | #define PF1 0x02 /* 00000010b playfield color #1 */ |
| 34 | #define PF2 0x04 /* 00000100b playfield color #2 */ |
| 35 | #define PF3 0x08 /* 00001000b playfield color #3 */ |
| 36 | #define PL0 0x11 /* 00010001b player #0 */ |
| 37 | #define PL1 0x12 /* 00010010b player #1 */ |
| 38 | #define PL2 0x14 /* 00010100b player #2 */ |
| 39 | #define PL3 0x18 /* 00011000b player #3 */ |
| 40 | #define MI0 0x21 /* 00100001b missile #0 */ |
| 41 | #define MI1 0x22 /* 00100010b missile #1 */ |
| 42 | #define MI2 0x24 /* 00100100b missile #2 */ |
| 43 | #define MI3 0x28 /* 00101000b missile #3 */ |
| 44 | #define T00 0x40 /* 01000000b text mode pixels 00 */ |
| 45 | #define P000 0x48 /* 01001000b player #0 pixels 00 */ |
| 46 | #define P100 0x4a /* 01001010b player #1 pixels 00 */ |
| 47 | #define P200 0x4c /* 01001100b player #2 pixels 00 */ |
| 48 | #define P300 0x4e /* 01001110b player #3 pixels 00 */ |
| 49 | #define P400 0x4f /* 01001111b missiles pixels 00 */ |
| 50 | #define T01 0x50 /* 01010000b text mode pixels 01 */ |
| 51 | #define P001 0x58 /* 01011000b player #0 pixels 01 */ |
| 52 | #define P101 0x5a /* 01011010b player #1 pixels 01 */ |
| 53 | #define P201 0x5c /* 01011100b player #2 pixels 01 */ |
| 54 | #define P301 0x5e /* 01011110b player #3 pixels 01 */ |
| 55 | #define P401 0x5f /* 01011111b missiles pixels 01 */ |
| 56 | #define T10 0x60 /* 01100000b text mode pixels 10 */ |
| 57 | #define P010 0x68 /* 01101000b player #0 pixels 10 */ |
| 58 | #define P110 0x6a /* 01101010b player #1 pixels 10 */ |
| 59 | #define P210 0x6c /* 01101100b player #2 pixels 10 */ |
| 60 | #define P310 0x6e /* 01101110b player #3 pixels 10 */ |
| 61 | #define P410 0x6f /* 01101111b missiles pixels 10 */ |
| 62 | #define T11 0x70 /* 01110000b text mode pixels 11 */ |
| 63 | #define P011 0x78 /* 01111000b player #0 pixels 11 */ |
| 64 | #define P111 0x7a /* 01111010b player #1 pixels 11 */ |
| 65 | #define P211 0x7c /* 01111100b player #2 pixels 11 */ |
| 66 | #define P311 0x7e /* 01111110b player #3 pixels 11 */ |
| 67 | #define P411 0x7f /* 01111111b missiles pixels 11 */ |
| 68 | #define G00 0x80 /* 10000000b hires gfx pixels 00 */ |
| 69 | #define G01 0x90 /* 10010000b hires gfx pixels 01 */ |
| 70 | #define G10 0xa0 /* 10100000b hires gfx pixels 10 */ |
| 71 | #define G11 0xb0 /* 10110000b hires gfx pixels 11 */ |
| 72 | #define GT1 0xc0 /* 11000000b gtia mode 1 */ |
| 73 | #define GT2 0xd0 /* 11010000b gtia mode 2 */ |
| 74 | #define GT3 0xe0 /* 11100000b gtia mode 3 */ |
| 75 | #define ILL 0xfe /* 11111110b illegal priority */ |
| 76 | #define EOR 0xff /* 11111111b EOR mode color */ |
| 77 | |
| 78 | #define LUM 0x0f /* 00001111b luminance bits */ |
| 79 | #define HUE 0xf0 /* 11110000b hue bits */ |
| 80 | |
| 81 | |
| 34 | 82 | /********************************************** |
| 35 | 83 | * split a color into hue and luminance values |
| 36 | 84 | **********************************************/ |
| 37 | | #define SPLIT_HUE(data,hue) \ |
| 85 | #define SPLIT_HUE(data, hue) \ |
| 38 | 86 | hue = (data & HUE) |
| 39 | 87 | |
| 40 | | #define SPLIT_LUM(data,lum) \ |
| 88 | #define SPLIT_LUM(data, lum) \ |
| 41 | 89 | lum = (data & LUM) |
| 42 | 90 | |
| 43 | 91 | /********************************************** |
| 44 | 92 | * set both color clocks equal for one color |
| 45 | 93 | **********************************************/ |
| 46 | | #define SETCOL_B(o,d) \ |
| 47 | | gtia.color_lookup[o] = ((d) << 8) | (d) |
| 94 | #define SETCOL_B(o, d) \ |
| 95 | m_color_lookup[o] = ((d) << 8) | (d) |
| 48 | 96 | |
| 49 | 97 | /********************************************** |
| 50 | 98 | * set left color clock for one color |
| 51 | 99 | **********************************************/ |
| 52 | | #define SETCOL_L(o,d) \ |
| 53 | | *((UINT8*)>ia.color_lookup[o] + 0) = d |
| 100 | #define SETCOL_L(o, d) \ |
| 101 | *((UINT8*)&m_color_lookup[o] + 0) = d |
| 54 | 102 | |
| 55 | 103 | /********************************************** |
| 56 | 104 | * set right color clock for one color |
| 57 | 105 | **********************************************/ |
| 58 | | #define SETCOL_R(o,d) \ |
| 59 | | *((UINT8*)>ia.color_lookup[o] + 1) = d |
| 106 | #define SETCOL_R(o, d) \ |
| 107 | *((UINT8*)&m_color_lookup[o] + 1) = d |
| 60 | 108 | |
| 61 | 109 | |
| 62 | 110 | |
| 63 | | /************************************* |
| 64 | | * |
| 65 | | * Initialization/Reset |
| 66 | | * |
| 67 | | *************************************/ |
| 111 | // devices |
| 112 | const device_type ATARI_GTIA = &device_creator<gtia_device>; |
| 68 | 113 | |
| 69 | | void gtia_init(running_machine &machine, const gtia_interface *intf) |
| 114 | //------------------------------------------------- |
| 115 | // upd7220_device - constructor |
| 116 | //------------------------------------------------- |
| 117 | |
| 118 | gtia_device::gtia_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 119 | device_t(mconfig, ATARI_GTIA, "Atari GTIA", tag, owner, clock, "gtia", __FILE__), |
| 120 | m_read_cb(*this), |
| 121 | m_write_cb(*this) |
| 70 | 122 | { |
| 71 | | memset(>ia, 0, sizeof(gtia)); |
| 72 | | gtia.intf = *intf; |
| 73 | | |
| 74 | | machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(gtia_reset), &machine)); |
| 75 | | |
| 76 | | /* state saves */ |
| 77 | | gtia_state(machine); |
| 78 | 123 | } |
| 79 | 124 | |
| 80 | 125 | |
| 126 | //------------------------------------------------- |
| 127 | // device_start - device-specific startup |
| 128 | //------------------------------------------------- |
| 81 | 129 | |
| 82 | | static void gtia_state(running_machine &machine) |
| 130 | void gtia_device::device_start() |
| 83 | 131 | { |
| 84 | | machine.save().save_item(NAME(gtia.r.m0pf)); |
| 85 | | machine.save().save_item(NAME(gtia.r.m1pf)); |
| 86 | | machine.save().save_item(NAME(gtia.r.m2pf)); |
| 87 | | machine.save().save_item(NAME(gtia.r.m3pf)); |
| 88 | | machine.save().save_item(NAME(gtia.r.p0pf)); |
| 89 | | machine.save().save_item(NAME(gtia.r.p1pf)); |
| 90 | | machine.save().save_item(NAME(gtia.r.p2pf)); |
| 91 | | machine.save().save_item(NAME(gtia.r.p3pf)); |
| 92 | | machine.save().save_item(NAME(gtia.r.m0pl)); |
| 93 | | machine.save().save_item(NAME(gtia.r.m1pl)); |
| 94 | | machine.save().save_item(NAME(gtia.r.m2pl)); |
| 95 | | machine.save().save_item(NAME(gtia.r.m3pl)); |
| 96 | | machine.save().save_item(NAME(gtia.r.p0pl)); |
| 97 | | machine.save().save_item(NAME(gtia.r.p1pl)); |
| 98 | | machine.save().save_item(NAME(gtia.r.p2pl)); |
| 99 | | machine.save().save_item(NAME(gtia.r.p3pl)); |
| 100 | | machine.save().save_item(NAME(gtia.r.but)); |
| 101 | | machine.save().save_item(NAME(gtia.r.pal)); |
| 102 | | machine.save().save_item(NAME(gtia.r.gtia15)); |
| 103 | | machine.save().save_item(NAME(gtia.r.gtia16)); |
| 104 | | machine.save().save_item(NAME(gtia.r.gtia17)); |
| 105 | | machine.save().save_item(NAME(gtia.r.gtia18)); |
| 106 | | machine.save().save_item(NAME(gtia.r.gtia19)); |
| 107 | | machine.save().save_item(NAME(gtia.r.gtia1a)); |
| 108 | | machine.save().save_item(NAME(gtia.r.gtia1b)); |
| 109 | | machine.save().save_item(NAME(gtia.r.gtia1c)); |
| 110 | | machine.save().save_item(NAME(gtia.r.gtia1d)); |
| 111 | | machine.save().save_item(NAME(gtia.r.gtia1e)); |
| 112 | | machine.save().save_item(NAME(gtia.r.cons)); |
| 113 | | machine.save().save_item(NAME(gtia.w.hposp0)); |
| 114 | | machine.save().save_item(NAME(gtia.w.hposp1)); |
| 115 | | machine.save().save_item(NAME(gtia.w.hposp2)); |
| 116 | | machine.save().save_item(NAME(gtia.w.hposp3)); |
| 117 | | machine.save().save_item(NAME(gtia.w.hposm0)); |
| 118 | | machine.save().save_item(NAME(gtia.w.hposm1)); |
| 119 | | machine.save().save_item(NAME(gtia.w.hposm2)); |
| 120 | | machine.save().save_item(NAME(gtia.w.hposm3)); |
| 121 | | machine.save().save_item(NAME(gtia.w.sizep0)); |
| 122 | | machine.save().save_item(NAME(gtia.w.sizep1)); |
| 123 | | machine.save().save_item(NAME(gtia.w.sizep2)); |
| 124 | | machine.save().save_item(NAME(gtia.w.sizep3)); |
| 125 | | machine.save().save_item(NAME(gtia.w.sizem)); |
| 126 | | machine.save().save_item(NAME(gtia.w.grafp0)); |
| 127 | | machine.save().save_item(NAME(gtia.w.grafp1)); |
| 128 | | machine.save().save_item(NAME(gtia.w.grafp2)); |
| 129 | | machine.save().save_item(NAME(gtia.w.grafp3)); |
| 130 | | machine.save().save_item(NAME(gtia.w.grafm)); |
| 131 | | machine.save().save_item(NAME(gtia.w.colpm0)); |
| 132 | | machine.save().save_item(NAME(gtia.w.colpm1)); |
| 133 | | machine.save().save_item(NAME(gtia.w.colpm2)); |
| 134 | | machine.save().save_item(NAME(gtia.w.colpm3)); |
| 135 | | machine.save().save_item(NAME(gtia.w.colpf0)); |
| 136 | | machine.save().save_item(NAME(gtia.w.colpf1)); |
| 137 | | machine.save().save_item(NAME(gtia.w.colpf2)); |
| 138 | | machine.save().save_item(NAME(gtia.w.colpf3)); |
| 139 | | machine.save().save_item(NAME(gtia.w.colbk)); |
| 140 | | machine.save().save_item(NAME(gtia.w.prior)); |
| 141 | | machine.save().save_item(NAME(gtia.w.vdelay)); |
| 142 | | machine.save().save_item(NAME(gtia.w.gractl)); |
| 143 | | machine.save().save_item(NAME(gtia.w.hitclr)); |
| 144 | | machine.save().save_item(NAME(gtia.w.cons)); |
| 145 | | machine.save().register_postload(save_prepost_delegate(FUNC(gtia_state_postload), &machine)); |
| 132 | m_read_cb.resolve(); |
| 133 | m_write_cb.resolve(); |
| 134 | |
| 135 | save_item(NAME(m_r.m0pf)); |
| 136 | save_item(NAME(m_r.m1pf)); |
| 137 | save_item(NAME(m_r.m2pf)); |
| 138 | save_item(NAME(m_r.m3pf)); |
| 139 | save_item(NAME(m_r.p0pf)); |
| 140 | save_item(NAME(m_r.p1pf)); |
| 141 | save_item(NAME(m_r.p2pf)); |
| 142 | save_item(NAME(m_r.p3pf)); |
| 143 | save_item(NAME(m_r.m0pl)); |
| 144 | save_item(NAME(m_r.m1pl)); |
| 145 | save_item(NAME(m_r.m2pl)); |
| 146 | save_item(NAME(m_r.m3pl)); |
| 147 | save_item(NAME(m_r.p0pl)); |
| 148 | save_item(NAME(m_r.p1pl)); |
| 149 | save_item(NAME(m_r.p2pl)); |
| 150 | save_item(NAME(m_r.p3pl)); |
| 151 | save_item(NAME(m_r.but)); |
| 152 | save_item(NAME(m_r.pal)); |
| 153 | save_item(NAME(m_r.gtia15)); |
| 154 | save_item(NAME(m_r.gtia16)); |
| 155 | save_item(NAME(m_r.gtia17)); |
| 156 | save_item(NAME(m_r.gtia18)); |
| 157 | save_item(NAME(m_r.gtia19)); |
| 158 | save_item(NAME(m_r.gtia1a)); |
| 159 | save_item(NAME(m_r.gtia1b)); |
| 160 | save_item(NAME(m_r.gtia1c)); |
| 161 | save_item(NAME(m_r.gtia1d)); |
| 162 | save_item(NAME(m_r.gtia1e)); |
| 163 | save_item(NAME(m_r.cons)); |
| 164 | save_item(NAME(m_w.hposp0)); |
| 165 | save_item(NAME(m_w.hposp1)); |
| 166 | save_item(NAME(m_w.hposp2)); |
| 167 | save_item(NAME(m_w.hposp3)); |
| 168 | save_item(NAME(m_w.hposm0)); |
| 169 | save_item(NAME(m_w.hposm1)); |
| 170 | save_item(NAME(m_w.hposm2)); |
| 171 | save_item(NAME(m_w.hposm3)); |
| 172 | save_item(NAME(m_w.sizep0)); |
| 173 | save_item(NAME(m_w.sizep1)); |
| 174 | save_item(NAME(m_w.sizep2)); |
| 175 | save_item(NAME(m_w.sizep3)); |
| 176 | save_item(NAME(m_w.sizem)); |
| 177 | save_item(NAME(m_w.grafp0)); |
| 178 | save_item(NAME(m_w.grafp1)); |
| 179 | save_item(NAME(m_w.grafp2)); |
| 180 | save_item(NAME(m_w.grafp3)); |
| 181 | save_item(NAME(m_w.grafm)); |
| 182 | save_item(NAME(m_w.colpm0)); |
| 183 | save_item(NAME(m_w.colpm1)); |
| 184 | save_item(NAME(m_w.colpm2)); |
| 185 | save_item(NAME(m_w.colpm3)); |
| 186 | save_item(NAME(m_w.colpf0)); |
| 187 | save_item(NAME(m_w.colpf1)); |
| 188 | save_item(NAME(m_w.colpf2)); |
| 189 | save_item(NAME(m_w.colpf3)); |
| 190 | save_item(NAME(m_w.colbk)); |
| 191 | save_item(NAME(m_w.prior)); |
| 192 | save_item(NAME(m_w.vdelay)); |
| 193 | save_item(NAME(m_w.gractl)); |
| 194 | save_item(NAME(m_w.hitclr)); |
| 195 | save_item(NAME(m_w.cons)); |
| 196 | machine().save().register_postload(save_prepost_delegate(FUNC(gtia_device::gtia_postload), this)); |
| 146 | 197 | } |
| 147 | 198 | |
| 148 | 199 | |
| 200 | //------------------------------------------------- |
| 201 | // device_reset - device-specific reset |
| 202 | //------------------------------------------------- |
| 149 | 203 | |
| 150 | | static int is_ntsc(running_machine &machine) |
| 204 | void gtia_device::device_reset() |
| 151 | 205 | { |
| 152 | | return ATTOSECONDS_TO_HZ(machine.first_screen()->frame_period().attoseconds) > 55; |
| 206 | /* reset the GTIA read/write/helper registers */ |
| 207 | for (int i = 0; i < 32; i++) |
| 208 | write(machine().driver_data()->generic_space(), i, 0); |
| 209 | memset(&m_r, 0, sizeof(m_r)); |
| 210 | if (is_ntsc()) |
| 211 | m_r.pal = 0xff; |
| 212 | else |
| 213 | m_r.pal = 0xf1; |
| 214 | m_r.gtia15 = 0xff; |
| 215 | m_r.gtia16 = 0xff; |
| 216 | m_r.gtia17 = 0xff; |
| 217 | m_r.gtia18 = 0xff; |
| 218 | m_r.gtia19 = 0xff; |
| 219 | m_r.gtia1a = 0xff; |
| 220 | m_r.gtia1b = 0xff; |
| 221 | m_r.gtia1c = 0xff; |
| 222 | m_r.gtia1d = 0xff; |
| 223 | m_r.gtia1e = 0xff; |
| 224 | m_r.cons = 0x07; /* console keys */ |
| 225 | SETCOL_B(ILL, 0x3e); /* bright red */ |
| 226 | SETCOL_B(EOR, 0xff); /* yellow */ |
| 153 | 227 | } |
| 154 | 228 | |
| 155 | 229 | |
| 156 | 230 | |
| 157 | | static void gtia_reset(running_machine &machine) |
| 231 | int gtia_device::is_ntsc() |
| 158 | 232 | { |
| 159 | | int i; |
| 160 | | atari_common_state *state = machine.driver_data<atari_common_state>(); |
| 233 | return ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds) > 55; |
| 234 | } |
| 161 | 235 | |
| 162 | | /* reset the GTIA read/write/helper registers */ |
| 163 | | for (i = 0; i < 32; i++) |
| 164 | | state->atari_gtia_w(state->generic_space(),i,0); |
| 165 | | memset(>ia.r, 0, sizeof(gtia.r)); |
| 166 | | if (is_ntsc(machine)) |
| 167 | | gtia.r.pal = 0xff; |
| 168 | | else |
| 169 | | gtia.r.pal = 0xf1; |
| 170 | | gtia.r.gtia15 = 0xff; |
| 171 | | gtia.r.gtia16 = 0xff; |
| 172 | | gtia.r.gtia17 = 0xff; |
| 173 | | gtia.r.gtia18 = 0xff; |
| 174 | | gtia.r.gtia19 = 0xff; |
| 175 | | gtia.r.gtia1a = 0xff; |
| 176 | | gtia.r.gtia1b = 0xff; |
| 177 | | gtia.r.gtia1c = 0xff; |
| 178 | | gtia.r.gtia1d = 0xff; |
| 179 | | gtia.r.gtia1e = 0xff; |
| 180 | | gtia.r.cons = 0x07; /* console keys */ |
| 181 | | SETCOL_B(ILL,0x3e); /* bright red */ |
| 182 | | SETCOL_B(EOR,0xff); /* yellow */ |
| 236 | void gtia_device::button_interrupt(int button_count, UINT8 button_port) |
| 237 | { |
| 238 | /* specify buttons relevant to this Atari variant */ |
| 239 | for (int i = 0; i < button_count; i++) |
| 240 | { |
| 241 | if ((m_w.gractl & GTIA_TRIGGER) == 0) |
| 242 | m_r.but[i] = 1; |
| 243 | m_r.but[i] &= BIT(button_port, i); |
| 244 | } |
| 245 | |
| 246 | /* button registers for xl/xe */ |
| 247 | if (button_count == 2) |
| 248 | { |
| 249 | m_r.but[2] = 1; /* not used on xl/xe */ |
| 250 | m_r.but[3] = 0; /* 1 if external cartridge is inserted */ |
| 251 | } |
| 252 | |
| 183 | 253 | } |
| 184 | 254 | |
| 185 | 255 | |
| r31963 | r31964 | |
| 190 | 260 | * |
| 191 | 261 | **************************************************************/ |
| 192 | 262 | |
| 193 | | READ8_MEMBER( atari_common_state::atari_gtia_r ) |
| 263 | READ8_MEMBER( gtia_device::read ) |
| 194 | 264 | { |
| 195 | 265 | switch (offset & 31) |
| 196 | 266 | { |
| 197 | | case 0: return gtia.r.m0pf; |
| 198 | | case 1: return gtia.r.m1pf; |
| 199 | | case 2: return gtia.r.m2pf; |
| 200 | | case 3: return gtia.r.m3pf; |
| 201 | | case 4: return gtia.r.p0pf; |
| 202 | | case 5: return gtia.r.p1pf; |
| 203 | | case 6: return gtia.r.p2pf; |
| 204 | | case 7: return gtia.r.p3pf; |
| 205 | | case 8: return gtia.r.m0pl; |
| 206 | | case 9: return gtia.r.m1pl; |
| 207 | | case 10: return gtia.r.m2pl; |
| 208 | | case 11: return gtia.r.m3pl; |
| 209 | | case 12: return gtia.r.p0pl; |
| 210 | | case 13: return gtia.r.p1pl; |
| 211 | | case 14: return gtia.r.p2pl; |
| 212 | | case 15: return gtia.r.p3pl; |
| 267 | case 0: return m_r.m0pf; |
| 268 | case 1: return m_r.m1pf; |
| 269 | case 2: return m_r.m2pf; |
| 270 | case 3: return m_r.m3pf; |
| 271 | case 4: return m_r.p0pf; |
| 272 | case 5: return m_r.p1pf; |
| 273 | case 6: return m_r.p2pf; |
| 274 | case 7: return m_r.p3pf; |
| 275 | case 8: return m_r.m0pl; |
| 276 | case 9: return m_r.m1pl; |
| 277 | case 10: return m_r.m2pl; |
| 278 | case 11: return m_r.m3pl; |
| 279 | case 12: return m_r.p0pl; |
| 280 | case 13: return m_r.p1pl; |
| 281 | case 14: return m_r.p2pl; |
| 282 | case 15: return m_r.p3pl; |
| 213 | 283 | |
| 214 | | case 16: return gtia.r.but[0]; |
| 215 | | case 17: return gtia.r.but[1]; |
| 216 | | case 18: return gtia.r.but[2]; |
| 217 | | case 19: return gtia.r.but[3]; |
| 284 | case 16: return m_r.but[0]; |
| 285 | case 17: return m_r.but[1]; |
| 286 | case 18: return m_r.but[2]; |
| 287 | case 19: return m_r.but[3]; |
| 218 | 288 | |
| 219 | | case 20: return gtia.r.pal; |
| 289 | case 20: return m_r.pal; |
| 220 | 290 | |
| 221 | | case 21: return gtia.r.gtia15; |
| 222 | | case 22: return gtia.r.gtia16; |
| 223 | | case 23: return gtia.r.gtia17; |
| 224 | | case 24: return gtia.r.gtia18; |
| 225 | | case 25: return gtia.r.gtia19; |
| 226 | | case 26: return gtia.r.gtia1a; |
| 227 | | case 27: return gtia.r.gtia1b; |
| 228 | | case 28: return gtia.r.gtia1c; |
| 229 | | case 29: return gtia.r.gtia1d; |
| 230 | | case 30: return gtia.r.gtia1e; |
| 291 | case 21: return m_r.gtia15; |
| 292 | case 22: return m_r.gtia16; |
| 293 | case 23: return m_r.gtia17; |
| 294 | case 24: return m_r.gtia18; |
| 295 | case 25: return m_r.gtia19; |
| 296 | case 26: return m_r.gtia1a; |
| 297 | case 27: return m_r.gtia1b; |
| 298 | case 28: return m_r.gtia1c; |
| 299 | case 29: return m_r.gtia1d; |
| 300 | case 30: return m_r.gtia1e; |
| 231 | 301 | |
| 232 | 302 | case 31: |
| 233 | | gtia.r.cons = gtia.intf.console_read ? (gtia.intf.console_read(space) & 0x0F) : 0x00; |
| 234 | | return gtia.r.cons; |
| 303 | m_r.cons = !m_read_cb.isnull() ? (m_read_cb(0) & 0x0f) : 0x00; |
| 304 | return m_r.cons; |
| 235 | 305 | } |
| 236 | 306 | return 0xff; |
| 237 | 307 | } |
| 238 | 308 | |
| 239 | 309 | |
| 240 | 310 | |
| 241 | | static void recalc_p0(void) |
| 311 | void gtia_device::recalc_p0() |
| 242 | 312 | { |
| 243 | 313 | if ( |
| 244 | 314 | #if CHECK_GRACTL |
| 245 | | (gtia.w.gractl & GTIA_PLAYER) == 0 || |
| 315 | (m_w.gractl & GTIA_PLAYER) == 0 || |
| 246 | 316 | #endif |
| 247 | | gtia.w.grafp0[gtia.h.vdelay_p0] == 0 || gtia.w.hposp0 >= 224 ) |
| 317 | m_w.grafp0[m_h.vdelay_p0] == 0 || m_w.hposp0 >= 224 ) |
| 248 | 318 | { |
| 249 | | gtia.h.grafp0 = 0; |
| 250 | | gtia.h.usedp &= ~0x10; |
| 319 | m_h.grafp0 = 0; |
| 320 | m_h.usedp &= ~0x10; |
| 251 | 321 | } |
| 252 | 322 | else |
| 253 | 323 | { |
| 254 | | gtia.h.grafp0 = gtia.w.grafp0[gtia.h.vdelay_p0]; |
| 255 | | gtia.h.usedp |= 0x10; |
| 324 | m_h.grafp0 = m_w.grafp0[m_h.vdelay_p0]; |
| 325 | m_h.usedp |= 0x10; |
| 256 | 326 | } |
| 257 | 327 | } |
| 258 | 328 | |
| 259 | | static void recalc_p1(void) |
| 329 | void gtia_device::recalc_p1() |
| 260 | 330 | { |
| 261 | 331 | if ( |
| 262 | 332 | #if CHECK_GRACTL |
| 263 | | (gtia.w.gractl & GTIA_PLAYER) == 0 || |
| 333 | (m_w.gractl & GTIA_PLAYER) == 0 || |
| 264 | 334 | #endif |
| 265 | | gtia.w.grafp1[gtia.h.vdelay_p1] == 0 || gtia.w.hposp1 >= 224 ) |
| 335 | m_w.grafp1[m_h.vdelay_p1] == 0 || m_w.hposp1 >= 224 ) |
| 266 | 336 | { |
| 267 | | gtia.h.grafp1 = 0; |
| 268 | | gtia.h.usedp &= ~0x20; |
| 337 | m_h.grafp1 = 0; |
| 338 | m_h.usedp &= ~0x20; |
| 269 | 339 | } |
| 270 | 340 | else |
| 271 | 341 | { |
| 272 | | gtia.h.grafp1 = gtia.w.grafp1[gtia.h.vdelay_p1]; |
| 273 | | gtia.h.usedp |= 0x20; |
| 342 | m_h.grafp1 = m_w.grafp1[m_h.vdelay_p1]; |
| 343 | m_h.usedp |= 0x20; |
| 274 | 344 | } |
| 275 | 345 | } |
| 276 | 346 | |
| 277 | | static void recalc_p2(void) |
| 347 | void gtia_device::recalc_p2() |
| 278 | 348 | { |
| 279 | 349 | if ( |
| 280 | 350 | #if CHECK_GRACTL |
| 281 | | (gtia.w.gractl & GTIA_PLAYER) == 0 || |
| 351 | (m_w.gractl & GTIA_PLAYER) == 0 || |
| 282 | 352 | #endif |
| 283 | | gtia.w.grafp2[gtia.h.vdelay_p2] == 0 || gtia.w.hposp2 >= 224 ) |
| 353 | m_w.grafp2[m_h.vdelay_p2] == 0 || m_w.hposp2 >= 224 ) |
| 284 | 354 | { |
| 285 | | gtia.h.grafp2 = 0; |
| 286 | | gtia.h.usedp &= ~0x40; |
| 355 | m_h.grafp2 = 0; |
| 356 | m_h.usedp &= ~0x40; |
| 287 | 357 | } |
| 288 | 358 | else |
| 289 | 359 | { |
| 290 | | gtia.h.grafp2 = gtia.w.grafp2[gtia.h.vdelay_p2]; |
| 291 | | gtia.h.usedp |= 0x40; |
| 360 | m_h.grafp2 = m_w.grafp2[m_h.vdelay_p2]; |
| 361 | m_h.usedp |= 0x40; |
| 292 | 362 | } |
| 293 | 363 | } |
| 294 | 364 | |
| 295 | | static void recalc_p3(void) |
| 365 | void gtia_device::recalc_p3() |
| 296 | 366 | { |
| 297 | 367 | if ( |
| 298 | 368 | #if CHECK_GRACTL |
| 299 | | (gtia.w.gractl & GTIA_PLAYER) == 0 || |
| 369 | (m_w.gractl & GTIA_PLAYER) == 0 || |
| 300 | 370 | #endif |
| 301 | | gtia.w.grafp3[gtia.h.vdelay_p3] == 0 || gtia.w.hposp3 >= 224 ) |
| 371 | m_w.grafp3[m_h.vdelay_p3] == 0 || m_w.hposp3 >= 224 ) |
| 302 | 372 | { |
| 303 | | gtia.h.grafp3 = 0; |
| 304 | | gtia.h.usedp &= ~0x80; |
| 373 | m_h.grafp3 = 0; |
| 374 | m_h.usedp &= ~0x80; |
| 305 | 375 | } |
| 306 | 376 | else |
| 307 | 377 | { |
| 308 | | gtia.h.grafp3 = gtia.w.grafp3[gtia.h.vdelay_p3]; |
| 309 | | gtia.h.usedp |= 0x80; |
| 378 | m_h.grafp3 = m_w.grafp3[m_h.vdelay_p3]; |
| 379 | m_h.usedp |= 0x80; |
| 310 | 380 | } |
| 311 | 381 | } |
| 312 | 382 | |
| 313 | | static void recalc_m0(void) |
| 383 | void gtia_device::recalc_m0() |
| 314 | 384 | { |
| 315 | 385 | if ( |
| 316 | 386 | #if CHECK_GRACTL |
| 317 | | (gtia.w.gractl & GTIA_MISSILE) == 0 || |
| 387 | (m_w.gractl & GTIA_MISSILE) == 0 || |
| 318 | 388 | #endif |
| 319 | | (gtia.w.grafm[gtia.h.vdelay_m0] & 0x03) == 0 || gtia.w.hposm0 >= 224 ) |
| 389 | (m_w.grafm[m_h.vdelay_m0] & 0x03) == 0 || m_w.hposm0 >= 224 ) |
| 320 | 390 | { |
| 321 | | gtia.h.grafm0 = 0; |
| 322 | | gtia.h.usedm0 = 0; |
| 391 | m_h.grafm0 = 0; |
| 392 | m_h.usedm0 = 0; |
| 323 | 393 | } |
| 324 | 394 | else |
| 325 | 395 | { |
| 326 | | gtia.h.grafm0 = (gtia.w.grafm[gtia.h.vdelay_m0] << 6) & 0xc0; |
| 327 | | gtia.h.usedm0 = (gtia.w.prior & 0x10) ? 0x08 : 0x10; |
| 396 | m_h.grafm0 = (m_w.grafm[m_h.vdelay_m0] << 6) & 0xc0; |
| 397 | m_h.usedm0 = (m_w.prior & 0x10) ? 0x08 : 0x10; |
| 328 | 398 | } |
| 329 | 399 | } |
| 330 | 400 | |
| 331 | | static void recalc_m1(void) |
| 401 | void gtia_device::recalc_m1() |
| 332 | 402 | { |
| 333 | 403 | if ( |
| 334 | 404 | #if CHECK_GRACTL |
| 335 | | (gtia.w.gractl & GTIA_MISSILE) == 0 || |
| 405 | (m_w.gractl & GTIA_MISSILE) == 0 || |
| 336 | 406 | #endif |
| 337 | | (gtia.w.grafm[gtia.h.vdelay_m1] & 0x0c) == 0 || gtia.w.hposm1 >= 224 ) |
| 407 | (m_w.grafm[m_h.vdelay_m1] & 0x0c) == 0 || m_w.hposm1 >= 224 ) |
| 338 | 408 | { |
| 339 | | gtia.h.grafm1 = 0; |
| 340 | | gtia.h.usedm1 = 0; |
| 409 | m_h.grafm1 = 0; |
| 410 | m_h.usedm1 = 0; |
| 341 | 411 | } |
| 342 | 412 | else |
| 343 | 413 | { |
| 344 | | gtia.h.grafm1 = (gtia.w.grafm[gtia.h.vdelay_m1] << 4) & 0xc0; |
| 345 | | gtia.h.usedm1 = (gtia.w.prior & 0x10) ? 0x08 : 0x20; |
| 414 | m_h.grafm1 = (m_w.grafm[m_h.vdelay_m1] << 4) & 0xc0; |
| 415 | m_h.usedm1 = (m_w.prior & 0x10) ? 0x08 : 0x20; |
| 346 | 416 | } |
| 347 | 417 | } |
| 348 | 418 | |
| 349 | | static void recalc_m2(void) |
| 419 | void gtia_device::recalc_m2() |
| 350 | 420 | { |
| 351 | 421 | if ( |
| 352 | 422 | #if CHECK_GRACTL |
| 353 | | (gtia.w.gractl & GTIA_MISSILE) == 0 || |
| 423 | (m_w.gractl & GTIA_MISSILE) == 0 || |
| 354 | 424 | #endif |
| 355 | | (gtia.w.grafm[gtia.h.vdelay_m2] & 0x30) == 0 || gtia.w.hposm2 >= 224 ) |
| 425 | (m_w.grafm[m_h.vdelay_m2] & 0x30) == 0 || m_w.hposm2 >= 224 ) |
| 356 | 426 | { |
| 357 | | gtia.h.grafm2 = 0; |
| 358 | | gtia.h.usedm2 = 0; |
| 427 | m_h.grafm2 = 0; |
| 428 | m_h.usedm2 = 0; |
| 359 | 429 | } |
| 360 | 430 | else |
| 361 | 431 | { |
| 362 | | gtia.h.grafm2 = (gtia.w.grafm[gtia.h.vdelay_m2] << 2) & 0xc0; |
| 363 | | gtia.h.usedm2 = (gtia.w.prior & 0x10) ? 0x08 : 0x40; |
| 432 | m_h.grafm2 = (m_w.grafm[m_h.vdelay_m2] << 2) & 0xc0; |
| 433 | m_h.usedm2 = (m_w.prior & 0x10) ? 0x08 : 0x40; |
| 364 | 434 | } |
| 365 | 435 | } |
| 366 | 436 | |
| 367 | | static void recalc_m3(void) |
| 437 | void gtia_device::recalc_m3() |
| 368 | 438 | { |
| 369 | 439 | if ( |
| 370 | 440 | #if CHECK_GRACTL |
| 371 | | (gtia.w.gractl & GTIA_MISSILE) == 0 || |
| 441 | (m_w.gractl & GTIA_MISSILE) == 0 || |
| 372 | 442 | #endif |
| 373 | | (gtia.w.grafm[gtia.h.vdelay_m3] & 0xc0) == 0 || gtia.w.hposm3 >= 224) |
| 443 | (m_w.grafm[m_h.vdelay_m3] & 0xc0) == 0 || m_w.hposm3 >= 224) |
| 374 | 444 | { |
| 375 | | gtia.h.grafm3 = 0; |
| 376 | | gtia.h.usedm3 = 0; |
| 445 | m_h.grafm3 = 0; |
| 446 | m_h.usedm3 = 0; |
| 377 | 447 | } |
| 378 | 448 | else |
| 379 | 449 | { |
| 380 | | gtia.h.grafm3 = (gtia.w.grafm[gtia.h.vdelay_m3] << 0) & 0xc0; |
| 381 | | gtia.h.usedm3 = (gtia.w.prior & 0x10) ? 0x08 : 0x80; |
| 450 | m_h.grafm3 = (m_w.grafm[m_h.vdelay_m3] << 0) & 0xc0; |
| 451 | m_h.usedm3 = (m_w.prior & 0x10) ? 0x08 : 0x80; |
| 382 | 452 | } |
| 383 | 453 | } |
| 384 | 454 | |
| 385 | 455 | |
| 386 | 456 | |
| 387 | | WRITE8_MEMBER( atari_common_state::atari_gtia_w ) |
| 457 | WRITE8_MEMBER( gtia_device::write ) |
| 388 | 458 | { |
| 389 | 459 | /* used for mixing hue/lum of different colors */ |
| 390 | 460 | // static UINT8 lumpm0=0,lumpm1=0,lumpm2=0,lumpm3=0,lumpm4=0; |
| r31963 | r31964 | |
| 398 | 468 | switch (offset & 31) |
| 399 | 469 | { |
| 400 | 470 | case 0: |
| 401 | | gtia.w.hposp0 = data; |
| 471 | m_w.hposp0 = data; |
| 402 | 472 | recalc_p0(); |
| 403 | 473 | break; |
| 404 | 474 | case 1: |
| 405 | | gtia.w.hposp1 = data; |
| 475 | m_w.hposp1 = data; |
| 406 | 476 | recalc_p1(); |
| 407 | 477 | break; |
| 408 | 478 | case 2: |
| 409 | | gtia.w.hposp2 = data; |
| 479 | m_w.hposp2 = data; |
| 410 | 480 | recalc_p2(); |
| 411 | 481 | break; |
| 412 | 482 | case 3: |
| 413 | | gtia.w.hposp3 = data; |
| 483 | m_w.hposp3 = data; |
| 414 | 484 | recalc_p3(); |
| 415 | 485 | break; |
| 416 | 486 | |
| 417 | 487 | case 4: |
| 418 | | gtia.w.hposm0 = data; |
| 488 | m_w.hposm0 = data; |
| 419 | 489 | recalc_m0(); |
| 420 | 490 | break; |
| 421 | 491 | case 5: |
| 422 | | gtia.w.hposm1 = data; |
| 492 | m_w.hposm1 = data; |
| 423 | 493 | recalc_m1(); |
| 424 | 494 | break; |
| 425 | 495 | case 6: |
| 426 | | gtia.w.hposm2 = data; |
| 496 | m_w.hposm2 = data; |
| 427 | 497 | recalc_m2(); |
| 428 | 498 | break; |
| 429 | 499 | case 7: |
| 430 | | gtia.w.hposm3 = data; |
| 500 | m_w.hposm3 = data; |
| 431 | 501 | recalc_m3(); |
| 432 | 502 | break; |
| 433 | 503 | |
| 434 | 504 | case 8: |
| 435 | 505 | data &= 3; |
| 436 | | gtia.w.sizep0 = data; |
| 506 | m_w.sizep0 = data; |
| 437 | 507 | recalc_p0(); |
| 438 | 508 | break; |
| 439 | 509 | case 9: |
| 440 | 510 | data &= 3; |
| 441 | | gtia.w.sizep1 = data; |
| 511 | m_w.sizep1 = data; |
| 442 | 512 | recalc_p1(); |
| 443 | 513 | break; |
| 444 | 514 | case 10: |
| 445 | 515 | data &= 3; |
| 446 | | gtia.w.sizep2 = data; |
| 516 | m_w.sizep2 = data; |
| 447 | 517 | recalc_p2(); |
| 448 | 518 | break; |
| 449 | 519 | case 11: |
| 450 | 520 | data &= 3; |
| 451 | | gtia.w.sizep3 = data; |
| 521 | m_w.sizep3 = data; |
| 452 | 522 | recalc_p3(); |
| 453 | 523 | break; |
| 454 | 524 | |
| 455 | 525 | case 12: |
| 456 | 526 | data &= 3; |
| 457 | | gtia.w.sizem = data; |
| 527 | m_w.sizem = data; |
| 458 | 528 | recalc_m0(); |
| 459 | 529 | recalc_m1(); |
| 460 | 530 | recalc_m2(); |
| r31963 | r31964 | |
| 462 | 532 | break; |
| 463 | 533 | |
| 464 | 534 | case 13: |
| 465 | | gtia.w.grafp0[0] = data; |
| 535 | m_w.grafp0[0] = data; |
| 466 | 536 | recalc_p0(); |
| 467 | 537 | break; |
| 468 | 538 | case 14: |
| 469 | | gtia.w.grafp1[0] = data; |
| 539 | m_w.grafp1[0] = data; |
| 470 | 540 | recalc_p1(); |
| 471 | 541 | break; |
| 472 | 542 | case 15: |
| 473 | | gtia.w.grafp2[0] = data; |
| 543 | m_w.grafp2[0] = data; |
| 474 | 544 | recalc_p2(); |
| 475 | 545 | break; |
| 476 | 546 | case 16: |
| 477 | | gtia.w.grafp3[0] = data; |
| 547 | m_w.grafp3[0] = data; |
| 478 | 548 | recalc_p3(); |
| 479 | 549 | break; |
| 480 | 550 | |
| 481 | 551 | case 17: |
| 482 | | gtia.w.grafm[0] = data; |
| 552 | m_w.grafm[0] = data; |
| 483 | 553 | recalc_m0(); |
| 484 | 554 | recalc_m1(); |
| 485 | 555 | recalc_m2(); |
| r31963 | r31964 | |
| 487 | 557 | break; |
| 488 | 558 | |
| 489 | 559 | case 18: /* color for player/missile #0 */ |
| 490 | | if (data == gtia.w.colpm0) |
| 560 | if (data == m_w.colpm0) |
| 491 | 561 | break; |
| 492 | | gtia.w.colpm0 = data; |
| 562 | m_w.colpm0 = data; |
| 493 | 563 | if (VERBOSE) |
| 494 | 564 | logerror("atari colpm0 $%02x\n", data); |
| 495 | 565 | |
| 496 | | SETCOL_B(PL0,data); /* set player 0 color */ |
| 497 | | SETCOL_B(MI0,data); /* set missile 0 color */ |
| 498 | | SETCOL_B(GT2,data); /* set GTIA mode 2 color 0 */ |
| 499 | | SETCOL_B(P000,data); /* set player 0 both pixels 0 */ |
| 500 | | SETCOL_L(P001,data); /* set player 0 left pixel 0 */ |
| 501 | | SETCOL_R(P010,data); /* set player 0 right pixel 0 */ |
| 502 | | SPLIT_HUE(data,huepm0); |
| 566 | SETCOL_B(PL0, data); /* set player 0 color */ |
| 567 | SETCOL_B(MI0, data); /* set missile 0 color */ |
| 568 | SETCOL_B(GT2, data); /* set GTIA mode 2 color 0 */ |
| 569 | SETCOL_B(P000, data); /* set player 0 both pixels 0 */ |
| 570 | SETCOL_L(P001, data); /* set player 0 left pixel 0 */ |
| 571 | SETCOL_R(P010, data); /* set player 0 right pixel 0 */ |
| 572 | SPLIT_HUE(data, huepm0); |
| 503 | 573 | data = huepm0 | lumpf1; |
| 504 | | SETCOL_R(P001,data); /* set player 0 right pixel 1 */ |
| 505 | | SETCOL_L(P010,data); /* set player 0 left pixel 1 */ |
| 506 | | SETCOL_B(P011,data); /* set player 0 both pixels 1 */ |
| 574 | SETCOL_R(P001, data); /* set player 0 right pixel 1 */ |
| 575 | SETCOL_L(P010, data); /* set player 0 left pixel 1 */ |
| 576 | SETCOL_B(P011, data); /* set player 0 both pixels 1 */ |
| 507 | 577 | break; |
| 508 | 578 | |
| 509 | 579 | case 19: /* color for player/missile #1 */ |
| 510 | | if (data == gtia.w.colpm1) |
| 580 | if (data == m_w.colpm1) |
| 511 | 581 | break; |
| 512 | | gtia.w.colpm1 = data; |
| 582 | m_w.colpm1 = data; |
| 513 | 583 | if (VERBOSE) |
| 514 | 584 | logerror("atari colpm1 $%02x\n", data); |
| 515 | 585 | |
| 516 | | SETCOL_B(PL1,data); /* set player color 1 */ |
| 517 | | SETCOL_B(MI1,data); /* set missile color 1 */ |
| 518 | | SETCOL_B(GT2+1,data); /* set GTIA mode 2 color 1 */ |
| 519 | | SETCOL_B(P100,data); /* set player 1 both pixels 0 */ |
| 520 | | SETCOL_L(P101,data); /* set player 1 left pixel 0 */ |
| 521 | | SETCOL_R(P110,data); /* set player 1 right pixel 0 */ |
| 522 | | SPLIT_HUE(data,huepm1); |
| 586 | SETCOL_B(PL1, data); /* set player color 1 */ |
| 587 | SETCOL_B(MI1, data); /* set missile color 1 */ |
| 588 | SETCOL_B(GT2+1, data); /* set GTIA mode 2 color 1 */ |
| 589 | SETCOL_B(P100, data); /* set player 1 both pixels 0 */ |
| 590 | SETCOL_L(P101, data); /* set player 1 left pixel 0 */ |
| 591 | SETCOL_R(P110, data); /* set player 1 right pixel 0 */ |
| 592 | SPLIT_HUE(data, huepm1); |
| 523 | 593 | data = huepm1 | lumpf1; |
| 524 | | SETCOL_R(P101,data); /* set player 1 right pixel 1 */ |
| 525 | | SETCOL_L(P110,data); /* set player 1 left pixel 1 */ |
| 526 | | SETCOL_B(P111,data); /* set player 1 both pixels 1 */ |
| 594 | SETCOL_R(P101, data); /* set player 1 right pixel 1 */ |
| 595 | SETCOL_L(P110, data); /* set player 1 left pixel 1 */ |
| 596 | SETCOL_B(P111, data); /* set player 1 both pixels 1 */ |
| 527 | 597 | break; |
| 528 | 598 | |
| 529 | 599 | case 20: /* color for player/missile #2 */ |
| 530 | | if (data == gtia.w.colpm2) |
| 600 | if (data == m_w.colpm2) |
| 531 | 601 | break; |
| 532 | | gtia.w.colpm2 = data; |
| 602 | m_w.colpm2 = data; |
| 533 | 603 | if (VERBOSE) |
| 534 | 604 | logerror("atari colpm2 $%02x\n", data); |
| 535 | 605 | |
| 536 | | SETCOL_B(PL2,data); /* set player 2 color */ |
| 537 | | SETCOL_B(MI2,data); /* set missile 2 color */ |
| 538 | | SETCOL_B(GT2+2,data); /* set GTIA mode 2 color 2 */ |
| 539 | | SETCOL_B(P200,data); /* set player 2 both pixels 0 */ |
| 540 | | SETCOL_L(P201,data); /* set player 2 left pixel 0 */ |
| 541 | | SETCOL_R(P210,data); /* set player 2 right pixel 0 */ |
| 542 | | SPLIT_HUE(data,huepm2); |
| 606 | SETCOL_B(PL2, data); /* set player 2 color */ |
| 607 | SETCOL_B(MI2, data); /* set missile 2 color */ |
| 608 | SETCOL_B(GT2+2, data); /* set GTIA mode 2 color 2 */ |
| 609 | SETCOL_B(P200, data); /* set player 2 both pixels 0 */ |
| 610 | SETCOL_L(P201, data); /* set player 2 left pixel 0 */ |
| 611 | SETCOL_R(P210, data); /* set player 2 right pixel 0 */ |
| 612 | SPLIT_HUE(data, huepm2); |
| 543 | 613 | data = huepm2 | lumpf1; |
| 544 | | SETCOL_R(P201,data); /* set player 2 right pixel 1 */ |
| 545 | | SETCOL_L(P210,data); /* set player 2 left pixel 1 */ |
| 546 | | SETCOL_B(P211,data); /* set player 2 both pixels 1 */ |
| 614 | SETCOL_R(P201, data); /* set player 2 right pixel 1 */ |
| 615 | SETCOL_L(P210, data); /* set player 2 left pixel 1 */ |
| 616 | SETCOL_B(P211, data); /* set player 2 both pixels 1 */ |
| 547 | 617 | break; |
| 548 | 618 | |
| 549 | 619 | case 21: /* color for player/missile #3 */ |
| 550 | | if (data == gtia.w.colpm3) |
| 620 | if (data == m_w.colpm3) |
| 551 | 621 | break; |
| 552 | | gtia.w.colpm3 = data; |
| 622 | m_w.colpm3 = data; |
| 553 | 623 | if (VERBOSE) |
| 554 | 624 | logerror("atari colpm3 $%02x\n", data); |
| 555 | 625 | |
| 556 | | SETCOL_B(PL3,data); /* set player 3 color */ |
| 557 | | SETCOL_B(MI3,data); /* set missile 3 color */ |
| 558 | | SETCOL_B(GT2+3,data); /* set GTIA mode 2 color 3 */ |
| 559 | | SETCOL_B(P300,data); /* set player 3 both pixels 0 */ |
| 560 | | SETCOL_L(P301,data); /* set player 3 left pixel 0 */ |
| 561 | | SETCOL_R(P310,data); /* set player 3 right pixel 0 */ |
| 562 | | SPLIT_HUE(data,huepm3); |
| 626 | SETCOL_B(PL3, data); /* set player 3 color */ |
| 627 | SETCOL_B(MI3, data); /* set missile 3 color */ |
| 628 | SETCOL_B(GT2+3, data); /* set GTIA mode 2 color 3 */ |
| 629 | SETCOL_B(P300, data); /* set player 3 both pixels 0 */ |
| 630 | SETCOL_L(P301, data); /* set player 3 left pixel 0 */ |
| 631 | SETCOL_R(P310, data); /* set player 3 right pixel 0 */ |
| 632 | SPLIT_HUE(data, huepm3); |
| 563 | 633 | data = huepm3 | lumpf1; |
| 564 | | SETCOL_R(P301,data); /* set player 3 right pixel 1 */ |
| 565 | | SETCOL_L(P310,data); /* set player 3 left pixel 1 */ |
| 566 | | SETCOL_B(P311,data); /* set player 3 both pixels 1 */ |
| 634 | SETCOL_R(P301, data); /* set player 3 right pixel 1 */ |
| 635 | SETCOL_L(P310, data); /* set player 3 left pixel 1 */ |
| 636 | SETCOL_B(P311, data); /* set player 3 both pixels 1 */ |
| 567 | 637 | break; |
| 568 | 638 | |
| 569 | 639 | case 22: /* playfield color #0 */ |
| 570 | | if (data == gtia.w.colpf0) |
| 640 | if (data == m_w.colpf0) |
| 571 | 641 | break; |
| 572 | | gtia.w.colpf0 = data; |
| 642 | m_w.colpf0 = data; |
| 573 | 643 | if (VERBOSE) |
| 574 | 644 | logerror("atari colpf0 $%02x\n", data); |
| 575 | 645 | |
| 576 | | SETCOL_B(PF0,data); /* set playfield 0 color */ |
| 577 | | SETCOL_B(GT2+4,data); /* set GTIA mode 2 color 4 */ |
| 646 | SETCOL_B(PF0, data); /* set playfield 0 color */ |
| 647 | SETCOL_B(GT2+4, data); /* set GTIA mode 2 color 4 */ |
| 578 | 648 | break; |
| 579 | 649 | |
| 580 | 650 | case 23: /* playfield color #1 */ |
| 581 | | if (data == gtia.w.colpf1) |
| 651 | if (data == m_w.colpf1) |
| 582 | 652 | break; |
| 583 | | gtia.w.colpf1 = data; |
| 653 | m_w.colpf1 = data; |
| 584 | 654 | if (VERBOSE) |
| 585 | 655 | logerror("atari colpf1 $%02x\n", data); |
| 586 | 656 | |
| 587 | | SETCOL_B(PF1,data); /* set playfield 1 color */ |
| 588 | | SETCOL_B(GT2+5,data); /* set GTIA mode 2 color 5 */ |
| 589 | | SPLIT_LUM(data,lumpf1); |
| 657 | SETCOL_B(PF1, data); /* set playfield 1 color */ |
| 658 | SETCOL_B(GT2+5, data); /* set GTIA mode 2 color 5 */ |
| 659 | SPLIT_LUM(data, lumpf1); |
| 590 | 660 | data = huepf2 | lumpf1; |
| 591 | | SETCOL_R(T01,data); /* set text mode right pixel 1 */ |
| 592 | | SETCOL_L(T10,data); /* set text mode left pixel 1 */ |
| 593 | | SETCOL_B(T11,data); /* set text mode both pixels 1 */ |
| 661 | SETCOL_R(T01, data); /* set text mode right pixel 1 */ |
| 662 | SETCOL_L(T10, data); /* set text mode left pixel 1 */ |
| 663 | SETCOL_B(T11, data); /* set text mode both pixels 1 */ |
| 594 | 664 | data = huebk | lumpf1; |
| 595 | | SETCOL_R(G01,data); /* set graphics mode right pixel 1 */ |
| 596 | | SETCOL_L(G10,data); /* set graphics mode left pixel 1 */ |
| 597 | | SETCOL_B(G11,data); /* set graphics mode both pixels 1 */ |
| 665 | SETCOL_R(G01, data); /* set graphics mode right pixel 1 */ |
| 666 | SETCOL_L(G10, data); /* set graphics mode left pixel 1 */ |
| 667 | SETCOL_B(G11, data); /* set graphics mode both pixels 1 */ |
| 598 | 668 | data = huepm0 | lumpf1; |
| 599 | | SETCOL_R(P001,data); /* set player 0 right pixel 1 */ |
| 600 | | SETCOL_L(P010,data); /* set player 0 left pixel 1 */ |
| 601 | | SETCOL_B(P011,data); /* set player 0 both pixels 1 */ |
| 669 | SETCOL_R(P001, data); /* set player 0 right pixel 1 */ |
| 670 | SETCOL_L(P010, data); /* set player 0 left pixel 1 */ |
| 671 | SETCOL_B(P011, data); /* set player 0 both pixels 1 */ |
| 602 | 672 | data = huepm1 | lumpf1; |
| 603 | | SETCOL_R(P101,data); /* set player 1 right pixel 1 */ |
| 604 | | SETCOL_L(P110,data); /* set player 1 left pixel 1 */ |
| 605 | | SETCOL_B(P111,data); /* set player 1 both pixels 1 */ |
| 673 | SETCOL_R(P101, data); /* set player 1 right pixel 1 */ |
| 674 | SETCOL_L(P110, data); /* set player 1 left pixel 1 */ |
| 675 | SETCOL_B(P111, data); /* set player 1 both pixels 1 */ |
| 606 | 676 | data = huepm2 | lumpf1; |
| 607 | | SETCOL_R(P201,data); /* set player 2 right pixel 1 */ |
| 608 | | SETCOL_L(P210,data); /* set player 2 left pixel 1 */ |
| 609 | | SETCOL_B(P211,data); /* set player 2 both pixels 1 */ |
| 677 | SETCOL_R(P201, data); /* set player 2 right pixel 1 */ |
| 678 | SETCOL_L(P210, data); /* set player 2 left pixel 1 */ |
| 679 | SETCOL_B(P211, data); /* set player 2 both pixels 1 */ |
| 610 | 680 | data = huepm3 | lumpf1; |
| 611 | | SETCOL_R(P301,data); /* set player 3 right pixel 1 */ |
| 612 | | SETCOL_L(P310,data); /* set player 3 left pixel 1 */ |
| 613 | | SETCOL_B(P311,data); /* set player 3 both pixels 1 */ |
| 681 | SETCOL_R(P301, data); /* set player 3 right pixel 1 */ |
| 682 | SETCOL_L(P310, data); /* set player 3 left pixel 1 */ |
| 683 | SETCOL_B(P311, data); /* set player 3 both pixels 1 */ |
| 614 | 684 | data = huepm4 | lumpf1; |
| 615 | | SETCOL_R(P401,data); /* set missiles right pixel 1 */ |
| 616 | | SETCOL_L(P410,data); /* set missiles left pixel 1 */ |
| 617 | | SETCOL_B(P411,data); /* set missiles both pixels 1 */ |
| 685 | SETCOL_R(P401, data); /* set missiles right pixel 1 */ |
| 686 | SETCOL_L(P410, data); /* set missiles left pixel 1 */ |
| 687 | SETCOL_B(P411, data); /* set missiles both pixels 1 */ |
| 618 | 688 | break; |
| 619 | 689 | |
| 620 | 690 | case 24: /* playfield color #2 */ |
| 621 | | if (data == gtia.w.colpf2) |
| 691 | if (data == m_w.colpf2) |
| 622 | 692 | break; |
| 623 | | gtia.w.colpf2 = data; |
| 693 | m_w.colpf2 = data; |
| 624 | 694 | if (VERBOSE) |
| 625 | 695 | logerror("atari colpf2 $%02x\n", data); |
| 626 | 696 | |
| 627 | | SETCOL_B(PF2,data); /* set playfield color 2 */ |
| 628 | | SETCOL_B(GT2+6,data); /* set GTIA mode 2 color 6 */ |
| 629 | | SETCOL_B(T00,data); /* set text mode both pixels 0 */ |
| 630 | | SETCOL_L(T01,data); /* set text mode left pixel 0 */ |
| 631 | | SETCOL_R(T10,data); /* set text mode right pixel 0 */ |
| 632 | | SPLIT_HUE(data,huepf2); |
| 697 | SETCOL_B(PF2, data); /* set playfield color 2 */ |
| 698 | SETCOL_B(GT2+6, data); /* set GTIA mode 2 color 6 */ |
| 699 | SETCOL_B(T00, data); /* set text mode both pixels 0 */ |
| 700 | SETCOL_L(T01, data); /* set text mode left pixel 0 */ |
| 701 | SETCOL_R(T10, data); /* set text mode right pixel 0 */ |
| 702 | SPLIT_HUE(data, huepf2); |
| 633 | 703 | data = huepf2 | lumpf1; |
| 634 | | SETCOL_R(T01,data); /* set text mode right pixel 1 */ |
| 635 | | SETCOL_L(T10,data); /* set text mode left pixel 1 */ |
| 636 | | SETCOL_B(T11,data); /* set text mode both pixels 1 */ |
| 704 | SETCOL_R(T01, data); /* set text mode right pixel 1 */ |
| 705 | SETCOL_L(T10, data); /* set text mode left pixel 1 */ |
| 706 | SETCOL_B(T11, data); /* set text mode both pixels 1 */ |
| 637 | 707 | break; |
| 638 | 708 | |
| 639 | 709 | case 25: /* playfield color #3 */ |
| 640 | | if (data == gtia.w.colpf3) |
| 710 | if (data == m_w.colpf3) |
| 641 | 711 | break; |
| 642 | | gtia.w.colpf3 = data; |
| 712 | m_w.colpf3 = data; |
| 643 | 713 | if (VERBOSE) |
| 644 | 714 | logerror("atari colpf3 $%02x\n", data); |
| 645 | 715 | |
| 646 | | SETCOL_B(PF3,data); /* set playfield color 3 */ |
| 647 | | SETCOL_B(GT2+7,data); /* set GTIA mode 2 color 7 */ |
| 648 | | SETCOL_B(P400,data); /* set p/m xor mode both pixels 0 */ |
| 649 | | SETCOL_L(P401,data); /* set p/m xor mode left pixel 0 */ |
| 650 | | SETCOL_R(P410,data); /* set p/m xor mode right pixel 0 */ |
| 651 | | SPLIT_HUE(data,huepm4); |
| 716 | SETCOL_B(PF3, data); /* set playfield color 3 */ |
| 717 | SETCOL_B(GT2+7, data); /* set GTIA mode 2 color 7 */ |
| 718 | SETCOL_B(P400, data); /* set p/m xor mode both pixels 0 */ |
| 719 | SETCOL_L(P401, data); /* set p/m xor mode left pixel 0 */ |
| 720 | SETCOL_R(P410, data); /* set p/m xor mode right pixel 0 */ |
| 721 | SPLIT_HUE(data, huepm4); |
| 652 | 722 | data = huepm4 | lumpf1; |
| 653 | | SETCOL_R(P401,data); /* set p/m xor mode right pixel 1 */ |
| 654 | | SETCOL_L(P410,data); /* set p/m xor mode left pixel 1 */ |
| 655 | | SETCOL_B(P411,data); /* set p/m xor mode both pixels 1 */ |
| 723 | SETCOL_R(P401, data); /* set p/m xor mode right pixel 1 */ |
| 724 | SETCOL_L(P410, data); /* set p/m xor mode left pixel 1 */ |
| 725 | SETCOL_B(P411, data); /* set p/m xor mode both pixels 1 */ |
| 656 | 726 | break; |
| 657 | 727 | |
| 658 | 728 | case 26: /* playfield background */ |
| 659 | | if (data == gtia.w.colbk) |
| 729 | if (data == m_w.colbk) |
| 660 | 730 | break; |
| 661 | | gtia.w.colbk = data; |
| 731 | m_w.colbk = data; |
| 662 | 732 | if (VERBOSE) |
| 663 | 733 | logerror("atari colbk $%02x\n", data); |
| 664 | 734 | |
| 665 | | SETCOL_B(PBK,data); /* set background color */ |
| 666 | | SETCOL_B(GT2+8,data); /* set GTIA mode 2 color 8 */ |
| 667 | | SETCOL_B(GT2+9,data); /* set GTIA mode 2 color 9 */ |
| 668 | | SETCOL_B(GT2+10,data); /* set GTIA mode 2 color 10 */ |
| 669 | | SETCOL_B(GT2+11,data); /* set GTIA mode 2 color 11 */ |
| 670 | | SETCOL_B(GT2+12,data); /* set GTIA mode 2 color 12 */ |
| 671 | | SETCOL_B(GT2+13,data); /* set GTIA mode 2 color 13 */ |
| 672 | | SETCOL_B(GT2+14,data); /* set GTIA mode 2 color 14 */ |
| 673 | | SETCOL_B(GT2+15,data); /* set GTIA mode 2 color 15 */ |
| 674 | | SETCOL_B(G00,data); /* set 2 color graphics both pixels 0 */ |
| 675 | | SETCOL_L(G01,data); /* set 2 color graphics left pixel 0 */ |
| 676 | | SETCOL_R(G10,data); /* set 2 color graphics right pixel 0 */ |
| 677 | | SPLIT_HUE(data,huebk); |
| 735 | SETCOL_B(PBK, data); /* set background color */ |
| 736 | SETCOL_B(GT2+8, data); /* set GTIA mode 2 color 8 */ |
| 737 | SETCOL_B(GT2+9, data); /* set GTIA mode 2 color 9 */ |
| 738 | SETCOL_B(GT2+10, data); /* set GTIA mode 2 color 10 */ |
| 739 | SETCOL_B(GT2+11, data); /* set GTIA mode 2 color 11 */ |
| 740 | SETCOL_B(GT2+12, data); /* set GTIA mode 2 color 12 */ |
| 741 | SETCOL_B(GT2+13, data); /* set GTIA mode 2 color 13 */ |
| 742 | SETCOL_B(GT2+14, data); /* set GTIA mode 2 color 14 */ |
| 743 | SETCOL_B(GT2+15, data); /* set GTIA mode 2 color 15 */ |
| 744 | SETCOL_B(G00, data); /* set 2 color graphics both pixels 0 */ |
| 745 | SETCOL_L(G01, data); /* set 2 color graphics left pixel 0 */ |
| 746 | SETCOL_R(G10, data); /* set 2 color graphics right pixel 0 */ |
| 747 | SPLIT_HUE(data, huebk); |
| 678 | 748 | data = huebk | lumpf1; |
| 679 | | SETCOL_R(G01,data); /* set 2 color graphics right pixel 1 */ |
| 680 | | SETCOL_L(G10,data); /* set 2 color graphics left pixel 1 */ |
| 681 | | SETCOL_B(G11,data); /* set 2 color graphics both pixels 1 */ |
| 682 | | SETCOL_B(GT1+ 0,(data&HUE)+(0x00&LUM)); /* set GTIA mode 1 HUE + LUM 0..15 */ |
| 683 | | SETCOL_B(GT1+ 1,(data&HUE)+(0x11&LUM)); |
| 684 | | SETCOL_B(GT1+ 2,(data&HUE)+(0x22&LUM)); |
| 685 | | SETCOL_B(GT1+ 3,(data&HUE)+(0x33&LUM)); |
| 686 | | SETCOL_B(GT1+ 4,(data&HUE)+(0x44&LUM)); |
| 687 | | SETCOL_B(GT1+ 5,(data&HUE)+(0x55&LUM)); |
| 688 | | SETCOL_B(GT1+ 6,(data&HUE)+(0x66&LUM)); |
| 689 | | SETCOL_B(GT1+ 7,(data&HUE)+(0x77&LUM)); |
| 690 | | SETCOL_B(GT1+ 8,(data&HUE)+(0x88&LUM)); |
| 691 | | SETCOL_B(GT1+ 9,(data&HUE)+(0x99&LUM)); |
| 692 | | SETCOL_B(GT1+10,(data&HUE)+(0xaa&LUM)); |
| 693 | | SETCOL_B(GT1+11,(data&HUE)+(0xbb&LUM)); |
| 694 | | SETCOL_B(GT1+12,(data&HUE)+(0xcc&LUM)); |
| 695 | | SETCOL_B(GT1+13,(data&HUE)+(0xdd&LUM)); |
| 696 | | SETCOL_B(GT1+14,(data&HUE)+(0xee&LUM)); |
| 697 | | SETCOL_B(GT1+15,(data&HUE)+(0xff&LUM)); |
| 698 | | SETCOL_B(GT3+ 0,(data&LUM)+(0x00&HUE)); /* set GTIA mode 3 LUM + HUE 0..15 */ |
| 699 | | SETCOL_B(GT3+ 1,(data&LUM)+(0x11&HUE)); |
| 700 | | SETCOL_B(GT3+ 2,(data&LUM)+(0x22&HUE)); |
| 701 | | SETCOL_B(GT3+ 3,(data&LUM)+(0x33&HUE)); |
| 702 | | SETCOL_B(GT3+ 4,(data&LUM)+(0x44&HUE)); |
| 703 | | SETCOL_B(GT3+ 5,(data&LUM)+(0x55&HUE)); |
| 704 | | SETCOL_B(GT3+ 6,(data&LUM)+(0x66&HUE)); |
| 705 | | SETCOL_B(GT3+ 7,(data&LUM)+(0x77&HUE)); |
| 706 | | SETCOL_B(GT3+ 8,(data&LUM)+(0x88&HUE)); |
| 707 | | SETCOL_B(GT3+ 9,(data&LUM)+(0x99&HUE)); |
| 708 | | SETCOL_B(GT3+10,(data&LUM)+(0xaa&HUE)); |
| 709 | | SETCOL_B(GT3+11,(data&LUM)+(0xbb&HUE)); |
| 710 | | SETCOL_B(GT3+12,(data&LUM)+(0xcc&HUE)); |
| 711 | | SETCOL_B(GT3+13,(data&LUM)+(0xdd&HUE)); |
| 712 | | SETCOL_B(GT3+14,(data&LUM)+(0xee&HUE)); |
| 713 | | SETCOL_B(GT3+15,(data&LUM)+(0xff&HUE)); |
| 749 | SETCOL_R(G01, data); /* set 2 color graphics right pixel 1 */ |
| 750 | SETCOL_L(G10, data); /* set 2 color graphics left pixel 1 */ |
| 751 | SETCOL_B(G11, data); /* set 2 color graphics both pixels 1 */ |
| 752 | SETCOL_B(GT1+ 0, (data & HUE) + (0x00 & LUM)); /* set GTIA mode 1 HUE + LUM 0..15 */ |
| 753 | SETCOL_B(GT1+ 1, (data & HUE) + (0x11 & LUM)); |
| 754 | SETCOL_B(GT1+ 2, (data & HUE) + (0x22 & LUM)); |
| 755 | SETCOL_B(GT1+ 3, (data & HUE) + (0x33 & LUM)); |
| 756 | SETCOL_B(GT1+ 4, (data & HUE) + (0x44 & LUM)); |
| 757 | SETCOL_B(GT1+ 5, (data & HUE) + (0x55 & LUM)); |
| 758 | SETCOL_B(GT1+ 6, (data & HUE) + (0x66 & LUM)); |
| 759 | SETCOL_B(GT1+ 7, (data & HUE) + (0x77 & LUM)); |
| 760 | SETCOL_B(GT1+ 8, (data & HUE) + (0x88 & LUM)); |
| 761 | SETCOL_B(GT1+ 9, (data & HUE) + (0x99 & LUM)); |
| 762 | SETCOL_B(GT1+10, (data & HUE) + (0xaa & LUM)); |
| 763 | SETCOL_B(GT1+11, (data & HUE) + (0xbb & LUM)); |
| 764 | SETCOL_B(GT1+12, (data & HUE) + (0xcc & LUM)); |
| 765 | SETCOL_B(GT1+13, (data & HUE) + (0xdd & LUM)); |
| 766 | SETCOL_B(GT1+14, (data & HUE) + (0xee & LUM)); |
| 767 | SETCOL_B(GT1+15, (data & HUE) + (0xff & LUM)); |
| 768 | SETCOL_B(GT3+ 0, (data & LUM) + (0x00 & HUE)); /* set GTIA mode 3 LUM + HUE 0..15 */ |
| 769 | SETCOL_B(GT3+ 1, (data & LUM) + (0x11 & HUE)); |
| 770 | SETCOL_B(GT3+ 2, (data & LUM) + (0x22 & HUE)); |
| 771 | SETCOL_B(GT3+ 3, (data & LUM) + (0x33 & HUE)); |
| 772 | SETCOL_B(GT3+ 4, (data & LUM) + (0x44 & HUE)); |
| 773 | SETCOL_B(GT3+ 5, (data & LUM) + (0x55 & HUE)); |
| 774 | SETCOL_B(GT3+ 6, (data & LUM) + (0x66 & HUE)); |
| 775 | SETCOL_B(GT3+ 7, (data & LUM) + (0x77 & HUE)); |
| 776 | SETCOL_B(GT3+ 8, (data & LUM) + (0x88 & HUE)); |
| 777 | SETCOL_B(GT3+ 9, (data & LUM) + (0x99 & HUE)); |
| 778 | SETCOL_B(GT3+10, (data & LUM) + (0xaa & HUE)); |
| 779 | SETCOL_B(GT3+11, (data & LUM) + (0xbb & HUE)); |
| 780 | SETCOL_B(GT3+12, (data & LUM) + (0xcc & HUE)); |
| 781 | SETCOL_B(GT3+13, (data & LUM) + (0xdd & HUE)); |
| 782 | SETCOL_B(GT3+14, (data & LUM) + (0xee & HUE)); |
| 783 | SETCOL_B(GT3+15, (data & LUM) + (0xff & HUE)); |
| 714 | 784 | break; |
| 715 | 785 | |
| 716 | 786 | case 27: |
| 717 | | gtia.w.prior = data; |
| 787 | m_w.prior = data; |
| 718 | 788 | recalc_m0(); |
| 719 | 789 | recalc_m1(); |
| 720 | 790 | recalc_m2(); |
| r31963 | r31964 | |
| 722 | 792 | break; |
| 723 | 793 | |
| 724 | 794 | case 28: /* delay until vertical retrace */ |
| 725 | | gtia.w.vdelay = data; |
| 726 | | gtia.h.vdelay_m0 = (data >> 0) & 1; |
| 727 | | gtia.h.vdelay_m1 = (data >> 1) & 1; |
| 728 | | gtia.h.vdelay_m2 = (data >> 2) & 1; |
| 729 | | gtia.h.vdelay_m3 = (data >> 3) & 1; |
| 730 | | gtia.h.vdelay_p0 = (data >> 4) & 1; |
| 731 | | gtia.h.vdelay_p1 = (data >> 5) & 1; |
| 732 | | gtia.h.vdelay_p2 = (data >> 6) & 1; |
| 733 | | gtia.h.vdelay_p3 = (data >> 7) & 1; |
| 795 | m_w.vdelay = data; |
| 796 | m_h.vdelay_m0 = (data >> 0) & 1; |
| 797 | m_h.vdelay_m1 = (data >> 1) & 1; |
| 798 | m_h.vdelay_m2 = (data >> 2) & 1; |
| 799 | m_h.vdelay_m3 = (data >> 3) & 1; |
| 800 | m_h.vdelay_p0 = (data >> 4) & 1; |
| 801 | m_h.vdelay_p1 = (data >> 5) & 1; |
| 802 | m_h.vdelay_p2 = (data >> 6) & 1; |
| 803 | m_h.vdelay_p3 = (data >> 7) & 1; |
| 734 | 804 | break; |
| 735 | 805 | |
| 736 | 806 | case 29: |
| 737 | | gtia.w.gractl = data; |
| 807 | m_w.gractl = data; |
| 738 | 808 | recalc_p0(); |
| 739 | 809 | recalc_p1(); |
| 740 | 810 | recalc_p2(); |
| r31963 | r31964 | |
| 746 | 816 | break; |
| 747 | 817 | |
| 748 | 818 | case 30: /* clear collisions */ |
| 749 | | gtia.r.m0pf = gtia.r.m1pf = gtia.r.m2pf = gtia.r.m3pf = |
| 750 | | gtia.r.p0pf = gtia.r.p1pf = gtia.r.p2pf = gtia.r.p3pf = |
| 751 | | gtia.r.m0pl = gtia.r.m1pl = gtia.r.m2pl = gtia.r.m3pl = |
| 752 | | gtia.r.p0pl = gtia.r.p1pl = gtia.r.p2pl = gtia.r.p3pl = 0; |
| 753 | | gtia.w.hitclr = data; |
| 819 | m_r.m0pf = m_r.m1pf = m_r.m2pf = m_r.m3pf = |
| 820 | m_r.p0pf = m_r.p1pf = m_r.p2pf = m_r.p3pf = |
| 821 | m_r.m0pl = m_r.m1pl = m_r.m2pl = m_r.m3pl = |
| 822 | m_r.p0pl = m_r.p1pl = m_r.p2pl = m_r.p3pl = 0; |
| 823 | m_w.hitclr = data; |
| 754 | 824 | break; |
| 755 | 825 | |
| 756 | 826 | case 31: /* write console (speaker) */ |
| 757 | | if (data == gtia.w.cons) |
| 827 | if (data == m_w.cons) |
| 758 | 828 | break; |
| 759 | | gtia.w.cons = data; |
| 760 | | if (gtia.intf.console_write) |
| 761 | | gtia.intf.console_write(space, gtia.w.cons); |
| 829 | m_w.cons = data; |
| 830 | if (!m_write_cb.isnull()) |
| 831 | m_write_cb((offs_t)0, m_w.cons); |
| 762 | 832 | break; |
| 763 | 833 | } |
| 764 | 834 | } |
| 765 | 835 | |
| 766 | 836 | |
| 767 | 837 | |
| 768 | | static void gtia_state_postload(running_machine &machine) |
| 838 | void gtia_device::gtia_postload() |
| 769 | 839 | { |
| 770 | 840 | recalc_p0(); |
| 771 | 841 | recalc_p1(); |
| r31963 | r31964 | |
| 818 | 888 | /* */ 0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000 |
| 819 | 889 | }; |
| 820 | 890 | |
| 821 | | static inline void player_render(UINT8 gfx, int size, UINT8 color, UINT8 *dst) |
| 891 | inline void gtia_device::player_render(UINT8 gfx, int size, UINT8 color, UINT8 *dst) |
| 822 | 892 | { |
| 823 | 893 | // size is the number of bits in *dst to be filled: 1, 2 or 4 |
| 824 | 894 | if (size == 3) |
| r31963 | r31964 | |
| 829 | 899 | dst[i * size + s] |= color; |
| 830 | 900 | } |
| 831 | 901 | |
| 832 | | static inline void missile_render(UINT8 gfx, int size, UINT8 color, UINT8 *dst) |
| 902 | inline void gtia_device::missile_render(UINT8 gfx, int size, UINT8 color, UINT8 *dst) |
| 833 | 903 | { |
| 834 | 904 | // size is the number of bits in *dst to be filled: 1, 2 or 4 |
| 835 | 905 | if (size == 3) |
| r31963 | r31964 | |
| 841 | 911 | } |
| 842 | 912 | |
| 843 | 913 | |
| 844 | | void gtia_render(UINT8 *src, UINT8 *dst, UINT8 *prio, UINT8 *pmbits) |
| 914 | void gtia_device::render(UINT8 *src, UINT8 *dst, UINT8 *prio, UINT8 *pmbits) |
| 845 | 915 | { |
| 846 | | if (gtia.h.grafp0) |
| 847 | | player_render(gtia.h.grafp0, gtia.w.sizep0 + 1, P0, &pmbits[gtia.w.hposp0]); |
| 848 | | if (gtia.h.grafp1) |
| 849 | | player_render(gtia.h.grafp1, gtia.w.sizep1 + 1, P1, &pmbits[gtia.w.hposp1]); |
| 850 | | if (gtia.h.grafp2) |
| 851 | | player_render(gtia.h.grafp2, gtia.w.sizep2 + 1, P2, &pmbits[gtia.w.hposp2]); |
| 852 | | if (gtia.h.grafp3) |
| 853 | | player_render(gtia.h.grafp3, gtia.w.sizep3 + 1, P3, &pmbits[gtia.w.hposp3]); |
| 916 | if (m_h.grafp0) |
| 917 | player_render(m_h.grafp0, m_w.sizep0 + 1, GTIA_P0, &pmbits[m_w.hposp0]); |
| 918 | if (m_h.grafp1) |
| 919 | player_render(m_h.grafp1, m_w.sizep1 + 1, GTIA_P1, &pmbits[m_w.hposp1]); |
| 920 | if (m_h.grafp2) |
| 921 | player_render(m_h.grafp2, m_w.sizep2 + 1, GTIA_P2, &pmbits[m_w.hposp2]); |
| 922 | if (m_h.grafp3) |
| 923 | player_render(m_h.grafp3, m_w.sizep3 + 1, GTIA_P3, &pmbits[m_w.hposp3]); |
| 854 | 924 | |
| 855 | | if (gtia.h.grafm0) |
| 856 | | missile_render(gtia.h.grafm0, gtia.w.sizem + 1, M0, &pmbits[gtia.w.hposm0]); |
| 857 | | if (gtia.h.grafm1) |
| 858 | | missile_render(gtia.h.grafm1, gtia.w.sizem + 1, M1, &pmbits[gtia.w.hposm1]); |
| 859 | | if (gtia.h.grafm2) |
| 860 | | missile_render(gtia.h.grafm2, gtia.w.sizem + 1, M2, &pmbits[gtia.w.hposm2]); |
| 861 | | if (gtia.h.grafm3) |
| 862 | | missile_render(gtia.h.grafm3, gtia.w.sizem + 1, M3, &pmbits[gtia.w.hposm3]); |
| 925 | if (m_h.grafm0) |
| 926 | missile_render(m_h.grafm0, m_w.sizem + 1, GTIA_M0, &pmbits[m_w.hposm0]); |
| 927 | if (m_h.grafm1) |
| 928 | missile_render(m_h.grafm1, m_w.sizem + 1, GTIA_M1, &pmbits[m_w.hposm1]); |
| 929 | if (m_h.grafm2) |
| 930 | missile_render(m_h.grafm2, m_w.sizem + 1, GTIA_M2, &pmbits[m_w.hposm2]); |
| 931 | if (m_h.grafm3) |
| 932 | missile_render(m_h.grafm3, m_w.sizem + 1, GTIA_M3, &pmbits[m_w.hposm3]); |
| 863 | 933 | |
| 864 | | for (int x = 0; x < HWIDTH * 4; x++, src++, dst++) |
| 934 | for (int x = 0; x < GTIA_HWIDTH * 4; x++, src++, dst++) |
| 865 | 935 | { |
| 866 | 936 | UINT8 pm, pc, pf; |
| 867 | 937 | if (!*src) |
| r31963 | r31964 | |
| 872 | 942 | /* get the current playfield color */ |
| 873 | 943 | pc = *dst; |
| 874 | 944 | pf = pf_collision[pc]; |
| 875 | | if (pm&P0) { gtia.r.p0pf |= pf; gtia.r.p0pl |= pm&( P1|P2|P3); } |
| 876 | | if (pm&P1) { gtia.r.p1pf |= pf; gtia.r.p1pl |= pm&(P0| P2|P3); } |
| 877 | | if (pm&P2) { gtia.r.p2pf |= pf; gtia.r.p2pl |= pm&(P0|P1| P3); } |
| 878 | | if (pm&P3) { gtia.r.p3pf |= pf; gtia.r.p3pl |= pm&(P0|P1|P2 ); } |
| 879 | | if (pm&M0) { gtia.r.m0pf |= pf; gtia.r.m0pl |= pm&(P0|P1|P2|P3); } |
| 880 | | if (pm&M1) { gtia.r.m1pf |= pf; gtia.r.m1pl |= pm&(P0|P1|P2|P3); } |
| 881 | | if (pm&M2) { gtia.r.m2pf |= pf; gtia.r.m2pl |= pm&(P0|P1|P2|P3); } |
| 882 | | if (pm&M3) { gtia.r.m3pf |= pf; gtia.r.m3pl |= pm&(P0|P1|P2|P3); } |
| 945 | if (pm & GTIA_P0) { m_r.p0pf |= pf; m_r.p0pl |= pm & ( GTIA_P1 | GTIA_P2 | GTIA_P3); } |
| 946 | if (pm & GTIA_P1) { m_r.p1pf |= pf; m_r.p1pl |= pm & (GTIA_P0 | GTIA_P2 | GTIA_P3); } |
| 947 | if (pm & GTIA_P2) { m_r.p2pf |= pf; m_r.p2pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P3); } |
| 948 | if (pm & GTIA_P3) { m_r.p3pf |= pf; m_r.p3pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P2 ); } |
| 949 | if (pm & GTIA_M0) { m_r.m0pf |= pf; m_r.m0pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P2 | GTIA_P3); } |
| 950 | if (pm & GTIA_M1) { m_r.m1pf |= pf; m_r.m1pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P2 | GTIA_P3); } |
| 951 | if (pm & GTIA_M2) { m_r.m2pf |= pf; m_r.m2pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P2 | GTIA_P3); } |
| 952 | if (pm & GTIA_M3) { m_r.m3pf |= pf; m_r.m3pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P2 | GTIA_P3); } |
| 883 | 953 | /* color with higher priority? change playfield */ |
| 884 | 954 | pc = prio[pf_prioindex[pc] | pm]; |
| 885 | 955 | if (pc) *dst = pc; |
| 886 | 956 | } |
| 887 | 957 | /* copy player/missile graphics in case of vdelay */ |
| 888 | | gtia.w.grafp0[1] = gtia.w.grafp0[0]; |
| 889 | | gtia.w.grafp1[1] = gtia.w.grafp1[0]; |
| 890 | | gtia.w.grafp2[1] = gtia.w.grafp2[0]; |
| 891 | | gtia.w.grafp3[1] = gtia.w.grafp3[0]; |
| 892 | | gtia.w.grafm[1] = gtia.w.grafm[0]; |
| 958 | m_w.grafp0[1] = m_w.grafp0[0]; |
| 959 | m_w.grafp1[1] = m_w.grafp1[0]; |
| 960 | m_w.grafp2[1] = m_w.grafp2[0]; |
| 961 | m_w.grafp3[1] = m_w.grafp3[0]; |
| 962 | m_w.grafm[1] = m_w.grafm[0]; |
| 893 | 963 | } |