summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author arbee <rb6502@users.noreply.github.com>2016-05-23 17:35:25 -0400
committer arbee <rb6502@users.noreply.github.com>2016-05-23 17:35:25 -0400
commitf3995bf563da7ece2845a5e09244dc278a170e7e (patch)
treefd5243562e21bdc2f02ea333607c24a7dba1f695
parent9d7e38a8f2ed121ad30e195a2f46a3a5650b2478 (diff)
unixpc: use bankdev for ROM switch, started to fill out skeleton [R. Belmont]
-rw-r--r--src/mame/drivers/unixpc.cpp164
1 files changed, 148 insertions, 16 deletions
diff --git a/src/mame/drivers/unixpc.cpp b/src/mame/drivers/unixpc.cpp
index 4e8259840c7..63bbe281737 100644
--- a/src/mame/drivers/unixpc.cpp
+++ b/src/mame/drivers/unixpc.cpp
@@ -1,14 +1,17 @@
// license:GPL-2.0+
-// copyright-holders:Dirk Best
+// copyright-holders:Dirk Best, R. Belmont
/***************************************************************************
AT&T Unix PC series
- Skeleton driver
-
- Note: The 68k core needs restartable instruction support for this
- to have a chance to run.
-
+ Skeleton driver by Dirk Best and R. Belmont
+
+ DIVS instruction at 0x801112 (the second time) causes a divide-by-zero
+ exception the system isn't ready for due to word at 0x5EA6 being zero.
+
+ Code might not get there if the attempted FDC boot succeeds; FDC hookup
+ probably needs help. 2797 isn't asserting DRQ?
+
***************************************************************************/
@@ -16,6 +19,7 @@
#include "cpu/m68000/m68000.h"
#include "machine/ram.h"
#include "machine/wd_fdc.h"
+#include "machine/bankdev.h"
#include "unixpc.lh"
@@ -32,28 +36,49 @@ public:
m_ram(*this, RAM_TAG),
m_wd2797(*this, "wd2797"),
m_floppy(*this, "wd2797:0:525dd"),
+ m_ramrombank(*this, "ramrombank"),
m_mapram(*this, "mapram"),
- m_videoram(*this, "videoram"){ }
+ m_videoram(*this, "videoram")
+ { }
required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram;
required_device<wd2797_t> m_wd2797;
required_device<floppy_image_device> m_floppy;
+ required_device<address_map_bank_device> m_ramrombank;
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ virtual void machine_start() override;
virtual void machine_reset() override;
DECLARE_READ16_MEMBER( line_printer_r );
DECLARE_WRITE16_MEMBER( misc_control_w );
DECLARE_WRITE16_MEMBER( disk_control_w );
DECLARE_WRITE16_MEMBER( romlmap_w );
-
+ DECLARE_WRITE16_MEMBER( error_enable_w );
+ DECLARE_WRITE16_MEMBER( parity_enable_w );
+ DECLARE_WRITE16_MEMBER( bpplus_w );
+ DECLARE_READ16_MEMBER( ram_mmu_r );
+ DECLARE_WRITE16_MEMBER( ram_mmu_w );
+ DECLARE_READ16_MEMBER( rtc_r );
+ DECLARE_WRITE16_MEMBER( rtc_w );
+ DECLARE_READ16_MEMBER( diskdma_size_r );
+ DECLARE_WRITE16_MEMBER( diskdma_size_w );
+ DECLARE_WRITE16_MEMBER( diskdma_ptr_w );
+
DECLARE_WRITE_LINE_MEMBER( wd2797_intrq_w );
DECLARE_WRITE_LINE_MEMBER( wd2797_drq_w );
required_shared_ptr<UINT16> m_mapram;
required_shared_ptr<UINT16> m_videoram;
+
+private:
+ UINT16 *m_ramptr;
+ UINT32 m_ramsize;
+ UINT16 m_diskdmasize;
+ UINT32 m_diskdmaptr;
+ bool m_fdc_intrq;
};
@@ -64,27 +89,78 @@ public:
WRITE16_MEMBER( unixpc_state::romlmap_w )
{
if (BIT(data, 15))
- space.install_ram(0x000000, 0x3fffff, m_ram->pointer());
+ {
+ m_ramrombank->set_bank(1);
+ }
else
- space.install_rom(0x000000, 0x3fffff, memregion("bootrom")->base());
+ {
+ m_ramrombank->set_bank(0);
+ }
}
-void unixpc_state::machine_reset()
+READ16_MEMBER( unixpc_state::ram_mmu_r )
{
- address_space &program = m_maincpu->space(AS_PROGRAM);
+ // TODO: MMU translation
+ if (offset > m_ramsize)
+ {
+ return 0xffff;
+ }
+ return m_ramptr[offset];
+}
+
+WRITE16_MEMBER( unixpc_state::ram_mmu_w )
+{
+ // TODO: MMU translation
+ if (offset < m_ramsize)
+ {
+ COMBINE_DATA(&m_ramptr[offset]);
+ }
+}
+
+void unixpc_state::machine_start()
+{
+ m_ramptr = (UINT16 *)m_ram->pointer();
+ m_ramsize = m_ram->size();
+}
+void unixpc_state::machine_reset()
+{
// force ROM into lower mem on reset
- romlmap_w(program, 0, 0, 0xffff);
+ m_ramrombank->set_bank(0);
// reset cpu so that it can pickup the new values
m_maincpu->reset();
}
+WRITE16_MEMBER( unixpc_state::error_enable_w )
+{
+ logerror("error_enable_w: %04x\n", data & 0x8000);
+}
+
+WRITE16_MEMBER( unixpc_state::parity_enable_w )
+{
+ logerror("parity_enable_w: %04x\n", data & 0x8000);
+}
+
+WRITE16_MEMBER( unixpc_state::bpplus_w )
+{
+ logerror("bpplus_w: %04x\n", data & 0x8000);
+}
/***************************************************************************
MISC
***************************************************************************/
+READ16_MEMBER( unixpc_state::rtc_r )
+{
+ return 0;
+}
+
+WRITE16_MEMBER( unixpc_state::rtc_w )
+{
+ logerror("rtc_w: %04x\n", data);
+}
+
READ16_MEMBER( unixpc_state::line_printer_r )
{
UINT16 data = 0;
@@ -92,9 +168,9 @@ READ16_MEMBER( unixpc_state::line_printer_r )
data |= 1; // no dial tone detected
data |= 1 << 1; // no parity error
data |= 0 << 2; // hdc intrq
- data |= m_wd2797->intrq_r() << 3;
+ data |= m_fdc_intrq ? 1<<3 : 0<<3;
- logerror("line_printer_r: %04x\n", data);
+ //logerror("line_printer_r: %04x\n", data);
return data;
}
@@ -103,12 +179,48 @@ WRITE16_MEMBER( unixpc_state::misc_control_w )
{
logerror("misc_control_w: %04x\n", data);
+ // bit 15 = VBL ack (must go high-low-high to ack)
+ // bit 14 = 0 for disk DMA write, 1 for disk DMA read
+ // bit 13 = Centronics strobe
+ // bit 12 = 0 = modem baud rate from UART clock inputs, 1 = baud from programmable timer
+
output().set_value("led_0", !BIT(data, 8));
output().set_value("led_1", !BIT(data, 9));
output().set_value("led_2", !BIT(data, 10));
output().set_value("led_3", !BIT(data, 11));
}
+/***************************************************************************
+ DMA
+***************************************************************************/
+
+READ16_MEMBER( unixpc_state::diskdma_size_r )
+{
+ return m_diskdmasize;
+}
+
+WRITE16_MEMBER( unixpc_state::diskdma_size_w )
+{
+ COMBINE_DATA( &m_diskdmasize );
+ logerror("%x to disk DMA size\n", data);
+}
+
+WRITE16_MEMBER( unixpc_state::diskdma_ptr_w )
+{
+ if (offset >= 0x2000)
+ {
+ // set top 4 bytes
+ m_diskdmaptr &= 0xff;
+ m_diskdmaptr |= (offset << 8);
+ }
+ else
+ {
+ m_diskdmaptr &= 0xffff00;
+ m_diskdmaptr |= (offset & 0xff);
+ }
+
+ logerror("diskdma_ptr_w: wrote at %x, ptr now %x\n", offset<<1, m_diskdmaptr);
+}
/***************************************************************************
FLOPPY
@@ -130,6 +242,7 @@ WRITE16_MEMBER( unixpc_state::disk_control_w )
WRITE_LINE_MEMBER( unixpc_state::wd2797_intrq_w )
{
logerror("wd2797_intrq_w: %d\n", state);
+ m_fdc_intrq = state;
}
WRITE_LINE_MEMBER( unixpc_state::wd2797_drq_w )
@@ -158,17 +271,29 @@ UINT32 unixpc_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
***************************************************************************/
static ADDRESS_MAP_START( unixpc_mem, AS_PROGRAM, 16, unixpc_state )
- AM_RANGE(0x000000, 0x3fffff) AM_RAMBANK("bank1")
+ AM_RANGE(0x000000, 0x3fffff) AM_DEVICE("ramrombank", address_map_bank_device, amap16)
AM_RANGE(0x400000, 0x4007ff) AM_RAM AM_SHARE("mapram")
AM_RANGE(0x420000, 0x427fff) AM_RAM AM_SHARE("videoram")
+ AM_RANGE(0x460000, 0x460001) AM_READWRITE(diskdma_size_r, diskdma_size_w)
AM_RANGE(0x470000, 0x470001) AM_READ(line_printer_r)
+ AM_RANGE(0x480000, 0x480001) AM_WRITE(rtc_w)
AM_RANGE(0x4a0000, 0x4a0001) AM_WRITE(misc_control_w)
+ AM_RANGE(0x4d0000, 0x4d7fff) AM_WRITE(diskdma_ptr_w)
AM_RANGE(0x4e0000, 0x4e0001) AM_WRITE(disk_control_w)
AM_RANGE(0x800000, 0xbfffff) AM_MIRROR(0x7fc000) AM_ROM AM_REGION("bootrom", 0)
AM_RANGE(0xe10000, 0xe10007) AM_DEVREADWRITE8("wd2797", wd_fdc_t, read, write, 0x00ff)
+ AM_RANGE(0xe30000, 0xe30001) AM_READ(rtc_r)
+ AM_RANGE(0xe40000, 0xe40001) AM_WRITE(error_enable_w)
+ AM_RANGE(0xe41000, 0xe41001) AM_WRITE(parity_enable_w)
+ AM_RANGE(0xe42000, 0xe42001) AM_WRITE(bpplus_w)
AM_RANGE(0xe43000, 0xe43001) AM_WRITE(romlmap_w)
+ // e70000 / e70002 = keyboard 6850 status/control and Rx data / Tx data
ADDRESS_MAP_END
+static ADDRESS_MAP_START( ramrombank_map, AS_PROGRAM, 16, unixpc_state )
+ AM_RANGE(0x000000, 0x3fffff) AM_ROM AM_REGION("bootrom", 0)
+ AM_RANGE(0x400000, 0x7fffff) AM_READWRITE(ram_mmu_r, ram_mmu_w)
+ADDRESS_MAP_END
/***************************************************************************
INPUT PORTS
@@ -207,6 +332,13 @@ static MACHINE_CONFIG_START( unixpc, unixpc_state )
MCFG_RAM_DEFAULT_SIZE("1M")
MCFG_RAM_EXTRA_OPTIONS("2M")
+ // RAM/ROM bank
+ MCFG_DEVICE_ADD("ramrombank", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(ramrombank_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x400000)
+
// floppy
MCFG_DEVICE_ADD("wd2797", WD2797, 1000000)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(unixpc_state, wd2797_intrq_w))