1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /**********************************************************************
4 
5     Enterprise Sixty Four / One Two Eight emulation
6 
7 **********************************************************************/
8 
9 /*
10 
11 Enterprise Sixty Four / Enterprise One Two Eight
12 Enterprise Computers Ltd. 1985
13 
14 MAIN PCB Layout
15 ---------------
16                                         DUAL
17 |-----------| 9V                        TAPE_IN/OUT                             RES
18 |HEATSINK   | DC_IN             MON1    AND REMOTE     SR1    PR1   CN2A CN1A   |-|
19 |           |--||---|--||--|--| |--| |-||-||-||-||-| |----| |-----| |--| |--| |-|-|------|
20 |-----------|7805   | MOD  |  |-|  |-|             |-|    |-|     |-|  |-|  |-|   EXP2 --|EXTERNAL
21         |---+7805   |      |                         74LS06 74LS273 74LS86 74LS32      --|EXPANSION
22         |   |       |------|             74LS244                                       --|CONNECTOR
23         |   |78L12 POT1  LM386                               |-----|   |-----|   EXP1  --|
24    CART |   |          LM1889 LM1886                   74LS04|NICK |   |DAVE |         --|
25    CONN |   |   KEYB_8     POT2     KEYB_10                  |     |   |     |         --|
26         |   |            4.433619MHz     74LS145 POT3 LED    |-----|   |-----|         --|
27         |---+                                                                          --|
28             |                            74LS74      74LS244  74LS244  74LS245 |---------|
29             |                                                                  |
30             | 74LS373                    4164  4164  74F157                    |
31             |                                                                  |
32             | 16-2-103   LM339    LM324  4164  4164  74F157           EXOS.IC2 |
33             |                                                 8MHz             |
34             | 74LS373                    4164  4164                            |
35             |                                                74LS04    Z80A    |
36             | 74LS273                    4164  4164                            |
37             |------------------------------------------------------------------|
38 Notes: (all IC's shown)
39            Z80A - Z80A CPU, clock input 4MHz [8/2]
40        EXOS.IC2 - 32k x8-bit mask ROM usually 23256 manufactured by GI (DIP24). Contains EXOS operating
41                   system and built-in word processor software. A few official revisions were made and
42                   there were a few unofficial revision made with additional capabilities and bug-fixes
43                   ROM labelling of some official versions found....
44                   9256DS-0019 (C)1984 INTELLIGENT SOFTWARE LTD ENTER 08-45-A GI
45                   9256DS-0036 (C)1984 INTELLIGENT SOFTWARE LTD ENTER 05-23-A GI
46            4164 - 64k x1-bit Dynamic RAM with Page Mode (DIP16)
47            NICK - Custom graphics chip (QFP72)
48            DAVE - Custom sound chip (QFP72)
49           LM386 - National Semiconductor LM386 Low Voltage Audio Power Amplifier (DIP8)
50          LM1889 - National Semiconductor LM1889 TV Video Modulator (DIP18)
51          LM1886 - National Semiconductor LM1886 TV Video Matrix DAC (DIP20)
52           LM339 - SGS LM339 Low Power Low Offset Voltage Quad Comparator (DIP8)
53           LM324 - SGS LM324 Quad Operational Amplifier (DIP8)
54          74LS04 - Hex Inverter (DIP14)
55          74LS06 - Hex Inverter/Buffer with Open-Collector Outputs (DIP14)
56          74LS32 - Quad 2-Input Positive OR Gate (DIP14)
57          74LS74 - Dual Positive-Edge-Triggered D Flip-Flops with Preset, Clear and Complementary Outputs (DIP14)
58          74LS86 - Quad 2-Input Exclusive OR Gate (DIP14)
59         74LS145 - BCD to Deccimal Decoder/Driver (DIP16)
60          74F157 - Quad 2-Line to 1-Line Data Selector/Multiplexer (DIP16). Early rev mainboards use 74LS158 instead
61         74LS244 - Octal 3-State Noninverting Buffer/Line Driver/Line Receiver (DIP20)
62         74LS245 - Octal Bus Tranceiver with Tri-State Outputs (DIP20)
63         74LS273 - Octal D-Type Flip-Flop With Clear (DIP20)
64         74LS373 - Octal D-Type Transparent Latches and Edge-Triggered Flip-Flops (DIP20)
65            7805 - Voltage regulator. +9V DC input from DC power pack, +5V DC output
66           78L12 - Voltage regulator. Voltage input via small transformer on PCB. +12V DC output
67            POT1 - Potentiometer located near modulator and video output circuitry
68            POT2 - Potentiometer located near video output circuitry. Probably used to fine-tune the video clock
69            POT3 - Potentiometer. Possibly for video/NICK-related adjustments
70             LED - LED to show +5V is present
71        16-2-103 - Resistor Array (DIP16)
72          KEYB_8 - 8 pin keyboard connector
73         KEYB_10 - 10 pin keyboard connector
74            EXP1 - 28 pin internal expansion connector (solder holes only) used for internal 64k memory expansion card
75            EXP2 - 10 pin internal expansion connector (solder holes only) used for internal 64k memory expansion card
76             MOD - Astec UM1233 TV modulator
77             RES - Reset push button switch
78            MON1 - Monitor output connector. Pinout is....
79 
80                             Green  A1 B1 NC
81                             Ground A2 B2 Ground
82                   Mono Comp. Video A3 B3 Blue
83                              HSync A4 B4 Red
84                              VSync A5 B5 Composite Sync
85                                 NC A6 B6 Mode Switch
86                         Left Audio A7 B7 Right Audio
87 
88             SR1 - Serial/Network connector. Pinout is....
89 
90                          Reference A1 B1 Ground
91                                  - A2 B2 -
92                                RTS A3 B3 Data Out
93                                CTS A4 B4 Data In
94 
95             PR1 - Printer connector. Pinout is....
96 
97                             Ground A1 B1 Ground
98                             Strobe A2 B2 Ready
99                             Data 3 A3 B3 Data 4
100                                  - A4 B4 -
101                             Data 2 A5 B5 Data 5
102                             Data 1 A6 B6 Data 6
103                             Data 0 A7 B7 Data 7
104 
105            CN2A - Joystick 2 connector
106            CN1A - Joystick 1 connector
107                   Pinout is....
108 
109                           Keyboard J A1 B1 Ground
110                           Keyboard L A2 B2 Keyboard K
111                                    - A3 B3 -
112                                Right A4 B4 +5V
113                                 Down A5 B5 Left
114                                 Fire A6 B6 Up
115 
116 
117 Internal Memory Expansion PCB Layout
118 ------------------------------------
119 
120 |---------------------|
121 |  4164 74LS00 PL3 PL2|
122 |4164 74LS30 74F157   |
123 |4164 4164            |
124 |4164 4164   74F157   |
125 |4164 4164 74LS32  PL1|
126 |---------------------|
127 Notes: (All IC's shown)
128           PL1 - 28-pin connector (solder pads only) hard-wired to solder pads EXP1 on mainboard
129       PL2/PL3 - 5-pin connectors (solder pads only) hard-wired to solder pads EXP2 on mainboard
130          4164 - 64k x1-bit Dynamic RAM with Page Mode (DIP16)
131        74LS00 - Quad 2-Input NAND Gate (DIP14)
132        74LS30 - 8-input NAND Gate (DIP14)
133        74LS32 - Quad 2-Input Positive OR Gate (DIP14)
134        74F157 - Quad 2-Line to 1-Line Data Selector/Multiplexer (DIP16). Early rev memory boards use 74LS158 instead
135 
136 */
137 
138 /*
139 
140     TODO:
141 
142     - POST RAM errors
143     - rewrite DAVE to output to discrete DAC
144     - rewrite NICK
145     - cassette
146     - external joysticks
147 
148     http://ep.homeserver.hu/Dokumentacio/Konyvek/
149 
150 */
151 
152 #include "emu.h"
153 
154 #include "bus/centronics/ctronics.h"
155 #include "bus/ep64/exp.h"
156 #include "bus/generic/carts.h"
157 #include "bus/generic/slot.h"
158 #include "bus/rs232/rs232.h"
159 #include "cpu/z80/z80.h"
160 #include "imagedev/cassette.h"
161 #include "machine/ram.h"
162 #include "sound/dave.h"
163 #include "video/nick.h"
164 
165 #include "softlist.h"
166 #include "speaker.h"
167 
168 
169 #define Z80_TAG         "u1"
170 #define DAVE_TAG        "u3"
171 #define NICK_TAG        "u4"
172 #define CENTRONICS_TAG  "centronics"
173 #define RS232_TAG       "rs232"
174 #define CASSETTE1_TAG   "cassette1"
175 #define CASSETTE2_TAG   "cassette2"
176 #define SCREEN_TAG      "screen"
177 #define EP64_EXPANSION_BUS_TAG  "exp"
178 
179 class ep64_state : public driver_device
180 {
181 public:
ep64_state(const machine_config & mconfig,device_type type,const char * tag)182 	ep64_state(const machine_config &mconfig, device_type type, const char *tag) :
183 		driver_device(mconfig, type, tag),
184 		m_maincpu(*this, Z80_TAG),
185 		m_dave(*this, DAVE_TAG),
186 		m_nick(*this, NICK_TAG),
187 		m_centronics(*this, CENTRONICS_TAG),
188 		m_rs232(*this, RS232_TAG),
189 		m_cassette1(*this, CASSETTE1_TAG),
190 		m_cassette2(*this, CASSETTE2_TAG),
191 		m_cart(*this, "cartslot"),
192 		m_exp(*this, EP64_EXPANSION_BUS_TAG),
193 		m_ram(*this, RAM_TAG),
194 		m_rom(*this, Z80_TAG),
195 		m_y(*this, "Y%u", 0)
196 	{ }
197 
198 	void ep128(machine_config &config);
199 	void ep64(machine_config &config);
200 
201 private:
202 	required_device<cpu_device> m_maincpu;
203 	required_device<dave_device> m_dave;
204 	required_device<nick_device> m_nick;
205 	required_device<centronics_device> m_centronics;
206 	required_device<rs232_port_device> m_rs232;
207 	required_device<cassette_image_device> m_cassette1;
208 	required_device<cassette_image_device> m_cassette2;
209 	required_device<generic_slot_device> m_cart;
210 	required_device<ep64_expansion_bus_slot_device> m_exp;
211 	required_device<ram_device> m_ram;
212 	required_memory_region m_rom;
213 	required_ioport_array<10> m_y;
214 
215 	virtual void machine_start() override;
216 	virtual void machine_reset() override;
217 
218 	uint8_t rd0_r();
219 	void wr0_w(uint8_t data);
220 	uint8_t rd1_r();
221 	void wr2_w(uint8_t data);
222 
223 	uint8_t m_key;
224 
225 	DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
226 	int m_centronics_busy;
227 	void dave_128k_mem(address_map &map);
228 	void dave_64k_mem(address_map &map);
229 	void dave_io(address_map &map);
230 	void ep64_io(address_map &map);
231 	void ep64_mem(address_map &map);
232 };
233 
234 
235 
236 //**************************************************************************
237 //  READ/WRITE HANDLERS
238 //**************************************************************************
239 
240 //-------------------------------------------------
241 //  rd0_r -
242 //-------------------------------------------------
243 
rd0_r()244 uint8_t ep64_state::rd0_r()
245 {
246 	uint8_t data = 0xff;
247 
248 	if (m_key < 10)
249 	{
250 		data &= m_y[m_key]->read();
251 	}
252 
253 	return data;
254 }
255 
256 
257 //-------------------------------------------------
258 //  rd0_r -
259 //-------------------------------------------------
260 
wr0_w(uint8_t data)261 void ep64_state::wr0_w(uint8_t data)
262 {
263 	/*
264 
265 	    bit     description
266 
267 	    0       KEY A
268 	    1       KEY B
269 	    2       KEY C
270 	    3       KEY D
271 	    4       PRINTER _STB
272 	    5       CASSETTE OUT
273 	    6       REMOTE 1
274 	    7       REMOTE 2
275 
276 	*/
277 
278 	// keyboard
279 	m_key = data & 0x0f;
280 
281 	// printer
282 	m_centronics->write_strobe(!BIT(data, 4));
283 
284 	// cassette
285 	m_cassette1->output(BIT(data, 5) ? -1.0 : +1.0);
286 	m_cassette2->output(BIT(data, 5) ? -1.0 : +1.0);
287 
288 	// cassette
289 	m_cassette1->change_state(BIT(data, 6) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
290 	m_cassette2->change_state(BIT(data, 7) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
291 }
292 
WRITE_LINE_MEMBER(ep64_state::write_centronics_busy)293 WRITE_LINE_MEMBER( ep64_state::write_centronics_busy )
294 {
295 	m_centronics_busy = state;
296 }
297 
298 //-------------------------------------------------
299 //  rd1_r -
300 //-------------------------------------------------
301 
rd1_r()302 uint8_t ep64_state::rd1_r()
303 {
304 	/*
305 
306 	    bit     description
307 
308 	    0       KBJ
309 	    1       KBK
310 	    2       KBL
311 	    3       PRINTER _RDY
312 	    4       SERIAL/NET DATA IN
313 	    5       SERIAL/NET STATUS IN
314 	    6       CASSETTE IN
315 	    7       ?
316 
317 	*/
318 
319 	uint8_t data = 0;
320 
321 	// printer
322 	data |= m_centronics_busy << 3;
323 
324 	// serial
325 	data |= m_rs232->rxd_r() << 4;
326 	data |= m_rs232->cts_r() << 5;
327 
328 	// cassette
329 	data |= ((m_cassette1->input() < 0) || (m_cassette2->input() < 0)) << 6;
330 
331 	return data;
332 }
333 
334 
335 //-------------------------------------------------
336 //  wr2_w -
337 //-------------------------------------------------
338 
wr2_w(uint8_t data)339 void ep64_state::wr2_w(uint8_t data)
340 {
341 	/*
342 
343 	    bit     description
344 
345 	    0       SERIAL/NET DATA OUT
346 	    1       SERIAL/NET STATUS OUT
347 	    2
348 	    3
349 	    4
350 	    5
351 	    6
352 	    7
353 
354 	*/
355 
356 	// serial
357 	m_rs232->write_txd(!BIT(data, 0));
358 	m_rs232->write_rts(!BIT(data, 1));
359 }
360 
361 
362 
363 //**************************************************************************
364 //  ADDRESS MAPS
365 //**************************************************************************
366 
367 //-------------------------------------------------
368 //  ADDRESS_MAP( ep64_mem )
369 //-------------------------------------------------
370 
ep64_mem(address_map & map)371 void ep64_state::ep64_mem(address_map &map)
372 {
373 	map(0x0000, 0xffff).m(m_dave, FUNC(dave_device::z80_program_map));
374 }
375 
376 
377 //-------------------------------------------------
378 //  ADDRESS_MAP( ep64_io )
379 //-------------------------------------------------
380 
ep64_io(address_map & map)381 void ep64_state::ep64_io(address_map &map)
382 {
383 	map(0x0000, 0xffff).m(m_dave, FUNC(dave_device::z80_io_map));
384 }
385 
386 
387 //-------------------------------------------------
388 //  ADDRESS_MAP( dave_64k_mem )
389 //-------------------------------------------------
390 
dave_64k_mem(address_map & map)391 void ep64_state::dave_64k_mem(address_map &map)
392 {
393 	map(0x000000, 0x007fff).rom().region(Z80_TAG, 0);
394 	//map(0x010000, 0x01ffff)      // mapped by the cartslot
395 	map(0x3f0000, 0x3fffff).m(m_nick, FUNC(nick_device::vram_map));
396 }
397 
398 
399 //-------------------------------------------------
400 //  ADDRESS_MAP( dave_128k_mem )
401 //-------------------------------------------------
402 
dave_128k_mem(address_map & map)403 void ep64_state::dave_128k_mem(address_map &map)
404 {
405 	dave_64k_mem(map);
406 	map(0x3e0000, 0x3effff).ram();
407 }
408 
409 
410 //-------------------------------------------------
411 //  ADDRESS_MAP( dave_io )
412 //-------------------------------------------------
413 
dave_io(address_map & map)414 void ep64_state::dave_io(address_map &map)
415 {
416 	map.global_mask(0xff);
417 	map(0x80, 0x8f).m(m_nick, FUNC(nick_device::vio_map));
418 	map(0xb5, 0xb5).rw(FUNC(ep64_state::rd0_r), FUNC(ep64_state::wr0_w));
419 	map(0xb6, 0xb6).r(FUNC(ep64_state::rd1_r)).w("cent_data_out", FUNC(output_latch_device::write));
420 	map(0xb7, 0xb7).w(FUNC(ep64_state::wr2_w));
421 }
422 
423 
424 
425 //**************************************************************************
426 //  INPUT PORTS
427 //**************************************************************************
428 
429 //-------------------------------------------------
430 //  INPUT_PORTS( ep64 )
431 //-------------------------------------------------
432 
433 static INPUT_PORTS_START( ep64 )
434 	PORT_START("Y0")
PORT_CODE(KEYCODE_N)435 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
436 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('\\') PORT_CHAR('|')
437 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
438 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
439 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
440 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
441 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
442 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
443 
444 	PORT_START("Y1")
445 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
446 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
447 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
448 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
449 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
450 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
451 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
452 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL)
453 
454 	PORT_START("Y2")
455 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
456 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
457 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
458 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
459 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
460 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
461 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
462 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t')
463 
464 	PORT_START("Y3")
465 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
466 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
467 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
468 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
469 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
470 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("3 \xC2\xA3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR(0x00a3)
471 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
472 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
473 
474 	PORT_START("Y4")
475 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FUNCTION 4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
476 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FUNCTION 8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
477 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FUNCTION 3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
478 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FUNCTION 6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
479 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FUNCTION 5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
480 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FUNCTION 7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
481 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FUNCTION 2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
482 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FUNCTION 1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
483 
484 	PORT_START("Y5")
485 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
486 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
487 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
488 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
489 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('_')
490 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('^') PORT_CHAR('~')
491 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ERASE") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
492 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
493 
494 	PORT_START("Y6")
495 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
496 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
497 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
498 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
499 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
500 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*')
501 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(']') PORT_CHAR('}')
502 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
503 
504 	PORT_START("Y7")
505 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("STOP") PORT_CODE(KEYCODE_END)
506 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
507 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
508 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
509 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("HOLD") PORT_CODE(KEYCODE_HOME)
510 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
511 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r')
512 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ALT") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
513 
514 	PORT_START("Y8")
515 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
516 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("DEL") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL))
517 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
518 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
519 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
520 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Right SHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
521 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
522 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("INS") PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
523 
524 	PORT_START("Y9")
525 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
526 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
527 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
528 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') PORT_CHAR('`')
529 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
530 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('[') PORT_CHAR('{')
531 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
532 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
533 INPUT_PORTS_END
534 
535 
536 //**************************************************************************
537 //  MACHINE INITIALIZATION
538 //**************************************************************************
539 
540 //-------------------------------------------------
541 //  MACHINE_START( ep64 )
542 //-------------------------------------------------
543 
544 void ep64_state::machine_start()
545 {
546 	if (m_cart->exists())
547 		m_dave->space(AS_PROGRAM).install_read_handler(0x010000, 0x01ffff, read8sm_delegate(*m_cart, FUNC(generic_slot_device::read_rom)));
548 
549 	// state saving
550 	save_item(NAME(m_key));
551 	save_item(NAME(m_centronics_busy));
552 }
553 
554 
machine_reset()555 void ep64_state::machine_reset()
556 {
557 	m_dave->reset();
558 	m_nick->reset();
559 
560 	wr0_w(0);
561 	subdevice<output_latch_device>("cent_data_out")->write(0);
562 	wr2_w(0);
563 }
564 
565 
566 
567 //**************************************************************************
568 //  MACHINE CONFIGURATION
569 //**************************************************************************
570 
571 //-------------------------------------------------
572 //  machine_config( ep64 )
573 //-------------------------------------------------
574 
ep64(machine_config & config)575 void ep64_state::ep64(machine_config &config)
576 {
577 	// basic machine hardware
578 	Z80(config, m_maincpu, XTAL(8'000'000)/2);
579 	m_maincpu->set_addrmap(AS_PROGRAM, &ep64_state::ep64_mem);
580 	m_maincpu->set_addrmap(AS_IO, &ep64_state::ep64_io);
581 
582 	// video hardware
583 	screen_device& screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
584 	screen.set_refresh_hz(50);
585 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
586 	screen.set_size(ENTERPRISE_SCREEN_WIDTH, ENTERPRISE_SCREEN_HEIGHT);
587 	screen.set_visarea(0, ENTERPRISE_SCREEN_WIDTH-1, 0, ENTERPRISE_SCREEN_HEIGHT-1);
588 	screen.set_screen_update(NICK_TAG, FUNC(nick_device::screen_update));
589 
590 	NICK(config, m_nick, XTAL(8'000'000), SCREEN_TAG);
591 	m_nick->virq_wr_callback().set(m_dave, FUNC(dave_device::int1_w));
592 
593 	// sound hardware
594 	SPEAKER(config, "lspeaker").front_left();
595 	SPEAKER(config, "rspeaker").front_right();
596 	DAVE(config, m_dave, XTAL(8'000'000));
597 	m_dave->set_addrmap(AS_PROGRAM, &ep64_state::dave_64k_mem);
598 	m_dave->set_addrmap(AS_IO, &ep64_state::dave_io);
599 	m_dave->irq_wr().set_inputline(Z80_TAG, INPUT_LINE_IRQ0);
600 	m_dave->add_route(0, "lspeaker", 0.25);
601 	m_dave->add_route(1, "rspeaker", 0.25);
602 
603 	// devices
604 	EP64_EXPANSION_BUS_SLOT(config, m_exp, nullptr);
605 	m_exp->set_program_space(m_dave, AS_PROGRAM);
606 	m_exp->set_io_space(m_dave, AS_IO);
607 	m_exp->irq_wr().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
608 	m_exp->nmi_wr().set_inputline(m_maincpu, INPUT_LINE_NMI);
609 	m_exp->wait_wr().set_inputline(m_maincpu, Z80_INPUT_LINE_BOGUSWAIT);
610 
611 	CENTRONICS(config, m_centronics, centronics_devices, "printer");
612 	m_centronics->busy_handler().set(FUNC(ep64_state::write_centronics_busy));
613 	output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
614 	m_centronics->set_output_latch(cent_data_out);
615 
616 	RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
617 	m_rs232->rxd_handler().set(m_dave, FUNC(dave_device::int2_w));
618 
619 	CASSETTE(config, m_cassette1);
620 	m_cassette1->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
621 	m_cassette1->set_interface("ep64_cass");
622 	m_cassette1->add_route(ALL_OUTPUTS, "lspeaker", 0.05);
623 
624 	CASSETTE(config, m_cassette2);
625 	m_cassette2->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
626 	m_cassette2->set_interface("ep64_cass");
627 	m_cassette2->add_route(ALL_OUTPUTS, "rspeaker", 0.05);
628 
629 	// internal RAM
630 	RAM(config, m_ram).set_default_size("64K");
631 
632 	// cartridge
633 	GENERIC_CARTSLOT(config, m_cart, generic_linear_slot, "ep64_cart", "bin,rom");
634 
635 	// software lists
636 	SOFTWARE_LIST(config, "cart_list").set_original("ep64_cart");
637 	SOFTWARE_LIST(config, "cass_list").set_original("ep64_cass");
638 	SOFTWARE_LIST(config, "flop_list").set_original("ep64_flop");
639 }
640 
641 
642 //-------------------------------------------------
643 //  machine_config( ep128 )
644 //-------------------------------------------------
645 
ep128(machine_config & config)646 void ep64_state::ep128(machine_config &config)
647 {
648 	ep64(config);
649 	m_dave->set_addrmap(AS_PROGRAM, &ep64_state::dave_128k_mem);
650 
651 	// internal RAM
652 	m_ram->set_default_size("128K");
653 }
654 
655 
656 
657 //**************************************************************************
658 //  ROMS
659 //**************************************************************************
660 
661 //-------------------------------------------------
662 //  ROM( ep64 )
663 //-------------------------------------------------
664 
665 ROM_START( ep64 )
666 	ROM_REGION( 0x8000, Z80_TAG, 0 )
667 	ROM_LOAD( "9256ds-0038_enter05-23-a.u2", 0x0000, 0x8000, CRC(d421795f) SHA1(6033a0535136c40c47137e4d1cd9273c06d5fdff) )
668 ROM_END
669 
670 #define rom_phc64   rom_ep64
671 
672 
673 //-------------------------------------------------
674 //  ROM( ep128 )
675 //-------------------------------------------------
676 
677 ROM_START( ep128 )
678 	ROM_REGION( 0x8000, Z80_TAG, 0 )
679 	ROM_LOAD( "9256ds-0019_enter08-45-a.u2", 0x0000, 0x8000, CRC(982a3b44) SHA1(55315b20fecb4441a07ee4bc5dc7153f396e0a2e) )
680 ROM_END
681 
682 
683 
684 //**************************************************************************
685 //  SYSTEM DRIVERS
686 //**************************************************************************
687 
688 //    YEAR  NAME   PARENT  COMPAT  MACHINE  INPUT  CLASS       INIT        COMPANY                 FULLNAME                     FLAGS
689 COMP( 1985, ep64,  0,      0,      ep64,    ep64,  ep64_state, empty_init, "Enterprise Computers", "Enterprise Sixty Four",     MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
690 COMP( 1985, phc64, ep64,   0,      ep64,    ep64,  ep64_state, empty_init, "Hegener + Glaser",     "Mephisto PHC 64 (Germany)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
691 COMP( 1986, ep128, ep64,   0,      ep128,   ep64,  ep64_state, empty_init, "Enterprise Computers", "Enterprise One Two Eight",  MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
692