trunk/src/mess/drivers/pc88va.c
| r19071 | r19072 | |
| 31 | 31 | #include "formats/pc_dsk.h" |
| 32 | 32 | #include "formats/xdf_dsk.h" |
| 33 | 33 | |
| 34 | /* Note: for the time being, just disable FDC CPU, it's for PC-8801 compatibility mode anyway ... */ |
| 35 | #define TEST_SUBFDC 0 |
| 36 | |
| 34 | 37 | struct tsp_t |
| 35 | 38 | { |
| 36 | 39 | UINT16 tvram_vreg_offset; |
| r19071 | r19072 | |
| 89 | 92 | DECLARE_WRITE16_MEMBER(backupram_wp_0_w); |
| 90 | 93 | DECLARE_READ8_MEMBER(hdd_status_r); |
| 91 | 94 | DECLARE_WRITE8_MEMBER(upd765_mc_w); |
| 95 | #if TEST_SUBFDC |
| 92 | 96 | DECLARE_READ8_MEMBER(upd765_tc_r); |
| 97 | #else |
| 98 | DECLARE_READ8_MEMBER(no_subfdc_r); |
| 99 | #endif |
| 93 | 100 | DECLARE_READ8_MEMBER(pc88va_fdc_r); |
| 94 | 101 | DECLARE_WRITE8_MEMBER(pc88va_fdc_w); |
| 95 | 102 | DECLARE_READ16_MEMBER(sysop_r); |
| r19071 | r19072 | |
| 956 | 963 | return 0x20; |
| 957 | 964 | } |
| 958 | 965 | |
| 966 | /* TODO: check this */ |
| 959 | 967 | WRITE8_MEMBER(pc88va_state::upd765_mc_w) |
| 960 | 968 | { |
| 961 | 969 | machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(!(data & 1)); |
| 962 | 970 | machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(!(data & 2)); |
| 963 | 971 | } |
| 964 | 972 | |
| 965 | | TIMER_CALLBACK_MEMBER(pc88va_state::pc8801fd_upd765_tc_to_zero) |
| 966 | | { |
| 967 | | machine().device<upd765a_device>("upd765")->tc_w(false); |
| 968 | | } |
| 969 | | |
| 970 | | READ8_MEMBER(pc88va_state::upd765_tc_r) |
| 971 | | { |
| 972 | | machine().device<upd765a_device>("upd765")->tc_w(true); |
| 973 | | machine().scheduler().timer_set(attotime::from_usec(50), timer_expired_delegate(FUNC(pc88va_state::pc8801fd_upd765_tc_to_zero),this)); |
| 974 | | return 0; |
| 975 | | } |
| 976 | | |
| 977 | 973 | READ8_MEMBER(pc88va_state::pc88va_fdc_r) |
| 978 | 974 | { |
| 979 | 975 | printf("%08x\n",offset); |
| r19071 | r19072 | |
| 1001 | 997 | */ |
| 1002 | 998 | case 0x00: // FDC mode register |
| 1003 | 999 | m_fdc_mode = data & 1; |
| 1000 | #if TEST_SUBFDC |
| 1004 | 1001 | machine().device("fdccpu")->execute().set_input_line(INPUT_LINE_HALT, (m_fdc_mode) ? ASSERT_LINE : CLEAR_LINE); |
| 1002 | #endif |
| 1005 | 1003 | break; |
| 1006 | 1004 | /* |
| 1007 | 1005 | --x- ---- CLK: FDC clock selection (0) 4.8MHz (1) 8 MHz |
| r19071 | r19072 | |
| 1095 | 1093 | // ... |
| 1096 | 1094 | } |
| 1097 | 1095 | |
| 1096 | #if !TEST_SUBFDC |
| 1097 | READ8_MEMBER(pc88va_state::no_subfdc_r) |
| 1098 | { |
| 1099 | return machine().rand(); |
| 1100 | } |
| 1101 | #endif |
| 1102 | |
| 1098 | 1103 | static ADDRESS_MAP_START( pc88va_io_map, AS_IO, 16, pc88va_state ) |
| 1099 | 1104 | AM_RANGE(0x0000, 0x000f) AM_READ8(key_r,0xffff) // Keyboard ROW reading |
| 1100 | 1105 | // AM_RANGE(0x0010, 0x0010) Printer / Calendar Clock Interface |
| r19071 | r19072 | |
| 1118 | 1123 | // AM_RANGE(0x00e6, 0x00e6) 8214 IRQ mask (*) |
| 1119 | 1124 | // AM_RANGE(0x00e8, 0x00e9) ? (*) |
| 1120 | 1125 | // AM_RANGE(0x00ec, 0x00ed) ? (*) |
| 1126 | #if TEST_SUBFDC |
| 1121 | 1127 | AM_RANGE(0x00fc, 0x00ff) AM_DEVREADWRITE8("d8255_2", i8255_device, read, write, 0xffff) // d8255 2, FDD |
| 1128 | #else |
| 1129 | AM_RANGE(0x00fc, 0x00ff) AM_READ8(no_subfdc_r,0xffff) AM_WRITENOP |
| 1130 | #endif |
| 1122 | 1131 | |
| 1123 | 1132 | AM_RANGE(0x0100, 0x0101) AM_READWRITE(screen_ctrl_r,screen_ctrl_w) // Screen Control Register |
| 1124 | 1133 | // AM_RANGE(0x0102, 0x0103) Graphic Screen Control Register |
| r19071 | r19072 | |
| 1169 | 1178 | // (*) are specific N88 V1 / V2 ports |
| 1170 | 1179 | |
| 1171 | 1180 | /* FDC subsytem CPU */ |
| 1181 | #if TEST_SUBFDC |
| 1172 | 1182 | static ADDRESS_MAP_START( pc88va_z80_map, AS_PROGRAM, 8, pc88va_state ) |
| 1173 | 1183 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 1174 | 1184 | AM_RANGE(0x4000, 0x7fff) AM_RAM |
| 1175 | 1185 | ADDRESS_MAP_END |
| 1176 | 1186 | |
| 1187 | TIMER_CALLBACK_MEMBER(pc88va_state::pc8801fd_upd765_tc_to_zero) |
| 1188 | { |
| 1189 | machine().device<upd765a_device>("upd765")->tc_w(false); |
| 1190 | } |
| 1191 | |
| 1192 | READ8_MEMBER(pc88va_state::upd765_tc_r) |
| 1193 | { |
| 1194 | machine().device<upd765a_device>("upd765")->tc_w(true); |
| 1195 | machine().scheduler().timer_set(attotime::from_usec(50), timer_expired_delegate(FUNC(pc88va_state::pc8801fd_upd765_tc_to_zero),this)); |
| 1196 | return 0; |
| 1197 | } |
| 1198 | |
| 1177 | 1199 | WRITE8_MEMBER(pc88va_state::fdc_irq_vector_w) |
| 1178 | 1200 | { |
| 1179 | 1201 | m_fdc_irq_opcode = data; |
| r19071 | r19072 | |
| 1187 | 1209 | AM_RANGE(0xfa, 0xfb) AM_DEVICE("upd765", upd765a_device, map ) |
| 1188 | 1210 | AM_RANGE(0xfc, 0xff) AM_DEVREADWRITE("d8255_2s", i8255_device, read, write) |
| 1189 | 1211 | ADDRESS_MAP_END |
| 1212 | #endif |
| 1190 | 1213 | |
| 1191 | | |
| 1192 | 1214 | /* TODO: active low or active high? */ |
| 1193 | 1215 | static INPUT_PORTS_START( pc88va ) |
| 1194 | 1216 | PORT_START("KEY0") |
| r19071 | r19072 | |
| 1408 | 1430 | |
| 1409 | 1431 | READ8_MEMBER(pc88va_state::cpu_8255_c_r) |
| 1410 | 1432 | { |
| 1411 | | |
| 1412 | 1433 | return m_i8255_1_pc >> 4; |
| 1413 | 1434 | } |
| 1414 | 1435 | |
| 1415 | 1436 | WRITE8_MEMBER(pc88va_state::cpu_8255_c_w) |
| 1416 | 1437 | { |
| 1417 | | |
| 1418 | 1438 | m_i8255_0_pc = data; |
| 1419 | 1439 | } |
| 1420 | 1440 | |
| r19071 | r19072 | |
| 1430 | 1450 | |
| 1431 | 1451 | READ8_MEMBER(pc88va_state::fdc_8255_c_r) |
| 1432 | 1452 | { |
| 1433 | | |
| 1434 | 1453 | return m_i8255_0_pc >> 4; |
| 1435 | 1454 | } |
| 1436 | 1455 | |
| 1437 | 1456 | WRITE8_MEMBER(pc88va_state::fdc_8255_c_w) |
| 1438 | 1457 | { |
| 1439 | | |
| 1440 | 1458 | m_i8255_1_pc = data; |
| 1441 | 1459 | } |
| 1442 | 1460 | |
| r19071 | r19072 | |
| 1567 | 1585 | m_fdc_mode = 0; |
| 1568 | 1586 | m_fdc_irq_opcode = 0x00; //0x7f ld a,a ! |
| 1569 | 1587 | |
| 1588 | #if TEST_SUBFDC |
| 1570 | 1589 | machine().device("fdccpu")->execute().set_input_line_vector(0, 0); |
| 1590 | #endif |
| 1571 | 1591 | } |
| 1572 | 1592 | |
| 1573 | 1593 | INTERRUPT_GEN_MEMBER(pc88va_state::pc88va_vrtc_irq) |
| r19071 | r19072 | |
| 1645 | 1665 | MCFG_CPU_IO_MAP(pc88va_io_map) |
| 1646 | 1666 | MCFG_CPU_VBLANK_INT_DRIVER("screen", pc88va_state, pc88va_vrtc_irq) |
| 1647 | 1667 | |
| 1668 | #if TEST_SUBFDC |
| 1648 | 1669 | MCFG_CPU_ADD("fdccpu", Z80, 8000000) /* 8 MHz */ |
| 1649 | 1670 | MCFG_CPU_PROGRAM_MAP(pc88va_z80_map) |
| 1650 | 1671 | MCFG_CPU_IO_MAP(pc88va_z80_io_map) |
| 1651 | 1672 | |
| 1652 | 1673 | MCFG_QUANTUM_PERFECT_CPU("maincpu") |
| 1674 | #endif |
| 1653 | 1675 | |
| 1654 | 1676 | MCFG_SCREEN_ADD("screen", RASTER) |
| 1655 | 1677 | MCFG_SCREEN_REFRESH_RATE(60) |
| r19071 | r19072 | |
| 1661 | 1683 | // MCFG_PALETTE_INIT_OVERRIDE(pc88va_state, pc8801 ) |
| 1662 | 1684 | MCFG_GFXDECODE( pc88va ) |
| 1663 | 1685 | |
| 1664 | | |
| 1665 | | |
| 1666 | 1686 | MCFG_I8255_ADD( "d8255_2", master_fdd_intf ) |
| 1667 | 1687 | MCFG_I8255_ADD( "d8255_3", r232c_ctrl_intf ) |
| 1668 | 1688 | |