ussr/bk: attach floppy (#12889)

cpu/t11: VM1 does not use RMW bus transaction for MOV and MOVB insns
(fixes writing to floppy)
This commit is contained in:
shattered 2024-10-19 20:31:02 +03:00 committed by GitHub
parent 6804ea9077
commit 32195e5860
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 201 additions and 79 deletions

View File

@ -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",

View File

@ -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());
}

View File

@ -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

View File

@ -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);
}

View File

@ -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(); }

View File

@ -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

View File

@ -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;

View File

@ -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 )

View File

@ -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);

View File

@ -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);