summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/supracan.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/drivers/supracan.c')
-rw-r--r--src/mess/drivers/supracan.c171
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 )