1 // license:BSD-3-Clause
2 // copyright-holders:Barry Rodewald
3 /*
4
5 Fujitsu FM-Towns
6 driver by Barry Rodewald
7
8 Japanese computer system released in 1989.
9
10 CPU: various AMD x86 CPUs, originally 80386DX (80387 available as an add-on).
11 later models use 80386SX, 80486 and Pentium CPUs
12 Sound: Yamaha YM3438 (some later models are use YMF276; Low voltage variation of YM3438, needs External DAC)
13 Ricoh RF5c68
14 CD-DA
15 Video: Custom
16 16 or 256 colours from a 24-bit palette, or 15-bit high-colour
17 1024 sprites (16x16), rendered direct to VRAM
18 16 colour text mode, rendered direct to VRAM
19
20 Later models add an unknown single channel 16-bit PCM/ADPCM (FreshTV, SJ, MX), and CL-GD543x Windows accelerator chipsets (SJ)
21
22
23 Fujitsu FM-Towns Marty
24
25 Japanese console, based on the FM-Towns computer, using an AMD 80386SX CPU,
26 released in 1993
27
28
29 Issues: Video emulation is far from complete.
30
31 */
32
33 /*
34
35 Regular models:
36
37 Model | Form factor | CPU | Standard RAM | Max RAM | Standard FDDs | Standard HDD
38 FM Towns 1/2 | Tower | 386DX-16 | 1 MB (1) or 2 MB (2) | 6 MB | 1 or 2 | No SCSI controller
39 FM Towns 1F/2F/1H/2H | Tower | 386DX-16 | 1 MB (1F/1H) or 2 MB (2F/2H) | 8 MB | 1 (1F) or 2 (others) | 20 or 40 MB (H models only)
40 FM Towns 10F/20F/40H/80H | Tower | 386DX-16 | 2 MB | 26 MB | 1 (10F) or 2 (others) | 40 or 85 MB (H models only)
41 FM Towns II CX10/20/40/100 | Tower | 386DX-16 | 2 MB | 26 MB | 1 (CX10) or 2 (others) | No (CX10/20), 40 or 100 MB
42 FM Towns II UX10/20/40 | All-in-one | 386SX-16 | 2 MB | 10 MB | 1 (UX10) or 2 (others) | No (UX10/20) or 40 MB
43 FM Towns II HG20/40/100 | Desktop | 386DX-20 | 2 MB | 26 MB | 2 | No (HG20), 40 or 80 MB
44 FM Towns II HR20/100/200 | Desktop | 486SX-20 | 4 MB | 28 MB | 2 | No (HR20) 100 or 200 MB
45 FM Towns II UG10/20/40/80 | All-in-one | 386SX-20 | 2 MB | 10 MB | 1 (UG10) or 2 (others) | No (UG10/20), 40 or 80 MB
46 FM Towns II UR20/40/80 | All-in-one | 486SX-20 | 2 MB | 10 MB | 2 | No (UG20), 40 or 80 MB
47 FM Towns II ME20/170 | Desktop | 486SX-25 | 2 MB | 66 MB | 2 | No (ME20) or 170 MB
48 FM Towns II MA170/340 | Desktop | 486SX-33 | 4 MB | 100 MB | 2 | 170 or 340 MB
49 FM Towns II MX20/170/340 | Desktop | 486DX2-66 | 4 MB | 100 MB | 2 | No (MX20), 170 or 340 MB
50 FM Towns II Fresh/MF20/MF170W | Desktop | 486SX-33 | 4 MB (MF20) or 6 MB (others) | 68 MB | 2 | No (MF20), or 170 (others)
51 FM Towns II MA170W/MA340W | Desktop | 486SX-33 | 8 MB | 100 MB | 2 | 170 or 340 MB
52 FM Towns II MX170W/MA340W | Desktop | 486DX2-66 | 8 MB | 100 MB | 2 | 170 or 340 MB
53 FM Towns II Fresh-TV | Desktop | 486SX-33 | 6 MB | 68 MB | 2 | 170 MB
54 FM Towns II Fresh-E | Desktop | 486DX2-66 | 8 MB | 72 MB | 2 | 260 MB
55 FM Towns II Fresh-T | Desktop | 486SX-33 | 8 MB | 72 MB | 2 | 260 MB
56 FM Towns II EA2 | Desktop | 486SX-33 | 4 MB | 68 MB | 2 | No
57 FM Towns II HA2/HA53 | Desktop | 486DX2-66 | 4 MB (HA2) or 8 MB (HA53) | 100 MB | 2 | No (HA2) or 530 MB
58 FM Towns II HB2/HB53/HB53M | Desktop | Pentium-60 | 8 MB | 136 MB | 2 | No (HB2) or 530 MB
59 FM Towns II Fresh-ES/Fresh-ET | Desktop | 486DX2-66 | 8 MB | 72 MB | 1 | 360 MB
60 FM Towns II HC53/HC53M | Desktop | Pentium-90 | 8 MB | 136 MB | 1 | 540 MB
61 FM Towns II Fresh-FS/Fresh-FT | Desktop | 486DX4-100 | 8 MB | 72 MB | 1 | 540 MB
62 FM Towns Marty/Marty 2/TC Marty | Console | 386SX-16 | 2 MB | 4 MB | 1 | No SCSI controller
63 Car Marty | Car-mounted | 386SX-16 | 2 MB | ? | No | No SCSI controller
64
65 Education models:
66
67 Model | Form factor | CPU | Standard RAM | Max RAM | Standard FDDs | Standard HDD
68 FM Towns S1/S2 | Tower | 386DX-16 | 1 MB (S1) or 2 MB (S2) | 6 MB | 1 or 2 | No SCSI controller
69 FM Towns SF/SH | Tower | 386DX-16 | 1 MB (1F/1H) or 2 MB (2F/2H) | 8 MB | 2 | No (SF) or 40 MB
70 FM Towns SF2/SH2 | Tower | 386DX-16 | 2 MB | 26 MB | 2 | No (SF2) or 40 MB
71 FM Towns II SG20/40 | Desktop | 386DX-20 | 2 MB | 26 MB | 2 | No (SG20) or 40 MB
72 FM Towns II SR20/100 | Desktop | 486SX-20 | 4 MB | 28 MB | 2 | No (SR20) or 100 MB
73 FM Towns II SE | Desktop | 486SX-25 | 2 MB | 66 MB | 2 | No
74 FM Towns II SA | Desktop | 486SX-33 | 4 MB | 100 MB | 2 | No
75 FM Towns II SF20/SF170W | Desktop | 486SX-33 | 4 MB (SF20) or 6 MB (SF170W) | 100 MB | 2 | No (SF20) or 170 MB
76 FM Towns II SA170W | Desktop | 486SX-33 | 8 MB | 100 MB | 2 | 170 MB
77 FM Towns II SI2/SI26 | Desktop | 486SX-33 | 4 MB (SI2) or 8 MB (SI26) | 68 MB | 2 | No (SI2) or 260 MB
78 FM Towns II SJ2/SJ26 | Desktop | 486DX2-66 | 4 MB (SJ2) or 8 MB (SJ26) | 68 MB | 2 | No (SJ2) or 260 MB
79 FM Towns II SK53 | Desktop | Pentium-60 | 8 MB | 136 MB | 2 | 530 MB
80 FM Towns II SN | Laptop | 486DX2-66 | 4 MB | 36 MB | 1 | 340 MB
81 FM Towns II SJ2A/SJ53 | Desktop | 486DX2-66 | 4 MB (SJ2A) or 8 MB (SJ53) | 68 MB | 2 | No (SJ2A) or 530 MB
82 FM Towns II SL53 | Desktop | Pentium-90 | 8 MB | 136 MB | 2 | 530 MB
83
84 */
85
86 /* I/O port map (incomplete, could well be incorrect too)
87 *
88 * 0x0000 : Master 8259 PIC
89 * 0x0002 : Master 8259 PIC
90 * 0x0010 : Slave 8259 PIC
91 * 0x0012 : Slave 8259 PIC
92 * 0x0020 RW: bit 0 = soft reset (read/write), bit 6 = power off (write), bit 7 = NMI vector protect
93 * 0x0022 W: bit 7 = power off (write)
94 * 0x0025 R : returns 0x00? (read)
95 * 0x0026 R : timer?
96 * 0x0028 RW: bit 0 = NMI mask (read/write)
97 * 0x0030 R : Machine ID (low)
98 * 0x0031 R : Machine ID (high)
99 * 0x0032 RW: bit 7 = RESET, bit 6 = CLK, bit 0 = data (serial ROM)
100 * 0x0040 : 8253 PIT counter 0
101 * 0x0042 : 8253 PIT counter 1
102 * 0x0044 : 8253 PIT counter 2
103 * 0x0046 : 8253 PIT mode port
104 * 0x0060 : 8253 PIT timer control
105 * 0x006c RW: returns 0x00? (read) timer? (write)
106 * 0x00a0-af: DMA controller 1 (uPD71071)
107 * 0x00b0-bf: DMA controller 2 (uPD71071)
108 * 0x0200-0f: Floppy controller (MB8877A)
109 * 0x0400 : Video / CRTC (unknown)
110 * 0x0404 : Disable VRAM, CMOS, memory-mapped I/O (everything in low memory except the BIOS)
111 * 0x0440-5f: Video / CRTC
112 * 0x0480 RW: bit 1 = disable BIOS ROM
113 * 0x048a RW: JEIDA v3/v4(?) IC Memory card status
114 * 0x0490 RW: JEIDA v4 IC Memory card page select
115 * 0x0491 RW: JEIDA v4 IC Memory card
116 * 0x04c0-cf: CD-ROM controller
117 * 0x04d5 : Sound mute
118 * 0x04d8 : YM3438 control port A / status
119 * 0x04da : YM3438 data port A / status
120 * 0x04dc : YM3438 control port B / status
121 * 0x04de : YM3438 data port B / status
122 * 0x04e0-e3: volume ports
123 * 0x04e9-ec: IRQ masks
124 * 0x04f0-f8: RF5c68 registers
125 * 0x05e8 R : RAM size in MB
126 * 0x05ec RW: bit 0 = compatibility mode?
127 * 0x0600 RW: Keyboard data port (8042)
128 * 0x0602 : Keyboard control port (8042)
129 * 0x0604 : (8042)
130 * 0x0a00-0a: RS-232C interface (i8251)
131 * 0x3000 - 0x3fff : CMOS RAM
132 * 0xfd90-a0: CRTC / Video
133 * 0xff81: CRTC / Video - returns value in RAM location 0xcff81?
134 *
135 * IRQ list
136 *
137 * IRQ0 - PIT Timer IRQ
138 * IRQ1 - Keyboard
139 * IRQ2 - Serial Port
140 * IRQ6 - Floppy Disc Drive
141 * IRQ7 - PIC Cascade IRQ
142 * IRQ8 - SCSI controller
143 * IRQ9 - Built-in CD-ROM controller
144 * IRQ11 - VSync interrupt
145 * IRQ12 - Printer port
146 * IRQ13 - Sound (YM3438/RF5c68), Mouse
147 * IRQ15 - 16-bit PCM (expansion?)
148 *
149 * Machine ID list (I/O port 0x31)
150 *
151 1(01h) FM-TOWNS 1/2
152 2(02h) FM-TOWNS 1F/2F/1H/2H
153 3(03h) FM-TOWNS 10F/20F/40H/80H
154 4(04h) FM-TOWNSII UX
155 5(05h) FM-TOWNSII CX
156 6(06h) FM-TOWNSII UG
157 7(07h) FM-TOWNSII HR
158 8(08h) FM-TOWNSII HG
159 9(09h) FM-TOWNSII UR
160 11(0Bh) FM-TOWNSII MA
161 12(0Ch) FM-TOWNSII MX
162 13(0Dh) FM-TOWNSII ME
163 14(0Eh) TOWNS Application Card (PS/V Vision)
164 15(0Fh) FM-TOWNSII MF/Fresh/Fresh???TV
165 16(10h) FM-TOWNSII SN
166 17(11h) FM-TOWNSII HA/HB/HC
167 19(13h) FM-TOWNSII EA/Fresh???T/Fresh???ET/Fresh???FT
168 20(14h) FM-TOWNSII Fresh???E/Fresh???ES/Fresh???FS
169 22(16h) FMV-TOWNS H/Fresh???GS/Fresh???GT/H2
170 23(17h) FMV-TOWNS H20
171 74(4Ah) FM-TOWNS MARTY
172 */
173
174 /*
175
176 Fujitsu FM Towns Marty
177
178 PCB Layout
179 ----------
180
181 CA20142-B21X
182
183 CN10 CN1
184 |-| |-| |-| |----------------------|
185 |--| |-| |-| |----|-|-------------|----------------------|------------|
186 |14577 CN11 SW2 |--------| MROM.M37|--------| |
187 |14576 TMS48C121DZ-80 |FUJITSU | |FUJITSU | |
188 | TMS48C121DZ-80 |CG24243 | |CS10501 | |
189 |MB40968 TMS48C121DZ-80 |(QFP208)| MROM.M36|(QFP160)| |
190 ||--------| TMS48C121DZ-80 |--------| |--------| 62256 |
191 ||FUJITSU | HM511664JP8 CN12 FUJITSU |
192 ||CE31755 | 8451 (DIP8) |
193 ||(QFP160)| |
194 ||--------| 4.9152MHz |
195 |CN13 |--------| 28.63636MHz |-|
196 | |FUJITSU | |----------------------|
197 | RTC58323 |CG31553 | | |
198 |BATTERY |(QFP208)| 32MHz 74LS00 | |
199 | |--------| |------| | CN2 |
200 | LC7881 MB84256 |I386SX| | PCMCIA SLOT |
201 | TL084 CN4 | -16 | | |
202 ||--------| |------| | |
203 ||FUJITSU | MB814400A-70PZ | |
204 ||CS09501 | MB814400A-70PZ |----------------------|
205 ||(QFP120)| MB814400A-70PZ |--------|74LS14 74HC08 |-|
206 ||--------| MB814400A-70PZ | RICOH | 3771 |
207 | YM3438 |RU6101MF| |
208 |4560 MB81C78 |(QFP44) | |
209 | MB88505 |------| |--------| |
210 | CN3 |YM6063| LED2 LED1 LED3 |
211 |CN9 CN8 VOL |(QFP80| CN5 CN6 SW1 CN7|
212 |---------------------|------|----------------------------------------|
213 Notes:
214 All IC's shown.
215 Main CPU Intel 80386SX-16 running at 16.000MHz
216 CN1 - Multi-pin connector possibly for cartridge or external peripheral connector?
217 CN2 - PCMCIA slot
218 CN3 - 24 pin connector for ?
219 CN4 - CDROM connector? (multi-pin connector with internal slot for a thin cable)
220 CN5/6 - DB9 connectors (joystick ports?)
221 CN7 - Power input socket
222 CN8/9 - Headphone out jacks?
223 CN10 - Header with left/right RCA audio jacks and composite video output
224 CN11 - S-VIDEO output
225 CN12 - 8 pin connector (possibly power related for the CDROM?)
226 CN13 - 2 pin connector (fan power?)
227 SW1 - Reset Switch?
228 SW2 - 2 position slide switch
229 MROM* - Hitachi HN624116 16MBit SOP44 maskROM
230
231 */
232
233 #include "emu.h"
234 #include "includes/fmtowns.h"
235
236 #include "bus/scsi/scsi.h"
237 #include "bus/scsi/scsihd.h"
238
239 #include "screen.h"
240 #include "softlist.h"
241 #include "speaker.h"
242 #include <math.h>
243
244
245 // CD controller IRQ types
246 #define TOWNS_CD_IRQ_MPU 1
247 #define TOWNS_CD_IRQ_DMA 2
248
249 #define LOG_SYS 0
250 #define LOG_CD 0
251
252 enum
253 {
254 MOUSE_START,
255 MOUSE_SYNC,
256 MOUSE_X_HIGH,
257 MOUSE_X_LOW,
258 MOUSE_Y_HIGH,
259 MOUSE_Y_LOW
260 };
261
262
263
264
byte_to_bcd(uint8_t val)265 inline uint8_t towns_state::byte_to_bcd(uint8_t val)
266 {
267 return ((val / 10) << 4) | (val % 10);
268 }
269
bcd_to_byte(uint8_t val)270 inline uint8_t towns_state::bcd_to_byte(uint8_t val)
271 {
272 return (((val & 0xf0) >> 4) * 10) + (val & 0x0f);
273 }
274
msf_to_lbafm(uint32_t val)275 inline uint32_t towns_state::msf_to_lbafm(uint32_t val) // because the CDROM core doesn't provide this
276 {
277 uint8_t m,s,f;
278 f = bcd_to_byte(val & 0x0000ff);
279 s = (bcd_to_byte((val & 0x00ff00) >> 8));
280 m = (bcd_to_byte((val & 0xff0000) >> 16));
281 return ((m * (60 * 75)) + (s * 75) + f) - 150;
282 }
283
init_serial_rom()284 void towns_state::init_serial_rom()
285 {
286 // TODO: init serial ROM contents
287 int x;
288 static const uint8_t code[8] = { 0x04,0x65,0x54,0xA4,0x95,0x45,0x35,0x5F };
289 uint8_t* srom = nullptr;
290
291 if(m_serial)
292 srom = m_serial->base();
293 memset(m_towns_serial_rom.get(),0,256/8);
294
295 if(srom)
296 {
297 memcpy(m_towns_serial_rom.get(),srom,32);
298 m_towns_machine_id = (m_towns_serial_rom[0x18] << 8) | m_towns_serial_rom[0x17];
299 logerror("Machine ID in serial ROM: %04x\n",m_towns_machine_id);
300 return;
301 }
302
303 for(x=8;x<=21;x++)
304 m_towns_serial_rom[x] = 0xff;
305
306 for(x=0;x<=7;x++)
307 {
308 m_towns_serial_rom[x] = code[x];
309 }
310
311 // add Machine ID
312 m_towns_machine_id = 0x0101;
313 m_towns_serial_rom[0x17] = 0x01;
314 m_towns_serial_rom[0x18] = 0x01;
315
316 // serial number?
317 m_towns_serial_rom[29] = 0x10;
318 m_towns_serial_rom[28] = 0x6e;
319 m_towns_serial_rom[27] = 0x54;
320 m_towns_serial_rom[26] = 0x32;
321 m_towns_serial_rom[25] = 0x10;
322 }
323
towns_system_r(offs_t offset)324 uint8_t towns_state::towns_system_r(offs_t offset)
325 {
326 uint8_t ret = 0;
327
328 switch(offset)
329 {
330 case 0x00:
331 if(LOG_SYS) logerror("SYS: port 0x20 read\n");
332 return 0x00;
333 case 0x05:
334 if(LOG_SYS) logerror("SYS: port 0x25 read\n");
335 return 0x00;
336 /* case 0x06:
337 count = (m_towns_freerun_counter->time_elapsed() * ATTOSECONDS_TO_HZ(ATTOSECONDS_IN_USEC(1))).as_double();
338 return count & 0xff;
339 case 0x07:
340 count = (m_towns_freerun_counter->time_elapsed() * ATTOSECONDS_TO_HZ(ATTOSECONDS_IN_USEC(1))).as_double();
341 return (count >> 8) & 0xff;
342 */ case 0x06:
343 //if(LOG_SYS) logerror("SYS: (0x26) timer read\n");
344 return m_freerun_timer;
345 case 0x07:
346 return m_freerun_timer >> 8;
347 case 0x08:
348 //if(LOG_SYS) logerror("SYS: (0x28) NMI mask read\n");
349 return m_nmi_mask & 0x01;
350 case 0x10:
351 if(LOG_SYS) logerror("SYS: (0x30) Machine ID read\n");
352 return (m_towns_machine_id >> 8) & 0xff;
353 case 0x11:
354 if(LOG_SYS) logerror("SYS: (0x31) Machine ID read\n");
355 return m_towns_machine_id & 0xff;
356 case 0x12:
357 /* Bit 0 = data, bit 6 = CLK, bit 7 = RESET, bit 5 is always 1? */
358 ret = (m_towns_serial_rom[m_towns_srom_position/8] & (1 << (m_towns_srom_position%8))) ? 1 : 0;
359 ret |= m_towns_srom_clk;
360 ret |= m_towns_srom_reset;
361 //if(LOG_SYS) logerror("SYS: (0x32) Serial ROM read [0x%02x, pos=%i]\n",ret,towns_srom_position);
362 return ret;
363 default:
364 //if(LOG_SYS) logerror("SYS: Unknown system port read (0x%02x)\n",offset+0x20);
365 return 0x00;
366 }
367 }
368
towns_system_w(offs_t offset,uint8_t data)369 void towns_state::towns_system_w(offs_t offset, uint8_t data)
370 {
371 switch(offset)
372 {
373 case 0x00: // bit 7 = NMI vector protect, bit 6 = power off, bit 0 = software reset, bit 3 = A20 line?
374 // space.m_maincpu->set_input_line(INPUT_LINE_A20,(data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
375 if(LOG_SYS) logerror("SYS: port 0x20 write %02x\n",data);
376 break;
377 case 0x02:
378 if(LOG_SYS) logerror("SYS: (0x22) power port write %02x\n",data);
379 break;
380 case 0x08:
381 //if(LOG_SYS) logerror("SYS: (0x28) NMI mask write %02x\n",data);
382 m_nmi_mask = data & 0x01;
383 break;
384 case 0x12:
385 //if(LOG_SYS) logerror("SYS: (0x32) Serial ROM write %02x\n",data);
386 // clocks on low-to-high transition
387 if((data & 0x40) && m_towns_srom_clk == 0) // CLK
388 { // advance to next bit
389 m_towns_srom_position++;
390 }
391 if((data & 0x80) && m_towns_srom_reset == 0) // reset
392 { // reset to beginning
393 m_towns_srom_position = 0;
394 }
395 m_towns_srom_clk = data & 0x40;
396 m_towns_srom_reset = data & 0x80;
397 break;
398 default:
399 if(LOG_SYS) logerror("SYS: Unknown system port write 0x%02x (0x%02x)\n",data,offset);
400 }
401 }
402
towns_intervaltimer2_w(offs_t offset,uint8_t data)403 void towns_state::towns_intervaltimer2_w(offs_t offset, uint8_t data)
404 {
405 switch(offset)
406 {
407 case 0x00:
408 m_intervaltimer2_irqmask = data & 0x80;
409 break;
410 case 0x02:
411 m_intervaltimer2_period = (m_intervaltimer2_period & 0xff00) | data;
412 popmessage("Interval Timer 2 period changed to %04x",m_intervaltimer2_period);
413 break;
414 case 0x03:
415 m_intervaltimer2_period = (data << 8) | (m_intervaltimer2_period & 0x00ff);
416 popmessage("Interval Timer 2 period changed to %04x",m_intervaltimer2_period);
417 break;
418 }
419 }
420
towns_intervaltimer2_r(offs_t offset)421 uint8_t towns_state::towns_intervaltimer2_r(offs_t offset)
422 {
423 uint8_t ret = 0;
424
425 switch(offset)
426 {
427 case 0x00:
428 if(m_intervaltimer2_timeout_flag != 0)
429 ret |= 0x40;
430 if(m_intervaltimer2_irqmask != 0)
431 ret |= 0x80;
432 m_intervaltimer2_timeout_flag = 0; // flag reset on read
433 return ret;
434 case 0x02:
435 return m_intervaltimer2_period & 0x00ff;
436 case 0x03:
437 return m_intervaltimer2_period >> 8;
438 }
439 return 0xff;
440 }
441
device_timer(emu_timer & timer,device_timer_id id,int param,void * ptr)442 void towns_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
443 {
444 switch(id)
445 {
446 case TIMER_FREERUN:
447 freerun_inc();
448 break;
449 case TIMER_INTERVAL2:
450 intervaltimer2_timeout();
451 break;
452 case TIMER_KEYBOARD:
453 poll_keyboard();
454 break;
455 case TIMER_MOUSE:
456 mouse_timeout();
457 break;
458 case TIMER_WAIT:
459 wait_end();
460 break;
461 case TIMER_CDSTATUS:
462 towns_cd_status_ready();
463 break;
464 case TIMER_CDDA:
465 towns_delay_cdda((cdrom_image_device*)ptr);
466 break;
467 }
468 }
freerun_inc()469 void towns_state::freerun_inc()
470 {
471 m_freerun_timer++;
472 }
473
intervaltimer2_timeout()474 void towns_state::intervaltimer2_timeout()
475 {
476 m_intervaltimer2_timeout_flag = 1;
477 }
478
wait_end()479 void towns_state::wait_end()
480 {
481 m_maincpu->set_input_line(INPUT_LINE_HALT,CLEAR_LINE);
482 }
483
towns_sys6c_r()484 uint8_t towns_state::towns_sys6c_r()
485 {
486 if(LOG_SYS) logerror("SYS: (0x6c) Timer? read\n");
487 return 0x00;
488 }
489
towns_sys6c_w(uint8_t data)490 void towns_state::towns_sys6c_w(uint8_t data)
491 {
492 // halts the CPU for 1 microsecond
493 m_maincpu->set_input_line(INPUT_LINE_HALT,ASSERT_LINE);
494 m_towns_wait_timer->adjust(attotime::from_usec(1),0,attotime::never);
495 }
496
497 template<int Chip>
towns_dma_r(offs_t offset)498 uint8_t towns_state::towns_dma_r(offs_t offset)
499 {
500 logerror("DMA#%01x: read register %i\n",Chip,offset);
501 return m_dma[Chip]->read(offset);
502 }
503
504 template<int Chip>
towns_dma_w(offs_t offset,uint8_t data)505 void towns_state::towns_dma_w(offs_t offset, uint8_t data)
506 {
507 logerror("DMA#%01x: wrote 0x%02x to register %i\n",Chip,data,offset);
508 m_dma[Chip]->write(offset, data);
509 }
510
511 /*
512 * Floppy Disc Controller (MB8877A)
513 */
514
WRITE_LINE_MEMBER(towns_state::mb8877a_irq_w)515 WRITE_LINE_MEMBER( towns_state::mb8877a_irq_w )
516 {
517 if(m_towns_fdc_irq6mask == 0)
518 state = 0;
519 m_pic_master->ir6_w(state); // IRQ6 = FDC
520 if(IRQ_LOG) logerror("PIC: IRQ6 (FDC) set to %i\n",state);
521 }
522
WRITE_LINE_MEMBER(towns_state::mb8877a_drq_w)523 WRITE_LINE_MEMBER( towns_state::mb8877a_drq_w )
524 {
525 m_dma[0]->dmarq(state, 0);
526 }
527
towns_floppy_r(offs_t offset)528 uint8_t towns_state::towns_floppy_r(offs_t offset)
529 {
530 uint8_t ret;
531
532 switch(offset)
533 {
534 case 0x00:
535 return m_fdc->status_r();
536 case 0x02:
537 return m_fdc->track_r();
538 case 0x04:
539 return m_fdc->sector_r();
540 case 0x06:
541 return m_fdc->data_r();
542 case 0x08: // selected drive status?
543 //logerror("FDC: read from offset 0x08\n");
544 ret = 0x80; // always set
545 switch(m_towns_selected_drive)
546 {
547 case 1:
548 ret |= 0x0c;
549 if(m_flop[0]->get_device() && m_flop[0]->get_device()->exists())
550 ret |= 0x03;
551 break;
552 case 2:
553 ret |= 0x0c;
554 if(m_flop[1]->get_device() && m_flop[1]->get_device()->exists())
555 ret |= 0x03;
556 break;
557 case 3:
558 case 4:
559 case 0:
560 default:
561 break;
562 }
563 return ret;
564 case 0x0e: // DRVCHG
565 logerror("FDC: read from offset 0x0e\n");
566 if(m_towns_selected_drive == 1)
567 if (m_flop[0]->get_device())
568 return m_flop[0]->get_device()->dskchg_r();
569 if(m_towns_selected_drive == 2)
570 if (m_flop[1]->get_device())
571 return m_flop[1]->get_device()->dskchg_r();
572 return 0x00;
573 default:
574 logerror("FDC: read from invalid or unimplemented register %02x\n",offset);
575 }
576 return 0xff;
577 }
578
towns_floppy_w(offs_t offset,uint8_t data)579 void towns_state::towns_floppy_w(offs_t offset, uint8_t data)
580 {
581 floppy_image_device* sel[4] = { m_flop[0]->get_device(), m_flop[1]->get_device(), nullptr, nullptr };
582
583 switch(offset)
584 {
585 case 0x00:
586 // Commands 0xd0 and 0xfe (Write Track) are apparently ignored?
587 if(data == 0xd0)
588 return;
589 if(data == 0xfe)
590 return;
591 m_fdc->cmd_w(data);
592 logerror("FDC: Command %02x\n",data);
593 break;
594 case 0x02:
595 m_fdc->track_w(data);
596 logerror("FDC: Track %02x\n",data);
597 break;
598 case 0x04:
599 m_fdc->sector_w(data);
600 logerror("FDC: Sector %02x\n",data);
601 break;
602 case 0x06:
603 m_fdc->data_w(data);
604 logerror("FDC: Data %02x\n",data);
605 break;
606 case 0x08:
607 {
608 // bit 5 - CLKSEL
609 // docs are unclear about this but there's only one motor control line and turning on only the selected drive doesn't work properly.
610 for(int i = 0; i < 4; i++)
611 {
612 if(sel[i] != nullptr)
613 {
614 sel[i]->mon_w((~data & 0x10)>>4);
615 sel[i]->ss_w((data & 0x04)>>2);
616 }
617 }
618 m_fdc->dden_w(BIT(~data, 1));
619
620 m_towns_fdc_irq6mask = data & 0x01;
621 //logerror("FDC: Config drive%i %02x\n",m_towns_selected_drive-1,data);
622
623 break;
624 }
625 case 0x0c: // drive select
626 switch(data & 0x0f)
627 {
628 case 0x00:
629 m_towns_selected_drive = 0; // No drive selected
630 break;
631 case 0x01:
632 m_towns_selected_drive = 1;
633 if(sel[0] != nullptr)
634 m_fdc->set_floppy(sel[0]);
635 break;
636 case 0x02:
637 m_towns_selected_drive = 2;
638 if(sel[1] != nullptr)
639 m_fdc->set_floppy(sel[1]);
640 break;
641 case 0x04:
642 m_towns_selected_drive = 3;
643 if(sel[2] != nullptr)
644 m_fdc->set_floppy(sel[2]);
645 break;
646 case 0x08:
647 m_towns_selected_drive = 4;
648 if(sel[3] != nullptr)
649 m_fdc->set_floppy(sel[3]);
650 break;
651 }
652 //logerror("FDC: drive select %02x\n",data);
653 break;
654 default:
655 logerror("FDC: write %02x to invalid or unimplemented register %02x\n",data,offset);
656 }
657 }
658
towns_fdc_dma_r()659 uint16_t towns_state::towns_fdc_dma_r()
660 { uint16_t data = m_fdc->data_r();
661 return data;
662 }
663
towns_fdc_dma_w(uint16_t data)664 void towns_state::towns_fdc_dma_w(uint16_t data)
665 {
666 m_fdc->data_w(data);
667 }
668
669 /*
670 * Port 0x600-0x607 - Keyboard controller (8042 MCU)
671 *
672 * Sends two-byte code on each key press and release.
673 * First byte has the MSB set, and contains shift/ctrl/keyboard type flags
674 * Known bits:
675 * bit 7 = always 1
676 * bits 6-5 = keyboard type
677 * 00 = thumb shift (NICOLA) keyboard
678 * 01 = JIS keyboard
679 * 10 = new JIS keyboard (with ALT key?)
680 * 11 = extended use (?)
681 * bit 4 = key release
682 * bit 3 = ctrl
683 * bit 2 = shift
684 * bit 1 = left shift (thumb shift only)
685 * bit 0 = right shift (thumb shift only)
686 *
687 * Second byte has the MSB reset, and contains the scancode of the key
688 * pressed or released.
689 * bit 7 = always 0
690 * bits 6-0 = key scancode
691 */
kb_sendcode(uint8_t scancode,int release)692 void towns_state::kb_sendcode(uint8_t scancode, int release)
693 {
694 switch(release)
695 {
696 case 0: // key press
697 m_towns_kb_output = 0xc0;
698 m_towns_kb_extend = scancode & 0x7f;
699 if (m_kb_ports[2]->read() & 0x00080000)
700 m_towns_kb_output |= 0x04;
701 if (m_kb_ports[2]->read() & 0x00040000)
702 m_towns_kb_output |= 0x08;
703 break;
704 case 1: // key release
705 m_towns_kb_output = 0xd0;
706 m_towns_kb_extend = scancode & 0x7f;
707 if (m_kb_ports[2]->read() & 0x00080000)
708 m_towns_kb_output |= 0x04;
709 if (m_kb_ports[2]->read() & 0x00040000)
710 m_towns_kb_output |= 0x08;
711 break;
712 case 2: // extended byte
713 m_towns_kb_output = scancode;
714 m_towns_kb_extend = 0xff;
715 break;
716 }
717 m_towns_kb_status |= 0x01;
718 if(m_towns_kb_irq1_enable)
719 {
720 m_pic_master->ir1_w(1);
721 if(IRQ_LOG) logerror("PIC: IRQ1 (keyboard) set high\n");
722 }
723 //logerror("KB: sending scancode 0x%02x\n",scancode);
724 }
725
poll_keyboard()726 void towns_state::poll_keyboard()
727 {
728 int port,bit;
729 uint8_t scan;
730 uint32_t portval;
731
732 scan = 0;
733 for(port=0;port<4;port++)
734 {
735 portval = m_kb_ports[port]->read();
736 for(bit=0;bit<32;bit++)
737 {
738 if(((portval & (1<<bit))) != ((m_kb_prev[port] & (1<<bit))))
739 { // bit changed
740 if((portval & (1<<bit)) == 0) // release
741 kb_sendcode(scan,1);
742 else
743 kb_sendcode(scan,0);
744 }
745 scan++;
746 }
747 m_kb_prev[port] = portval;
748 }
749 }
750
towns_keyboard_r(offs_t offset)751 uint8_t towns_state::towns_keyboard_r(offs_t offset)
752 {
753 uint8_t ret = 0x00;
754
755 switch(offset)
756 {
757 case 0: // scancode output
758 ret = m_towns_kb_output;
759 //logerror("KB: read keyboard output port, returning %02x\n",ret);
760 m_pic_master->ir1_w(0);
761 if(IRQ_LOG) logerror("PIC: IRQ1 (keyboard) set low\n");
762 if(m_towns_kb_extend != 0xff)
763 {
764 kb_sendcode(m_towns_kb_extend,2);
765 }
766 else
767 m_towns_kb_status &= ~0x01;
768 return ret;
769 case 1: // status
770 //logerror("KB: read status port, returning %02x\n",m_towns_kb_status);
771 return m_towns_kb_status;
772 default:
773 logerror("KB: read offset %02x\n",offset);
774 }
775 return 0x00;
776 }
777
towns_keyboard_w(offs_t offset,uint8_t data)778 void towns_state::towns_keyboard_w(offs_t offset, uint8_t data)
779 {
780 switch(offset)
781 {
782 case 0: // command input
783 m_towns_kb_status &= ~0x08;
784 m_towns_kb_status |= 0x01;
785 break;
786 case 1: // control
787 m_towns_kb_status |= 0x08;
788 break;
789 case 2: // IRQ1 enable
790 m_towns_kb_irq1_enable = data & 0x01;
791 break;
792 default:
793 logerror("KB: wrote 0x%02x to offset %02x\n",data,offset);
794 }
795 }
796
797 /*
798 * Port 0x60 - PIT Timer control
799 * On read: bit 0: Timer 0 output level
800 * bit 1: Timer 1 output level
801 * bits 4-2: Timer masks (timer 2 = beeper)
802 * On write: bits 2-0: Timer mask set
803 * bit 7: Timer 0 output reset
804 */
speaker_get_spk()805 uint8_t towns_state::speaker_get_spk()
806 {
807 return m_towns_spkrdata & m_pit_out2;
808 }
809
810
speaker_set_spkrdata(uint8_t data)811 void towns_state::speaker_set_spkrdata(uint8_t data)
812 {
813 m_towns_spkrdata = data ? 1 : 0;
814 m_speaker->level_w(speaker_get_spk());
815 }
816
817
towns_port60_r()818 uint8_t towns_state::towns_port60_r()
819 {
820 uint8_t val = 0x00;
821
822 if (m_pit_out0)
823 val |= 0x01;
824 if (m_pit_out1)
825 val |= 0x02;
826
827 val |= (m_towns_timer_mask & 0x07) << 2;
828
829 //logerror("PIT: port 0x60 read, returning 0x%02x\n",val);
830 return val;
831 }
832
towns_port60_w(uint8_t data)833 void towns_state::towns_port60_w(uint8_t data)
834 {
835 if(data & 0x80)
836 {
837 //towns_pic_irq(dev,0);
838 m_timer0 = 0;
839 m_pic_master->ir0_w(m_timer0 || m_timer1);
840 }
841 m_towns_timer_mask = data & 0x07;
842
843 speaker_set_spkrdata(data & 0x04);
844
845 //logerror("PIT: wrote 0x%02x to port 0x60\n",data);
846 }
847
towns_sys5e8_r(offs_t offset)848 uint8_t towns_state::towns_sys5e8_r(offs_t offset)
849 {
850 switch(offset)
851 {
852 case 0x00:
853 if(LOG_SYS) logerror("SYS: read RAM size port (%i)\n",m_ram->size());
854 return m_ram->size()/1048576;
855 case 0x02:
856 if(LOG_SYS) logerror("SYS: read port 5ec\n");
857 return m_compat_mode & 0x01;
858 }
859 return 0x00;
860 }
861
towns_sys5e8_w(offs_t offset,uint8_t data)862 void towns_state::towns_sys5e8_w(offs_t offset, uint8_t data)
863 {
864 switch(offset)
865 {
866 case 0x00:
867 if(LOG_SYS) logerror("SYS: wrote 0x%02x to port 5e8\n",data);
868 break;
869 case 0x02:
870 if(LOG_SYS) logerror("SYS: wrote 0x%02x to port 5ec\n",data);
871 m_compat_mode = data & 0x01;
872 break;
873 }
874 }
875
876 // Sound/LED control (I/O port 0x4e8-0x4ef)
877 // R/O -- (0x4e9) FM IRQ flag (bit 0), PCM IRQ flag (bit 3)
878 // (0x4ea) PCM IRQ mask
879 // R/W -- (0x4eb) PCM IRQ flag
880 // W/O -- (0x4ec) LED control
towns_sound_ctrl_r(offs_t offset)881 uint8_t towns_state::towns_sound_ctrl_r(offs_t offset)
882 {
883 uint8_t ret = 0;
884
885 switch(offset)
886 {
887 case 0x00:
888 ret = 1;
889 break;
890 case 0x01:
891 if(m_towns_fm_irq_flag)
892 ret |= 0x01;
893 if(m_towns_pcm_irq_flag)
894 ret |= 0x08;
895 break;
896 case 0x02:
897 ret = m_towns_pcm_channel_mask;
898 break;
899 case 0x03:
900 ret = m_towns_pcm_channel_flag;
901 m_towns_pcm_channel_flag = 0;
902 m_towns_pcm_irq_flag = 0;
903 if(m_towns_fm_irq_flag == 0)
904 {
905 m_pic_slave->ir5_w(0);
906 if(IRQ_LOG) logerror("PIC: IRQ13 (PCM) set low\n");
907 }
908 break;
909 // default:
910 //logerror("FM: unimplemented port 0x%04x read\n",offset + 0x4e8);
911 }
912 return ret;
913 }
914
towns_sound_ctrl_w(offs_t offset,uint8_t data)915 void towns_state::towns_sound_ctrl_w(offs_t offset, uint8_t data)
916 {
917 switch(offset)
918 {
919 case 0x02: // PCM channel interrupt mask
920 m_towns_pcm_channel_mask = data;
921 break;
922 default:
923 logerror("FM: unimplemented port 0x%04x write %02x\n",offset + 0x4e8,data);
924 }
925 }
926
927 // Controller ports
928 // Joysticks are multiplexed, with fire buttons available when bits 0 and 1 of port 0x4d6 are high. (bits 2 and 3 for second port?)
mouse_timeout()929 void towns_state::mouse_timeout()
930 {
931 m_towns_mouse_output = MOUSE_START; // reset mouse data
932 }
933
towns_padport_r(offs_t offset)934 uint8_t towns_state::towns_padport_r(offs_t offset)
935 {
936 uint8_t ret = 0x00;
937 uint32_t porttype = m_ctrltype->read();
938 uint8_t extra1;
939 uint8_t extra2;
940 uint32_t state;
941
942 if(offset == 0)
943 {
944 if((porttype & 0x0f) == 0x01)
945 {
946 extra1 = m_joy1_ex->read();
947
948 if(m_towns_pad_mask & 0x10)
949 ret |= (m_joy1->read() & 0x3f) | 0x40;
950 else
951 ret |= (m_joy1->read() & 0x0f) | 0x30;
952
953 if(extra1 & 0x01) // Run button = left+right
954 ret &= ~0x0c;
955 if(extra1 & 0x02) // Select button = up+down
956 ret &= ~0x03;
957
958 if((extra1 & 0x10) && (m_towns_pad_mask & 0x01))
959 ret &= ~0x10;
960 if((extra1 & 0x20) && (m_towns_pad_mask & 0x02))
961 ret &= ~0x20;
962 }
963 if((porttype & 0x0f) == 0x04) // 6-button joystick
964 {
965 extra1 = m_6b_joy1_ex->read();
966
967 if(m_towns_pad_mask & 0x10)
968 ret |= 0x7f;
969 else
970 ret |= (m_6b_joy1->read() & 0x0f) | 0x70;
971
972 if(!(m_towns_pad_mask & 0x10))
973 {
974 if(extra1 & 0x01) // Run button = left+right
975 ret &= ~0x0c;
976 if(extra1 & 0x02) // Select button = up+down
977 ret &= ~0x03;
978 if((extra1 & 0x04) && (m_towns_pad_mask & 0x01))
979 ret &= ~0x10;
980 if((extra1 & 0x08) && (m_towns_pad_mask & 0x02))
981 ret &= ~0x20;
982 }
983 if(m_towns_pad_mask & 0x10)
984 {
985 if(extra1 & 0x10)
986 ret &= ~0x08;
987 if(extra1 & 0x20)
988 ret &= ~0x04;
989 if(extra1 & 0x40)
990 ret &= ~0x02;
991 if(extra1 & 0x80)
992 ret &= ~0x01;
993 }
994 }
995 if((porttype & 0x0f) == 0x02) // mouse
996 {
997 switch(m_towns_mouse_output)
998 {
999 case MOUSE_X_HIGH:
1000 ret |= ((m_towns_mouse_x & 0xf0) >> 4);
1001 break;
1002 case MOUSE_X_LOW:
1003 ret |= (m_towns_mouse_x & 0x0f);
1004 break;
1005 case MOUSE_Y_HIGH:
1006 ret |= ((m_towns_mouse_y & 0xf0) >> 4);
1007 break;
1008 case MOUSE_Y_LOW:
1009 ret |= (m_towns_mouse_y & 0x0f);
1010 break;
1011 case MOUSE_START:
1012 case MOUSE_SYNC:
1013 break;
1014 default:
1015 if(m_towns_mouse_output < MOUSE_Y_LOW)
1016 ret |= 0x0f;
1017 }
1018
1019 // button states are always visible
1020 state = m_mouse1->read();
1021 if(!(state & 0x01))
1022 ret |= 0x10;
1023 if(!(state & 0x02))
1024 ret |= 0x20;
1025 if(m_towns_pad_mask & 0x10)
1026 ret |= 0x40;
1027 }
1028
1029 }
1030 if(offset == 1) // second joystick port
1031 {
1032 if((porttype & 0xf0) == 0x10)
1033 {
1034 extra2 = m_joy2_ex->read();
1035
1036 if(m_towns_pad_mask & 0x20)
1037 ret |= ((m_joy2->read() & 0x3f)) | 0x40;
1038 else
1039 ret |= ((m_joy2->read() & 0x0f)) | 0x30;
1040
1041 if(extra2 & 0x01)
1042 ret &= ~0x0c;
1043 if(extra2 & 0x02)
1044 ret &= ~0x03;
1045
1046 if((extra2 & 0x10) && (m_towns_pad_mask & 0x04))
1047 ret &= ~0x10;
1048 if((extra2 & 0x20) && (m_towns_pad_mask & 0x08))
1049 ret &= ~0x20;
1050 }
1051 if((porttype & 0xf0) == 0x40) // 6-button joystick
1052 {
1053 extra2 = m_6b_joy2_ex->read();
1054
1055 if(m_towns_pad_mask & 0x20)
1056 ret |= 0x7f;
1057 else
1058 ret |= ((m_6b_joy2->read() & 0x0f)) | 0x70;
1059
1060 if(!(m_towns_pad_mask & 0x10))
1061 {
1062 if(extra2 & 0x01)
1063 ret &= ~0x0c;
1064 if(extra2 & 0x02)
1065 ret &= ~0x03;
1066 if((extra2 & 0x10) && (m_towns_pad_mask & 0x04))
1067 ret &= ~0x10;
1068 if((extra2 & 0x20) && (m_towns_pad_mask & 0x08))
1069 ret &= ~0x20;
1070 }
1071 if(m_towns_pad_mask & 0x20)
1072 {
1073 if(extra2 & 0x10)
1074 ret &= ~0x08;
1075 if(extra2 & 0x20)
1076 ret &= ~0x04;
1077 if(extra2 & 0x40)
1078 ret &= ~0x02;
1079 if(extra2 & 0x80)
1080 ret &= ~0x01;
1081 }
1082 }
1083 if((porttype & 0xf0) == 0x20) // mouse
1084 {
1085 switch(m_towns_mouse_output)
1086 {
1087 case MOUSE_X_HIGH:
1088 ret |= ((m_towns_mouse_x & 0xf0) >> 4);
1089 break;
1090 case MOUSE_X_LOW:
1091 ret |= (m_towns_mouse_x & 0x0f);
1092 break;
1093 case MOUSE_Y_HIGH:
1094 ret |= ((m_towns_mouse_y & 0xf0) >> 4);
1095 break;
1096 case MOUSE_Y_LOW:
1097 ret |= (m_towns_mouse_y & 0x0f);
1098 break;
1099 case MOUSE_START:
1100 case MOUSE_SYNC:
1101 break;
1102 default:
1103 if(m_towns_mouse_output < MOUSE_Y_LOW)
1104 ret |= 0x0f;
1105 }
1106
1107 // button states are always visible
1108 state = m_mouse1->read();
1109 if(!(state & 0x01))
1110 ret |= 0x10;
1111 if(!(state & 0x02))
1112 ret |= 0x20;
1113 if(m_towns_pad_mask & 0x20)
1114 ret |= 0x40;
1115 }
1116 }
1117
1118 return ret;
1119 }
1120
towns_pad_mask_w(uint8_t data)1121 void towns_state::towns_pad_mask_w(uint8_t data)
1122 {
1123 uint8_t current_x,current_y;
1124 uint32_t type = m_ctrltype->read();
1125
1126 m_towns_pad_mask = (data & 0xff);
1127 if((type & 0x0f) == 0x02) // mouse
1128 {
1129 if((m_towns_pad_mask & 0x10) != 0 && (m_prev_pad_mask & 0x10) == 0)
1130 {
1131 if(m_towns_mouse_output == MOUSE_START)
1132 {
1133 m_towns_mouse_output = MOUSE_X_HIGH;
1134 current_x = m_mouse2->read();
1135 current_y = m_mouse3->read();
1136 m_towns_mouse_x = m_prev_x - current_x;
1137 m_towns_mouse_y = m_prev_y - current_y;
1138 m_prev_x = current_x;
1139 m_prev_y = current_y;
1140 }
1141 else
1142 m_towns_mouse_output++;
1143 m_towns_mouse_timer->adjust(attotime::from_usec(600),0,attotime::zero);
1144 }
1145 if((m_towns_pad_mask & 0x10) == 0 && (m_prev_pad_mask & 0x10) != 0)
1146 {
1147 if(m_towns_mouse_output == MOUSE_START)
1148 {
1149 m_towns_mouse_output = MOUSE_SYNC;
1150 current_x = m_mouse2->read();
1151 current_y = m_mouse3->read();
1152 m_towns_mouse_x = m_prev_x - current_x;
1153 m_towns_mouse_y = m_prev_y - current_y;
1154 m_prev_x = current_x;
1155 m_prev_y = current_y;
1156 }
1157 else
1158 m_towns_mouse_output++;
1159 m_towns_mouse_timer->adjust(attotime::from_usec(600),0,attotime::zero);
1160 }
1161 m_prev_pad_mask = m_towns_pad_mask;
1162 }
1163 if((type & 0xf0) == 0x20) // mouse
1164 {
1165 if((m_towns_pad_mask & 0x20) != 0 && (m_prev_pad_mask & 0x20) == 0)
1166 {
1167 if(m_towns_mouse_output == MOUSE_START)
1168 {
1169 m_towns_mouse_output = MOUSE_X_HIGH;
1170 current_x = m_mouse2->read();
1171 current_y = m_mouse3->read();
1172 m_towns_mouse_x = m_prev_x - current_x;
1173 m_towns_mouse_y = m_prev_y - current_y;
1174 m_prev_x = current_x;
1175 m_prev_y = current_y;
1176 }
1177 else
1178 m_towns_mouse_output++;
1179 m_towns_mouse_timer->adjust(attotime::from_usec(600),0,attotime::zero);
1180 }
1181 if((m_towns_pad_mask & 0x20) == 0 && (m_prev_pad_mask & 0x20) != 0)
1182 {
1183 if(m_towns_mouse_output == MOUSE_START)
1184 {
1185 m_towns_mouse_output = MOUSE_SYNC;
1186 current_x = m_mouse2->read();
1187 current_y = m_mouse3->read();
1188 m_towns_mouse_x = m_prev_x - current_x;
1189 m_towns_mouse_y = m_prev_y - current_y;
1190 m_prev_x = current_x;
1191 m_prev_y = current_y;
1192 }
1193 else
1194 m_towns_mouse_output++;
1195 m_towns_mouse_timer->adjust(attotime::from_usec(600),0,attotime::zero);
1196 }
1197 m_prev_pad_mask = m_towns_pad_mask;
1198 }
1199 }
1200
towns_cmos_low_r(offs_t offset)1201 uint8_t towns_state::towns_cmos_low_r(offs_t offset)
1202 {
1203 if(m_towns_mainmem_enable != 0)
1204 return m_ram->pointer()[offset + 0xd8000];
1205
1206 if(m_nvram)
1207 return m_nvram[offset];
1208 else
1209 return m_nvram16[offset];
1210 }
1211
towns_cmos_low_w(offs_t offset,uint8_t data)1212 void towns_state::towns_cmos_low_w(offs_t offset, uint8_t data)
1213 {
1214 if(m_towns_mainmem_enable != 0)
1215 m_ram->pointer()[offset+0xd8000] = data;
1216 else
1217 if(m_nvram)
1218 m_nvram[offset] = data;
1219 else
1220 m_nvram16[offset] = data;
1221 }
1222
towns_cmos_r(offs_t offset)1223 uint8_t towns_state::towns_cmos_r(offs_t offset)
1224 {
1225 if(m_nvram)
1226 return m_nvram[offset];
1227 else
1228 return m_nvram16[offset];
1229 }
1230
towns_cmos_w(offs_t offset,uint8_t data)1231 void towns_state::towns_cmos_w(offs_t offset, uint8_t data)
1232 {
1233 if(m_nvram)
1234 m_nvram[offset] = data;
1235 else
1236 m_nvram16[offset] = data;
1237 }
1238
towns_update_video_banks()1239 void towns_state::towns_update_video_banks()
1240 {
1241 uint8_t* ROM = m_user->base();
1242
1243 if(m_towns_mainmem_enable != 0) // first MB is RAM
1244 {
1245 // membank(1)->set_base(m_ram->pointer()+0xc0000);
1246 // membank(2)->set_base(m_ram->pointer()+0xc8000);
1247 // membank(3)->set_base(m_ram->pointer()+0xc9000);
1248 // membank(4)->set_base(m_ram->pointer()+0xca000);
1249 // membank(5)->set_base(m_ram->pointer()+0xca000);
1250 // membank(10)->set_base(m_ram->pointer()+0xca800);
1251 m_bank_cb000_r->set_base(m_ram->pointer()+0xcb000);
1252 m_bank_cb000_w->set_base(m_ram->pointer()+0xcb000);
1253 if(m_towns_system_port & 0x02)
1254 m_bank_f8000_r->set_base(m_ram->pointer()+0xf8000);
1255 else
1256 m_bank_f8000_r->set_base(ROM+0x238000);
1257 m_bank_f8000_w->set_base(m_ram->pointer()+0xf8000);
1258 return;
1259 }
1260 else // enable I/O ports and VRAM
1261 {
1262 // membank(1)->set_base(towns_gfxvram+(towns_vram_rplane*0x8000));
1263 // membank(2)->set_base(towns_txtvram);
1264 // membank(3)->set_base(m_ram->pointer()+0xc9000);
1265 // if(towns_ankcg_enable != 0)
1266 // membank(4)->set_base(ROM+0x180000+0x3d000); // ANK CG 8x8
1267 // else
1268 // membank(4)->set_base(towns_txtvram+0x2000);
1269 // membank(5)->set_base(towns_txtvram+0x2000);
1270 // membank(10)->set_base(m_ram->pointer()+0xca800);
1271 if(m_towns_ankcg_enable != 0)
1272 m_bank_cb000_r->set_base(ROM+0x180000+0x3d800); // ANK CG 8x16
1273 else
1274 m_bank_cb000_r->set_base(m_ram->pointer()+0xcb000);
1275 m_bank_cb000_w->set_base(m_ram->pointer()+0xcb000);
1276 if(m_towns_system_port & 0x02)
1277 m_bank_f8000_r->set_base(m_ram->pointer()+0xf8000);
1278 else
1279 m_bank_f8000_r->set_base(ROM+0x238000);
1280 m_bank_f8000_w->set_base(m_ram->pointer()+0xf8000);
1281 return;
1282 }
1283 }
1284
towns_sys480_r()1285 uint8_t towns_state::towns_sys480_r()
1286 {
1287 if(m_towns_system_port & 0x02)
1288 return 0x02;
1289 else
1290 return 0x00;
1291 }
1292
towns_sys480_w(uint8_t data)1293 void towns_state::towns_sys480_w(uint8_t data)
1294 {
1295 m_towns_system_port = data;
1296 m_towns_ram_enable = data & 0x02;
1297 towns_update_video_banks();
1298 }
1299
towns_video_404_w(uint8_t data)1300 void towns_state::towns_video_404_w(uint8_t data)
1301 {
1302 m_towns_mainmem_enable = data & 0x80;
1303 towns_update_video_banks();
1304 }
1305
towns_video_404_r()1306 uint8_t towns_state::towns_video_404_r()
1307 {
1308 if(m_towns_mainmem_enable != 0)
1309 return 0x80;
1310 else
1311 return 0x00;
1312 }
1313
1314 /*
1315 * I/O ports 0x4c0-0x4cf
1316 * CD-ROM driver (custom?)
1317 *
1318 * 0x4c0 - Status port (R/W)
1319 * bit 7 - IRQ from sub MPU (reset when read)
1320 * bit 6 - IRQ from DMA end (reset when read)
1321 * bit 5 - Software transfer
1322 * bit 4 - DMA transfer
1323 * bit 1 - status read request
1324 * bit 0 - ready
1325 * Note: IRQ bits are only set high if the IRQ bit in the command byte is NOT set.
1326 *
1327 * 0x4c2 - Command port (R/W)
1328 * On read, returns status byte (4 in total?)
1329 * On write, performs specified command:
1330 * bit 7 - command type
1331 * bit 6 - IRQ
1332 * bit 5 - status
1333 * bits 4-0 - command
1334 * Type=1:
1335 * 0 = set state
1336 * 1 = set state (CDDASET)
1337 * Type=0:
1338 * 0 = Seek
1339 * 2 = Read (MODE1)
1340 * 5 = TOC Read
1341 *
1342 * 0x4c4 - Parameter port (R/W)
1343 * Inserts a byte into an array of 8 bytes used for command parameters
1344 * Writing to this port puts the byte at the front of the array, and
1345 * pushes the other parameters back.
1346 *
1347 * 0x4c6 (W/O)
1348 * bit 3 - software transfer mode
1349 * bit 4 - DMA transfer mode
1350 *
1351 */
towns_cdrom_set_irq(int line,int state)1352 void towns_state::towns_cdrom_set_irq(int line,int state)
1353 {
1354 switch(line)
1355 {
1356 case TOWNS_CD_IRQ_MPU:
1357 if(state != 0)
1358 {
1359 if(m_towns_cd.command & 0x40)
1360 {
1361 // if(m_towns_cd.mpu_irq_enable)
1362 {
1363 m_towns_cd.status |= 0x80;
1364 m_pic_slave->ir1_w(1);
1365 if(IRQ_LOG) logerror("PIC: IRQ9 (CD-ROM) set high\n");
1366 }
1367 }
1368 else
1369 m_towns_cd.status |= 0x80;
1370 }
1371 else
1372 {
1373 m_towns_cd.status &= ~0x80;
1374 m_pic_slave->ir1_w(0);
1375 if(IRQ_LOG) logerror("PIC: IRQ9 (CD-ROM) set low\n");
1376 }
1377 break;
1378 case TOWNS_CD_IRQ_DMA:
1379 if(state != 0)
1380 {
1381 if(m_towns_cd.command & 0x40)
1382 {
1383 // if(m_towns_cd.dma_irq_enable)
1384 {
1385 m_towns_cd.status |= 0x40;
1386 m_pic_slave->ir1_w(1);
1387 if(IRQ_LOG) logerror("PIC: IRQ9 (CD-ROM DMA) set high\n");
1388 }
1389 }
1390 else
1391 m_towns_cd.status |= 0x40;
1392 }
1393 else
1394 {
1395 m_towns_cd.status &= ~0x40;
1396 m_pic_slave->ir1_w(0);
1397 if(IRQ_LOG) logerror("PIC: IRQ9 (CD-ROM DMA) set low\n");
1398 }
1399 break;
1400 }
1401 }
1402
towns_cd_status_ready()1403 void towns_state::towns_cd_status_ready()
1404 {
1405 m_towns_cd.status |= 0x02; // status read request
1406 m_towns_cd.status |= 0x01; // ready
1407 m_towns_cd.cmd_status_ptr = 0;
1408 towns_cdrom_set_irq(TOWNS_CD_IRQ_MPU,1);
1409 }
1410
towns_cd_set_status(uint8_t st0,uint8_t st1,uint8_t st2,uint8_t st3)1411 void towns_state::towns_cd_set_status(uint8_t st0, uint8_t st1, uint8_t st2, uint8_t st3)
1412 {
1413 m_towns_cd.cmd_status[0] = st0;
1414 m_towns_cd.cmd_status[1] = st1;
1415 m_towns_cd.cmd_status[2] = st2;
1416 m_towns_cd.cmd_status[3] = st3;
1417 // wait a bit
1418 m_towns_status_timer->adjust(attotime::from_msec(1),0,attotime::never);
1419 }
1420
towns_cd_get_track()1421 uint8_t towns_state::towns_cd_get_track()
1422 {
1423 cdrom_image_device* cdrom = m_cdrom;
1424 uint32_t lba = m_cdda->get_audio_lba();
1425 uint8_t track;
1426
1427 for(track=1;track<99;track++)
1428 {
1429 if(cdrom_get_track_start(cdrom->get_cdrom_file(),track) > lba)
1430 break;
1431 }
1432 return track;
1433 }
1434
TIMER_CALLBACK_MEMBER(towns_state::towns_cdrom_read_byte)1435 TIMER_CALLBACK_MEMBER(towns_state::towns_cdrom_read_byte)
1436 {
1437 upd71071_device* device = (upd71071_device* )ptr;
1438 int masked;
1439 // TODO: support software transfers, for now DMA is assumed.
1440
1441 if(m_towns_cd.buffer_ptr < 0) // transfer has ended
1442 return;
1443
1444 masked = device->dmarq(param, 3); // CD-ROM controller uses DMA1 channel 3
1445 // logerror("DMARQ: param=%i ret=%i bufferptr=%i\n",param,masked,m_towns_cd.buffer_ptr);
1446 if(param != 0)
1447 {
1448 m_towns_cd.read_timer->adjust(attotime::from_hz(300000));
1449 }
1450 else
1451 {
1452 if(masked != 0) // check if the DMA channel is masked
1453 {
1454 m_towns_cd.read_timer->adjust(attotime::from_hz(300000),1);
1455 return;
1456 }
1457 if(m_towns_cd.buffer_ptr < 2048)
1458 m_towns_cd.read_timer->adjust(attotime::from_hz(300000),1);
1459 else
1460 { // end of transfer
1461 m_towns_cd.status &= ~0x10; // no longer transferring by DMA
1462 m_towns_cd.status &= ~0x20; // no longer transferring by software
1463 if(LOG_CD) logerror("DMA1: end of transfer (LBA=%08x)\n",m_towns_cd.lba_current);
1464 if(m_towns_cd.lba_current >= m_towns_cd.lba_last)
1465 {
1466 m_towns_cd.extra_status = 0;
1467 towns_cd_set_status(0x06,0x00,0x00,0x00);
1468 towns_cdrom_set_irq(TOWNS_CD_IRQ_DMA,1);
1469 m_towns_cd.buffer_ptr = -1;
1470 m_towns_cd.status |= 0x01; // ready
1471 }
1472 else
1473 {
1474 m_towns_cd.extra_status = 0;
1475 towns_cd_set_status(0x22,0x00,0x00,0x00);
1476 towns_cdrom_set_irq(TOWNS_CD_IRQ_DMA,1);
1477 cdrom_read_data(m_cdrom->get_cdrom_file(),++m_towns_cd.lba_current,m_towns_cd.buffer,CD_TRACK_MODE1);
1478 m_towns_cd.read_timer->adjust(attotime::from_hz(300000),1);
1479 m_towns_cd.buffer_ptr = -1;
1480 }
1481 }
1482 }
1483 }
1484
towns_cdrom_read_byte_software()1485 uint8_t towns_state::towns_cdrom_read_byte_software()
1486 {
1487 uint8_t ret;
1488 if(m_towns_cd.buffer_ptr < 0) // transfer has ended
1489 return 0x00;
1490
1491 ret = m_towns_cd.buffer[m_towns_cd.buffer_ptr++];
1492
1493 if(m_towns_cd.buffer_ptr >= 2048)
1494 { // end of transfer
1495 m_towns_cd.status &= ~0x10; // no longer transferring by DMA
1496 m_towns_cd.status &= ~0x20; // no longer transferring by software
1497 if(LOG_CD) logerror("CD: end of software transfer (LBA=%08x)\n",m_towns_cd.lba_current);
1498 if(m_towns_cd.lba_current >= m_towns_cd.lba_last)
1499 {
1500 m_towns_cd.extra_status = 0;
1501 towns_cd_set_status(0x06,0x00,0x00,0x00);
1502 towns_cdrom_set_irq(TOWNS_CD_IRQ_DMA,1);
1503 m_towns_cd.buffer_ptr = -1;
1504 m_towns_cd.status |= 0x01; // ready
1505 }
1506 else
1507 {
1508 cdrom_read_data(m_cdrom->get_cdrom_file(),++m_towns_cd.lba_current,m_towns_cd.buffer,CD_TRACK_MODE1);
1509 m_towns_cd.extra_status = 0;
1510 towns_cd_set_status(0x21,0x00,0x00,0x00);
1511 towns_cdrom_set_irq(TOWNS_CD_IRQ_DMA,1);
1512 m_towns_cd.status &= ~0x10;
1513 m_towns_cd.status |= 0x20;
1514 m_towns_cd.buffer_ptr = -1;
1515 }
1516 }
1517 return ret;
1518 }
1519
towns_cdrom_read(cdrom_image_device * device)1520 void towns_state::towns_cdrom_read(cdrom_image_device* device)
1521 {
1522 // MODE 1 read
1523 // load data into buffer to be sent via DMA1 channel 3
1524 // A set of status bytes is sent after each sector, and DMA is paused
1525 // so that the DMA controller than be set up again.
1526 // parameters:
1527 // 3 bytes: MSF of first sector to read
1528 // 3 bytes: MSF of last sector to read
1529 uint32_t lba1,lba2,track;
1530
1531 lba1 = m_towns_cd.parameter[7] << 16;
1532 lba1 += m_towns_cd.parameter[6] << 8;
1533 lba1 += m_towns_cd.parameter[5];
1534 lba2 = m_towns_cd.parameter[4] << 16;
1535 lba2 += m_towns_cd.parameter[3] << 8;
1536 lba2 += m_towns_cd.parameter[2];
1537 m_towns_cd.lba_current = msf_to_lbafm(lba1);
1538 m_towns_cd.lba_last = msf_to_lbafm(lba2);
1539
1540 track = cdrom_get_track(device->get_cdrom_file(),m_towns_cd.lba_current);
1541
1542 // parameter 7 = sector count?
1543 // lemmings 2 sets this to 4 but hates 4 extra sectors being read
1544 // if(m_towns_cd.parameter[1] != 0)
1545 // m_towns_cd.lba_last += m_towns_cd.parameter[1];
1546
1547 if(LOG_CD) logerror("CD: Mode 1 read from LBA next:%i last:%i track:%i\n",m_towns_cd.lba_current,m_towns_cd.lba_last,track);
1548
1549 if(m_towns_cd.lba_current > m_towns_cd.lba_last)
1550 {
1551 m_towns_cd.extra_status = 0;
1552 towns_cd_set_status(0x01,0x00,0x00,0x00);
1553 }
1554 else
1555 {
1556 cdrom_read_data(device->get_cdrom_file(),m_towns_cd.lba_current,m_towns_cd.buffer,CD_TRACK_MODE1);
1557 if(m_towns_cd.software_tx)
1558 {
1559 m_towns_cd.status &= ~0x10; // not a DMA transfer
1560 m_towns_cd.status |= 0x20; // software transfer
1561 }
1562 else
1563 {
1564 m_towns_cd.status |= 0x10; // DMA transfer begin
1565 m_towns_cd.status &= ~0x20; // not a software transfer
1566 }
1567 // m_towns_cd.buffer_ptr = 0;
1568 // m_towns_cd.read_timer->adjust(attotime::from_hz(300000),1);
1569 if(m_towns_cd.command & 0x20)
1570 {
1571 m_towns_cd.extra_status = 2;
1572 towns_cd_set_status(0x00,0x00,0x00,0x00);
1573 }
1574 else
1575 {
1576 m_towns_cd.extra_status = 0;
1577 if(m_towns_cd.software_tx)
1578 towns_cd_set_status(0x21,0x00,0x00,0x00);
1579 else
1580 towns_cd_set_status(0x22,0x00,0x00,0x00);
1581 }
1582 }
1583 }
1584
towns_cdrom_play_cdda(cdrom_image_device * device)1585 void towns_state::towns_cdrom_play_cdda(cdrom_image_device* device)
1586 {
1587 // PLAY AUDIO
1588 // Plays CD-DA audio from the specified MSF
1589 // Parameters:
1590 // 3 bytes: starting MSF of audio to play
1591 // 3 bytes: ending MSF of audio to play (can span multiple tracks)
1592 uint32_t lba1,lba2;
1593
1594 lba1 = m_towns_cd.parameter[7] << 16;
1595 lba1 += m_towns_cd.parameter[6] << 8;
1596 lba1 += m_towns_cd.parameter[5];
1597 lba2 = m_towns_cd.parameter[4] << 16;
1598 lba2 += m_towns_cd.parameter[3] << 8;
1599 lba2 += m_towns_cd.parameter[2];
1600 m_towns_cd.cdda_current = msf_to_lbafm(lba1);
1601 m_towns_cd.cdda_length = msf_to_lbafm(lba2) - m_towns_cd.cdda_current;
1602
1603 m_cdda->set_cdrom(device->get_cdrom_file());
1604 m_cdda->start_audio(m_towns_cd.cdda_current,m_towns_cd.cdda_length);
1605 if(LOG_CD) logerror("CD: CD-DA start from LBA:%i length:%i\n",m_towns_cd.cdda_current,m_towns_cd.cdda_length);
1606 if(m_towns_cd.command & 0x20)
1607 {
1608 m_towns_cd.extra_status = 1;
1609 towns_cd_set_status(0x00,0x03,0x00,0x00);
1610 }
1611 }
1612
towns_delay_cdda(cdrom_image_device * dev)1613 void towns_state::towns_delay_cdda(cdrom_image_device* dev)
1614 {
1615 towns_cdrom_play_cdda(dev);
1616 }
1617
towns_cdrom_execute_command(cdrom_image_device * device)1618 void towns_state::towns_cdrom_execute_command(cdrom_image_device* device)
1619 {
1620 towns_cdrom_set_irq(TOWNS_CD_IRQ_MPU,0); // TODO: this isn't sufficiently tested
1621 if((device->get_cdrom_file() == nullptr) && (m_towns_cd.command != 0xa0))
1622 { // No CD in drive
1623 if(m_towns_cd.command & 0x20)
1624 {
1625 m_towns_cd.extra_status = 0;
1626 towns_cd_set_status(0x10,0x00,0x00,0x00);
1627 }
1628 }
1629 else
1630 {
1631 m_towns_cd.status &= ~0x02;
1632 switch(m_towns_cd.command & 0x9f)
1633 {
1634 case 0x00: // Seek
1635 if(m_towns_cd.command & 0x20)
1636 {
1637 m_towns_cd.extra_status = 1;
1638 towns_cd_set_status(0x00,0x00,0x00,0x00);
1639 }
1640 if(LOG_CD) logerror("CD: Command 0x00: SEEK\n");
1641 break;
1642 case 0x01: // unknown
1643 if(m_towns_cd.command & 0x20)
1644 {
1645 m_towns_cd.extra_status = 0;
1646 towns_cd_set_status(0x00,0xff,0xff,0xff);
1647 }
1648 if(LOG_CD) logerror("CD: Command 0x01: unknown\n");
1649 break;
1650 case 0x02: // Read (MODE1)
1651 if(LOG_CD) logerror("CD: Command 0x02: READ MODE1\n");
1652 towns_cdrom_read(device);
1653 break;
1654 case 0x04: // Play Audio Track
1655 if(LOG_CD) logerror("CD: Command 0x04: PLAY CD-DA\n");
1656 m_towns_cdda_timer->set_ptr(device);
1657 m_towns_cdda_timer->adjust(attotime::from_msec(1),0,attotime::never);
1658 break;
1659 case 0x05: // Read TOC
1660 if(LOG_CD) logerror("CD: Command 0x05: READ TOC\n");
1661 if(m_towns_cd.command & 0x20)
1662 {
1663 m_towns_cd.extra_status = 1;
1664 towns_cd_set_status(0x00,0x00,0x00,0x00);
1665 }
1666 else
1667 {
1668 m_towns_cd.extra_status = 2;
1669 towns_cd_set_status(0x16,0x00,0xa0,0x00);
1670 }
1671 break;
1672 case 0x06: // Read CD-DA state?
1673 if(LOG_CD) logerror("CD: Command 0x06: READ CD-DA STATE\n");
1674 m_towns_cd.extra_status = 1;
1675 towns_cd_set_status(0x00,0x00,0x00,0x00);
1676 break;
1677 case 0x1f: // unknown
1678 if(LOG_CD) logerror("CD: Command 0x1f: unknown\n");
1679 m_towns_cd.extra_status = 0;
1680 towns_cd_set_status(0x00,0x00,0x00,0x00);
1681 break;
1682 case 0x80: // set state
1683 if(LOG_CD) logerror("CD: Command 0x80: set state\n");
1684 if(m_towns_cd.command & 0x20)
1685 {
1686 m_towns_cd.extra_status = 0;
1687 if(m_cdda->audio_active() && !m_cdda->audio_paused())
1688 towns_cd_set_status(0x00,0x03,0x00,0x00);
1689 else
1690 towns_cd_set_status(0x00,0x01,0x00,0x00);
1691
1692 }
1693 break;
1694 case 0x81: // set state (CDDASET)
1695 if(m_towns_cd.command & 0x20)
1696 {
1697 m_towns_cd.extra_status = 0;
1698 towns_cd_set_status(0x00,0x00,0x00,0x00);
1699 }
1700 if(LOG_CD) logerror("CD: Command 0x81: set state (CDDASET)\n");
1701 break;
1702 case 0x84: // Stop CD audio track -- generates no status output?
1703 if(m_towns_cd.command & 0x20)
1704 {
1705 m_towns_cd.extra_status = 1;
1706 towns_cd_set_status(0x00,0x00,0x00,0x00);
1707 }
1708 m_cdda->pause_audio(1);
1709 if(LOG_CD) logerror("CD: Command 0x84: STOP CD-DA\n");
1710 break;
1711 case 0x85: // Stop CD audio track (difference from 0x84?)
1712 if(m_towns_cd.command & 0x20)
1713 {
1714 m_towns_cd.extra_status = 1;
1715 towns_cd_set_status(0x00,0x00,0x00,0x00);
1716 }
1717 m_cdda->pause_audio(1);
1718 if(LOG_CD) logerror("CD: Command 0x85: STOP CD-DA\n");
1719 break;
1720 case 0x87: // Resume CD-DA playback
1721 if(m_towns_cd.command & 0x20)
1722 {
1723 m_towns_cd.extra_status = 1;
1724 towns_cd_set_status(0x00,0x03,0x00,0x00);
1725 }
1726 m_cdda->pause_audio(0);
1727 if(LOG_CD) logerror("CD: Command 0x87: RESUME CD-DA\n");
1728 break;
1729 default:
1730 m_towns_cd.extra_status = 0;
1731 towns_cd_set_status(0x10,0x00,0x00,0x00);
1732 logerror("CD: Unknown or unimplemented command %02x\n",m_towns_cd.command);
1733 }
1734 }
1735 }
1736
towns_cdrom_dma_r()1737 uint16_t towns_state::towns_cdrom_dma_r()
1738 {
1739 if(m_towns_cd.buffer_ptr >= 2048)
1740 return 0x00;
1741 return m_towns_cd.buffer[m_towns_cd.buffer_ptr++];
1742 }
1743
towns_cdrom_r(offs_t offset)1744 uint8_t towns_state::towns_cdrom_r(offs_t offset)
1745 {
1746 uint32_t addr = 0;
1747 uint8_t ret = 0;
1748
1749 ret = m_towns_cd.cmd_status[m_towns_cd.cmd_status_ptr];
1750
1751 switch(offset)
1752 {
1753 case 0x00: // status
1754 //if(LOG_CD) logerror("CD: status read, returning %02x\n",towns_cd.status);
1755 return m_towns_cd.status;
1756 case 0x01: // command status
1757 if(m_towns_cd.cmd_status_ptr >= 3)
1758 {
1759 m_towns_cd.status &= ~2;
1760 // check for more status bytes
1761 if(m_towns_cd.extra_status != 0)
1762 {
1763 switch(m_towns_cd.command & 0x9f)
1764 {
1765 case 0x00: // seek
1766 towns_cd_set_status(0x04,0x00,0x00,0x00);
1767 m_towns_cd.extra_status = 0;
1768 break;
1769 case 0x02: // read
1770 if(m_towns_cd.extra_status == 2)
1771 towns_cd_set_status(0x22,0x00,0x00,0x00);
1772 m_towns_cd.extra_status = 0;
1773 break;
1774 case 0x04: // play cdda
1775 towns_cd_set_status(0x07,0x00,0x00,0x00);
1776 m_towns_cd.status &= ~2;
1777 m_towns_cd.extra_status = 0;
1778 break;
1779 case 0x05: // read toc
1780 switch(m_towns_cd.extra_status)
1781 {
1782 case 1:
1783 towns_cd_set_status(0x16,0x00,0xa0,0x00);
1784 m_towns_cd.extra_status++;
1785 break;
1786 case 2: // st1 = first track number (BCD)
1787 towns_cd_set_status(0x17,0x01,0x00,0x00);
1788 m_towns_cd.extra_status++;
1789 break;
1790 case 3:
1791 towns_cd_set_status(0x16,0x00,0xa1,0x00);
1792 m_towns_cd.extra_status++;
1793 break;
1794 case 4: // st1 = last track number (BCD)
1795 towns_cd_set_status(0x17,
1796 byte_to_bcd(cdrom_get_last_track(m_cdrom->get_cdrom_file())),
1797 0x00,0x00);
1798 m_towns_cd.extra_status++;
1799 break;
1800 case 5:
1801 towns_cd_set_status(0x16, 0x00, 0xa2, 0x00);
1802 m_towns_cd.extra_status++;
1803 break;
1804 case 6: // st1/2/3 = address of track 0xaa? (BCD)
1805 addr = cdrom_get_track_start(m_cdrom->get_cdrom_file(),0xaa);
1806 addr = lba_to_msf(addr + 150);
1807 towns_cd_set_status(0x17,
1808 (addr & 0xff0000) >> 16,(addr & 0x00ff00) >> 8,addr & 0x0000ff);
1809 m_towns_cd.extra_status++;
1810 break;
1811 default:
1812 if(m_towns_cd.extra_status & 0x01)
1813 {
1814 towns_cd_set_status(0x16,
1815 ((cdrom_get_adr_control(m_cdrom->get_cdrom_file(),(m_towns_cd.extra_status/2)-3) & 0x0f) << 4)
1816 | ((cdrom_get_adr_control(m_cdrom->get_cdrom_file(),(m_towns_cd.extra_status/2)-3) & 0xf0) >> 4),
1817 byte_to_bcd((m_towns_cd.extra_status/2)-2),0x00);
1818 m_towns_cd.extra_status++;
1819 }
1820 else
1821 {
1822 int track = (m_towns_cd.extra_status/2)-4;
1823 addr = cdrom_get_track_start(m_cdrom->get_cdrom_file(),track);
1824 addr += cdrom_get_toc(m_cdrom->get_cdrom_file())->tracks[track].pregap;
1825 addr = lba_to_msf(addr + 150);
1826 towns_cd_set_status(0x17,
1827 (addr & 0xff0000) >> 16,(addr & 0x00ff00) >> 8,addr & 0x0000ff);
1828 if(track >= cdrom_get_last_track(m_cdrom->get_cdrom_file()))
1829 {
1830 m_towns_cd.extra_status = 0;
1831 }
1832 else
1833 m_towns_cd.extra_status++;
1834 }
1835 break;
1836 }
1837 break;
1838 case 0x06: // read CD-DA state
1839 switch(m_towns_cd.extra_status)
1840 {
1841 case 1: // st2 = track number
1842 towns_cd_set_status(0x18,
1843 0x00,towns_cd_get_track(),0x00);
1844 m_towns_cd.extra_status++;
1845 break;
1846 case 2: // st0/1/2 = MSF from beginning of current track
1847 addr = m_cdda->get_audio_lba();
1848 addr = lba_to_msf(addr - m_towns_cd.cdda_current);
1849 towns_cd_set_status(0x19,
1850 (addr & 0xff0000) >> 16,(addr & 0x00ff00) >> 8,addr & 0x0000ff);
1851 m_towns_cd.extra_status++;
1852 break;
1853 case 3: // st1/2 = current MSF
1854 addr = m_cdda->get_audio_lba();
1855 addr = lba_to_msf(addr); // this data is incorrect, but will do until exact meaning is found
1856 towns_cd_set_status(0x19,
1857 0x00,(addr & 0xff0000) >> 16,(addr & 0x00ff00) >> 8);
1858 m_towns_cd.extra_status++;
1859 break;
1860 case 4:
1861 addr = m_cdda->get_audio_lba();
1862 addr = lba_to_msf(addr); // this data is incorrect, but will do until exact meaning is found
1863 towns_cd_set_status(0x20,
1864 addr & 0x0000ff,0x00,0x00);
1865 m_towns_cd.extra_status = 0;
1866 break;
1867 }
1868 break;
1869 case 0x84:
1870 towns_cd_set_status(0x11,0x00,0x00,0x00);
1871 m_towns_cd.extra_status = 0;
1872 break;
1873 case 0x85:
1874 towns_cd_set_status(0x12,0x00,0x00,0x00);
1875 m_towns_cd.extra_status = 0;
1876 break;
1877 }
1878 }
1879 else
1880 m_towns_cd.status &= ~0x02;
1881 }
1882 if(LOG_CD) logerror("CD: reading command status port (%i), returning %02x\n",m_towns_cd.cmd_status_ptr,ret);
1883 m_towns_cd.cmd_status_ptr++;
1884 if(m_towns_cd.cmd_status_ptr > 3)
1885 {
1886 m_towns_cd.cmd_status_ptr = 0;
1887 /* if(m_towns_cd.extra_status != 0)
1888 {
1889 towns_cdrom_set_irq(machine(),TOWNS_CD_IRQ_MPU,1);
1890 m_towns_cd.status |= 0x02;
1891 }*/
1892 }
1893 return ret;
1894 case 0x02: // data transfer (used in software transfers)
1895 if(m_towns_cd.software_tx)
1896 {
1897 return towns_cdrom_read_byte_software();
1898 }
1899 default:
1900 return 0x00;
1901 }
1902 }
1903
towns_cdrom_w(offs_t offset,uint8_t data)1904 void towns_state::towns_cdrom_w(offs_t offset, uint8_t data)
1905 {
1906 int x;
1907 switch(offset)
1908 {
1909 case 0x00: // status
1910 if(data & 0x80)
1911 towns_cdrom_set_irq(TOWNS_CD_IRQ_MPU,0);
1912 if(data & 0x40)
1913 towns_cdrom_set_irq(TOWNS_CD_IRQ_DMA,0);
1914 if(data & 0x04)
1915 logerror("CD: sub MPU reset\n");
1916 m_towns_cd.mpu_irq_enable = data & 0x02;
1917 m_towns_cd.dma_irq_enable = data & 0x01;
1918 if(LOG_CD) logerror("CD: status write %02x\n",data);
1919 break;
1920 case 0x01: // command
1921 m_towns_cd.command = data;
1922 towns_cdrom_execute_command(m_cdrom);
1923 if(LOG_CD) logerror("CD: command %02x sent\n",data);
1924 if(LOG_CD) logerror("CD: parameters: %02x %02x %02x %02x %02x %02x %02x %02x\n",
1925 m_towns_cd.parameter[7],m_towns_cd.parameter[6],m_towns_cd.parameter[5],
1926 m_towns_cd.parameter[4],m_towns_cd.parameter[3],m_towns_cd.parameter[2],
1927 m_towns_cd.parameter[1],m_towns_cd.parameter[0]);
1928 break;
1929 case 0x02: // parameter
1930 for(x=7;x>0;x--)
1931 m_towns_cd.parameter[x] = m_towns_cd.parameter[x-1];
1932 m_towns_cd.parameter[0] = data;
1933 if(LOG_CD) logerror("CD: parameter %02x added\n",data);
1934 break;
1935 case 0x03:
1936 if(data & 0x08) // software transfer
1937 {
1938 m_towns_cd.status &= ~0x10; // no DMA transfer
1939 m_towns_cd.status |= 0x20;
1940 m_towns_cd.software_tx = true;
1941 m_towns_cd.buffer_ptr = 0;
1942 }
1943 if(data & 0x10)
1944 {
1945 m_towns_cd.status |= 0x10; // DMA transfer begin
1946 m_towns_cd.status &= ~0x20; // not a software transfer
1947 m_towns_cd.software_tx = false;
1948 if(m_towns_cd.buffer_ptr < 0)
1949 {
1950 m_towns_cd.buffer_ptr = 0;
1951 m_towns_cd.read_timer->adjust(attotime::from_hz(300000),1);
1952 }
1953 }
1954 if(LOG_CD) logerror("CD: transfer mode write %02x\n",data);
1955 break;
1956 default:
1957 if(LOG_CD) logerror("CD: write %02x to port %02x\n",data,offset*2);
1958 }
1959 }
1960
1961
1962 /* CMOS RTC
1963 * 0x70: Data port
1964 * 0x80: Register select
1965 */
towns_rtc_r()1966 uint8_t towns_state::towns_rtc_r()
1967 {
1968 return (m_rtc_busy ? 0 : 0x80) | m_rtc_d;
1969 }
1970
towns_rtc_w(uint8_t data)1971 void towns_state::towns_rtc_w(uint8_t data)
1972 {
1973 m_rtc->d0_w(BIT(data, 0));
1974 m_rtc->d1_w(BIT(data, 1));
1975 m_rtc->d2_w(BIT(data, 2));
1976 m_rtc->d3_w(BIT(data, 3));
1977 }
1978
towns_rtc_select_w(uint8_t data)1979 void towns_state::towns_rtc_select_w(uint8_t data)
1980 {
1981 m_rtc->cs1_w(BIT(data, 7));
1982 m_rtc->cs2_w(BIT(data, 7));
1983 m_rtc->read_w(BIT(data, 2));
1984 m_rtc->write_w(BIT(data, 1));
1985 m_rtc->address_write_w(BIT(data, 0));
1986 }
1987
WRITE_LINE_MEMBER(towns_state::rtc_d0_w)1988 WRITE_LINE_MEMBER(towns_state::rtc_d0_w)
1989 {
1990 m_rtc_d = (m_rtc_d & ~1) | (state ? 1 : 0);
1991 }
1992
WRITE_LINE_MEMBER(towns_state::rtc_d1_w)1993 WRITE_LINE_MEMBER(towns_state::rtc_d1_w)
1994 {
1995 m_rtc_d = (m_rtc_d & ~2) | (state ? 2 : 0);
1996 }
1997
WRITE_LINE_MEMBER(towns_state::rtc_d2_w)1998 WRITE_LINE_MEMBER(towns_state::rtc_d2_w)
1999 {
2000 m_rtc_d = (m_rtc_d & ~4) | (state ? 4 : 0);
2001 }
2002
WRITE_LINE_MEMBER(towns_state::rtc_d3_w)2003 WRITE_LINE_MEMBER(towns_state::rtc_d3_w)
2004 {
2005 m_rtc_d = (m_rtc_d & ~8) | (state ? 8 : 0);
2006 }
2007
WRITE_LINE_MEMBER(towns_state::rtc_busy_w)2008 WRITE_LINE_MEMBER(towns_state::rtc_busy_w)
2009 {
2010 // active low output
2011 m_rtc_busy = !state;
2012 }
2013
2014 // SCSI controller - I/O ports 0xc30 and 0xc32
WRITE_LINE_MEMBER(towns_state::towns_scsi_irq)2015 WRITE_LINE_MEMBER(towns_state::towns_scsi_irq)
2016 {
2017 m_pic_slave->ir0_w(state);
2018 if(IRQ_LOG)
2019 logerror("PIC: IRQ8 (SCSI) set to %i\n",state);
2020 }
2021
WRITE_LINE_MEMBER(towns_state::towns_scsi_drq)2022 WRITE_LINE_MEMBER(towns_state::towns_scsi_drq)
2023 {
2024 m_dma[0]->dmarq(state, 1); // SCSI HDs use channel 1
2025 }
2026
2027
2028 // Volume ports - I/O ports 0x4e0-0x4e3
2029 // 0x4e0 = input volume level
2030 // 0x4e1 = input channel select
2031 // 0 = Line in, left channel
2032 // 1 = Line in, right channel
2033 // 0x4e2 = output volume level
2034 // 0x4e3 = output channel select
2035 // 0 = CD-DA left channel
2036 // 1 = CD-DA right channel
2037 // 2 = MIC
2038 // 3 = MODEM
towns_volume_r(offs_t offset)2039 uint8_t towns_state::towns_volume_r(offs_t offset)
2040 {
2041 switch(offset)
2042 {
2043 case 2:
2044 return(m_towns_volume[m_towns_volume_select & 3]);
2045 case 3:
2046 return m_towns_volume_select;
2047 default:
2048 return 0;
2049 }
2050 }
2051
cdda_db_to_gain(float db)2052 void towns_state::cdda_db_to_gain(float db)
2053 {
2054 float gain = powf(10, db / 20.0f);
2055 int port = m_towns_volume_select & 3;
2056 if(port > 1)
2057 return;
2058 if(db > 0)
2059 gain = 0;
2060 m_cdda->set_output_gain(port, gain);
2061 }
2062
towns_volume_w(offs_t offset,uint8_t data)2063 void towns_state::towns_volume_w(offs_t offset, uint8_t data)
2064 {
2065 switch(offset)
2066 {
2067 case 2:
2068 m_towns_volume[m_towns_volume_select & 3] = data;
2069 if(!(m_towns_volume_select & 4) || (m_towns_volume_select & 0x18))
2070 return;
2071 cdda_db_to_gain((~data & 0x3f) * -0.5f);
2072 break;
2073 case 3: // select channel
2074 m_towns_volume_select = data;
2075 if(!(data & 4))
2076 cdda_db_to_gain(1);
2077 else if(data & 8)
2078 cdda_db_to_gain(0);
2079 else if(data & 0x10)
2080 cdda_db_to_gain(-32.0f);
2081 break;
2082 default:
2083 logerror("SND: Volume port %i set to %02x\n",offset,data);
2084 }
2085 }
2086
unksnd_r()2087 uint8_t towns_state::unksnd_r()
2088 {
2089 return 0;
2090 }
2091
2092 // some unknown ports...
towns_41ff_r()2093 uint8_t towns_state::towns_41ff_r()
2094 {
2095 logerror("I/O port 0x41ff read\n");
2096 return 0x01;
2097 }
2098
2099 // YM3438 interrupt (IRQ 13)
WRITE_LINE_MEMBER(towns_state::towns_fm_irq)2100 WRITE_LINE_MEMBER(towns_state::towns_fm_irq)
2101 {
2102 if(state)
2103 {
2104 m_towns_fm_irq_flag = 1;
2105 m_pic_slave->ir5_w(1);
2106 if(IRQ_LOG) logerror("PIC: IRQ13 (FM) set high\n");
2107 }
2108 else
2109 {
2110 m_towns_fm_irq_flag = 0;
2111 if(m_towns_pcm_irq_flag == 0)
2112 {
2113 m_pic_slave->ir5_w(0);
2114 if(IRQ_LOG) logerror("PIC: IRQ13 (FM) set low\n");
2115 }
2116 }
2117 }
2118
2119 // PCM interrupt (IRQ 13)
RF5C68_SAMPLE_END_CB_MEMBER(towns_state::towns_pcm_irq)2120 RF5C68_SAMPLE_END_CB_MEMBER(towns_state::towns_pcm_irq)
2121 {
2122 if (m_towns_pcm_channel_mask & (1 << channel))
2123 {
2124 m_towns_pcm_irq_flag = 1;
2125 m_towns_pcm_channel_flag |= (1 << channel);
2126 m_pic_slave->ir5_w(1);
2127 if(IRQ_LOG) logerror("PIC: IRQ13 (PCM) set high (channel %i)\n",channel);
2128 }
2129 }
2130
WRITE_LINE_MEMBER(towns_state::towns_pit_out0_changed)2131 WRITE_LINE_MEMBER(towns_state::towns_pit_out0_changed)
2132 {
2133 m_pit_out0 = state;
2134
2135 if(m_towns_timer_mask & 0x01)
2136 {
2137 m_timer0 = state;
2138 if(IRQ_LOG) logerror("PIC: IRQ0 (PIT Timer ch0) set to %i\n",state);
2139 }
2140 else
2141 m_timer0 = 0;
2142
2143 m_pic_master->ir0_w(m_timer0 || m_timer1);
2144 }
2145
WRITE_LINE_MEMBER(towns_state::towns_pit_out1_changed)2146 WRITE_LINE_MEMBER(towns_state::towns_pit_out1_changed)
2147 {
2148 m_pit_out1 = state;
2149
2150 if(m_towns_timer_mask & 0x02)
2151 {
2152 m_timer1 = state;
2153 if(IRQ_LOG) logerror("PIC: IRQ0 (PIT Timer ch1) set to %i\n",state);
2154 }
2155 else
2156 m_timer1 = 0;
2157
2158 m_pic_master->ir0_w(m_timer0 || m_timer1);
2159 }
2160
WRITE_LINE_MEMBER(towns_state::pit_out2_changed)2161 WRITE_LINE_MEMBER( towns_state::pit_out2_changed )
2162 {
2163 m_pit_out2 = state ? 1 : 0;
2164 m_speaker->level_w(speaker_get_spk());
2165 }
2166
WRITE_LINE_MEMBER(towns_state::pit2_out1_changed)2167 WRITE_LINE_MEMBER( towns_state::pit2_out1_changed )
2168 {
2169 m_i8251->write_rxc(state);
2170 m_i8251->write_txc(state);
2171 }
2172
towns_serial_w(offs_t offset,uint8_t data)2173 void towns_state::towns_serial_w(offs_t offset, uint8_t data)
2174 {
2175 switch(offset)
2176 {
2177 case 0:
2178 case 1:
2179 m_i8251->write(offset, data);
2180 break;
2181 case 4:
2182 m_serial_irq_enable = data;
2183 break;
2184 default:
2185 logerror("Invalid or unimplemented serial port write [offset=%02x, data=%02x]\n",offset,data);
2186 }
2187 }
2188
towns_serial_r(offs_t offset)2189 uint8_t towns_state::towns_serial_r(offs_t offset)
2190 {
2191 switch(offset)
2192 {
2193 case 0:
2194 case 1:
2195 return m_i8251->read(offset);
2196 case 3:
2197 return m_serial_irq_source;
2198 default:
2199 logerror("Invalid or unimplemented serial port read [offset=%02x]\n",offset);
2200 return 0xff;
2201 }
2202 }
2203
WRITE_LINE_MEMBER(towns_state::towns_serial_irq)2204 WRITE_LINE_MEMBER( towns_state::towns_serial_irq )
2205 {
2206 m_serial_irq_source = state ? 0x01 : 0x00;
2207 m_pic_master->ir2_w(state);
2208 popmessage("Serial IRQ state: %i\n",state);
2209 }
2210
WRITE_LINE_MEMBER(towns_state::towns_rxrdy_irq)2211 WRITE_LINE_MEMBER( towns_state::towns_rxrdy_irq )
2212 {
2213 if(m_serial_irq_enable & RXRDY_IRQ_ENABLE)
2214 towns_serial_irq(state);
2215 }
2216
WRITE_LINE_MEMBER(towns_state::towns_txrdy_irq)2217 WRITE_LINE_MEMBER( towns_state::towns_txrdy_irq )
2218 {
2219 if(m_serial_irq_enable & TXRDY_IRQ_ENABLE)
2220 towns_serial_irq(state);
2221 }
2222
WRITE_LINE_MEMBER(towns_state::towns_syndet_irq)2223 WRITE_LINE_MEMBER( towns_state::towns_syndet_irq )
2224 {
2225 if(m_serial_irq_enable & SYNDET_IRQ_ENABLE)
2226 towns_serial_irq(state);
2227 }
2228
2229
towns_mem(address_map & map)2230 void towns_state::towns_mem(address_map &map)
2231 {
2232 // memory map based on FM-Towns/Bochs (Bochs modified to emulate the FM-Towns)
2233 // may not be (and probably is not) correct
2234 map(0x00000000, 0x000bffff).ram();
2235 map(0x000c0000, 0x000c7fff).rw(FUNC(towns_state::towns_gfx_r), FUNC(towns_state::towns_gfx_w));
2236 map(0x000c8000, 0x000cafff).rw(FUNC(towns_state::towns_spriteram_low_r), FUNC(towns_state::towns_spriteram_low_w));
2237 map(0x000cb000, 0x000cbfff).bankr("bank_cb000_r").bankw("bank_cb000_w");
2238 map(0x000cc000, 0x000cff7f).ram();
2239 map(0x000cff80, 0x000cffff).rw(FUNC(towns_state::towns_video_cff80_mem_r), FUNC(towns_state::towns_video_cff80_mem_w));
2240 map(0x000d0000, 0x000d7fff).ram();
2241 map(0x000d8000, 0x000d9fff).rw(FUNC(towns_state::towns_cmos_low_r), FUNC(towns_state::towns_cmos_low_w)).share("nvram"); // CMOS? RAM
2242 map(0x000da000, 0x000effff).ram(); //READWRITE(SMH_BANK(11),SMH_BANK(11))
2243 map(0x000f0000, 0x000f7fff).ram(); //READWRITE(SMH_BANK(12),SMH_BANK(12))
2244 map(0x000f8000, 0x000fffff).bankr("bank_f8000_r").bankw("bank_f8000_w");
2245 map(0x80000000, 0x8007ffff).rw(FUNC(towns_state::towns_gfx_high_r), FUNC(towns_state::towns_gfx_high_w)).mirror(0x80000); // VRAM
2246 map(0x80100000, 0x8017ffff).rw(FUNC(towns_state::towns_gfx_packed_r), FUNC(towns_state::towns_gfx_packed_w)).mirror(0x80000); // VRAM
2247 map(0x81000000, 0x8101ffff).rw(FUNC(towns_state::towns_spriteram_r), FUNC(towns_state::towns_spriteram_w)); // Sprite RAM
2248 map(0xc0000000, 0xc0ffffff).rw(m_icmemcard, FUNC(fmt_icmem_device::static_mem_read), FUNC(fmt_icmem_device::static_mem_write));
2249 map(0xc1000000, 0xc1ffffff).rw(m_icmemcard, FUNC(fmt_icmem_device::mem_read), FUNC(fmt_icmem_device::mem_write));
2250 map(0xc2000000, 0xc207ffff).rom().region("user", 0x000000); // OS ROM
2251 map(0xc2080000, 0xc20fffff).rom().region("user", 0x100000); // DIC ROM
2252 map(0xc2100000, 0xc213ffff).rom().region("user", 0x180000); // FONT ROM
2253 map(0xc2140000, 0xc2141fff).rw(FUNC(towns_state::towns_cmos_r), FUNC(towns_state::towns_cmos_w)); // CMOS (mirror?)
2254 map(0xc2180000, 0xc21fffff).rom().region("user", 0x080000); // F20 ROM
2255 map(0xc2200000, 0xc2200fff).rw("pcm", FUNC(rf5c68_device::rf5c68_mem_r), FUNC(rf5c68_device::rf5c68_mem_w)); // WAVE RAM
2256 map(0xfffc0000, 0xffffffff).rom().region("user", 0x200000); // SYSTEM ROM
2257 }
2258
marty_mem(address_map & map)2259 void towns_state::marty_mem(address_map &map)
2260 {
2261 map(0x00000000, 0x000bffff).ram();
2262 map(0x000c0000, 0x000c7fff).rw(FUNC(towns_state::towns_gfx_r), FUNC(towns_state::towns_gfx_w));
2263 map(0x000c8000, 0x000cafff).rw(FUNC(towns_state::towns_spriteram_low_r), FUNC(towns_state::towns_spriteram_low_w));
2264 map(0x000cb000, 0x000cbfff).bankr("bank_cb000_r").bankw("bank_cb000_w");
2265 map(0x000cc000, 0x000cff7f).ram();
2266 map(0x000cff80, 0x000cffff).rw(FUNC(towns_state::towns_video_cff80_mem_r), FUNC(towns_state::towns_video_cff80_mem_w));
2267 map(0x000d0000, 0x000d7fff).ram();
2268 map(0x000d8000, 0x000d9fff).rw(FUNC(towns_state::towns_cmos_low_r), FUNC(towns_state::towns_cmos_low_w)).share("nvram16"); // CMOS? RAM
2269 map(0x000da000, 0x000effff).ram(); //READWRITE(SMH_BANK(11),SMH_BANK(11))
2270 map(0x000f0000, 0x000f7fff).ram(); //READWRITE(SMH_BANK(12),SMH_BANK(12))
2271 map(0x000f8000, 0x000fffff).bankr("bank_f8000_r").bankw("bank_f8000_w");
2272 map(0x00600000, 0x0067ffff).rom().region("user", 0x000000); // OS
2273 map(0x00680000, 0x0087ffff).rom().region("user", 0x280000); // EX ROM
2274 map(0x00a00000, 0x00a7ffff).rw(FUNC(towns_state::towns_gfx_high_r), FUNC(towns_state::towns_gfx_high_w)).mirror(0x180000); // VRAM
2275 map(0x00b00000, 0x00b7ffff).rw(FUNC(towns_state::towns_gfx_packed_r), FUNC(towns_state::towns_gfx_packed_w)).mirror(0x80000); // VRAM
2276 map(0x00c00000, 0x00c1ffff).rw(FUNC(towns_state::towns_spriteram_r), FUNC(towns_state::towns_spriteram_w)); // Sprite RAM
2277 map(0x00d00000, 0x00dfffff).rw(m_icmemcard, FUNC(fmt_icmem_device::mem_read), FUNC(fmt_icmem_device::mem_write));
2278 map(0x00e80000, 0x00efffff).rom().region("user", 0x100000); // DIC ROM
2279 map(0x00f00000, 0x00f7ffff).rom().region("user", 0x180000); // FONT
2280 map(0x00f80000, 0x00f80fff).rw("pcm", FUNC(rf5c68_device::rf5c68_mem_r), FUNC(rf5c68_device::rf5c68_mem_w)); // WAVE RAM
2281 map(0x00fc0000, 0x00ffffff).rom().region("user", 0x200000); // SYSTEM ROM
2282 }
2283
ux_mem(address_map & map)2284 void towns_state::ux_mem(address_map &map)
2285 {
2286 map(0x00000000, 0x000bffff).ram();
2287 map(0x000c0000, 0x000c7fff).rw(FUNC(towns_state::towns_gfx_r), FUNC(towns_state::towns_gfx_w));
2288 map(0x000c8000, 0x000cafff).rw(FUNC(towns_state::towns_spriteram_low_r), FUNC(towns_state::towns_spriteram_low_w));
2289 map(0x000cb000, 0x000cbfff).bankr("bank_cb000_r").bankw("bank_cb000_w");
2290 map(0x000cc000, 0x000cff7f).ram();
2291 map(0x000cff80, 0x000cffff).rw(FUNC(towns_state::towns_video_cff80_mem_r), FUNC(towns_state::towns_video_cff80_mem_w));
2292 map(0x000d0000, 0x000d7fff).ram();
2293 map(0x000d8000, 0x000d9fff).rw(FUNC(towns_state::towns_cmos_low_r), FUNC(towns_state::towns_cmos_low_w)).share("nvram16"); // CMOS? RAM
2294 map(0x000da000, 0x000effff).ram(); //READWRITE(SMH_BANK(11),SMH_BANK(11))
2295 map(0x000f0000, 0x000f7fff).ram(); //READWRITE(SMH_BANK(12),SMH_BANK(12))
2296 map(0x000f8000, 0x000fffff).bankr("bank_f8000_r").bankw("bank_f8000_w");
2297 // map(0x00680000, 0x0087ffff).rom().region("user",0x280000); // EX ROM
2298 map(0x00a00000, 0x00a7ffff).rw(FUNC(towns_state::towns_gfx_high_r), FUNC(towns_state::towns_gfx_high_w)).mirror(0x180000); // VRAM
2299 map(0x00b00000, 0x00b7ffff).rw(FUNC(towns_state::towns_gfx_packed_r), FUNC(towns_state::towns_gfx_packed_w)).mirror(0x80000); // VRAM
2300 map(0x00c00000, 0x00c1ffff).rw(FUNC(towns_state::towns_spriteram_r), FUNC(towns_state::towns_spriteram_w)); // Sprite RAM
2301 map(0x00d00000, 0x00dfffff).rw(m_icmemcard, FUNC(fmt_icmem_device::mem_read), FUNC(fmt_icmem_device::mem_write));
2302 map(0x00e00000, 0x00e7ffff).rom().region("user", 0x000000); // OS
2303 map(0x00e80000, 0x00efffff).rom().region("user", 0x100000); // DIC ROM
2304 map(0x00f00000, 0x00f7ffff).rom().region("user", 0x180000); // FONT
2305 map(0x00f80000, 0x00f80fff).rw("pcm", FUNC(rf5c68_device::rf5c68_mem_r), FUNC(rf5c68_device::rf5c68_mem_w)); // WAVE RAM
2306 map(0x00fc0000, 0x00ffffff).rom().region("user", 0x200000); // SYSTEM ROM
2307 }
2308
towns_io(address_map & map)2309 void towns_state::towns_io(address_map &map)
2310 {
2311 // I/O ports derived from FM Towns/Bochs, these are specific to the FM Towns
2312 // System ports
2313 map.unmap_value_high();
2314 map(0x0000, 0x0003).rw(m_pic_master, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask32(0x00ff00ff);
2315 map(0x0010, 0x0013).rw(m_pic_slave, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask32(0x00ff00ff);
2316 map(0x0020, 0x0033).rw(FUNC(towns_state::towns_system_r), FUNC(towns_state::towns_system_w));
2317 map(0x0040, 0x0047).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask32(0x00ff00ff);
2318 map(0x0050, 0x0057).rw("pit2", FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask32(0x00ff00ff);
2319 map(0x0060, 0x0060).rw(FUNC(towns_state::towns_port60_r), FUNC(towns_state::towns_port60_w));
2320 map(0x0068, 0x006b).rw(FUNC(towns_state::towns_intervaltimer2_r), FUNC(towns_state::towns_intervaltimer2_w));
2321 map(0x006c, 0x006c).rw(FUNC(towns_state::towns_sys6c_r), FUNC(towns_state::towns_sys6c_w));
2322 // 0x0070/0x0080 - CMOS RTC
2323 map(0x0070, 0x0070).rw(FUNC(towns_state::towns_rtc_r), FUNC(towns_state::towns_rtc_w));
2324 map(0x0080, 0x0080).w(FUNC(towns_state::towns_rtc_select_w));
2325 // DMA controllers (uPD71071)
2326 map(0x00a0, 0x00af).rw(FUNC(towns_state::towns_dma_r<0>), FUNC(towns_state::towns_dma_w<0>));
2327 map(0x00b0, 0x00bf).rw(FUNC(towns_state::towns_dma_r<1>), FUNC(towns_state::towns_dma_w<1>));
2328 // Floppy controller
2329 map(0x0200, 0x020f).rw(FUNC(towns_state::towns_floppy_r), FUNC(towns_state::towns_floppy_w));
2330 // CRTC / Video
2331 map(0x0400, 0x0400).r(FUNC(towns_state::towns_video_unknown_r)); // R/O (0x400)
2332 map(0x0404, 0x0404).rw(FUNC(towns_state::towns_video_404_r), FUNC(towns_state::towns_video_404_w)); // R/W (0x404)
2333 map(0x0440, 0x045f).rw(FUNC(towns_state::towns_video_440_r), FUNC(towns_state::towns_video_440_w));
2334 // System port
2335 map(0x0480, 0x0480).rw(FUNC(towns_state::towns_sys480_r), FUNC(towns_state::towns_sys480_w)); // R/W (0x480)
2336 // IC Memory Card
2337 map(0x048a, 0x048a).r(m_icmemcard, FUNC(fmt_icmem_device::status_r));
2338 map(0x0490, 0x0491).rw(m_icmemcard, FUNC(fmt_icmem_device::bank_r), FUNC(fmt_icmem_device::bank_w));
2339 // CD-ROM
2340 map(0x04c0, 0x04cf).rw(FUNC(towns_state::towns_cdrom_r), FUNC(towns_state::towns_cdrom_w)).umask32(0x00ff00ff);
2341 // Joystick / Mouse ports
2342 map(0x04d0, 0x04d3).r(FUNC(towns_state::towns_padport_r)).umask32(0x00ff00ff);
2343 map(0x04d6, 0x04d6).w(FUNC(towns_state::towns_pad_mask_w));
2344 // Sound (YM3438 [FM], RF5c68 [PCM])
2345 map(0x04d8, 0x04df).rw("fm", FUNC(ym3438_device::read), FUNC(ym3438_device::write)).umask32(0x00ff00ff);
2346 map(0x04e0, 0x04e3).rw(FUNC(towns_state::towns_volume_r), FUNC(towns_state::towns_volume_w)); // R/W -- volume ports
2347 map(0x04e4, 0x04e7).r(FUNC(towns_state::unksnd_r));
2348 map(0x04e8, 0x04ef).rw(FUNC(towns_state::towns_sound_ctrl_r), FUNC(towns_state::towns_sound_ctrl_w));
2349 map(0x04f0, 0x04fb).w("pcm", FUNC(rf5c68_device::rf5c68_w));
2350 // CRTC / Video
2351 map(0x05c8, 0x05cb).rw(FUNC(towns_state::towns_video_5c8_r), FUNC(towns_state::towns_video_5c8_w));
2352 // System ports
2353 map(0x05e8, 0x05ef).rw(FUNC(towns_state::towns_sys5e8_r), FUNC(towns_state::towns_sys5e8_w)).umask32(0x00ff00ff);
2354 // Keyboard (8042 MCU)
2355 map(0x0600, 0x0607).rw(FUNC(towns_state::towns_keyboard_r), FUNC(towns_state::towns_keyboard_w)).umask32(0x00ff00ff);
2356 // RS-232C interface
2357 map(0x0a00, 0x0a0b).rw(FUNC(towns_state::towns_serial_r), FUNC(towns_state::towns_serial_w)).umask32(0x00ff00ff);
2358 // CMOS
2359 map(0x3000, 0x4fff).rw(FUNC(towns_state::towns_cmos_r), FUNC(towns_state::towns_cmos_w)).umask32(0x00ff00ff);
2360 // Something (MS-DOS wants this 0x41ff to be 1)
2361 //map(0x41fc,0x41ff).r(FUNC(towns_state::towns_41ff_r)).umask32(0xff000000);
2362 // CRTC / Video (again)
2363 map(0xfd90, 0xfda3).rw(FUNC(towns_state::towns_video_fd90_r), FUNC(towns_state::towns_video_fd90_w));
2364 map(0xff80, 0xffff).rw(FUNC(towns_state::towns_video_cff80_r), FUNC(towns_state::towns_video_cff80_w));
2365 }
2366
towns_1g_io(address_map & map)2367 void towns_state::towns_1g_io(address_map &map)
2368 {
2369 // For the first generation FM Towns with a SCSI card slot
2370 towns_io(map);
2371 map(0x0c30, 0x0c37).rw(m_scsi_slot, FUNC(fmt_scsi_slot_device::read), FUNC(fmt_scsi_slot_device::write)).umask32(0x00ff00ff);
2372 }
2373
towns2_io(address_map & map)2374 void towns_state::towns2_io(address_map &map)
2375 {
2376 // For FM Towns II models with integrated SCSI controller
2377 towns_io(map);
2378 map(0x0c30, 0x0c37).rw(m_scsi, FUNC(fmscsi_device::fmscsi_r), FUNC(fmscsi_device::fmscsi_w)).umask32(0x00ff00ff);
2379 }
2380
towns16_io(address_map & map)2381 void towns_state::towns16_io(address_map &map)
2382 { // for the 386SX based systems
2383 // System ports
2384 map.unmap_value_high();
2385 map(0x0000, 0x0003).rw(m_pic_master, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
2386 map(0x0010, 0x0013).rw(m_pic_slave, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
2387 map(0x0020, 0x0033).rw(FUNC(towns_state::towns_system_r), FUNC(towns_state::towns_system_w));
2388 map(0x0040, 0x0047).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
2389 map(0x0050, 0x0057).rw("pit2", FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
2390 map(0x0060, 0x0060).rw(FUNC(towns_state::towns_port60_r), FUNC(towns_state::towns_port60_w));
2391 map(0x0068, 0x006b).rw(FUNC(towns_state::towns_intervaltimer2_r), FUNC(towns_state::towns_intervaltimer2_w));
2392 map(0x006c, 0x006c).rw(FUNC(towns_state::towns_sys6c_r), FUNC(towns_state::towns_sys6c_w));
2393 // 0x0070/0x0080 - CMOS RTC
2394 map(0x0070, 0x0070).rw(FUNC(towns_state::towns_rtc_r), FUNC(towns_state::towns_rtc_w));
2395 map(0x0080, 0x0080).w(FUNC(towns_state::towns_rtc_select_w));
2396 // DMA controllers (uPD71071)
2397 map(0x00a0, 0x00af).rw(FUNC(towns_state::towns_dma_r<0>), FUNC(towns_state::towns_dma_w<0>));
2398 map(0x00b0, 0x00bf).rw(FUNC(towns_state::towns_dma_r<1>), FUNC(towns_state::towns_dma_w<1>));
2399 // Floppy controller
2400 map(0x0200, 0x020f).rw(FUNC(towns_state::towns_floppy_r), FUNC(towns_state::towns_floppy_w));
2401 // CRTC / Video
2402 map(0x0400, 0x0400).r(FUNC(towns_state::towns_video_unknown_r)); // R/O (0x400)
2403 map(0x0404, 0x0407).rw(FUNC(towns_state::towns_video_404_r), FUNC(towns_state::towns_video_404_w)); // R/W (0x404)
2404 map(0x0440, 0x045f).rw(FUNC(towns_state::towns_video_440_r), FUNC(towns_state::towns_video_440_w));
2405 // System port
2406 map(0x0480, 0x0480).rw(FUNC(towns_state::towns_sys480_r), FUNC(towns_state::towns_sys480_w)); // R/W (0x480)
2407 // IC Memory Card
2408 map(0x048a, 0x048a).r(m_icmemcard, FUNC(fmt_icmem_device::status_r));
2409 map(0x0490, 0x0491).rw(m_icmemcard, FUNC(fmt_icmem_device::bank_r), FUNC(fmt_icmem_device::bank_w));
2410 // CD-ROM
2411 map(0x04c0, 0x04cf).rw(FUNC(towns_state::towns_cdrom_r), FUNC(towns_state::towns_cdrom_w)).umask16(0x00ff);
2412 // Joystick / Mouse ports
2413 map(0x04d0, 0x04d3).r(FUNC(towns_state::towns_padport_r)).umask16(0x00ff);
2414 map(0x04d6, 0x04d6).w(FUNC(towns_state::towns_pad_mask_w));
2415 // Sound (YM3438 [FM], RF5c68 [PCM])
2416 map(0x04d8, 0x04df).rw("fm", FUNC(ym3438_device::read), FUNC(ym3438_device::write)).umask16(0x00ff);
2417 map(0x04e0, 0x04e3).rw(FUNC(towns_state::towns_volume_r), FUNC(towns_state::towns_volume_w)); // R/W -- volume ports
2418 map(0x04e4, 0x04e7).r(FUNC(towns_state::unksnd_r));
2419 map(0x04e8, 0x04ef).rw(FUNC(towns_state::towns_sound_ctrl_r), FUNC(towns_state::towns_sound_ctrl_w));
2420 map(0x04f0, 0x04fb).w("pcm", FUNC(rf5c68_device::rf5c68_w));
2421 // CRTC / Video
2422 map(0x05c8, 0x05cb).rw(FUNC(towns_state::towns_video_5c8_r), FUNC(towns_state::towns_video_5c8_w));
2423 // System ports
2424 map(0x05e8, 0x05ef).rw(FUNC(towns_state::towns_sys5e8_r), FUNC(towns_state::towns_sys5e8_w)).umask16(0x00ff);
2425 // Keyboard (8042 MCU)
2426 map(0x0600, 0x0607).rw(FUNC(towns_state::towns_keyboard_r), FUNC(towns_state::towns_keyboard_w)).umask16(0x00ff);
2427 // RS-232C interface
2428 map(0x0a00, 0x0a0b).rw(FUNC(towns_state::towns_serial_r), FUNC(towns_state::towns_serial_w)).umask16(0x00ff);
2429 // CMOS
2430 map(0x3000, 0x4fff).rw(FUNC(towns_state::towns_cmos_r), FUNC(towns_state::towns_cmos_w)).umask16(0x00ff);
2431 // Something (MS-DOS wants this 0x41ff to be 1)
2432 //map(0x41fc,0x41ff).r(FUNC(towns_state::towns_41ff_r)).umask32(0xff000000);
2433 // CRTC / Video (again)
2434 map(0xfd90, 0xfda3).rw(FUNC(towns_state::towns_video_fd90_r), FUNC(towns_state::towns_video_fd90_w));
2435 map(0xff80, 0xffff).rw(FUNC(towns_state::towns_video_cff80_r), FUNC(towns_state::towns_video_cff80_w));
2436 }
2437
townsux_io(address_map & map)2438 void towns_state::townsux_io(address_map &map)
2439 {
2440 // For FM Towns II UX
2441 towns16_io(map);
2442 map(0x0c30, 0x0c37).rw(m_scsi, FUNC(fmscsi_device::fmscsi_r), FUNC(fmscsi_device::fmscsi_w)).umask16(0x00ff);
2443 }
2444
pcm_mem(address_map & map)2445 void towns_state::pcm_mem(address_map &map)
2446 {
2447 map.unmap_value_high();
2448 map(0x0000, 0xffff).ram();
2449 }
2450
2451 /* Input ports */
2452 static INPUT_PORTS_START( towns )
2453 PORT_START("ctrltype")
2454 PORT_CONFNAME(0x0f, 0x01, "Joystick port 1")
2455 PORT_CONFSETTING(0x00, "Nothing")
2456 PORT_CONFSETTING(0x01, "Standard 2-button joystick")
2457 PORT_CONFSETTING(0x02, "Mouse")
2458 PORT_CONFSETTING(0x04, "6-button joystick")
2459 PORT_CONFNAME(0xf0, 0x20, "Joystick port 2")
2460 PORT_CONFSETTING(0x00, "Nothing")
2461 PORT_CONFSETTING(0x10, "Standard 2-button joystick")
2462 PORT_CONFSETTING(0x20, "Mouse")
2463 PORT_CONFSETTING(0x40, "6-button joystick")
2464
2465 // Keyboard
2466 PORT_START( "key1" ) // scancodes 0x00-0x1f
2467 PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_UNUSED)
PORT_CODE(KEYCODE_TILDE)2468 PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ESC") PORT_CODE(KEYCODE_TILDE) PORT_CHAR(27)
2469 PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1 ! \xE3\x81\xAC") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
2470 PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2 \x22 \xE3\x81\xB5") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR(34)
2471 PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3 # \xE3\x81\x82 \xE3\x81\x81") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
2472 PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4 $ \xE3\x81\x86 \xE3\x81\x85") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
2473 PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5 % \xE3\x81\x88 \xE3\x81\x87") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
2474 PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6 & \xE3\x81\x8A \xE3\x81\x89") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
2475 PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7 ´ \xE3\x82\x84 \xE3\x82\x83") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR(39)
2476 PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8 ( \xE3\x82\x86 \xE3\x82\x85") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
2477 PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9 ) \xE3\x82\x88 \xE3\x82\x87") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
2478 PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0 \xE3\x82\x8F \xE3\x82\x92") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
2479 PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("- = \xE3\x81\xBB") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
2480 PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("^ \xE2\x80\xBE \xE3\x81\xB8") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('^')
2481 PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xEF\xBF\xA5 | -") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(165) PORT_CHAR('|')
2482 PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
2483 PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9)
2484 PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Q \xE3\x81\x9F") PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
2485 PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("W \xE3\x81\xA6") PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
2486 PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E \xE3\x81\x84") PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
2487 PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("R \xE3\x81\x99") PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
2488 PORT_BIT(0x00200000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("T \xE3\x81\x8B") PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
2489 PORT_BIT(0x00400000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Y \xE3\x82\x93") PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
2490 PORT_BIT(0x00800000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("U \xE3\x81\xAA") PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
2491 PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("I \xE3\x81\xAB") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
2492 PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("O \xE3\x82\x89") PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
2493 PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("P \xE3\x81\x9B") PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
2494 PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("@ ` \xE2\x80\x9D") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') PORT_CHAR('`')
2495 PORT_BIT(0x10000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("[ { \xE3\x82\x9C \xE3\x80\x8C") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('[') PORT_CHAR('{')
2496 PORT_BIT(0x20000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
2497 PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A \xE3\x81\xA1") PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
2498 PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("S \xE3\x81\xA8") PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
2499
2500 PORT_START( "key2" ) // scancodes 0x20-0x3f
2501 PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D \xE3\x81\x97") PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
2502 PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F \xE3\x81\xAF") PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
2503 PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("G \xE3\x81\x8D") PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
2504 PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("H \xE3\x81\x8F") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
2505 PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("J \xE3\x81\xBE") PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
2506 PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("K \xE3\x81\xAE") PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
2507 PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("L \xE3\x82\x8A") PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
2508 PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("; + \xE3\x82\x8C") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
2509 PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(": * \xE3\x81\x91") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*')
2510 PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("] } \xE3\x82\x80 \xE3\x80\x8D") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(']') PORT_CHAR('}')
2511 PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Z \xE3\x81\xA4 \xE3\x81\xA3") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
2512 PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("X \xE3\x81\x95") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
2513 PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C \xE3\x81\x9D") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
2514 PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("V \xE3\x81\xB2") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
2515 PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B \xE3\x81\x93") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
2516 PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("N \xE3\x81\xBF") PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
2517 PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("M \xE3\x82\x82") PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
2518 PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(", < \xE3\x81\xAD \xE3\x80\x81") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
2519 PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(". > \xE3\x82\x8B \xE3\x80\x82") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
2520 PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("/ ? \xE3\x82\x81 \xE3\x83\xBB") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
2521 PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\x22 _ \xE3\x82\x8D") PORT_CHAR('"') PORT_CHAR('_')
2522 PORT_BIT(0x00200000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
2523 PORT_BIT(0x00400000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey *") PORT_CODE(KEYCODE_ASTERISK)
2524 PORT_BIT(0x00800000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey /") PORT_CODE(KEYCODE_SLASH_PAD)
2525 PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey +") PORT_CODE(KEYCODE_PLUS_PAD)
2526 PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey -") PORT_CODE(KEYCODE_MINUS_PAD)
2527 PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 7") PORT_CODE(KEYCODE_7_PAD)
2528 PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 8") PORT_CODE(KEYCODE_8_PAD)
2529 PORT_BIT(0x10000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 9") PORT_CODE(KEYCODE_9_PAD)
2530 PORT_BIT(0x20000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey =")
2531 PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 4") PORT_CODE(KEYCODE_4_PAD)
2532 PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 5") PORT_CODE(KEYCODE_5_PAD)
2533
2534 PORT_START("key3") // scancodes 0x40-0x5f
2535 PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 6") PORT_CODE(KEYCODE_6_PAD)
2536 PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_UNUSED)
2537 PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 1") PORT_CODE(KEYCODE_1_PAD)
2538 PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 2") PORT_CODE(KEYCODE_2_PAD)
2539 PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 3") PORT_CODE(KEYCODE_3_PAD)
2540 PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey Enter") PORT_CODE(KEYCODE_ENTER_PAD)
2541 PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 0") PORT_CODE(KEYCODE_0_PAD)
2542 PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey .") PORT_CODE(KEYCODE_DEL_PAD)
2543 PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE6\x8C\xBF\xE5\x85\xA5 (Insert) / DUP") PORT_CODE(KEYCODE_INSERT)
2544 PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_UNUSED)
2545 PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tenkey 000") PORT_CODE(KEYCODE_000_PAD)
2546 PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE5\x89\x8A\xE9\x99\xA4 (Delete) / EL") PORT_CODE(KEYCODE_DEL)
2547 PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_UNUSED)
2548 PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
2549 PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME)
2550 PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
2551 PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
2552 PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
2553 PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL)
2554 PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
2555 PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_UNUSED)
2556 PORT_BIT(0x00200000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("CAP") PORT_CODE(KEYCODE_CAPSLOCK)
2557 PORT_BIT(0x00400000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE3\x81\xB2\xE3\x82\x89\xE3\x81\x8C\xE3\x81\xAA (Hiragana) / \xE3\x83\xAD\xE3\x83\xBC\xE3\x83\x9E\xE5\xAD\x97 (Romaji)") PORT_CODE(KEYCODE_RCONTROL)
2558 PORT_BIT(0x00800000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE7\x84\xA1\xE5\xA4\x89\xE6\x8F\x9B (Non-conversion)")
2559 PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE5\xA4\x89\xE6\x8F\x9B (Conversion)")
2560 PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE3\x81\x8B\xE3\x81\xAA\xE6\xBC\xA2\xE5\xAD\x97 (Kana Kanji)") PORT_CODE(KEYCODE_RALT)
2561 PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE3\x82\xAB\xE3\x82\xBF\xE3\x82\xAB\xE3\x83\x8A (Katakana)") PORT_CODE(KEYCODE_RWIN)
2562 PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF12") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12))
2563 PORT_BIT(0x10000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ALT") PORT_CODE(KEYCODE_LALT)
2564 PORT_BIT(0x20000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
2565 PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
2566 PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
2567
2568 PORT_START("key4")
2569 PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
2570 PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
2571 PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
2572 PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
2573 PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
2574 PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF9") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9))
2575 PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF10") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10))
2576 PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_UNUSED)
2577 PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_UNUSED)
2578 PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF11") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11))
2579 PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_UNUSED)
2580 PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE6\xBC\xA2\xE5\xAD\x97\xE8\xBE\x9E\xE6\x9B\xB8 (Kanji Dictionary)")
2581 PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE5\x8D\x98\xE8\xAA\x9E\xE6\x8A\xB9\xE6\xB6\x88 (Word Deletion)")
2582 PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE5\x8D\x98\xE8\xAA\x9E\xE7\x99\xBB\xE9\x8C\xB2 (Word Registration)")
2583 PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE5\x89\x8D\xE8\xA1\x8C (Previous)")
2584 PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_UNUSED)
2585 PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE6\xAC\xA1\xE8\xA1\x8C (Next)")
2586 PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE5\x8D\x8A\xE8\xA7\x92\xEF\xBC\x8F\xE5\x85\xA8\xE8\xA7\x92 (Half-width / Full-width)")
2587 PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE5\x8F\x96\xE6\xB6\x88 (Cancel)")
2588 PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xE5\xAE\x9F\xE8\xA1\x8C (Execute)")
2589 PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF13")
2590 PORT_BIT(0x00200000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF14")
2591 PORT_BIT(0x00400000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF15")
2592 PORT_BIT(0x00800000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF16")
2593 PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF17")
2594 PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF18")
2595 PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF19")
2596 PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF20")
2597 PORT_BIT(0x10000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("BREAK")
2598 PORT_BIT(0x20000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("COPY")
2599
2600 PORT_START("joy1")
2601 PORT_BIT(0x00000001,IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2602 PORT_BIT(0x00000002,IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2603 PORT_BIT(0x00000004,IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2604 PORT_BIT(0x00000008,IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2605 PORT_BIT(0x00000010,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2606 PORT_BIT(0x00000020,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2607 PORT_BIT(0x00000040,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2608 PORT_BIT(0x00000080,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2609
2610 PORT_START("joy1_ex")
2611 PORT_BIT(0x00000001,IP_ACTIVE_HIGH, IPT_START) PORT_NAME("1P Run") PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2612 PORT_BIT(0x00000002,IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("1P Select") PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2613 PORT_BIT(0x00000004,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2614 PORT_BIT(0x00000008,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2615 PORT_BIT(0x00000010,IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01) PORT_NAME("P1 A")
2616 PORT_BIT(0x00000020,IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01) PORT_NAME("P1 B")
2617 PORT_BIT(0x00000040,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2618 PORT_BIT(0x00000080,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
2619
2620 PORT_START("joy2")
2621 PORT_BIT(0x00000001,IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2622 PORT_BIT(0x00000002,IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2623 PORT_BIT(0x00000004,IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2624 PORT_BIT(0x00000008,IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2625 PORT_BIT(0x00000010,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2626 PORT_BIT(0x00000020,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2627 PORT_BIT(0x00000040,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2628 PORT_BIT(0x00000080,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2629
2630 PORT_START("joy2_ex")
2631 PORT_BIT(0x00000001,IP_ACTIVE_HIGH, IPT_START) PORT_NAME("2P Run") PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2632 PORT_BIT(0x00000002,IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("2P Select") PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2633 PORT_BIT(0x00000004,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2634 PORT_BIT(0x00000008,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2635 PORT_BIT(0x00000010,IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10) PORT_NAME("P2 A")
2636 PORT_BIT(0x00000020,IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10) PORT_NAME("P2 B")
2637 PORT_BIT(0x00000040,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2638 PORT_BIT(0x00000080,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
2639
2640 PORT_START("6b_joy1")
2641 PORT_BIT(0x00000001,IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2642 PORT_BIT(0x00000002,IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2643 PORT_BIT(0x00000004,IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2644 PORT_BIT(0x00000008,IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2645 PORT_BIT(0x00000010,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2646 PORT_BIT(0x00000020,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2647 PORT_BIT(0x00000040,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2648 PORT_BIT(0x00000080,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2649
2650 PORT_START("6b_joy1_ex")
2651 PORT_BIT(0x00000001,IP_ACTIVE_HIGH, IPT_START) PORT_NAME("1P Run") PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2652 PORT_BIT(0x00000002,IP_ACTIVE_HIGH, IPT_BUTTON7) PORT_NAME("1P Select") PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2653 PORT_BIT(0x00000004,IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2654 PORT_BIT(0x00000008,IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2655 PORT_BIT(0x00000010,IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2656 PORT_BIT(0x00000020,IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2657 PORT_BIT(0x00000040,IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2658 PORT_BIT(0x00000080,IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x04)
2659
2660 PORT_START("6b_joy2")
2661 PORT_BIT(0x00000001,IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2662 PORT_BIT(0x00000002,IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2663 PORT_BIT(0x00000004,IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2664 PORT_BIT(0x00000008,IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2665 PORT_BIT(0x00000010,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2666 PORT_BIT(0x00000020,IP_ACTIVE_LOW, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2667 PORT_BIT(0x00000040,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2668 PORT_BIT(0x00000080,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2669
2670 PORT_START("6b_joy2_ex")
2671 PORT_BIT(0x00000001,IP_ACTIVE_HIGH, IPT_START) PORT_NAME("2P Run") PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2672 PORT_BIT(0x00000002,IP_ACTIVE_HIGH, IPT_BUTTON7) PORT_NAME("2P Select") PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2673 PORT_BIT(0x00000004,IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2674 PORT_BIT(0x00000008,IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2675 PORT_BIT(0x00000010,IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2676 PORT_BIT(0x00000020,IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2677 PORT_BIT(0x00000040,IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2678 PORT_BIT(0x00000080,IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x40)
2679
2680 PORT_START("mouse1") // buttons
2681 PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Left mouse button") PORT_CODE(MOUSECODE_BUTTON1)
2682 PORT_BIT( 0x00000002, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Right mouse button") PORT_CODE(MOUSECODE_BUTTON2)
2683
2684 PORT_START("mouse2") // X-axis
2685 PORT_BIT( 0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1)
2686
2687 PORT_START("mouse3") // Y-axis
2688 PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1)
2689
2690 INPUT_PORTS_END
2691
2692 static INPUT_PORTS_START( marty )
2693 PORT_INCLUDE(towns)
2694 // Consoles don't have keyboards...
2695 PORT_MODIFY("key1")
2696 PORT_BIT(0xffffffff,IP_ACTIVE_LOW,IPT_UNUSED)
2697 PORT_MODIFY("key2")
2698 PORT_BIT(0xffffffff,IP_ACTIVE_LOW,IPT_UNUSED)
2699 PORT_MODIFY("key3")
2700 PORT_BIT(0xffffffff,IP_ACTIVE_LOW,IPT_UNUSED)
2701 PORT_MODIFY("key4")
2702 PORT_BIT(0xffffffff,IP_ACTIVE_LOW,IPT_UNUSED)
2703 INPUT_PORTS_END
2704
2705 void towns_state::driver_start()
2706 {
2707 m_towns_vram = std::make_unique<uint32_t[]>(0x20000);
2708 m_towns_gfxvram = std::make_unique<uint8_t[]>(0x80000);
2709 m_towns_txtvram = std::make_unique<uint8_t[]>(0x20000);
2710 memset(m_towns_txtvram.get(), 0, sizeof(uint8_t)*0x20000);
2711 //towns_sprram = std::make_unique<uint8_t[]>(0x20000);
2712 m_towns_serial_rom = std::make_unique<uint8_t[]>(256/8);
2713 init_serial_rom();
2714 m_towns_kb_timer = timer_alloc(TIMER_KEYBOARD);
2715 m_towns_mouse_timer = timer_alloc(TIMER_MOUSE);
2716 m_towns_wait_timer = timer_alloc(TIMER_WAIT);
2717 m_towns_freerun_counter = timer_alloc(TIMER_FREERUN);
2718 m_towns_intervaltimer2 = timer_alloc(TIMER_INTERVAL2);
2719 m_towns_status_timer = timer_alloc(TIMER_CDSTATUS);
2720 m_towns_cdda_timer = timer_alloc(TIMER_CDDA);
2721
2722 memset(&m_video,0,sizeof(struct towns_video_controller));
2723 memset(&m_towns_cd,0,sizeof(struct towns_cdrom_controller));
2724 m_towns_cd.status = 0x01; // CDROM controller ready
2725 m_towns_cd.buffer_ptr = -1;
2726 m_towns_cd.read_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(towns_state::towns_cdrom_read_byte),this), (void*)m_dma_1.target());
2727
2728 save_pointer(m_video.towns_crtc_reg,"CRTC registers",32);
2729 save_pointer(m_video.towns_video_reg,"Video registers",2);
2730
2731 if (m_ram->size() > 0x100000)
2732 m_maincpu->space(AS_PROGRAM).install_ram(0x100000,m_ram->size()-1,nullptr);
2733 }
2734
driver_start()2735 void marty_state::driver_start()
2736 {
2737 towns_state::driver_start();
2738 if(m_towns_machine_id == 0x0101) // default if no serial ROM present
2739 m_towns_machine_id = 0x034a;
2740 }
2741
machine_start()2742 void towns_state::machine_start()
2743 {
2744 if (m_flop[0]->get_device())
2745 m_flop[0]->get_device()->set_rpm(360);
2746 if (m_flop[1]->get_device())
2747 m_flop[1]->get_device()->set_rpm(360);
2748 }
2749
machine_reset()2750 void towns_state::machine_reset()
2751 {
2752 m_ftimer = 0x00;
2753 m_freerun_timer = 0x00;
2754 m_nmi_mask = 0x00;
2755 m_compat_mode = 0x00;
2756 m_towns_ankcg_enable = 0x00;
2757 m_towns_mainmem_enable = 0x00;
2758 m_towns_system_port = 0x00;
2759 m_towns_ram_enable = 0x00;
2760 towns_update_video_banks();
2761 m_towns_kb_status = 0x18;
2762 m_towns_kb_irq1_enable = 0;
2763 m_towns_pad_mask = 0x7f;
2764 m_towns_mouse_output = MOUSE_START;
2765 m_towns_volume_select = 0;
2766 m_intervaltimer2_period = 0;
2767 m_intervaltimer2_timeout_flag = 0;
2768 m_intervaltimer2_timeout_flag2 = 0;
2769 m_intervaltimer2_irqmask = 1; // masked
2770 m_towns_kb_timer->adjust(attotime::zero,0,attotime::from_msec(10));
2771 m_towns_freerun_counter->adjust(attotime::zero,0,attotime::from_usec(1));
2772 m_serial_irq_source = 0;
2773 m_rtc_d = 0;
2774 m_rtc_busy = false;
2775 m_vram_mask_addr = 0;
2776 m_towns_pcm_channel_flag = 0;
2777 m_towns_pcm_channel_mask = 0xff;
2778 m_towns_pcm_irq_flag = 0;
2779 m_towns_fm_irq_flag = 0;
2780 }
2781
get_slave_ack(offs_t offset)2782 uint8_t towns_state::get_slave_ack(offs_t offset)
2783 {
2784 if (offset==7) { // IRQ = 7
2785 return m_pic_slave->acknowledge();
2786 }
2787 return 0x00;
2788 }
2789
FLOPPY_FORMATS_MEMBER(towns_state::floppy_formats)2790 FLOPPY_FORMATS_MEMBER( towns_state::floppy_formats )
2791 FLOPPY_FMTOWNS_FORMAT
2792 FLOPPY_FORMATS_END
2793
2794 static void towns_floppies(device_slot_interface &device)
2795 {
2796 device.option_add("35hd", FLOPPY_35_HD);
2797 }
2798
2799 static const gfx_layout fnt_chars_16x16 =
2800 {
2801 16,16,
2802 RGN_FRAC(1,1),
2803 1,
2804 { 0 },
2805 { STEP16(0,1) },
2806 { STEP16(0,16) },
2807 16*16
2808 };
2809
2810 static const gfx_layout text_chars =
2811 {
2812 8,16,
2813 RGN_FRAC(1,1),
2814 1,
2815 { 0 },
2816 { STEP8(0,1), },
2817 { STEP16(0,1) },
2818 8*16
2819 };
2820
2821 static GFXDECODE_START( gfx_towns )
2822 GFXDECODE_ENTRY( "user", 0x180000 + 0x3d800, text_chars, 0, 16 )
2823 GFXDECODE_ENTRY( "user", 0x180000, fnt_chars_16x16, 0, 16 )
2824 GFXDECODE_END
2825
towns_base(machine_config & config)2826 void towns_state::towns_base(machine_config &config)
2827 {
2828 /* basic machine hardware */
2829 I386(config, m_maincpu, 16000000);
2830 m_maincpu->set_addrmap(AS_PROGRAM, &towns_state::towns_mem);
2831 m_maincpu->set_addrmap(AS_IO, &towns_state::towns_1g_io);
2832 m_maincpu->set_vblank_int("screen", FUNC(towns_state::towns_vsync_irq));
2833 m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
2834 //MCFG_MACHINE_RESET_OVERRIDE(towns_state,towns)
2835
2836 /* video hardware */
2837 SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
2838 m_screen->set_refresh_hz(60);
2839 m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
2840 m_screen->set_size(768,512);
2841 m_screen->set_visarea(0, 768-1, 0, 512-1);
2842 m_screen->set_screen_update(FUNC(towns_state::screen_update));
2843
2844 GFXDECODE(config, "gfxdecode", m_palette16[0], gfx_towns);
2845 PALETTE(config, m_palette).set_entries(256);
2846 PALETTE(config, m_palette16[0]).set_entries(16);
2847 PALETTE(config, m_palette16[1]).set_entries(16);
2848
2849 /* sound hardware */
2850 SPEAKER(config, "lspeaker").front_left();
2851 SPEAKER(config, "rspeaker").front_right();
2852
2853 ym3438_device &fm(YM3438(config, "fm", 16000000 / 2)); // actual clock speed unknown
2854 fm.irq_handler().set(FUNC(towns_state::towns_fm_irq));
2855 fm.add_route(0, "lspeaker", 1.00);
2856 fm.add_route(1, "rspeaker", 1.00);
2857
2858 /*
2859 // Later model uses YMF276 for FM
2860 ymf276_device &fm(YMF276(config, "fm", 16000000 / 2)); // actual clock speed unknown
2861 fm.irq_handler().set(FUNC(towns_state::towns_fm_irq));
2862 fm.add_route(0, "lspeaker", 1.00);
2863 fm.add_route(1, "rspeaker", 1.00);
2864 */
2865
2866 rf5c68_device &pcm(RF5C68(config, "pcm", 16000000 / 2)); // actual clock speed unknown
2867 pcm.set_end_callback(FUNC(towns_state::towns_pcm_irq));
2868 pcm.set_addrmap(0, &towns_state::pcm_mem);
2869 pcm.add_route(0, "lspeaker", 3.00);
2870 pcm.add_route(1, "rspeaker", 3.00);
2871
2872 CDDA(config, m_cdda);
2873 m_cdda->add_route(0, "lspeaker", 1.00);
2874 m_cdda->add_route(1, "rspeaker", 1.00);
2875 SPEAKER_SOUND(config, m_speaker);
2876 m_speaker->add_route(ALL_OUTPUTS, "lspeaker", 0.50);
2877 m_speaker->add_route(ALL_OUTPUTS, "rspeaker", 0.50);
2878
2879 PIT8253(config, m_pit, 0);
2880 m_pit->set_clk<0>(307200);
2881 m_pit->out_handler<0>().set(FUNC(towns_state::towns_pit_out0_changed));
2882 m_pit->set_clk<1>(307200);
2883 m_pit->out_handler<1>().set(FUNC(towns_state::towns_pit_out1_changed));
2884 m_pit->set_clk<2>(307200);
2885 m_pit->out_handler<2>().set(FUNC(towns_state::pit_out2_changed));
2886
2887 pit8253_device &pit2(PIT8253(config, "pit2", 0));
2888 pit2.set_clk<0>(307200); // reserved
2889 pit2.set_clk<1>(1228800); // RS-232
2890 pit2.out_handler<1>().set(FUNC(towns_state::pit2_out1_changed));
2891 pit2.set_clk<2>(307200); // reserved
2892
2893 PIC8259(config, m_pic_master, 0);
2894 m_pic_master->out_int_callback().set_inputline(m_maincpu, 0);
2895 m_pic_master->in_sp_callback().set_constant(1);
2896 m_pic_master->read_slave_ack_callback().set(FUNC(towns_state::get_slave_ack));
2897
2898 PIC8259(config, m_pic_slave, 0);
2899 m_pic_slave->out_int_callback().set(m_pic_master, FUNC(pic8259_device::ir7_w));
2900 m_pic_slave->in_sp_callback().set_constant(0);
2901
2902 MB8877(config, m_fdc, 8'000'000 / 4); // clock unknown
2903 m_fdc->intrq_wr_callback().set(FUNC(towns_state::mb8877a_irq_w));
2904 m_fdc->drq_wr_callback().set(FUNC(towns_state::mb8877a_drq_w));
2905 FLOPPY_CONNECTOR(config, m_flop[0], towns_floppies, "35hd", towns_state::floppy_formats);
2906 FLOPPY_CONNECTOR(config, m_flop[1], towns_floppies, "35hd", towns_state::floppy_formats);
2907 SOFTWARE_LIST(config, "fd_list").set_original("fmtowns_flop");
2908
2909 CDROM(config, m_cdrom, 0).set_interface("fmt_cdrom");
2910 SOFTWARE_LIST(config, "cd_list").set_original("fmtowns_cd");
2911
2912 UPD71071(config, m_dma[0], 0);
2913 m_dma[0]->set_cpu_tag("maincpu");
2914 m_dma[0]->set_clock(4000000);
2915 m_dma[0]->dma_read_callback<0>().set(FUNC(towns_state::towns_fdc_dma_r));
2916 m_dma[0]->dma_read_callback<3>().set(FUNC(towns_state::towns_state::towns_cdrom_dma_r));
2917 m_dma[0]->dma_write_callback<0>().set(FUNC(towns_state::towns_fdc_dma_w));
2918 UPD71071(config, m_dma[1], 0);
2919 m_dma[1]->set_cpu_tag("maincpu");
2920 m_dma[1]->set_clock(4000000);
2921 m_dma[1]->dma_read_callback<0>().set(FUNC(towns_state::towns_fdc_dma_r));
2922 m_dma[1]->dma_read_callback<3>().set(FUNC(towns_state::towns_state::towns_cdrom_dma_r));
2923 m_dma[1]->dma_write_callback<0>().set(FUNC(towns_state::towns_fdc_dma_w));
2924
2925 //MCFG_VIDEO_START_OVERRIDE(towns_state,towns)
2926
2927 I8251(config, m_i8251, 0);
2928 m_i8251->rxrdy_handler().set(FUNC(towns_state::towns_rxrdy_irq));
2929 m_i8251->txrdy_handler().set(FUNC(towns_state::towns_txrdy_irq));
2930 m_i8251->syndet_handler().set(FUNC(towns_state::towns_syndet_irq));
2931 m_i8251->dtr_handler().set("rs232c", FUNC(rs232_port_device::write_dtr));
2932 m_i8251->rts_handler().set("rs232c", FUNC(rs232_port_device::write_rts));
2933 m_i8251->txd_handler().set("rs232c", FUNC(rs232_port_device::write_txd));
2934
2935 rs232_port_device &rs232c(RS232_PORT(config, "rs232c", default_rs232_devices, nullptr));
2936 rs232c.rxd_handler().set(m_i8251, FUNC(i8251_device::write_rxd));
2937 rs232c.dsr_handler().set(m_i8251, FUNC(i8251_device::write_dsr));
2938 rs232c.cts_handler().set(m_i8251, FUNC(i8251_device::write_cts));
2939
2940 FMT_ICMEM(config, m_icmemcard, 0);
2941
2942 /* First-generation models: 1 MB onboard, 3 SIMM slots with 1 or 2 MB each, except slot 1 (limited to 1 MB).
2943 Model 2 comes with a 1 MB SIMM preinstalled on slot 1, Model 1 doesn't. */
2944 RAM(config, m_ram).set_default_size("2M").set_extra_options("1M,3M,4M,5M,6M");
2945
2946 MSM58321(config, m_rtc, 32768_Hz_XTAL);
2947 m_rtc->d0_handler().set(FUNC(towns_state::rtc_d0_w));
2948 m_rtc->d1_handler().set(FUNC(towns_state::rtc_d1_w));
2949 m_rtc->d2_handler().set(FUNC(towns_state::rtc_d2_w));
2950 m_rtc->d3_handler().set(FUNC(towns_state::rtc_d3_w));
2951 m_rtc->busy_handler().set(FUNC(towns_state::rtc_busy_w));
2952 m_rtc->set_year0(2000);
2953 m_rtc->set_default_24h(true);
2954 }
2955
towns(machine_config & config)2956 void towns_state::towns(machine_config &config)
2957 {
2958 towns_base(config);
2959 NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
2960
2961 FMT_SCSI_SLOT(config, m_scsi_slot, fmt_scsi_default_devices, nullptr);
2962 m_scsi_slot->irq_handler().set(FUNC(towns_state::towns_scsi_irq));
2963 m_scsi_slot->drq_handler().set(FUNC(towns_state::towns_scsi_drq));
2964
2965 m_dma[0]->dma_read_callback<1>().set(m_scsi_slot, FUNC(fmt_scsi_slot_device::data_read));
2966 m_dma[0]->dma_write_callback<1>().set(m_scsi_slot, FUNC(fmt_scsi_slot_device::data_write));
2967 m_dma[1]->dma_read_callback<1>().set(m_scsi_slot, FUNC(fmt_scsi_slot_device::data_read));
2968 m_dma[1]->dma_write_callback<1>().set(m_scsi_slot, FUNC(fmt_scsi_slot_device::data_write));
2969 }
2970
townsux(machine_config & config)2971 void towns16_state::townsux(machine_config &config)
2972 {
2973 towns_base(config);
2974
2975 I386SX(config.replace(), m_maincpu, 16000000);
2976 m_maincpu->set_addrmap(AS_PROGRAM, &towns16_state::ux_mem);
2977 m_maincpu->set_addrmap(AS_IO, &towns16_state::townsux_io);
2978 m_maincpu->set_vblank_int("screen", FUNC(towns_state::towns_vsync_irq));
2979 m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
2980
2981 scsi_port_device &scsi(SCSI_PORT(config, "scsi", 0));
2982 scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0));
2983 scsi.set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1));
2984 scsi.set_slot_device(3, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_2));
2985 scsi.set_slot_device(4, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_3));
2986 scsi.set_slot_device(5, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4));
2987
2988 FMSCSI(config, m_scsi, 0);
2989 m_scsi->set_scsi_port("scsi");
2990 m_scsi->irq_handler().set(FUNC(towns16_state::towns_scsi_irq));
2991 m_scsi->drq_handler().set(FUNC(towns16_state::towns_scsi_drq));
2992
2993 m_dma[0]->dma_read_callback<1>().set(m_scsi, FUNC(fmscsi_device::fmscsi_data_r));
2994 m_dma[0]->dma_write_callback<1>().set(m_scsi, FUNC(fmscsi_device::fmscsi_data_w));
2995 m_dma[1]->dma_read_callback<1>().set(m_scsi, FUNC(fmscsi_device::fmscsi_data_r));
2996 m_dma[1]->dma_write_callback<1>().set(m_scsi, FUNC(fmscsi_device::fmscsi_data_w));
2997
2998 // 2 MB onboard, one SIMM slot with 2-8 MB
2999 m_ram->set_default_size("2M").set_extra_options("4M,6M,10M");
3000
3001 NVRAM(config, "nvram16", nvram_device::DEFAULT_ALL_0);
3002 }
3003
townssj(machine_config & config)3004 void towns_state::townssj(machine_config &config)
3005 {
3006 towns_base(config);
3007
3008 I486(config.replace(), m_maincpu, 66000000);
3009 m_maincpu->set_addrmap(AS_PROGRAM, &towns_state::towns_mem);
3010 m_maincpu->set_addrmap(AS_IO, &towns_state::towns2_io);
3011 m_maincpu->set_vblank_int("screen", FUNC(towns_state::towns_vsync_irq));
3012 m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
3013
3014 scsi_port_device &scsi(SCSI_PORT(config, "scsi", 0));
3015 scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0));
3016 scsi.set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1));
3017 scsi.set_slot_device(3, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_2));
3018 scsi.set_slot_device(4, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_3));
3019 scsi.set_slot_device(5, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4));
3020
3021 FMSCSI(config, m_scsi, 0);
3022 m_scsi->set_scsi_port("scsi");
3023 m_scsi->irq_handler().set(FUNC(towns_state::towns_scsi_irq));
3024 m_scsi->drq_handler().set(FUNC(towns_state::towns_scsi_drq));
3025
3026 m_dma[0]->dma_read_callback<1>().set(m_scsi, FUNC(fmscsi_device::fmscsi_data_r));
3027 m_dma[0]->dma_write_callback<1>().set(m_scsi, FUNC(fmscsi_device::fmscsi_data_w));
3028 m_dma[1]->dma_read_callback<1>().set(m_scsi, FUNC(fmscsi_device::fmscsi_data_r));
3029 m_dma[1]->dma_write_callback<1>().set(m_scsi, FUNC(fmscsi_device::fmscsi_data_w));
3030
3031 // 4 MB (SJ2/SJ2A) or 8 MB (SJ26/SJ53) onboard, 2 SIMM slots with 4-32 MB each
3032 m_ram->set_default_size("8M").set_extra_options("4M,12M,16M,20M,24M,28M,32M,36M,40M,44M,48M,52M,56M,68M,72M");
3033
3034 NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
3035 }
3036
townshr(machine_config & config)3037 void towns_state::townshr(machine_config &config)
3038 {
3039 townssj(config);
3040 I486(config.replace(), m_maincpu, 20000000);
3041 m_maincpu->set_addrmap(AS_PROGRAM, &towns_state::towns_mem);
3042 m_maincpu->set_addrmap(AS_IO, &towns_state::towns2_io);
3043 m_maincpu->set_vblank_int("screen", FUNC(towns_state::towns_vsync_irq));
3044 m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
3045
3046 // 4 MB onboard, 3 SIMM slots with 2-8 MB each
3047 m_ram->set_default_size("4M").set_extra_options("6M,8M,10M,12M,14M,16M,18M,20M,22M,24M,28M");
3048 }
3049
townsmx(machine_config & config)3050 void towns_state::townsmx(machine_config &config)
3051 {
3052 townssj(config);
3053
3054 // 4 MB onboard, 3 SIMM slots with 2-32 MB each, MX170W/MX340W models come with a 4 MB SIMM preinstalled
3055 m_ram->set_default_size("8M").set_extra_options("4M,6M,8M,10M,12M,14M,16M,18M,20M,22M,24M,26M,28M,30M,32M,36M,38M,40M,42M,44M,46M,48M,52M,53M,54M,56M,60M,68M,70M,72M,76M,84M,100M");
3056 }
3057
townsftv(machine_config & config)3058 void towns_state::townsftv(machine_config &config)
3059 {
3060 townssj(config);
3061 I486(config.replace(), m_maincpu, 33000000);
3062 m_maincpu->set_addrmap(AS_PROGRAM, &towns_state::towns_mem);
3063 m_maincpu->set_addrmap(AS_IO, &towns_state::towns2_io);
3064 m_maincpu->set_vblank_int("screen", FUNC(towns_state::towns_vsync_irq));
3065 m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
3066
3067 // 4 MB onboard, 2 SIMM slots with 2-32 MB each, one of them with a 2 MB SIMM preinstalled
3068 m_ram->set_default_size("6M").set_extra_options("4M,8M,10M,12M,14M,16M,20M,22M,24M,28M,36M,38M,40M,44M,52M,68M");
3069 }
3070
marty(machine_config & config)3071 void marty_state::marty(machine_config &config)
3072 {
3073 towns_base(config);
3074
3075 I386SX(config.replace(), m_maincpu, 16000000);
3076 m_maincpu->set_addrmap(AS_PROGRAM, &marty_state::marty_mem);
3077 m_maincpu->set_addrmap(AS_IO, &marty_state::towns16_io);
3078 m_maincpu->set_vblank_int("screen", FUNC(towns_state::towns_vsync_irq));
3079 m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
3080
3081 FLOPPY_CONNECTOR(config.replace(), m_flop[1], towns_floppies, nullptr, towns_state::floppy_formats);
3082
3083 // 2 MB onboard, expandable to 4 MB with a Marty-only expansion card
3084 m_ram->set_default_size("2M").set_extra_options("4M");
3085
3086 NVRAM(config, "nvram16", nvram_device::DEFAULT_ALL_0);
3087 }
3088
3089 /* ROM definitions */
3090
3091 /* These ROMs were dumped from an FM Towns Model 2. Model 1 is assumed to use the same ROMs, since they were
3092 released at the same time, and the only differences are the amount of RAM and floppy drives.
3093
3094 The ROM is physically contained in three 4 Mbit chips: two MB834200-20 (DIP40) and one MB834200-25 (QFP44) */
3095 ROM_START( fmtowns )
3096 ROM_REGION32_LE( 0x280000, "user", 0)
3097 ROM_LOAD("fmt_dos.rom", 0x000000, 0x080000, CRC(112872ee) SHA1(57fd146478226f7f215caf63154c763a6d52165e) )
3098 ROM_LOAD("fmt_dic.rom", 0x100000, 0x080000, CRC(b314c659) SHA1(3959c4c6be540252cabea06847bcd408f1911cfb) )
3099 ROM_LOAD("fmt_fnt.rom", 0x180000, 0x040000, CRC(955c6b75) SHA1(fa5f7a18060afa35678dcbdc3589a1455aba26dc) )
3100 ROM_LOAD("fmt_sys.rom", 0x200000, 0x040000, CRC(53319e23) SHA1(15d9cc705f3534fe97a2386e4d4848a1602cc534) )
3101 ROM_END
3102
3103 /* System ROM has a date of 91/07/09 and matches the UX set, but the dictionary ROM is completely different. It could be from an FM Towns II CX.
3104 Font ROM appears to be corrupt, though. */
3105 ROM_START( fmtownsv03 )
3106 ROM_REGION32_LE( 0x280000, "user", 0)
3107 ROM_LOAD("fmt_dos_a.rom", 0x000000, 0x080000, CRC(22270e9f) SHA1(a7e97b25ff72b14121146137db8b45d6c66af2ae) )
3108 ROM_LOAD("fmt_f20_a.rom", 0x080000, 0x080000, CRC(75660aac) SHA1(6a521e1d2a632c26e53b83d2cc4b0edecfc1e68c) )
3109 ROM_LOAD("fmt_dic_a.rom", 0x100000, 0x080000, CRC(74b1d152) SHA1(f63602a1bd67c2ad63122bfb4ffdaf483510f6a8) )
3110 ROM_LOAD("fmt_fnt_a.rom", 0x180000, 0x040000, CRC(0108a090) SHA1(1b5dd9d342a96b8e64070a22c3a158ca419894e1) BAD_DUMP )
3111 ROM_LOAD("fmt_sys_a.rom", 0x200000, 0x040000, CRC(92f3fa67) SHA1(be21404098b23465d24c4201a81c96ac01aff7ab) )
3112 ROM_END
3113
3114 /* 16MHz 80386SX, 2MB RAM expandable up to 10MB (due to the limited 24-bit address space of the CPU), dumped from a UX10 */
3115 ROM_START( fmtownsux )
3116 ROM_REGION16_LE( 0x480000, "user", 0)
3117 ROM_LOAD("fmt_dos_a.rom", 0x000000, 0x080000, CRC(22270e9f) SHA1(a7e97b25ff72b14121146137db8b45d6c66af2ae) )
3118 // no F20 ROM
3119 ROM_LOAD("fmt_dic.rom", 0x100000, 0x080000, CRC(82d1daa2) SHA1(7564020dba71deee27184824b84dbbbb7c72aa4e) )
3120 ROM_LOAD("fmt_fnt.rom", 0x180000, 0x040000, CRC(dd6fd544) SHA1(a216482ea3162f348fcf77fea78e0b2e4288091a) )
3121 ROM_LOAD("fmt_sys_a.rom", 0x200000, 0x040000, CRC(92f3fa67) SHA1(be21404098b23465d24c4201a81c96ac01aff7ab) )
3122 ROM_REGION( 0x20, "serial", 0)
3123 ROM_LOAD("mytownsux.rom", 0x00, 0x20, CRC(5cc7e6bc) SHA1(e245f8086df57ce6e48853f0e13525f738e5c4d8) )
3124 ROM_END
3125
3126 /* 20MHz 80486SX, 4MB RAM expandable up to 28MB, dumped from an HR20 */
3127 ROM_START( fmtownshr )
3128 ROM_REGION32_LE( 0x280000, "user", 0)
3129 ROM_LOAD("fmt_dos.rom", 0x000000, 0x080000, CRC(112872ee) SHA1(57fd146478226f7f215caf63154c763a6d52165e) )
3130 // F20 ROM space appears to be all 0xFF on an HR, so it is assumed to be not present
3131 // ROM_LOAD("fmt_f20.rom", 0x080000, 0x080000, CRC(9f55a20c) SHA1(1920711cb66340bb741a760de187de2f76040b8c) )
3132 ROM_LOAD("fmt_dic.rom", 0x100000, 0x080000, CRC(82d1daa2) SHA1(7564020dba71deee27184824b84dbbbb7c72aa4e) )
3133 ROM_LOAD("fmt_fnt.rom", 0x180000, 0x040000, CRC(dd6fd544) SHA1(a216482ea3162f348fcf77fea78e0b2e4288091a) )
3134 ROM_LOAD("fmthr_sys.rom",0x200000, 0x040000, CRC(8aeff982) SHA1(a4ebf2e247a8e15a5f1ff003b657bbe3a67203d8) )
3135 ROM_REGION( 0x20, "serial", 0)
3136 ROM_LOAD("mytownshr.rom", 0x00, 0x20, CRC(c52f0e89) SHA1(634d3965606b18a99507f0a520553005661c41ff) )
3137 ROM_END
3138
3139 /* 66MHz 80486DX2, 8MB RAM expandable up to 72MB, dumped from an SJ26 */
3140 ROM_START( fmtownssj )
3141 ROM_REGION32_LE( 0x280000, "user", 0)
3142 // Assumed for now, only the serial ROM has been dumped successfully so far
3143 ROM_LOAD("fmt_dos.rom", 0x000000, 0x080000, CRC(112872ee) SHA1(57fd146478226f7f215caf63154c763a6d52165e) BAD_DUMP )
3144 ROM_LOAD("fmt_f20.rom", 0x080000, 0x080000, CRC(9f55a20c) SHA1(1920711cb66340bb741a760de187de2f76040b8c) BAD_DUMP )
3145 ROM_LOAD("fmt_dic.rom", 0x100000, 0x080000, CRC(82d1daa2) SHA1(7564020dba71deee27184824b84dbbbb7c72aa4e) BAD_DUMP )
3146 ROM_LOAD("fmt_fnt.rom", 0x180000, 0x040000, CRC(dd6fd544) SHA1(a216482ea3162f348fcf77fea78e0b2e4288091a) BAD_DUMP )
3147 ROM_LOAD("fmt_sys.rom", 0x200000, 0x040000, CRC(afe4ebcf) SHA1(4cd51de4fca9bd7a3d91d09ad636fa6b47a41df5) BAD_DUMP )
3148 ROM_REGION( 0x20, "serial", 0)
3149 ROM_LOAD("mytownssj.rom", 0x00, 0x20, CRC(d0ed8936) SHA1(bf9eeef25e9a1dc4a9ce1c70f4155ac973cae3f9) )
3150 ROM_END
3151
3152 /* 66MHz 80486DX2, dumped from an FM-Towns II MX */
3153 ROM_START( fmtownsmx )
3154 ROM_REGION32_LE( 0x280000, "user", 0)
3155 ROM_LOAD("fmtownsiimxbios.m79", 0x000000, 0x080000, CRC(f3fc636e) SHA1(a35a11ab56b1f11e3f69d70b61648ab83699a2df) )
3156 ROM_CONTINUE(0x180000,0x40000)
3157 ROM_CONTINUE(0x200000,0x40000)
3158 ROM_CONTINUE(0x080000,0x80000)
3159 ROM_CONTINUE(0x100000,0x80000)
3160 ROM_REGION( 0x20, "serial", 0)
3161 ROM_LOAD("mytownsmx.rom", 0x00, 0x20, CRC(16e78766) SHA1(38e8810bee9ee6b54c3999d27f499b89e4a4c33f) )
3162 ROM_END
3163
3164 /* 33MHz 80486SX, 6MB RAM expandable up to 68MB, dumped from an FM Towns II Fresh TV */
3165 ROM_START( fmtownsftv )
3166 ROM_REGION32_LE( 0x280000, "user", 0)
3167 ROM_LOAD("fmt_dos.rom", 0x000000, 0x080000, CRC(112872ee) SHA1(57fd146478226f7f215caf63154c763a6d52165e) )
3168 ROM_LOAD("fmt_f20.rom", 0x080000, 0x080000, CRC(9f55a20c) SHA1(1920711cb66340bb741a760de187de2f76040b8c) )
3169 ROM_LOAD("fmt_dic.rom", 0x100000, 0x080000, CRC(82d1daa2) SHA1(7564020dba71deee27184824b84dbbbb7c72aa4e) )
3170 ROM_LOAD("fmt_fnt.rom", 0x180000, 0x040000, CRC(dd6fd544) SHA1(a216482ea3162f348fcf77fea78e0b2e4288091a) )
3171 ROM_LOAD("fmt_sys.rom", 0x200000, 0x040000, CRC(afe4ebcf) SHA1(4cd51de4fca9bd7a3d91d09ad636fa6b47a41df5) )
3172 ROM_REGION( 0x20, "serial", 0)
3173 ROM_LOAD("mytownsftv.rom", 0x00, 0x20, CRC(a961aae7) SHA1(bba02edafdfaa6fb1b8122f623259a87a555c307) )
3174 ROM_END
3175
3176 ROM_START( fmtmarty )
3177 ROM_REGION16_LE( 0x480000, "user", 0)
3178 ROM_LOAD("mrom.m36", 0x000000, 0x080000, CRC(9c0c060c) SHA1(5721c5f9657c570638352fa9acac57fa8d0b94bd) )
3179 ROM_CONTINUE(0x280000,0x180000)
3180 ROM_LOAD("mrom.m37", 0x400000, 0x080000, CRC(fb66bb56) SHA1(e273b5fa618373bdf7536495cd53c8aac1cce9a5) )
3181 ROM_CONTINUE(0x80000,0x100000)
3182 ROM_CONTINUE(0x180000,0x40000)
3183 ROM_CONTINUE(0x200000,0x40000)
3184 ROM_END
3185
3186 ROM_START( fmtmarty2 )
3187 ROM_REGION16_LE( 0x480000, "user", 0)
3188 ROM_LOAD("fmt_dos.rom", 0x000000, 0x080000, CRC(2bc2af96) SHA1(99cd51c5677288ad8ef711b4ac25d981fd586884) )
3189 ROM_LOAD("fmt_dic.rom", 0x100000, 0x080000, CRC(82d1daa2) SHA1(7564020dba71deee27184824b84dbbbb7c72aa4e) )
3190 ROM_LOAD("fmt_fnt.rom", 0x180000, 0x040000, CRC(dd6fd544) SHA1(a216482ea3162f348fcf77fea78e0b2e4288091a) )
3191 ROM_LOAD("fmt_sys.rom", 0x200000, 0x040000, CRC(937311f6) SHA1(7b1c97fa778986134104a6964c8fe13e3654f52e) )
3192 ROM_LOAD("mar_ex0.rom", 0x280000, 0x080000, CRC(f67540f6) SHA1(1611fc4683dab72e56a5d0ee0f757e5878900b31) )
3193 ROM_LOAD("mar_ex1.rom", 0x300000, 0x080000, CRC(99938a4b) SHA1(167d8ae47312cdaa30b8597144f60f54ce9f74d3) )
3194 ROM_LOAD("mar_ex2.rom", 0x380000, 0x080000, CRC(c6783422) SHA1(b2ed2ba42b8132d139480484fe116ba7774e1604) )
3195 ROM_LOAD("mar_ex3.rom", 0x400000, 0x080000, CRC(4aa43e16) SHA1(19b669aa6488bdaf8569e89b1b1067e51246a768) )
3196 ROM_REGION( 0x20, "serial", 0)
3197 ROM_LOAD("mytownsm2.rom", 0x00, 0x20, CRC(44f2f076) SHA1(e4d3be54e66931c947993ded9ddbae716ad51ca5) )
3198 ROM_END
3199
3200 ROM_START( carmarty )
3201 ROM_REGION16_LE( 0x480000, "user", 0)
3202 ROM_LOAD("fmt_dos.rom", 0x000000, 0x080000, CRC(2bc2af96) SHA1(99cd51c5677288ad8ef711b4ac25d981fd586884) )
3203 ROM_LOAD("fmt_dic.rom", 0x100000, 0x080000, CRC(82d1daa2) SHA1(7564020dba71deee27184824b84dbbbb7c72aa4e) )
3204 ROM_LOAD("fmt_fnt.rom", 0x180000, 0x040000, CRC(dd6fd544) SHA1(a216482ea3162f348fcf77fea78e0b2e4288091a) )
3205 ROM_LOAD("cmar_sys.rom", 0x200000, 0x040000, CRC(e1ff7ce1) SHA1(e6c359177e4e9fb5bbb7989c6bbf6e95c091fd88) )
3206 ROM_LOAD("cmar_ex0.rom", 0x280000, 0x080000, CRC(e248bfbd) SHA1(0ce89952a7901dd4d256939a6bc8597f87e51ae7) )
3207 ROM_LOAD("cmar_ex1.rom", 0x300000, 0x080000, CRC(ab2e94f0) SHA1(4b3378c772302622f8e1139ed0caa7da1ab3c780) )
3208 ROM_LOAD("cmar_ex2.rom", 0x380000, 0x080000, CRC(ce150ec7) SHA1(1cd8c39f3b940e03f9fe999ebcf7fd693f843d04) )
3209 ROM_LOAD("cmar_ex3.rom", 0x400000, 0x080000, CRC(582fc7fc) SHA1(a77d8014e41e9ff0f321e156c0fe1a45a0c5e58e) )
3210 ROM_REGION( 0x20, "serial", 0)
3211 ROM_LOAD("mytownscm.rom", 0x00, 0x20, CRC(bc58eba6) SHA1(483087d823c3952cc29bd827e5ef36d12c57ad49) )
3212 ROM_END
3213
3214 /* Driver */
3215
3216 /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
3217 COMP( 1989, fmtowns, 0, 0, towns, towns, towns_state, empty_init, "Fujitsu", "FM-Towns (Model 1 / 2)", MACHINE_NOT_WORKING)
3218 COMP( 1991, fmtownsv03, fmtowns, 0, towns, towns, towns_state, empty_init, "Fujitsu", "FM-Towns (unknown, V03 L01 00 91/07/09)", MACHINE_NOT_WORKING)
3219 COMP( 1991, fmtownsux, fmtowns, 0, townsux, towns, towns16_state, empty_init, "Fujitsu", "FM-Towns II UX", MACHINE_NOT_WORKING)
3220 COMP( 1992, fmtownshr, fmtowns, 0, townshr, towns, towns_state, empty_init, "Fujitsu", "FM-Towns II HR", MACHINE_NOT_WORKING)
3221 COMP( 1993, fmtownsmx, fmtowns, 0, townsmx, towns, towns_state, empty_init, "Fujitsu", "FM-Towns II MX", MACHINE_NOT_WORKING)
3222 COMP( 1994, fmtownsftv, fmtowns, 0, townsftv, towns, towns_state, empty_init, "Fujitsu", "FM-Towns II FreshTV", MACHINE_NOT_WORKING)
3223 COMP( 19??, fmtownssj, fmtowns, 0, townssj, towns, towns_state, empty_init, "Fujitsu", "FM-Towns II SJ", MACHINE_NOT_WORKING)
3224 CONS( 1993, fmtmarty, 0, 0, marty, marty, marty_state, empty_init, "Fujitsu", "FM-Towns Marty", MACHINE_NOT_WORKING)
3225 CONS( 1993, fmtmarty2, fmtmarty, 0, marty, marty, marty_state, empty_init, "Fujitsu", "FM-Towns Marty 2", MACHINE_NOT_WORKING)
3226 CONS( 1994, carmarty, fmtmarty, 0, marty, marty, marty_state, empty_init, "Fujitsu", "FM-Towns Car Marty", MACHINE_NOT_WORKING)
3227