trunk/src/mess/machine/comx_fd.c
| r19474 | r19475 | |
| 94 | 94 | SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) |
| 95 | 95 | SLOT_INTERFACE_END |
| 96 | 96 | |
| 97 | | void comx_fd_device::intrq_w(bool state) |
| 98 | | { |
| 99 | | m_intrq = state; |
| 100 | | } |
| 101 | 97 | |
| 102 | | void comx_fd_device::drq_w(bool state) |
| 103 | | { |
| 104 | | m_drq = state; |
| 105 | | } |
| 106 | | |
| 107 | | |
| 108 | 98 | //------------------------------------------------- |
| 109 | 99 | // MACHINE_CONFIG_FRAGMENT( comx_fd ) |
| 110 | 100 | //------------------------------------------------- |
| r19474 | r19475 | |
| 143 | 133 | m_fdc(*this, WD1770_TAG), |
| 144 | 134 | m_floppy0(*this, WD1770_TAG":0"), |
| 145 | 135 | m_floppy1(*this, WD1770_TAG":1"), |
| 146 | | m_ds(0), |
| 147 | 136 | m_q(0), |
| 148 | 137 | m_addr(0), |
| 149 | | m_intrq(0), |
| 150 | | m_drq(0), |
| 151 | 138 | m_disb(1) |
| 152 | 139 | { |
| 153 | 140 | } |
| r19474 | r19475 | |
| 163 | 150 | m_rom = memregion("c000")->base(); |
| 164 | 151 | |
| 165 | 152 | // initialize floppy controller |
| 166 | | m_fdc->setup_intrq_cb(wd_fdc_t::line_cb(FUNC(comx_fd_device::intrq_w), this)); |
| 167 | | m_fdc->setup_drq_cb(wd_fdc_t::line_cb(FUNC(comx_fd_device::drq_w), this)); |
| 168 | 153 | m_fdc->dden_w(1); |
| 169 | 154 | |
| 170 | 155 | // state saving |
| 171 | 156 | save_item(NAME(m_ds)); |
| 172 | 157 | save_item(NAME(m_q)); |
| 173 | 158 | save_item(NAME(m_addr)); |
| 174 | | save_item(NAME(m_intrq)); |
| 175 | | save_item(NAME(m_drq)); |
| 176 | 159 | save_item(NAME(m_disb)); |
| 177 | 160 | } |
| 178 | 161 | |
| r19474 | r19475 | |
| 183 | 166 | |
| 184 | 167 | void comx_fd_device::device_reset() |
| 185 | 168 | { |
| 169 | m_fdc->set_floppy(NULL); |
| 186 | 170 | m_fdc->reset(); |
| 171 | |
| 172 | m_addr = 0; |
| 173 | m_disb = 1; |
| 187 | 174 | } |
| 188 | 175 | |
| 189 | 176 | |
| r19474 | r19475 | |
| 197 | 184 | |
| 198 | 185 | if (m_ds && !m_disb) |
| 199 | 186 | { |
| 200 | | state = m_drq ? ASSERT_LINE : CLEAR_LINE; |
| 187 | state = !m_fdc->drq_r(); |
| 201 | 188 | } |
| 202 | 189 | |
| 203 | 190 | return state; |
| r19474 | r19475 | |
| 248 | 235 | { |
| 249 | 236 | if (m_q) |
| 250 | 237 | { |
| 251 | | data = m_intrq ? 1 : 0; |
| 238 | data = 0xfe | m_fdc->intrq_r(); |
| 239 | logerror("%s FDC intrq read %02x\n", machine().describe_context(), data); |
| 252 | 240 | } |
| 253 | 241 | else |
| 254 | 242 | { |
| 255 | 243 | data = m_fdc->gen_r(m_addr); |
| 244 | logerror("%s FDC read %u:%02x\n", machine().describe_context(), m_addr,data); |
| 256 | 245 | } |
| 257 | 246 | } |
| 258 | 247 | |
trunk/src/mess/machine/comx_fd.h
| r19474 | r19475 | |
| 37 | 37 | virtual const rom_entry *device_rom_region() const; |
| 38 | 38 | virtual machine_config_constructor device_mconfig_additions() const; |
| 39 | 39 | |
| 40 | | // not really public |
| 41 | | void intrq_w(bool state); |
| 42 | | void drq_w(bool state); |
| 43 | | |
| 44 | 40 | DECLARE_FLOPPY_FORMATS( floppy_formats ); |
| 45 | 41 | |
| 46 | 42 | protected: |
| 47 | 43 | // device-level overrides |
| 44 | virtual void device_config_complete() { m_shortname = "comx_fd"; } |
| 48 | 45 | virtual void device_start(); |
| 49 | 46 | virtual void device_reset(); |
| 50 | | virtual void device_config_complete() { m_shortname = "comx_fd"; } |
| 51 | 47 | |
| 52 | 48 | // device_comx_expansion_card_interface overrides |
| 53 | 49 | virtual int comx_ef4_r(); |
| r19474 | r19475 | |
| 57 | 53 | virtual void comx_io_w(address_space &space, offs_t offset, UINT8 data); |
| 58 | 54 | |
| 59 | 55 | private: |
| 60 | | inline void update_ef4(); |
| 61 | | |
| 62 | 56 | // internal state |
| 63 | 57 | required_device<wd1770_t> m_fdc; |
| 64 | 58 | required_device<floppy_connector> m_floppy0; |
| 65 | 59 | required_device<floppy_connector> m_floppy1; |
| 66 | 60 | |
| 67 | 61 | // floppy state |
| 68 | | int m_ds; // device select |
| 69 | | UINT8 *m_rom; |
| 62 | const UINT8 *m_rom; |
| 70 | 63 | int m_q; // FDC register select |
| 71 | 64 | int m_addr; // FDC address |
| 72 | | bool m_intrq; // interrupt request |
| 73 | | bool m_drq; // data request |
| 74 | 65 | int m_disb; // data request disable |
| 75 | 66 | }; |
| 76 | 67 | |
trunk/src/mess/drivers/comx35.c
| r19474 | r19475 | |
| 251 | 251 | |
| 252 | 252 | void comx35_state::check_interrupt() |
| 253 | 253 | { |
| 254 | | m_maincpu->set_input_line(COSMAC_INPUT_LINE_INT, m_cr1 | m_int); |
| 254 | m_maincpu->set_input_line(COSMAC_INPUT_LINE_INT, m_cr1 || m_int); |
| 255 | 255 | } |
| 256 | 256 | |
| 257 | 257 | READ_LINE_MEMBER( comx35_state::clear_r ) |
| r19474 | r19475 | |
| 457 | 457 | { |
| 458 | 458 | // clear the RAM since DOS card will go crazy if RAM is not all zeroes |
| 459 | 459 | UINT8 *ram = m_ram->pointer(); |
| 460 | | memset(ram, 0, 0x8000); |
| 460 | memset(ram, 0, m_ram->size()); |
| 461 | 461 | |
| 462 | 462 | // find memory regions |
| 463 | 463 | m_rom = memregion(CDP1802_TAG)->base(); |