From 7e2b4fb0d32314452eec0b054b1c676a11673af5 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Tue, 31 Dec 2013 11:37:57 +0000 Subject: [PATCH] (MESS) bigbord2 : upgraded fdc to modern --- src/mess/drivers/bigbord2.c | 270 ++++++++++++------------------------ 1 file changed, 89 insertions(+), 181 deletions(-) diff --git a/src/mess/drivers/bigbord2.c b/src/mess/drivers/bigbord2.c index 025b3156f7e..2423eaab4f6 100644 --- a/src/mess/drivers/bigbord2.c +++ b/src/mess/drivers/bigbord2.c @@ -43,7 +43,7 @@ it just vanishes instead. What works: Turn it on, wait for cursor to appear in the top corner. Press Enter. -Now you can enter commands. D, M, X are working. +Now you can enter commands. Memory banking: @@ -60,6 +60,21 @@ ToDo: - Connect up the SASI, Centronics and other interfaces on ports D8-DB. - Connect up the programming port C0-C3. - Connect up the numerous board jumpers. +- Need software + +Monitor commands: +B - boot from disk +C - copy memory +D - dump memory +F - fill memory +G - go +I - in port +M - modify memory +O - out port +R - read a sector +T - test memory +V - compare blocks of memory +X - change banks ****************************************************************************/ @@ -68,15 +83,13 @@ ToDo: #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/z80/z80daisy.h" -#include "formats/basicdsk.h" -#include "imagedev/flopdrv.h" #include "machine/z80ctc.h" #include "machine/z80dart.h" #include "machine/z80dma.h" -#include "machine/wd17xx.h" #include "video/mc6845.h" #include "machine/keyboard.h" #include "sound/beep.h" +#include "machine/wd_fdc.h" #define SCREEN_TAG "screen" #define Z80_TAG "u39" @@ -89,25 +102,18 @@ class bigbord2_state : public driver_device { public: bigbord2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, Z80_TAG), - m_6845(*this, "crtc"), - m_ctca(*this, Z80CTCA_TAG), - m_ctcb(*this, Z80CTCA_TAG), - m_dma(*this, Z80DMA_TAG), - m_fdc(*this, "fdc"), - m_floppy0(*this, FLOPPY_0), - m_floppy1(*this, FLOPPY_1), - m_floppy2(*this, FLOPPY_2), - m_floppy3(*this, FLOPPY_3), - m_beeper(*this, "beeper") + : driver_device(mconfig, type, tag) + , m_maincpu(*this, Z80_TAG) + , m_6845(*this, "crtc") + , m_ctca(*this, Z80CTCA_TAG) + , m_ctcb(*this, Z80CTCA_TAG) + , m_dma(*this, Z80DMA_TAG) + , m_fdc(*this, "fdc") + , m_floppy0(*this, "fdc:0") + , m_floppy1(*this, "fdc:1") + , m_beeper(*this, "beeper") { } - virtual void machine_start(); - virtual void machine_reset(); - - virtual void video_start(); - DECLARE_WRITE8_MEMBER(portc8_w ); DECLARE_WRITE8_MEMBER(portcc_w ); DECLARE_READ8_MEMBER(portc4_r); @@ -116,43 +122,38 @@ public: DECLARE_WRITE_LINE_MEMBER(intrq_w); DECLARE_WRITE_LINE_MEMBER(drq_w); DECLARE_WRITE_LINE_MEMBER(frame); - - void set_floppy_parameters(size_t length); - - /* keyboard state */ - UINT8 m_term_data; - UINT8 m_term_status; - - /* video state */ + DECLARE_DRIVER_INIT(bigbord2); + TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick); + DECLARE_READ8_MEMBER(memory_read_byte); + DECLARE_WRITE8_MEMBER(memory_write_byte); + DECLARE_READ8_MEMBER(io_read_byte); + DECLARE_WRITE8_MEMBER(io_write_byte); UINT8 *m_p_chargen; /* character ROM */ UINT8 *m_p_videoram; /* Video RAM */ UINT8 *m_p_attribram; /* Attribute RAM */ - - /* floppy state */ +private: + UINT8 m_term_data; + UINT8 m_term_status; bool m_fdc_irq; /* interrupt request */ bool m_fdc_drq; /* data request */ - bool m_8n5; /* 5.25" / 8" drive select */ - bool m_dsdd; /* double sided disk detect */ int m_c8[8]; - + floppy_image_device *m_floppy; + virtual void machine_start(); + virtual void machine_reset(); + virtual void video_start(); + void fdc_intrq_w(bool state); + void fdc_drq_w(bool state); + address_space *m_mem; + address_space *m_io; required_device m_maincpu; required_device m_6845; required_device m_ctca; required_device m_ctcb; required_device m_dma; - required_device m_fdc; - required_device m_floppy0; - required_device m_floppy1; - required_device m_floppy2; - required_device m_floppy3; + required_device m_fdc; + required_device m_floppy0; + required_device m_floppy1; required_device m_beeper; - DECLARE_DRIVER_INIT(bigbord2); - TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick); - DECLARE_WRITE_LINE_MEMBER(bigbord2_interrupt); - DECLARE_READ8_MEMBER(memory_read_byte); - DECLARE_WRITE8_MEMBER(memory_write_byte); - DECLARE_READ8_MEMBER(io_read_byte); - DECLARE_WRITE8_MEMBER(io_write_byte); }; /* Status port @@ -183,24 +184,22 @@ READ8_MEMBER( bigbord2_state::portd0_r ) WRITE8_MEMBER( bigbord2_state::bigbord2_kbd_put ) { - address_space &mem = m_maincpu->space(AS_PROGRAM); - if (data) { m_term_data = data; m_term_status = 8; m_ctca->trg0(0); m_ctca->trg0(1); - if (mem.read_byte(0xf13d) == 0x4d) + if (m_mem->read_byte(0xf13d) == 0x4d) { // simulate interrupt by saving current pc on // the stack and jumping to interrupt handler. UINT16 spreg = m_maincpu->state_int(Z80_SP); UINT16 pcreg = m_maincpu->state_int(Z80_PC); spreg--; - mem.write_byte(spreg, pcreg >> 8); + m_mem->write_byte(spreg, pcreg >> 8); spreg--; - mem.write_byte(spreg, pcreg); + m_mem->write_byte(spreg, pcreg); m_maincpu->set_state_int(Z80_SP, spreg); m_maincpu->set_state_int(Z80_PC, 0xF120); } @@ -219,26 +218,22 @@ static ASCII_KEYBOARD_INTERFACE( keyboard_intf ) READ8_MEMBER(bigbord2_state::memory_read_byte) { - address_space& prog_space = m_maincpu->space(AS_PROGRAM); - return prog_space.read_byte(offset); + return m_mem->read_byte(offset); } WRITE8_MEMBER(bigbord2_state::memory_write_byte) { - address_space& prog_space = m_maincpu->space(AS_PROGRAM); - return prog_space.write_byte(offset, data); + m_mem->write_byte(offset, data); } READ8_MEMBER(bigbord2_state::io_read_byte) { - address_space& prog_space = m_maincpu->space(AS_IO); - return prog_space.read_byte(offset); + return m_io->read_byte(offset); } WRITE8_MEMBER(bigbord2_state::io_write_byte) { - address_space& prog_space = m_maincpu->space(AS_IO); - return prog_space.write_byte(offset, data); + m_io->write_byte(offset, data); } static Z80DMA_INTERFACE( dma_intf ) @@ -290,7 +285,11 @@ WRITE8_MEMBER( bigbord2_state::portc8_w ) break; case 1: // side select - wd17xx_set_side(m_fdc, m_c8[1]); + if (m_floppy) + { + m_floppy->ss_w(m_c8[1]); + } + break; case 2: @@ -299,17 +298,17 @@ WRITE8_MEMBER( bigbord2_state::portc8_w ) break; case 4: // density - wd17xx_dden_w(m_fdc, m_c8[4]); + m_fdc->dden_w(m_c8[4]); break; case 5: // connects to HLD pin on floppy drive break; case 6: // motor on - floppy_mon_w(m_floppy0, ~m_c8[6]); - floppy_mon_w(m_floppy1, ~m_c8[6]); - floppy_mon_w(m_floppy2, ~m_c8[6]); - floppy_mon_w(m_floppy3, ~m_c8[6]); + if (m_floppy) + { + m_floppy->mon_w(~m_c8[6]); + } break; case 7: // beeper @@ -342,20 +341,13 @@ WRITE8_MEMBER( bigbord2_state::portcc_w ) */ /* drive select */ - bool dvsel0 = BIT(data, 7); - bool dvsel1 = BIT(data, 6); - bool dvsel2 = BIT(data, 5); - bool dvsel3 = BIT(data, 4); + m_floppy = NULL; + if BIT(data, 7) m_floppy = m_floppy0->get_device(); + if BIT(data, 6) m_floppy = m_floppy1->get_device(); + //if BIT(data, 5) m_floppy = m_floppy2->get_device(); + //if BIT(data, 4) m_floppy = m_floppy3->get_device(); - if (dvsel0) wd17xx_set_drive(m_fdc, 0); - if (dvsel1) wd17xx_set_drive(m_fdc, 1); - if (dvsel2) wd17xx_set_drive(m_fdc, 2); - if (dvsel3) wd17xx_set_drive(m_fdc, 3); - - floppy_drive_set_ready_state(m_floppy0, dvsel0, 1); - floppy_drive_set_ready_state(m_floppy1, dvsel1, 1); - floppy_drive_set_ready_state(m_floppy2, dvsel2, 1); - floppy_drive_set_ready_state(m_floppy3, dvsel3, 1); + m_fdc->set_floppy(m_floppy); bool dma_rdy = 0; if ((data & 7) == 2) @@ -388,7 +380,7 @@ static ADDRESS_MAP_START( bigbord2_io, AS_IO, 8, bigbord2_state ) AM_RANGE(0xC8, 0xCB) AM_WRITE(portc8_w) AM_RANGE(0xCC, 0xCF) AM_WRITE(portcc_w) AM_RANGE(0xD0, 0xD3) AM_READ(portd0_r) - AM_RANGE(0xD4, 0xD7) AM_DEVREADWRITE_LEGACY("fdc", wd17xx_r, wd17xx_w) + AM_RANGE(0xD4, 0xD7) AM_DEVREADWRITE("fdc", mb8877_t, read, write) //AM_RANGE(0xD8, 0xDB) AM_READWRITE(portd8_r, portd8_w) // various external data ports; DB = centronics printer AM_RANGE(0xDC, 0xDC) AM_MIRROR(2) AM_DEVREADWRITE("crtc", mc6845_device, status_r, address_w) AM_RANGE(0xDD, 0xDD) AM_MIRROR(2) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w) @@ -417,11 +409,6 @@ INPUT_PORTS_END /* Z80 SIO */ -WRITE_LINE_MEMBER(bigbord2_state::bigbord2_interrupt) -{ - m_maincpu->set_input_line(0, state); -} - static Z80SIO_INTERFACE( sio_intf ) { 0, 0, 0, 0, @@ -438,7 +425,7 @@ static Z80SIO_INTERFACE( sio_intf ) DEVCB_NULL, DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, bigbord2_interrupt), + DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, @@ -458,11 +445,10 @@ TIMER_DEVICE_CALLBACK_MEMBER(bigbord2_state::ctc_tick) WRITE_LINE_MEMBER( bigbord2_state::frame ) { - address_space &space = m_maincpu->space(AS_PROGRAM); static UINT8 framecnt; framecnt++; - if ((space.read_byte(0xf13d) == 0x4d) & (framecnt > 3)) + if ((m_mem->read_byte(0xf13d) == 0x4d) & (framecnt > 3)) { framecnt = 0; // simulate interrupt by saving current pc on @@ -470,9 +456,9 @@ WRITE_LINE_MEMBER( bigbord2_state::frame ) UINT16 spreg = m_maincpu->state_int(Z80_SP); UINT16 pcreg = m_maincpu->state_int(Z80_PC); spreg--; - space.write_byte(spreg, pcreg >> 8); + m_mem->write_byte(spreg, pcreg >> 8); spreg--; - space.write_byte(spreg, pcreg); + m_mem->write_byte(spreg, pcreg); m_maincpu->set_state_int(Z80_SP, spreg); m_maincpu->set_state_int(Z80_PC, 0xF18E); } @@ -513,24 +499,20 @@ static const z80_daisy_config bigbord2_daisy_chain[] = /* WD1793 Interface */ -WRITE_LINE_MEMBER( bigbord2_state::intrq_w ) +static SLOT_INTERFACE_START( bigbord2_floppies ) + SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) +SLOT_INTERFACE_END + +void bigbord2_state::fdc_intrq_w(bool state) { m_fdc_irq = state; } -WRITE_LINE_MEMBER( bigbord2_state::drq_w ) +void bigbord2_state::fdc_drq_w(bool state) { m_fdc_drq = state; } -static const wd17xx_interface fdc_intf = -{ - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, intrq_w), - DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, drq_w), - { FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3 } -}; - /* Video */ @@ -543,53 +525,14 @@ void bigbord2_state::video_start() } -void bigbord2_state::set_floppy_parameters(size_t length) -{ - switch (length) - { - case 77*1*26*128: // 250K 8" SSSD - m_8n5 = 1; - m_dsdd = 0; - break; - - case 77*1*26*256: // 500K 8" SSDD - m_8n5 = 1; - m_dsdd = 0; - break; - - case 40*1*18*128: // 90K 5.25" SSSD - m_8n5 = 0; - m_dsdd = 0; - break; - - case 40*2*18*128: // 180K 5.25" DSSD - m_8n5 = 0; - m_dsdd = 1; - break; - } -} - -static void bigbord2_load_proc(device_image_interface &image) -{ - bigbord2_state *state = image.device().machine().driver_data(); - - state->set_floppy_parameters(image.length()); -} - /* Machine Initialization */ void bigbord2_state::machine_start() { - // set floppy load procs - floppy_install_load_proc(m_floppy0, bigbord2_load_proc); - floppy_install_load_proc(m_floppy1, bigbord2_load_proc); - /* register for state saving */ save_item(NAME(m_term_data)); save_item(NAME(m_fdc_irq)); save_item(NAME(m_fdc_drq)); - save_item(NAME(m_8n5)); - save_item(NAME(m_dsdd)); } void bigbord2_state::machine_reset() @@ -606,52 +549,16 @@ void bigbord2_state::machine_reset() DRIVER_INIT_MEMBER(bigbord2_state,bigbord2) { + m_mem = &m_maincpu->space(AS_PROGRAM); + m_io = &m_maincpu->space(AS_IO); UINT8 *RAM = memregion(Z80_TAG)->base(); membank("bankr")->configure_entries(0, 2, &RAM[0x0000], 0x10000); membank("bankv")->configure_entries(0, 2, &RAM[0x6000], 0x10000); membank("banka")->configure_entries(0, 2, &RAM[0x7000], 0x10000); + m_fdc->setup_intrq_cb(mb8877_t::line_cb(FUNC(bigbord2_state::fdc_intrq_w), this)); + m_fdc->setup_drq_cb(mb8877_t::line_cb(FUNC(bigbord2_state::fdc_drq_w), this)); } -static LEGACY_FLOPPY_OPTIONS_START( bigbord2 ) - LEGACY_FLOPPY_OPTION( sssd8, "dsk", "8\" SSSD", basicdsk_identify_default, basicdsk_construct_default, NULL, - HEADS([1]) - TRACKS([77]) - SECTORS([26]) - SECTOR_LENGTH([128]) - FIRST_SECTOR_ID([1])) - LEGACY_FLOPPY_OPTION( ssdd8, "dsk", "8\" SSDD", basicdsk_identify_default, basicdsk_construct_default, NULL, - HEADS([1]) - TRACKS([77]) - SECTORS([26]) - SECTOR_LENGTH([256]) - FIRST_SECTOR_ID([1])) - LEGACY_FLOPPY_OPTION( sssd5, "dsk", "5.25\" SSSD", basicdsk_identify_default, basicdsk_construct_default, NULL, - HEADS([1]) - TRACKS([40]) - SECTORS([18]) - SECTOR_LENGTH([128]) - FIRST_SECTOR_ID([1])) - LEGACY_FLOPPY_OPTION( ssdd5, "dsk", "5.25\" SSDD", basicdsk_identify_default, basicdsk_construct_default, NULL, - HEADS([2]) - TRACKS([40]) - SECTORS([18]) - SECTOR_LENGTH([128]) - FIRST_SECTOR_ID([1])) -LEGACY_FLOPPY_OPTIONS_END - -static const floppy_interface bigbord2_floppy_interface = -{ - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - FLOPPY_STANDARD_5_25_DSDD, - LEGACY_FLOPPY_OPTIONS_NAME(bigbord2), - NULL, - NULL -}; - /* Screen */ @@ -713,7 +620,7 @@ static MC6845_INTERFACE( bigbord2_crtc ) DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, frame), //DEVCB_DEVICE_LINE(Z80CTCA_TAG, z80ctc_device, trg3), // vsync + DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, frame), // vsync NULL }; @@ -745,8 +652,9 @@ static MACHINE_CONFIG_START( bigbord2, bigbord2_state ) MCFG_Z80SIO0_ADD(Z80SIO_TAG, MAIN_CLOCK, sio_intf) MCFG_Z80CTC_ADD(Z80CTCA_TAG, MAIN_CLOCK, ctca_intf) MCFG_Z80CTC_ADD(Z80CTCB_TAG, MAIN_CLOCK / 6, ctcb_intf) - MCFG_FD1793_ADD("fdc", fdc_intf) - MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(bigbord2_floppy_interface) + MCFG_MB8877x_ADD("fdc", XTAL_16MHz / 16) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", bigbord2_floppies, "525dd", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:1", bigbord2_floppies, "525dd", floppy_image_device::default_floppy_formats) MCFG_MC6845_ADD("crtc", MC6845, SCREEN_TAG, XTAL_16MHz / 8, bigbord2_crtc) MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf)