diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 2e78d8fe846..160d5772b68 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2636,6 +2636,8 @@ files { MAME_DIR .. "src/mame/drivers/pcipc.cpp", MAME_DIR .. "src/mame/drivers/tandy1t.cpp", MAME_DIR .. "src/mame/drivers/tosh1000.cpp", + MAME_DIR .. "src/mame/machine/tosh1000_bram.cpp", + MAME_DIR .. "src/mame/machine/tosh1000_bram.h", MAME_DIR .. "src/mame/drivers/compc.cpp", MAME_DIR .. "src/mame/video/pc_t1t.cpp", MAME_DIR .. "src/mame/video/pc_t1t.h", diff --git a/src/mame/drivers/tosh1000.cpp b/src/mame/drivers/tosh1000.cpp index 7130c47de77..f53b6662436 100644 --- a/src/mame/drivers/tosh1000.cpp +++ b/src/mame/drivers/tosh1000.cpp @@ -26,11 +26,12 @@ - backup ram (stores config.sys) - HardRAM (static RAM board) - native keyboard (MCU dump missing) - - font selector (CRTC register 0x12) + - font selector (CRTC register 0x12; DIP switches PJ20, PJ21) Useful links: - board photo: http://s8.hostingkartinok.com/uploads/images/2016/05/579e9d152bc772d9c16bc8ac611eb97f.jpg - manuals: http://www.minuszerodegrees.net/manuals/Toshiba/Toshiba.htm + - http://www.seasip.info/VintagePC/t1000.html ***************************************************************************/ @@ -44,6 +45,7 @@ #include "machine/bankdev.h" #include "machine/ram.h" #include "machine/rp5c01.h" +#include "machine/tosh1000_bram.h" #include "softlist.h" @@ -67,6 +69,7 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_bankdev(*this, "bankdev") + , m_bram(*this, "bram") { } DECLARE_MACHINE_RESET(tosh1000); @@ -75,9 +78,22 @@ public: DECLARE_WRITE8_MEMBER(romdos_bank_w); DECLARE_READ8_MEMBER(romdos_bank_r); + DECLARE_WRITE8_MEMBER(bram_w); + DECLARE_READ8_MEMBER(bram_r); + protected: required_device m_maincpu; required_device m_bankdev; + required_device m_bram; + +private: + enum { + IDLE, READ_DATA, WRITE_DATA + }; + + bool m_bram_latch = false; + int m_bram_offset = 0; + int m_bram_state = IDLE; }; @@ -87,6 +103,9 @@ DRIVER_INIT_MEMBER(tosh1000_state, tosh1000) MACHINE_RESET_MEMBER(tosh1000_state, tosh1000) { + m_bram_latch = false; + m_bram_offset = 0; + m_bram_state = IDLE; m_bankdev->set_bank(8); } @@ -105,6 +124,92 @@ WRITE8_MEMBER(tosh1000_state::romdos_bank_w) } } +WRITE8_MEMBER(tosh1000_state::bram_w) +{ + DBG_LOG(2, "BRAM", ("%02x <- %02x\n", 0xc0 + offset, data)); + + switch (offset) + { + case 1: + if (m_bram_latch) + { + DBG_LOG(1, "Backup RAM", ("%02x <- %02x\n", m_bram_offset % 160, data)); + m_bram->write(m_bram_offset % 160, data); + m_bram_offset++; + } + else + { + if (m_bram_state == WRITE_DATA) + { + m_bram_latch = true; + m_bram_offset = 0; + } + } + break; + + case 3: + switch (data & 0xc0) + { + case 0: + m_bram_state = IDLE; + break; + + case 0x40: + m_bram_state = READ_DATA; + break; + + case 0x80: + m_bram_state = WRITE_DATA; + m_bram_latch = false; + break; + + default: + m_bram_state = IDLE; + break; + } + break; + } +} + +READ8_MEMBER(tosh1000_state::bram_r) +{ + uint8_t data = 0; + + switch (offset) + { + case 2: + if (m_bram_state == READ_DATA) + { + data = m_bram->read(m_bram_offset % 160); + DBG_LOG(1, "BRAM", ("@ %02x == %02x\n", m_bram_offset % 160, data)); + m_bram_offset++; + } + break; + + case 3: + data = 0x2c; + switch (m_bram_state) + { + case IDLE: + // bit 4 -- floppy drive disk change signal + break; + + case READ_DATA: + data |= 0x43; // always ready to read (and write ??) + break; + + case WRITE_DATA: + data |= 0x82; // always ready to write + break; + } + break; + } + + DBG_LOG(2, "BRAM", ("%02x == %02x\n", 0xc0 + offset, data)); + + return data; +} + static ADDRESS_MAP_START( tosh1000_romdos, AS_PROGRAM, 8, tosh1000_state ) AM_RANGE(0x00000, 0x0ffff) AM_ROM AM_REGION("romdos", 0) @@ -126,6 +231,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( tosh1000_io, AS_IO, 8, tosh1000_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0x00ff) AM_DEVICE("mb", ibm5160_mb_device, map) + AM_RANGE(0x00c0, 0x00c3) AM_READWRITE(bram_r, bram_w) AM_RANGE(0x00c8, 0x00c8) AM_WRITE(romdos_bank_w) // ROM-DOS page select [p. B-15] AM_RANGE(0x02c0, 0x02df) AM_DEVREADWRITE("rtc", tc8521_device, read, write) ADDRESS_MAP_END @@ -173,6 +279,8 @@ static MACHINE_CONFIG_START( tosh1000 ) MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("512K") + + MCFG_TOSH1000_BRAM_ADD("bram") MACHINE_CONFIG_END diff --git a/src/mame/machine/tosh1000_bram.cpp b/src/mame/machine/tosh1000_bram.cpp new file mode 100644 index 00000000000..6fcc19a305d --- /dev/null +++ b/src/mame/machine/tosh1000_bram.cpp @@ -0,0 +1,92 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + Toshiba 1000 Backup RAM + + Simulation of interface provided by 80C50 keyboard controller. + +***************************************************************************/ + +#include "emu.h" +#include "tosh1000_bram.h" + + +DEFINE_DEVICE_TYPE(TOSH1000_BRAM, tosh1000_bram_device, "tosh1000_bram", "Toshiba T1000 Backup RAM") + +//------------------------------------------------- +// ctor +//------------------------------------------------- + +tosh1000_bram_device::tosh1000_bram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, TOSH1000_BRAM, tag, owner, clock) + , device_nvram_interface(mconfig, *this) +{ +} + +uint8_t tosh1000_bram_device::read(int offset) +{ + return m_bram[offset]; +} + +void tosh1000_bram_device::write(int offset, uint8_t data) +{ + m_bram[offset] = data; +} + +READ8_MEMBER( tosh1000_bram_device::read ) +{ + return m_bram[offset]; +} + +WRITE8_MEMBER( tosh1000_bram_device::write ) +{ + m_bram[offset] = data; +} + +//------------------------------------------------- +// nvram_default - called to initialize NVRAM to +// its default state +//------------------------------------------------- + +void tosh1000_bram_device::nvram_default() +{ + memset(m_bram, 0x1a, BRAM_SIZE); +} + +//------------------------------------------------- +// nvram_read - called to read NVRAM from the +// .nv file +//------------------------------------------------- + +void tosh1000_bram_device::nvram_read(emu_file &file) +{ + file.read(m_bram, BRAM_SIZE); +} + +//------------------------------------------------- +// nvram_write - called to write NVRAM to the +// .nv file +//------------------------------------------------- + +void tosh1000_bram_device::nvram_write(emu_file &file) +{ + file.write(m_bram, BRAM_SIZE); +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- +void tosh1000_bram_device::device_start() +{ + /* register for save states */ + save_item(NAME(m_bram)); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void tosh1000_bram_device::device_reset() +{ +} diff --git a/src/mame/machine/tosh1000_bram.h b/src/mame/machine/tosh1000_bram.h new file mode 100644 index 00000000000..de38c9a9ae6 --- /dev/null +++ b/src/mame/machine/tosh1000_bram.h @@ -0,0 +1,57 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + Toshiba 1000 Backup RAM + + Simulation of interface provided by 80C50 keyboard controller. + +***************************************************************************/ + +#ifndef __TOSH1000_BRAM_H__ +#define __TOSH1000_BRAM_H__ + +/*************************************************************************** + DEVICE CONFIGURATION MACROS +***************************************************************************/ + +#define MCFG_TOSH1000_BRAM_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, TOSH1000_BRAM, 0) + + +#define BRAM_SIZE 160 + +// ======================> tosh1000_bram_device + +class tosh1000_bram_device : public device_t, + public device_nvram_interface +{ +public: + // construction/destruction + tosh1000_bram_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_reset() override; + + // device_nvram_interface overrides + virtual void nvram_default() override; + virtual void nvram_read(emu_file &file) override; + virtual void nvram_write(emu_file &file) override; + +public: + DECLARE_READ8_MEMBER( read ); + DECLARE_WRITE8_MEMBER( write ); + + uint8_t read(int offset); + void write(int offset, uint8_t data); + +private: + uint8_t m_bram[BRAM_SIZE]; +}; + +// device type definition +extern const device_type TOSH1000_BRAM; + +#endif