(MESS) svi318.c: cleaned up the driver and added support for save states. [Fabio Priuli]

This commit is contained in:
Fabio Priuli 2014-09-22 05:54:05 +00:00
parent 5604baac70
commit 6fe528885e
3 changed files with 83 additions and 87 deletions

View File

@ -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 )

View File

@ -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;

View File

@ -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)