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)); |