trunk/src/emu/bus/ql/sandy_superdisk.c
| r30800 | r30801 | |
| 18 | 18 | //************************************************************************** |
| 19 | 19 | |
| 20 | 20 | #define WD1772_TAG "wd1772" |
| 21 | #define TTL74273_TAG "ttl74273" |
| 21 | 22 | #define CENTRONICS_TAG "centronics" |
| 22 | 23 | |
| 23 | 24 | |
| r30800 | r30801 | |
| 68 | 69 | |
| 69 | 70 | |
| 70 | 71 | //------------------------------------------------- |
| 72 | // centronics |
| 73 | //------------------------------------------------- |
| 74 | |
| 75 | WRITE_LINE_MEMBER( sandy_super_disk_t::busy_w ) |
| 76 | { |
| 77 | m_busy = state; |
| 78 | check_interrupt(); |
| 79 | } |
| 80 | |
| 81 | |
| 82 | //------------------------------------------------- |
| 71 | 83 | // MACHINE_CONFIG_FRAGMENT( sandy_super_disk ) |
| 72 | 84 | //------------------------------------------------- |
| 73 | 85 | |
| 74 | 86 | static MACHINE_CONFIG_FRAGMENT( sandy_super_disk ) |
| 75 | 87 | MCFG_DEVICE_ADD(WD1772_TAG, WD1772x, 8000000) |
| 76 | | //MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(sandy_super_disk_t, fdc_intrq_w)) |
| 77 | | //MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(sandy_super_disk_t, fdc_drq_w)) |
| 78 | 88 | MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":0", sandy_super_disk_floppies, "35dd", sandy_super_disk_t::floppy_formats) |
| 79 | 89 | MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":1", sandy_super_disk_floppies, NULL, sandy_super_disk_t::floppy_formats) |
| 80 | 90 | |
| 81 | 91 | MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_printers, "printer") |
| 92 | MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(sandy_super_disk_t, busy_w)) |
| 93 | MCFG_CENTRONICS_OUTPUT_LATCH_ADD(TTL74273_TAG, CENTRONICS_TAG) |
| 82 | 94 | MACHINE_CONFIG_END |
| 83 | 95 | |
| 84 | 96 | |
| r30800 | r30801 | |
| 105 | 117 | sandy_super_disk_t::sandy_super_disk_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 106 | 118 | device_t(mconfig, SANDY_SUPER_DISK, "Sandy Super Disk", tag, owner, clock, "sandy_super_disk", __FILE__), |
| 107 | 119 | device_ql_expansion_card_interface(mconfig, *this), |
| 120 | m_fdc(*this, WD1772_TAG), |
| 121 | m_floppy0(*this, WD1772_TAG":0"), |
| 122 | m_floppy1(*this, WD1772_TAG":1"), |
| 123 | m_centronics(*this, CENTRONICS_TAG), |
| 124 | m_latch(*this, TTL74273_TAG), |
| 108 | 125 | m_rom(*this, "rom"), |
| 109 | | m_ram(*this, "ram") |
| 126 | m_busy(1) |
| 110 | 127 | { |
| 111 | 128 | } |
| 112 | 129 | |
| r30800 | r30801 | |
| 126 | 143 | |
| 127 | 144 | void sandy_super_disk_t::device_reset() |
| 128 | 145 | { |
| 146 | m_fdc->reset(); |
| 147 | m_fdc->set_floppy(NULL); |
| 148 | m_fdc->dden_w(0); |
| 149 | |
| 150 | m_latch->write(0); |
| 151 | m_centronics->write_strobe(1); |
| 129 | 152 | } |
| 130 | 153 | |
| 131 | 154 | |
| r30800 | r30801 | |
| 135 | 158 | |
| 136 | 159 | UINT8 sandy_super_disk_t::read(address_space &space, offs_t offset, UINT8 data) |
| 137 | 160 | { |
| 161 | if ((offset & 0xf0000) == 0xc0000) |
| 162 | { |
| 163 | if ((offset & 0xffc0) == 0x3fc0) |
| 164 | { |
| 165 | switch ((offset >> 2) & 0x03) |
| 166 | { |
| 167 | case 0: |
| 168 | data = m_fdc->read(space, offset & 0x03); |
| 169 | break; |
| 170 | |
| 171 | case 3: |
| 172 | /* |
| 173 | |
| 174 | bit description |
| 175 | |
| 176 | 0 BUSY |
| 177 | 1 |
| 178 | 2 |
| 179 | 3 |
| 180 | 4 |
| 181 | 5 |
| 182 | 6 |
| 183 | 7 |
| 184 | |
| 185 | */ |
| 186 | |
| 187 | data = m_busy; |
| 188 | break; |
| 189 | } |
| 190 | } |
| 191 | else |
| 192 | { |
| 193 | data = m_rom->base()[offset & 0x3fff]; |
| 194 | } |
| 195 | } |
| 196 | |
| 138 | 197 | return data; |
| 139 | 198 | } |
| 140 | 199 | |
| r30800 | r30801 | |
| 145 | 204 | |
| 146 | 205 | void sandy_super_disk_t::write(address_space &space, offs_t offset, UINT8 data) |
| 147 | 206 | { |
| 207 | if ((offset & 0xf0000) == 0xc0000) |
| 208 | { |
| 209 | if ((offset & 0xffc0) == 0x3fc0) |
| 210 | { |
| 211 | switch ((offset >> 2) & 0x03) |
| 212 | { |
| 213 | case 0: |
| 214 | m_fdc->write(space, offset & 0x03, data); |
| 215 | break; |
| 216 | |
| 217 | case 1: |
| 218 | { |
| 219 | /* |
| 220 | |
| 221 | bit description |
| 222 | |
| 223 | 0 SIDE ONE |
| 224 | 1 DSEL0 |
| 225 | 2 DSEL1 |
| 226 | 3 M ON0 |
| 227 | 4 /DDEN |
| 228 | 5 STROBE inverted |
| 229 | 6 enable printer interrupt |
| 230 | 7 |
| 231 | |
| 232 | */ |
| 233 | |
| 234 | floppy_image_device *floppy = NULL; |
| 235 | |
| 236 | if (BIT(data, 1)) |
| 237 | { |
| 238 | floppy = m_floppy0->get_device(); |
| 239 | } |
| 240 | else if (BIT(data, 2)) |
| 241 | { |
| 242 | floppy = m_floppy1->get_device(); |
| 243 | } |
| 244 | |
| 245 | m_fdc->set_floppy(floppy); |
| 246 | |
| 247 | if (floppy) |
| 248 | { |
| 249 | floppy->ss_w(BIT(data, 0)); |
| 250 | floppy->mon_w(BIT(data, 3)); |
| 251 | } |
| 252 | |
| 253 | m_fdc->dden_w(BIT(data, 4)); |
| 254 | |
| 255 | m_centronics->write_strobe(!BIT(data, 5)); |
| 256 | |
| 257 | m_fd6 = BIT(data, 6); |
| 258 | check_interrupt(); |
| 259 | } |
| 260 | break; |
| 261 | |
| 262 | case 2: |
| 263 | m_latch->write(data); |
| 264 | break; |
| 265 | } |
| 266 | } |
| 267 | } |
| 148 | 268 | } |
| 269 | |
| 270 | void sandy_super_disk_t::check_interrupt() |
| 271 | { |
| 272 | int extint = m_fd6 && m_busy; |
| 273 | |
| 274 | m_slot->extintl_w(extint ? ASSERT_LINE : CLEAR_LINE); |
| 275 | } |