src/mess/drivers/newbrain.c
| r2804 | r2805 | |
| 1 | 1 | #include "driver.h" |
| 2 | #include "deprecat.h" |
| 2 | 3 | #include "cpu/z80/z80daisy.h" |
| 3 | 4 | #include "cpu/cop400/cop400.h" |
| 4 | 5 | #include "machine/nec765.h" |
| r2804 | r2805 | |
| 25 | 26 | NEC 765AC @ 4 MHz (418) |
| 26 | 27 | MC6850 ACIA (459) |
| 27 | 28 | Z80CTC (458) |
| 29 | ADC0809 (427) |
| 28 | 30 | |
| 29 | 31 | */ |
| 30 | 32 | |
| r2804 | r2805 | |
| 36 | 38 | - main z80 interrupt from COP420 |
| 37 | 39 | - video |
| 38 | 40 | - tape |
| 41 | - layout for the 16-segment displays |
| 39 | 42 | |
| 40 | 43 | - floppy disc controller |
| 41 | 44 | - CP/M 2.2 |
| r2804 | r2805 | |
| 79 | 82 | */ |
| 80 | 83 | |
| 81 | 84 | // _Z80INT = ((_CLK | _CLKINT) & _COPINT) |
| 85 | |
| 86 | cpunum_set_input_line(machine, 0, INPUT_LINE_IRQ0, BIT(data, 0) ? HOLD_LINE : CLEAR_LINE); |
| 82 | 87 | } |
| 83 | 88 | |
| 84 | 89 | static READ8_HANDLER( newbrain_cop_g_r ) |
| r2804 | r2805 | |
| 99 | 104 | return (BIT(state->keydata, 3) << 3) | (BIT(state->keydata, 0) << 2) | (BIT(state->keydata, 1) << 1); |
| 100 | 105 | } |
| 101 | 106 | |
| 102 | | static READ8_HANDLER( newbrain_cop_d_r ) |
| 103 | | { |
| 104 | | /* |
| 105 | | |
| 106 | | bit description |
| 107 | | |
| 108 | | D0 inverted to K4 |
| 109 | | D1 TDO |
| 110 | | D2 inverted to K6 |
| 111 | | D3 |
| 112 | | |
| 113 | | */ |
| 114 | | |
| 115 | | return 0; |
| 116 | | } |
| 117 | | |
| 118 | 107 | static WRITE8_HANDLER( newbrain_cop_d_w ) |
| 119 | 108 | { |
| 120 | 109 | /* |
| r2804 | r2805 | |
| 135 | 124 | state->keylatch = 0; |
| 136 | 125 | } |
| 137 | 126 | |
| 127 | state->cop_tdo = BIT(data, 1); |
| 128 | |
| 138 | 129 | if (!BIT(data, 2)) |
| 139 | 130 | { |
| 140 | 131 | char port[4]; |
| r2804 | r2805 | |
| 149 | 140 | sprintf(port, "D%d", state->keylatch); |
| 150 | 141 | |
| 151 | 142 | state->keydata = input_port_read(machine, port); |
| 143 | |
| 144 | output_set_digit_value(state->keylatch, state->segment_data[state->keylatch]); |
| 152 | 145 | } |
| 153 | 146 | } |
| 154 | 147 | |
| r2804 | r2805 | |
| 167 | 160 | |
| 168 | 161 | newbrain_state *state = machine->driver_data; |
| 169 | 162 | |
| 170 | | return BIT(state->keydata, 2); |
| 163 | return (state->cop_rd << 3) | (state->cop_access << 2) | (state->cop_rd << 1) | BIT(state->keydata, 2); |
| 171 | 164 | } |
| 172 | 165 | |
| 173 | 166 | static WRITE8_HANDLER( newbrain_cop_so_w ) |
| 174 | 167 | { |
| 175 | 168 | // connected to K1 |
| 169 | |
| 170 | newbrain_state *state = machine->driver_data; |
| 171 | |
| 172 | state->cop_so = data; |
| 176 | 173 | } |
| 177 | 174 | |
| 178 | 175 | static WRITE8_HANDLER( newbrain_cop_sk_w ) |
| 179 | 176 | { |
| 180 | 177 | // connected to K2 |
| 178 | |
| 179 | newbrain_state *state = machine->driver_data; |
| 180 | |
| 181 | state->segment_data[state->keylatch] >>= 1; |
| 182 | state->segment_data[state->keylatch] = (state->cop_so << 15) | (state->segment_data[state->keylatch] & 0x7fff); |
| 181 | 183 | } |
| 182 | 184 | |
| 183 | 185 | static READ8_HANDLER( newbrain_cop_si_r ) |
| 184 | 186 | { |
| 185 | 187 | // connected to TDI |
| 186 | 188 | |
| 187 | | return 0; |
| 189 | newbrain_state *state = machine->driver_data; |
| 190 | |
| 191 | return state->cop_tdi; |
| 188 | 192 | } |
| 189 | 193 | |
| 190 | 194 | #ifdef UNUSED_CODE |
| r2804 | r2805 | |
| 231 | 235 | nec765_set_tc_state(BIT(data, 2)); |
| 232 | 236 | } |
| 233 | 237 | |
| 238 | static READ8_HANDLER( fdc_io3_r ) |
| 239 | { |
| 240 | /* |
| 241 | |
| 242 | bit description |
| 243 | |
| 244 | 0 |
| 245 | 1 |
| 246 | 2 |
| 247 | 3 |
| 248 | 4 |
| 249 | 5 FDC INT |
| 250 | 6 PAGING |
| 251 | 7 FDC ATT |
| 252 | |
| 253 | */ |
| 254 | |
| 255 | newbrain_state *state = machine->driver_data; |
| 256 | |
| 257 | return state->fdc_int << 5; |
| 258 | } |
| 259 | |
| 234 | 260 | static WRITE8_HANDLER( io_w ) |
| 235 | 261 | { |
| 236 | 262 | /* |
| r2804 | r2805 | |
| 268 | 294 | static ADDRESS_MAP_START( newbrain_cop_io_map, ADDRESS_SPACE_IO, 8 ) |
| 269 | 295 | AM_RANGE(COP400_PORT_L, COP400_PORT_L) AM_READWRITE(newbrain_cop_l_r, newbrain_cop_l_w) |
| 270 | 296 | AM_RANGE(COP400_PORT_G, COP400_PORT_G) AM_READWRITE(newbrain_cop_g_r, newbrain_cop_g_w) |
| 271 | | AM_RANGE(COP400_PORT_D, COP400_PORT_D) AM_READWRITE(newbrain_cop_d_r, newbrain_cop_d_w) |
| 297 | AM_RANGE(COP400_PORT_D, COP400_PORT_D) AM_WRITE(newbrain_cop_d_w) |
| 272 | 298 | AM_RANGE(COP400_PORT_IN, COP400_PORT_IN) AM_READ(newbrain_cop_in_r) |
| 273 | 299 | AM_RANGE(COP400_PORT_SK, COP400_PORT_SK) AM_WRITE(newbrain_cop_sk_w) |
| 274 | 300 | AM_RANGE(COP400_PORT_SIO, COP400_PORT_SIO) AM_READWRITE(newbrain_cop_si_r, newbrain_cop_so_w) |
| r2804 | r2805 | |
| 418 | 444 | |
| 419 | 445 | static void newbrain_fdc_interrupt(int state) |
| 420 | 446 | { |
| 447 | newbrain_state *driver_state = Machine->driver_data; |
| 448 | |
| 449 | driver_state->fdc_int = state; |
| 421 | 450 | } |
| 422 | 451 | |
| 423 | 452 | static const struct nec765_interface newbrain_nec765_interface = |
| r2804 | r2805 | |
| 426 | 455 | NULL |
| 427 | 456 | }; |
| 428 | 457 | |
| 429 | | MACHINE_START( newbrain ) |
| 458 | static MACHINE_START( newbrain ) |
| 430 | 459 | { |
| 431 | 460 | nec765_init(&newbrain_nec765_interface, NEC765A, NEC765_RDY_PIN_NOT_CONNECTED); |
| 432 | 461 | acia6850_config(0, &newbrain_acia_intf); |
| 433 | 462 | } |
| 434 | 463 | |
| 435 | | MACHINE_RESET( newbrain ) |
| 464 | static MACHINE_RESET( newbrain ) |
| 436 | 465 | { |
| 437 | 466 | } |
| 438 | 467 | |
| r2804 | r2805 | |
| 442 | 471 | { 0, 0, 0, 0, -1 } |
| 443 | 472 | }; |
| 444 | 473 | |
| 474 | static INTERRUPT_GEN( newbrain_interrupt ) |
| 475 | { |
| 476 | cpunum_set_input_line(machine, 0, INPUT_LINE_IRQ0, HOLD_LINE); |
| 477 | } |
| 478 | |
| 445 | 479 | /* Machine Drivers */ |
| 446 | 480 | |
| 447 | 481 | static MACHINE_DRIVER_START( newbrain ) |
| r2804 | r2805 | |
| 452 | 486 | MDRV_CPU_ADD_TAG("main", Z80, XTAL_16MHz/8) |
| 453 | 487 | MDRV_CPU_PROGRAM_MAP(newbrain_map, 0) |
| 454 | 488 | MDRV_CPU_IO_MAP(newbrain_io_map, 0) |
| 489 | MDRV_CPU_VBLANK_INT("main", newbrain_interrupt) |
| 455 | 490 | |
| 456 | 491 | MDRV_CPU_ADD_TAG("cop", COP420, XTAL_16MHz/8) |
| 457 | 492 | MDRV_CPU_PROGRAM_MAP(newbrain_cop_map, 0) |
| r2804 | r2805 | |
| 495 | 530 | ROM_SYSTEM_BIOS( 0, "default", "ROM 2.0" ) |
| 496 | 531 | ROMX_LOAD( "aben20.rom", 0xa000, 0x2000, CRC(3d76d0c8) SHA1(753b4530a518ad832e4b81c4e5430355ba3f62e0), ROM_BIOS(1) ) |
| 497 | 532 | ROMX_LOAD( "cd20tci.rom", 0xc000, 0x4000, CRC(f65b2350) SHA1(1ada7fbf207809537ec1ffb69808524300622ada), ROM_BIOS(1) ) |
| 498 | | |
| 499 | 533 | ROM_SYSTEM_BIOS( 1, "rom191", "ROM 1.91" ) |
| 500 | 534 | ROMX_LOAD( "aben191.rom", 0xa000, 0x2000, CRC(b7be8d89) SHA1(cce8d0ae7aa40245907ea38b7956c62d039d45b7), ROM_BIOS(2) ) |
| 501 | 535 | ROMX_LOAD( "cd.rom", 0xc000, 0x2000, CRC(6b4d9429) SHA1(ef688be4e75aced61f487c928258c8932a0ae00a), ROM_BIOS(2) ) |
| 502 | 536 | ROMX_LOAD( "ef1x.rom", 0xe000, 0x2000, CRC(20dd0b49) SHA1(74b517ca223cefb588e9f49e72ff2d4f1627efc6), ROM_BIOS(2) ) |
| 503 | | |
| 504 | 537 | ROM_SYSTEM_BIOS( 2, "rom19", "ROM 1.9" ) |
| 505 | 538 | ROMX_LOAD( "aben19.rom", 0xa000, 0x2000, CRC(d0283eb1) SHA1(351d248e69a77fa552c2584049006911fb381ff0), ROM_BIOS(3) ) |
| 506 | 539 | ROMX_LOAD( "cd.rom", 0xc000, 0x2000, CRC(6b4d9429) SHA1(ef688be4e75aced61f487c928258c8932a0ae00a), ROM_BIOS(3) ) |
| 507 | 540 | ROMX_LOAD( "ef1x.rom", 0xe000, 0x2000, CRC(20dd0b49) SHA1(74b517ca223cefb588e9f49e72ff2d4f1627efc6), ROM_BIOS(3) ) |
| 508 | | |
| 509 | 541 | ROM_SYSTEM_BIOS( 3, "rom14", "ROM 1.4" ) |
| 510 | 542 | ROMX_LOAD( "aben14.rom", 0xa000, 0x2000, CRC(d0283eb1) SHA1(351d248e69a77fa552c2584049006911fb381ff0), ROM_BIOS(4) ) |
| 511 | 543 | ROMX_LOAD( "cd.rom", 0xc000, 0x2000, CRC(6b4d9429) SHA1(ef688be4e75aced61f487c928258c8932a0ae00a), ROM_BIOS(4) ) |