summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/scv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/drivers/scv.c')
-rw-r--r--src/mess/drivers/scv.c267
1 files changed, 49 insertions, 218 deletions
diff --git a/src/mess/drivers/scv.c b/src/mess/drivers/scv.c
index fe642456746..9ee007a2550 100644
--- a/src/mess/drivers/scv.c
+++ b/src/mess/drivers/scv.c
@@ -2,13 +2,13 @@
Driver for Epoch Super Cassette Vision
-
***************************************************************************/
#include "emu.h"
#include "cpu/upd7810/upd7810.h"
-#include "imagedev/cartslot.h"
#include "audio/upd1771.h"
+#include "bus/scv/slot.h"
+#include "bus/scv/rom.h"
class scv_state : public driver_device
@@ -17,41 +17,26 @@ public:
scv_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_videoram(*this,"videoram"),
- m_cart_rom_size(0),
- m_cart_ram(NULL),
- m_cart_ram_size(0),
m_maincpu(*this, "maincpu"),
m_upd1771c(*this, "upd1771c"),
+ m_cart(*this, "cartslot"),
+ m_pa(*this, "PA"),
m_pc0(*this, "PC0"),
- m_bank0(*this, "bank0"),
- m_bank1(*this, "bank1"),
- m_bank2(*this, "bank2"),
- m_bank3(*this, "bank3"),
- m_bank4(*this, "bank4"),
m_charrom(*this, "charrom") { }
- DECLARE_WRITE8_MEMBER(scv_porta_w);
- DECLARE_READ8_MEMBER(scv_portb_r);
- DECLARE_READ8_MEMBER(scv_portc_r);
- DECLARE_WRITE8_MEMBER(scv_portc_w);
- DECLARE_WRITE8_MEMBER(scv_cart_ram_w);
- DECLARE_WRITE8_MEMBER(scv_cart_ram2_w);
- DECLARE_WRITE_LINE_MEMBER(scv_upd1771_ack_w);
+ DECLARE_WRITE8_MEMBER(porta_w);
+ DECLARE_READ8_MEMBER(portb_r);
+ DECLARE_READ8_MEMBER(portc_r);
+ DECLARE_WRITE8_MEMBER(portc_w);
+ DECLARE_WRITE_LINE_MEMBER(upd1771_ack_w);
required_shared_ptr<UINT8> m_videoram;
UINT8 m_porta;
UINT8 m_portc;
emu_timer *m_vb_timer;
- UINT8 *m_cart_rom;
- UINT32 m_cart_rom_size;
- UINT8 *m_cart_ram;
- UINT32 m_cart_ram_size;
- bool m_cart_ram_enabled;
virtual void machine_start();
virtual void machine_reset();
DECLARE_PALETTE_INIT(scv);
- void scv_postload();
UINT32 screen_update_scv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER( scv_cart );
protected:
enum
@@ -61,12 +46,9 @@ protected:
required_device<cpu_device> m_maincpu;
required_device<upd1771c_device> m_upd1771c;
+ required_device<scv_cart_slot_device> m_cart;
+ required_ioport_array<8> m_pa;
required_ioport m_pc0;
- required_memory_bank m_bank0;
- required_memory_bank m_bank1;
- required_memory_bank m_bank2;
- required_memory_bank m_bank3;
- required_memory_bank m_bank4;
required_memory_region m_charrom;
ioport_port *m_key[8];
@@ -82,30 +64,25 @@ protected:
static ADDRESS_MAP_START( scv_mem, AS_PROGRAM, 8, scv_state )
- AM_RANGE( 0x0000, 0x0fff ) AM_ROM /* BIOS */
-
- AM_RANGE( 0x2000, 0x3403 ) AM_RAM AM_SHARE("videoram") /* VRAM + 4 registers */
+ AM_RANGE( 0x0000, 0x0fff ) AM_ROM // BIOS
+ AM_RANGE( 0x2000, 0x3403 ) AM_RAM AM_SHARE("videoram") // VRAM + 4 registers
AM_RANGE( 0x3600, 0x3600 ) AM_DEVWRITE("upd1771c", upd1771c_device, write)
- AM_RANGE( 0x8000, 0x9fff ) AM_ROMBANK("bank0")
- AM_RANGE( 0xa000, 0xbfff ) AM_ROMBANK("bank1")
- AM_RANGE( 0xc000, 0xdfff ) AM_ROMBANK("bank2")
- AM_RANGE( 0xe000, 0xefff ) AM_READ_BANK("bank3") AM_WRITE( scv_cart_ram_w )
- AM_RANGE( 0xf000, 0xff7f ) AM_READ_BANK("bank4") AM_WRITE( scv_cart_ram2_w )
- AM_RANGE( 0xff80, 0xffff ) AM_RAM /* upd7801 internal RAM */
+ AM_RANGE( 0x8000, 0xff7f ) AM_DEVREADWRITE("cartslot", scv_cart_slot_device, read_cart, write_cart) // cartridge
+ AM_RANGE( 0xff80, 0xffff ) AM_RAM // upd7801 internal RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( scv_io, AS_IO, 8, scv_state )
- AM_RANGE( 0x00, 0x00 ) AM_WRITE( scv_porta_w )
- AM_RANGE( 0x01, 0x01 ) AM_READ( scv_portb_r )
- AM_RANGE( 0x02, 0x02 ) AM_READWRITE( scv_portc_r, scv_portc_w )
+ AM_RANGE( 0x00, 0x00 ) AM_WRITE(porta_w)
+ AM_RANGE( 0x01, 0x01 ) AM_READ(portb_r)
+ AM_RANGE( 0x02, 0x02 ) AM_READWRITE(portc_r, portc_w)
ADDRESS_MAP_END
static INPUT_PORTS_START( scv )
- PORT_START( "PA0" )
+ PORT_START( "PA.0" )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
@@ -115,7 +92,7 @@ static INPUT_PORTS_START( scv )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_START( "PA1" )
+ PORT_START( "PA.1" )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
@@ -125,7 +102,7 @@ static INPUT_PORTS_START( scv )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_START( "PA2" )
+ PORT_START( "PA.2" )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -135,7 +112,7 @@ static INPUT_PORTS_START( scv )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("0") PORT_CODE(KEYCODE_0_PAD)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("1") PORT_CODE(KEYCODE_1_PAD)
- PORT_START( "PA3" )
+ PORT_START( "PA.3" )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -145,7 +122,7 @@ static INPUT_PORTS_START( scv )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("2") PORT_CODE(KEYCODE_2_PAD)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("3") PORT_CODE(KEYCODE_3_PAD)
- PORT_START( "PA4" )
+ PORT_START( "PA.4" )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -155,7 +132,7 @@ static INPUT_PORTS_START( scv )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("4") PORT_CODE(KEYCODE_4_PAD)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("5") PORT_CODE(KEYCODE_5_PAD)
- PORT_START( "PA5" )
+ PORT_START( "PA.5" )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -165,7 +142,7 @@ static INPUT_PORTS_START( scv )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("6") PORT_CODE(KEYCODE_6_PAD)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("7") PORT_CODE(KEYCODE_7_PAD)
- PORT_START( "PA6" )
+ PORT_START( "PA.6" )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -175,7 +152,7 @@ static INPUT_PORTS_START( scv )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("8") PORT_CODE(KEYCODE_8_PAD)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("9") PORT_CODE(KEYCODE_9_PAD)
- PORT_START( "PA7" )
+ PORT_START( "PA.7" )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -190,52 +167,27 @@ static INPUT_PORTS_START( scv )
INPUT_PORTS_END
-WRITE8_MEMBER( scv_state::scv_cart_ram_w )
-{
- /* Check if cartridge ram is enabled */
- if ( m_cart_ram_enabled )
- {
- m_cart_ram[offset] = data;
- }
-}
-
-
-WRITE8_MEMBER( scv_state::scv_cart_ram2_w )
-{
- /* Check if cartridge ram is enabled */
- if ( m_cart_ram_enabled )
- {
- if ( m_cart_ram_size > 0x1000 )
- {
- offset += 0x1000;
- }
-
- m_cart_ram[offset] = data;
- }
-}
-
-
-WRITE8_MEMBER( scv_state::scv_porta_w )
+WRITE8_MEMBER( scv_state::porta_w )
{
m_porta = data;
}
-READ8_MEMBER( scv_state::scv_portb_r )
+READ8_MEMBER( scv_state::portb_r )
{
UINT8 data = 0xff;
for (int i = 0; i < 8; i++)
{
if (!BIT(m_porta, i))
- data &= m_key[i]->read();
+ data &= m_pa[i]->read();
}
return data;
}
-READ8_MEMBER( scv_state::scv_portc_r )
+READ8_MEMBER( scv_state::portc_r )
{
UINT8 data = m_portc;
@@ -245,123 +197,15 @@ READ8_MEMBER( scv_state::scv_portc_r )
}
-void scv_state::scv_set_banks()
-{
- m_cart_ram_enabled = false;
-
- switch( m_cart_rom_size )
- {
- case 0:
- case 0x2000:
- m_bank0->set_base( m_cart_rom );
- m_bank1->set_base( m_cart_rom );
- m_bank2->set_base( m_cart_rom );
- m_bank3->set_base( m_cart_rom );
- m_bank4->set_base( m_cart_rom + 0x1000 );
- break;
- case 0x4000:
- m_bank0->set_base( m_cart_rom );
- m_bank1->set_base( m_cart_rom + 0x2000 );
- m_bank2->set_base( m_cart_rom );
- m_bank3->set_base( m_cart_rom + 0x2000 );
- m_bank4->set_base( m_cart_rom + 0x3000 );
- break;
- case 0x8000:
- m_bank0->set_base( m_cart_rom );
- m_bank1->set_base( m_cart_rom + 0x2000 );
- m_bank2->set_base( m_cart_rom + 0x4000 );
- m_bank3->set_base( m_cart_rom + 0x6000 );
- m_bank4->set_base( m_cart_rom + 0x7000 );
- break;
- case 0x10000:
- m_bank0->set_base( m_cart_rom + ( ( m_portc & 0x20 ) ? 0x8000 : 0 ) );
- m_bank1->set_base( m_cart_rom + ( ( m_portc & 0x20 ) ? 0xa000 : 0x2000 ) );
- m_bank2->set_base( m_cart_rom + ( ( m_portc & 0x20 ) ? 0xc000 : 0x4000 ) );
- m_bank3->set_base( m_cart_rom + ( ( m_portc & 0x20 ) ? 0xe000 : 0x6000 ) );
- m_bank4->set_base( m_cart_rom + ( ( m_portc & 0x20 ) ? 0xf000 : 0x7000 ) );
- break;
- case 0x20000: /* Pole Position 2 */
- int base = ( ( m_portc >> 5 ) & 0x03 ) * 0x8000 ;
- m_bank0->set_base( m_cart_rom + base + 0 );
- m_bank1->set_base( m_cart_rom + base + 0x2000 );
- m_bank2->set_base( m_cart_rom + base + 0x4000 );
- m_bank3->set_base( m_cart_rom + base + 0x6000 );
- m_bank4->set_base( m_cart_rom + base + 0x7000 );
- /* On-cart RAM is enabled when PC6 is high */
- if ( m_cart_ram && m_portc & 0x40 )
- {
- m_cart_ram_enabled = true;
- m_bank4->set_base( m_cart_ram );
- }
- break;
- }
-
- /* Check if cartridge RAM is available and should be enabled */
- if ( m_cart_rom_size < 0x20000 && m_cart_ram && m_cart_ram_size && ( m_portc & 0x20 ) )
- {
- if ( m_cart_ram_size == 0x1000 )
- {
- m_bank4->set_base( m_cart_ram );
- }
- else
- {
- m_bank3->set_base( m_cart_ram );
- m_bank4->set_base( m_cart_ram + 0x1000 );
- }
- m_cart_ram_enabled = true;
- }
-
-}
-
-
-WRITE8_MEMBER( scv_state::scv_portc_w )
+WRITE8_MEMBER( scv_state::portc_w )
{
//logerror("%04x: scv_portc_w: data = 0x%02x\n", m_maincpu->pc(), data );
m_portc = data;
-
- scv_set_banks();
+ m_cart->write_bank(space, 0, m_portc);
m_upd1771c->pcm_write(m_portc & 0x08);
}
-DEVICE_IMAGE_LOAD_MEMBER( scv_state, scv_cart )
-{
- UINT8 *cart = memregion( "cart" )->base();
-
- if ( image.software_entry() == NULL )
- {
- int size = image.length();
-
- if ( size > memregion( "cart" )->bytes() )
- {
- 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;
- }
-
- m_cart_rom_size = size;
- }
- else
- {
- m_cart_rom_size = image.get_software_region_length( "rom" );
- memcpy( cart, image.get_software_region( "rom" ), m_cart_rom_size );
- m_cart_ram_size = image.get_software_region_length( "ram" );
- if ( m_cart_ram_size > 0 )
- {
- m_cart_ram = auto_alloc_array_clear( machine(), UINT8, m_cart_ram_size );
- save_pointer(NAME(m_cart_ram), m_cart_ram_size);
- }
- }
-
- return IMAGE_INIT_PASS;
-}
-
-
PALETTE_INIT_MEMBER(scv_state, scv)
{
/*
@@ -758,41 +602,26 @@ UINT32 scv_state::screen_update_scv(screen_device &screen, bitmap_ind16 &bitmap,
}
-WRITE_LINE_MEMBER( scv_state::scv_upd1771_ack_w )
+WRITE_LINE_MEMBER( scv_state::upd1771_ack_w )
{
m_maincpu->set_input_line(UPD7810_INTF1, (state) ? ASSERT_LINE : CLEAR_LINE);
}
-void scv_state::scv_postload()
-{
- scv_set_banks();
-}
-
-
void scv_state::machine_start()
{
- m_cart_rom = memregion( "cart" )->base();
m_vb_timer = timer_alloc(TIMER_VB);
- for (int i = 0; i < 8; i++)
- {
- char str[4];
- sprintf(str, "PA%i", i);
- m_key[i] = ioport(str);
- }
-
save_item(NAME(m_porta));
save_item(NAME(m_portc));
- save_item(NAME(m_cart_ram_enabled));
+ if (m_cart->exists())
+ m_cart->save_ram();
- machine().save().register_postload(save_prepost_delegate(FUNC(scv_state::scv_postload), this));
}
void scv_state::machine_reset()
{
m_vb_timer->adjust(machine().first_screen()->time_until_pos(0, 0));
- scv_set_banks();
}
@@ -815,13 +644,22 @@ static GFXDECODE_START( scv )
GFXDECODE_END
+static SLOT_INTERFACE_START(scv_cart)
+ SLOT_INTERFACE_INTERNAL("rom8k", SCV_ROM8K)
+ SLOT_INTERFACE_INTERNAL("rom16k", SCV_ROM16K)
+ SLOT_INTERFACE_INTERNAL("rom32k", SCV_ROM32K)
+ SLOT_INTERFACE_INTERNAL("rom32k_ram", SCV_ROM32K_RAM8K)
+ SLOT_INTERFACE_INTERNAL("rom64k", SCV_ROM64K)
+ SLOT_INTERFACE_INTERNAL("rom128k", SCV_ROM128K)
+ SLOT_INTERFACE_INTERNAL("rom128k_ram", SCV_ROM128K_RAM4K)
+SLOT_INTERFACE_END
+
static MACHINE_CONFIG_START( scv, scv_state )
MCFG_CPU_ADD( "maincpu", UPD7801, XTAL_4MHz )
MCFG_CPU_PROGRAM_MAP( scv_mem )
MCFG_CPU_IO_MAP( scv_io )
-
/* Video chip is EPOCH TV-1 */
MCFG_SCREEN_ADD( "screen", RASTER )
MCFG_SCREEN_RAW_PARAMS( XTAL_14_31818MHz/2, 456, 24, 24+192, 262, 23, 23+222 ) /* TODO: Verify */
@@ -835,14 +673,10 @@ static MACHINE_CONFIG_START( scv, scv_state )
/* Sound is generated by UPD1771C clocked at XTAL_6MHz */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD( "upd1771c", UPD1771C, XTAL_6MHz )
- MCFG_UPD1771_ACK_HANDLER(WRITELINE(scv_state, scv_upd1771_ack_w))
+ MCFG_UPD1771_ACK_HANDLER(WRITELINE(scv_state, upd1771_ack_w))
MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 )
- MCFG_CARTSLOT_ADD( "cart" )
- MCFG_CARTSLOT_EXTENSION_LIST( "bin" )
- MCFG_CARTSLOT_NOT_MANDATORY
- MCFG_CARTSLOT_INTERFACE("scv_cart")
- MCFG_CARTSLOT_LOAD( scv_state, scv_cart )
+ MCFG_SCV_CARTRIDGE_ADD("cartslot", scv_cart, NULL)
/* Software lists */
MCFG_SOFTWARE_LIST_ADD("cart_list","scv")
@@ -850,7 +684,6 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( scv_pal, scv )
-
MCFG_CPU_MODIFY( "maincpu" )
MCFG_CPU_CLOCK( 3780000 )
@@ -864,20 +697,18 @@ MACHINE_CONFIG_END
ROM_START( scv )
ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD( "upd7801g.s01", 0, 0x1000, CRC(7ac06182) SHA1(6e89d1227581c76441a53d605f9e324185f1da33) )
+
ROM_REGION( 0x400, "charrom", 0 )
ROM_LOAD( "epochtv.chr", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509) )
-
- ROM_REGION( 0x20000, "cart", ROMREGION_ERASEFF )
ROM_END
ROM_START( scv_pal )
ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD( "upd7801g.s01", 0, 0x1000, CRC(7ac06182) SHA1(6e89d1227581c76441a53d605f9e324185f1da33) )
+
ROM_REGION( 0x400, "charrom", 0 )
ROM_LOAD( "epochtv.chr", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509) )
-
- ROM_REGION( 0x20000, "cart", ROMREGION_ERASEFF )
ROM_END