mirror of
https://github.com/holub/mame
synced 2025-04-25 17:56:43 +03:00
(MESS) svi318.c: cleaned up the driver and added support for save states. [Fabio Priuli]
This commit is contained in:
parent
5604baac70
commit
6fe528885e
@ -266,9 +266,6 @@ static MACHINE_CONFIG_START( svi318, svi318_state )
|
||||
MCFG_CPU_IO_MAP(svi318_io)
|
||||
MCFG_QUANTUM_TIME(attotime::from_hz(60))
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_pal)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(svi318_state, svi318)
|
||||
|
||||
MCFG_DEVICE_ADD("ppi8255", I8255, 0)
|
||||
MCFG_I8255_IN_PORTA_CB(READ8(svi318_state, ppi_port_a_r))
|
||||
MCFG_I8255_IN_PORTB_CB(READ8(svi318_state, ppi_port_b_r))
|
||||
@ -336,9 +333,6 @@ static MACHINE_CONFIG_DERIVED( svi318n, svi318 )
|
||||
MCFG_TMS9928A_OUT_INT_LINE_CB(WRITELINE(svi318_state, vdp_interrupt))
|
||||
MCFG_TMS9928A_SCREEN_ADD_NTSC("screen")
|
||||
MCFG_SCREEN_UPDATE_DEVICE("tms9928a", tms9928a_device, screen_update)
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_ntsc)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(svi318_state, svi318)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( svi328, svi318 )
|
||||
@ -383,9 +377,6 @@ static MACHINE_CONFIG_START( svi328_806, svi318_state )
|
||||
MCFG_CPU_IO_MAP(svi328_806_io)
|
||||
MCFG_QUANTUM_TIME(attotime::from_hz(60))
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_pal)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(svi318_state, svi328_806)
|
||||
|
||||
MCFG_DEVICE_ADD("ppi8255", I8255, 0)
|
||||
MCFG_I8255_IN_PORTA_CB(READ8(svi318_state, ppi_port_a_r))
|
||||
MCFG_I8255_IN_PORTB_CB(READ8(svi318_state, ppi_port_b_r))
|
||||
@ -421,8 +412,6 @@ static MACHINE_CONFIG_START( svi328_806, svi318_state )
|
||||
MCFG_MC6845_CHAR_WIDTH(8) /* ? */
|
||||
MCFG_MC6845_UPDATE_ROW_CB(svi318_state, crtc_update_row)
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(svi318_state, svi328_806)
|
||||
|
||||
/* Sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
MCFG_SOUND_ADD("dac", DAC, 0)
|
||||
@ -452,6 +441,10 @@ static MACHINE_CONFIG_START( svi328_806, svi318_state )
|
||||
|
||||
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(svi318_floppy_interface)
|
||||
|
||||
/* Software lists */
|
||||
MCFG_SOFTWARE_LIST_ADD("cass_list", "svi318_flop")
|
||||
MCFG_SOFTWARE_LIST_ADD("disk_list", "svi318_cass")
|
||||
|
||||
MCFG_FRAGMENT_ADD(svi318_cartslot)
|
||||
|
||||
/* internal ram */
|
||||
@ -462,8 +455,6 @@ MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( svi328n_806, svi328_806 )
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_ntsc)
|
||||
|
||||
MCFG_SCREEN_MODIFY("screen")
|
||||
MCFG_SCREEN_REFRESH_RATE(60)
|
||||
MACHINE_CONFIG_END
|
||||
@ -537,10 +528,10 @@ ROM_START( sv328n80 )
|
||||
ROM_END
|
||||
|
||||
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
|
||||
COMP( 1983, svi318, 0, 0, svi318, svi318, svi318_state, svi318, "Spectravideo", "SVI-318 (PAL)", 0 )
|
||||
COMP( 1983, svi318n, svi318, 0, svi318n, svi318, svi318_state, svi318, "Spectravideo", "SVI-318 (NTSC)", 0 )
|
||||
COMP( 1983, svi328, svi318, 0, svi328, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (PAL)", 0 )
|
||||
COMP( 1983, svi328n, svi318, 0, svi328n, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (NTSC)", 0 )
|
||||
COMP( 1983, sv328p80, svi318, 0, svi328_806, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (PAL) + SVI-806 80 column card", 0 )
|
||||
COMP( 1983, sv328n80, svi318, 0, svi328n_806, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (NTSC) + SVI-806 80 column card", 0 )
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
|
||||
COMP( 1983, svi318, 0, 0, svi318, svi318, svi318_state, svi318, "Spectravideo", "SVI-318 (PAL)", GAME_SUPPORTS_SAVE )
|
||||
COMP( 1983, svi318n, svi318, 0, svi318n, svi318, svi318_state, svi318, "Spectravideo", "SVI-318 (NTSC)", GAME_SUPPORTS_SAVE )
|
||||
COMP( 1983, svi328, svi318, 0, svi328, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (PAL)", GAME_SUPPORTS_SAVE )
|
||||
COMP( 1983, svi328n, svi318, 0, svi328n, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (NTSC)", GAME_SUPPORTS_SAVE )
|
||||
COMP( 1983, sv328p80, svi318, 0, svi328_806, svi328, svi318_state, svi328_806, "Spectravideo", "SVI-328 (PAL) + SVI-806 80 column card", GAME_SUPPORTS_SAVE )
|
||||
COMP( 1983, sv328n80, svi318, 0, svi328n_806, svi328, svi318_state, svi328_806, "Spectravideo", "SVI-328 (NTSC) + SVI-806 80 column card", GAME_SUPPORTS_SAVE )
|
||||
|
@ -73,11 +73,7 @@ public:
|
||||
DECLARE_READ8_MEMBER(io_ext_r);
|
||||
DECLARE_WRITE8_MEMBER(io_ext_w);
|
||||
DECLARE_DRIVER_INIT(svi318);
|
||||
DECLARE_MACHINE_START(svi318_pal);
|
||||
DECLARE_MACHINE_RESET(svi318);
|
||||
DECLARE_MACHINE_RESET(svi328_806);
|
||||
DECLARE_VIDEO_START(svi328_806);
|
||||
DECLARE_MACHINE_START(svi318_ntsc);
|
||||
DECLARE_DRIVER_INIT(svi328_806);
|
||||
DECLARE_WRITE_LINE_MEMBER(vdp_interrupt);
|
||||
DECLARE_WRITE_LINE_MEMBER(ins8250_interrupt);
|
||||
DECLARE_READ8_MEMBER(ppi_port_a_r);
|
||||
@ -89,6 +85,9 @@ public:
|
||||
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(svi318_cart);
|
||||
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
|
||||
|
||||
virtual void machine_start();
|
||||
virtual void machine_reset();
|
||||
|
||||
MC6845_UPDATE_ROW(crtc_update_row);
|
||||
memory_region *m_cart_rom;
|
||||
memory_region *m_bios_rom;
|
||||
@ -111,13 +110,11 @@ protected:
|
||||
required_ioport m_buttons;
|
||||
optional_device<palette_device> m_palette;
|
||||
|
||||
protected:
|
||||
void svi318_set_banks();
|
||||
void svi318_80col_init();
|
||||
void svi318_vdp_interrupt(int i);
|
||||
|
||||
private:
|
||||
|
||||
void set_banks();
|
||||
void postload();
|
||||
|
||||
// memory banking
|
||||
UINT8 m_bank_switch;
|
||||
UINT8 m_bank_low;
|
||||
@ -141,7 +138,7 @@ private:
|
||||
// SVI-806 80 column card
|
||||
UINT8 m_svi806_present;
|
||||
UINT8 m_svi806_ram_enabled;
|
||||
memory_region *m_svi806_ram;
|
||||
dynamic_buffer m_svi806_ram;
|
||||
UINT8 *m_svi806_gfx;
|
||||
|
||||
required_memory_bank m_bank1;
|
||||
|
@ -204,7 +204,7 @@ WRITE8_MEMBER(svi318_state::psg_port_b_w)
|
||||
set_led_status(machine(), 0, !(data & 0x20));
|
||||
|
||||
m_bank_switch = data;
|
||||
svi318_set_banks();
|
||||
set_banks();
|
||||
}
|
||||
|
||||
/* Disk drives */
|
||||
@ -256,11 +256,11 @@ MC6845_UPDATE_ROW( svi318_state::crtc_update_row )
|
||||
|
||||
for (int i = 0; i < x_count; i++)
|
||||
{
|
||||
UINT8 data = m_svi806_gfx[m_svi806_ram->u8((ma + i) & 0x7ff) * 16 + ra];
|
||||
UINT8 data = m_svi806_gfx[m_svi806_ram[(ma + i) & 0x7ff] * 16 + ra];
|
||||
|
||||
if (i == cursor_x)
|
||||
{
|
||||
data = 0xFF;
|
||||
data = 0xff;
|
||||
}
|
||||
|
||||
for (int j = 0; j < 8; j++)
|
||||
@ -272,49 +272,15 @@ MC6845_UPDATE_ROW( svi318_state::crtc_update_row )
|
||||
}
|
||||
|
||||
|
||||
/* 80 column card init */
|
||||
void svi318_state::svi318_80col_init()
|
||||
{
|
||||
/* 2K RAM, but allocating 4KB to make banking easier */
|
||||
/* The upper 2KB will be set to FFs and will never be written to */
|
||||
m_svi806_ram = machine().memory().region_alloc("gfx2", 0x1000, 1, ENDIANNESS_LITTLE);
|
||||
memset(m_svi806_ram->base(), 0x00, 0x800);
|
||||
memset(m_svi806_ram->base() + 0x800, 0xff, 0x800);
|
||||
m_svi806_gfx = memregion("gfx1")->base();
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(svi318_state::svi806_ram_enable_w)
|
||||
{
|
||||
m_svi806_ram_enabled = (data & 0x01);
|
||||
svi318_set_banks();
|
||||
set_banks();
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(svi318_state, svi328_806)
|
||||
{
|
||||
}
|
||||
|
||||
MACHINE_RESET_MEMBER(svi318_state, svi328_806)
|
||||
{
|
||||
MACHINE_RESET_CALL_MEMBER(svi318);
|
||||
|
||||
svi318_80col_init();
|
||||
m_svi806_present = 1;
|
||||
svi318_set_banks();
|
||||
|
||||
/* Set SVI-806 80 column card palette */
|
||||
m_palette->set_pen_color(TMS9928A_PALETTE_SIZE, 0, 0, 0); /* Monochrome black */
|
||||
m_palette->set_pen_color(TMS9928A_PALETTE_SIZE+1, 0, 224, 0); /* Monochrome green */
|
||||
}
|
||||
|
||||
/* Init functions */
|
||||
|
||||
void svi318_state::svi318_vdp_interrupt(int i)
|
||||
{
|
||||
m_maincpu->set_input_line(0, (i ? HOLD_LINE : CLEAR_LINE));
|
||||
}
|
||||
|
||||
|
||||
static const UINT8 cc_op[0x100] = {
|
||||
4+1,10+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1, 4+1,11+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,
|
||||
8+1,10+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,12+1,11+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,
|
||||
@ -444,23 +410,59 @@ DRIVER_INIT_MEMBER(svi318_state, svi318)
|
||||
|
||||
m_bank_low_ptr = m_empty_bank;
|
||||
m_bank_high1_ptr = m_empty_bank;
|
||||
m_bank_high2_ptr = m_empty_bank;
|
||||
m_bank_high2_ptr = m_empty_bank;
|
||||
}
|
||||
|
||||
DRIVER_INIT_MEMBER(svi318_state, svi328_806)
|
||||
{
|
||||
DRIVER_INIT_CALL(svi318);
|
||||
m_svi806_present = 1;
|
||||
}
|
||||
|
||||
void svi318_state::machine_start()
|
||||
{
|
||||
astring region_tag;
|
||||
m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG));
|
||||
m_bios_rom = memregion("maincpu");
|
||||
|
||||
// 80 column card start
|
||||
if (m_svi806_present)
|
||||
{
|
||||
// 2K RAM, but allocating 4KB to make banking easier
|
||||
// The upper 2KB will be set to FFs and will never be written to
|
||||
m_svi806_ram.resize(0x1000);
|
||||
save_item(NAME(m_svi806_ram));
|
||||
memset(m_svi806_ram, 0x00, 0x800);
|
||||
memset(m_svi806_ram + 0x800, 0xff, 0x800);
|
||||
|
||||
m_svi806_gfx = memregion("gfx1")->base();
|
||||
|
||||
// Set SVI-806 80 column card palette
|
||||
m_palette->set_pen_color(TMS9928A_PALETTE_SIZE, 0, 0, 0); /* Monochrome black */
|
||||
m_palette->set_pen_color(TMS9928A_PALETTE_SIZE+1, 0, 224, 0); /* Monochrome green */
|
||||
}
|
||||
|
||||
// register for savestates
|
||||
save_item(NAME(m_driveselect));
|
||||
save_item(NAME(m_drq));
|
||||
save_item(NAME(m_irq));
|
||||
save_item(NAME(m_heads));
|
||||
|
||||
save_item(NAME(m_bank_switch));
|
||||
save_item(NAME(m_bank_low));
|
||||
save_item(NAME(m_bank_high));
|
||||
save_item(NAME(m_bank_low_read_only));
|
||||
save_item(NAME(m_bank_high1_read_only));
|
||||
save_item(NAME(m_bank_high2_read_only));
|
||||
save_item(NAME(m_keyboard_row));
|
||||
save_item(NAME(m_centronics_busy));
|
||||
|
||||
save_item(NAME(m_svi806_present));
|
||||
save_item(NAME(m_svi806_ram_enabled));
|
||||
|
||||
machine().save().register_postload(save_prepost_delegate(FUNC(svi318_state::postload), this));
|
||||
}
|
||||
|
||||
MACHINE_START_MEMBER(svi318_state, svi318_ntsc)
|
||||
{
|
||||
astring region_tag;
|
||||
m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG));
|
||||
m_bios_rom = memregion("maincpu");
|
||||
}
|
||||
|
||||
MACHINE_START_MEMBER(svi318_state, svi318_pal)
|
||||
{
|
||||
astring region_tag;
|
||||
m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG));
|
||||
m_bios_rom = memregion("maincpu");
|
||||
}
|
||||
|
||||
static void svi318_load_proc(device_image_interface &image)
|
||||
{
|
||||
@ -482,7 +484,7 @@ static void svi318_load_proc(device_image_interface &image)
|
||||
}
|
||||
}
|
||||
|
||||
MACHINE_RESET_MEMBER(svi318_state, svi318)
|
||||
void svi318_state::machine_reset()
|
||||
{
|
||||
m_keyboard_row = 0;
|
||||
m_centronics_busy = 0;
|
||||
@ -499,7 +501,7 @@ MACHINE_RESET_MEMBER(svi318_state, svi318)
|
||||
m_bank_high2_read_only = 0;
|
||||
|
||||
m_bank_switch = 0xff;
|
||||
svi318_set_banks();
|
||||
set_banks();
|
||||
|
||||
for (int drive = 0; drive < 2; drive++)
|
||||
floppy_get_device(machine(), drive)->floppy_install_load_proc(svi318_load_proc);
|
||||
@ -536,7 +538,7 @@ WRITE8_MEMBER(svi318_state::writemem4)
|
||||
if (m_svi806_ram_enabled)
|
||||
{
|
||||
if (offset < 0x800)
|
||||
m_svi806_ram->u8(offset) = data;
|
||||
m_svi806_ram[offset] = data;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -547,7 +549,7 @@ WRITE8_MEMBER(svi318_state::writemem4)
|
||||
}
|
||||
}
|
||||
|
||||
void svi318_state::svi318_set_banks()
|
||||
void svi318_state::set_banks()
|
||||
{
|
||||
const UINT8 v = m_bank_switch;
|
||||
UINT8 *ram = m_ram->pointer();
|
||||
@ -653,6 +655,12 @@ void svi318_state::svi318_set_banks()
|
||||
}
|
||||
}
|
||||
|
||||
void svi318_state::postload()
|
||||
{
|
||||
set_banks();
|
||||
}
|
||||
|
||||
|
||||
/* External I/O */
|
||||
|
||||
WRITE_LINE_MEMBER(svi318_state::write_centronics_busy)
|
||||
|
Loading…
Reference in New Issue
Block a user