diff --git a/src/mess/drivers/victor9k.c b/src/mess/drivers/victor9k.c index 1ed0db25aa6..40af098cbc3 100644 --- a/src/mess/drivers/victor9k.c +++ b/src/mess/drivers/victor9k.c @@ -28,144 +28,6 @@ -//************************************************************************** -// READ/WRITE HANDLERS -//************************************************************************** - -//------------------------------------------------- -// floppy_p1_r - -//------------------------------------------------- - -READ8_MEMBER( victor9k_state::floppy_p1_r ) -{ - /* - - bit description - - 0 L0MS0 - 1 L0MS1 - 2 L0MS2 - 3 L0MS3 - 4 L1MS0 - 5 L1MS1 - 6 L1MS2 - 7 L1MS3 - - */ - - return m_lms; -} - - -//------------------------------------------------- -// floppy_p2_r - -//------------------------------------------------- - -READ8_MEMBER( victor9k_state::floppy_p2_r ) -{ - /* - - bit description - - 0 - 1 - 2 - 3 - 4 - 5 - 6 RDY0 - 7 RDY1 - - */ - - UINT8 data = 0; - - data |= m_rdy0 << 6; - data |= m_rdy1 << 7; - - return data; -} - - -//------------------------------------------------- -// floppy_p2_w - -//------------------------------------------------- - -WRITE8_MEMBER( victor9k_state::floppy_p2_w ) -{ - /* - - bit description - - 0 START0 - 1 STOP0 - 2 START1 - 3 STOP1 - 4 SEL1 - 5 SEL0 - 6 - 7 - - */ - - if (BIT(data, 0)) m_floppy0->mon_w(0); - if (BIT(data, 1)) m_floppy0->mon_w(1); - if (BIT(data, 2)) m_floppy1->mon_w(0); - if (BIT(data, 3)) m_floppy1->mon_w(1); - - int sel0 = BIT(data, 5); - - if (m_sel0 && !sel0) - { - m_da0 = m_da; - //m_floppy0->set_rpm(); - } - - m_sel0 = sel0; - - int sel1 = BIT(data, 4); - - if (m_sel1 && !sel1) - { - m_da1 = m_da; - //m_floppy1->set_rpm(); - } - - m_sel1 = sel1; -} - - -//------------------------------------------------- -// tach0_r - -//------------------------------------------------- - -READ8_MEMBER( victor9k_state::tach0_r ) -{ - return m_tach0; -} - - -//------------------------------------------------- -// tach1_r - -//------------------------------------------------- - -READ8_MEMBER( victor9k_state::tach1_r ) -{ - return m_tach1; -} - - -//------------------------------------------------- -// da_w - -//------------------------------------------------- - -WRITE8_MEMBER( victor9k_state::da_w ) -{ - m_da = data; -} - - - //************************************************************************** // ADDRESS MAPS //************************************************************************** @@ -193,19 +55,6 @@ static ADDRESS_MAP_START( victor9k_mem, AS_PROGRAM, 8, victor9k_state ) ADDRESS_MAP_END -//------------------------------------------------- -// ADDRESS_MAP( floppy_io ) -//------------------------------------------------- - -static ADDRESS_MAP_START( floppy_io, AS_IO, 8, victor9k_state ) - AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(floppy_p1_r) AM_WRITENOP - AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(floppy_p2_r, floppy_p2_w) - AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(tach0_r) - AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(tach1_r) - AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_WRITE(da_w) -ADDRESS_MAP_END - - //************************************************************************** // INPUT PORTS @@ -511,8 +360,8 @@ WRITE8_MEMBER( victor9k_state::via4_pa_w ) */ - m_lms = (m_lms & 0xf0) | (data & 0x0f); - m_st[0] = data >> 4; + m_fdc->l0ms_w(data & 0x0f); + m_fdc->st0_w(data >> 4); } WRITE8_MEMBER( victor9k_state::via4_pb_w ) @@ -532,8 +381,8 @@ WRITE8_MEMBER( victor9k_state::via4_pb_w ) */ - m_lms = (data << 4) | (m_lms & 0x0f); - m_st[1] = data >> 4; + m_fdc->l1ms_w(data & 0x0f); + m_fdc->st1_w(data >> 4); } WRITE_LINE_MEMBER( victor9k_state::mode_w ) @@ -609,16 +458,16 @@ READ8_MEMBER( victor9k_state::via6_pa_r ) UINT8 data = 0; // track 0 drive A sense - data |= m_floppy0->trk00_r() << 1; + data |= m_fdc->trk0d0_r() << 1; // track 0 drive B sense - data |= m_floppy1->trk00_r() << 3; + data |= m_fdc->trk0d1_r() << 3; // write protect sense - data |= (m_drive ? m_floppy1->wpt_r() : m_floppy0->wpt_r()) << 6; + data |= m_fdc->wps_r() << 6; // disk sync detect - data |= m_sync << 7; + data |= m_fdc->sync_r() << 7; return data; } @@ -641,16 +490,16 @@ WRITE8_MEMBER( victor9k_state::via6_pa_w ) */ // LED, drive A - output_set_led_value(LED_A, BIT(data, 0)); + m_fdc->led0a_w(BIT(data, 0)); // LED, drive B - output_set_led_value(LED_B, BIT(data, 2)); + m_fdc->led1a_w(BIT(data, 2)); // dual side select - m_side = BIT(data, 4); + m_fdc->side_select_w(BIT(data, 4)); // select drive A/B - m_drive = BIT(data, 5); + m_fdc->drive_select_w(BIT(data, 5)); } READ8_MEMBER( victor9k_state::via6_pb_r ) @@ -673,19 +522,19 @@ READ8_MEMBER( victor9k_state::via6_pb_r ) UINT8 data = 0; // motor speed status, drive A - data |= m_rdy0; + data |= m_fdc->rdy0_r(); // motor speed status, drive B - data |= m_rdy1 << 1; + data |= m_fdc->rdy1_r() << 1; // door B sense - data |= m_ds1 << 3; + data |= m_fdc->ds1_r() << 3; // door A sense - data |= m_ds0 << 4; + data |= m_fdc->ds0_r() << 4; // single/double sided - data |= (m_drive ? m_floppy1->twosid_r() : m_floppy0->twosid_r()) << 5; + data |= m_fdc->single_double_sided_r() << 5; return data; } @@ -708,22 +557,13 @@ WRITE8_MEMBER( victor9k_state::via6_pb_w ) */ // motor speed controller reset - if (!BIT(data, 2)) - m_fdc_cpu->reset(); + m_fdc->screset_w(BIT(data, 2)); // stepper enable A - m_stp[0] = BIT(data, 6); + m_fdc->stp0_w(BIT(data, 6)); // stepper enable B - m_stp[1] = BIT(data, 7); -} - -WRITE_LINE_MEMBER( victor9k_state::drw_w ) -{ -} - -WRITE_LINE_MEMBER( victor9k_state::erase_w ) -{ + m_fdc->stp1_w(BIT(data, 7)); } WRITE_LINE_MEMBER( victor9k_state::via6_irq_w ) @@ -753,64 +593,6 @@ WRITE_LINE_MEMBER( victor9k_state::kbdata_w ) m_via2->write_pa6(state); } -//------------------------------------------------- -// SLOT_INTERFACE( victor9k_floppies ) -//------------------------------------------------- - -void victor9k_state::ready0_cb(floppy_image_device *device, int state) -{ - m_rdy0 = state; - - m_via5->write_ca2(m_rdy0); -} - -int victor9k_state::load0_cb(floppy_image_device *device) -{ - m_ds0 = 0; - - m_via4->write_ca1(m_ds0); - - return IMAGE_INIT_PASS; -} - -void victor9k_state::unload0_cb(floppy_image_device *device) -{ - m_ds0 = 1; - - m_via4->write_ca1(m_ds0); -} - -void victor9k_state::ready1_cb(floppy_image_device *device, int state) -{ - m_rdy1 = state; - - m_via5->write_cb2(m_rdy1); -} - -int victor9k_state::load1_cb(floppy_image_device *device) -{ - m_ds1 = 0; - - m_via4->write_cb1(m_ds1); - - return IMAGE_INIT_PASS; -} - -void victor9k_state::unload1_cb(floppy_image_device *device) -{ - m_ds1 = 1; - - m_via4->write_cb1(m_ds1); -} - -static SLOT_INTERFACE_START( victor9k_floppies ) - SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) -SLOT_INTERFACE_END - -FLOPPY_FORMATS_MEMBER( victor9k_state::floppy_formats ) - FLOPPY_VICTOR_9000_FORMAT -FLOPPY_FORMATS_END - //************************************************************************** // MACHINE INITIALIZATION @@ -822,20 +604,20 @@ FLOPPY_FORMATS_END void victor9k_state::machine_start() { - // set floppy callbacks - m_floppy0->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor9k_state::ready0_cb), this)); - m_floppy0->setup_load_cb(floppy_image_device::load_cb(FUNC(victor9k_state::load0_cb), this)); - m_floppy0->setup_unload_cb(floppy_image_device::unload_cb(FUNC(victor9k_state::unload0_cb), this)); - m_floppy1->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor9k_state::ready1_cb), this)); - m_floppy1->setup_load_cb(floppy_image_device::load_cb(FUNC(victor9k_state::load1_cb), this)); - m_floppy1->setup_unload_cb(floppy_image_device::unload_cb(FUNC(victor9k_state::unload1_cb), this)); + // state saving + save_item(NAME(m_brt)); + save_item(NAME(m_cont)); + save_item(NAME(m_via1_irq)); + save_item(NAME(m_via2_irq)); + save_item(NAME(m_via3_irq)); + save_item(NAME(m_via4_irq)); + save_item(NAME(m_via5_irq)); + save_item(NAME(m_via6_irq)); + save_item(NAME(m_ssda_irq)); // memory banking address_space &program = m_maincpu->space(AS_PROGRAM); program.install_ram(0x00000, m_ram->size() - 1, m_ram->pointer()); - - m_via5->write_ca1(m_brdy); - m_via6->write_ca1(m_gcrerr); } @@ -854,9 +636,6 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state ) MCFG_CPU_PROGRAM_MAP(victor9k_mem) MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE(I8259A_TAG, pic8259_device, inta_cb) - MCFG_CPU_ADD(I8048_TAG, I8048, XTAL_30MHz/6) - MCFG_CPU_IO_MAP(floppy_io) - // video hardware MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) MCFG_SCREEN_REFRESH_RATE(50) @@ -942,13 +721,10 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state ) MCFG_VIA6522_READPB_HANDLER(READ8(victor9k_state, via6_pb_r)) MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(victor9k_state, via6_pa_w)) MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(victor9k_state, via6_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(victor9k_state, drw_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(victor9k_state, erase_w)) + MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE(FDC_TAG, victor_9000_fdc_t, drw_w)) + MCFG_VIA6522_CB2_HANDLER(DEVWRITELINE(FDC_TAG, victor_9000_fdc_t, erase_w)) MCFG_VIA6522_IRQ_HANDLER(WRITELINE(victor9k_state, via6_irq_w)) - MCFG_FLOPPY_DRIVE_ADD(I8048_TAG":0", victor9k_floppies, "525qd", victor9k_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD(I8048_TAG":1", victor9k_floppies, "525qd", victor9k_state::floppy_formats) - MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(UPD7201_TAG, z80dart_device, rxa_w)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(UPD7201_TAG, z80dart_device, dcda_w)) @@ -967,6 +743,14 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state ) MCFG_VICTOR9K_KBRDY_HANDLER(WRITELINE(victor9k_state, kbrdy_w)) MCFG_VICTOR9K_KBDATA_HANDLER(WRITELINE(victor9k_state, kbdata_w)) + MCFG_DEVICE_ADD(FDC_TAG, VICTOR_9000_FDC, 0) + MCFG_VICTOR_9000_FDC_DS0_CB(DEVWRITELINE(M6522_4_TAG, via6522_device, write_ca1)) + MCFG_VICTOR_9000_FDC_DS1_CB(DEVWRITELINE(M6522_4_TAG, via6522_device, write_cb1)) + MCFG_VICTOR_9000_FDC_RDY0_CB(DEVWRITELINE(M6522_5_TAG, via6522_device, write_ca2)) + MCFG_VICTOR_9000_FDC_RDY1_CB(DEVWRITELINE(M6522_5_TAG, via6522_device, write_cb2)) + MCFG_VICTOR_9000_FDC_BRDY_CB(DEVWRITELINE(M6522_5_TAG, via6522_device, write_ca1)) + MCFG_VICTOR_9000_FDC_GCRERR_CB(DEVWRITELINE(M6522_6_TAG, via6522_device, write_ca1)) + // internal ram MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("128K") @@ -995,12 +779,6 @@ ROM_START( victor9k ) ROM_SYSTEM_BIOS( 1, "univ", "Universal" ) ROMX_LOAD( "v9000 univ. fe f3f7 13db.7j", 0x0000, 0x1000, CRC(25c7a59f) SHA1(8784e9aa7eb9439f81e18b8e223c94714e033911), ROM_BIOS(2) ) ROMX_LOAD( "v9000 univ. ff f3f7 39fe.8j", 0x1000, 0x1000, CRC(496c7467) SHA1(eccf428f62ef94ab85f4a43ba59ae6a066244a66), ROM_BIOS(2) ) - - ROM_REGION( 0x400, I8048_TAG, 0) - ROM_LOAD( "36080.5d", 0x000, 0x400, CRC(9bf49f7d) SHA1(b3a11bb65105db66ae1985b6f482aab6ea1da38b) ) - - ROM_REGION( 0x800, "gcr", 0 ) - ROM_LOAD( "100836-001.4k", 0x000, 0x800, CRC(adc601bd) SHA1(6eeff3d2063ae2d97452101aa61e27ef83a467e5) ) ROM_END diff --git a/src/mess/includes/victor9k.h b/src/mess/includes/victor9k.h index fb64cd42e27..c6e75df8814 100644 --- a/src/mess/includes/victor9k.h +++ b/src/mess/includes/victor9k.h @@ -16,7 +16,6 @@ #include "bus/rs232/rs232.h" #include "cpu/i86/i86.h" -#include "cpu/mcs48/mcs48.h" #include "formats/victor9k_dsk.h" #include "imagedev/floppy.h" #include "machine/ram.h" @@ -28,11 +27,11 @@ #include "machine/pic8259.h" #include "machine/z80dart.h" #include "machine/victor9kb.h" +#include "machine/victor9k_fdc.h" #include "sound/hc55516.h" #include "video/mc6845.h" #define I8088_TAG "8l" -#define I8048_TAG "5d" #define I8253_TAG "13h" #define I8259A_TAG "7l" #define UPD7201_TAG "16e" @@ -52,53 +51,45 @@ #define RS232_B_TAG "rs232b" #define SCREEN_TAG "screen" #define VICTOR9K_KEYBOARD_TAG "victor9kb" +#define FDC_TAG "fdc" class victor9k_state : public driver_device { public: - victor9k_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, I8088_TAG), - m_fdc_cpu(*this, I8048_TAG), - m_ieee488(*this, IEEE488_TAG), - m_pic(*this, I8259A_TAG), - m_upd7201(*this, UPD7201_TAG), - m_ssda(*this, MC6852_TAG), - m_via1(*this, M6522_1_TAG), - m_via2(*this, M6522_2_TAG), - m_via3(*this, M6522_3_TAG), - m_via4(*this, M6522_4_TAG), - m_via5(*this, M6522_5_TAG), - m_via6(*this, M6522_6_TAG), - m_cvsd(*this, HC55516_TAG), - m_crtc(*this, HD46505S_TAG), - m_ram(*this, RAM_TAG), - m_floppy0(*this, I8048_TAG":0:525qd"), - m_floppy1(*this, I8048_TAG":1:525qd"), - m_kb(*this, VICTOR9K_KEYBOARD_TAG), - m_rs232a(*this, RS232_A_TAG), - m_rs232b(*this, RS232_B_TAG), - m_video_ram(*this, "video_ram"), - m_da(0), - m_da0(0), - m_da1(0), - m_sel0(0), - m_sel1(0), - m_tach0(0), - m_tach1(0), - m_rdy0(0), - m_rdy1(0), - m_ds0(1), - m_ds1(1), - m_lms(0), - m_brdy(1), - m_sync(1), - m_gcrerr(0), - m_palette(*this, "palette") + victor9k_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, I8088_TAG), + m_ieee488(*this, IEEE488_TAG), + m_pic(*this, I8259A_TAG), + m_upd7201(*this, UPD7201_TAG), + m_ssda(*this, MC6852_TAG), + m_via1(*this, M6522_1_TAG), + m_via2(*this, M6522_2_TAG), + m_via3(*this, M6522_3_TAG), + m_via4(*this, M6522_4_TAG), + m_via5(*this, M6522_5_TAG), + m_via6(*this, M6522_6_TAG), + m_cvsd(*this, HC55516_TAG), + m_crtc(*this, HD46505S_TAG), + m_ram(*this, RAM_TAG), + m_kb(*this, VICTOR9K_KEYBOARD_TAG), + m_fdc(*this, FDC_TAG), + m_rs232a(*this, RS232_A_TAG), + m_rs232b(*this, RS232_B_TAG), + m_palette(*this, "palette"), + m_video_ram(*this, "video_ram"), + m_brt(0), + m_cont(0), + m_via1_irq(CLEAR_LINE), + m_via2_irq(CLEAR_LINE), + m_via3_irq(CLEAR_LINE), + m_via4_irq(CLEAR_LINE), + m_via5_irq(CLEAR_LINE), + m_via6_irq(CLEAR_LINE), + m_ssda_irq(CLEAR_LINE) { } required_device m_maincpu; - required_device m_fdc_cpu; required_device m_ieee488; required_device m_pic; required_device m_upd7201; @@ -112,21 +103,15 @@ public: required_device m_cvsd; required_device m_crtc; required_device m_ram; - required_device m_floppy0; - required_device m_floppy1; required_device m_kb; + required_device m_fdc; required_device m_rs232a; required_device m_rs232b; + required_device m_palette; + required_shared_ptr m_video_ram; virtual void machine_start(); - DECLARE_READ8_MEMBER( floppy_p1_r ); - DECLARE_READ8_MEMBER( floppy_p2_r ); - DECLARE_WRITE8_MEMBER( floppy_p2_w ); - DECLARE_READ8_MEMBER( tach0_r ); - DECLARE_READ8_MEMBER( tach1_r ); - DECLARE_WRITE8_MEMBER( da_w ); - DECLARE_WRITE8_MEMBER( via1_pa_w ); DECLARE_WRITE_LINE_MEMBER( write_nfrd ); DECLARE_WRITE_LINE_MEMBER( write_ndac ); @@ -155,8 +140,6 @@ public: DECLARE_READ8_MEMBER( via6_pb_r ); DECLARE_WRITE8_MEMBER( via6_pa_w ); DECLARE_WRITE8_MEMBER( via6_pb_w ); - DECLARE_WRITE_LINE_MEMBER( drw_w ); - DECLARE_WRITE_LINE_MEMBER( erase_w ); DECLARE_WRITE_LINE_MEMBER( kbrdy_w ); DECLARE_WRITE_LINE_MEMBER( kbdata_w ); DECLARE_WRITE_LINE_MEMBER( vert_w ); @@ -165,23 +148,7 @@ public: DECLARE_WRITE_LINE_MEMBER( ssda_irq_w ); MC6845_UPDATE_ROW( crtc_update_row ); - DECLARE_FLOPPY_FORMATS( floppy_formats ); - - void ready0_cb(floppy_image_device *, int device); - int load0_cb(floppy_image_device *device); - void unload0_cb(floppy_image_device *device); - void ready1_cb(floppy_image_device *, int device); - int load1_cb(floppy_image_device *device); - void unload1_cb(floppy_image_device *device); - - enum - { - LED_A = 0, - LED_B - }; - /* video state */ - required_shared_ptr m_video_ram; int m_brt; int m_cont; @@ -194,30 +161,8 @@ public: int m_via6_irq; int m_ssda_irq; - /* floppy state */ - UINT8 m_da; - UINT8 m_da0; - UINT8 m_da1; - int m_sel0; - int m_sel1; - int m_tach0; - int m_tach1; - int m_rdy0; - int m_rdy1; - int m_ds0; - int m_ds1; - UINT8 m_lms; /* motor speed */ - int m_st[2]; /* stepper phase */ - int m_stp[2]; /* stepper enable */ - int m_drive; /* selected drive */ - int m_side; /* selected side */ - int m_brdy; - int m_sync; - int m_gcrerr; - DECLARE_WRITE_LINE_MEMBER(mux_serial_b_w); DECLARE_WRITE_LINE_MEMBER(mux_serial_a_w); - required_device m_palette; }; #endif diff --git a/src/mess/machine/victor9k_fdc.c b/src/mess/machine/victor9k_fdc.c new file mode 100644 index 00000000000..aeffe7c9afb --- /dev/null +++ b/src/mess/machine/victor9k_fdc.c @@ -0,0 +1,400 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Victor 9000 floppy disk controller emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +/* + + TODO: + + - everything + +*/ + +#include "victor9k_fdc.h" + + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +#define LOG 0 + +#define I8048_TAG "5d" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type VICTOR_9000_FDC = &device_creator; + + +//------------------------------------------------- +// ROM( victor_9000_fdc ) +//------------------------------------------------- + +ROM_START( victor_9000_fdc ) + ROM_REGION( 0x400, I8048_TAG, 0) + ROM_LOAD( "36080.5d", 0x000, 0x400, CRC(9bf49f7d) SHA1(b3a11bb65105db66ae1985b6f482aab6ea1da38b) ) + + ROM_REGION( 0x800, "gcr", 0 ) + ROM_LOAD( "100836-001.4k", 0x000, 0x800, CRC(adc601bd) SHA1(6eeff3d2063ae2d97452101aa61e27ef83a467e5) ) +ROM_END + + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const rom_entry *victor_9000_fdc_t::device_rom_region() const +{ + return ROM_NAME( victor_9000_fdc ); +} + + +//------------------------------------------------- +// ADDRESS_MAP( floppy_io ) +//------------------------------------------------- + +static ADDRESS_MAP_START( floppy_io, AS_IO, 8, victor_9000_fdc_t ) + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(floppy_p1_r) AM_WRITENOP + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(floppy_p2_r, floppy_p2_w) + AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(tach0_r) + AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(tach1_r) + AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_WRITE(da_w) +ADDRESS_MAP_END + + +//------------------------------------------------- +// SLOT_INTERFACE( victor9k_floppies ) +//------------------------------------------------- + +void victor_9000_fdc_t::ready0_cb(floppy_image_device *device, int state) +{ + m_rdy0 = state; + + m_rdy0_cb(state); +} + +int victor_9000_fdc_t::load0_cb(floppy_image_device *device) +{ + m_ds0 = 0; + + m_ds0_cb(0); + + return IMAGE_INIT_PASS; +} + +void victor_9000_fdc_t::unload0_cb(floppy_image_device *device) +{ + m_ds0 = 1; + + m_ds0_cb(1); +} + +void victor_9000_fdc_t::ready1_cb(floppy_image_device *device, int state) +{ + m_rdy1 = state; + + m_rdy1_cb(state); +} + +int victor_9000_fdc_t::load1_cb(floppy_image_device *device) +{ + m_ds1 = 0; + + m_ds1_cb(0); + + return IMAGE_INIT_PASS; +} + +void victor_9000_fdc_t::unload1_cb(floppy_image_device *device) +{ + m_ds1 = 1; + + m_ds1_cb(1); +} + +static SLOT_INTERFACE_START( victor9k_floppies ) + SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) +SLOT_INTERFACE_END + +FLOPPY_FORMATS_MEMBER( victor_9000_fdc_t::floppy_formats ) + FLOPPY_VICTOR_9000_FORMAT +FLOPPY_FORMATS_END + + +//------------------------------------------------- +// MACHINE_CONFIG_FRAGMENT( victor_9000_fdc ) +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( victor_9000_fdc ) + MCFG_CPU_ADD(I8048_TAG, I8048, XTAL_30MHz/6) + MCFG_CPU_IO_MAP(floppy_io) + + MCFG_FLOPPY_DRIVE_ADD(I8048_TAG":0", victor9k_floppies, "525qd", victor_9000_fdc_t::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(I8048_TAG":1", victor9k_floppies, "525qd", victor_9000_fdc_t::floppy_formats) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor victor_9000_fdc_t::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( victor_9000_fdc ); +} + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// victor_9000_fdc_t - constructor +//------------------------------------------------- + +victor_9000_fdc_t::victor_9000_fdc_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, VICTOR_9000_FDC, "Victor 9000 FDC", tag, owner, clock, "victor9k_fdc", __FILE__), + m_ds0_cb(*this), + m_ds1_cb(*this), + m_rdy0_cb(*this), + m_rdy1_cb(*this), + m_brdy_cb(*this), + m_gcrerr_cb(*this), + m_maincpu(*this, I8048_TAG), + m_floppy0(*this, I8048_TAG":0:525qd"), + m_floppy1(*this, I8048_TAG":1:525qd"), + m_gcr_rom(*this, "gcr"), + m_da(0), + m_da0(0), + m_da1(0), + m_sel0(0), + m_sel1(0), + m_tach0(0), + m_tach1(0), + m_rdy0(0), + m_rdy1(0), + m_ds0(1), + m_ds1(1), + m_lms(0), + m_st0(0), + m_st1(0), + m_stp0(0), + m_stp1(0), + m_drive(0), + m_side(0), + m_brdy(1), + m_sync(1), + m_gcrerr(0) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void victor_9000_fdc_t::device_start() +{ + // state saving + save_item(NAME(m_da)); + save_item(NAME(m_da0)); + save_item(NAME(m_da1)); + save_item(NAME(m_sel0)); + save_item(NAME(m_sel1)); + save_item(NAME(m_tach0)); + save_item(NAME(m_tach1)); + save_item(NAME(m_rdy0)); + save_item(NAME(m_rdy1)); + save_item(NAME(m_ds0)); + save_item(NAME(m_ds1)); + save_item(NAME(m_lms)); + save_item(NAME(m_st0)); + save_item(NAME(m_st1)); + save_item(NAME(m_stp0)); + save_item(NAME(m_stp1)); + save_item(NAME(m_drive)); + save_item(NAME(m_side)); + save_item(NAME(m_brdy)); + save_item(NAME(m_sync)); + save_item(NAME(m_gcrerr)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void victor_9000_fdc_t::device_reset() +{ + // resolve callbacks + m_ds0_cb.resolve_safe(); + m_ds1_cb.resolve_safe(); + m_rdy0_cb.resolve_safe(); + m_rdy1_cb.resolve_safe(); + m_brdy_cb.resolve_safe(); + m_gcrerr_cb.resolve_safe(); + + // set floppy callbacks + m_floppy0->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor_9000_fdc_t::ready0_cb), this)); + m_floppy0->setup_load_cb(floppy_image_device::load_cb(FUNC(victor_9000_fdc_t::load0_cb), this)); + m_floppy0->setup_unload_cb(floppy_image_device::unload_cb(FUNC(victor_9000_fdc_t::unload0_cb), this)); + m_floppy1->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor_9000_fdc_t::ready1_cb), this)); + m_floppy1->setup_load_cb(floppy_image_device::load_cb(FUNC(victor_9000_fdc_t::load1_cb), this)); + m_floppy1->setup_unload_cb(floppy_image_device::unload_cb(FUNC(victor_9000_fdc_t::unload1_cb), this)); +} + + +//------------------------------------------------- +// device_timer - handler timer events +//------------------------------------------------- + +void victor_9000_fdc_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ +} + + +//------------------------------------------------- +// floppy_p1_r - +//------------------------------------------------- + +READ8_MEMBER( victor_9000_fdc_t::floppy_p1_r ) +{ + /* + + bit description + + 0 L0MS0 + 1 L0MS1 + 2 L0MS2 + 3 L0MS3 + 4 L1MS0 + 5 L1MS1 + 6 L1MS2 + 7 L1MS3 + + */ + + return m_lms; +} + + +//------------------------------------------------- +// floppy_p2_r - +//------------------------------------------------- + +READ8_MEMBER( victor_9000_fdc_t::floppy_p2_r ) +{ + /* + + bit description + + 0 + 1 + 2 + 3 + 4 + 5 + 6 RDY0 + 7 RDY1 + + */ + + UINT8 data = 0; + + data |= m_rdy0 << 6; + data |= m_rdy1 << 7; + + return data; +} + + +//------------------------------------------------- +// floppy_p2_w - +//------------------------------------------------- + +WRITE8_MEMBER( victor_9000_fdc_t::floppy_p2_w ) +{ + /* + + bit description + + 0 START0 + 1 STOP0 + 2 START1 + 3 STOP1 + 4 SEL1 + 5 SEL0 + 6 + 7 + + */ + + if (BIT(data, 0)) m_floppy0->mon_w(0); + if (BIT(data, 1)) m_floppy0->mon_w(1); + if (BIT(data, 2)) m_floppy1->mon_w(0); + if (BIT(data, 3)) m_floppy1->mon_w(1); + + int sel0 = BIT(data, 5); + + if (m_sel0 && !sel0) + { + m_da0 = m_da; + //m_floppy0->set_rpm(); + } + + m_sel0 = sel0; + + int sel1 = BIT(data, 4); + + if (m_sel1 && !sel1) + { + m_da1 = m_da; + //m_floppy1->set_rpm(); + } + + m_sel1 = sel1; +} + + +//------------------------------------------------- +// tach0_r - +//------------------------------------------------- + +READ8_MEMBER( victor_9000_fdc_t::tach0_r ) +{ + return m_tach0; +} + + +//------------------------------------------------- +// tach1_r - +//------------------------------------------------- + +READ8_MEMBER( victor_9000_fdc_t::tach1_r ) +{ + return m_tach1; +} + + +//------------------------------------------------- +// da_w - +//------------------------------------------------- + +WRITE8_MEMBER( victor_9000_fdc_t::da_w ) +{ + m_da = data; +} diff --git a/src/mess/machine/victor9k_fdc.h b/src/mess/machine/victor9k_fdc.h new file mode 100644 index 00000000000..29ad7004ce1 --- /dev/null +++ b/src/mess/machine/victor9k_fdc.h @@ -0,0 +1,168 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Victor 9000 floppy disk controller emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#pragma once + +#ifndef __VICTOR_9000_FDC__ +#define __VICTOR_9000_FDC__ + +#include "emu.h" +#include "cpu/mcs48/mcs48.h" +#include "formats/victor9k_dsk.h" +#include "imagedev/floppy.h" + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_VICTOR_9000_FDC_DS0_CB(_write) \ + devcb = &victor_9000_fdc_t::set_ds0_wr_callback(*device, DEVCB_##_write); + +#define MCFG_VICTOR_9000_FDC_DS1_CB(_write) \ + devcb = &victor_9000_fdc_t::set_ds1_wr_callback(*device, DEVCB_##_write); + +#define MCFG_VICTOR_9000_FDC_RDY0_CB(_write) \ + devcb = &victor_9000_fdc_t::set_rdy0_wr_callback(*device, DEVCB_##_write); + +#define MCFG_VICTOR_9000_FDC_RDY1_CB(_write) \ + devcb = &victor_9000_fdc_t::set_rdy1_wr_callback(*device, DEVCB_##_write); + +#define MCFG_VICTOR_9000_FDC_BRDY_CB(_write) \ + devcb = &victor_9000_fdc_t::set_brdy_wr_callback(*device, DEVCB_##_write); + +#define MCFG_VICTOR_9000_FDC_GCRERR_CB(_write) \ + devcb = &victor_9000_fdc_t::set_gcrerr_wr_callback(*device, DEVCB_##_write); + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> victor_9000_fdc_t + +class victor_9000_fdc_t : public device_t +{ +public: + // construction/destruction + victor_9000_fdc_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + template static devcb_base &set_ds0_wr_callback(device_t &device, _Object object) { return downcast(device).m_ds0_cb.set_callback(object); } + template static devcb_base &set_ds1_wr_callback(device_t &device, _Object object) { return downcast(device).m_ds1_cb.set_callback(object); } + template static devcb_base &set_rdy0_wr_callback(device_t &device, _Object object) { return downcast(device).m_rdy0_cb.set_callback(object); } + template static devcb_base &set_rdy1_wr_callback(device_t &device, _Object object) { return downcast(device).m_rdy1_cb.set_callback(object); } + template static devcb_base &set_brdy_wr_callback(device_t &device, _Object object) { return downcast(device).m_brdy_cb.set_callback(object); } + template static devcb_base &set_gcrerr_wr_callback(device_t &device, _Object object) { return downcast(device).m_gcrerr_cb.set_callback(object); } + + void set_floppy(floppy_image_device *floppy0, floppy_image_device *floppy1); + + void l0ms_w(UINT8 data) { m_lms = (m_lms & 0xf0) | (data & 0x0f); } + void l1ms_w(UINT8 data) { m_lms = (data << 4) | (m_lms & 0x0f); } + void st0_w(UINT8 data) { m_st0 = data; } + void st1_w(UINT8 data) { m_st1 = data; } + DECLARE_WRITE_LINE_MEMBER( side_select_w ) { m_side = state; } + DECLARE_WRITE_LINE_MEMBER( drive_select_w ) { m_drive = state; } + DECLARE_WRITE_LINE_MEMBER( stp0_w ) { m_stp0 = state; } + DECLARE_WRITE_LINE_MEMBER( stp1_w ) { m_stp1 = state; } + DECLARE_WRITE_LINE_MEMBER( drw_w ) { } + DECLARE_WRITE_LINE_MEMBER( erase_w ) { } + DECLARE_READ_LINE_MEMBER( trk0d0_r ) { return m_floppy0->trk00_r(); } + DECLARE_READ_LINE_MEMBER( trk0d1_r ) { return m_floppy1->trk00_r(); } + DECLARE_READ_LINE_MEMBER( wps_r ) { return m_drive ? m_floppy1->wpt_r() : m_floppy0->wpt_r(); } + DECLARE_READ_LINE_MEMBER( sync_r ) { return 1; } + DECLARE_WRITE_LINE_MEMBER( led0a_w ) { output_set_led_value(LED_A, state); } + DECLARE_WRITE_LINE_MEMBER( led1a_w ) { output_set_led_value(LED_B, state); } + DECLARE_READ_LINE_MEMBER( rdy0_r ) { return m_rdy0; } + DECLARE_READ_LINE_MEMBER( rdy1_r ) { return m_rdy1; } + DECLARE_READ_LINE_MEMBER( ds0_r ) { return m_ds0; } + DECLARE_READ_LINE_MEMBER( ds1_r ) { return m_ds1; } + DECLARE_READ_LINE_MEMBER( single_double_sided_r ) { return m_drive ? m_floppy1->twosid_r() : m_floppy0->twosid_r(); } + DECLARE_WRITE_LINE_MEMBER( screset_w ) { if (!state) m_maincpu->reset(); } + + DECLARE_FLOPPY_FORMATS( floppy_formats ); + + DECLARE_READ8_MEMBER( floppy_p1_r ); + DECLARE_READ8_MEMBER( floppy_p2_r ); + DECLARE_WRITE8_MEMBER( floppy_p2_w ); + DECLARE_READ8_MEMBER( tach0_r ); + DECLARE_READ8_MEMBER( tach1_r ); + DECLARE_WRITE8_MEMBER( da_w ); + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + + // optional information overrides + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + +private: + enum + { + LED_A = 0, + LED_B + }; + + devcb_write_line m_ds0_cb; + devcb_write_line m_ds1_cb; + devcb_write_line m_rdy0_cb; + devcb_write_line m_rdy1_cb; + devcb_write_line m_brdy_cb; + devcb_write_line m_gcrerr_cb; + + required_device m_maincpu; + required_device m_floppy0; + required_device m_floppy1; + required_memory_region m_gcr_rom; + + void ready0_cb(floppy_image_device *, int device); + int load0_cb(floppy_image_device *device); + void unload0_cb(floppy_image_device *device); + void ready1_cb(floppy_image_device *, int device); + int load1_cb(floppy_image_device *device); + void unload1_cb(floppy_image_device *device); + + /* floppy state */ + UINT8 m_da; + UINT8 m_da0; + UINT8 m_da1; + int m_sel0; + int m_sel1; + int m_tach0; + int m_tach1; + int m_rdy0; + int m_rdy1; + int m_ds0; + int m_ds1; + UINT8 m_lms; /* motor speed */ + int m_st0; /* stepper phase */ + int m_st1; /* stepper phase */ + int m_stp0; /* stepper enable */ + int m_stp1; /* stepper enable */ + int m_drive; /* selected drive */ + int m_side; /* selected side */ + int m_brdy; + int m_sync; + int m_gcrerr; +}; + + + +// device type definition +extern const device_type VICTOR_9000_FDC; + + + +#endif diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 5fae2ae397b..ecbf893da17 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -959,7 +959,7 @@ $(MESSOBJ)/act.a: \ $(MESS_DRIVERS)/apricotf.o \ $(MESS_DRIVERS)/apricotp.o \ $(MESS_MACHINE)/apricotkb.o \ - $(MESS_DRIVERS)/victor9k.o $(MESS_MACHINE)/victor9kb.o \ + $(MESS_DRIVERS)/victor9k.o $(MESS_MACHINE)/victor9kb.o $(MESS_MACHINE)/victor9k_fdc.o \ $(MESSOBJ)/adc.a: \ $(MESS_DRIVERS)/super6.o \