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