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 ¢_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