summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author R. Belmont <rb6502@users.noreply.github.com>2018-04-23 10:44:06 -0400
committer GitHub <noreply@github.com>2018-04-23 10:44:06 -0400
commit0bcbd63021f4e11cfc48aae352dfd60c51b26b64 (patch)
tree5f2758e1f5724ba2328fe48625c8ab0858d03afb
parentd9b04da3089e2470be648d1409a35831589ab72c (diff)
parent71ec7154417b4014e0513304c1acbdd6c55c31dc (diff)
Merge pull request #3477 from shattered/_4282dc6
hp_ipc: add diagnostic ROMs; model 9808A (prototype of desktop version)
-rw-r--r--src/devices/video/hp1ll3.cpp67
-rw-r--r--src/devices/video/hp1ll3.h4
-rw-r--r--src/mame/drivers/hp_ipc.cpp119
-rw-r--r--src/mame/mame.lst1
4 files changed, 143 insertions, 48 deletions
diff --git a/src/devices/video/hp1ll3.cpp b/src/devices/video/hp1ll3.cpp
index 175167811b7..5d15ada47e5 100644
--- a/src/devices/video/hp1ll3.cpp
+++ b/src/devices/video/hp1ll3.cpp
@@ -146,9 +146,8 @@
} while (0)
-#define HPGPU_VRAM_SIZE 16384 // *4 // experiment
-#define HPGPU_HORZ_TOTAL 512
-#define HPGPU_VERT_TOTAL 256
+// enough for 9807a and 9808a both.
+#define HPGPU_VRAM_SIZE (16384 * 4)
//**************************************************************************
@@ -180,6 +179,8 @@ hp1ll3_device::hp1ll3_device(const machine_config &mconfig, const char *tag, dev
void hp1ll3_device::device_start()
{
+ const rectangle &visarea = screen().visible_area();
+
// register for state saving
save_item(NAME(m_conf));
@@ -189,6 +190,9 @@ void hp1ll3_device::device_start()
m_sprite.allocate(16, 16);
m_videoram = std::make_unique<uint16_t[]>(HPGPU_VRAM_SIZE*2); // x2 size to make WRWIN/RDWIN easier
+
+ m_horiz_pix_total = visarea.max_x + 1;
+ m_vert_pix_total = visarea.max_y + 1;
}
void hp1ll3_device::device_reset()
@@ -203,7 +207,7 @@ inline void hp1ll3_device::point(int x, int y, int px)
{
uint16_t offset = m_sad;
- offset += y*(HPGPU_HORZ_TOTAL/16) + (x >> 4);
+ offset += y*(m_horiz_pix_total/16) + (x >> 4);
if (px)
m_videoram[offset] |= (1 << (15-(x%16)));
@@ -331,9 +335,9 @@ void hp1ll3_device::fill(int org_x, int org_y, int w, int h, int arg)
if (m_rr == RR_COPYINVERTED) gfx ^= 0xffff;
for (int x = org_x; x < max_x;) {
mask = 0xffff;
- offset = m_sad + m_org + y * (HPGPU_HORZ_TOTAL/16) + (x >> 4);
+ offset = m_sad + m_org + y * (m_horiz_pix_total/16) + (x >> 4);
- if (offset >= m_sad + (HPGPU_VERT_TOTAL * HPGPU_HORZ_TOTAL/WS))
+ if (offset >= m_sad + (m_vert_pix_total * m_horiz_pix_total/WS))
DBG_LOG(0,"HPGPU",("buffer overflow in FILL: %04x (%d, %d)\n", offset, 16*x, y));
// clipping
@@ -362,19 +366,19 @@ void hp1ll3_device::bitblt(int dstx, int dsty, uint16_t srcaddr, int width, int
int max_x, max_y;
max_x = dstx + width;
- if (max_x >= HPGPU_HORZ_TOTAL)
- max_x = HPGPU_HORZ_TOTAL;
+ if (max_x >= m_horiz_pix_total)
+ max_x = m_horiz_pix_total;
max_y = dsty + height;
- if (max_y >= HPGPU_VERT_TOTAL)
- max_y = HPGPU_VERT_TOTAL;
+ if (max_y >= m_vert_pix_total)
+ max_y = m_vert_pix_total;
for (int y = dsty; y < max_y; y++) {
mask = 0xffff;
gfx = m_videoram[srcaddr + y - dsty] & mask;
- offset = m_sad + y * (HPGPU_HORZ_TOTAL/16) + (dstx >> 4);
+ offset = m_sad + y * (m_horiz_pix_total/16) + (dstx >> 4);
- if (offset >= m_sad + (HPGPU_VERT_TOTAL * HPGPU_HORZ_TOTAL/16))
+ if (offset >= m_sad + (m_vert_pix_total * m_horiz_pix_total/16))
DBG_LOG(0,"HPGPU",("buffer overflow in bitblt: %04x (%d, %d)\n", offset, 16*dstx, y));
// are we crossing word boundary?
@@ -408,10 +412,10 @@ void hp1ll3_device::label(uint8_t chr, int width)
for (int y = 0; y < max_y; y++) {
x = m_cursor_x;
- offset = m_sad + (m_cursor_y + y) * (HPGPU_HORZ_TOTAL/16) + (x >> 4);
+ offset = m_sad + (m_cursor_y + y) * (m_horiz_pix_total/16) + (x >> 4);
gfx = m_videoram[font + y] >> (16 - width);
- if (offset >= m_sad + (HPGPU_VERT_TOTAL * HPGPU_HORZ_TOTAL/16))
+ if (offset >= m_sad + (m_vert_pix_total * m_horiz_pix_total/16))
DBG_LOG(0,"HPGPU",("buffer overflow in LABEL: %04x (%d, %d)\n", offset, 16*x, y));
// are we crossing word boundary?
@@ -452,11 +456,11 @@ uint32_t hp1ll3_device::screen_update(screen_device &screen, bitmap_ind16 &bitma
}
// XXX last line is not actually drawn on real hw
- for (y = 0; y < HPGPU_VERT_TOTAL-1; y++) {
- offset = m_sad + y*(HPGPU_HORZ_TOTAL/16);
+ for (y = 0; y < m_vert_pix_total-1; y++) {
+ offset = m_sad + y*(m_horiz_pix_total/16);
p = &m_bitmap.pix16(y);
- for (x = offset; x < offset + HPGPU_HORZ_TOTAL/16; x++)
+ for (x = offset; x < offset + m_horiz_pix_total/16; x++)
{
gfx = m_videoram[x];
@@ -524,7 +528,20 @@ READ8_MEMBER( hp1ll3_device::read )
m_memory_ptr++;
}
break;
+
+ /*
+ * 'diagb' ROM accepts either of these ID values
+ * 0x3003, 0x4004, 0x5005, 0x6006
+ */
+ case ID:
+ data = 0x40;
+ break;
}
+ break;
+
+ case 3:
+ if (m_command == ID) data = 0x04;
+ break;
}
DBG_LOG(1,"HPGPU", ("R @ %d == %02x\n", offset, data));
@@ -548,6 +565,7 @@ WRITE8_MEMBER( hp1ll3_device::write )
break;
case 2:
+ case 3:
switch (m_command)
{
case CONF:
@@ -685,6 +703,9 @@ void hp1ll3_device::command(int command)
case WRFAD:
DBG_LOG(2,"HPGPU",("command: WRFAD [%d, 0x%x] (0x%04x)\n", command, command, m_input[0]));
m_fad = m_input[0];
+
+ // ?? used by diagnostic ROM
+ case 6:
m_fontheight = m_videoram[m_fad];
m_fontdata = m_fad + m_videoram[m_fad + 1] + 2;
DBG_LOG(1,"HPGPU",("font data set: FAD %04X header %d bitmaps %04X height %d\n",
@@ -761,6 +782,18 @@ void hp1ll3_device::command(int command)
if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR);
m_cursor_x = m_input[0];
m_cursor_y = m_input[1];
+ m_saved_x = m_cursor_x;
+ if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR);
+ if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR);
+ break;
+
+ // carriage return, line feed
+ case CRLFx:
+ DBG_LOG(2,"HPGPU",("command: CRLF [%d, 0x%x] (%d, %d)\n", command, command, m_input[0], m_input[1]));
+ if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR);
+ if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR);
+ m_cursor_x = m_saved_x;
+ m_cursor_y += m_fontheight;
if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR);
if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR);
break;
diff --git a/src/devices/video/hp1ll3.h b/src/devices/video/hp1ll3.h
index ab8b047a977..dfeb1e83551 100644
--- a/src/devices/video/hp1ll3.h
+++ b/src/devices/video/hp1ll3.h
@@ -53,7 +53,7 @@ private:
uint16_t m_conf[11], m_input[2];
int m_input_ptr, m_memory_ptr, m_conf_ptr;
- int m_command;
+ int m_command, m_horiz_pix_total, m_vert_pix_total;
uint16_t m_sad;
uint16_t m_org;
@@ -63,7 +63,7 @@ private:
uint16_t m_udl;
bool m_enable_video, m_enable_cursor, m_enable_sprite;
- uint16_t m_cursor_x, m_cursor_y;
+ uint16_t m_cursor_x, m_cursor_y, m_saved_x;
uint16_t m_sprite_x, m_sprite_y;
struct {
uint16_t width, height, org_x, org_y, width_w;
diff --git a/src/mame/drivers/hp_ipc.cpp b/src/mame/drivers/hp_ipc.cpp
index b2772ccb4dc..ea43edef19a 100644
--- a/src/mame/drivers/hp_ipc.cpp
+++ b/src/mame/drivers/hp_ipc.cpp
@@ -415,9 +415,16 @@ public:
emu_timer *m_bus_error_timer;
+ void hp_ipc_base(machine_config &config);
void hp_ipc(machine_config &config);
- void hp_ipc_mem_inner(address_map &map);
+
+ void hp_ipc_mem_inner_base(address_map &map);
+ void hp_ipc_mem_inner_9807a(address_map &map);
void hp_ipc_mem_outer(address_map &map);
+
+ void hp9808a(machine_config &config);
+ void hp_ipc_mem_inner_9808a(address_map &map);
+
private:
required_device<m68000_device> m_maincpu;
required_device<address_map_bank_device> m_bankdev;
@@ -469,7 +476,7 @@ void hp_ipc_state::hp_ipc_mem_outer(address_map &map)
map(0x000000, 0xFFFFFF).rw(this, FUNC(hp_ipc_state::mem_r), FUNC(hp_ipc_state::mem_w));
}
-void hp_ipc_state::hp_ipc_mem_inner(address_map &map)
+void hp_ipc_state::hp_ipc_mem_inner_base(address_map &map)
{
// bus error handler
map(0x0000000, 0x1FFFFFF).rw(this, FUNC(hp_ipc_state::trap_r), FUNC(hp_ipc_state::trap_w));
@@ -477,6 +484,7 @@ void hp_ipc_state::hp_ipc_mem_inner(address_map &map)
// user mode
map(0x1000000, 0x17FFFFF).rw(this, FUNC(hp_ipc_state::ram_r), FUNC(hp_ipc_state::ram_w));
map(0x1800000, 0x187FFFF).rom().region("maincpu", 0);
+ map(0x1E00000, 0x1E0FFFF).rw(this, FUNC(hp_ipc_state::mmu_r), FUNC(hp_ipc_state::mmu_w));
map(0x1E20000, 0x1E2000F).rw("gpu", FUNC(hp1ll3_device::read), FUNC(hp1ll3_device::write)).umask16(0x00ff);
map(0x1E40000, 0x1E4002F).rw("rtc", FUNC(mm58167_device::read), FUNC(mm58167_device::write)).umask16(0x00ff);
@@ -490,13 +498,22 @@ void hp_ipc_state::hp_ipc_mem_inner(address_map &map)
map(0x0620000, 0x062000F).rw("gpu", FUNC(hp1ll3_device::read), FUNC(hp1ll3_device::write)).umask16(0x00ff);
map(0x0630000, 0x063FFFF).noprw(); // AM_DEVREADWRITE8(TMS9914_TAG, tms9914_device, read, write, 0x00ff)
map(0x0640000, 0x064002F).rw("rtc", FUNC(mm58167_device::read), FUNC(mm58167_device::write)).umask16(0x00ff);
- map(0x0650000, 0x065FFFF).noprw(); // HP-IL Printer (optional; ROM sets _desktop to 0 if not mapped) -- sys/lpint.h
map(0x0660000, 0x06600FF).rw("mlc", FUNC(hp_hil_mlc_device::read), FUNC(hp_hil_mlc_device::write)).umask16(0x00ff); // 'caravan', scrn/caravan.h
map(0x0670000, 0x067FFFF).noprw(); // Speaker (NatSemi COP 452)
map(0x0680000, 0x068FFFF).noprw(); // 'SIMON (98628) fast HP-IB card' -- sys/simon.h
map(0x0700000, 0x07FFFFF).unmaprw(); // External I/O
map(0x0800000, 0x0FFFFFF).rw(this, FUNC(hp_ipc_state::ram_r), FUNC(hp_ipc_state::ram_w));
+}
+void hp_ipc_state::hp_ipc_mem_inner_9807a(address_map &map)
+{
+ hp_ipc_mem_inner_base(map);
+ map(0x0650000, 0x065FFFF).noprw(); // HP-IL Printer (optional; ROM sets _desktop to 0 if not mapped) -- sys/lpint.h
+}
+
+void hp_ipc_state::hp_ipc_mem_inner_9808a(address_map &map)
+{
+ hp_ipc_mem_inner_base(map);
}
static INPUT_PORTS_START(hp_ipc)
@@ -687,7 +704,7 @@ void hp_ipc_state::machine_start()
m_bankdev->set_bank(1);
m_lowest_ram_addr = 0x3c0000 - (m_ram->size() >> 1);
- m_internal_ram = (uint16_t *) m_ram->pointer();
+ m_internal_ram = (uint16_t *)m_ram->pointer();
}
void hp_ipc_state::machine_reset()
@@ -715,31 +732,10 @@ SLOT_INTERFACE_END
* 2 HP-HIL devices (keyboard, mouse)
* 1 Real-time clock
*/
-MACHINE_CONFIG_START(hp_ipc_state::hp_ipc)
+MACHINE_CONFIG_START(hp_ipc_state::hp_ipc_base)
MCFG_CPU_ADD("maincpu", M68000, XTAL(15'920'000) / 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_ADDR_WIDTH(25)
- MCFG_ADDRESS_MAP_BANK_DATA_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(6'000'000) * 2, 720, 0, 512, 278, 0, 256)
-// when _desktop == 0:
-// MCFG_SCREEN_RAW_PARAMS(XTAL(6'000'000) * 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")
@@ -766,11 +762,76 @@ MACHINE_CONFIG_START(hp_ipc_state::hp_ipc)
MCFG_RAM_EXTRA_OPTIONS("768K,1M,1576K,2M,3M,4M,5M,6M,7M,7680K")
MACHINE_CONFIG_END
+MACHINE_CONFIG_START(hp_ipc_state::hp_ipc)
+ hp_ipc_base(config);
+
+ MCFG_DEVICE_ADD("bankdev", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(hp_ipc_mem_inner_9807a)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(25)
+ MCFG_ADDRESS_MAP_BANK_DATA_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(6'000'000) * 2, 720, 0, 512, 278, 0, 256)
+ 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")
+MACHINE_CONFIG_END
+
+MACHINE_CONFIG_START(hp_ipc_state::hp9808a)
+ hp_ipc_base(config);
+
+ MCFG_DEVICE_ADD("bankdev", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(hp_ipc_mem_inner_9808a)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(25)
+ MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000000)
+
+ MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::amber())
+ MCFG_SCREEN_UPDATE_DEVICE("gpu", hp1ll3_device, screen_update)
+ MCFG_SCREEN_RAW_PARAMS(XTAL(6'000'000) * 2, 720, 0, 640, 480, 0, 400)
+ MCFG_SCREEN_VBLANK_CALLBACK(DEVWRITELINE("mlc", hp_hil_mlc_device, ap_w))
+ MCFG_DEFAULT_LAYOUT(layout_lcd)
+
+ MCFG_SCREEN_PALETTE("palette")
+ MCFG_PALETTE_ADD_MONOCHROME("palette")
+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_REGION(0x80000, "maincpu", 0)
+ ROM_DEFAULT_BIOS("v50")
+
+ ROM_SYSTEM_BIOS(0, "v10", "HP-UX 1.0")
+ ROMX_LOAD("00095-60006.bin", 0x00000, 0x80000, NO_DUMP, ROM_BIOS(1))
+
+ ROM_SYSTEM_BIOS(1, "v50", "HP-UX 5.0")
+ // Should be spread across 4 x 128K ROMs
+ ROMX_LOAD("hp ipc os 82991a.bin", 0x00000, 0x80000, BAD_DUMP CRC(df45a37b) SHA1(476af9923bca0d2d0f40aeb81be5145ca76fddf5), ROM_BIOS(2))
+
+ ROM_SYSTEM_BIOS(2, "diaga", "Diag ROM A")
+ ROMX_LOAD("boarda_u1.bin", 0x00001, 0x4000, CRC(f40e1434) SHA1(a4f633f3e0971ba3ff218c6d6f777b8253bade8c), ROM_BIOS(3)|ROM_SKIP(1))
+ ROMX_LOAD("boarda_u2.bin", 0x00000, 0x4000, CRC(80f6eb08) SHA1(ea943f72d37b43b5ba06b8e6f11824601109497c), ROM_BIOS(3)|ROM_SKIP(1))
+ ROMX_LOAD("boarda_u3.bin", 0x40001, 0x4000, CRC(0f2fd4d5) SHA1(9ed41fca947d58d7f4159336421601963e3cae17), ROM_BIOS(3)|ROM_SKIP(1))
+ ROMX_LOAD("boarda_u4.bin", 0x40000, 0x4000, CRC(d6741772) SHA1(1574a52d6658f9a7beace6572bea11ee923fc1bf), ROM_BIOS(3)|ROM_SKIP(1))
+
+ ROM_SYSTEM_BIOS(3, "diagb", "Diag ROM B")
+ ROMX_LOAD("boardb_u1.bin", 0x00001, 0x4000, CRC(597777d9) SHA1(24671499e4685f306b1b37a071adc0634f9f1e4e), ROM_BIOS(4)|ROM_SKIP(1))
+ ROMX_LOAD("boardb_u2.bin", 0x00000, 0x4000, CRC(bc2ada19) SHA1(efebab335ca8a57e77b1076050e861a3a0eb09fc), ROM_BIOS(4)|ROM_SKIP(1))
+ ROMX_LOAD("boardb_u3.bin", 0x40001, 0x2000, CRC(c227622a) SHA1(99747945dc6efaa45ce8d7d3c58830dbe46b651a), ROM_BIOS(4)|ROM_SKIP(1))
+ ROMX_LOAD("boardb_u4.bin", 0x40000, 0x2000, CRC(d99efe90) SHA1(345437007f8d728ceafc5cd97414ef94ce38e363), ROM_BIOS(4)|ROM_SKIP(1))
ROM_END
+#define rom_hp9808a rom_hp_ipc
-COMP(1985, hp_ipc, 0, 0, hp_ipc, hp_ipc, hp_ipc_state, 0, "HP", "Integral Personal Computer", MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS)
+// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
+COMP( 1985, hp_ipc, 0, 0, hp_ipc, hp_ipc, hp_ipc_state, 0 , "Hewlett-Packard", "Integral Personal Computer 9807A", MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS)
+COMP( 1985, hp9808a, 0, 0, hp9808a, hp_ipc, hp_ipc_state, 0 , "Hewlett-Packard", "Integral Personal Computer 9808A", MACHINE_NOT_WORKING)
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 027133bc63e..afd81212871 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -15110,6 +15110,7 @@ hotstuff //
@source:hp_ipc.cpp
hp_ipc //
+hp9808a
@source:hp16500.cpp
hp16500b //