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