From 32195e58605361b1df614c7e16704c64ac79349c Mon Sep 17 00:00:00 2001 From: shattered Date: Sat, 19 Oct 2024 20:31:02 +0300 Subject: ussr/bk: attach floppy (#12889) cpu/t11: VM1 does not use RMW bus transaction for MOV and MOVB insns (fixes writing to floppy) --- scripts/src/bus.lua | 2 + src/devices/bus/qbus/bk_kmd.cpp | 102 ++++++++++++++++++++++++++++++++++++++++ src/devices/bus/qbus/bk_kmd.h | 48 +++++++++++++++++++ src/devices/bus/qbus/qbus.cpp | 2 + src/devices/bus/qbus/qbus.h | 1 + src/devices/cpu/t11/t11ops.hxx | 4 +- src/devices/machine/1801vp128.h | 2 +- src/mame/ussr/bk.cpp | 64 ++++++++++--------------- src/mame/ussr/bk.h | 6 +-- src/mame/ussr/bk_m.cpp | 49 +++++++------------ 10 files changed, 201 insertions(+), 79 deletions(-) create mode 100644 src/devices/bus/qbus/bk_kmd.cpp create mode 100644 src/devices/bus/qbus/bk_kmd.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index b20bbf3a135..3d8d03c6575 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -4748,6 +4748,8 @@ end if (BUSES["QBUS"]~=null) then files { + MAME_DIR .. "src/devices/bus/qbus/bk_kmd.cpp", + MAME_DIR .. "src/devices/bus/qbus/bk_kmd.h", MAME_DIR .. "src/devices/bus/qbus/dsd4432.cpp", MAME_DIR .. "src/devices/bus/qbus/dsd4432.h", MAME_DIR .. "src/devices/bus/qbus/dvk_kgd.cpp", diff --git a/src/devices/bus/qbus/bk_kmd.cpp b/src/devices/bus/qbus/bk_kmd.cpp new file mode 100644 index 00000000000..664034c43ac --- /dev/null +++ b/src/devices/bus/qbus/bk_kmd.cpp @@ -0,0 +1,102 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + BK0011 floppy controller (device driver BY.SYS) + + Also compatible with BK0010. + + ROM revisions: + - 253 -- shipped with BK0011; supports 10-sector format only (800 KB) + - 326 -- shipped with BK0011M; also supports 9-sector format (720 KB) + - 327v12 -- 3rd party; also supports PC formats (without Index Mark) + +***************************************************************************/ + +#include "emu.h" + +#include "formats/bk0010_dsk.h" + +#include "bk_kmd.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(BK_KMD, bk_kmd_device, "bk_kmd", "BK0010 floppy") + +ROM_START(bk_kmd) + ROM_REGION(0x1000, "maincpu", 0) + ROM_DEFAULT_BIOS("326") + ROM_SYSTEM_BIOS(0, "253", "mask 253") + ROMX_LOAD("disk_253.rom", 0, 0x1000, CRC(7a21b887) SHA1(f2c08147558816c59f0ef59e7c40ccb4b555e887), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "326", "mask 326") + ROMX_LOAD("disk_326.rom", 0, 0x1000, CRC(fde7583d) SHA1(14f29dcb0fa81f7f1a8efade0bda66b042e47aba), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "327v12", "327 v12") // "FDD/HDD BIOS 327 V12 (c) JD/DWG!" -- modified mask 326 + ROMX_LOAD("disk_327.rom", 0, 0x1000, CRC(ed8a43ae) SHA1(28eefbb63047b26e4aec104aeeca74e2f9d0276c), ROM_BIOS(2)) +ROM_END + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bk_kmd_device - constructor +//------------------------------------------------- + +bk_kmd_device::bk_kmd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, BK_KMD, tag, owner, clock) + , device_qbus_card_interface(mconfig, *this) + , m_fdc(*this, "fdc") +{ +} + +void bk_kmd_device::floppy_formats(format_registration &fr) +{ + fr.add_mfm_containers(); + fr.add(FLOPPY_BK0010_FORMAT); +} + +static void bk_floppies(device_slot_interface &device) +{ + device.option_add("525qd", FLOPPY_525_QD); +} + +const tiny_rom_entry *bk_kmd_device::device_rom_region() const +{ + return ROM_NAME(bk_kmd); +} + +void bk_kmd_device::device_add_mconfig(machine_config &config) +{ + K1801VP128(config, m_fdc, XTAL(4'000'000)); + m_fdc->ds_in_callback().set( + [] (uint16_t data) -> uint16_t + { + switch (data & 15) + { + case 1: return 0; + case 2: return 1; + default: return -1; + } + }); + FLOPPY_CONNECTOR(config, "fdc:0", bk_floppies, "525qd", bk_kmd_device::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:1", bk_floppies, "525qd", bk_kmd_device::floppy_formats); +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bk_kmd_device::device_start() +{ + m_bus->install_device(0177130, 0177133, + emu::rw_delegate(m_fdc, FUNC(k1801vp128_device::read)), + emu::rw_delegate(m_fdc, FUNC(k1801vp128_device::write)) + ); + m_bus->program_space().install_rom(0160000, 0167777, memregion(this->subtag("maincpu").c_str())->base()); +} + diff --git a/src/devices/bus/qbus/bk_kmd.h b/src/devices/bus/qbus/bk_kmd.h new file mode 100644 index 00000000000..ccd0e5722a9 --- /dev/null +++ b/src/devices/bus/qbus/bk_kmd.h @@ -0,0 +1,48 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + BK0011 floppy controller (device driver BY.SYS) + +***************************************************************************/ + +#ifndef MAME_BUS_QBUS_BK_KMD_H +#define MAME_BUS_QBUS_BK_KMD_H + +#pragma once + +#include "machine/1801vp128.h" + +#include "qbus.h" + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +// ======================> bk_kmd_device + +class bk_kmd_device : public device_t, + public device_qbus_card_interface +{ +public: + // construction/destruction + bk_kmd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + + required_device m_fdc; + +private: + static void floppy_formats(format_registration &fr); +}; + + +// device type definition +DECLARE_DEVICE_TYPE(BK_KMD, bk_kmd_device) + +#endif diff --git a/src/devices/bus/qbus/qbus.cpp b/src/devices/bus/qbus/qbus.cpp index 01229c459bd..a5293df0c46 100644 --- a/src/devices/bus/qbus/qbus.cpp +++ b/src/devices/bus/qbus/qbus.cpp @@ -11,6 +11,7 @@ #include "qbus.h" // Peripheral boards +#include "bk_kmd.h" #include "dsd4432.h" #include "dvk_kgd.h" #include "dvk_mx.h" @@ -29,6 +30,7 @@ void qbus_cards(device_slot_interface &device) device.option_add("mx", DVK_MX); device.option_add("mz", UKNC_KMD); device.option_add("qg640", MATROX_QG640); + device.option_add("by", BK_KMD); } diff --git a/src/devices/bus/qbus/qbus.h b/src/devices/bus/qbus/qbus.h index 613e366546a..c33af439080 100644 --- a/src/devices/bus/qbus/qbus.h +++ b/src/devices/bus/qbus/qbus.h @@ -73,6 +73,7 @@ public: template void set_space(T &&tag, int spacenum) { m_space.set_tag(std::forward(tag), spacenum); } virtual space_config_vector memory_space_config() const override; + address_space &program_space() const { return *m_space; } auto birq4() { return m_out_birq4_cb.bind(); } auto birq5() { return m_out_birq6_cb.bind(); } diff --git a/src/devices/cpu/t11/t11ops.hxx b/src/devices/cpu/t11/t11ops.hxx index c34936e2983..bae21eab67d 100644 --- a/src/devices/cpu/t11/t11ops.hxx +++ b/src/devices/cpu/t11/t11ops.hxx @@ -219,10 +219,10 @@ #define MFPS_M(d) int dreg, result, ea; result = PSW; CLR_NZV; SETB_NZ; PUT_DB_##d(result) /* MOV: dst = src */ #define MOV_R(s,d) int sreg, dreg, source, result; GET_SW_##s; CLR_NZV; result = source; SETW_NZ; PUT_DW_##d(result) -#define MOV_M(s,d) int sreg, dreg, source, result, ea; GET_SW_##s; CLR_NZV; result = source; SETW_NZ; PUT_DWT_##d(result) +#define MOV_M(s,d) int sreg, dreg, source, result, ea; GET_SW_##s; CLR_NZV; result = source; SETW_NZ; if (c_insn_set & IS_VM1) { PUT_DW_##d(result); } else { PUT_DWT_##d(result); } #define MOVB_R(s,d) int sreg, dreg, source, result; GET_SB_##s; CLR_NZV; result = source; SETB_NZ; PUT_DW_##d((signed char)result) #define MOVB_X(s,d) int sreg, dreg, source, result, ea; GET_SB_##s; CLR_NZV; result = source; SETB_NZ; PUT_DW_##d((signed char)result) -#define MOVB_M(s,d) int sreg, dreg, source, result, ea; GET_SB_##s; CLR_NZV; result = source; SETB_NZ; PUT_DBT_##d(result) +#define MOVB_M(s,d) int sreg, dreg, source, result, ea; GET_SB_##s; CLR_NZV; result = source; SETB_NZ; if (c_insn_set & IS_VM1) { PUT_DB_##d(result); } else { PUT_DBT_##d(result); } /* MTPS: flags = src */ #define MTPS_R(d) int dreg, dest; GET_DB_##d; PSW = (PSW & ~0xef) | (dest & 0xef); m_check_irqs = true #define MTPS_M(d) int dreg, dest, ea; GET_DB_##d; PSW = (PSW & ~0xef) | (dest & 0xef); m_check_irqs = true diff --git a/src/devices/machine/1801vp128.h b/src/devices/machine/1801vp128.h index 964a80ecf8e..44559d33ce0 100644 --- a/src/devices/machine/1801vp128.h +++ b/src/devices/machine/1801vp128.h @@ -163,7 +163,7 @@ private: fdc_pll_t pll; }; - required_device_array m_connectors; + optional_device_array m_connectors; devcb_read16 m_read_ds; std::string ttsn() const; diff --git a/src/mame/ussr/bk.cpp b/src/mame/ussr/bk.cpp index dd8b084129b..41313f17948 100644 --- a/src/mame/ussr/bk.cpp +++ b/src/mame/ussr/bk.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Miodrag Milanovic +// copyright-holders:Miodrag Milanovic, Sergey Svishchev /*************************************************************************** BK driver by Miodrag Milanovic @@ -7,19 +7,15 @@ BK driver by Miodrag Milanovic 2008-03-10 Preliminary driver. -TODO: -- Tape motor on/off to be emulated. - - BK0010 - error message at start - thrown into monitor. H for help. - Can use M to load a tape. How to run it? + Can use M to load a tape and S to run it. - BK001001 - can load its own recordings, but cannot proceed past the header of software-list items. However...if you enter the Monitor with MON, enter M, enter the filename - (case sensitive), start tape - it loads. But then, how to run it? + (case sensitive), start tape - it loads. Use S to run it. -- BK0010FD - continually reboots. The system expects a rom at A000. Can be - patched by writing 0087 to address A000 in the debugger at start. +- BK0010FD - can boot ANDOS. Use S160000 in Monitor to run it. - BK0011M - black screen. No emulation of this variant has been done. - BK0011M - 128KB RAM, clock speed 4MHz by default, floppy drive facility. @@ -41,32 +37,22 @@ TODO: /* Address maps */ void bk_state::bk0010_mem(address_map &map) { - map(0x0000, 0xffff).rw(FUNC(bk_state::trap_r), FUNC(bk_state::trap_w)); - map(0x0000, 0x3fff).ram(); - map(0x4000, 0x7fff).ram().share("videoram"); - map(0x8000, 0xfeff).rom().region("maincpu",0); - map(0xffb0, 0xffb3).r(m_kbd, FUNC(k1801vp014_device::read)); - map(0xffb0, 0xffb1).w(m_kbd, FUNC(k1801vp014_device::write)); - map(0xffb4, 0xffb5).rw(FUNC(bk_state::vid_scroll_r), FUNC(bk_state::vid_scroll_w)); - map(0xffcc, 0xffcd).noprw(); - map(0xffce, 0xffcf).rw(FUNC(bk_state::sel1_r), FUNC(bk_state::sel1_w)); + map(0000000, 0177777).rw(FUNC(bk_state::trap_r), FUNC(bk_state::trap_w)); + + map(0000000, 0037777).ram(); + map(0040000, 0077777).ram().share("videoram"); + map(0100000, 0177577).rom().region("maincpu",0); + map(0177660, 0177663).r(m_kbd, FUNC(k1801vp014_device::read)); + map(0177660, 0177661).w(m_kbd, FUNC(k1801vp014_device::write)); + map(0177664, 0177665).rw(FUNC(bk_state::vid_scroll_r), FUNC(bk_state::vid_scroll_w)); + map(0177714, 0177715).noprw(); + map(0177716, 0177717).rw(FUNC(bk_state::sel1_r), FUNC(bk_state::sel1_w)); } void bk_state::bk0010fd_mem(address_map &map) { - map(0x0000, 0xffff).rw(FUNC(bk_state::trap_r), FUNC(bk_state::trap_w)); - map(0x0000, 0x3fff).ram(); - map(0x4000, 0x7fff).ram().share("videoram"); - map(0x8000, 0x9fff).rom().region("maincpu",0); - map(0xa000, 0xdfff).ram(); - map(0xe000, 0xfdff).rom().region("maincpu",0x6000); - map(0xfe58, 0xfe59).rw(FUNC(bk_state::floppy_cmd_r), FUNC(bk_state::floppy_cmd_w)); - map(0xfe5a, 0xfe5b).rw(FUNC(bk_state::floppy_data_r), FUNC(bk_state::floppy_data_w)); - map(0xffb0, 0xffb3).r(m_kbd, FUNC(k1801vp014_device::read)); - map(0xffb0, 0xffb1).w(m_kbd, FUNC(k1801vp014_device::write)); - map(0xffb4, 0xffb5).rw(FUNC(bk_state::vid_scroll_r), FUNC(bk_state::vid_scroll_w)); - map(0xffcc, 0xffcd).noprw(); - map(0xffce, 0xffcf).rw(FUNC(bk_state::sel1_r), FUNC(bk_state::sel1_w)); + bk0010_mem(map); + map(0120000, 0157777).ram(); } /* Input ports */ @@ -107,7 +93,7 @@ void bk_state::bk0010(machine_config &config) /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(50); + screen.set_refresh_hz(4000000.0/81920.0); screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ screen.set_size(512, 256); screen.set_visarea(0, 512-1, 0, 256-1); @@ -132,6 +118,8 @@ void bk_state::bk0010fd(machine_config &config) bk0010(config); /* basic machine hardware */ m_maincpu->set_addrmap(AS_PROGRAM, &bk_state::bk0010fd_mem); + + subdevice("qbus:1")->set_default_option("by"); } @@ -139,17 +127,17 @@ void bk_state::bk0010fd(machine_config &config) ROM_START( bk0010 ) ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "monit10.rom", 0x0000, 0x2000, CRC(26c6e8a0) SHA1(4e83a94ae5155bbea14d7331a5a8db82457bd5ae) ) // to 8000 - ROM_LOAD( "focal.rom", 0x2000, 0x2000, CRC(717149b7) SHA1(75df26f81ebd281bcb5c55ba81a7d97f31e388b2) ) // to A000 - ROM_LOAD( "tests.rom", 0x6000, 0x1f80, CRC(91aecb4d) SHA1(6b14d552045194a3004bb6b795a2538110921519) ) // to E000 + ROM_LOAD( "monit10.rom", 0x0000, 0x2000, CRC(26c6e8a0) SHA1(4e83a94ae5155bbea14d7331a5a8db82457bd5ae) ) // to 8000, mask 017 + ROM_LOAD( "focal.rom", 0x2000, 0x2000, CRC(717149b7) SHA1(75df26f81ebd281bcb5c55ba81a7d97f31e388b2) ) // to A000, mask 018 (socketed) + ROM_LOAD( "tests.rom", 0x6000, 0x1f80, CRC(91aecb4d) SHA1(6b14d552045194a3004bb6b795a2538110921519) ) // to E000, mask 019 (socketed) ROM_END ROM_START( bk001001 ) ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "monit10.rom", 0x0000, 0x2000, CRC(26c6e8a0) SHA1(4e83a94ae5155bbea14d7331a5a8db82457bd5ae) ) // to 8000 - ROM_LOAD( "basic10-1.rom", 0x2000, 0x2000, CRC(5e3ff5da) SHA1(5ea4db1eaac87bd0ac96e52a608bc783709f5042) ) // to A000 - ROM_LOAD( "basic10-2.rom", 0x4000, 0x2000, CRC(ea63863c) SHA1(acf068925e4052989b05dd5cf736a1dab5438011) ) // to C000 - ROM_LOAD( "basic10-3.rom", 0x6000, 0x1f80, CRC(63f3df2e) SHA1(b5463f08e7c5f9f5aa31a2e7b6c1ed94fe029d65) ) // to E000 + ROM_LOAD( "monit10.rom", 0x0000, 0x2000, CRC(26c6e8a0) SHA1(4e83a94ae5155bbea14d7331a5a8db82457bd5ae) ) // to 8000, mask 017 + ROM_LOAD( "basic10-1.rom", 0x2000, 0x2000, CRC(5e3ff5da) SHA1(5ea4db1eaac87bd0ac96e52a608bc783709f5042) ) // to A000, mask 106 + ROM_LOAD( "basic10-2.rom", 0x4000, 0x2000, CRC(ea63863c) SHA1(acf068925e4052989b05dd5cf736a1dab5438011) ) // to C000, mask 107 + ROM_LOAD( "basic10-3.rom", 0x6000, 0x1f80, CRC(63f3df2e) SHA1(b5463f08e7c5f9f5aa31a2e7b6c1ed94fe029d65) ) // to E000, mask 108 ROM_END ROM_START( bk0010fd ) diff --git a/src/mame/ussr/bk.h b/src/mame/ussr/bk.h index 7e93e2ee54c..ca4196a0ba4 100644 --- a/src/mame/ussr/bk.h +++ b/src/mame/ussr/bk.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Miodrag Milanovic +// copyright-holders:Miodrag Milanovic, Sergey Svishchev /***************************************************************************** * * includes/bk.h @@ -54,10 +54,6 @@ private: void vid_scroll_w(uint16_t data); void sel1_w(uint16_t data); void trap_w(uint16_t data); - uint16_t floppy_cmd_r(); - void floppy_cmd_w(uint16_t data); - uint16_t floppy_data_r(); - void floppy_data_w(uint16_t data); void reset_w(int state); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); diff --git a/src/mame/ussr/bk_m.cpp b/src/mame/ussr/bk_m.cpp index 488989f9a60..356fca2aa5b 100644 --- a/src/mame/ussr/bk_m.cpp +++ b/src/mame/ussr/bk_m.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Miodrag Milanovic +// copyright-holders:Miodrag Milanovic, Sergey Svishchev /*************************************************************************** BK machine driver by Miodrag Milanovic @@ -40,6 +40,21 @@ uint16_t bk_state::vid_scroll_r() return m_scroll; } +// SEL1 register (0010 and 0010.01) +// +// 15-8 R high byte of cpu start address +// 7 R bitbanger cts in +// 7 W cassette motor control, 1: off 0: on +// 6 R keyboard any key down, 1: no 0: yes +// 6 W cassette data and speaker out +// 5 R cassette data in +// 5 W cassette data and bitbanger rts out +// 4 R bitbanger rx +// 4 W bitbanger tx +// 2 R updated +// +// only original 0010 has bitbanger wired to UP connector + uint16_t bk_state::sel1_r() { double level = m_cassette->input(); @@ -75,38 +90,6 @@ void bk_state::trap_w(uint16_t data) m_maincpu->pulse_input_line(t11_device::BUS_ERROR, attotime::zero); } -uint16_t bk_state::floppy_cmd_r() -{ - return 0; -} - -void bk_state::floppy_cmd_w(uint16_t data) -{ - if (BIT(data, 0)) - m_drive = 0; - - if (BIT(data, 1)) - m_drive = 1; - - if (BIT(data, 2)) - m_drive = 2; - - if (BIT(data, 3)) - m_drive = 3; - - if (data == 0) - m_drive = -1; -} - -uint16_t bk_state::floppy_data_r() -{ - return 0; -} - -void bk_state::floppy_data_w(uint16_t data) -{ -} - u32 bk_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { u16 const mini = !BIT(m_scroll, 9); -- cgit v1.2.3