Merge pull request #2969 from shattered/_b26597f

tosh1000: hook up NVRAM for CONFIG.SYS storage
This commit is contained in:
R. Belmont 2017-12-24 12:04:13 -05:00 committed by GitHub
commit bfffc50606
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 260 additions and 1 deletions

View File

@ -2635,6 +2635,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",

View File

@ -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<cpu_device> m_maincpu;
required_device<address_map_bank_device> m_bankdev;
required_device<tosh1000_bram_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

View File

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

View File

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