From 6fe528885ede011ef22df715d0353a69ddcb75ce Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Mon, 22 Sep 2014 05:54:05 +0000 Subject: [PATCH] (MESS) svi318.c: cleaned up the driver and added support for save states. [Fabio Priuli] --- src/mess/drivers/svi318.c | 31 ++++------ src/mess/includes/svi318.h | 19 +++--- src/mess/machine/svi318.c | 120 ++++++++++++++++++++----------------- 3 files changed, 83 insertions(+), 87 deletions(-) diff --git a/src/mess/drivers/svi318.c b/src/mess/drivers/svi318.c index e88b739a5a2..54d9b4c992a 100644 --- a/src/mess/drivers/svi318.c +++ b/src/mess/drivers/svi318.c @@ -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 ) diff --git a/src/mess/includes/svi318.h b/src/mess/includes/svi318.h index 4575e650680..f13d31e7360 100644 --- a/src/mess/includes/svi318.h +++ b/src/mess/includes/svi318.h @@ -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 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; diff --git a/src/mess/machine/svi318.c b/src/mess/machine/svi318.c index b2e0d72537d..202a1a6757b 100644 --- a/src/mess/machine/svi318.c +++ b/src/mess/machine/svi318.c @@ -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)