diff options
Diffstat (limited to 'src/mess/drivers/supracan.c')
-rw-r--r-- | src/mess/drivers/supracan.c | 171 |
1 files changed, 84 insertions, 87 deletions
diff --git a/src/mess/drivers/supracan.c b/src/mess/drivers/supracan.c index 4aeef158d22..3b64547d14f 100644 --- a/src/mess/drivers/supracan.c +++ b/src/mess/drivers/supracan.c @@ -78,8 +78,8 @@ DEBUG TRICKS: #include "emu.h" #include "cpu/m68000/m68000.h" #include "cpu/m6502/m6502.h" -#include "imagedev/cartslot.h" -//#include "debugger.h" +#include "bus/generic/slot.h" +#include "bus/generic/carts.h" #define SOUNDCPU_BOOT_HACK (1) @@ -119,6 +119,7 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), + m_cart(*this, "cartslot"), m_soundram(*this, "soundram"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette") @@ -128,22 +129,22 @@ public: required_device<cpu_device> m_maincpu; required_device<cpu_device> m_soundcpu; - DECLARE_READ16_MEMBER(supracan_68k_soundram_r); - DECLARE_WRITE16_MEMBER(supracan_68k_soundram_w); - DECLARE_READ8_MEMBER(supracan_6502_soundmem_r); - DECLARE_WRITE8_MEMBER(supracan_6502_soundmem_w); - - void supracan_dma_w(address_space &space, int offset, UINT16 data, UINT16 mem_mask, int ch); - WRITE16_MEMBER( supracan_dma_channel0_w ); - WRITE16_MEMBER( supracan_dma_channel1_w ); - - DECLARE_WRITE16_MEMBER(supracan_dma_w); - DECLARE_READ16_MEMBER(supracan_sound_r); - DECLARE_WRITE16_MEMBER(supracan_sound_w); - DECLARE_READ16_MEMBER(supracan_video_r); - DECLARE_WRITE16_MEMBER(supracan_video_w); - DECLARE_READ16_MEMBER(supracan_vram_r); - DECLARE_WRITE16_MEMBER(supracan_vram_w); + required_device<generic_slot_device> m_cart; + DECLARE_READ16_MEMBER(_68k_soundram_r); + DECLARE_WRITE16_MEMBER(_68k_soundram_w); + DECLARE_READ8_MEMBER(_6502_soundmem_r); + DECLARE_WRITE8_MEMBER(_6502_soundmem_w); + + void dma_w(address_space &space, int offset, UINT16 data, UINT16 mem_mask, int ch); + DECLARE_WRITE16_MEMBER(dma_channel0_w); + DECLARE_WRITE16_MEMBER(dma_channel1_w); + + DECLARE_READ16_MEMBER(sound_r); + DECLARE_WRITE16_MEMBER(sound_w); + DECLARE_READ16_MEMBER(video_r); + DECLARE_WRITE16_MEMBER(video_w); + DECLARE_READ16_MEMBER(vram_r); + DECLARE_WRITE16_MEMBER(vram_w); DECLARE_WRITE16_MEMBER(paletteram_w); acan_dma_regs_t m_acan_dma_regs; acan_sprdma_regs_t m_acan_sprdma_regs; @@ -997,7 +998,7 @@ UINT32 supracan_state::screen_update_supracan(screen_device &screen, bitmap_ind1 } -void supracan_state::supracan_dma_w(address_space &space, int offset, UINT16 data, UINT16 mem_mask, int ch) +void supracan_state::dma_w(address_space &space, int offset, UINT16 data, UINT16 mem_mask, int ch) { acan_dma_regs_t *acan_dma_regs = &m_acan_dma_regs; address_space &mem = m_maincpu->space(AS_PROGRAM); @@ -1005,36 +1006,36 @@ void supracan_state::supracan_dma_w(address_space &space, int offset, UINT16 dat switch(offset) { case 0x00/2: // Source address MSW - verboselog("maincpu", 0, "supracan_dma_w: source msw %d: %04x\n", ch, data); + verboselog("maincpu", 0, "dma_w: source msw %d: %04x\n", ch, data); acan_dma_regs->source[ch] &= 0x0000ffff; acan_dma_regs->source[ch] |= data << 16; break; case 0x02/2: // Source address LSW - verboselog("maincpu", 0, "supracan_dma_w: source lsw %d: %04x\n", ch, data); + verboselog("maincpu", 0, "dma_w: source lsw %d: %04x\n", ch, data); acan_dma_regs->source[ch] &= 0xffff0000; acan_dma_regs->source[ch] |= data; break; case 0x04/2: // Destination address MSW - verboselog("maincpu", 0, "supracan_dma_w: dest msw %d: %04x\n", ch, data); + verboselog("maincpu", 0, "dma_w: dest msw %d: %04x\n", ch, data); acan_dma_regs->dest[ch] &= 0x0000ffff; acan_dma_regs->dest[ch] |= data << 16; break; case 0x06/2: // Destination address LSW - verboselog("maincpu", 0, "supracan_dma_w: dest lsw %d: %04x\n", ch, data); + verboselog("maincpu", 0, "dma_w: dest lsw %d: %04x\n", ch, data); acan_dma_regs->dest[ch] &= 0xffff0000; acan_dma_regs->dest[ch] |= data; break; case 0x08/2: // Byte count - verboselog("maincpu", 0, "supracan_dma_w: count %d: %04x\n", ch, data); + verboselog("maincpu", 0, "dma_w: count %d: %04x\n", ch, data); acan_dma_regs->count[ch] = data; break; case 0x0a/2: // Control - verboselog("maincpu", 0, "supracan_dma_w: control %d: %04x\n", ch, data); + verboselog("maincpu", 0, "dma_w: control %d: %04x\n", ch, data); if(data & 0x8800) { // if(data & 0x2000) // acan_dma_regs->source-=2; - logerror("supracan_dma_w: Kicking off a DMA from %08x to %08x, %d bytes (%04x)\n", acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1, data); + logerror("dma_w: Kicking off a DMA from %08x to %08x, %d bytes (%04x)\n", acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1, data); for(int i = 0; i <= acan_dma_regs->count[ch]; i++) { @@ -1057,24 +1058,24 @@ void supracan_state::supracan_dma_w(address_space &space, int offset, UINT16 dat } else if(data != 0x0000) // fake DMA, used by C.U.G. { - verboselog("maincpu", 0, "supracan_dma_w: Unknown DMA kickoff value of %04x (other regs %08x, %08x, %d)\n", data, acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1); - fatalerror("supracan_dma_w: Unknown DMA kickoff value of %04x (other regs %08x, %08x, %d)\n",data, acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1); + verboselog("maincpu", 0, "dma_w: Unknown DMA kickoff value of %04x (other regs %08x, %08x, %d)\n", data, acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1); + fatalerror("dma_w: Unknown DMA kickoff value of %04x (other regs %08x, %08x, %d)\n",data, acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1); } break; default: - verboselog("maincpu", 0, "supracan_dma_w: Unknown register: %08x = %04x & %04x\n", 0xe90020 + (offset << 1), data, mem_mask); + verboselog("maincpu", 0, "dma_w: Unknown register: %08x = %04x & %04x\n", 0xe90020 + (offset << 1), data, mem_mask); break; } } -WRITE16_MEMBER( supracan_state::supracan_dma_channel0_w ) +WRITE16_MEMBER( supracan_state::dma_channel0_w ) { - supracan_dma_w(space,offset,data,mem_mask,0); + dma_w(space, offset, data, mem_mask, 0); } -WRITE16_MEMBER( supracan_state::supracan_dma_channel1_w ) +WRITE16_MEMBER( supracan_state::dma_channel1_w ) { - supracan_dma_w(space,offset,data,mem_mask,1); + dma_w(space, offset, data, mem_mask, 1); } @@ -1095,13 +1096,13 @@ void supracan_state::write_swapped_byte( int offset, UINT8 byte ) } -READ16_MEMBER( supracan_state::supracan_vram_r ) +READ16_MEMBER( supracan_state::vram_r ) { return m_vram[offset]; } -WRITE16_MEMBER( supracan_state::supracan_vram_w ) +WRITE16_MEMBER( supracan_state::vram_w ) { COMBINE_DATA(&m_vram[offset]); @@ -1124,23 +1125,23 @@ WRITE16_MEMBER( supracan_state::supracan_vram_w ) } static ADDRESS_MAP_START( supracan_mem, AS_PROGRAM, 16, supracan_state ) - AM_RANGE( 0x000000, 0x3fffff ) AM_ROM AM_REGION( "cart", 0 ) + //AM_RANGE( 0x000000, 0x3fffff ) // mapped by the cartslot AM_RANGE( 0xe80200, 0xe80201 ) AM_READ_PORT("P1") AM_RANGE( 0xe80202, 0xe80203 ) AM_READ_PORT("P2") AM_RANGE( 0xe80208, 0xe80209 ) AM_READ_PORT("P3") AM_RANGE( 0xe8020c, 0xe8020d ) AM_READ_PORT("P4") - AM_RANGE( 0xe80000, 0xe8ffff ) AM_READWRITE( supracan_68k_soundram_r, supracan_68k_soundram_w ) - AM_RANGE( 0xe90000, 0xe9001f ) AM_READWRITE( supracan_sound_r, supracan_sound_w ) - AM_RANGE( 0xe90020, 0xe9002f ) AM_WRITE( supracan_dma_channel0_w ) - AM_RANGE( 0xe90030, 0xe9003f ) AM_WRITE( supracan_dma_channel1_w ) + AM_RANGE( 0xe80000, 0xe8ffff ) AM_READWRITE(_68k_soundram_r, _68k_soundram_w) + AM_RANGE( 0xe90000, 0xe9001f ) AM_READWRITE(sound_r, sound_w) + AM_RANGE( 0xe90020, 0xe9002f ) AM_WRITE(dma_channel0_w) + AM_RANGE( 0xe90030, 0xe9003f ) AM_WRITE(dma_channel1_w) - AM_RANGE( 0xf00000, 0xf001ff ) AM_READWRITE( supracan_video_r, supracan_video_w ) + AM_RANGE( 0xf00000, 0xf001ff ) AM_READWRITE(video_r, video_w) AM_RANGE( 0xf00200, 0xf003ff ) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") - AM_RANGE( 0xf40000, 0xf5ffff ) AM_READWRITE(supracan_vram_r, supracan_vram_w) + AM_RANGE( 0xf40000, 0xf5ffff ) AM_READWRITE(vram_r, vram_w) AM_RANGE( 0xfc0000, 0xfdffff ) AM_MIRROR(0x30000) AM_RAM /* System work ram */ ADDRESS_MAP_END -READ8_MEMBER( supracan_state::supracan_6502_soundmem_r ) +READ8_MEMBER( supracan_state::_6502_soundmem_r ) { address_space &mem = m_maincpu->space(AS_PROGRAM); UINT8 data = m_soundram[offset]; @@ -1199,7 +1200,7 @@ READ8_MEMBER( supracan_state::supracan_6502_soundmem_r ) return data; } -WRITE8_MEMBER( supracan_state::supracan_6502_soundmem_w ) +WRITE8_MEMBER( supracan_state::_6502_soundmem_w ) { switch(offset) { @@ -1236,7 +1237,7 @@ WRITE8_MEMBER( supracan_state::supracan_6502_soundmem_w ) } static ADDRESS_MAP_START( supracan_sound_mem, AS_PROGRAM, 8, supracan_state ) - AM_RANGE( 0x0000, 0xffff ) AM_READWRITE(supracan_6502_soundmem_r, supracan_6502_soundmem_w) AM_SHARE("soundram") + AM_RANGE(0x0000, 0xffff) AM_READWRITE(_6502_soundmem_r, _6502_soundmem_w) AM_SHARE("soundram") ADDRESS_MAP_END static INPUT_PORTS_START( supracan ) @@ -1369,7 +1370,7 @@ PALETTE_INIT_MEMBER(supracan_state, supracan) //#endif } -WRITE16_MEMBER( supracan_state::supracan_68k_soundram_w ) +WRITE16_MEMBER( supracan_state::_68k_soundram_w ) { address_space &mem = m_maincpu->space(AS_PROGRAM); m_soundram[offset*2 + 1] = data & 0xff; @@ -1380,19 +1381,19 @@ WRITE16_MEMBER( supracan_state::supracan_68k_soundram_w ) if(mem_mask & 0xff00) { m_hack_68k_to_6502_access = true; - supracan_6502_soundmem_w(mem, offset*2, data >> 8); + _6502_soundmem_w(mem, offset*2, data >> 8); m_hack_68k_to_6502_access = false; } if(mem_mask & 0x00ff) { m_hack_68k_to_6502_access = true; - supracan_6502_soundmem_w(mem, offset*2 + 1, data & 0xff); + _6502_soundmem_w(mem, offset*2 + 1, data & 0xff); m_hack_68k_to_6502_access = false; } } } -READ16_MEMBER( supracan_state::supracan_68k_soundram_r ) +READ16_MEMBER( supracan_state::_68k_soundram_r ) { address_space &mem = m_maincpu->space(AS_PROGRAM); UINT16 val = m_soundram[offset*2 + 0] << 8; @@ -1404,13 +1405,13 @@ READ16_MEMBER( supracan_state::supracan_68k_soundram_r ) if(mem_mask & 0xff00) { m_hack_68k_to_6502_access = true; - val |= supracan_6502_soundmem_r(mem, offset*2) << 8; + val |= _6502_soundmem_r(mem, offset*2) << 8; m_hack_68k_to_6502_access = false; } if(mem_mask & 0x00ff) { m_hack_68k_to_6502_access = true; - val |= supracan_6502_soundmem_r(mem, offset*2 + 1); + val |= _6502_soundmem_r(mem, offset*2 + 1); m_hack_68k_to_6502_access = false; } } @@ -1418,21 +1419,21 @@ READ16_MEMBER( supracan_state::supracan_68k_soundram_r ) return val; } -READ16_MEMBER( supracan_state::supracan_sound_r ) +READ16_MEMBER( supracan_state::sound_r ) { UINT16 data = 0; switch( offset ) { default: - verboselog("maincpu", 0, "supracan_sound_r: Unknown register: (%08x) & %04x\n", 0xe90000 + (offset << 1), mem_mask); + verboselog("maincpu", 0, "sound_r: Unknown register: (%08x) & %04x\n", 0xe90000 + (offset << 1), mem_mask); break; } return data; } -WRITE16_MEMBER( supracan_state::supracan_sound_w ) +WRITE16_MEMBER( supracan_state::sound_w ) { switch ( offset ) { @@ -1460,13 +1461,13 @@ WRITE16_MEMBER( supracan_state::supracan_sound_w ) verboselog("maincpu", 0, "sound cpu ctrl: %04x\n", data); break; default: - verboselog("maincpu", 0, "supracan_sound_w: Unknown register: %08x = %04x & %04x\n", 0xe90000 + (offset << 1), data, mem_mask); + verboselog("maincpu", 0, "sound_w: Unknown register: %08x = %04x & %04x\n", 0xe90000 + (offset << 1), data, mem_mask); break; } } -READ16_MEMBER( supracan_state::supracan_video_r ) +READ16_MEMBER( supracan_state::video_r ) { address_space &mem = m_maincpu->space(AS_PROGRAM); UINT16 data = m_video_regs[offset]; @@ -1495,7 +1496,7 @@ READ16_MEMBER( supracan_state::supracan_video_r ) if(!mem.debugger_access()) verboselog("maincpu", 0, "read tilemap_flags[1] (%04x)\n", data); break; default: - if(!mem.debugger_access()) verboselog("maincpu", 0, "supracan_video_r: Unknown register: %08x (%04x & %04x)\n", 0xf00000 + (offset << 1), data, mem_mask); + if(!mem.debugger_access()) verboselog("maincpu", 0, "video_r: Unknown register: %08x (%04x & %04x)\n", 0xf00000 + (offset << 1), data, mem_mask); break; } @@ -1562,7 +1563,7 @@ TIMER_CALLBACK_MEMBER(supracan_state::supracan_video_callback) m_video_timer->adjust( machine().first_screen()->time_until_pos( ( vpos + 1 ) % 256, 0 ) ); } -WRITE16_MEMBER( supracan_state::supracan_video_w ) +WRITE16_MEMBER( supracan_state::video_w ) { address_space &mem = m_maincpu->space(AS_PROGRAM); acan_sprdma_regs_t *acan_sprdma_regs = &m_acan_sprdma_regs; @@ -1609,7 +1610,7 @@ WRITE16_MEMBER( supracan_state::supracan_video_w ) acan_sprdma_regs->src_inc = data; break; case 0x1e/2: - logerror( "supracan_video_w: Kicking off a DMA from %08x to %08x, %d bytes (%04x)\n", acan_sprdma_regs->src, acan_sprdma_regs->dst, acan_sprdma_regs->count, data); + logerror( "video_w: Kicking off a DMA from %08x to %08x, %d bytes (%04x)\n", acan_sprdma_regs->src, acan_sprdma_regs->dst, acan_sprdma_regs->count, data); /* TODO: what's 0x2000 and 0x4000 for? */ if(data & 0x8000) @@ -1642,7 +1643,7 @@ WRITE16_MEMBER( supracan_state::supracan_video_w ) } else { - verboselog("maincpu", 0, "supracan_dma_w: Attempting to kick off a DMA without bit 15 set! (%04x)\n", data); + verboselog("maincpu", 0, "dma_w: Attempting to kick off a DMA without bit 15 set! (%04x)\n", data); } break; case 0x08/2: @@ -1743,7 +1744,7 @@ WRITE16_MEMBER( supracan_state::supracan_video_w ) verboselog("maincpu", 3, "irq_mask = %04x\n", data); break; default: - verboselog("maincpu", 0, "supracan_video_w: Unknown register: %08x = %04x & %04x\n", 0xf00000 + (offset << 1), data, mem_mask); + verboselog("maincpu", 0, "video_w: Unknown register: %08x = %04x & %04x\n", 0xf00000 + (offset << 1), data, mem_mask); break; } // m_video_regs[offset] = data; @@ -1752,31 +1753,28 @@ WRITE16_MEMBER( supracan_state::supracan_video_w ) DEVICE_IMAGE_LOAD_MEMBER( supracan_state, supracan_cart ) { - UINT8 *cart = memregion("cart")->base(); - UINT32 size = 0; - + UINT8 *cart; + UINT32 size; + if (image.software_entry() == NULL) - { size = image.length(); - - if (size > 0x400000) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size"); - return IMAGE_INIT_FAIL; - } - - if (image.fread(cart, size) != size) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read from file"); - return IMAGE_INIT_FAIL; - } - } else - { size = image.get_software_region_length("rom"); - memcpy(cart, image.get_software_region("rom"), size); + + if (size > 0x400000) + { + image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size"); + return IMAGE_INIT_FAIL; } - + + m_cart->rom_alloc(size, 1); + cart = m_cart->get_rom_base(); + + if (image.software_entry() == NULL) + image.fread(cart, size); + else + memcpy(cart, image.get_software_region("rom"), size); + return IMAGE_INIT_PASS; } @@ -1787,6 +1785,9 @@ void supracan_state::machine_start() m_hbl_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(supracan_state::supracan_hbl_callback),this)); m_line_on_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(supracan_state::supracan_line_on_callback),this)); m_line_off_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(supracan_state::supracan_line_off_callback),this)); + + if (m_cart->cart_mounted()) + m_maincpu->space(AS_PROGRAM).install_read_handler(0x000000, 0x3fffff, read16_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart)); } @@ -1920,7 +1921,6 @@ static MACHINE_CONFIG_START( supracan, supracan_state ) MCFG_QUANTUM_PERFECT_CPU("soundcpu") #endif - MCFG_SCREEN_ADD( "screen", RASTER ) MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, 348, 0, 256, 256, 0, 240 ) /* No idea if this is correct */ MCFG_SCREEN_UPDATE_DRIVER(supracan_state, screen_update_supracan) @@ -1932,17 +1932,14 @@ static MACHINE_CONFIG_START( supracan, supracan_state ) MCFG_GFXDECODE_ADD("gfxdecode", "palette", supracan) - MCFG_CARTSLOT_ADD("cart") - MCFG_CARTSLOT_EXTENSION_LIST("bin") - MCFG_CARTSLOT_INTERFACE("supracan_cart") - MCFG_CARTSLOT_LOAD(supracan_state,supracan_cart) + MCFG_GENERIC_CARTSLOT_ADD("cartslot", GENERIC_ROM16_WIDTH, generic_plain_slot, "supracan_cart") + MCFG_GENERIC_LOAD(supracan_state, supracan_cart) MCFG_SOFTWARE_LIST_ADD("cart_list","supracan") MACHINE_CONFIG_END ROM_START( supracan ) - ROM_REGION( 0x400000, "cart", ROMREGION_ERASEFF ) ROM_REGION( 0x20000, "ram_gfx", ROMREGION_ERASEFF ) ROM_REGION( 0x20000, "ram_gfx2", ROMREGION_ERASEFF ) ROM_REGION( 0x20000, "ram_gfx3", ROMREGION_ERASEFF ) |