trunk/src/mess/machine/upd765.c
| r18465 | r18466 | |
| 132 | 132 | poll_timer = NULL; |
| 133 | 133 | |
| 134 | 134 | cur_irq = false; |
| 135 | locked = false; |
| 135 | 136 | } |
| 136 | 137 | |
| 137 | 138 | void upd765_family_device::device_reset() |
| 138 | 139 | { |
| 140 | dor = dor_reset; |
| 141 | locked = false; |
| 142 | } |
| 143 | |
| 144 | void upd765_family_device::soft_reset() |
| 145 | { |
| 139 | 146 | main_phase = PHASE_CMD; |
| 140 | 147 | for(int i=0; i<4; i++) { |
| 141 | 148 | flopi[i].main_state = IDLE; |
| r18465 | r18466 | |
| 150 | 157 | fifo_pos = 0; |
| 151 | 158 | command_pos = 0; |
| 152 | 159 | result_pos = 0; |
| 153 | | fifocfg = FIF_DIS; |
| 160 | if(!locked) |
| 161 | fifocfg = FIF_DIS; |
| 154 | 162 | cur_live.fi = 0; |
| 155 | 163 | drq = false; |
| 156 | 164 | cur_live.tm = attotime::never; |
| r18465 | r18466 | |
| 159 | 167 | cur_live.fi = NULL; |
| 160 | 168 | tc_done = false; |
| 161 | 169 | st0 = st1 = st2 = st3 = 0x00; |
| 162 | | dor = dor_reset; |
| 163 | 170 | |
| 164 | 171 | check_irq(); |
| 165 | 172 | if(ready_polled) |
| r18465 | r18466 | |
| 240 | 247 | logerror("%s: dor = %02x\n", tag(), data); |
| 241 | 248 | UINT8 diff = dor ^ data; |
| 242 | 249 | dor = data; |
| 243 | | if(diff & 4) { |
| 244 | | UINT8 tmp = dor_reset; |
| 245 | | dor_reset = dor; |
| 246 | | device_reset(); |
| 247 | | dor_reset = tmp; |
| 248 | | } |
| 250 | if(diff & 4) |
| 251 | soft_reset(); |
| 249 | 252 | |
| 250 | 253 | for(int i=0; i<4; i++) { |
| 251 | 254 | floppy_info &fi = flopi[i]; |
| r18465 | r18466 | |
| 972 | 975 | case 0x13: |
| 973 | 976 | return command_pos == 4 ? C_CONFIGURE : C_INCOMPLETE; |
| 974 | 977 | |
| 978 | case 0x14: |
| 979 | return C_LOCK; |
| 980 | |
| 975 | 981 | default: |
| 976 | 982 | return C_INVALID; |
| 977 | 983 | } |
| r18465 | r18466 | |
| 997 | 1003 | format_track_start(flopi[command[1] & 3]); |
| 998 | 1004 | break; |
| 999 | 1005 | |
| 1006 | case C_LOCK: |
| 1007 | locked = command[0] & 0x80; |
| 1008 | main_phase = PHASE_RESULT; |
| 1009 | result[0] = locked ? 0x10 : 0x00; |
| 1010 | result_pos = 1; |
| 1011 | logerror("%s: command lock (%s)\n", tag(), locked ? "on" : "off"); |
| 1012 | break; |
| 1013 | |
| 1000 | 1014 | case C_PERPENDICULAR: |
| 1001 | 1015 | logerror("%s: command perpendicular\n", tag()); |
| 1002 | 1016 | main_phase = PHASE_CMD; |
trunk/src/mess/machine/upd765.h
| r18465 | r18466 | |
| 284 | 284 | |
| 285 | 285 | live_info cur_live, checkpoint_live; |
| 286 | 286 | line_cb intrq_cb, drq_cb; |
| 287 | | bool cur_irq, data_irq, drq, internal_drq, tc, tc_done; |
| 287 | bool cur_irq, data_irq, drq, internal_drq, tc, tc_done, locked; |
| 288 | 288 | floppy_info flopi[4]; |
| 289 | 289 | |
| 290 | 290 | int fifo_pos, fifo_expected, command_pos, result_pos; |
| r18465 | r18466 | |
| 304 | 304 | enum { |
| 305 | 305 | C_CONFIGURE, |
| 306 | 306 | C_FORMAT_TRACK, |
| 307 | C_LOCK, |
| 307 | 308 | C_PERPENDICULAR, |
| 308 | 309 | C_READ_DATA, |
| 309 | 310 | C_READ_ID, |
| r18465 | r18466 | |
| 321 | 322 | |
| 322 | 323 | void delay_cycles(emu_timer *tm, int cycles); |
| 323 | 324 | void check_irq(); |
| 325 | void soft_reset(); |
| 324 | 326 | void fifo_expect(int size, bool write); |
| 325 | 327 | void fifo_push(UINT8 data, bool internal); |
| 326 | 328 | UINT8 fifo_pop(bool internal); |