From 9c5264614873fec649dbfc3757d03067e600c81f Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 18 Oct 2012 06:27:41 +0000 Subject: [PATCH] hp9k: made drive go into boot process [Gabriele D'Antona] --- src/mess/drivers/hp9k.c | 385 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 356 insertions(+), 29 deletions(-) diff --git a/src/mess/drivers/hp9k.c b/src/mess/drivers/hp9k.c index e09d9cbf704..4aff5fcf75b 100644 --- a/src/mess/drivers/hp9k.c +++ b/src/mess/drivers/hp9k.c @@ -1,42 +1,319 @@ + /*************************************************************************** - Skeleton driver for HP9816 (HP Series 200 series, Technical Desktops) +HP 9816 +1982 +MESS driver by friol (dantonag (at) gmail.com) +System reference mainly from O.De Smet +Driver started on 10/01/2012 - see for docs: http://www.hpmuseum.net/collection_document.php +=== - TODO: everything! +Memory map: + +000000-00ffff - system rom +428000-428fff - keyboard +510000-51ffff - videoram +530000-53ffff - graphic memory +5f0000-5f3fff - system PROM +xxxxxx-ffffff - system RAM + +=== + +- 0x408: startup code, 68000 registers test +- 0x1002: bootrom test +- 0x1d18: PROM test +- 0x103C: prints "bootrom failed" +- 0x1150: other boot test +- 0x1164: keyboard test +- 0x1202: post-kbd test +- 0x12c6: "loading memory" test + +=== + +TODO: boot tests fail ****************************************************************************/ #include "emu.h" #include "cpu/m68000/m68000.h" -//#include "video/mc6845.h" +#include "video/mc6845.h" +#include "machine/terminal.h" //#include "machine/ins8250.h" +#define HP9816_CHDIMX 8 +#define HP9816_CHDIMY 16 +#define HP9816_ROWX 80 +#define HP9816_ROWY 25 + +// + +static UINT8 prom16a[256] = { + 0x00,0x00, // checksum + 0x00, // 256 bytes idprom + '2', '0', '1', '0', 'A', '0', '0', '0', '0', '0', '0', // serial in ascii DDDDCSSSSSS date code, country, serial number + '9', '8', '1', '6', 'A', ' ', ' ', // product number + 0xff, // 8 bits processor board config + 0x01, // keyboard 98203B + 0x02, // CRT alpha see crtid for monitor + 0x03, // HP-IB + 0x04, // Graphics + 0xff, // end + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff,0xfe,0x00,0x00, // bottom minimun address for ram size + 0xff,0xff, // 16 required IO cards here not used + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff, + 0xff,0xff,0xff,0xff, // boot msus to try before Boot list scan + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // Boot file name + 0x00,0x00,0x00,0x00, // delay in millisec before boot scan + 0x00, // owner byte, HP format + 0x00, // id prom revision byte : 0x00 + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // rest reserved at 0xFF + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff +}; + +// class hp9k_state : public driver_device { +private: + + int crtc_curreg; + int crtc_addrStartHi; + int crtc_addrStartLow; + + void calc_prom_crc(UINT8* prom); + void putChar(UINT8 thec,int x,int y,bitmap_ind16 &bitmap); + public: hp9k_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu") - , - m_p_videoram(*this, "p_videoram"){ } + m_maincpu(*this, "maincpu"), + //m_terminal(*this, TERMINAL_TAG), + m_6845(*this, "mc6845") + { + kbdBit=0; + crtc_curreg=0; + crtc_addrStartHi=0; + crtc_addrStartLow=0; + calc_prom_crc(prom16a); + } + + UINT8 kbdBit; required_device m_maincpu; - required_shared_ptr m_p_videoram; - virtual void machine_reset(); - virtual void video_start(); - UINT32 screen_update_hp9k(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + //required_device m_terminal; + required_device m_6845; + + UINT8 m_videoram[0x4000]; + UINT8 m_screen[0x800]; + + DECLARE_DRIVER_INIT(hp9k); + + DECLARE_READ16_MEMBER(buserror_r); + DECLARE_WRITE16_MEMBER(buserror_w); + + DECLARE_READ16_MEMBER(hp9k_videoram_r); + DECLARE_WRITE16_MEMBER(hp9k_videoram_w); + + DECLARE_READ16_MEMBER(hp9k_prom_r); + DECLARE_WRITE16_MEMBER(hp9k_prom_w); + + DECLARE_READ16_MEMBER(keyboard_r); + DECLARE_WRITE16_MEMBER(keyboard_w); + + DECLARE_READ16_MEMBER(leds_r); + DECLARE_WRITE16_MEMBER(leds_w); + + DECLARE_WRITE8_MEMBER(kbd_put); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); }; +// + +void hp9k_state::calc_prom_crc(UINT8* prom) +{ + int chksum; + int i; + + chksum = 0; + for (i=0; i < 256; i+=2) + { + chksum += ((prom[i] << 8) | prom[i+1]); + if (chksum&0x10000) chksum++; + chksum&=0xffff; + } + + chksum=(chksum+1)&0xffff; + + if (chksum!=0) + { + chksum=(0x10000-chksum); + prom[0]=(UINT8)(chksum>>8); + prom[1]=(UINT8)(chksum&0xff); + } +} + +READ16_MEMBER( hp9k_state::keyboard_r ) +{ + //printf("keyboard read at [%x] mask [%x]\n",offset,mem_mask); + return 0x31; +} + +WRITE16_MEMBER( hp9k_state::keyboard_w ) +{ + //printf("keyboard write of [%x] at [%x]\n",data,offset); +} + +READ16_MEMBER( hp9k_state::leds_r ) +{ + //printf("warning: leds read at [%x] mm [%x]\n",offset,mem_mask); + return 0; +} + +WRITE16_MEMBER( hp9k_state::leds_w ) +{ + //printf("warning: leds write of [%x] at [%x] mm [%x]\n",data,offset,mem_mask); +} + +READ16_MEMBER( hp9k_state::hp9k_prom_r ) +{ + //if (mem_mask!=0xff) printf("read of PROM at [%x] mem_mask [%x]\n",offset,mem_mask); + int k=prom16a[offset&0xff]; + if (mem_mask==0xff00) return (k<<8); + else return k; + //return 0; +} + +WRITE16_MEMBER( hp9k_state::hp9k_prom_w ) +{ + //printf("Error: write to prom\n"); +} + +READ16_MEMBER( hp9k_state::hp9k_videoram_r ) +{ + offset&=0x3fff; + + //printf("videoram read at [%x] mem_mask [%x]\n",offset,mem_mask); + + if (offset==0x0001) + { + //printf("m6845 read at [%x] mem_mask [%x]\n",offset,mem_mask); + return m_6845->register_r(space,0); + } + else + { + if (mem_mask==0xff00) + { + return m_videoram[offset]<<8; + } + else + { + return m_videoram[offset]; + } + } +} + +WRITE16_MEMBER( hp9k_state::hp9k_videoram_w ) +{ + offset&=0x3fff; + + if (offset==0x0000) + { + //printf("6845 address write [%x] at [%x] mask [%x]\n",data,offset,mem_mask); + data&=0x1f; + m_6845->address_w( space, 0, data ); + crtc_curreg=data; + } + else if (offset==0x0001) + { + //printf("6845 register write [%x] at [%x] mask [%x]\n",data,offset,mem_mask); + m_6845->register_w( space, 0, data ); + if (crtc_curreg==0x0c) crtc_addrStartHi=data; + if (crtc_curreg==0x0d) crtc_addrStartLow=data; + } + else + { + //printf("videoram write [%x] at [%x]\n",data,offset); + + if (mem_mask==0xff00) + { + m_screen[offset&0x7ff]=data>>8; + m_videoram[offset&0x3fff]=data>>8; + + //UINT8 *rom = machine().region("bootrom")->base(); + //rom[0x90B]=0x00; + } + else + { + m_screen[offset&0x7ff]=data; + m_videoram[offset&0x3fff]=data; + } + } +} + +READ16_MEMBER(hp9k_state::buserror_r) +{ + m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); + return 0; +} + +WRITE16_MEMBER(hp9k_state::buserror_w) +{ + m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); +} static ADDRESS_MAP_START(hp9k_mem, AS_PROGRAM, 16, hp9k_state) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x000000, 0x00ffff) AM_ROM - AM_RANGE(0x010000, 0x3fffff) AM_RAM // guessing - AM_RANGE(0x512000, 0x512fff) AM_RAM AM_SHARE("p_videoram") // videoram - AM_RANGE(0xffc000, 0xffffff) AM_RAM // system ram + AM_RANGE(0x000000, 0x000909) AM_ROM AM_REGION("bootrom",0) + AM_RANGE(0x00090a, 0x00090d) AM_READWRITE(leds_r,leds_w) + AM_RANGE(0x00090e, 0x00ffff) AM_ROM AM_REGION("bootrom",0x90e) + AM_RANGE(0x010000, 0x427fff) AM_READWRITE(buserror_r,buserror_w) + AM_RANGE(0x428000, 0x428fff) AM_READWRITE(keyboard_r,keyboard_w) + AM_RANGE(0x429000, 0x50ffff) AM_READWRITE(buserror_r,buserror_w) + AM_RANGE(0x510000, 0x51ffff) AM_READWRITE(hp9k_videoram_r,hp9k_videoram_w) + AM_RANGE(0x520000, 0x52ffff) AM_READWRITE(buserror_r,buserror_w) + AM_RANGE(0x530000, 0x53ffff) AM_RAM // graphic memory + AM_RANGE(0x540000, 0x5effff) AM_READWRITE(buserror_r,buserror_w) + AM_RANGE(0x5f0000, 0x5f3fff) AM_READWRITE(hp9k_prom_r,hp9k_prom_w) + //AM_RANGE(0x5f0000, 0x5f3fff) AM_READWRITE(buserror_r,buserror_w) + AM_RANGE(0x5f4000, 0xfbffff) AM_READWRITE(buserror_r,buserror_w) + AM_RANGE(0xFC0000, 0xffffff) AM_RAM // system ram ADDRESS_MAP_END @@ -45,14 +322,13 @@ static INPUT_PORTS_START( hp9k ) INPUT_PORTS_END -void hp9k_state::machine_reset() +DRIVER_INIT_MEMBER(hp9k_state,hp9k) { } -/* F4 Character Displayer */ static const gfx_layout hp9k_charlayout = { - 8, 16, /* 8 x 16 characters */ + HP9816_CHDIMX, HP9816_CHDIMY, 256, /* 256 characters */ 1, /* 1 bits per pixel */ { 0 }, /* no bitplanes */ @@ -64,48 +340,99 @@ static const gfx_layout hp9k_charlayout = }; static GFXDECODE_START( hp9k ) - GFXDECODE_ENTRY( "maincpu", 0x2000, hp9k_charlayout, 0, 1 ) + GFXDECODE_ENTRY( "bootrom", 0x2000, hp9k_charlayout, 0, 1 ) GFXDECODE_END - -void hp9k_state::video_start() +void hp9k_state::putChar(UINT8 thec,int x,int y,bitmap_ind16 &bitmap) { + const UINT8* pchar=machine().gfx[0]->get_data(thec); + + for (int py=0;py