branches/alto2/src/emu/cpu/alto2/a2disk.c
| r26153 | r26154 | |
| 9 | 9 | *****************************************************************************/ |
| 10 | 10 | #include "alto2.h" |
| 11 | 11 | |
| 12 | | /** @brief 1 to debug the JK flip-flops, 0 to use a lookup table */ |
| 13 | | #define JKFF_FUNCTION 0 |
| 14 | 12 | |
| 13 | #define JKFF_FUNCTION 1 //!< define 1 to debug the JK flip-flops, 0 to use a lookup table |
| 14 | |
| 15 | 15 | #define GET_KADDR_SECTOR(kaddr) A2_GET16(kaddr,16, 0, 3) //!< get sector number from address register |
| 16 | 16 | #define PUT_KADDR_SECTOR(kaddr,val) A2_PUT16(kaddr,16, 0, 3,val) //!< put sector number into address register |
| 17 | 17 | #define GET_KADDR_CYLINDER(kaddr) A2_GET16(kaddr,16, 4,12) //!< get cylinder number from address register |
| r26153 | r26154 | |
| 97 | 97 | #endif |
| 98 | 98 | |
| 99 | 99 | #if ALTO2_DEBUG |
| 100 | | static const char *jkff_name; |
| 100 | static const char* raise_lower[2] = {"↗","↘"}; |
| 101 | static const char* jkff_name; |
| 101 | 102 | /** @brief macro to set the name of a FF in DEBUG=1 builds only */ |
| 102 | 103 | #define DEBUG_NAME(x) jkff_name = x |
| 103 | 104 | #else |
| r26153 | r26154 | |
| 182 | 183 | LOG((LOG_DISK,5,"%s C':0 S':0 → Q:1 and Q':1 <unstable>\n", jkff_name)); |
| 183 | 184 | break; |
| 184 | 185 | } |
| 185 | | return s1; |
| 186 | return static_cast<jkff_t>(s1); |
| 186 | 187 | } |
| 187 | 188 | |
| 188 | 189 | #else |
| r26153 | r26154 | |
| 767 | 768 | 0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f |
| 768 | 769 | } |
| 769 | 770 | }; |
| 770 | | #endif |
| 771 | 771 | |
| 772 | 772 | jkff_t alto2_cpu_device::update_jkff(UINT8 s0, UINT8 s1) |
| 773 | 773 | { |
| 774 | | static const char* raise_lower[2] = {"↗","↘"}; |
| 775 | 774 | UINT8 result = jkff_lookup[s1 & 63][ s0 & 63]; |
| 776 | 775 | #if ALTO2_DEBUG |
| 777 | | LOG((LOG_DISK,8,"%s\t: ", jkff_name)); |
| 776 | LOG((LOG_DISK,8,"%s : ", jkff_name)); |
| 778 | 777 | if ((s0 ^ result) & JKFF_CLK) |
| 779 | 778 | LOG((LOG_DISK,8," CLK%s", raise_lower[result & 1])); |
| 780 | 779 | if ((s0 ^ result) & JKFF_J) |
| r26153 | r26154 | |
| 793 | 792 | #endif |
| 794 | 793 | return static_cast<jkff_t>(result); |
| 795 | 794 | } |
| 795 | #endif |
| 796 | 796 | |
| 797 | 797 | /** |
| 798 | 798 | * <PRE> |
| r26153 | r26154 | |
| 1148 | 1148 | * Q to 53a J |
| 1149 | 1149 | * </PRE> |
| 1150 | 1150 | */ |
| 1151 | | DEBUG_NAME(" KWD 43b"); |
| 1152 | | m_dsk.ff_43b = update_jkff(m_dsk.ff_43b, |
| 1153 | | (wddone1 ? JKFF_CLK : 0) | |
| 1154 | | JKFF_J | |
| 1155 | | JKFF_K | |
| 1156 | | (m_dsk.ok_to_run ? JKFF_S : 0) | |
| 1157 | | ((m_dsk.ff_43a & JKFF_Q) ? 0 : JKFF_C)); |
| 1151 | DEBUG_NAME("\t\t43b KWD "); |
| 1152 | s0 = m_dsk.ff_43b; |
| 1153 | s1 = wddone1 ? JKFF_CLK : 0; |
| 1154 | s1 |= JKFF_J; |
| 1155 | s1 |= JKFF_K; |
| 1156 | if (m_dsk.ok_to_run) |
| 1157 | s1 |= JKFF_S; |
| 1158 | if (m_dsk.ff_43a & JKFF_Q0) |
| 1159 | s1 |= JKFF_C; |
| 1160 | m_dsk.ff_43b = update_jkff(s0, s1); |
| 1158 | 1161 | |
| 1159 | 1162 | /* count for the 4 stages of sysclka and sysclkb transitions */ |
| 1160 | 1163 | for (i = 0; i < 4; i++) { |
| 1161 | 1164 | |
| 1162 | 1165 | if (m_sysclka0[i] != m_sysclka1[i]) { |
| 1163 | | LOG((LOG_DISK,7," SYSCLKA' : %d→%d\n", m_sysclka0[i], m_sysclka1[i])); |
| 1166 | LOG((LOG_DISK,7," SYSCLKA' %s\n", raise_lower[m_sysclka1[i]])); |
| 1164 | 1167 | } |
| 1165 | 1168 | if (m_sysclkb0[i] != m_sysclkb1[i]) { |
| 1166 | | LOG((LOG_DISK,7," SYSCLKB' : %d→%d\n", m_sysclkb0[i], m_sysclkb1[i])); |
| 1169 | LOG((LOG_DISK,7," SYSCLKB' %s\n", raise_lower[m_sysclkb1[i]])); |
| 1167 | 1170 | } |
| 1168 | 1171 | |
| 1169 | 1172 | /** |
| r26153 | r26154 | |
| 1177 | 1180 | * Q WDINIT |
| 1178 | 1181 | * </PRE> |
| 1179 | 1182 | */ |
| 1180 | | DEBUG_NAME(" KWD 53b"); |
| 1183 | DEBUG_NAME("\t\t53b KWD "); |
| 1181 | 1184 | s0 = m_dsk.ff_53b; |
| 1182 | | s1 = m_sysclkb1[i]; |
| 1185 | s1 = m_sysclkb1[i] ? JKFF_CLK : JKFF_0; |
| 1183 | 1186 | if (block != task_kwd) |
| 1184 | 1187 | s1 |= JKFF_K; // (BLOCK & WDTSKACT)' |
| 1185 | 1188 | if (WDALLOW) |
| r26153 | r26154 | |
| 1198 | 1201 | * Q to 43a J and K' |
| 1199 | 1202 | * </PRE> |
| 1200 | 1203 | */ |
| 1201 | | DEBUG_NAME(" KWD 53a"); |
| 1204 | DEBUG_NAME("\t\t53a KWD "); |
| 1202 | 1205 | s0 = m_dsk.ff_53a; |
| 1203 | | s1 = m_sysclkb1[i]; |
| 1206 | s1 = m_sysclkb1[i] ? JKFF_CLK : JKFF_0; |
| 1204 | 1207 | if (m_dsk.ff_43b & JKFF_Q) |
| 1205 | 1208 | s1 |= JKFF_J; |
| 1206 | 1209 | if (block != task_kwd) |
| r26153 | r26154 | |
| 1221 | 1224 | * Q WDTSKENA', Q' WDTSKENA |
| 1222 | 1225 | * </PRE> |
| 1223 | 1226 | */ |
| 1224 | | DEBUG_NAME(" KWD 43a"); |
| 1227 | DEBUG_NAME("\t\t43a KWD "); |
| 1225 | 1228 | s0 = m_dsk.ff_43a; |
| 1226 | | s1 = m_sysclka1[i]; |
| 1229 | s1 = m_sysclka1[i] ? JKFF_CLK : JKFF_0; |
| 1227 | 1230 | if (m_dsk.ff_53a & JKFF_Q) |
| 1228 | 1231 | s1 |= JKFF_J; |
| 1229 | 1232 | if (m_dsk.ff_53a & JKFF_Q) |
| r26153 | r26154 | |
| 1244 | 1247 | * Q RDYLAT' |
| 1245 | 1248 | * </PRE> |
| 1246 | 1249 | */ |
| 1247 | | DEBUG_NAME(" RDYLAT 45a"); |
| 1250 | DEBUG_NAME("\t\t45a RDYLAT"); |
| 1248 | 1251 | s0 = m_dsk.ff_45a; |
| 1249 | | s1 = m_sysclka1[i]; |
| 1250 | | if (dhd->get_ready_0()) |
| 1252 | s1 = m_sysclka1[i] ? JKFF_CLK : JKFF_0; |
| 1253 | if (0 == dhd->get_ready_0()) |
| 1251 | 1254 | s1 |= JKFF_J; |
| 1252 | 1255 | s1 |= JKFF_K; |
| 1253 | 1256 | s1 |= JKFF_S; |
| r26153 | r26154 | |
| 1266 | 1269 | * Q to KSTAT[11] DATALATE |
| 1267 | 1270 | * </PRE> |
| 1268 | 1271 | */ |
| 1269 | | DEBUG_NAME(" SEQERR 45b"); |
| 1272 | DEBUG_NAME("\t\t45b SEQERR"); |
| 1270 | 1273 | s0 = m_dsk.ff_45b; |
| 1271 | | s1 = m_sysclka1[i]; |
| 1274 | s1 = m_sysclka1[i] ? JKFF_CLK : JKFF_0; |
| 1272 | 1275 | s1 |= JKFF_J; |
| 1273 | 1276 | if (SEQERR) |
| 1274 | 1277 | s1 |= JKFF_K; |
| r26153 | r26154 | |
| 1287 | 1290 | * Q STSKENA; Q' WAKEKST' |
| 1288 | 1291 | * </PRE> |
| 1289 | 1292 | */ |
| 1290 | | DEBUG_NAME(" KSEC 22b"); |
| 1293 | DEBUG_NAME("\t\t22b KSEC "); |
| 1291 | 1294 | s0 = m_dsk.ff_22b; |
| 1292 | | s1 = m_sysclkb1[i]; |
| 1295 | s1 = m_sysclkb1[i] ? JKFF_CLK : JKFF_0; |
| 1293 | 1296 | if (m_dsk.ff_22a & JKFF_Q) |
| 1294 | 1297 | s1 |= JKFF_J; |
| 1295 | 1298 | if (block != task_ksec) |
| r26153 | r26154 | |
| 1309 | 1312 | * Q to 22b J |
| 1310 | 1313 | * </PRE> |
| 1311 | 1314 | */ |
| 1312 | | DEBUG_NAME(" KSEC 22a"); |
| 1315 | DEBUG_NAME("\t\t22a KSEC "); |
| 1313 | 1316 | s0 = m_dsk.ff_22a; |
| 1314 | | s1 = m_sysclkb1[i]; |
| 1317 | s1 = m_sysclkb1[i] ? JKFF_CLK : JKFF_0; |
| 1315 | 1318 | if (m_dsk.ff_21b & JKFF_Q) |
| 1316 | 1319 | s1 |= JKFF_J; |
| 1317 | 1320 | s1 |= JKFF_K; |
| 1318 | 1321 | s1 |= JKFF_S; |
| 1319 | | if (!(m_dsk.ff_22b & JKFF_Q)) |
| 1322 | if (m_dsk.ff_22b & JKFF_Q0) |
| 1320 | 1323 | s1 |= JKFF_C; |
| 1321 | 1324 | m_dsk.ff_22a = update_jkff(s0, s1); |
| 1322 | 1325 | |
| r26153 | r26154 | |
| 1331 | 1334 | * Q to 22a J |
| 1332 | 1335 | * </PRE> |
| 1333 | 1336 | */ |
| 1334 | | DEBUG_NAME(" KSEC 21b"); |
| 1337 | DEBUG_NAME("\t\t21b KSEC "); |
| 1335 | 1338 | s0 = m_dsk.ff_21b; |
| 1336 | | s1 = m_sysclkb1[i]; |
| 1339 | s1 = m_sysclkb1[i] ? JKFF_CLK : JKFF_0; |
| 1337 | 1340 | if (m_dsk.ff_21a & JKFF_Q) |
| 1338 | 1341 | s1 |= JKFF_J; |
| 1339 | 1342 | s1 |= JKFF_K; |
| r26153 | r26154 | |
| 1420 | 1423 | * Q to seclate monoflop |
| 1421 | 1424 | * </PRE> |
| 1422 | 1425 | */ |
| 1423 | | DEBUG_NAME(" KSEC 21a"); |
| 1426 | DEBUG_NAME("\t\t21a KSEC "); |
| 1424 | 1427 | s0 = m_dsk.ff_21a; |
| 1425 | | s1 = dhd->get_sector_mark_0() ? 0 : JKFF_CLK; |
| 1426 | | if (!(m_dsk.ff_22b & JKFF_Q)) |
| 1428 | s1 = dhd->get_sector_mark_0() ? JKFF_0 : JKFF_CLK; |
| 1429 | if (m_dsk.ff_22b & JKFF_Q0) |
| 1427 | 1430 | s1 |= JKFF_J; |
| 1428 | 1431 | s1 |= JKFF_K; |
| 1429 | 1432 | if (!ERRWAKE) |
| 1430 | 1433 | s1 |= JKFF_S; |
| 1431 | | if (!(m_dsk.ff_22b & JKFF_Q)) |
| 1434 | if (m_dsk.ff_22b & JKFF_Q0) |
| 1432 | 1435 | s1 |= JKFF_C; |
| 1433 | 1436 | m_dsk.ff_21a = update_jkff(s0, s1); |
| 1434 | 1437 | |
| r26153 | r26154 | |
| 1436 | 1439 | * If the KSEC FF 21a Q goes 1, pulse the SECLATE signal for |
| 1437 | 1440 | * some time. |
| 1438 | 1441 | */ |
| 1439 | | if (!(m_dsk.ff_21a_old & JKFF_Q) && (m_dsk.ff_21a & JKFF_Q)) { |
| 1442 | if ((m_dsk.ff_21a_old & JKFF_Q0) && (m_dsk.ff_21a & JKFF_Q)) { |
| 1440 | 1443 | if (!m_dsk.seclate_timer) |
| 1441 | 1444 | m_dsk.seclate_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(alto2_cpu_device::disk_seclate),this));; |
| 1442 | 1445 | m_dsk.seclate_timer->adjust(attotime::from_nsec(TW_SECLATE), 1, attotime::never); |
| r26153 | r26154 | |
| 1548 | 1551 | * Q to seekok |
| 1549 | 1552 | * </PRE> |
| 1550 | 1553 | */ |
| 1551 | | DEBUG_NAME(" LAI 44a"); |
| 1554 | DEBUG_NAME("\t\t44a LAI "); |
| 1552 | 1555 | s0 = m_dsk.ff_44a; |
| 1553 | 1556 | s1 = lai ? JKFF_CLK : JKFF_0; |
| 1554 | 1557 | s1 |= JKFF_J; |
| r26153 | r26154 | |
| 1738 | 1741 | */ |
| 1739 | 1742 | for (i = 0; i < 2; i++) { |
| 1740 | 1743 | UINT8 s0, s1; |
| 1741 | | DEBUG_NAME(" CKSUM 44b"); |
| 1744 | DEBUG_NAME("\t\t44b CKSUM "); |
| 1742 | 1745 | s0 = m_dsk.ff_44b; |
| 1743 | 1746 | s1 = i ? JKFF_CLK : 0; |
| 1744 | 1747 | if (!A2_GET16(m_bus,16,13,13)) |
| r26153 | r26154 | |
| 1878 | 1881 | * C' CLRSTAT' |
| 1879 | 1882 | * Q to seekok |
| 1880 | 1883 | */ |
| 1881 | | DEBUG_NAME(" LAI 44a"); |
| 1884 | DEBUG_NAME("\t\t44a LAI "); |
| 1882 | 1885 | s0 = m_dsk.ff_44a; |
| 1883 | 1886 | s1 = m_dsk.ff_44a & JKFF_CLK; |
| 1884 | 1887 | s1 |= JKFF_J; |
| r26153 | r26154 | |
| 1895 | 1898 | * C' CLRSTAT' |
| 1896 | 1899 | * Q to seekok |
| 1897 | 1900 | */ |
| 1898 | | DEBUG_NAME(" CKSUM 44b"); |
| 1901 | DEBUG_NAME("\t\t44b CKSUM "); |
| 1899 | 1902 | s0 = m_dsk.ff_44b; |
| 1900 | 1903 | s1 = m_dsk.ff_44b & JKFF_CLK; |
| 1901 | 1904 | s1 |= m_dsk.ff_44b & JKFF_J; |
| r26153 | r26154 | |
| 1912 | 1915 | * C' CLRSTAT' |
| 1913 | 1916 | * Q RDYLAT' |
| 1914 | 1917 | */ |
| 1915 | | DEBUG_NAME(" RDYLAT 45a"); |
| 1918 | DEBUG_NAME("\t\t45a RDYLAT"); |
| 1916 | 1919 | s0 = m_dsk.ff_45a; |
| 1917 | 1920 | s1 = m_dsk.ff_45a & JKFF_CLK; |
| 1918 | 1921 | if (dhd) |
| r26153 | r26154 | |
| 1932 | 1935 | * C' 1 |
| 1933 | 1936 | * Q to KSTAT[11] DATALATE |
| 1934 | 1937 | */ |
| 1935 | | DEBUG_NAME(" SEQERR 45b"); |
| 1938 | DEBUG_NAME("\t\t45b SEQERR"); |
| 1936 | 1939 | s0 = m_dsk.ff_45b; |
| 1937 | 1940 | s1 = m_dsk.ff_45b & JKFF_CLK; |
| 1938 | 1941 | s1 |= JKFF_J; |