branches/alto2/src/emu/cpu/alto2/a2disk.c
| r26180 | r26181 | |
| 1438 | 1438 | m_dsk.ff_21a = update_jkff(s0, s1); |
| 1439 | 1439 | |
| 1440 | 1440 | // If the KSEC FF 21a Q goes 1, pulse the SECLATE signal for some time. |
| 1441 | | if ((m_dsk.ff_21a_old & JKFF_Q0) && (m_dsk.ff_21a & JKFF_Q)) { |
| 1441 | if (!(m_dsk.ff_21a_old & JKFF_Q) && (m_dsk.ff_21a & JKFF_Q)) { |
| 1442 | 1442 | m_dsk.seclate_timer->adjust(attotime::from_nsec(TW_SECLATE), 1); |
| 1443 | 1443 | if (m_dsk.seclate) { |
| 1444 | 1444 | m_dsk.seclate = 0; |
| r26180 | r26181 | |
| 2256 | 2256 | } else { |
| 2257 | 2257 | /* if XFEROFF is set, keep the bit at 1 (RDGATE' is high) */ |
| 2258 | 2258 | if (GET_KCOM_XFEROFF(m_dsk.kcom)) { |
| 2259 | | clk = dhd->rd_clock(arg); |
| 2260 | 2259 | bit = 1; |
| 2261 | 2260 | } else { |
| 2261 | clk = dhd->rd_clock(arg); |
| 2262 | 2262 | bit = dhd->rd_data(arg); |
| 2263 | 2263 | LOG((LOG_DISK,7," BITCLK#%d bit:%d (read, driveclk) @%lldns\n", arg, bit, ntime())); |
| 2264 | 2264 | } |
| r26180 | r26181 | |
| 2274 | 2274 | m_dsk.bitclk_time = static_cast<int>(dhd->bit_time().as_double() * ATTOSECONDS_PER_NANOSECOND); |
| 2275 | 2275 | m_bitclk_time += m_dsk.bitclk_time; |
| 2276 | 2276 | #endif |
| 2277 | } else { |
| 2278 | // stop the bitclock timer |
| 2279 | m_bitclk_time = -1; |
| 2277 | 2280 | } |
| 2278 | 2281 | } |
| 2279 | 2282 | |
| r26180 | r26181 | |
| 2295 | 2298 | if (m_bitclk_time >= 0) { |
| 2296 | 2299 | LOG((LOG_DISK,0," unit #%d stop bitclk\n", unit)); |
| 2297 | 2300 | m_bitclk_time = -1; |
| 2301 | m_bitclk_index = -1; |
| 2298 | 2302 | } |
| 2299 | 2303 | #endif |
| 2300 | 2304 | |
| 2301 | 2305 | /* KSTAT[0-3] update the current sector in the kstat field */ |
| 2302 | | PUT_KSTAT_SECTOR(m_dsk.kstat, dhd->get_sector() ^ 017); |
| 2306 | PUT_KSTAT_SECTOR(m_dsk.kstat, dhd->get_sector()); |
| 2303 | 2307 | |
| 2304 | 2308 | /* clear input and output shift registers (?) */ |
| 2305 | 2309 | m_dsk.shiftin = 0; |
| r26180 | r26181 | |
| 2316 | 2320 | #else |
| 2317 | 2321 | // TODO: verify current sector == requested sector and only then run the bitclk? |
| 2318 | 2322 | // HACK: no command, no bit clock |
| 2319 | | if (debug_read_mem(0521)) { |
| 2323 | // if (debug_read_mem(0521)) |
| 2324 | { |
| 2320 | 2325 | // Make the CPU execution loop call disk_bitclk |
| 2321 | 2326 | m_bitclk_time = 0; |
| 2322 | 2327 | m_bitclk_index = 0; |
| r26180 | r26181 | |
| 2370 | 2375 | #endif |
| 2371 | 2376 | |
| 2372 | 2377 | m_dsk.strobon_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(alto2_cpu_device::disk_strobon),this)); |
| 2373 | | m_dsk.strobon_timer->adjust(attotime::from_nsec(TW_STROBON)); |
| 2378 | m_dsk.strobon_timer->adjust(attotime::from_nsec(TW_STROBON), (1<<1)); |
| 2374 | 2379 | |
| 2375 | 2380 | m_dsk.seclate_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(alto2_cpu_device::disk_seclate),this)); |
| 2376 | 2381 | m_dsk.seclate_timer->adjust(attotime::from_nsec(TW_SECLATE), 1); |
branches/alto2/src/emu/cpu/alto2/alto2.c
| r26180 | r26181 | |
| 45 | 45 | cpu_device(mconfig, ALTO2, "Xerox Alto-II", tag, owner, clock, "alto2", __FILE__), |
| 46 | 46 | #if ALTO2_DEBUG |
| 47 | 47 | m_log_types(LOG_DISK|LOG_KSEC|LOG_KWD), |
| 48 | | m_log_level(7), |
| 48 | m_log_level(6), |
| 49 | 49 | m_log_newline(true), |
| 50 | 50 | #endif |
| 51 | 51 | m_ucode_config("ucode", ENDIANNESS_BIG, 32, 12, -2 ), |
| r26180 | r26181 | |
| 1062 | 1062 | save_item(NAME(m_eth.tx_count)); |
| 1063 | 1063 | save_item(NAME(m_eth.duckbreath)); |
| 1064 | 1064 | |
| 1065 | state_add( A2_DRIVE, "DRIVE", m_dsk.drive).formatstr("%1u"); |
| 1066 | state_add( A2_KADDR, "KADDR", m_dsk.kaddr).formatstr("%06O"); |
| 1067 | state_add( A2_KADR, "KADR", m_dsk.kadr).formatstr("%06O"); |
| 1068 | state_add( A2_KSTAT, "KSTAT", m_dsk.kstat).formatstr("%06O"); |
| 1069 | state_add( A2_KCOM, "KCOM", m_dsk.kcom).formatstr("%06O"); |
| 1070 | state_add( A2_KRECNO, "KRECNO", m_dsk.krecno).formatstr("%02O"); |
| 1071 | state_add( A2_SHIFTIN, "SHIFTIN", m_dsk.shiftin).formatstr("%07O"); |
| 1072 | state_add( A2_SHIFTOUT,"SHIFTOUT",m_dsk.shiftout).formatstr("%07O"); |
| 1073 | state_add( A2_DATAIN, "DATAIN", m_dsk.datain).formatstr("%06O"); |
| 1074 | state_add( A2_DATAOUT, "DATAOUT", m_dsk.dataout).formatstr("%06O"); |
| 1075 | state_add( A2_KRWC, "KRWC", m_dsk.krwc).formatstr("%1u"); |
| 1076 | state_add( A2_KFER, "KFER", m_dsk.kfer).formatstr("%1u"); |
| 1077 | state_add( A2_WDTSKENA,"WDTSKENA",m_dsk.wdtskena).formatstr("%1u"); |
| 1078 | state_add( A2_WDINIT0, "WDINIT0", m_dsk.wdinit0).formatstr("%1u"); |
| 1079 | state_add( A2_WDINIT, "WDINIT", m_dsk.wdinit).formatstr("%1u"); |
| 1080 | state_add( A2_STROBE, "STROBE", m_dsk.strobe).formatstr("%1u"); |
| 1081 | state_add( A2_BITCLK, "BITCLK", m_dsk.bitclk).formatstr("%1u"); |
| 1082 | state_add( A2_DATIN, "DATIN", m_dsk.datin).formatstr("%06O"); |
| 1083 | state_add( A2_BITCNT, "BITCNT", m_dsk.bitcount).formatstr("%02O"); |
| 1084 | state_add( A2_CARRY, "CARRY", m_dsk.carry).formatstr("%1u"); |
| 1085 | state_add( A2_SECLATE, "SECLATE", m_dsk.seclate).formatstr("%1u"); |
| 1086 | state_add( A2_SEEKOK, "SEEKOK", m_dsk.seekok).formatstr("%1u"); |
| 1087 | state_add( A2_OKTORUN, "OKTORUN", m_dsk.ok_to_run).formatstr("%1u"); |
| 1088 | state_add( A2_READY, "READY", m_dsk.kstat).formatstr("%1u"); |
| 1089 | state_add_divider(-1); |
| 1065 | 1090 | state_add( A2_TASK, "TASK", m_task).formatstr("%03O"); |
| 1066 | 1091 | state_add( A2_MPC, "MPC", m_mpc).formatstr("%06O"); |
| 1067 | 1092 | state_add( A2_NEXT, "NEXT", m_next).formatstr("%06O"); |
| r26180 | r26181 | |
| 1074 | 1099 | state_add( A2_SHIFTER, "SHIFTER", m_shifter).formatstr("%06O"); |
| 1075 | 1100 | state_add( A2_LALUC0, "LALUC0", m_laluc0).formatstr("%1u"); |
| 1076 | 1101 | state_add( A2_M, "M", m_m).formatstr("%06O"); |
| 1077 | | |
| 1102 | state_add_divider(-1); |
| 1078 | 1103 | state_add( A2_AC3, "AC(3)", m_r[000]).formatstr("%06O"); |
| 1079 | 1104 | state_add( A2_AC2, "AC(2)", m_r[001]).formatstr("%06O"); |
| 1080 | 1105 | state_add( A2_AC1, "AC(1)", m_r[002]).formatstr("%06O"); |
| r26180 | r26181 | |
| 1107 | 1132 | state_add( A2_R35, "R35", m_r[035]).formatstr("%06O"); |
| 1108 | 1133 | state_add( A2_R36, "R36", m_r[036]).formatstr("%06O"); |
| 1109 | 1134 | state_add( A2_R37, "R37", m_r[037]).formatstr("%06O"); |
| 1110 | | |
| 1135 | state_add_divider(-1); |
| 1111 | 1136 | state_add( A2_S00, "S00", m_s[0][000]).formatstr("%06O"); |
| 1112 | 1137 | state_add( A2_S01, "S01", m_s[0][001]).formatstr("%06O"); |
| 1113 | 1138 | state_add( A2_S02, "S02", m_s[0][002]).formatstr("%06O"); |
branches/alto2/src/emu/cpu/alto2/alto2.h
| r26180 | r26181 | |
| 160 | 160 | A2_TASK, A2_MPC, A2_NEXT, A2_NEXT2, |
| 161 | 161 | // BUS, ALU, temp, latch, memory latch and carry flags |
| 162 | 162 | A2_BUS, A2_T, A2_ALU, A2_ALUC0, A2_L, A2_SHIFTER, A2_LALUC0, A2_M, |
| 163 | // DISK controller registers |
| 164 | A2_DRIVE, A2_KADDR, A2_KADR, A2_KSTAT, A2_KCOM, A2_KRECNO, |
| 165 | A2_SHIFTIN, A2_SHIFTOUT, A2_DATAIN, A2_DATAOUT, A2_KRWC, |
| 166 | A2_KFER, A2_WDTSKENA, A2_WDINIT0, A2_WDINIT, A2_STROBE, |
| 167 | A2_BITCLK, A2_DATIN, A2_BITCNT, A2_CARRY, A2_SECLATE, |
| 168 | A2_SEEKOK, A2_OKTORUN, A2_READY, |
| 163 | 169 | A2_R, // 32 R registers |
| 164 | 170 | A2_AC3 = A2_R, A2_AC2, A2_AC1, A2_AC0, A2_R04, A2_R05, A2_PC, A2_R07, |
| 165 | 171 | A2_R10, A2_R11, A2_R12, A2_R13, A2_R14, A2_R15, A2_R16, A2_R17, |
branches/alto2/src/emu/machine/diablo_hd.c
| r26180 | r26181 | |
| 1155 | 1155 | |
| 1156 | 1156 | if (m_rdgate_0) { |
| 1157 | 1157 | LOG_DRIVE((8,"[DHD] %s: unit #%d rdgate not asserted\n", __FUNCTION__, m_unit)); |
| 1158 | | return 1; // read gate is not asserted (active 0) |
| 1158 | return 0; // read gate is not asserted (active 0) |
| 1159 | 1159 | } |
| 1160 | 1160 | |
| 1161 | 1161 | if (index < 0 || index >= bits_per_sector()) { |
| r26180 | r26181 | |
| 1218 | 1218 | if (index & 1) { |
| 1219 | 1219 | // clock bits are on even bit positions only |
| 1220 | 1220 | clk = 0; |
| 1221 | } else if (bits) { |
| 1222 | RDBIT(bits,index,clk); |
| 1221 | 1223 | } else { |
| 1222 | | RDBIT(bits,index,clk); |
| 1224 | clk = 0; |
| 1223 | 1225 | } |
| 1224 | 1226 | LOG_DRIVE((7,"[DHD] %s: read #%d %d/%d/%d clk #%d:%d\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector, index, clk)); |
| 1225 | 1227 | m_rdlast = index; |
| r26180 | r26181 | |
| 1330 | 1332 | m_rdlast = -1; |
| 1331 | 1333 | |
| 1332 | 1334 | // for units with a CHD assigned to them start the timer |
| 1333 | | if (m_handle) |
| 1335 | if (m_handle) { |
| 1334 | 1336 | timer_set(m_sector_time - m_sector_mark_0_time, 1, 0); |
| 1337 | read_sector(); |
| 1338 | } |
| 1335 | 1339 | } |
| 1336 | 1340 | |
| 1337 | 1341 | /** |
| r26180 | r26181 | |
| 1352 | 1356 | switch (param) { |
| 1353 | 1357 | case 0: |
| 1354 | 1358 | timer.adjust(m_sector_mark_0_time, 1); |
| 1355 | | /* deassert sector mark */ |
| 1356 | | sector_mark_1(); |
| 1357 | | break; |
| 1358 | | case 1: |
| 1359 | | timer.adjust(m_sector_mark_1_time, 2); |
| 1360 | 1359 | /* assert sector mark */ |
| 1361 | 1360 | sector_mark_0(); |
| 1362 | 1361 | break; |
| 1363 | | case 2: |
| 1362 | case 1: |
| 1364 | 1363 | /* next sector starting soon now */ |
| 1365 | | timer.adjust(m_sector_time - m_sector_mark_0_time, 0); |
| 1364 | timer.adjust(m_sector_mark_1_time, 2); |
| 1366 | 1365 | /* call the sector_callback, if any */ |
| 1367 | 1366 | if (m_sector_callback) |
| 1368 | 1367 | (void)(*m_sector_callback)(m_sector_callback_cookie, m_unit); |
| 1368 | break; |
| 1369 | case 2: |
| 1370 | timer.adjust(m_sector_time - m_sector_mark_0_time, 0); |
| 1371 | /* deassert sector mark */ |
| 1372 | sector_mark_1(); |
| 1373 | break; |
| 1369 | 1374 | } |
| 1370 | 1375 | } |
| 1371 | 1376 | |