trunk/src/mess/drivers/pc88va.c
| r19144 | r19145 | |
| 61 | 61 | public: |
| 62 | 62 | pc88va_state(const machine_config &mconfig, device_type type, const char *tag) |
| 63 | 63 | : driver_device(mconfig, type, tag) , |
| 64 | m_maincpu(*this, "maincpu"), |
| 64 | 65 | m_fdc(*this, "upd765"), |
| 65 | 66 | m_dmac(*this, "dmac"), |
| 66 | 67 | m_palram(*this, "palram"){ } |
| 67 | 68 | |
| 69 | required_device<cpu_device> m_maincpu; |
| 68 | 70 | required_device<upd765a_device> m_fdc; |
| 69 | 71 | required_device<upd71071_device> m_dmac; |
| 70 | 72 | required_shared_ptr<UINT16> m_palram; |
| r19144 | r19145 | |
| 80 | 82 | UINT8 m_buf_index; |
| 81 | 83 | UINT8 m_buf_ram[16]; |
| 82 | 84 | UINT8 m_portc_test; |
| 85 | UINT8 m_fdc_motor_status[2]; |
| 83 | 86 | |
| 84 | 87 | /* floppy state */ |
| 85 | 88 | UINT8 m_i8255_0_pc; |
| r19144 | r19145 | |
| 100 | 103 | DECLARE_WRITE16_MEMBER(backupram_wp_1_w); |
| 101 | 104 | DECLARE_WRITE16_MEMBER(backupram_wp_0_w); |
| 102 | 105 | DECLARE_READ8_MEMBER(hdd_status_r); |
| 103 | | DECLARE_WRITE8_MEMBER(upd765_mc_w); |
| 104 | 106 | #if TEST_SUBFDC |
| 105 | 107 | DECLARE_READ8_MEMBER(upd765_tc_r); |
| 108 | DECLARE_WRITE8_MEMBER(upd765_mc_w); |
| 106 | 109 | #else |
| 107 | 110 | DECLARE_READ8_MEMBER(no_subfdc_r); |
| 108 | 111 | #endif |
| r19144 | r19145 | |
| 139 | 142 | // DECLARE_WRITE_LINE_MEMBER(pc88va_upd765_interrupt); |
| 140 | 143 | UINT8 m_fdc_ctrl_2; |
| 141 | 144 | TIMER_CALLBACK_MEMBER(pc88va_fdc_timer); |
| 145 | TIMER_CALLBACK_MEMBER(pc88va_fdc_motor_start_0); |
| 146 | TIMER_CALLBACK_MEMBER(pc88va_fdc_motor_start_1); |
| 142 | 147 | // UINT16 m_fdc_dma_r(running_machine &machine); |
| 143 | 148 | // void m_fdc_dma_w(running_machine &machine, UINT16 data); |
| 149 | DECLARE_WRITE_LINE_MEMBER(pc88va_hlda_w); |
| 144 | 150 | DECLARE_WRITE_LINE_MEMBER(pc88va_tc_w); |
| 145 | 151 | |
| 146 | 152 | void fdc_irq(bool state); |
| r19144 | r19145 | |
| 979 | 985 | return 0x20; |
| 980 | 986 | } |
| 981 | 987 | |
| 982 | | /* TODO: check this */ |
| 983 | | WRITE8_MEMBER(pc88va_state::upd765_mc_w) |
| 984 | | { |
| 985 | | machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(!(data & 1)); |
| 986 | | machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(!(data & 2)); |
| 987 | | } |
| 988 | | |
| 989 | 988 | READ8_MEMBER(pc88va_state::pc88va_fdc_r) |
| 990 | 989 | { |
| 991 | 990 | printf("%08x\n",offset); |
| r19144 | r19145 | |
| 1012 | 1011 | } |
| 1013 | 1012 | } |
| 1014 | 1013 | |
| 1014 | TIMER_CALLBACK_MEMBER(pc88va_state::pc88va_fdc_motor_start_0) |
| 1015 | { |
| 1016 | machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(0); |
| 1017 | m_fdc_motor_status[0] = 1; |
| 1018 | } |
| 1019 | |
| 1020 | TIMER_CALLBACK_MEMBER(pc88va_state::pc88va_fdc_motor_start_1) |
| 1021 | { |
| 1022 | machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(0); |
| 1023 | m_fdc_motor_status[1] = 1; |
| 1024 | } |
| 1025 | |
| 1015 | 1026 | WRITE8_MEMBER(pc88va_state::pc88va_fdc_w) |
| 1016 | 1027 | { |
| 1017 | 1028 | printf("%08x %02x\n",offset<<1,data); |
| r19144 | r19145 | |
| 1037 | 1048 | machine().device<floppy_connector>("upd765:1")->get_device()->set_rpm(data & 0x02 ? 360 : 300); |
| 1038 | 1049 | |
| 1039 | 1050 | machine().device<upd765a_device>("upd765")->set_rate(data & 0x20 ? 500000 : 250000); |
| 1040 | | /* Temporary hack */ |
| 1041 | | machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(0); |
| 1042 | | machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(0); |
| 1043 | | |
| 1044 | 1051 | break; |
| 1045 | 1052 | /* |
| 1046 | 1053 | ---- x--- PCM: ? |
| 1047 | | ---- --xx M1/M0: Drive 1/0 motor control (0) Motor OFF (1) Motor ON |
| 1054 | ---- --xx M1/M0: Drive 1/0 motor control (0) NOP (1) Change motor status |
| 1048 | 1055 | */ |
| 1049 | | case 0x04: upd765_mc_w(space,0,data); break; |
| 1056 | case 0x04: |
| 1057 | if(data & 1) |
| 1058 | { |
| 1059 | machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(1); |
| 1060 | if(m_fdc_motor_status[0] == 0) |
| 1061 | machine().scheduler().timer_set(attotime::from_msec(505), timer_expired_delegate(FUNC(pc88va_state::pc88va_fdc_motor_start_0),this)); |
| 1062 | else |
| 1063 | m_fdc_motor_status[0] = 0; |
| 1064 | } |
| 1065 | |
| 1066 | if(data & 2) |
| 1067 | { |
| 1068 | machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(1); |
| 1069 | if(m_fdc_motor_status[1] == 0) |
| 1070 | machine().scheduler().timer_set(attotime::from_msec(505), timer_expired_delegate(FUNC(pc88va_state::pc88va_fdc_motor_start_1),this)); |
| 1071 | else |
| 1072 | m_fdc_motor_status[1] = 0; |
| 1073 | } |
| 1074 | |
| 1075 | break; |
| 1050 | 1076 | /* |
| 1051 | 1077 | x--- ---- FDCRST: FDC Reset |
| 1052 | 1078 | -xx- ---- FDCFRY FRYCEN: FDC force ready control |
| r19144 | r19145 | |
| 1246 | 1272 | m_fdc_irq_opcode = data; |
| 1247 | 1273 | } |
| 1248 | 1274 | |
| 1275 | WRITE8_MEMBER(pc88va_state::upd765_mc_w) |
| 1276 | { |
| 1277 | machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(!(data & 1)); |
| 1278 | machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(!(data & 2)); |
| 1279 | } |
| 1280 | |
| 1249 | 1281 | static ADDRESS_MAP_START( pc88va_z80_io_map, AS_IO, 8, pc88va_state ) |
| 1250 | 1282 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 1251 | 1283 | AM_RANGE(0xf0, 0xf0) AM_WRITE(fdc_irq_vector_w) // Interrupt Opcode Port |
| r19144 | r19145 | |
| 1638 | 1670 | #if TEST_SUBFDC |
| 1639 | 1671 | machine().device("fdccpu")->execute().set_input_line_vector(0, 0); |
| 1640 | 1672 | #endif |
| 1673 | |
| 1674 | m_fdc_motor_status[0] = 0; |
| 1675 | m_fdc_motor_status[1] = 0; |
| 1641 | 1676 | } |
| 1642 | 1677 | |
| 1643 | 1678 | INTERRUPT_GEN_MEMBER(pc88va_state::pc88va_vrtc_irq) |
| r19144 | r19145 | |
| 1714 | 1749 | DEVCB_NULL |
| 1715 | 1750 | }; |
| 1716 | 1751 | |
| 1752 | WRITE_LINE_MEMBER(pc88va_state::pc88va_hlda_w) |
| 1753 | { |
| 1754 | m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); |
| 1755 | |
| 1756 | // m_dmac->hack_w(state); |
| 1757 | |
| 1758 | // printf("%02x HLDA\n",state); |
| 1759 | } |
| 1760 | |
| 1717 | 1761 | WRITE_LINE_MEMBER( pc88va_state::pc88va_tc_w ) |
| 1718 | 1762 | { |
| 1719 | 1763 | /* floppy terminal count */ |
| r19144 | r19145 | |
| 1743 | 1787 | { |
| 1744 | 1788 | "maincpu", |
| 1745 | 1789 | 8000000, |
| 1746 | | DEVCB_NULL, |
| 1790 | DEVCB_DRIVER_LINE_MEMBER(pc88va_state, pc88va_hlda_w), |
| 1747 | 1791 | DEVCB_DRIVER_LINE_MEMBER(pc88va_state, pc88va_tc_w), |
| 1748 | 1792 | { 0, 0, m_fdc_dma_r, 0 }, |
| 1749 | 1793 | { 0, 0, m_fdc_dma_w, 0 }, |