summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Wilbert Pol <wilbertpol@users.noreply.github.com>2015-08-18 20:11:55 +0200
committer Wilbert Pol <wilbertpol@users.noreply.github.com>2015-08-18 20:12:56 +0200
commit43e4d38a6f425df32a8c69cf2911aca8e3b4e587 (patch)
treecbf8118ca56d7a23dda504676fae20566a90f6b0 /src
parent1f78170b4de52c2f26cae323f5edee35c54cdad0 (diff)
IPC skeleton (nw)
Diffstat (limited to 'src')
-rw-r--r--src/mame/mess.lst1
-rw-r--r--src/mess/drivers/hp_ipc.c160
2 files changed, 161 insertions, 0 deletions
diff --git a/src/mame/mess.lst b/src/mame/mess.lst
index fe4cba98e44..376d5adddda 100644
--- a/src/mame/mess.lst
+++ b/src/mame/mess.lst
@@ -2726,4 +2726,5 @@ bitgrpha
bitgrphb
tvgame
aussieby
+hp_ipc
diff --git a/src/mess/drivers/hp_ipc.c b/src/mess/drivers/hp_ipc.c
new file mode 100644
index 00000000000..42698a0da7c
--- /dev/null
+++ b/src/mess/drivers/hp_ipc.c
@@ -0,0 +1,160 @@
+// license:BSD-3-Clause
+// copyright-holders:
+/******************************************************************************
+
+HP Integral Personal Computer (IPC) skeleton driver
+
+Interrupt levels:
+ 7 - Soft reset from keyboard
+ 6 - Real-time clock or NBIR3 (external)
+ 5 - Disc drive or NBIR2 (external)
+ 4 - GPU or NBIR1 (external)
+ 3 - HP-IB, printer, or NBIR0 (external)
+ 2 - HP-HIL devices (keyboard, mouse, etc)
+ 1 - Real-time clock
+
+******************************************************************************/
+
+#include "emu.h"
+#include "cpu/m68000/m68000.h"
+
+
+class hp_ipc_state : public driver_device
+{
+public:
+ hp_ipc_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ { }
+
+ DECLARE_WRITE16_MEMBER(mmu_w);
+ DECLARE_READ16_MEMBER(ram_r);
+ DECLARE_WRITE16_MEMBER(ram_w);
+
+private:
+ required_device<m68000_device> m_maincpu;
+
+ UINT32 m_mmu[4];
+ UINT16 m_internal_ram[0x40000];
+
+ inline UINT32 get_ram_address(offs_t offset) { return (m_mmu[(m_maincpu->get_fc() >> 1) & 3] + offset) & 0x3FFFFF; }
+};
+
+
+/*
+Physical Address Map:
+ 000000 - 07FFFF Internal ROM (operating system PCA)
+ 080000 - 0FFFFF Internal ROM (option ROM PCA)
+ 100000 - 4FFFFF External ROM modules
+ 500000 - 5FFFFF Reserved
+ 600000 - 6FFFFF Internal I/O
+ 600000 - 60FFFF MMU
+ 610000 - 61FFFF Disc Drive
+ 620000 - 62FFFF Display
+ 630000 - 63FFFF HP-IB
+ 640000 - 64FFFF Real-Time Clock
+ 650000 - 65FFFF Printer
+ 660000 - 66FFFF Keyboard
+ 670000 - 67FFFF Speaker
+ 680000 - 68FFFF Reserved
+ 690000 - 69FFFF Reserved
+ 6A0000 - 6AFFFF Reserved
+ 6B0000 - 6BFFFF Reserved
+ 6C0000 - 6CFFFF Reserved
+ 6D0000 - 6DFFFF Reserved
+ 6E0000 - 6EFFFF Reserved
+ 6F0000 - 6FFFFF Reserved
+ 700000 - 7FFFFF External I/O
+ 700000 - 70FFFF Mainframe Port A
+ 710000 - 71FFFF Mainframe Port B
+ 720000 - 72FFFF Bus Expander Port A1
+ 730000 - 73FFFF Bus Expander Port A2
+ 740000 - 74FFFF Bus Expander Port A3
+ 750000 - 75FFFF Bus Expander Port A4
+ 760000 - 76FFFF Bus Expander Port A5
+ 770000 - 77FFFF Reserved
+ 780000 - 78FFFF Reserved
+ 790000 - 79FFFF Reserved
+ 7A0000 - 7AFFFF Bus Expander Port B1
+ 7B0000 - 7BFFFF Bus Expander Port B2
+ 7C0000 - 7CFFFF Bus Expander Port B3
+ 7D0000 - 7DFFFF Bus Expander Port B4
+ 7E0000 - 7EFFFF Bus Expander Port B5
+ 7F0000 - 7FFFFF Reserved
+ 800000 - EFFFFF External RAM modules
+ F00000 - F7FFFF Internal RAM
+ F80000 - FFFFFF Reserved
+
+All accesses to 800000-FFFFFF go through the "MMU" to form a final physical address
+
+*/
+static ADDRESS_MAP_START(hp_ipc_mem, AS_PROGRAM, 16, hp_ipc_state)
+ AM_RANGE(0x000000, 0x07FFFF) AM_ROM
+ AM_RANGE(0x600000, 0x60FFFF) AM_WRITE(mmu_w)
+ AM_RANGE(0x800000, 0xFFFFFF) AM_READWRITE(ram_r, ram_w)
+ADDRESS_MAP_END
+
+
+static INPUT_PORTS_START(hp_ipc)
+INPUT_PORTS_END
+
+
+WRITE16_MEMBER(hp_ipc_state::mmu_w)
+{
+ logerror("mmu_w: offset = %08x, data = %04x, register = %d, data_to_add = %08x\n", offset, data, offset & 3, (data & 0xFFF) << 10);
+ m_mmu[offset & 3] = (data & 0xFFF) << 10;
+}
+
+
+READ16_MEMBER(hp_ipc_state::ram_r)
+{
+ UINT32 ram_address = get_ram_address(offset);
+
+ //logerror("RAM read, offset = %08x, ram address = %08X\n", offset, ram_address);
+
+ if (ram_address < 0x380000)
+ {
+ // External RAM modules
+ }
+ else if (ram_address < 0x3c0000)
+ {
+ // Internal RAM
+ return m_internal_ram[offset & 0x3ffff];
+ }
+ return 0xffff;
+}
+
+
+WRITE16_MEMBER(hp_ipc_state::ram_w)
+{
+ UINT32 ram_address = get_ram_address(offset);
+
+ //logerror("RAM write, offset = %08x, ram address = %08X, data = %04x\n", offset, ram_address, data);
+
+ if (ram_address < 0x380000)
+ {
+ // External RAM modules
+ }
+ else if (ram_address < 0x3c0000)
+ {
+ // Internal RAM
+ m_internal_ram[offset & 0x3ffff] = data;
+ }
+}
+
+
+static MACHINE_CONFIG_START(hp_ipc, hp_ipc_state)
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M68000, 15920000 / 2)
+ MCFG_CPU_PROGRAM_MAP(hp_ipc_mem)
+MACHINE_CONFIG_END
+
+
+ROM_START(hp_ipc)
+ ROM_REGION(0x100000, "maincpu" , 0)
+ ROM_LOAD("hp ipc os 82991A.bin", 0x00000, 0x80000, BAD_DUMP CRC(df45a37b) SHA1(476af9923bca0d2d0f40aeb81be5145ca76fddf5)) // Should be spread across 4 x 128K ROMs
+ROM_END
+
+
+COMP(198?, hp_ipc, 0, 0, hp_ipc, hp_ipc, driver_device, 0, "HP", "Integral Personal Computer", MACHINE_IS_SKELETON)
+