1 // license:BSD-3-Clause
2 // copyright-holders:R. Belmont
3 /***************************************************************************
4
5 Peripheral Technology PT68K2/PT68K4 family
6
7 2011-01-03 Skeleton driver.
8 2013-09-30 Connected to a terminal
9 2014-01-03 Connect real DUARTs, FDC, and TimeKeeper. Settings now save properly, floppies can be read.
10 2014-01-19 ISA bus and compatible cards, PC keyboard support, speaker support
11 2014-09-20 Add PT68K2, add save states, we have a working SK*DOS disk!
12
13 This has the appearance of a PC, including pc power supply, slots, etc
14 on a conventional pc-like motherboard and case.
15
16 Some pics: http://www.wormfood.net/old_computers/
17
18 Source code and manuals for the HUMBUG BIOS and SK*DOS are at:
19 http://www.users.cloud9.net/~stark/sources.html
20
21 Usage:
22 Start up and press Enter as prompted. Type he to see a command list, or fd to boot from the
23 first floppy drive.
24
25 The stock NVRAM configures PT68k2 for 2 DSDD 5.25" drives, and PT68k4 for 2 DSHD 5.25" drives.
26
27 Chips:
28 68230 Parallel Interface/Timer @ FE0081
29 68681 DUART/Timer (x2) @ FE0001 and FE0041
30 WD37C65 FDC (PC FDC compatible, even mapped as an ISA device)
31 MK48T02 TimeKeeper @ odd bytes from FF0001 to FF0FFF. even bytes in that range are a standard SRAM chip which is not backed up.
32 Keyboard at FE01C1 (status/IRQ clear)/FE01C3 (AT scan codes)
33 WD1002 HDD controller @ FE0141-FE014F. "Monk" BIOS also supports an 8-bit ISA IDE card.
34
35 Video: ISA MDA or CGA/EGA/VGA-style boards
36 ISA memory is C00001-DFFFFF odd bytes only. So the MDA B0000 framebuffer becames (B0000*2) + C00001 = D60001.
37 ISA I/O is at FA0001-FBFFFF odd bytes only, and the mapping is similar.
38
39 HUMBUG BIOS tests MDA and CGA VRAM to determine existence, falls back to serial console if neither exists. If both exist, MDA is used.
40 VRAM is every other byte for ISA cards. (Only 8 bit cards are supported).
41
42 OP3 on DUART1 drives a speaker.
43 IP2 on DUART1 signals if a new keyboard scan code is available.
44
45 IRQs:
46 2: 68230 PIT
47 4: DUART2
48 5: DUART1
49 6: PC FDC IRQ
50
51 TODO: 68230 device
52 This system and SK*DOS don't like our ISA WDXT-GEN emulation so HDD installs are not currently possible.
53
54 ****************************************************************************/
55
56 #include "emu.h"
57
58 #include "cpu/m68000/m68000.h"
59 #include "machine/mc68681.h"
60 #include "machine/timekpr.h"
61 #include "machine/wd_fdc.h"
62 #include "sound/spkrdev.h"
63
64 #include "bus/isa/cga.h"
65 #include "bus/isa/ega.h"
66 #include "bus/isa/fdc.h"
67 #include "bus/isa/isa.h"
68 #include "bus/isa/isa_cards.h"
69 #include "bus/isa/lpt.h"
70 #include "bus/isa/mda.h"
71 #include "bus/isa/vga.h"
72 #include "bus/isa/wdxt_gen.h"
73 #include "bus/isa/xtide.h"
74 #include "bus/pc_kbd/keyboards.h"
75 #include "bus/pc_kbd/pc_kbdc.h"
76
77 #include "softlist.h"
78 #include "speaker.h"
79
80 #include "formats/imd_dsk.h"
81
82
83 #define M68K_TAG "maincpu"
84 #define DUART1_TAG "duart1"
85 #define DUART2_TAG "duart2"
86 #define TIMEKEEPER_TAG "timekpr"
87 #define ISABUS_TAG "isa"
88 #define KBDC_TAG "pc_kbdc"
89 #define SPEAKER_TAG "speaker"
90 #define WDFDC_TAG "wdfdc"
91
92 class pt68k4_state : public driver_device
93 {
94 public:
pt68k4_state(const machine_config & mconfig,device_type type,const char * tag)95 pt68k4_state(const machine_config &mconfig, device_type type, const char *tag)
96 : driver_device(mconfig, type, tag)
97 , m_p_base(*this, "rambase")
98 , m_maincpu(*this, M68K_TAG)
99 , m_duart1(*this, DUART1_TAG)
100 , m_duart2(*this, DUART2_TAG)
101 , m_isa(*this, ISABUS_TAG)
102 , m_speaker(*this, SPEAKER_TAG)
103 , m_wdfdc(*this, WDFDC_TAG)
104 , m_floppy_connector(*this, WDFDC_TAG":%u", 0U)
105 { }
106
107 void pt68k2(machine_config &config);
108 void pt68k4(machine_config &config);
109
110 private:
111 uint8_t hiram_r(offs_t offset);
112 void hiram_w(offs_t offset, uint8_t data);
113 uint8_t keyboard_r(offs_t offset);
114 void keyboard_w(uint8_t data);
115
116 uint8_t pia_stub_r();
117 void duart1_out(uint8_t data);
118
119 void fdc_select_w(uint8_t data);
120
121 DECLARE_WRITE_LINE_MEMBER(duart1_irq);
122 DECLARE_WRITE_LINE_MEMBER(duart2_irq);
123
124 DECLARE_WRITE_LINE_MEMBER(irq5_w);
125
126 DECLARE_WRITE_LINE_MEMBER(keyboard_clock_w);
127 DECLARE_WRITE_LINE_MEMBER(keyboard_data_w);
128
129 DECLARE_FLOPPY_FORMATS( floppy_formats );
130
131 void pt68k2_mem(address_map &map);
132 void pt68k4_mem(address_map &map);
133
134 virtual void machine_start() override;
135 virtual void machine_reset() override;
136 required_shared_ptr<uint16_t> m_p_base;
137 required_device<cpu_device> m_maincpu;
138 required_device<mc68681_device> m_duart1;
139 required_device<mc68681_device> m_duart2;
140 required_device<isa8_device> m_isa;
141 required_device<speaker_sound_device> m_speaker;
142 optional_device<wd1772_device> m_wdfdc;
143 optional_device_array<floppy_connector, 2> m_floppy_connector;
144
145 void irq5_update();
146
147 uint8_t m_hiram[0x800];
148
149 bool m_kclk;
150 uint8_t m_kdata;
151 uint8_t m_scancode;
152 uint8_t m_kbdflag;
153 int m_kbit;
154 int m_lastdrive;
155 bool m_irq5_duart1, m_irq5_isa;
156 };
157
FLOPPY_FORMATS_MEMBER(pt68k4_state::floppy_formats)158 FLOPPY_FORMATS_MEMBER( pt68k4_state::floppy_formats )
159 FLOPPY_IMD_FORMAT
160 FLOPPY_FORMATS_END
161
162 static void pt68k_floppies(device_slot_interface &device)
163 {
164 device.option_add("525dd", FLOPPY_525_DD);
165 }
166
167 // XT keyboard interface - done in TTL instead of an 804x
WRITE_LINE_MEMBER(pt68k4_state::keyboard_clock_w)168 WRITE_LINE_MEMBER(pt68k4_state::keyboard_clock_w)
169 {
170 // printf("KCLK: %d\n", state ? 1 : 0);
171
172 // rising edge?
173 if ((state == ASSERT_LINE) && (!m_kclk))
174 {
175 if (m_kbit >= 1 && m_kbit <= 8)
176 {
177 m_scancode >>= 1;
178 m_scancode |= m_kdata;
179 }
180
181 // stop bit?
182 if (m_kbit == 9)
183 {
184 // printf("scancode %02x\n", m_scancode);
185 m_kbit = 0;
186 m_kbdflag = 0x80;
187 m_duart1->ip2_w(CLEAR_LINE);
188 }
189 else
190 {
191 m_kbit++;
192 }
193 }
194
195 m_kclk = (state == ASSERT_LINE) ? true : false;
196 }
197
WRITE_LINE_MEMBER(pt68k4_state::keyboard_data_w)198 WRITE_LINE_MEMBER(pt68k4_state::keyboard_data_w)
199 {
200 // printf("KDATA: %d\n", state ? 1 : 0);
201 m_kdata = (state == ASSERT_LINE) ? 0x80 : 0x00;
202 }
203
duart1_out(uint8_t data)204 void pt68k4_state::duart1_out(uint8_t data)
205 {
206 m_speaker->level_w((data >> 3) & 1);
207 }
208
pia_stub_r()209 uint8_t pt68k4_state::pia_stub_r()
210 {
211 return 0;
212 }
213
fdc_select_w(uint8_t data)214 void pt68k4_state::fdc_select_w(uint8_t data)
215 {
216 floppy_image_device *floppy = m_floppy_connector[0] ? m_floppy_connector[0]->get_device() : nullptr;
217 floppy_image_device *floppy2 = m_floppy_connector[1] ? m_floppy_connector[1]->get_device() : nullptr;
218 int drive = data & 3;
219
220 if (drive != m_lastdrive)
221 {
222 switch (drive)
223 {
224 case 0:
225 m_wdfdc->set_floppy(floppy);
226 break;
227
228 case 1:
229 m_wdfdc->set_floppy(floppy2);
230 break;
231
232 default:
233 m_wdfdc->set_floppy(nullptr);
234 break;
235 }
236
237 m_lastdrive = drive;
238 }
239
240 switch (drive)
241 {
242 case 0:
243 floppy->ss_w((data & 0x40) ? 1 : 0);
244 break;
245
246 case 1:
247 floppy2->ss_w((data & 0x40) ? 1 : 0);
248 break;
249
250 default:
251 break;
252 }
253 }
254
pt68k2_mem(address_map & map)255 void pt68k4_state::pt68k2_mem(address_map &map)
256 {
257 map.unmap_value_high();
258 map(0x000000, 0x0fffff).ram().share("rambase"); // 1MB RAM
259 map(0xf80000, 0xf8ffff).rom().region("roms", 0);
260 map(0xc00000, 0xdfffff).rw(m_isa, FUNC(isa8_device::mem_r), FUNC(isa8_device::mem_w)).umask16(0x00ff);
261 map(0xfa0000, 0xfbffff).rw(m_isa, FUNC(isa8_device::io_r), FUNC(isa8_device::io_w)).umask16(0x00ff);
262 map(0xfe0000, 0xfe001f).rw(m_duart1, FUNC(mc68681_device::read), FUNC(mc68681_device::write)).umask16(0x00ff);
263 map(0xfe0040, 0xfe005f).rw(m_duart2, FUNC(mc68681_device::read), FUNC(mc68681_device::write)).umask16(0x00ff);
264 map(0xfe0080, 0xfe00bf).r(FUNC(pt68k4_state::pia_stub_r)).umask16(0x00ff);
265 map(0xfe00c0, 0xfe00ff).w(FUNC(pt68k4_state::fdc_select_w)).umask16(0x00ff);
266 map(0xfe0100, 0xfe013f).rw(m_wdfdc, FUNC(wd1772_device::read), FUNC(wd1772_device::write)).umask16(0x00ff);
267 map(0xfe01c0, 0xfe01c3).rw(FUNC(pt68k4_state::keyboard_r), FUNC(pt68k4_state::keyboard_w)).umask16(0x00ff);
268 map(0xff0000, 0xff0fff).rw(FUNC(pt68k4_state::hiram_r), FUNC(pt68k4_state::hiram_w)).umask16(0xff00);
269 map(0xff0000, 0xff0fff).rw(TIMEKEEPER_TAG, FUNC(timekeeper_device::read), FUNC(timekeeper_device::write)).umask16(0x00ff);
270 }
271
pt68k4_mem(address_map & map)272 void pt68k4_state::pt68k4_mem(address_map &map)
273 {
274 map.unmap_value_high();
275 map(0x000000, 0x0fffff).ram().share("rambase"); // 1MB RAM (OS9 needs more)
276 map(0xf80000, 0xf8ffff).rom().region("roms", 0);
277 map(0xc00000, 0xdfffff).rw(m_isa, FUNC(isa8_device::mem_r), FUNC(isa8_device::mem_w)).umask16(0x00ff);
278 map(0xfa0000, 0xfbffff).rw(m_isa, FUNC(isa8_device::io_r), FUNC(isa8_device::io_w)).umask16(0x00ff);
279 map(0xfe0000, 0xfe001f).rw(m_duart1, FUNC(mc68681_device::read), FUNC(mc68681_device::write)).umask16(0x00ff);
280 map(0xfe0040, 0xfe005f).rw(m_duart2, FUNC(mc68681_device::read), FUNC(mc68681_device::write)).umask16(0x00ff);
281 map(0xfe01c0, 0xfe01c3).rw(FUNC(pt68k4_state::keyboard_r), FUNC(pt68k4_state::keyboard_w)).umask16(0x00ff);
282 map(0xff0000, 0xff0fff).rw(FUNC(pt68k4_state::hiram_r), FUNC(pt68k4_state::hiram_w)).umask16(0xff00);
283 map(0xff0000, 0xff0fff).rw(TIMEKEEPER_TAG, FUNC(timekeeper_device::read), FUNC(timekeeper_device::write)).umask16(0x00ff);
284 }
285
286 /* Input ports */
INPUT_PORTS_START(pt68k4)287 static INPUT_PORTS_START( pt68k4 )
288 INPUT_PORTS_END
289
290 /* built in keyboard: offset 0 reads 0x80 if key ready, 0 if not. If key ready, offset 1 reads scancode. Read or write to offs 0 clears key ready */
291 uint8_t pt68k4_state::keyboard_r(offs_t offset)
292 {
293 if (offset == 0)
294 {
295 uint8_t rv = m_kbdflag;
296
297 m_kbdflag = 0;
298 m_duart1->ip2_w(ASSERT_LINE);
299
300 return rv;
301 }
302
303 return m_scancode;
304 }
305
keyboard_w(uint8_t data)306 void pt68k4_state::keyboard_w(uint8_t data)
307 {
308 m_kbdflag = 0;
309 m_duart1->ip2_w(ASSERT_LINE);
310 }
311
hiram_r(offs_t offset)312 uint8_t pt68k4_state::hiram_r(offs_t offset)
313 {
314 return m_hiram[offset];
315 }
316
hiram_w(offs_t offset,uint8_t data)317 void pt68k4_state::hiram_w(offs_t offset, uint8_t data)
318 {
319 m_hiram[offset] = data;
320 }
321
machine_start()322 void pt68k4_state::machine_start()
323 {
324 save_item(NAME(m_hiram));
325 save_item(NAME(m_kclk));
326 save_item(NAME(m_kdata));
327 save_item(NAME(m_scancode));
328 save_item(NAME(m_kbdflag));
329 save_item(NAME(m_kbit));
330 save_item(NAME(m_lastdrive));
331 save_item(NAME(m_irq5_duart1));
332 save_item(NAME(m_irq5_isa));
333 }
334
machine_reset()335 void pt68k4_state::machine_reset()
336 {
337 uint8_t* user1 = memregion("roms")->base();
338 memcpy((uint8_t*)m_p_base.target(), user1, 8);
339
340 m_kclk = true;
341 m_kbit = 0;
342 m_scancode = 0;
343 m_kbdflag = 0;
344 m_irq5_duart1 = CLEAR_LINE;
345 m_irq5_isa = CLEAR_LINE;
346
347 // set line to asserted (no key code ready)
348 m_duart1->ip2_w(ASSERT_LINE);
349
350 if (m_wdfdc)
351 {
352 floppy_image_device *floppy = m_floppy_connector[0] ? m_floppy_connector[0]->get_device() : nullptr;
353
354 m_wdfdc->set_floppy(floppy);
355 floppy->ss_w(0);
356
357 m_lastdrive = 0;
358 }
359 }
360
irq5_update()361 void pt68k4_state::irq5_update()
362 {
363 if ((m_irq5_duart1) || (m_irq5_isa))
364 {
365 m_maincpu->set_input_line(M68K_IRQ_5, ASSERT_LINE);
366 }
367 else
368 {
369 m_maincpu->set_input_line(M68K_IRQ_5, CLEAR_LINE);
370 }
371 }
372
WRITE_LINE_MEMBER(pt68k4_state::duart1_irq)373 WRITE_LINE_MEMBER(pt68k4_state::duart1_irq)
374 {
375 m_irq5_duart1 = state;
376 irq5_update();
377 }
378
WRITE_LINE_MEMBER(pt68k4_state::irq5_w)379 WRITE_LINE_MEMBER(pt68k4_state::irq5_w)
380 {
381 m_irq5_isa = state;
382 irq5_update();
383 }
384
WRITE_LINE_MEMBER(pt68k4_state::duart2_irq)385 WRITE_LINE_MEMBER(pt68k4_state::duart2_irq)
386 {
387 m_maincpu->set_input_line(M68K_IRQ_4, state);
388 }
389
390 // these are cards supported by the HUMBUG and Monk BIOSes
pt68k4_isa8_cards(device_slot_interface & device)391 void pt68k4_isa8_cards(device_slot_interface &device)
392 {
393 device.option_add("mda", ISA8_MDA);
394 device.option_add("cga", ISA8_CGA);
395 device.option_add("ega", ISA8_EGA); // Monk only
396 device.option_add("vga", ISA8_VGA); // Monk only
397 device.option_add("fdc_at", ISA8_FDC_AT);
398 device.option_add("wdxt_gen", ISA8_WDXT_GEN);
399 device.option_add("lpt", ISA8_LPT);
400 device.option_add("xtide", ISA8_XTIDE); // Monk only
401 }
402
pt68k2(machine_config & config)403 void pt68k4_state::pt68k2(machine_config &config)
404 {
405 /* basic machine hardware */
406 M68000(config, m_maincpu, 16_MHz_XTAL / 2); // 68k2 came in 8, 10, and 12 MHz versions
407 m_maincpu->set_addrmap(AS_PROGRAM, &pt68k4_state::pt68k2_mem);
408
409 MC68681(config, m_duart1, 3.6864_MHz_XTAL);
410 m_duart1->irq_cb().set(FUNC(pt68k4_state::duart1_irq));
411 m_duart1->outport_cb().set(FUNC(pt68k4_state::duart1_out));
412
413 MC68681(config, m_duart2, 3.6864_MHz_XTAL);
414
415 pc_kbdc_device &pc_kbdc(PC_KBDC(config, KBDC_TAG, 0));
416 pc_kbdc.out_clock_cb().set(FUNC(pt68k4_state::keyboard_clock_w));
417 pc_kbdc.out_data_cb().set(FUNC(pt68k4_state::keyboard_data_w));
418 PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(&pc_kbdc);
419
420 M48T02(config, TIMEKEEPER_TAG, 0);
421
422 WD1772(config, m_wdfdc, 16_MHz_XTAL / 2);
423 FLOPPY_CONNECTOR(config, m_floppy_connector[0], pt68k_floppies, "525dd", pt68k4_state::floppy_formats);
424 FLOPPY_CONNECTOR(config, m_floppy_connector[1], pt68k_floppies, "525dd", pt68k4_state::floppy_formats);
425
426 ISA8(config, m_isa, 0);
427 m_isa->set_custom_spaces();
428 m_isa->irq5_callback().set(FUNC(pt68k4_state::irq5_w));
429
430 ISA8_SLOT(config, "isa1", 0, m_isa, pt68k4_isa8_cards, "cga", false); // FIXME: determine ISA bus clock
431 ISA8_SLOT(config, "isa2", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
432 ISA8_SLOT(config, "isa3", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
433 ISA8_SLOT(config, "isa4", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
434 ISA8_SLOT(config, "isa5", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
435 ISA8_SLOT(config, "isa6", 0, m_isa, pt68k4_isa8_cards, nullptr, false),
436
437 SPEAKER(config, "mono").front_center();
438 SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
439
440 SOFTWARE_LIST(config, "flop525_list").set_original("pt68k2");
441 }
442
pt68k4(machine_config & config)443 void pt68k4_state::pt68k4(machine_config &config)
444 {
445 /* basic machine hardware */
446 M68000(config, m_maincpu, XTAL(16'000'000));
447 m_maincpu->set_addrmap(AS_PROGRAM, &pt68k4_state::pt68k4_mem);
448
449 // add the DUARTS. first one has the console on channel A at 19200.
450 MC68681(config, m_duart1, XTAL(16'000'000) / 4);
451 m_duart1->irq_cb().set(FUNC(pt68k4_state::duart1_irq));
452 m_duart1->outport_cb().set(FUNC(pt68k4_state::duart1_out));
453
454 MC68681(config, m_duart2, XTAL(16'000'000) / 4);
455
456 pc_kbdc_device &pc_kbdc(PC_KBDC(config, KBDC_TAG, 0));
457 pc_kbdc.out_clock_cb().set(FUNC(pt68k4_state::keyboard_clock_w));
458 pc_kbdc.out_data_cb().set(FUNC(pt68k4_state::keyboard_data_w));
459 PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(&pc_kbdc);
460
461 M48T02(config, TIMEKEEPER_TAG, 0);
462
463 ISA8(config, m_isa, 0);
464 m_isa->set_custom_spaces();
465
466 ISA8_SLOT(config, "isa1", 0, m_isa, pt68k4_isa8_cards, "fdc_at", false); // FIXME: determine ISA bus clock
467 ISA8_SLOT(config, "isa2", 0, m_isa, pt68k4_isa8_cards, "cga", false);
468 ISA8_SLOT(config, "isa3", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
469 ISA8_SLOT(config, "isa4", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
470 ISA8_SLOT(config, "isa5", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
471 ISA8_SLOT(config, "isa6", 0, m_isa, pt68k4_isa8_cards, nullptr, false),
472 ISA8_SLOT(config, "isa7", 0, m_isa, pt68k4_isa8_cards, nullptr, false),
473
474 SPEAKER(config, "mono").front_center();
475 SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
476
477 SOFTWARE_LIST(config, "flop525_list").set_original("pt68k2");
478 }
479
480 /* ROM definition */
481 ROM_START( pt68k2 )
482 ROM_REGION16_BE( 0x10000, "roms", 0 )
483 ROM_LOAD16_BYTE( "hum_u20.bin", 0x000000, 0x008000, CRC(69db483a) SHA1(9dfea73e4d7deef7c66a27cca92eb7c9ff767215) )
484 ROM_LOAD16_BYTE( "hum_u27.bin", 0x000001, 0x008000, CRC(54441b06) SHA1(0e2d63b1cd01f88f37fc4859c11c252c4fea220b) )
485
486 ROM_REGION(0x800, TIMEKEEPER_TAG, 0)
487 ROM_LOAD( "u21_ds1220.bin", 0x000000, 0x000800, CRC(7a6b75ce) SHA1(07663860aa6cc21aed04a568ff9c05bc75d62e4f) )
488 ROM_END
489
490 ROM_START( pt68k4 )
491 ROM_REGION16_BE( 0x10000, "roms", 0 )
492 ROM_SYSTEM_BIOS( 0, "humbug", "Humbug" )
493 ROMX_LOAD( "humpta40.bin", 0x0000, 0x8000, CRC(af67ff64) SHA1(da9fa31338c6847bb0e66118679b1ec01f6dc30b), ROM_SKIP(1) | ROM_BIOS(0) )
494 ROMX_LOAD( "humpta41.bin", 0x0001, 0x8000, CRC(a8b16e27) SHA1(218802f6e20d14cff736bb7423f06ce2f66e074c), ROM_SKIP(1) | ROM_BIOS(0) )
495 ROM_SYSTEM_BIOS( 1, "monk", "Monk" )
496 ROMX_LOAD( "monk_0.bin", 0x0000, 0x8000, CRC(420d6a4b) SHA1(fca8c53c9c3c8ebd09370499cf34f4cc75ed9463), ROM_SKIP(1) | ROM_BIOS(1) )
497 ROMX_LOAD( "monk_1.bin", 0x0001, 0x8000, CRC(fc495e82) SHA1(f7b720d87db4d72a23e6c42d2cdd03216db04b60), ROM_SKIP(1) | ROM_BIOS(1) )
498
499 ROM_REGION(0x800, TIMEKEEPER_TAG, 0)
500 ROM_LOAD( "u21_ds1220_k4.bin", 0x000000, 0x000800, CRC(753472e6) SHA1(58dc8bcc86191e4a4429fe6a9b4fdd7788abb0cd) )
501
502 ROM_REGION( 0x0900, "proms", 0 )
503 ROM_LOAD_OPTIONAL( "20l8.u71", 0x0000, 0x000149, CRC(77365121) SHA1(5ecf490ead119966a5c097d90740acde60462ab0) )
504 ROM_LOAD_OPTIONAL( "16l8.u53", 0x0200, 0x000109, CRC(cb6a9984) SHA1(45b9b14e7b45cda6f0edfcbb9895b6a14eacb852) )
505 ROM_LOAD_OPTIONAL( "22v10.u40", 0x0400, 0x0002e1, CRC(24df92e4) SHA1(c183113956bb0db132b6f37b239ca0bb7fac2d82) )
506 ROM_LOAD_OPTIONAL( "16l8.u11", 0x0700, 0x000109, CRC(397a1363) SHA1(aca2a02e1bf1f7cdb9b0ca24ebecb0b01ae472e8) )
507 ROM_END
508
509 /* Driver */
510 // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
511 COMP( 1988, pt68k2, 0, 0, pt68k2, pt68k4, pt68k4_state, empty_init, "Peripheral Technology", "PT68K2", MACHINE_SUPPORTS_SAVE )
512 COMP( 1990, pt68k4, 0, 0, pt68k4, pt68k4, pt68k4_state, empty_init, "Peripheral Technology", "PT68K4", MACHINE_SUPPORTS_SAVE )
513