94
static UINT8 bank_data[4];
95
static UINT8 *work_ram;
96
static UINT8 *video_ram;
97
static UINT8 h_scroll;
98
static UINT8 v_scroll;
100
static UINT8 flip_22;
101
static UINT8 videomode;
103
/* UART source/sinks */
104
static UINT8 z80_m6809_line;
105
static UINT8 m6809_z80_line;
109
static int irq_state;
111
static int vblank_irq;
112
static int blitter_irq;
114
static UINT8 z80_int;
115
static UINT8 z80_inten;
117
/* EM and lamps stuff */
118
static UINT32 meter_latch;
119
static UINT32 mux_input;
120
static UINT32 mux_outputlatch;
123
93
Function prototypes
125
INLINE void z80_bank(running_machine *machine, int num, int data);
128
static void update_irqs(running_machine *machine)
130
int newstate = blitter_irq || vblank_irq || acia_irq;
132
if (newstate != irq_state)
134
irq_state = newstate;
135
cputag_set_input_line(machine, "maincpu", 0, irq_state ? ASSERT_LINE : CLEAR_LINE);
95
INLINE void z80_bank(running_machine &machine, int num, int data);
139
98
/***************************************************************************
252
236
#define RED_6 ( 6 << 5 )
253
237
#define RED_7 ( 7 << 5 )
239
class bfcobra_state : public driver_device
242
bfcobra_state(running_machine &machine, const driver_device_config_base &config)
243
: driver_device(machine, config) { }
245
UINT8 m_bank_data[4];
253
UINT8 m_z80_m6809_line;
254
UINT8 m_m6809_z80_line;
263
UINT32 m_meter_latch;
265
UINT32 m_mux_outputlatch;
268
UINT8 m_col8bit[256];
269
UINT8 m_col7bit[256];
270
UINT8 m_col6bit[256];
271
struct blitter_t m_blitter;
272
struct ramdac_t m_ramdac;
255
277
static const UINT8 col4bit_default[16]=
257
279
BLUE_0 | GREEN_0 | RED_0,
292
314
RED_7 | GREEN_7 | BLUE_3
295
static UINT8 col4bit[16];
296
static UINT8 col3bit[16];
297
static UINT8 col8bit[256];
298
static UINT8 col7bit[256];
299
static UINT8 col6bit[256];
300
317
static const UINT8 col76index[] = {0, 2, 4, 7};
303
320
static VIDEO_START( bfcobra )
322
bfcobra_state *state = machine.driver_data<bfcobra_state>();
307
memcpy(col4bit, col4bit_default, sizeof(col4bit));
308
memcpy(col3bit, col3bit_default, sizeof(col3bit));
325
memcpy(state->m_col4bit, col4bit_default, sizeof(state->m_col4bit));
326
memcpy(state->m_col3bit, col3bit_default, sizeof(state->m_col3bit));
309
327
for (i = 0; i < 256; ++i)
331
state->m_col8bit[i] = i;
315
333
col = (col & 0x1f) | (col76index[ ( (col & 0x60) >> 5 ) & 3] << 5);
334
state->m_col7bit[i] = col;
318
336
col = (col & 3) | (col76index[( (col & 0x0c) >> 2) & 3] << 2 ) |
319
337
(col76index[( (col & 0x30) >> 4) & 3] << 5 );
338
state->m_col6bit[i] = col;
324
static VIDEO_UPDATE( bfcobra )
342
static SCREEN_UPDATE( bfcobra )
344
bfcobra_state *state = screen->machine().driver_data<bfcobra_state>();
333
352
/* Select screen has to be programmed into two registers */
334
353
/* No idea what happens if the registers are different */
335
if (flip_8 & 0x40 && flip_22 & 0x40)
354
if (state->m_flip_8 & 0x40 && state->m_flip_22 & 0x40)
336
355
offset = 0x10000;
359
if(state->m_videomode & 0x20)
361
hirescol = state->m_col3bit;
362
lorescol = state->m_col7bit;
345
else if(videomode & 0x40)
364
else if(state->m_videomode & 0x40)
366
hirescol = state->m_col4bit;
367
lorescol = state->m_col6bit;
371
hirescol = state->m_col4bit;
372
lorescol = state->m_col8bit;
356
375
for (y = cliprect->min_y; y <= cliprect->max_y; ++y)
358
UINT16 y_offset = (y + v_scroll) * 256;
359
src = &video_ram[offset + y_offset];
377
UINT16 y_offset = (y + state->m_v_scroll) * 256;
378
src = &state->m_video_ram[offset + y_offset];
360
379
dest = BITMAP_ADDR32(bitmap, y, 0);
362
381
for (x = cliprect->min_x; x <= cliprect->max_x / 2; ++x)
364
UINT8 x_offset = x + h_scroll;
383
UINT8 x_offset = x + state->m_h_scroll;
365
384
UINT8 pen = *(src + x_offset);
367
if ( ( videomode & 0x81 ) == 1 || (videomode & 0x80 && pen & 0x80) )
386
if ( ( state->m_videomode & 0x81 ) == 1 || (state->m_videomode & 0x80 && pen & 0x80) )
369
*dest++ = screen->machine->pens[hirescol[pen & 0x0f]];
370
*dest++ = screen->machine->pens[hirescol[(pen >> 4) & 0x0f]];
388
*dest++ = screen->machine().pens[hirescol[pen & 0x0f]];
389
*dest++ = screen->machine().pens[hirescol[(pen >> 4) & 0x0f]];
374
*dest++ = screen->machine->pens[lorescol[pen]];
375
*dest++ = screen->machine->pens[lorescol[pen]];
393
*dest++ = screen->machine().pens[lorescol[pen]];
394
*dest++ = screen->machine().pens[lorescol[pen]];
383
INLINE UINT8* blitter_get_addr(running_machine *machine, UINT32 addr)
402
INLINE UINT8* blitter_get_addr(running_machine &machine, UINT32 addr)
404
bfcobra_state *state = machine.driver_data<bfcobra_state>();
385
405
if (addr < 0x10000)
387
407
/* Is this region fixed? */
388
return (UINT8*)(machine->region("user1")->base() + addr);
408
return (UINT8*)(machine.region("user1")->base() + addr);
390
410
else if(addr < 0x20000)
393
addr += (bank_data[0] & 1) ? 0x10000 : 0;
413
addr += (state->m_bank_data[0] & 1) ? 0x10000 : 0;
395
return (UINT8*)(machine->region("user1")->base() + addr + ((bank_data[0] >> 1) * 0x20000));
415
return (UINT8*)(machine.region("user1")->base() + addr + ((state->m_bank_data[0] >> 1) * 0x20000));
397
417
else if (addr >= 0x20000 && addr < 0x40000)
399
return (UINT8*)&video_ram[addr - 0x20000];
419
return (UINT8*)&state->m_video_ram[addr - 0x20000];
403
return (UINT8*)&work_ram[addr - 0x40000];
423
return (UINT8*)&state->m_work_ram[addr - 0x40000];
440
462
/* This debug is now wrong ! */
441
463
if (DEBUG_BLITTER)
443
mame_printf_debug("\n%s:Blitter: Running command from 0x%.5x\n\n", cpuexec_describe_context(device->machine), blitter.program.addr - 12);
465
mame_printf_debug("\n%s:Blitter: Running command from 0x%.5x\n\n", device->machine().describe_context(), blitter.program.addr - 12);
444
466
mame_printf_debug("Command Reg %.2x", blitter.command);
445
467
mame_printf_debug(" %s %s %s %s %s %s %s\n",
446
468
blitter.command & CMD_RUN ? "RUN" : " ",
630
652
The existing destination pixel is used as a lookup
631
653
into the table and the colours is replaced.
633
UINT8 dest = *blitter_get_addr(space->machine, blitter.dest.addr);
634
UINT8 newcol = *(blitter_get_addr(space->machine, (blitter.source.addr + dest) & 0xfffff));
655
UINT8 dest = *blitter_get_addr(space->machine(), blitter.dest.addr);
656
UINT8 newcol = *(blitter_get_addr(space->machine(), (blitter.source.addr + dest) & 0xfffff));
636
*blitter_get_addr(space->machine, blitter.dest.addr) = newcol;
658
*blitter_get_addr(space->machine(), blitter.dest.addr) = newcol;
637
659
cycles_used += 3;
692
714
} while (blitter.command & CMD_RUN);
694
716
/* Burn Z80 cycles while blitter is in operation */
695
cpu_spinuntil_time(space->cpu, ATTOTIME_IN_NSEC( (1000000000 / Z80_XTAL)*cycles_used * 2 ) );
717
device_spin_until_time(&space->device(), attotime::from_nsec( (1000000000 / Z80_XTAL)*cycles_used * 2 ) );
699
721
static READ8_HANDLER( ramdac_r )
723
bfcobra_state *state = space->machine().driver_data<bfcobra_state>();
724
struct ramdac_t &ramdac = state->m_ramdac;
701
725
UINT8 val = 0xff;
703
727
switch (offset & 3)
753
779
ramdac.color_w[ramdac.count_w] = pal6bit(data);
754
780
if (++ramdac.count_w == 3)
756
palette_set_color_rgb(space->machine, ramdac.addr_w, ramdac.color_w[0], ramdac.color_w[1], ramdac.color_w[2]);
782
palette_set_color_rgb(space->machine(), ramdac.addr_w, ramdac.color_w[0], ramdac.color_w[1], ramdac.color_w[2]);
757
783
ramdac.count_w = 0;
822
848
***************************************************************************/
850
static void update_irqs(running_machine &machine)
852
bfcobra_state *state = machine.driver_data<bfcobra_state>();
853
int newstate = state->m_blitter_irq || state->m_vblank_irq || state->m_acia_irq;
855
if (newstate != state->m_irq_state)
857
state->m_irq_state = newstate;
858
cputag_set_input_line(machine, "maincpu", 0, state->m_irq_state ? ASSERT_LINE : CLEAR_LINE);
824
862
static READ8_HANDLER( chipset_r )
864
bfcobra_state *state = space->machine().driver_data<bfcobra_state>();
826
865
UINT8 val = 0xff;
860
899
/* Seems correct - used during RLE pic decoding */
861
val = blitter.dest.addr0;
900
val = state->m_blitter.dest.addr0;
866
val = 0x40 | input_port_read(space->machine, "JOYSTICK");
905
val = 0x40 | input_port_read(space->machine(), "JOYSTICK");
871
mame_printf_debug("Flare One unknown read: 0x%.2x (PC:0x%.4x)\n", offset, cpu_get_previouspc(space->cpu));
910
mame_printf_debug("Flare One unknown read: 0x%.2x (PC:0x%.4x)\n", offset, cpu_get_previouspc(&space->device()));
887
popmessage("%x: Unusual bank access (%x)\n", cpu_get_previouspc(space->cpu), data);
927
popmessage("%x: Unusual bank access (%x)\n", cpu_get_previouspc(&space->device()), data);
890
bank_data[offset] = data;
891
z80_bank(space->machine, offset, data);
930
state->m_bank_data[offset] = data;
931
z80_bank(space->machine(), offset, data);
937
state->m_flip_8 = data;
941
state->m_videomode = data;
946
state->m_h_scroll = data;
951
state->m_v_scroll = data;
918
col3bit[5 + 8] = data;
956
state->m_col4bit[5] = data;
957
state->m_col3bit[5] = data;
958
state->m_col3bit[5 + 8] = data;
925
col3bit[6 + 8] = data;
963
state->m_col4bit[6] = data;
964
state->m_col3bit[6] = data;
965
state->m_col3bit[6 + 8] = data;
930
blitter.program.addr0 = data;
970
state->m_blitter.program.addr0 = data;
935
blitter.program.addr1 = data;
975
state->m_blitter.program.addr1 = data;
940
blitter.program.addr2 = data;
980
state->m_blitter.program.addr2 = data;
945
blitter.command = data;
985
state->m_blitter.command = data;
947
987
if (data & CMD_RUN)
996
state->m_flip_22 = data;
961
mame_printf_debug("Flare One unknown write: 0x%.2x with 0x%.2x (PC:0x%.4x)\n", offset, data, cpu_get_previouspc(space->cpu));
1001
mame_printf_debug("Flare One unknown write: 0x%.2x with 0x%.2x (PC:0x%.4x)\n", offset, data, cpu_get_previouspc(&space->device()));
966
INLINE void z80_bank(running_machine *machine, int num, int data)
1006
INLINE void z80_bank(running_machine &machine, int num, int data)
1008
bfcobra_state *state = machine.driver_data<bfcobra_state>();
968
1009
static const char * const bank_names[] = { "bank1", "bank2", "bank3" };
970
1011
if (data < 0x08)
972
UINT32 offset = ((bank_data[0] >> 1) * 0x20000) + ((0x4000 * data) ^ ((bank_data[0] & 1) ? 0 : 0x10000));
1013
UINT32 offset = ((state->m_bank_data[0] >> 1) * 0x20000) + ((0x4000 * data) ^ ((state->m_bank_data[0] & 1) ? 0 : 0x10000));
974
memory_set_bankptr(machine, bank_names[num - 1], machine->region("user1")->base() + offset);
1015
memory_set_bankptr(machine, bank_names[num - 1], machine.region("user1")->base() + offset);
976
1017
else if (data < 0x10)
978
memory_set_bankptr(machine, bank_names[num - 1], &video_ram[(data - 0x08) * 0x4000]);
1019
memory_set_bankptr(machine, bank_names[num - 1], &state->m_video_ram[(data - 0x08) * 0x4000]);
982
memory_set_bankptr(machine, bank_names[num - 1], &work_ram[(data - 0x10) * 0x4000]);
1023
memory_set_bankptr(machine, bank_names[num - 1], &state->m_work_ram[(data - 0x10) * 0x4000]);
986
1027
static WRITE8_HANDLER( rombank_w )
989
z80_bank(space->machine, 1, bank_data[1]);
990
z80_bank(space->machine, 2, bank_data[2]);
991
z80_bank(space->machine, 3, bank_data[3]);
1029
bfcobra_state *state = space->machine().driver_data<bfcobra_state>();
1030
state->m_bank_data[0] = data;
1031
z80_bank(space->machine(), 1, state->m_bank_data[1]);
1032
z80_bank(space->machine(), 2, state->m_bank_data[2]);
1033
z80_bank(space->machine(), 3, state->m_bank_data[3]);
1037
1079
SCAN_HIGH_OR_EQUAL = 29
1065
static void reset_fdc(void)
1067
memset(&fdc, 0, sizeof(fdc));
1070
fdc.phase = COMMAND;
1082
static void reset_fdc(running_machine &machine)
1084
bfcobra_state *state = machine.driver_data<bfcobra_state>();
1085
memset(&state->m_fdc, 0, sizeof(state->m_fdc));
1087
state->m_fdc.MSR = 0x80;
1088
state->m_fdc.phase = COMMAND;
1073
1091
static READ8_HANDLER( fdctrl_r )
1093
bfcobra_state *state = space->machine().driver_data<bfcobra_state>();
1096
val = state->m_fdc.MSR;
1082
1101
static READ8_HANDLER( fddata_r )
1103
bfcobra_state *state = space->machine().driver_data<bfcobra_state>();
1104
struct fdc_t &fdc = state->m_fdc;
1084
1105
#define BPS 1024
1086
1107
#define BPT 1024*10
1288
1312
palette_set_color_rgb(machine, pal, pal3bit((pal>>5)&7), pal3bit((pal>>2)&7), pal2bit(pal&3));
1292
memset(&ramdac, 0, sizeof(ramdac));
1315
state->m_bank_data[0] = 1;
1316
memset(&state->m_ramdac, 0, sizeof(state->m_ramdac));
1295
irq_state = blitter_irq = vblank_irq = acia_irq = 0;
1319
state->m_irq_state = state->m_blitter_irq = state->m_vblank_irq = state->m_acia_irq = 0;
1298
1322
/***************************************************************************
1302
1326
***************************************************************************/
1304
static ADDRESS_MAP_START( z80_prog_map, ADDRESS_SPACE_PROGRAM, 8 )
1328
static ADDRESS_MAP_START( z80_prog_map, AS_PROGRAM, 8 )
1305
1329
AM_RANGE(0x0000, 0x3fff) AM_ROMBANK("bank4")
1306
1330
AM_RANGE(0x4000, 0x7fff) AM_RAMBANK("bank1")
1307
1331
AM_RANGE(0x8000, 0xbfff) AM_RAMBANK("bank2")
1308
1332
AM_RANGE(0xc000, 0xffff) AM_RAMBANK("bank3")
1309
1333
ADDRESS_MAP_END
1311
static ADDRESS_MAP_START( z80_io_map, ADDRESS_SPACE_IO, 8 )
1335
static ADDRESS_MAP_START( z80_io_map, AS_IO, 8 )
1312
1336
ADDRESS_MAP_GLOBAL_MASK(0xff)
1313
1337
AM_RANGE(0x00, 0x23) AM_READWRITE(chipset_r, chipset_w)
1314
1338
AM_RANGE(0x24, 0x24) AM_DEVWRITE("acia6850_0", acia6850_ctrl_w)
1353
1377
static READ8_HANDLER( meter_r )
1379
bfcobra_state *state = space->machine().driver_data<bfcobra_state>();
1380
return state->m_meter_latch;
1358
1383
/* TODO: This is borrowed from Scorpion 1 */
1359
1384
static WRITE8_HANDLER( meter_w )
1386
bfcobra_state *state = space->machine().driver_data<bfcobra_state>();
1362
int changed = meter_latch ^ data;
1363
UINT64 cycles = downcast<cpu_device *>(space->cpu)->total_cycles();
1388
int changed = state->m_meter_latch ^ data;
1390
state->m_meter_latch = data;
1368
1393
When a meter is triggered, the current drawn is sensed. If a meter
1382
1407
static READ8_HANDLER( latch_r )
1409
bfcobra_state *state = space->machine().driver_data<bfcobra_state>();
1410
return state->m_mux_input;
1387
1413
static WRITE8_HANDLER( latch_w )
1415
bfcobra_state *state = space->machine().driver_data<bfcobra_state>();
1389
1416
/* TODO: This is borrowed from Scorpion 1 */
1394
int changed = mux_outputlatch ^ data;
1421
int changed = state->m_mux_outputlatch ^ data;
1395
1422
static const char *const port[] = { "STROBE0", "STROBE1", "STROBE2", "STROBE3", "STROBE4", "STROBE5", "STROBE6", "STROBE7" };
1397
mux_outputlatch = data;
1424
state->m_mux_outputlatch = data;
1399
1426
/* Clock has changed */
1400
1427
if (changed & 0x08)
1432
1459
upd7759_start_w(device, data & 0x40 ? 0 : 1);
1435
static ADDRESS_MAP_START( m6809_prog_map, ADDRESS_SPACE_PROGRAM, 8 )
1462
static ADDRESS_MAP_START( m6809_prog_map, AS_PROGRAM, 8 )
1436
1463
AM_RANGE(0x0000, 0x1fff) AM_RAM AM_SHARE("nvram")
1437
1464
AM_RANGE(0x2000, 0x2000) AM_RAM // W 'B', 6F
1438
1465
AM_RANGE(0x2200, 0x2200) AM_RAM // W 'F'
1561
1588
Allocate work RAM and video RAM shared by the Z80 and chipset.
1563
static void init_ram(running_machine *machine)
1590
static void init_ram(running_machine &machine)
1592
bfcobra_state *state = machine.driver_data<bfcobra_state>();
1565
1593
/* 768kB work RAM */
1566
work_ram = auto_alloc_array_clear(machine, UINT8, 0xC0000);
1594
state->m_work_ram = auto_alloc_array_clear(machine, UINT8, 0xC0000);
1568
1596
/* 128kB video RAM */
1569
video_ram = auto_alloc_array_clear(machine, UINT8, 0x20000);
1597
state->m_video_ram = auto_alloc_array_clear(machine, UINT8, 0x20000);
1576
1604
static READ_LINE_DEVICE_HANDLER( z80_acia_rx_r )
1578
return m6809_z80_line;
1606
bfcobra_state *state = device->machine().driver_data<bfcobra_state>();
1607
return state->m_m6809_z80_line;
1581
1610
static WRITE_LINE_DEVICE_HANDLER( z80_acia_tx_w )
1583
z80_m6809_line = state;
1612
bfcobra_state *drvstate = device->machine().driver_data<bfcobra_state>();
1613
drvstate->m_z80_m6809_line = state;
1586
1616
static WRITE_LINE_DEVICE_HANDLER( z80_acia_irq )
1588
acia_irq = state ? CLEAR_LINE : ASSERT_LINE;
1589
update_irqs(device->machine);
1618
bfcobra_state *drvstate = device->machine().driver_data<bfcobra_state>();
1619
drvstate->m_acia_irq = state ? CLEAR_LINE : ASSERT_LINE;
1620
update_irqs(device->machine());
1592
1623
static ACIA6850_INTERFACE( z80_acia_if )
1604
1635
static READ_LINE_DEVICE_HANDLER( m6809_acia_rx_r )
1606
return z80_m6809_line;
1637
bfcobra_state *state = device->machine().driver_data<bfcobra_state>();
1638
return state->m_z80_m6809_line;
1609
1641
static WRITE_LINE_DEVICE_HANDLER( m6809_acia_tx_w )
1611
m6809_z80_line = state;
1643
bfcobra_state *drvstate = device->machine().driver_data<bfcobra_state>();
1644
drvstate->m_m6809_z80_line = state;
1614
1647
static WRITE_LINE_DEVICE_HANDLER( m6809_data_irq )
1616
cputag_set_input_line(device->machine, "audiocpu", M6809_IRQ_LINE, state ? CLEAR_LINE : ASSERT_LINE);
1649
cputag_set_input_line(device->machine(), "audiocpu", M6809_IRQ_LINE, state ? CLEAR_LINE : ASSERT_LINE);
1619
1652
static ACIA6850_INTERFACE( m6809_acia_if )
1669
1705
tmp = auto_alloc_array(machine, UINT8, 0x8000);
1670
rom = machine->region("audiocpu")->base() + 0x8000;
1706
rom = machine.region("audiocpu")->base() + 0x8000;
1671
1707
memcpy(tmp, rom, 0x8000);
1673
1709
for (i = 0; i < 0x8000; i++)
1691
1727
init_ram(machine);
1729
state->m_bank_data[0] = 1;
1730
state->m_bank_data[1] = 0;
1731
state->m_bank_data[2] = 0;
1732
state->m_bank_data[3] = 0;
1698
1734
/* Fixed 16kB ROM region */
1699
memory_set_bankptr(machine, "bank4", machine->region("user1")->base());
1735
memory_set_bankptr(machine, "bank4", machine.region("user1")->base());
1701
1737
/* TODO: Properly sort out the data ACIA */
1738
state->m_data_r = 1;
1704
1740
/* Finish this */
1705
state_save_register_global(machine, z80_m6809_line);
1706
state_save_register_global(machine, m6809_z80_line);
1707
state_save_register_global(machine, data_r);
1708
state_save_register_global(machine, data_t);
1709
state_save_register_global(machine, h_scroll);
1710
state_save_register_global(machine, v_scroll);
1711
state_save_register_global(machine, flip_8);
1712
state_save_register_global(machine, flip_22);
1713
state_save_register_global(machine, z80_int);
1714
state_save_register_global(machine, z80_inten);
1715
state_save_register_global_array(machine, bank_data);
1716
state_save_register_global_pointer(machine, work_ram, 0xc0000);
1717
state_save_register_global_pointer(machine, video_ram, 0x20000);
1741
state_save_register_global(machine, state->m_z80_m6809_line);
1742
state_save_register_global(machine, state->m_m6809_z80_line);
1743
state_save_register_global(machine, state->m_data_r);
1744
state_save_register_global(machine, state->m_data_t);
1745
state_save_register_global(machine, state->m_h_scroll);
1746
state_save_register_global(machine, state->m_v_scroll);
1747
state_save_register_global(machine, state->m_flip_8);
1748
state_save_register_global(machine, state->m_flip_22);
1749
state_save_register_global(machine, state->m_z80_int);
1750
state_save_register_global(machine, state->m_z80_inten);
1751
state_save_register_global_array(machine, state->m_bank_data);
1752
state_save_register_global_pointer(machine, state->m_work_ram, 0xc0000);
1753
state_save_register_global_pointer(machine, state->m_video_ram, 0x20000);
1727
1763
static INTERRUPT_GEN( vblank_gen )
1730
update_irqs(device->machine);
1765
bfcobra_state *state = device->machine().driver_data<bfcobra_state>();
1766
state->m_vblank_irq = 1;
1767
update_irqs(device->machine());
1733
static MACHINE_CONFIG_START( bfcobra, driver_device )
1770
static MACHINE_CONFIG_START( bfcobra, bfcobra_state )
1734
1771
MCFG_CPU_ADD("maincpu", Z80, Z80_XTAL)
1735
1772
MCFG_CPU_PROGRAM_MAP(z80_prog_map)
1736
1773
MCFG_CPU_IO_MAP(z80_io_map)