branches/alto2/src/emu/cpu/alto2/a2disk.c
| r26407 | r26408 | |
| 90 | 90 | /** @brief record numbers per sector in INCRECNO order */ |
| 91 | 91 | enum { |
| 92 | 92 | RECNO_HEADER, |
| 93 | | RECNO_PAGENO, |
| 93 | RECNO_NOTHING, |
| 94 | 94 | RECNO_LABEL, |
| 95 | 95 | RECNO_DATA |
| 96 | 96 | }; |
| r26407 | r26408 | |
| 1164 | 1164 | m_dsk.krwc = GET_KADR_LABEL(m_dsk.kadr); |
| 1165 | 1165 | LOG((LOG_DISK,2," INCRECNO; HEADER → LABEL (%o, rwc:%o)\n", m_dsk.krecno, m_dsk.krwc)); |
| 1166 | 1166 | break; |
| 1167 | | case RECNO_PAGENO: |
| 1167 | case RECNO_NOTHING: |
| 1168 | 1168 | m_dsk.krecno = RECNO_HEADER; |
| 1169 | 1169 | m_dsk.krwc = GET_KADR_HEADER(m_dsk.kadr); |
| 1170 | | LOG((LOG_DISK,2," INCRECNO; PAGENO → HEADER (%o, rwc:%o)\n", m_dsk.krecno, m_dsk.krwc)); |
| 1170 | LOG((LOG_DISK,2," INCRECNO; NOTHING → HEADER (%o, rwc:%o)\n", m_dsk.krecno, m_dsk.krwc)); |
| 1171 | 1171 | break; |
| 1172 | 1172 | case RECNO_LABEL: |
| 1173 | 1173 | m_dsk.krecno = RECNO_DATA; |
| r26407 | r26408 | |
| 1175 | 1175 | LOG((LOG_DISK,2," INCRECNO; LABEL → DATA (%o, rwc:%o)\n", m_dsk.krecno, m_dsk.krwc)); |
| 1176 | 1176 | break; |
| 1177 | 1177 | case RECNO_DATA: |
| 1178 | | m_dsk.krecno = RECNO_PAGENO; |
| 1178 | m_dsk.krecno = RECNO_NOTHING; |
| 1179 | 1179 | m_dsk.krwc = 0; /* read (?) */ |
| 1180 | | LOG((LOG_DISK,2," INCRECNO; DATA → PAGENO (%o, rwc:%o)\n", m_dsk.krecno, m_dsk.krwc)); |
| 1180 | LOG((LOG_DISK,2," INCRECNO; DATA → NOTHING (%o, rwc:%o)\n", m_dsk.krecno, m_dsk.krwc)); |
| 1181 | 1181 | break; |
| 1182 | 1182 | } |
| 1183 | 1183 | // TODO: show disk indicator |
| r26407 | r26408 | |
| 1296 | 1296 | */ |
| 1297 | 1297 | void alto2_cpu_device::f1_late_load_kcom() |
| 1298 | 1298 | { |
| 1299 | UINT16 change = m_dsk.kcom ^ m_bus; |
| 1299 | 1300 | m_dsk.kcom = m_bus; |
| 1300 | 1301 | LOG((LOG_DISK,2," KCOM←; BUS %06o\n", m_dsk.kcom)); |
| 1301 | 1302 | LOG((LOG_DISK,2," XFEROFF : %d\n", GET_KCOM_XFEROFF(m_dsk.kcom))); |
| r26407 | r26408 | |
| 1303 | 1304 | LOG((LOG_DISK,2," BCLKSRC : %d\n", GET_KCOM_BCLKSRC(m_dsk.kcom))); |
| 1304 | 1305 | LOG((LOG_DISK,2," WFFO : %d\n", GET_KCOM_WFFO(m_dsk.kcom))); |
| 1305 | 1306 | LOG((LOG_DISK,2," SENDADR : %d\n", GET_KCOM_SENDADR(m_dsk.kcom))); |
| 1307 | if (GET_KCOM_WDINHIB(change)) { |
| 1308 | // WDALLOW going 0: should asynchronously reset 43a and 53a and set 53b |
| 1309 | if (m_task == task_kwd) { |
| 1310 | UINT8 s0, s1; |
| 1311 | /** |
| 1312 | * JK flip-flop 53b (word task) |
| 1313 | * <PRE> |
| 1314 | * CLK SYSCLKB' |
| 1315 | * J 0 |
| 1316 | * K' (BLOCK & WDTSKACT)' |
| 1317 | * S' WDALLOW |
| 1318 | * C' 1 |
| 1319 | * Q WDINIT |
| 1320 | * </PRE> |
| 1321 | */ |
| 1322 | s0 = m_dsk.ff_53b; |
| 1323 | s1 = JKFF_0; |
| 1324 | if (WDALLOW) |
| 1325 | s1 |= JKFF_S; |
| 1326 | s1 |= JKFF_C; |
| 1327 | m_dsk.ff_53b = update_jkff(s0, s1, "53b KWD "); |
| 1328 | |
| 1329 | /** |
| 1330 | * JK flip-flop 53a (word task) |
| 1331 | * <PRE> |
| 1332 | * CLK SYSCLKB' |
| 1333 | * J from 43b Q |
| 1334 | * K' (BLOCK & WDTSKACT)' |
| 1335 | * S' 1 |
| 1336 | * C' WDALLOW |
| 1337 | * Q to 43a J and K' |
| 1338 | * </PRE> |
| 1339 | */ |
| 1340 | s0 = m_dsk.ff_53a; |
| 1341 | s1 = JKFF_0; |
| 1342 | if (m_dsk.ff_43b & JKFF_Q) |
| 1343 | s1 |= JKFF_J; |
| 1344 | s1 |= JKFF_S; |
| 1345 | if (WDALLOW) |
| 1346 | s1 |= JKFF_C; |
| 1347 | m_dsk.ff_53a = update_jkff(s0, s1, "53a KWD "); |
| 1348 | |
| 1349 | /** |
| 1350 | * JK flip-flop 43a (word task) |
| 1351 | * <PRE> |
| 1352 | * CLK SYSCLKA' |
| 1353 | * J from 53a Q |
| 1354 | * K' from 53a Q |
| 1355 | * S' 1 |
| 1356 | * C' WDALLOW |
| 1357 | * Q WDTSKENA', Q' WDTSKENA |
| 1358 | * </PRE> |
| 1359 | */ |
| 1360 | s0 = m_dsk.ff_43a; |
| 1361 | s1 = JKFF_0; |
| 1362 | if (m_dsk.ff_53a & JKFF_Q) |
| 1363 | s1 |= JKFF_J; |
| 1364 | if (m_dsk.ff_53a & JKFF_Q) |
| 1365 | s1 |= JKFF_K; |
| 1366 | s1 |= JKFF_S; |
| 1367 | if (WDALLOW) |
| 1368 | s1 |= JKFF_C; |
| 1369 | m_dsk.ff_43a = update_jkff(s0, s1, "43a KWD "); |
| 1370 | |
| 1371 | if (m_dsk.ff_43a & JKFF_Q) { |
| 1372 | m_dsk.wdtskena = 1; |
| 1373 | m_task_wakeup &= ~(1 << task_kwd); |
| 1374 | } |
| 1375 | } |
| 1376 | } |
| 1306 | 1377 | // TODO: show disk indicator in the GUI? |
| 1307 | 1378 | } |
| 1308 | 1379 | |
| r26407 | r26408 | |
| 1388 | 1459 | */ |
| 1389 | 1460 | void alto2_cpu_device::f2_late_rwc() |
| 1390 | 1461 | { |
| 1391 | | static UINT16 branch_map[4] = {0,2,3,3}; |
| 1392 | | UINT16 r = branch_map[m_dsk.krwc];; |
| 1462 | UINT16 r; |
| 1393 | 1463 | UINT16 init = (m_task == task_kwd && m_dsk.wdinit0) ? 037 : 0; |
| 1394 | 1464 | |
| 1465 | switch (m_dsk.krwc & 3) { |
| 1466 | case 0: |
| 1467 | r = 0; |
| 1468 | break; |
| 1469 | case 1: |
| 1470 | r = 2; |
| 1471 | break; |
| 1472 | default: |
| 1473 | r = 3; |
| 1474 | } |
| 1475 | |
| 1395 | 1476 | switch (m_dsk.krecno) { |
| 1396 | 1477 | case RECNO_HEADER: |
| 1397 | 1478 | LOG((LOG_DISK,1," RWC; %sbranch header(%d):%s (%#o|%#o|%#o)\n", |
| 1398 | 1479 | (r | init) ? "" : "no ", m_dsk.krecno, |
| 1399 | 1480 | rwc_name[m_dsk.krwc], m_next2, r, init)); |
| 1400 | 1481 | break; |
| 1401 | | case RECNO_PAGENO: |
| 1482 | case RECNO_NOTHING: |
| 1402 | 1483 | LOG((LOG_DISK,1," RWC; %sbranch pageno(%d):%s (%#o|%#o|%#o)\n", |
| 1403 | 1484 | (r | init) ? "" : "no ", m_dsk.krecno, |
| 1404 | 1485 | rwc_name[m_dsk.krwc], m_next2, r, init)); |