trunk/src/mess/machine/a7800.c
| r20902 | r20903 | |
| 23 | 23 | #include "emu.h" |
| 24 | 24 | #include "includes/a7800.h" |
| 25 | 25 | #include "cpu/m6502/m6502.h" |
| 26 | | #include "sound/tiasound.h" |
| 27 | | #include "machine/6532riot.h" |
| 28 | | #include "sound/pokey.h" |
| 29 | | #include "sound/tiaintf.h" |
| 30 | 26 | |
| 31 | 27 | |
| 32 | 28 | |
| r20902 | r20903 | |
| 40 | 36 | |
| 41 | 37 | READ8_MEMBER(a7800_state::riot_joystick_r) |
| 42 | 38 | { |
| 43 | | return machine().root_device().ioport("joysticks")->read(); |
| 39 | return m_io_joysticks->read(); |
| 44 | 40 | } |
| 45 | 41 | |
| 46 | 42 | READ8_MEMBER(a7800_state::riot_console_button_r) |
| 47 | 43 | { |
| 48 | | return machine().root_device().ioport("console_buttons")->read(); |
| 44 | return m_io_console_buttons->read(); |
| 49 | 45 | } |
| 50 | 46 | |
| 51 | 47 | WRITE8_MEMBER(a7800_state::riot_button_pullup_w) |
| r20902 | r20903 | |
| 70 | 66 | |
| 71 | 67 | void a7800_state::a7800_driver_init(int ispal, int lines) |
| 72 | 68 | { |
| 73 | | address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 74 | | m_ROM = memregion("maincpu")->base(); |
| 69 | address_space& space = m_maincpu->space(AS_PROGRAM); |
| 70 | m_ROM = m_region_maincpu->base(); |
| 75 | 71 | m_ispal = ispal; |
| 76 | 72 | m_lines = lines; |
| 77 | 73 | m_p1_one_button = 1; |
| 78 | 74 | m_p2_one_button = 1; |
| 79 | 75 | |
| 80 | 76 | /* standard banks */ |
| 81 | | membank("bank5")->set_base(&m_ROM[0x2040]); /* RAM0 */ |
| 82 | | membank("bank6")->set_base(&m_ROM[0x2140]); /* RAM1 */ |
| 83 | | membank("bank7")->set_base(&m_ROM[0x2000]); /* MAINRAM */ |
| 77 | m_bank5->set_base(&m_ROM[0x2040]); /* RAM0 */ |
| 78 | m_bank6->set_base(&m_ROM[0x2140]); /* RAM1 */ |
| 79 | m_bank7->set_base(&m_ROM[0x2000]); /* MAINRAM */ |
| 84 | 80 | |
| 85 | 81 | /* Brutal hack put in as a consequence of new memory system; fix this */ |
| 86 | 82 | space.install_readwrite_bank(0x0480, 0x04FF,"bank10"); |
| 87 | | membank("bank10")->set_base(m_ROM + 0x0480); |
| 83 | m_bank10 = membank("bank10"); |
| 84 | m_bank10->set_base(m_ROM + 0x0480); |
| 88 | 85 | space.install_readwrite_bank(0x1800, 0x27FF, "bank11"); |
| 89 | | membank("bank11")->set_base(m_ROM + 0x1800); |
| 86 | m_bank11 = membank("bank11"); |
| 87 | m_bank11->set_base(m_ROM + 0x1800); |
| 90 | 88 | |
| 91 | 89 | m_bios_bkup = NULL; |
| 92 | 90 | m_cart_bkup = NULL; |
| r20902 | r20903 | |
| 122 | 120 | void a7800_state::machine_reset() |
| 123 | 121 | { |
| 124 | 122 | UINT8 *memory; |
| 125 | | address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 123 | address_space& space = m_maincpu->space(AS_PROGRAM); |
| 126 | 124 | |
| 127 | 125 | m_ctrl_lock = 0; |
| 128 | 126 | m_ctrl_reg = 0; |
| 129 | 127 | m_maria_flag = 0; |
| 130 | 128 | |
| 131 | 129 | /* set banks to default states */ |
| 132 | | memory = memregion("maincpu")->base(); |
| 133 | | membank("bank1")->set_base(memory + 0x4000 ); |
| 134 | | membank("bank2")->set_base(memory + 0x8000 ); |
| 135 | | membank("bank3")->set_base(memory + 0xA000 ); |
| 136 | | membank("bank4")->set_base(memory + 0xC000 ); |
| 130 | memory = m_region_maincpu->base(); |
| 131 | m_bank1->set_base(memory + 0x4000 ); |
| 132 | m_bank2->set_base(memory + 0x8000 ); |
| 133 | m_bank3->set_base(memory + 0xA000 ); |
| 134 | m_bank4->set_base(memory + 0xC000 ); |
| 137 | 135 | |
| 138 | 136 | /* pokey cartridge */ |
| 139 | 137 | if (m_cart_type & 0x01) |
| 140 | 138 | { |
| 141 | | pokey_device *pokey = machine().device<pokey_device>("pokey"); |
| 142 | | space.install_readwrite_handler(0x4000, 0x7FFF, read8_delegate(FUNC(pokey_device::read),pokey), write8_delegate(FUNC(pokey_device::write),pokey)); |
| 139 | space.install_readwrite_handler(0x4000, 0x7FFF, read8_delegate(FUNC(pokey_device::read),(pokey_device*)m_pokey), write8_delegate(FUNC(pokey_device::write),(pokey_device*)m_pokey)); |
| 143 | 140 | } |
| 144 | 141 | } |
| 145 | 142 | |
| r20902 | r20903 | |
| 246 | 243 | { |
| 247 | 244 | UINT32 len = 0, start = 0; |
| 248 | 245 | unsigned char header[128]; |
| 249 | | UINT8 *memory = image.device().machine().root_device().memregion("maincpu")->base(); |
| 246 | UINT8 *memory = m_region_maincpu->base(); |
| 250 | 247 | const char *pcb_name; |
| 251 | 248 | |
| 252 | 249 | // detect cart type either from xml or from header |
| r20902 | r20903 | |
| 391 | 388 | |
| 392 | 389 | WRITE8_MEMBER(a7800_state::a7800_cart_w) |
| 393 | 390 | { |
| 394 | | UINT8 *memory = memregion("maincpu")->base(); |
| 391 | UINT8 *memory = m_region_maincpu->base(); |
| 395 | 392 | |
| 396 | 393 | if(offset < 0x4000) |
| 397 | 394 | { |
| r20902 | r20903 | |
| 401 | 398 | } |
| 402 | 399 | else if(m_cart_type & 0x01) |
| 403 | 400 | { |
| 404 | | pokey_device *pokey = machine().device<pokey_device>("pokey"); |
| 405 | | pokey->write(space, offset, data); |
| 401 | m_pokey->write(space, offset, data); |
| 406 | 402 | } |
| 407 | 403 | else |
| 408 | 404 | { |
| r20902 | r20903 | |
| 421 | 417 | { |
| 422 | 418 | data &= 0x07; |
| 423 | 419 | } |
| 424 | | membank("bank2")->set_base(memory + 0x10000 + (data << 14)); |
| 425 | | membank("bank3")->set_base(memory + 0x12000 + (data << 14)); |
| 420 | m_bank2->set_base(memory + 0x10000 + (data << 14)); |
| 421 | m_bank3->set_base(memory + 0x12000 + (data << 14)); |
| 426 | 422 | /* logerror("BANK SEL: %d\n",data); */ |
| 427 | 423 | } |
| 428 | 424 | else if(( m_cart_type == MBANK_TYPE_ABSOLUTE ) &&( offset == 0x4000 ) ) |
| r20902 | r20903 | |
| 431 | 427 | /*logerror( "F18 BANK SEL: %d\n", data );*/ |
| 432 | 428 | if( data & 1 ) |
| 433 | 429 | { |
| 434 | | membank("bank1")->set_base(memory + 0x10000 ); |
| 430 | m_bank1->set_base(memory + 0x10000 ); |
| 435 | 431 | } |
| 436 | 432 | else if( data & 2 ) |
| 437 | 433 | { |
| 438 | | membank("bank1")->set_base(memory + 0x14000 ); |
| 434 | m_bank1->set_base(memory + 0x14000 ); |
| 439 | 435 | } |
| 440 | 436 | } |
| 441 | 437 | else if(( m_cart_type == MBANK_TYPE_ACTIVISION ) &&( offset >= 0xBF80 ) ) |
| r20902 | r20903 | |
| 445 | 441 | |
| 446 | 442 | /*logerror( "Activision BANK SEL: %d\n", data );*/ |
| 447 | 443 | |
| 448 | | membank("bank3")->set_base(memory + 0x10000 + ( data << 14 ) ); |
| 449 | | membank("bank4")->set_base(memory + 0x12000 + ( data << 14 ) ); |
| 444 | m_bank3->set_base(memory + 0x10000 + ( data << 14 ) ); |
| 445 | m_bank4->set_base(memory + 0x12000 + ( data << 14 ) ); |
| 450 | 446 | } |
| 451 | 447 | } |
| 452 | 448 | |
| r20902 | r20903 | |
| 471 | 467 | still return a reasonable value */ |
| 472 | 468 | return 0x00; |
| 473 | 469 | case 0x08: |
| 474 | | return((ioport("buttons")->read() & 0x02) << 6); |
| 470 | return((m_io_buttons->read() & 0x02) << 6); |
| 475 | 471 | case 0x09: |
| 476 | | return((ioport("buttons")->read() & 0x08) << 4); |
| 472 | return((m_io_buttons->read() & 0x08) << 4); |
| 477 | 473 | case 0x0A: |
| 478 | | return((ioport("buttons")->read() & 0x01) << 7); |
| 474 | return((m_io_buttons->read() & 0x01) << 7); |
| 479 | 475 | case 0x0B: |
| 480 | | return((ioport("buttons")->read() & 0x04) << 5); |
| 476 | return((m_io_buttons->read() & 0x04) << 5); |
| 481 | 477 | case 0x0c: |
| 482 | | if(((ioport("buttons")->read() & 0x08) ||(ioport("buttons")->read() & 0x02)) && m_p1_one_button) |
| 478 | if(((m_io_buttons->read() & 0x08) ||(m_io_buttons->read() & 0x02)) && m_p1_one_button) |
| 483 | 479 | return 0x00; |
| 484 | 480 | else |
| 485 | 481 | return 0x80; |
| 486 | 482 | case 0x0d: |
| 487 | | if(((ioport("buttons")->read() & 0x01) ||(ioport("buttons")->read() & 0x04)) && m_p2_one_button) |
| 483 | if(((m_io_buttons->read() & 0x01) ||(m_io_buttons->read() & 0x04)) && m_p2_one_button) |
| 488 | 484 | return 0x00; |
| 489 | 485 | else |
| 490 | 486 | return 0x80; |
| r20902 | r20903 | |
| 516 | 512 | } |
| 517 | 513 | break; |
| 518 | 514 | } |
| 519 | | machine().device<tia_device>("tia")->tia_sound_w(space, offset, data); |
| 515 | m_tia->tia_sound_w(space, offset, data); |
| 520 | 516 | m_ROM[offset] = data; |
| 521 | 517 | } |
trunk/src/mess/includes/a7800.h
| r20902 | r20903 | |
| 8 | 8 | #define A7800_H_ |
| 9 | 9 | |
| 10 | 10 | #include "machine/6532riot.h" |
| 11 | #include "sound/pokey.h" |
| 12 | #include "sound/tiasound.h" |
| 13 | #include "sound/tiaintf.h" |
| 11 | 14 | |
| 15 | |
| 12 | 16 | class a7800_state : public driver_device |
| 13 | 17 | { |
| 14 | 18 | public: |
| 15 | 19 | a7800_state(const machine_config &mconfig, device_type type, const char *tag) |
| 16 | | : driver_device(mconfig, type, tag), |
| 17 | | m_maincpu(*this,"maincpu") |
| 18 | | { } |
| 20 | : driver_device(mconfig, type, tag) |
| 21 | , m_maincpu(*this, "maincpu") |
| 22 | , m_pokey(*this, "pokey") |
| 23 | , m_tia(*this, "tia") |
| 24 | , m_region_maincpu(*this, "maincpu") |
| 25 | , m_bank1(*this, "bank1") |
| 26 | , m_bank2(*this, "bank2") |
| 27 | , m_bank3(*this, "bank3") |
| 28 | , m_bank4(*this, "bank4") |
| 29 | , m_bank5(*this, "bank5") |
| 30 | , m_bank6(*this, "bank6") |
| 31 | , m_bank7(*this, "bank7") |
| 32 | , m_io_joysticks(*this, "joysticks") |
| 33 | , m_io_buttons(*this, "buttons") |
| 34 | , m_io_vblank(*this, "vblank") |
| 35 | , m_io_console_buttons(*this, "console_buttons") |
| 36 | , m_bank10(NULL) |
| 37 | , m_bank11(NULL) |
| 38 | { } |
| 19 | 39 | |
| 20 | 40 | int m_lines; |
| 21 | 41 | int m_ispal; |
| r20902 | r20903 | |
| 52 | 72 | int m_p1_one_button; |
| 53 | 73 | int m_p2_one_button; |
| 54 | 74 | |
| 55 | | required_device<cpu_device> m_maincpu; |
| 56 | 75 | DECLARE_WRITE8_MEMBER(a7800_RAM0_w); |
| 57 | 76 | DECLARE_WRITE8_MEMBER(a7800_cart_w); |
| 58 | 77 | DECLARE_READ8_MEMBER(a7800_TIA_r); |
| r20902 | r20903 | |
| 73 | 92 | DECLARE_WRITE8_MEMBER(riot_button_pullup_w); |
| 74 | 93 | |
| 75 | 94 | DECLARE_DEVICE_IMAGE_LOAD_MEMBER( a7800_cart ); |
| 95 | |
| 96 | protected: |
| 97 | required_device<cpu_device> m_maincpu; |
| 98 | required_device<pokey_device> m_pokey; |
| 99 | required_device<tia_device> m_tia; |
| 100 | required_memory_region m_region_maincpu; |
| 101 | required_memory_bank m_bank1; |
| 102 | required_memory_bank m_bank2; |
| 103 | required_memory_bank m_bank3; |
| 104 | required_memory_bank m_bank4; |
| 105 | required_memory_bank m_bank5; |
| 106 | required_memory_bank m_bank6; |
| 107 | required_memory_bank m_bank7; |
| 108 | required_ioport m_io_joysticks; |
| 109 | required_ioport m_io_buttons; |
| 110 | required_ioport m_io_vblank; |
| 111 | required_ioport m_io_console_buttons; |
| 112 | memory_bank *m_bank10; |
| 113 | memory_bank *m_bank11; |
| 114 | |
| 115 | void maria_draw_scanline(); |
| 76 | 116 | }; |
| 77 | 117 | |
| 78 | 118 | /*----------- defined in machine/a7800.c -----------*/ |
trunk/src/mess/video/a7800.c
| r20902 | r20903 | |
| 83 | 83 | |
| 84 | 84 | ***************************************************************************/ |
| 85 | 85 | |
| 86 | | static void maria_draw_scanline(running_machine &machine) |
| 86 | void a7800_state::maria_draw_scanline() |
| 87 | 87 | { |
| 88 | | a7800_state *state = machine.driver_data<a7800_state>(); |
| 89 | | address_space& space = machine.device("maincpu")->memory().space(AS_PROGRAM); |
| 88 | address_space& space = m_maincpu->space(AS_PROGRAM); |
| 90 | 89 | unsigned int graph_adr,data_addr; |
| 91 | 90 | int width,hpos,pal,mode,ind; |
| 92 | 91 | unsigned int dl; |
| r20902 | r20903 | |
| 95 | 94 | UINT16 *scanline; |
| 96 | 95 | |
| 97 | 96 | /* set up scanline */ |
| 98 | | scanline = &state->m_bitmap.pix16(state->m_maria_scanline); |
| 97 | scanline = &m_bitmap.pix16(m_maria_scanline); |
| 99 | 98 | for (i = 0; i < 320; i++) |
| 100 | | scanline[i] = state->m_maria_backcolor; |
| 99 | scanline[i] = m_maria_backcolor; |
| 101 | 100 | |
| 102 | 101 | /* Process this DLL entry */ |
| 103 | | dl = state->m_maria_dl; |
| 102 | dl = m_maria_dl; |
| 104 | 103 | |
| 105 | 104 | /* Step through DL's */ |
| 106 | 105 | while ((READ_MEM(dl + 1) & 0x5F) != 0) |
| r20902 | r20903 | |
| 112 | 111 | width = ((READ_MEM(dl+3) ^ 0xff) & 0x1F) + 1; |
| 113 | 112 | hpos = READ_MEM(dl+4)*2; |
| 114 | 113 | pal = READ_MEM(dl+3) >> 5; |
| 115 | | state->m_maria_write_mode = (READ_MEM(dl+1) & 0x80) >> 5; |
| 114 | m_maria_write_mode = (READ_MEM(dl+1) & 0x80) >> 5; |
| 116 | 115 | ind = READ_MEM(dl+1) & 0x20; |
| 117 | 116 | dl+=5; |
| 118 | 117 | } |
| r20902 | r20903 | |
| 127 | 126 | dl+=4; |
| 128 | 127 | } |
| 129 | 128 | |
| 130 | | mode = state->m_maria_rm | state->m_maria_write_mode; |
| 129 | mode = m_maria_rm | m_maria_write_mode; |
| 131 | 130 | |
| 132 | | /*logerror("%x DL: ADR=%x width=%x hpos=%x pal=%x mode=%x ind=%x\n",state->m_maria_scanline,graph_adr,width,hpos,pal,mode,ind );*/ |
| 131 | /*logerror("%x DL: ADR=%x width=%x hpos=%x pal=%x mode=%x ind=%x\n",m_maria_scanline,graph_adr,width,hpos,pal,mode,ind );*/ |
| 133 | 132 | |
| 134 | 133 | for (x=0; x<width; x++) // 20030621 ericball get graphic data first, then switch (mode) |
| 135 | 134 | { |
| r20902 | r20903 | |
| 139 | 138 | if (ind) |
| 140 | 139 | { |
| 141 | 140 | c = READ_MEM(graph_adr + x) & 0xFF; |
| 142 | | data_addr= (state->m_maria_charbase | c) + (state->m_maria_offset << 8); |
| 143 | | if( state->m_maria_cwidth ) |
| 141 | data_addr= (m_maria_charbase | c) + (m_maria_offset << 8); |
| 142 | if( m_maria_cwidth ) |
| 144 | 143 | ind_bytes = 2; |
| 145 | 144 | } |
| 146 | 145 | else |
| 147 | 146 | { |
| 148 | | data_addr = graph_adr + x + (state->m_maria_offset << 8); |
| 147 | data_addr = graph_adr + x + (m_maria_offset << 8); |
| 149 | 148 | } |
| 150 | 149 | |
| 151 | | if ( (state->m_maria_holey & 0x02) && ((data_addr & 0x9000) == 0x9000)) |
| 150 | if ( (m_maria_holey & 0x02) && ((data_addr & 0x9000) == 0x9000)) |
| 152 | 151 | continue; |
| 153 | | if ( (state->m_maria_holey & 0x01) && ((data_addr & 0x8800) == 0x8800)) |
| 152 | if ( (m_maria_holey & 0x01) && ((data_addr & 0x8800) == 0x8800)) |
| 154 | 153 | continue; |
| 155 | 154 | |
| 156 | 155 | while (ind_bytes > 0) |
| r20902 | r20903 | |
| 163 | 162 | case 0x00: /* 160A (160x2) */ |
| 164 | 163 | case 0x01: /* 160A (160x2) */ |
| 165 | 164 | c = (d & 0xC0) >> 6; |
| 166 | | if (c || state->m_maria_kangaroo) |
| 165 | if (c || m_maria_kangaroo) |
| 167 | 166 | { |
| 168 | | scanline[hpos + 0] = state->m_maria_palette[pal][c]; |
| 169 | | scanline[hpos + 1] = state->m_maria_palette[pal][c]; |
| 167 | scanline[hpos + 0] = m_maria_palette[pal][c]; |
| 168 | scanline[hpos + 1] = m_maria_palette[pal][c]; |
| 170 | 169 | } |
| 171 | 170 | inc_hpos_by_2(); |
| 172 | 171 | |
| 173 | 172 | c = (d & 0x30) >> 4; |
| 174 | | if (c || state->m_maria_kangaroo) |
| 173 | if (c || m_maria_kangaroo) |
| 175 | 174 | { |
| 176 | | scanline[hpos + 0] = state->m_maria_palette[pal][c]; |
| 177 | | scanline[hpos + 1] = state->m_maria_palette[pal][c]; |
| 175 | scanline[hpos + 0] = m_maria_palette[pal][c]; |
| 176 | scanline[hpos + 1] = m_maria_palette[pal][c]; |
| 178 | 177 | } |
| 179 | 178 | inc_hpos_by_2(); |
| 180 | 179 | |
| 181 | 180 | c = (d & 0x0C) >> 2; |
| 182 | | if (c || state->m_maria_kangaroo) |
| 181 | if (c || m_maria_kangaroo) |
| 183 | 182 | { |
| 184 | | scanline[hpos + 0] = state->m_maria_palette[pal][c]; |
| 185 | | scanline[hpos + 1] = state->m_maria_palette[pal][c]; |
| 183 | scanline[hpos + 0] = m_maria_palette[pal][c]; |
| 184 | scanline[hpos + 1] = m_maria_palette[pal][c]; |
| 186 | 185 | } |
| 187 | 186 | inc_hpos_by_2(); |
| 188 | 187 | |
| 189 | 188 | c = (d & 0x03); |
| 190 | | if (c || state->m_maria_kangaroo) |
| 189 | if (c || m_maria_kangaroo) |
| 191 | 190 | { |
| 192 | | scanline[hpos + 0] = state->m_maria_palette[pal][c]; |
| 193 | | scanline[hpos + 1] = state->m_maria_palette[pal][c]; |
| 191 | scanline[hpos + 0] = m_maria_palette[pal][c]; |
| 192 | scanline[hpos + 1] = m_maria_palette[pal][c]; |
| 194 | 193 | } |
| 195 | 194 | inc_hpos_by_2(); |
| 196 | 195 | break; |
| 197 | 196 | |
| 198 | 197 | case 0x02: /* 320D used by Jinks! */ |
| 199 | 198 | c = pal & 0x04; |
| 200 | | if ( d & 0xC0 || pal & 0x03 || state->m_maria_kangaroo ) |
| 199 | if ( d & 0xC0 || pal & 0x03 || m_maria_kangaroo ) |
| 201 | 200 | { |
| 202 | | scanline[hpos + 0] = state->m_maria_palette[c][((d & 0x80) >> 6) | ((pal & 2) >> 1)]; |
| 203 | | scanline[hpos + 1] = state->m_maria_palette[c][((d & 0x40) >> 5) | ((pal & 1) >> 0)]; |
| 201 | scanline[hpos + 0] = m_maria_palette[c][((d & 0x80) >> 6) | ((pal & 2) >> 1)]; |
| 202 | scanline[hpos + 1] = m_maria_palette[c][((d & 0x40) >> 5) | ((pal & 1) >> 0)]; |
| 204 | 203 | } |
| 205 | 204 | inc_hpos_by_2(); |
| 206 | 205 | |
| 207 | | if ( d & 0x30 || pal & 0x03 || state->m_maria_kangaroo ) |
| 206 | if ( d & 0x30 || pal & 0x03 || m_maria_kangaroo ) |
| 208 | 207 | { |
| 209 | | scanline[hpos + 0] = state->m_maria_palette[c][((d & 0x20) >> 4) | ((pal & 2) >> 1)]; |
| 210 | | scanline[hpos + 1] = state->m_maria_palette[c][((d & 0x10) >> 3) | ((pal & 1) >> 0)]; |
| 208 | scanline[hpos + 0] = m_maria_palette[c][((d & 0x20) >> 4) | ((pal & 2) >> 1)]; |
| 209 | scanline[hpos + 1] = m_maria_palette[c][((d & 0x10) >> 3) | ((pal & 1) >> 0)]; |
| 211 | 210 | } |
| 212 | 211 | inc_hpos_by_2(); |
| 213 | 212 | |
| 214 | | if ( d & 0x0C || pal & 0x03 || state->m_maria_kangaroo ) |
| 213 | if ( d & 0x0C || pal & 0x03 || m_maria_kangaroo ) |
| 215 | 214 | { |
| 216 | | scanline[hpos + 0] = state->m_maria_palette[c][((d & 0x08) >> 2) | ((pal & 2) >> 1)]; |
| 217 | | scanline[hpos + 1] = state->m_maria_palette[c][((d & 0x04) >> 1) | ((pal & 1) >> 0)]; |
| 215 | scanline[hpos + 0] = m_maria_palette[c][((d & 0x08) >> 2) | ((pal & 2) >> 1)]; |
| 216 | scanline[hpos + 1] = m_maria_palette[c][((d & 0x04) >> 1) | ((pal & 1) >> 0)]; |
| 218 | 217 | } |
| 219 | 218 | inc_hpos_by_2(); |
| 220 | 219 | |
| 221 | | if ( d & 0x03 || pal & 0x03 || state->m_maria_kangaroo ) |
| 220 | if ( d & 0x03 || pal & 0x03 || m_maria_kangaroo ) |
| 222 | 221 | { |
| 223 | | scanline[hpos + 0] = state->m_maria_palette[c][((d & 0x02) << 0) | ((pal & 2) >> 1)]; |
| 224 | | scanline[hpos + 1] = state->m_maria_palette[c][((d & 0x01) << 1) | ((pal & 1) >> 0)]; |
| 222 | scanline[hpos + 0] = m_maria_palette[c][((d & 0x02) << 0) | ((pal & 2) >> 1)]; |
| 223 | scanline[hpos + 1] = m_maria_palette[c][((d & 0x01) << 1) | ((pal & 1) >> 0)]; |
| 225 | 224 | } |
| 226 | 225 | inc_hpos_by_2(); |
| 227 | 226 | |
| 228 | 227 | break; |
| 229 | 228 | |
| 230 | 229 | case 0x03: /* MODE 320A */ |
| 231 | | if (d & 0xC0 || state->m_maria_kangaroo) |
| 230 | if (d & 0xC0 || m_maria_kangaroo) |
| 232 | 231 | { |
| 233 | | scanline[hpos + 0] = state->m_maria_palette[pal][(d & 0x80) >> 6]; |
| 234 | | scanline[hpos + 1] = state->m_maria_palette[pal][(d & 0x40) >> 5]; |
| 232 | scanline[hpos + 0] = m_maria_palette[pal][(d & 0x80) >> 6]; |
| 233 | scanline[hpos + 1] = m_maria_palette[pal][(d & 0x40) >> 5]; |
| 235 | 234 | } |
| 236 | 235 | inc_hpos_by_2(); |
| 237 | 236 | |
| 238 | | if ( d & 0x30 || state->m_maria_kangaroo) |
| 237 | if ( d & 0x30 || m_maria_kangaroo) |
| 239 | 238 | { |
| 240 | | scanline[hpos + 0] = state->m_maria_palette[pal][(d & 0x20) >> 4]; |
| 241 | | scanline[hpos + 1] = state->m_maria_palette[pal][(d & 0x10) >> 3]; |
| 239 | scanline[hpos + 0] = m_maria_palette[pal][(d & 0x20) >> 4]; |
| 240 | scanline[hpos + 1] = m_maria_palette[pal][(d & 0x10) >> 3]; |
| 242 | 241 | } |
| 243 | 242 | inc_hpos_by_2(); |
| 244 | 243 | |
| 245 | | if (d & 0x0C || state->m_maria_kangaroo) |
| 244 | if (d & 0x0C || m_maria_kangaroo) |
| 246 | 245 | { |
| 247 | | scanline[hpos + 0] = state->m_maria_palette[pal][(d & 0x08) >> 2]; |
| 248 | | scanline[hpos + 1] = state->m_maria_palette[pal][(d & 0x04) >> 1]; |
| 246 | scanline[hpos + 0] = m_maria_palette[pal][(d & 0x08) >> 2]; |
| 247 | scanline[hpos + 1] = m_maria_palette[pal][(d & 0x04) >> 1]; |
| 249 | 248 | } |
| 250 | 249 | inc_hpos_by_2(); |
| 251 | 250 | |
| 252 | | if (d & 0x03 || state->m_maria_kangaroo) |
| 251 | if (d & 0x03 || m_maria_kangaroo) |
| 253 | 252 | { |
| 254 | | scanline[hpos + 0] = state->m_maria_palette[pal][(d & 0x02)]; |
| 255 | | scanline[hpos + 1] = state->m_maria_palette[pal][(d & 0x01) << 1]; |
| 253 | scanline[hpos + 0] = m_maria_palette[pal][(d & 0x02)]; |
| 254 | scanline[hpos + 1] = m_maria_palette[pal][(d & 0x01) << 1]; |
| 256 | 255 | } |
| 257 | 256 | inc_hpos_by_2(); |
| 258 | 257 | break; |
| r20902 | r20903 | |
| 260 | 259 | case 0x04: /* 160B (160x4) */ |
| 261 | 260 | case 0x05: /* 160B (160x4) */ |
| 262 | 261 | c = (d & 0xC0) >> 6; |
| 263 | | if (c || state->m_maria_kangaroo) |
| 262 | if (c || m_maria_kangaroo) |
| 264 | 263 | { |
| 265 | | scanline[hpos + 0] = state->m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][c]; |
| 266 | | scanline[hpos + 1] = state->m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][c]; |
| 264 | scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][c]; |
| 265 | scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][c]; |
| 267 | 266 | } |
| 268 | 267 | inc_hpos_by_2(); |
| 269 | 268 | |
| 270 | 269 | c = (d & 0x30) >> 4; |
| 271 | | if (c || state->m_maria_kangaroo) |
| 270 | if (c || m_maria_kangaroo) |
| 272 | 271 | { |
| 273 | | scanline[hpos + 0] = state->m_maria_palette[(pal & 0x04) | (d & 0x03)][c]; |
| 274 | | scanline[hpos + 1] = state->m_maria_palette[(pal & 0x04) | (d & 0x03)][c]; |
| 272 | scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | (d & 0x03)][c]; |
| 273 | scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | (d & 0x03)][c]; |
| 275 | 274 | } |
| 276 | 275 | inc_hpos_by_2(); |
| 277 | 276 | break; |
| 278 | 277 | |
| 279 | 278 | case 0x06: /* MODE 320B */ |
| 280 | | if (d & 0xCC || state->m_maria_kangaroo) |
| 279 | if (d & 0xCC || m_maria_kangaroo) |
| 281 | 280 | { |
| 282 | | scanline[hpos + 0] = state->m_maria_palette[pal][((d & 0x80) >> 6) | ((d & 0x08) >> 3)]; |
| 283 | | scanline[hpos + 1] = state->m_maria_palette[pal][((d & 0x40) >> 5) | ((d & 0x04) >> 2)]; |
| 281 | scanline[hpos + 0] = m_maria_palette[pal][((d & 0x80) >> 6) | ((d & 0x08) >> 3)]; |
| 282 | scanline[hpos + 1] = m_maria_palette[pal][((d & 0x40) >> 5) | ((d & 0x04) >> 2)]; |
| 284 | 283 | } |
| 285 | 284 | inc_hpos_by_2(); |
| 286 | 285 | |
| 287 | | if ( d & 0x33 || state->m_maria_kangaroo) |
| 286 | if ( d & 0x33 || m_maria_kangaroo) |
| 288 | 287 | { |
| 289 | | scanline[hpos + 0] = state->m_maria_palette[pal][((d & 0x20) >> 4) | ((d & 0x02) >> 1)]; |
| 290 | | scanline[hpos + 1] = state->m_maria_palette[pal][((d & 0x10) >> 3) | (d & 0x01)]; |
| 288 | scanline[hpos + 0] = m_maria_palette[pal][((d & 0x20) >> 4) | ((d & 0x02) >> 1)]; |
| 289 | scanline[hpos + 1] = m_maria_palette[pal][((d & 0x10) >> 3) | (d & 0x01)]; |
| 291 | 290 | } |
| 292 | 291 | inc_hpos_by_2(); |
| 293 | 292 | break; |
| 294 | 293 | |
| 295 | 294 | case 0x07: /* (320C mode) */ |
| 296 | | if (d & 0xC0 || state->m_maria_kangaroo) |
| 295 | if (d & 0xC0 || m_maria_kangaroo) |
| 297 | 296 | { |
| 298 | | scanline[hpos + 0] = state->m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][(d & 0x80) >> 6]; |
| 299 | | scanline[hpos + 1] = state->m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][(d & 0x40) >> 5]; |
| 297 | scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][(d & 0x80) >> 6]; |
| 298 | scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][(d & 0x40) >> 5]; |
| 300 | 299 | } |
| 301 | 300 | inc_hpos_by_2(); |
| 302 | 301 | |
| 303 | | if ( d & 0x30 || state->m_maria_kangaroo) |
| 302 | if ( d & 0x30 || m_maria_kangaroo) |
| 304 | 303 | { |
| 305 | | scanline[hpos + 0] = state->m_maria_palette[(pal & 0x04) | (d & 0x03)][(d & 0x20) >> 4]; |
| 306 | | scanline[hpos + 1] = state->m_maria_palette[(pal & 0x04) | (d & 0x03)][(d & 0x10) >> 3]; |
| 304 | scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | (d & 0x03)][(d & 0x20) >> 4]; |
| 305 | scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | (d & 0x03)][(d & 0x10) >> 3]; |
| 307 | 306 | } |
| 308 | 307 | inc_hpos_by_2(); |
| 309 | 308 | break; |
| r20902 | r20903 | |
| 318 | 317 | TIMER_DEVICE_CALLBACK_MEMBER(a7800_state::a7800_interrupt) |
| 319 | 318 | { |
| 320 | 319 | int frame_scanline; |
| 321 | | UINT8 *ROM = machine().root_device().memregion("maincpu")->base(); |
| 322 | | address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 320 | UINT8 *ROM = m_region_maincpu->base(); |
| 321 | address_space& space = m_maincpu->space(AS_PROGRAM); |
| 323 | 322 | |
| 324 | 323 | m_maria_scanline++; |
| 325 | 324 | |
| r20902 | r20903 | |
| 391 | 390 | if( ( frame_scanline > 15 ) && m_maria_dodma ) |
| 392 | 391 | { |
| 393 | 392 | if (m_maria_scanline < ( m_lines - 4 ) ) |
| 394 | | maria_draw_scanline(machine()); |
| 393 | maria_draw_scanline(); |
| 395 | 394 | |
| 396 | 395 | if( m_maria_offset == 0 ) |
| 397 | 396 | { |
| r20902 | r20903 | |
| 438 | 437 | |
| 439 | 438 | READ8_MEMBER(a7800_state::a7800_MARIA_r) |
| 440 | 439 | { |
| 441 | | UINT8 *ROM = memregion("maincpu")->base(); |
| 440 | UINT8 *ROM = m_region_maincpu->base(); |
| 442 | 441 | switch (offset) |
| 443 | 442 | { |
| 444 | 443 | case 0x08: |
| r20902 | r20903 | |
| 452 | 451 | |
| 453 | 452 | WRITE8_MEMBER(a7800_state::a7800_MARIA_w) |
| 454 | 453 | { |
| 455 | | UINT8 *ROM = memregion("maincpu")->base(); |
| 454 | UINT8 *ROM = m_region_maincpu->base(); |
| 456 | 455 | switch (offset) |
| 457 | 456 | { |
| 458 | 457 | case 0x00: |
| r20902 | r20903 | |
| 477 | 476 | m_maria_palette[0][3] = data; |
| 478 | 477 | break; |
| 479 | 478 | case 0x04: |
| 480 | | machine().device("maincpu")->execute().spin_until_trigger(TRIGGER_HSYNC); |
| 479 | m_maincpu->spin_until_trigger(TRIGGER_HSYNC); |
| 481 | 480 | m_maria_wsync=1; |
| 482 | 481 | break; |
| 483 | 482 | |