Previous 199869 Revisions Next

r22692 Tuesday 7th May, 2013 at 15:13:57 UTC by Robbbert
(MESS) D6800: Various improvements. Most games are playable. [Robbbert]
[src/mess/drivers]d6800.c

trunk/src/mess/drivers/d6800.c
r22691r22692
1010
1111    NOTE that the display only updates after each 4 digits is entered, and
1212    you can't see what you type as you change bytes. This is by design.
13    The speaker is supposed to bleep on each keystroke, but it only gets
14    one pulse - which is almost inaudible.
1513
1614    Function keys:
1715    FN 0 - Modify memory - firstly enter a 4-digit address, then 2-digit data
r22691r22692
9593private:
9694   UINT8 m_rtc;
9795   bool m_screen_on;
98   UINT8 m_kbd_s;
9996   UINT8 m_portb;
10097   virtual void machine_start();
10198   virtual void machine_reset();
r22691r22692
107104static ADDRESS_MAP_START( d6800_map, AS_PROGRAM, 8, d6800_state )
108105   AM_RANGE(0x0000, 0x00ff) AM_RAM
109106   AM_RANGE(0x0100, 0x01ff) AM_RAM AM_SHARE("videoram")
110   AM_RANGE(0x0200, 0x07ff) AM_RAM
107   AM_RANGE(0x0200, 0x0fff) AM_RAM
111108   AM_RANGE(0x8010, 0x8013) AM_DEVREADWRITE("pia", pia6821_device, read, write)
112109   AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3c00) AM_ROM
113110ADDRESS_MAP_END
r22691r22692
120117   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1')
121118   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2')
122119   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3')
120   PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
123121
124122   PORT_START("X1")
125123   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
126124   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5')
127125   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6')
128126   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7')
127   PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
129128
130129   PORT_START("X2")
131130   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8')
132131   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9')
133132   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A')
134133   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B')
134   PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
135135
136136   PORT_START("X3")
137137   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
138138   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D')
139139   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E')
140140   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F')
141   PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
141142
142143   PORT_START("Y0")
144   PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
143145   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
144146   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
145147   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8')
146148   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
147149
148150   PORT_START("Y1")
151   PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
149152   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1')
150153   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5')
151154   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9')
152155   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D')
153156
154157   PORT_START("Y2")
158   PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
155159   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2')
156160   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6')
157161   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A')
158162   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E')
159163
160164   PORT_START("Y3")
165   PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
161166   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3')
162167   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7')
163168   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B')
r22691r22692
201206
202207/* PIA6821 Interface */
203208
209
204210TIMER_DEVICE_CALLBACK_MEMBER(d6800_state::d6800_p)
205211{
206212   m_rtc++;
207   m_maincpu->set_input_line(M6800_IRQ_LINE, (m_rtc) ? CLEAR_LINE : ASSERT_LINE);
213   if (m_rtc > 159)
214      m_rtc = 0;
215
216   UINT8 data = m_io_x0->read() & m_io_x1->read() & m_io_x2->read() & m_io_x3->read();
217   m_pia->ca1_w( (data == 255) ? 0 : 1);
218   data = m_io_shift->read();
219   m_pia->ca2_w( data );
220   m_pia->cb1_w((m_rtc) ? 1 : 0);
208221}
209222
210223
211// not used
212224READ_LINE_MEMBER( d6800_state::d6800_rtc_pulse )
213225{
214   return 1;
226   return (m_rtc) ? 1 : 0;
215227}
216228
217229READ_LINE_MEMBER( d6800_state::d6800_keydown_r )
218230{
219231   UINT8 data = m_io_x0->read() & m_io_x1->read() & m_io_x2->read() & m_io_x3->read();
220232
221   m_kbd_s = (data == 15) ? 0 : 1;
222
223   return m_kbd_s;
233   return (data == 255) ? 0 : 1;
224234}
225235
226236READ_LINE_MEMBER( d6800_state::d6800_fn_key_r )
r22691r22692
267277   lines around and reads it another way. This isolates the key that was pressed.
268278   */
269279
270   m_kbd_s++;
280   UINT8 data = m_io_x0->read() & m_io_x1->read() & m_io_x2->read() & m_io_x3->read()
281              & m_io_y0->read() & m_io_y1->read() & m_io_y2->read() & m_io_y3->read();
271282
272   if (m_kbd_s == 3)
273      return 0x0f & m_io_x0->read() & m_io_x1->read() & m_io_x2->read() & m_io_x3->read();
274   else
275   if (m_kbd_s == 6)
276      return 0xf0 & m_io_y0->read() & m_io_y1->read() & m_io_y2->read() & m_io_y3->read();
277   else
278      return 0xff;
283   return data;
279284}
280285
281286WRITE8_MEMBER( d6800_state::d6800_keyboard_w )
r22691r22692
322327void d6800_state::machine_reset()
323328{
324329   m_beeper->set_state(0);
330   m_rtc = 0;
325331}
326332
327333/* Machine Drivers */
r22691r22692
364370      else
365371      {
366372         for (i = 0; i < quick_length; i++)
367            if ((quick_addr + i) < 0x800)
373            if ((quick_addr + i) < 0x1000)
368374               space.write_byte(i + quick_addr, quick_data[i]);
369375
370376         /* display a message about the loaded quickload */
r22691r22692
387393   MCFG_CPU_ADD("maincpu",M6800, XTAL_4MHz/4)
388394   MCFG_CPU_PROGRAM_MAP(d6800_map)
389395
390
391396   /* video hardware */
392397   MCFG_SCREEN_ADD("screen", RASTER)
393398   MCFG_SCREEN_REFRESH_RATE(50)
394399   MCFG_SCREEN_SIZE(64, 32)
395400   MCFG_SCREEN_VISIBLE_AREA(0, 63, 0, 31)
396401   MCFG_SCREEN_UPDATE_DRIVER(d6800_state, screen_update_d6800)
397
402   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(25))
398403   MCFG_PALETTE_LENGTH(2)
399404   MCFG_PALETTE_INIT(black_and_white)
400405
r22691r22692
419424ROM_START( d6800 )
420425   ROM_REGION( 0x10000, "maincpu", 0 )
421426   ROM_LOAD( "d6800.bin", 0xc000, 0x0400, CRC(3f97ca2e) SHA1(60f26e57a058262b30befceceab4363a5d65d877) )
422   //ROM_FILL(0xc2eb,2,1)
423427ROM_END
424428
425429/*    YEAR  NAME   PARENT  COMPAT  MACHINE   INPUT       INIT        COMPANY             FULLNAME      FLAGS */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team