From 71ec7154417b4014e0513304c1acbdd6c55c31dc Mon Sep 17 00:00:00 2001 From: Sergey Svishchev Date: Sun, 14 Jan 2018 01:03:46 +0300 Subject: hp_ipc: add diagnostic ROMs; model 9808A (prototype of desktop version) --- src/devices/video/hp1ll3.cpp | 67 +++++++++++++++++------- src/devices/video/hp1ll3.h | 4 +- src/mame/drivers/hp_ipc.cpp | 119 ++++++++++++++++++++++++++++++++----------- src/mame/mame.lst | 1 + 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(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 m_maincpu; required_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 d3aa035bd60..867e2da59d4 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 // -- cgit v1.2.3