summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/hp_ipc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/hp_ipc.cpp')
-rw-r--r--src/mame/drivers/hp_ipc.cpp472
1 files changed, 442 insertions, 30 deletions
diff --git a/src/mame/drivers/hp_ipc.cpp b/src/mame/drivers/hp_ipc.cpp
index e59559cb791..bd708c0ce90 100644
--- a/src/mame/drivers/hp_ipc.cpp
+++ b/src/mame/drivers/hp_ipc.cpp
@@ -2,10 +2,51 @@
// copyright-holders:
/******************************************************************************
-
Integral Personal Computer (HP9807A)
Hewlett-Packard, 1985
+Driver to-do list
+=================
+
+- softlist: merge dumps from coho.org and classiccmp.org
+- keyboard: NMI generation, autorepeat
+- HP-HIL mouse
+- RTC chip: proper month, day
+- switchable graphics resolution ("_desktop" mode uses 640x400)
+- HP-IB chip
+- CS/80, SS/80 storage protocol(s) and drives
+- HP-IL printer
+- sound (needs dump of COP452)
+
+QA
+- diagnstc.td0: display test [cannot execute]
+- diagnstc.td0: complete keyboard test [keyboard stops responding]
+- diagnstc.td0: speaker test
+- diagnstc.td0: printer test
++ diagnstc.td0: auto: floppy disc test
++ diagnstc.td0: auto: ram test
+- diagnstc.td0: auto: rtc test [cannot execute]
+- diagnstc.td0: auto: short keyboard test [cannot execute + keyboard stops responding]
+
+maybe
+- drive AP line of MLC from a timer
+- RTC standby interrupt?
+- what does _desktop do except setting 640x400 mode?
+- non-HLE keyboard and mouse? (need dumps of COP4xx)
+
+slot devices
+- 82915A -- 300/1200 bps modem; http://www.hpmuseum.net/display_item.php?hw=920
+- 82919A -- serial; http://www.hpmuseum.net/display_item.php?hw=445
+- 82920A -- current loop; http://www.hpmuseum.net/display_item.php?hw=975
+- 82922A -- BCD interface; http://www.hpmuseum.net/display_item.php?hw=921
+- 82923A -- GPIO; http://www.hpmuseum.net/display_item.php?hw=976
+- 82924A -- HP-IL; http://www.hpmuseum.net/display_item.php?hw=922
+- 82968A -- up to 256 KB of ROM on top of operating system PCA
+- 82971A -- up to 1 MB of EPROM or 2 MB or masked ROM
+- 82998A -- HP-IB; http://www.hpmuseum.net/display_item.php?hw=933
+- 98071A -- 640x400 composite Video + Serial; http://www.hpmuseum.net/display_item.php?hw=935
+
+
This is a portable mains-powered UNIX workstation computer system produced by Hewlett-Packard and launched in 1985
Basic hardware specs are....
- 68000 CPU at 7.96MHz
@@ -74,7 +115,7 @@ Notes:
LS74 - 74LS74 at U2 provides system clock dividers /4 /2
MB81256 - Fujitsu MB81256 256Kx1 DRAM. Total RAM 512Kx8/256Kx16. HP part# 1818-3308. U20-U35 (DIP16)
TMS4500 - Texas Instruments TMS4500A DRAM Controller at U4. Clock input 3.98MHz [15.92/4] (DIP40)
- U58 - HP-HIL Keyboard Interface 'Cerberus'. Clock input on pin 24 is unknown (DIP24)
+ U58 - 1RD2-6001, HP-HIL Master Link Controller 'Cerberus'. Clock input on pin 24 is unknown (DIP24)
U60 - Unknown IC used as an interrupt encoder. Possibly a logic chip? (DIP20)
555 - 555 Timer
J1/J2 - Connectors joining to LOGIC B PCA (logic A to logic B bus)
@@ -121,13 +162,13 @@ HP Part# 00095-60952
| J14 J6 J5 J4 J3 J7 J1 J8 J9 J12 |
|------------------------------------------------------------------------------------------------------|
Notes:
- GPU - GPU (Graphics Processor) at U1. Clock input 3MHz [24/8]. VSync on pin 45, HSync on pin 46 (DIP48)
+ GPU - 1LL3-0005 GPU (Graphics Processor) at U1. Clock input 3MHz [24/8]. VSync on pin 45, HSync on pin 46 (DIP48)
16Kx4 - 16Kx4 DRAM, organised as 32Kx8bit/16Kx16bit at U3, U4, U5 & U6. Chip type unknown, likely Fujitsu MB81416 (DIP18)
WD2797 - Western Digital WD2797 Floppy Disk Controller at U18. Clock input 2MHz [24/2/3/2] (DIP40)
HP-IL(1) - HP-IL 1LJ7-0015 'Saturn' Thinkjet Printer Controller IC at U28. Clock input 3MHz on pin 9 [24/8] (DIP48)
- HP-IL(2) - HP-IL Interface IC at U31. Clock input 2MHz on pin 22 [24/2/3/2] (DIP28)
+ HP-IL(2) - HP-IL 1LB3 Interface IC at U31. Clock input 2MHz on pin 22 [24/2/3/2] (DIP28)
1Kb - 1Kb RAM at U27 for printer buffer (DIP28, type unknown, very old, with only DATA0,1,2,3, C/D and DIN,DOUT)
- ROM - 16Kb (2Kx8?) Some kind of very early DIP28 PROM/ROM? Same pinout as 1Kb RAM above. Holds the character font table for the printer
+ ROM - 16Kb (32Kx4) Some kind of very early DIP28 PROM/ROM? Same pinout as 1Kb RAM above. Holds the character font table for the printer
Four versions of this ROM exist, one each for Japan/Arabic/Hebrew and one for all other regions
NS58167A - National Semiconductor NS58167A Clock Controller RTC at U44. Clock input 32.768kHz (DIP24)
LM358 - National Semiconductor LM358 Operational Amplifier at U40 (DIP8)
@@ -246,7 +287,7 @@ F80000-FFFFFF - Reserved 512Kb
Access to 800000-FFFFFF can be remapped by the MMU registers.
-Interrupts
+Interrupts (all autovectored)
----------
High Priority 7 - Soft reset from keyboard (NMI)
/\ 6 - RTC or NBIR3 (external I/O)
@@ -259,10 +300,81 @@ Low Priority 1 - RTC
Note external interrupt lines NBIR0 to NBIR3 can be asserted by an interface connected to the external I/O port
+Useful links etc.
+-----------------
+
+bitsavers://pdf/hp/integral/00095-90126_Integral_Personal_Computer_Service_Jan86.pdf
+
+bitsavers://pdf/hp/hp-hil/45918A-90001_HP-HIL_Technical_Reference_Manual_Jan86.pdf
+ HP-HIL MLC, SLC datasheets
+
+bitsavers://pdf/sony/floppy/Sony_OA-D32_Microfloppy_Service_Nov83.pdf
+ OA-D32W
+
+http://www.hpl.hp.com/hpjournal/pdfs/IssuePDFs/1983-01.pdf
+ HP-IL issue
+
+http://www.hpl.hp.com/hpjournal/pdfs/IssuePDFs/1985-10.pdf
+ IPC issue
+
+http://www.hpl.hp.com/hpjournal/pdfs/IssuePDFs/1987-06.pdf
+ HP-HIL article
+
+http://www.hpmuseum.net/pdf/ComputerNews_1985_Jan15_37pages_OCR.pdf
+ introducing the IPC
+
+http://www.hpmuseum.net/pdf/ComputerFocus_1985_Nov_25pages_OCR.pdf
+ SysV upgrade
+
+http://www.hpmuseum.net/pdf/InformationSystemsAndManufacturingNews_81pages_Jun1-86_OCR.pdf
+ EPROM/ROM modules
+
+http://www.hpmuseum.net/pdf/HPChannels_1986_11_37pages_Nov86_OCR.pdf
+ SW Eng ROM and serial option for it
+
+http://www.coho.org/~pete/downloads/IPC/burst/Freeware/IPC_Driver_Writers_Disc/hp-ux.5.0.0
+ kernel namelist
+
+http://www.hpmuseum.net/display_item.php?hw=122
+ overview, manuals, software
+
+http://www.ambry.com/hp-computer-model/9807A.html
+ replacement parts
+
+http://www.brouhaha.com/~eric/hpcalc/chips/
+ chip part numbers
+
+
+Software to look for
+--------------------
+
+00095-60978 "Service ROM - Used in trobleshooting the integral PC" via ambry
+00095-60925 "Service ROM" via service manual
+00095-60969 "Service Diagnostic Disc" via service manual
+00095-60950 "I/O Component-Level Diagnostic Disc" via serial interface service manual
+
+00095-60006 (original System III-based HP-UX 1.0 ROM)
+82995A (same bits as 82991A; the latter is an upgrade kit, former was pre-installed)
+82989J Technical Basic ROM (Jan'1986)
+82987A Software Engineering ROM (Nov'1986) (possibly can be rebuilt from floppy images on coho?)
+
******************************************************************************/
#include "emu.h"
+
+#include "bus/hp_hil/hp_hil.h"
+#include "bus/hp_hil/hil_devices.h"
#include "cpu/m68000/m68000.h"
+#include "formats/hp_ipc_dsk.h"
+#include "machine/bankdev.h"
+#include "machine/mm58167.h"
+#include "machine/ram.h"
+#include "machine/wd_fdc.h"
+#include "video/hp1ll3.h"
+
+#include "rendlay.h"
+
+#include "screen.h"
class hp_ipc_state : public driver_device
@@ -271,81 +383,381 @@ public:
hp_ipc_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_bankdev(*this, "bankdev")
+ , m_fdc(*this, "fdc")
+ , m_ram(*this, RAM_TAG)
+ , m_screen(*this, "screen")
{ }
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ DECLARE_READ16_MEMBER(mem_r);
+ DECLARE_WRITE16_MEMBER(mem_w);
+ DECLARE_READ16_MEMBER(mmu_r);
DECLARE_WRITE16_MEMBER(mmu_w);
DECLARE_READ16_MEMBER(ram_r);
DECLARE_WRITE16_MEMBER(ram_w);
+ DECLARE_READ16_MEMBER(trap_r);
+ DECLARE_WRITE16_MEMBER(trap_w);
+
+ DECLARE_READ8_MEMBER(floppy_id_r);
+ DECLARE_WRITE8_MEMBER(floppy_id_w);
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+ DECLARE_WRITE_LINE_MEMBER(irq_1);
+ DECLARE_WRITE_LINE_MEMBER(irq_2);
+ DECLARE_WRITE_LINE_MEMBER(irq_3);
+ DECLARE_WRITE_LINE_MEMBER(irq_4);
+ DECLARE_WRITE_LINE_MEMBER(irq_5);
+ DECLARE_WRITE_LINE_MEMBER(irq_6);
+ DECLARE_WRITE_LINE_MEMBER(irq_7);
+
+ emu_timer *m_bus_error_timer;
private:
required_device<m68000_device> m_maincpu;
+ required_device<address_map_bank_device> m_bankdev;
+ required_device<wd2797_t> m_fdc;
+ required_device<ram_device> m_ram;
+ required_device<screen_device> m_screen;
+
+ uint32_t m_mmu[4], m_lowest_ram_addr;
+ uint16_t *m_internal_ram;
+ int m_fc;
- uint32_t m_mmu[4];
- uint16_t m_internal_ram[0x40000];
+ floppy_image_device *m_floppy;
+
+ inline uint32_t get_ram_address(offs_t offset)
+ {
+ return (m_mmu[(m_maincpu->get_fc() >> 1) & 3] + offset) & 0x3FFFFF;
+ }
- inline uint32_t get_ram_address(offs_t offset) { return (m_mmu[(m_maincpu->get_fc() >> 1) & 3] + offset) & 0x3FFFFF; }
+protected:
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ void set_bus_error(uint32_t address, bool write, uint16_t mem_mask);
+ bool m_bus_error;
};
-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)
+void hp_ipc_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ m_bus_error = false;
+}
+
+void hp_ipc_state::set_bus_error(uint32_t address, bool write, uint16_t mem_mask)
+{
+ if (m_bus_error)
+ {
+ return;
+ }
+ if (!ACCESSING_BITS_8_15)
+ {
+ address++;
+ }
+ m_bus_error = true;
+ m_maincpu->set_buserror_details(address, write, m_maincpu->get_fc());
+ m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
+ m_bus_error_timer->adjust(m_maincpu->cycles_to_attotime(16)); // let rmw cycles complete
+}
+
+static ADDRESS_MAP_START(hp_ipc_mem_outer, AS_PROGRAM, 16, hp_ipc_state)
+ AM_RANGE(0x000000, 0xFFFFFF) AM_READWRITE(mem_r, mem_w)
ADDRESS_MAP_END
+static ADDRESS_MAP_START(hp_ipc_mem_inner, AS_PROGRAM, 16, hp_ipc_state)
+// user mode
+ AM_RANGE(0x1000000, 0x17FFFFF) AM_READWRITE(ram_r, ram_w)
+ AM_RANGE(0x1800000, 0x187FFFF) AM_ROM AM_REGION("maincpu", 0)
+ AM_RANGE(0x1E20000, 0x1E2000F) AM_DEVREADWRITE8("gpu", hp1ll3_device, read, write, 0x00ff)
+ AM_RANGE(0x1E40000, 0x1E4002F) AM_DEVREADWRITE8("rtc", mm58167_device, read, write, 0x00ff)
+
+// supervisor mode
+ AM_RANGE(0x0000000, 0x007FFFF) AM_ROM AM_REGION("maincpu", 0) // Internal ROM (operating system PCA)
+ AM_RANGE(0x0080000, 0x00FFFFF) AM_UNMAP // Internal ROM (option ROM PCA)
+ AM_RANGE(0x0100000, 0x04FFFFF) AM_UNMAP // External ROM modules
+ AM_RANGE(0x0600000, 0x060FFFF) AM_READWRITE(mmu_r, mmu_w)
+ AM_RANGE(0x0610000, 0x0610007) AM_READWRITE8(floppy_id_r, floppy_id_w, 0x00ff)
+ AM_RANGE(0x0610008, 0x061000F) AM_DEVREADWRITE8("fdc", wd2797_t, read, write, 0x00ff)
+ AM_RANGE(0x0620000, 0x062000F) AM_DEVREADWRITE8("gpu", hp1ll3_device, read, write, 0x00ff)
+ AM_RANGE(0x0630000, 0x063FFFF) AM_NOP // AM_DEVREADWRITE8(TMS9914_TAG, tms9914_device, read, write, 0x00ff)
+ AM_RANGE(0x0640000, 0x064002F) AM_DEVREADWRITE8("rtc", mm58167_device, read, write, 0x00ff)
+ AM_RANGE(0x0650000, 0x065FFFF) AM_NOP // HP-IL Printer (optional; ROM sets _desktop to 0 if not mapped) -- sys/lpint.h
+ AM_RANGE(0x0660000, 0x06600FF) AM_DEVREADWRITE8("mlc", hp_hil_mlc_device, read, write, 0x00ff) // 'caravan', scrn/caravan.h
+ AM_RANGE(0x0670000, 0x067FFFF) AM_NOP // Speaker (NatSemi COP 452)
+ AM_RANGE(0x0680000, 0x068FFFF) AM_NOP // 'SIMON (98628) fast HP-IB card' -- sys/simon.h
+ AM_RANGE(0x0700000, 0x07FFFFF) AM_UNMAP // External I/O
+ AM_RANGE(0x0800000, 0x0FFFFFF) AM_READWRITE(ram_r, ram_w)
+
+// bus error handler
+ AM_RANGE(0x0000000, 0x1FFFFFF) AM_READWRITE(trap_r, trap_w)
+ADDRESS_MAP_END
static INPUT_PORTS_START(hp_ipc)
INPUT_PORTS_END
+READ16_MEMBER(hp_ipc_state::mmu_r)
+{
+ uint16_t data = (m_mmu[offset & 3] >> 10);
+
+ return data;
+}
+
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::mem_r)
+{
+ int fc = m_maincpu->get_fc() & 4;
+
+ if (fc != m_fc)
+ {
+ m_fc = fc;
+ m_bankdev->set_bank(m_fc ? 0 : 1);
+ }
+
+ return m_bankdev->read16(space, offset, mem_mask);
+}
+
+WRITE16_MEMBER(hp_ipc_state::mem_w)
+{
+ int fc = m_maincpu->get_fc() & 4;
+
+ if (fc != m_fc)
+ {
+ m_fc = fc;
+ m_bankdev->set_bank(m_fc ? 0 : 1);
+ }
+
+ m_bankdev->write16(space, offset, data, mem_mask);
+}
+
+READ16_MEMBER(hp_ipc_state::trap_r)
+{
+ if (!machine().side_effect_disabled()) set_bus_error((offset << 1) & 0xFFFFFF, 0, mem_mask);
+
+ return 0xffff;
+}
+
+WRITE16_MEMBER(hp_ipc_state::trap_w)
+{
+ if (!machine().side_effect_disabled()) set_bus_error((offset << 1) & 0xFFFFFF, 1, mem_mask);
+}
+
READ16_MEMBER(hp_ipc_state::ram_r)
{
uint32_t ram_address = get_ram_address(offset);
+ uint16_t data = 0xffff;
- //logerror("RAM read, offset = %08x, ram address = %08X\n", offset, ram_address);
-
- if (ram_address < 0x380000)
+ if (ram_address < m_lowest_ram_addr)
{
- // External RAM modules
+ if (!machine().side_effect_disabled()) set_bus_error((offset << 1) + 0x800000, 0, mem_mask);
}
else if (ram_address < 0x3c0000)
{
// Internal RAM
- return m_internal_ram[offset & 0x3ffff];
+ data = m_internal_ram[ram_address - m_lowest_ram_addr];
}
- return 0xffff;
-}
+ return data;
+}
WRITE16_MEMBER(hp_ipc_state::ram_w)
{
uint32_t 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)
+ if (ram_address < m_lowest_ram_addr)
{
- // External RAM modules
+ if (!machine().side_effect_disabled()) set_bus_error((offset << 1) + 0x800000, 1, mem_mask);
}
else if (ram_address < 0x3c0000)
{
// Internal RAM
- m_internal_ram[offset & 0x3ffff] = data;
+ COMBINE_DATA(&m_internal_ram[ram_address - m_lowest_ram_addr]);
+ }
+}
+
+
+/*
+ * bit 6 -- INTRQ
+ * bit 1 -- disk changed (from drive)
+ * bit 0 -- write protect (from drive)
+ */
+READ8_MEMBER(hp_ipc_state::floppy_id_r)
+{
+ uint8_t data = 0;
+
+ data = (m_fdc->intrq_r() << 6);
+
+ if (m_floppy)
+ {
+ data |= (m_fdc->intrq_r() << 6) | (m_floppy->dskchg_r() << 1) | m_floppy->wpt_r();
+ }
+
+ return data;
+}
+
+/*
+ * bit 7 -- 1: motor on (via inverter to drive's /MTorOn)
+ * bit 3 -- 1: head 0, 0: head 1 (via inverter to drive's /SSO)
+ * bit 1 -- 1: drive select (via inverter to drive's /DRIVE SEL 1)
+ * bit 0 -- 1: reset disc_changed (via inverter to drive's /DSKRST)
+ */
+WRITE8_MEMBER(hp_ipc_state::floppy_id_w)
+{
+ floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
+
+ if (!BIT(data, 1))
+ {
+ if (m_floppy == nullptr)
+ {
+ m_floppy = floppy0;
+ m_fdc->set_floppy(m_floppy);
+ }
+ }
+ else
+ {
+ m_floppy = nullptr;
+ }
+
+ if (m_floppy)
+ {
+ m_floppy->ss_w(BIT(data, 3));
+ m_floppy->mon_w(!BIT(data, 7));
+ if (BIT(data, 0))
+ m_floppy->dskchg_w(0);
+ }
+ else
+ {
+ floppy0->mon_w(1);
}
}
+WRITE_LINE_MEMBER(hp_ipc_state::irq_1)
+{
+ m_maincpu->set_input_line_and_vector(M68K_IRQ_1, state, M68K_INT_ACK_AUTOVECTOR);
+}
+
+WRITE_LINE_MEMBER(hp_ipc_state::irq_2)
+{
+ m_maincpu->set_input_line_and_vector(M68K_IRQ_2, state, M68K_INT_ACK_AUTOVECTOR);
+}
+
+WRITE_LINE_MEMBER(hp_ipc_state::irq_3)
+{
+ m_maincpu->set_input_line_and_vector(M68K_IRQ_3, state, M68K_INT_ACK_AUTOVECTOR);
+}
+
+WRITE_LINE_MEMBER(hp_ipc_state::irq_4)
+{
+ m_maincpu->set_input_line_and_vector(M68K_IRQ_4, state, M68K_INT_ACK_AUTOVECTOR);
+}
+
+WRITE_LINE_MEMBER(hp_ipc_state::irq_5)
+{
+ m_maincpu->set_input_line_and_vector(M68K_IRQ_5, state, M68K_INT_ACK_AUTOVECTOR);
+}
+
+WRITE_LINE_MEMBER(hp_ipc_state::irq_6)
+{
+ m_maincpu->set_input_line_and_vector(M68K_IRQ_6, state, M68K_INT_ACK_AUTOVECTOR);
+}
+
+WRITE_LINE_MEMBER(hp_ipc_state::irq_7)
+{
+ m_maincpu->set_input_line_and_vector(M68K_IRQ_7, state, M68K_INT_ACK_AUTOVECTOR);
+}
+
+
+void hp_ipc_state::machine_start()
+{
+ m_bus_error_timer = timer_alloc(0);
+
+ m_bankdev->set_bank(1);
+
+ m_lowest_ram_addr = 0x3c0000 - (m_ram->size() >> 1);
+ m_internal_ram = (uint16_t *) m_ram->pointer();
+}
+
+void hp_ipc_state::machine_reset()
+{
+ m_floppy = nullptr;
+}
+
+
+FLOPPY_FORMATS_MEMBER( hp_ipc_state::floppy_formats )
+ FLOPPY_HP_IPC_FORMAT
+FLOPPY_FORMATS_END
+
+static SLOT_INTERFACE_START( hp_ipc_floppies )
+ SLOT_INTERFACE( "35dd", SONY_OA_D32W )
+SLOT_INTERFACE_END
+
+/*
+ * IRQ levels (page 5-4)
+ *
+ * 7 Soft reset from keyboard, non-maskable
+ * 6 Real-time clock or NBIR3 (ext. I/O)
+ * 5 Disc Drive or NBIR2
+ * 4 GPU or NBIR1
+ * 3 HP-IB, printer, or NBIR0
+ * 2 HP-HIL devices (keyboard, mouse)
+ * 1 Real-time clock
+ */
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)
+ MCFG_CPU_ADD("maincpu", M68000, XTAL_15_92MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(hp_ipc_mem_outer)
+
+ MCFG_DEVICE_ADD("bankdev", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(hp_ipc_mem_inner)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(25)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000000)
+
+ // horizontal time = 60 us (min)
+ // ver.refresh period = ~300 us
+ // ver.period = 16.7ms (~60 hz)
+ MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::amber())
+ MCFG_SCREEN_UPDATE_DEVICE("gpu", hp1ll3_device, screen_update)
+ MCFG_SCREEN_RAW_PARAMS(XTAL_6MHz * 2, 720, 0, 512, 278, 0, 256)
+// when _desktop == 0:
+// MCFG_SCREEN_RAW_PARAMS(XTAL_6MHz * 2, 720, 0, 640, 480, 0, 400)
+ MCFG_SCREEN_VBLANK_CALLBACK(DEVWRITELINE("mlc", hp_hil_mlc_device, ap_w)) // XXX actually it's driven by 555 (U59)
+ MCFG_DEFAULT_LAYOUT(layout_lcd)
+
+ MCFG_SCREEN_PALETTE("palette")
+ MCFG_PALETTE_ADD_MONOCHROME("palette")
+
+ MCFG_HP1LL3_ADD("gpu")
+// MCFG_HP1LL3_IRQ_CALLBACK(WRITELINE(hp_ipc_state, irq_4))
+ MCFG_VIDEO_SET_SCREEN("screen")
+
+ // XXX actual clock is 1MHz; remove this workaround (and change 2000 to 100 in hp_ipc_dsk.cpp)
+ // XXX when floppy code correctly handles 600 rpm drives.
+ MCFG_WD2797_ADD("fdc", XTAL_2MHz)
+ MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(hp_ipc_state, irq_5))
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", hp_ipc_floppies, "35dd", hp_ipc_state::floppy_formats)
+
+ MCFG_SOFTWARE_LIST_ADD("flop_list","hp_ipc")
+
+ MCFG_DEVICE_ADD("rtc", MM58167, XTAL_32_768kHz)
+ MCFG_MM58167_IRQ_CALLBACK(WRITELINE(hp_ipc_state, irq_1))
+// MCFG_MM58167_STANDBY_IRQ_CALLBACK(WRITELINE(hp_ipc_state, irq_6))
+
+ MCFG_DEVICE_ADD("mlc", HP_HIL_MLC, XTAL_15_92MHz/2)
+ MCFG_HP_HIL_INT_CALLBACK(WRITELINE(hp_ipc_state, irq_2))
+ MCFG_HP_HIL_NMI_CALLBACK(WRITELINE(hp_ipc_state, irq_7))
+ MCFG_HP_HIL_SLOT_ADD("mlc", "hil1", hp_hil_devices, "hp_ipc_kbd")
+
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("512K")
+ MCFG_RAM_EXTRA_OPTIONS("768K,1M,1576K,2M,3M,4M,5M,6M,7M,7680K")
MACHINE_CONFIG_END
@@ -355,4 +767,4 @@ ROM_START(hp_ipc)
ROM_END
-COMP(1985, hp_ipc, 0, 0, hp_ipc, hp_ipc, driver_device, 0, "HP", "Integral Personal Computer", MACHINE_IS_SKELETON)
+COMP(1985, hp_ipc, 0, 0, hp_ipc, hp_ipc, driver_device, 0, "HP", "Integral Personal Computer", MACHINE_NO_SOUND|MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_KEYBOARD)