branches/alto2/src/emu/cpu/alto2/a2disk.c
| r26174 | r26175 | |
| 1059 | 1059 | int i; |
| 1060 | 1060 | UINT8 s0, s1; |
| 1061 | 1061 | |
| 1062 | | LOG((LOG_DISK,8," >>> KWD timing bitclk:%d datin:%d block:%d SECT[4]:%d\n", bitclk, datin, block, m_dsk.sect4)); |
| 1063 | | |
| 1064 | | if (m_dsk.sect4 != dhd->get_sector_mark_0()) { |
| 1065 | | // SECT[4] transition |
| 1066 | | m_dsk.sect4 = dhd->get_sector_mark_0(); |
| 1067 | | LOG((LOG_DISK,7," SECT[4]:%d changed\n", m_dsk.sect4)); |
| 1068 | | } |
| 1069 | | |
| 1062 | LOG((LOG_DISK,8," >>> KWD timing bitclk:%d datin:%d block:%d SECT[4]:%d\n", bitclk, datin, block, dhd->get_sector_mark_0())); |
| 1070 | 1063 | if (0 == m_dsk.seclate) { |
| 1071 | 1064 | // if SECLATE is 0, WDDONE' never goes low (counter's clear has precedence). |
| 1072 | 1065 | if (m_dsk.bitcount || m_dsk.carry) { |
| r26174 | r26175 | |
| 1074 | 1067 | m_dsk.bitcount = 0; |
| 1075 | 1068 | m_dsk.carry = 0; |
| 1076 | 1069 | } |
| 1077 | | } |
| 1078 | | if (0 != m_dsk.seclate && m_dsk.bitclk && !bitclk) { |
| 1070 | } else if (m_dsk.bitclk && !bitclk) { |
| 1079 | 1071 | // if SECLATE is 1, the counter will count or be loaded |
| 1080 | 1072 | if ((m_dsk.shiftin & (1 << 16)) && !GET_KCOM_WFFO(m_dsk.kcom)) { |
| 1081 | 1073 | /* |
| r26174 | r26175 | |
| 1163 | 1155 | s1 |= JKFF_K; |
| 1164 | 1156 | if (m_dsk.ok_to_run) |
| 1165 | 1157 | s1 |= JKFF_S; |
| 1166 | | if (m_dsk.ff_43a & JKFF_Q0) |
| 1158 | if (!(m_dsk.ff_43a & JKFF_Q)) |
| 1167 | 1159 | s1 |= JKFF_C; |
| 1168 | 1160 | m_dsk.ff_43b = update_jkff(s0, s1); |
| 1169 | 1161 | |
| r26174 | r26175 | |
| 1327 | 1319 | s1 |= JKFF_J; |
| 1328 | 1320 | s1 |= JKFF_K; |
| 1329 | 1321 | s1 |= JKFF_S; |
| 1330 | | if (m_dsk.ff_22b & JKFF_Q0) |
| 1322 | if (!(m_dsk.ff_22b & JKFF_Q)) |
| 1331 | 1323 | s1 |= JKFF_C; |
| 1332 | 1324 | m_dsk.ff_22a = update_jkff(s0, s1); |
| 1333 | 1325 | |
| r26174 | r26175 | |
| 1349 | 1341 | s1 |= JKFF_J; |
| 1350 | 1342 | s1 |= JKFF_K; |
| 1351 | 1343 | s1 |= JKFF_S; |
| 1352 | | if (m_dsk.ff_22b & JKFF_Q0) |
| 1344 | if (!(m_dsk.ff_22b & JKFF_Q)) |
| 1353 | 1345 | s1 |= JKFF_C; |
| 1354 | 1346 | m_dsk.ff_21b = update_jkff(s0, s1); |
| 1355 | 1347 | } |
| r26174 | r26175 | |
| 1390 | 1382 | LOG((LOG_DISK,6," reset KFER\n")); |
| 1391 | 1383 | m_dsk.kfer = 0; |
| 1392 | 1384 | } |
| 1393 | | } |
| 1394 | | if (0 == m_dsk.kfer) { |
| 1385 | } else { |
| 1395 | 1386 | // fatal error: not ready OR seqerr OR not seekok |
| 1396 | 1387 | if (RDYLAT) { |
| 1397 | 1388 | LOG((LOG_DISK,6," RDYLAT sets KFER\n")); |
| r26174 | r26175 | |
| 1416 | 1407 | LOG((LOG_DISK,6," STSKENA:1; WAKEST':0 wake KSEC\n")); |
| 1417 | 1408 | m_task_wakeup |= 1 << task_ksec; |
| 1418 | 1409 | } |
| 1419 | | } |
| 1420 | | if (m_dsk.ff_22b & JKFF_Q0) { |
| 1410 | } else { |
| 1421 | 1411 | if (0 != (m_task_wakeup & (1 << task_ksec))) { |
| 1422 | 1412 | LOG((LOG_DISK,6," STSKENA:0; WAKEST':1\n")); |
| 1423 | 1413 | m_task_wakeup &= ~(1 << task_ksec); |
| r26174 | r26175 | |
| 1437 | 1427 | */ |
| 1438 | 1428 | DEBUG_NAME("\t\t21a KSEC "); |
| 1439 | 1429 | s0 = m_dsk.ff_21a; |
| 1440 | | s1 = 0 == m_dsk.sect4 ? JKFF_CLK : JKFF_0; |
| 1441 | | if (m_dsk.ff_22b & JKFF_Q0) |
| 1430 | s1 = dhd->get_sector_mark_0() ? JKFF_0 : JKFF_CLK; |
| 1431 | if (!(m_dsk.ff_22b & JKFF_Q)) |
| 1442 | 1432 | s1 |= JKFF_J; |
| 1443 | 1433 | s1 |= JKFF_K; |
| 1444 | 1434 | if (!ERRWAKE) |
| 1445 | 1435 | s1 |= JKFF_S; |
| 1446 | | if (m_dsk.ff_22b & JKFF_Q0) |
| 1436 | if (!(m_dsk.ff_22b & JKFF_Q)) |
| 1447 | 1437 | s1 |= JKFF_C; |
| 1448 | 1438 | m_dsk.ff_21a = update_jkff(s0, s1); |
| 1449 | 1439 | |
| r26174 | r26175 | |
| 1627 | 1617 | /* if the strobe is still set, restart the timer */ |
| 1628 | 1618 | if (m_dsk.strobe) { |
| 1629 | 1619 | m_dsk.strobon_timer->adjust(attotime::from_nsec(TW_STROBON), arg); |
| 1630 | | m_dsk.strobon_timer->enable(); |
| 1631 | 1620 | } else { |
| 1632 | | m_dsk.strobon_timer->enable(false); |
| 1621 | m_dsk.strobon_timer->reset(); |
| 1633 | 1622 | } |
| 1634 | 1623 | } |
| 1635 | 1624 | |
| r26174 | r26175 | |
| 1637 | 1626 | void alto2_cpu_device::disk_ready_mf31a(void* ptr, INT32 arg) |
| 1638 | 1627 | { |
| 1639 | 1628 | diablo_hd_device* dhd = m_drive[m_dsk.drive]; |
| 1640 | | if (dhd) |
| 1641 | | m_dsk.ready_mf31a = arg & dhd->get_ready_0(); |
| 1642 | | else |
| 1643 | | m_dsk.ready_mf31a = arg; |
| 1629 | m_dsk.ready_mf31a = arg & dhd->get_ready_0(); |
| 1644 | 1630 | /* log the not ready result with level 0, else 2 */ |
| 1645 | 1631 | LOG((LOG_DISK,m_dsk.ready_mf31a ? 0 : 2," ready mf31a:%d\n", m_dsk.ready_mf31a)); |
| 1646 | 1632 | } |
| r26174 | r26175 | |
| 1980 | 1966 | s0 = m_dsk.ff_45b; |
| 1981 | 1967 | s1 = m_dsk.ff_45b & JKFF_CLK; |
| 1982 | 1968 | s1 |= JKFF_J; |
| 1983 | | s1 |= m_dsk.ff_45b & JKFF_K; |
| 1969 | if (!SEQERR) |
| 1970 | s1 |= JKFF_K; |
| 1984 | 1971 | s1 |= JKFF_C; |
| 1985 | 1972 | m_dsk.ff_45b = update_jkff(s0, s1); |
| 1986 | 1973 | |
| r26174 | r26175 | |
| 1989 | 1976 | |
| 1990 | 1977 | /* start monoflop 31a, which resets ready_mf31a */ |
| 1991 | 1978 | m_dsk.ready_timer->adjust(attotime::from_nsec(TW_READY), 1); |
| 1992 | | m_dsk.ready_timer->enable(); |
| 1993 | 1979 | } |
| 1994 | 1980 | |
| 1995 | 1981 | /** |