summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/src/bus.lua2
-rw-r--r--src/devices/bus/qbus/bk_kmd.cpp102
-rw-r--r--src/devices/bus/qbus/bk_kmd.h48
-rw-r--r--src/devices/bus/qbus/qbus.cpp2
-rw-r--r--src/devices/bus/qbus/qbus.h1
-rw-r--r--src/devices/cpu/t11/t11ops.hxx4
-rw-r--r--src/devices/machine/1801vp128.h2
-rw-r--r--src/mame/ussr/bk.cpp64
-rw-r--r--src/mame/ussr/bk.h6
-rw-r--r--src/mame/ussr/bk_m.cpp49
10 files changed, 201 insertions, 79 deletions
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<k1801vp128_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 <typename T> void set_space(T &&tag, int spacenum) { m_space.set_tag(std::forward<T>(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<floppy_connector, 4> m_connectors;
+ optional_device_array<floppy_connector, 4> 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_slot_device>("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);