Previous 199869 Revisions Next

r18588 Thursday 18th October, 2012 at 06:27:41 UTC by Miodrag Milanović
hp9k: made drive go into boot process [Gabriele D'Antona]
[src/mess/drivers]hp9k.c

trunk/src/mess/drivers/hp9k.c
r18587r18588
1
12/***************************************************************************
23
3    Skeleton driver for HP9816 (HP Series 200 series, Technical Desktops)
4HP 9816
51982
6MESS driver by friol (dantonag (at) gmail.com)
7System reference mainly from O.De Smet
8Driver started on 10/01/2012
49
5    see for docs: http://www.hpmuseum.net/collection_document.php
10===
611
7    TODO: everything!
12Memory map:
813
14000000-00ffff - system rom
15428000-428fff - keyboard
16510000-51ffff - videoram
17530000-53ffff - graphic memory
185f0000-5f3fff - system PROM
19xxxxxx-ffffff - system RAM
20
21===
22
23- 0x408: startup code, 68000 registers test
24- 0x1002: bootrom test
25- 0x1d18: PROM test
26- 0x103C: prints "bootrom failed"
27- 0x1150: other boot test
28- 0x1164: keyboard test
29- 0x1202: post-kbd test
30- 0x12c6: "loading memory" test
31
32===
33
34TODO: boot tests fail
35
936****************************************************************************/
1037
1138#include "emu.h"
1239#include "cpu/m68000/m68000.h"
13//#include "video/mc6845.h"
40#include "video/mc6845.h"
41#include "machine/terminal.h"
1442//#include "machine/ins8250.h"
1543
44#define HP9816_CHDIMX 8
45#define HP9816_CHDIMY 16
46#define HP9816_ROWX 80
47#define HP9816_ROWY 25
1648
49//
50
51static UINT8 prom16a[256] = {
52   0x00,0x00,      // checksum
53   0x00,         // 256 bytes idprom
54    '2', '0', '1', '0', 'A', '0', '0', '0', '0', '0', '0',      // serial in ascii DDDDCSSSSSS date code, country, serial number
55    '9', '8', '1', '6', 'A', ' ', ' ',                     // product number
56   0xff,         // 8 bits processor board config                                         
57   0x01,         // keyboard 98203B
58   0x02,         // CRT alpha see crtid for monitor
59   0x03,         // HP-IB
60   0x04,         // Graphics
61   0xff,         // end
62   0xff,
63   0xff,
64   0xff,
65   0xff,
66   0xff,
67   0xff,
68   0xff,
69   0xff,
70   0xff,
71   0xff,
72   0xff,
73   0xff,0xfe,0x00,0x00,         // bottom minimun address for ram size
74   0xff,0xff,                  // 16 required IO cards here not used
75   0xff,0xff,
76   0xff,0xff,
77   0xff,0xff,
78   0xff,0xff,
79   0xff,0xff,
80   0xff,0xff,
81   0xff,0xff,
82   0xff,0xff,
83   0xff,0xff,
84   0xff,0xff,
85   0xff,0xff,
86   0xff,0xff,
87   0xff,0xff,
88   0xff,0xff,
89   0xff,0xff,
90   0xff,0xff,0xff,0xff,         // boot msus to try before Boot list scan
91   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,   // Boot file name
92   0x00,0x00,0x00,0x00,         // delay in millisec before boot scan
93   0x00,                     // owner byte, HP format
94   0x00,                     // id prom revision byte : 0x00
95   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,                           // rest reserved at 0xFF
96   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
97   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
98   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
99   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
100   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
101   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
102   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
103   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
104   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
105};
106
107//
108
17109class hp9k_state : public driver_device
18110{
111private:
112
113   int crtc_curreg;
114   int crtc_addrStartHi;
115   int crtc_addrStartLow;
116   
117   void calc_prom_crc(UINT8* prom);
118   void putChar(UINT8 thec,int x,int y,bitmap_ind16 &bitmap);
119   
19120public:
20121   hp9k_state(const machine_config &mconfig, device_type type, const char *tag)
21122      : driver_device(mconfig, type, tag),
22   m_maincpu(*this, "maincpu")
23   ,
24      m_p_videoram(*this, "p_videoram"){ }
123   m_maincpu(*this, "maincpu"),
124   //m_terminal(*this, TERMINAL_TAG),
125  m_6845(*this, "mc6845")
126   {
127      kbdBit=0;
128      crtc_curreg=0;
129      crtc_addrStartHi=0;
130      crtc_addrStartLow=0;
131      calc_prom_crc(prom16a);
132   }
25133
134   UINT8 kbdBit;
135
26136   required_device<cpu_device> m_maincpu;
27   required_shared_ptr<UINT16> m_p_videoram;
28   virtual void machine_reset();
29   virtual void video_start();
30   UINT32 screen_update_hp9k(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
137   //required_device<device_t> m_terminal;
138   required_device<mc6845_device> m_6845;
139   
140   UINT8 m_videoram[0x4000];
141   UINT8 m_screen[0x800];
142
143   DECLARE_DRIVER_INIT(hp9k);
144
145   DECLARE_READ16_MEMBER(buserror_r);
146   DECLARE_WRITE16_MEMBER(buserror_w);
147
148   DECLARE_READ16_MEMBER(hp9k_videoram_r);
149   DECLARE_WRITE16_MEMBER(hp9k_videoram_w);
150
151   DECLARE_READ16_MEMBER(hp9k_prom_r);
152   DECLARE_WRITE16_MEMBER(hp9k_prom_w);
153
154   DECLARE_READ16_MEMBER(keyboard_r);
155   DECLARE_WRITE16_MEMBER(keyboard_w);
156
157   DECLARE_READ16_MEMBER(leds_r);
158   DECLARE_WRITE16_MEMBER(leds_w);
159
160   DECLARE_WRITE8_MEMBER(kbd_put);
161
162   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
31163};
32164
165//
33166
167void hp9k_state::calc_prom_crc(UINT8* prom)
168{
169   int chksum;
170   int i;
171   
172   chksum = 0;
173   for (i=0; i < 256; i+=2)
174   {
175      chksum += ((prom[i] << 8) | prom[i+1]);
176      if (chksum&0x10000) chksum++;
177      chksum&=0xffff;
178   }
179   
180   chksum=(chksum+1)&0xffff;
181   
182   if (chksum!=0)
183   {
184      chksum=(0x10000-chksum);
185      prom[0]=(UINT8)(chksum>>8);
186      prom[1]=(UINT8)(chksum&0xff);
187   }
188}
189
190READ16_MEMBER( hp9k_state::keyboard_r )
191{
192   //printf("keyboard read at [%x] mask [%x]\n",offset,mem_mask);
193   return 0x31;
194}
195
196WRITE16_MEMBER( hp9k_state::keyboard_w )
197{
198   //printf("keyboard write of [%x] at [%x]\n",data,offset);
199}
200
201READ16_MEMBER( hp9k_state::leds_r )
202{
203   //printf("warning: leds read at [%x] mm [%x]\n",offset,mem_mask);
204   return 0;
205}
206
207WRITE16_MEMBER( hp9k_state::leds_w )
208{
209   //printf("warning: leds write of [%x] at [%x] mm [%x]\n",data,offset,mem_mask);
210}
211
212READ16_MEMBER( hp9k_state::hp9k_prom_r )
213{
214   //if (mem_mask!=0xff) printf("read of PROM at [%x] mem_mask [%x]\n",offset,mem_mask);
215   int k=prom16a[offset&0xff];
216   if (mem_mask==0xff00) return (k<<8);
217   else return k;
218   //return 0;
219}
220
221WRITE16_MEMBER( hp9k_state::hp9k_prom_w )
222{
223   //printf("Error: write to prom\n");
224}
225
226READ16_MEMBER( hp9k_state::hp9k_videoram_r )
227{
228   offset&=0x3fff;
229
230   //printf("videoram read at [%x] mem_mask [%x]\n",offset,mem_mask);
231
232   if (offset==0x0001)
233   {
234      //printf("m6845 read at [%x] mem_mask [%x]\n",offset,mem_mask);
235      return m_6845->register_r(space,0);
236   }
237   else
238   {
239      if (mem_mask==0xff00)
240      {
241         return m_videoram[offset]<<8;
242      }
243      else
244      {
245         return m_videoram[offset];
246      }
247   }
248}
249
250WRITE16_MEMBER( hp9k_state::hp9k_videoram_w )
251{
252   offset&=0x3fff;
253
254   if (offset==0x0000)
255   {
256      //printf("6845 address write [%x] at [%x] mask [%x]\n",data,offset,mem_mask);
257      data&=0x1f;
258      m_6845->address_w( space, 0, data );
259      crtc_curreg=data;
260   }
261   else if (offset==0x0001)
262   {
263      //printf("6845 register write [%x] at [%x] mask [%x]\n",data,offset,mem_mask);
264      m_6845->register_w( space, 0, data );
265      if (crtc_curreg==0x0c) crtc_addrStartHi=data;
266      if (crtc_curreg==0x0d) crtc_addrStartLow=data;
267   }
268   else
269   {
270      //printf("videoram write [%x] at [%x]\n",data,offset);
271     
272      if (mem_mask==0xff00)
273         {
274            m_screen[offset&0x7ff]=data>>8;
275            m_videoram[offset&0x3fff]=data>>8;
276
277            //UINT8 *rom = machine().region("bootrom")->base();
278            //rom[0x90B]=0x00;
279         }
280         else
281         {
282            m_screen[offset&0x7ff]=data;
283            m_videoram[offset&0x3fff]=data;
284         }
285   }
286}
287
288READ16_MEMBER(hp9k_state::buserror_r)
289{
290   m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
291   m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
292   return 0;
293}
294
295WRITE16_MEMBER(hp9k_state::buserror_w)
296{
297   m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
298   m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
299}
300
34301static ADDRESS_MAP_START(hp9k_mem, AS_PROGRAM, 16, hp9k_state)
35302   ADDRESS_MAP_UNMAP_HIGH
36   AM_RANGE(0x000000, 0x00ffff) AM_ROM
37   AM_RANGE(0x010000, 0x3fffff) AM_RAM // guessing
38   AM_RANGE(0x512000, 0x512fff) AM_RAM AM_SHARE("p_videoram") // videoram
39   AM_RANGE(0xffc000, 0xffffff) AM_RAM // system ram
303   AM_RANGE(0x000000, 0x000909) AM_ROM AM_REGION("bootrom",0)
304   AM_RANGE(0x00090a, 0x00090d) AM_READWRITE(leds_r,leds_w)
305   AM_RANGE(0x00090e, 0x00ffff) AM_ROM AM_REGION("bootrom",0x90e)
306   AM_RANGE(0x010000, 0x427fff) AM_READWRITE(buserror_r,buserror_w)
307   AM_RANGE(0x428000, 0x428fff) AM_READWRITE(keyboard_r,keyboard_w)
308   AM_RANGE(0x429000, 0x50ffff) AM_READWRITE(buserror_r,buserror_w)
309   AM_RANGE(0x510000, 0x51ffff) AM_READWRITE(hp9k_videoram_r,hp9k_videoram_w)
310   AM_RANGE(0x520000, 0x52ffff) AM_READWRITE(buserror_r,buserror_w)
311   AM_RANGE(0x530000, 0x53ffff) AM_RAM // graphic memory
312   AM_RANGE(0x540000, 0x5effff) AM_READWRITE(buserror_r,buserror_w)
313   AM_RANGE(0x5f0000, 0x5f3fff) AM_READWRITE(hp9k_prom_r,hp9k_prom_w)
314   //AM_RANGE(0x5f0000, 0x5f3fff) AM_READWRITE(buserror_r,buserror_w)
315   AM_RANGE(0x5f4000, 0xfbffff) AM_READWRITE(buserror_r,buserror_w)
316   AM_RANGE(0xFC0000, 0xffffff) AM_RAM // system ram
40317ADDRESS_MAP_END
41318
42319
r18587r18588
45322INPUT_PORTS_END
46323
47324
48void hp9k_state::machine_reset()
325DRIVER_INIT_MEMBER(hp9k_state,hp9k)
49326{
50327}
51328
52/* F4 Character Displayer */
53329static const gfx_layout hp9k_charlayout =
54330{
55   8, 16,               /* 8 x 16 characters */
331   HP9816_CHDIMX, HP9816_CHDIMY,
56332   256,               /* 256 characters */
57333   1,               /* 1 bits per pixel */
58334   { 0 },               /* no bitplanes */
r18587r18588
64340};
65341
66342static GFXDECODE_START( hp9k )
67   GFXDECODE_ENTRY( "maincpu", 0x2000, hp9k_charlayout, 0, 1 )
343   GFXDECODE_ENTRY( "bootrom", 0x2000, hp9k_charlayout, 0, 1 )
68344GFXDECODE_END
69345
70
71void hp9k_state::video_start()
346void hp9k_state::putChar(UINT8 thec,int x,int y,bitmap_ind16 &bitmap)
72347{
348   const UINT8* pchar=machine().gfx[0]->get_data(thec);
349   
350   for (int py=0;py<HP9816_CHDIMY;py++)
351   {
352      for (int px=0;px<HP9816_CHDIMX;px++)
353      {
354         UINT16 *dest=&bitmap.pix16((y*(HP9816_CHDIMY))+py,(x*(HP9816_CHDIMX))+px);
355         *dest=pchar[px+(py*8)];
356      }
357   }
73358}
74359
75UINT32 hp9k_state::screen_update_hp9k(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
360UINT32 hp9k_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
76361{
362   //UINT8* pvram=&m_screen[1];
363
364   int startAddr=((crtc_addrStartLow&0xff)|((crtc_addrStartHi<<8)))&0x3fff;
365   int chStart=startAddr&0x1fff;
366
367   for (int r=0;r<HP9816_ROWY;r++)
368   {
369      for (int c=0;c<HP9816_ROWX;c++)
370      {
371         //UINT8 thec=pvram[((c+(r*80))+160+47)&0x7ff];
372         //UINT8 thec=m_videoram[((c+(r*80))+startAddr)];
373         UINT8 thec=m_screen[chStart&0x7ff];
374         putChar(thec,c,r,bitmap);
375         chStart++;
376      }
377   }
378   
379   //putChar(0x44,0,0,pscr);
77380   return 0;
78381}
79382
383WRITE8_MEMBER( hp9k_state::kbd_put )
384{
385   kbdBit=data;
386}
387
388static const mc6845_interface hp9k_mc6845_intf = {
389   "screen",         /* name of screen */
390   8,         /* number of dots per character */
391   NULL,
392   NULL,      /* handler to display a scanline */
393   NULL,
394   DEVCB_NULL,
395   DEVCB_NULL,
396   DEVCB_NULL,
397   DEVCB_NULL,
398   NULL
399};
400
80401static MACHINE_CONFIG_START( hp9k, hp9k_state )
81402   /* basic machine hardware */
82403   MCFG_CPU_ADD("maincpu",M68000, XTAL_8MHz)
83404   MCFG_CPU_PROGRAM_MAP(hp9k_mem)
84405
406   /* video hardware */
85407
86   /* video hardware */
87408   MCFG_SCREEN_ADD("screen", RASTER)
88409   MCFG_SCREEN_REFRESH_RATE(50)
89   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
90   MCFG_SCREEN_SIZE(640, 480)
91   MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
92   MCFG_SCREEN_UPDATE_DRIVER(hp9k_state, screen_update_hp9k)
410   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
411   MCFG_SCREEN_SIZE(HP9816_ROWX*HP9816_CHDIMX, HP9816_ROWY*HP9816_CHDIMY)
412   MCFG_SCREEN_VISIBLE_AREA(0, (HP9816_ROWX*HP9816_CHDIMX)-1, 0, (HP9816_ROWY*HP9816_CHDIMY)-1)
413
414   MCFG_SCREEN_UPDATE_DRIVER(hp9k_state, screen_update)
415
93416   MCFG_GFXDECODE(hp9k)
94417   MCFG_PALETTE_LENGTH(2)
95418   MCFG_PALETTE_INIT(black_and_white)
419   
420   MCFG_MC6845_ADD( "mc6845", MC6845, XTAL_16MHz / 16, hp9k_mc6845_intf )
96421MACHINE_CONFIG_END
97422
98423/* ROM definition */
99424ROM_START( hp9816 )
100   ROM_REGION16_BE(0x1000000, "maincpu", 0)
425   ROM_REGION16_BE(0x10000, "bootrom", 0)
426
101427   ROM_DEFAULT_BIOS("bios40")
102428   ROM_SYSTEM_BIOS(0, "bios40",  "Bios v4.0")
103429   ROMX_LOAD( "rom40.bin", 0x0000, 0x10000, CRC(36005480) SHA1(645a077ffd95e4c31f05cd8bbd6e4554b12813f1), ROM_BIOS(1) )
104430   ROM_SYSTEM_BIOS(1, "bios30",  "Bios v3.0")
105431   ROMX_LOAD( "rom30.bin", 0x0000, 0x10000, CRC(05c07e75) SHA1(3066a65e6137482041f9a77d09ee2289fe0974aa), ROM_BIOS(2) )
432   
106433ROM_END
107434
108435/* Driver */
109436
110437/*    YEAR  NAME    PARENT  COMPAT   MACHINE    INPUT    INIT    COMPANY   FULLNAME       FLAGS */
111COMP( 1982, hp9816,   0,       0,       hp9k,   hp9k, driver_device,    0,      "Hewlett Packard",   "HP 9816", GAME_NOT_WORKING | GAME_NO_SOUND)
438COMP( 1982,   hp9816,   0,      0,      hp9k,   hp9k, hp9k_state,      hp9k,   "Hewlett Packard",   "HP 9816" , GAME_NOT_WORKING | GAME_NO_SOUND )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team