branches/alto2/src/emu/machine/diablo_hd.c
| r26240 | r26241 | |
| 1139 | 1139 | |
| 1140 | 1140 | if (m_rdgate_0) { |
| 1141 | 1141 | LOG_DRIVE((0,"[DHD%u] rdgate not asserted\n", m_unit)); |
| 1142 | | return 1; // read gate is not asserted (active 0) |
| 1142 | return 0; // read gate is not asserted (active 0) |
| 1143 | 1143 | } |
| 1144 | 1144 | |
| 1145 | 1145 | if (index < 0 || index >= bits_per_sector()) { |
| r26240 | r26241 | |
| 1182 | 1182 | |
| 1183 | 1183 | if (index < 0 || index >= bits_per_sector()) { |
| 1184 | 1184 | LOG_DRIVE((0,"[DHD%u] index out of range (%d)\n", m_unit, index)); |
| 1185 | | return 0; // don't read before or beyond the sector |
| 1185 | return 1; // don't read before or beyond the sector |
| 1186 | 1186 | } |
| 1187 | 1187 | |
| 1188 | 1188 | if (0 == m_sector_mark_0) { |
| 1189 | 1189 | LOG_DRIVE((0,"[DHD%u] read while sector mark is asserted\n", m_unit)); |
| 1190 | | return 0; // no clock while sector mark is low (?) |
| 1190 | return 1; // no clock while sector mark is low (?) |
| 1191 | 1191 | } |
| 1192 | 1192 | |
| 1193 | 1193 | if (-1 == m_page) { |
| 1194 | 1194 | LOG_DRIVE((0,"[DHD%u] invalid page\n", m_unit)); |
| 1195 | | return 0; // invalid page |
| 1195 | return 1; // invalid page |
| 1196 | 1196 | } |
| 1197 | 1197 | |
| 1198 | 1198 | UINT32 *bits = expand_sector(); |
| r26240 | r26241 | |
| 1298 | 1298 | // reset the disk drive's address |
| 1299 | 1299 | m_cylinder = 0; |
| 1300 | 1300 | m_head = 0; |
| 1301 | | m_sector = 10; |
| 1302 | | m_page = 10; |
| 1301 | m_sector = 0; |
| 1302 | m_page = 0; |
| 1303 | 1303 | |
| 1304 | 1304 | // disable the erase, write and read gates |
| 1305 | 1305 | m_egate_0 = 1; |
branches/alto2/src/emu/cpu/alto2/a2disk.c
| r26240 | r26241 | |
| 10 | 10 | #include "alto2.h" |
| 11 | 11 | |
| 12 | 12 | |
| 13 | | #define JKFF_FUNCTION 0 //!< define 1 to debug the JK flip-flops, 0 to use a lookup table |
| 13 | #define JKFF_FUNCTION 1 //!< define 1 to debug the JK flip-flops, 0 to use a lookup table |
| 14 | 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 |
| r26240 | r26241 | |
| 915 | 915 | * TW_SECLATE (46*ALTO2_UCYCLE) |
| 916 | 916 | * TW_SECLATE 8596 |
| 917 | 917 | */ |
| 918 | | #define TW_SECLATE (50*ALTO2_UCYCLE) |
| 918 | #define TW_SECLATE 8596 |
| 919 | 919 | |
| 920 | 920 | /** @brief monoflop 52b pulse duration |
| 921 | 921 | * Rt = 20k, Cext = 0.01µF (=10000pF) => 57960ns (~58us) |
| r26240 | r26241 | |
| 1047 | 1047 | int i; |
| 1048 | 1048 | UINT8 s0, s1; |
| 1049 | 1049 | |
| 1050 | | LOG((LOG_DISK,9," *** KWD timing bitclk:%d datin:%d block:%d\n", bitclk, datin, block)); |
| 1050 | LOG((LOG_DISK,8," *** KWD timing bitclk:%d datin:%d block:%d\n", bitclk, datin, block)); |
| 1051 | 1051 | if (0 == m_dsk.seclate) { |
| 1052 | 1052 | // if SECLATE is 0, WDDONE' never goes low (counter's clear has precedence). |
| 1053 | 1053 | if (m_dsk.bitcount || m_dsk.carry) { |
| r26240 | r26241 | |
| 1138 | 1138 | */ |
| 1139 | 1139 | DEBUG_NAME("\t\t43b KWD "); |
| 1140 | 1140 | s0 = m_dsk.ff_43b; |
| 1141 | | s1 = wddone ? JKFF_CLK : 0; |
| 1141 | s1 = wddone ? JKFF_CLK : JKFF_0; |
| 1142 | 1142 | s1 |= JKFF_J; |
| 1143 | 1143 | s1 |= JKFF_K; |
| 1144 | 1144 | if (m_dsk.ok_to_run) |
| r26240 | r26241 | |
| 1347 | 1347 | * If Q (53a) and Q (43a) are both 1, the WAKEKWDT' |
| 1348 | 1348 | * output is 0 and the disk word task wakeup signal is asserted. |
| 1349 | 1349 | */ |
| 1350 | | if (m_dsk.ff_53a & m_dsk.ff_43a & JKFF_Q) { |
| 1350 | if ((m_dsk.ff_53a & JKFF_Q) && (m_dsk.ff_43a & JKFF_Q)) { |
| 1351 | 1351 | if (m_dsk.wdtskena == 1) { |
| 1352 | 1352 | LOG((LOG_DISK,2," WDTSKENA':0 and WAKEKWDT':0 wake KWD\n")); |
| 1353 | 1353 | m_dsk.wdtskena = 0; |
| r26240 | r26241 | |
| 1515 | 1515 | (void)ptr; |
| 1516 | 1516 | LOG((LOG_DISK,2," OK TO RUN -> %d\n", arg)); |
| 1517 | 1517 | m_dsk.ok_to_run = arg; |
| 1518 | | m_dsk.ok_to_run_timer->reset(); |
| 1518 | m_dsk.ok_to_run_timer->enable(false); |
| 1519 | 1519 | } |
| 1520 | 1520 | |
| 1521 | 1521 | /** |
| r26240 | r26241 | |
| 1541 | 1541 | void alto2_cpu_device::disk_strobon(void* ptr, INT32 arg) |
| 1542 | 1542 | { |
| 1543 | 1543 | (void)ptr; |
| 1544 | | UINT8 unit = static_cast<UINT8>(arg & 1); |
| 1545 | | UINT8 restore = static_cast<UINT8>((arg >> 1) & 1); |
| 1546 | | INT32 cylinder = arg >> 2; |
| 1544 | UINT8 unit = arg % 2; |
| 1545 | UINT8 restore = (arg / 2) % 2; |
| 1546 | INT32 cylinder = arg / 4; |
| 1547 | 1547 | int seekok; |
| 1548 | 1548 | int lai; |
| 1549 | 1549 | int strobe; |
| 1550 | 1550 | |
| 1551 | 1551 | diablo_hd_device* dhd = m_drive[unit]; |
| 1552 | | if (!dhd) { |
| 1553 | | // FIXME: set all signals for a not connected drive |
| 1554 | | return; |
| 1555 | | } |
| 1556 | | LOG((LOG_DISK,2," STROBE #%d restore:%d cylinder:%d\n", unit, restore, cylinder)); |
| 1552 | LOG((LOG_DISK,2," STROBE #%d restore:%d cylinder:%d dhd:%p\n", unit, restore, cylinder, dhd)); |
| 1557 | 1553 | |
| 1558 | 1554 | /* This is really monoflop 52a generating a very short 0 pulse */ |
| 1559 | 1555 | for (strobe = 0; strobe < 2; strobe++) { |
| r26240 | r26241 | |
| 1595 | 1591 | } else { |
| 1596 | 1592 | /* clear the monoflop 52b, i.e. no timer restart */ |
| 1597 | 1593 | LOG((LOG_DISK,2," STROBON:%d\n", m_dsk.strobe)); |
| 1598 | | |
| 1599 | 1594 | /* update the seekok status: SKINC' && LAI' && Q' of FF 44a */ |
| 1600 | 1595 | seekok = dhd->get_seek_incomplete_0(); |
| 1601 | 1596 | if (seekok != m_dsk.seekok) { |
| r26240 | r26241 | |
| 1649 | 1644 | */ |
| 1650 | 1645 | void alto2_cpu_device::bs_read_kstat_0() |
| 1651 | 1646 | { |
| 1647 | diablo_hd_device* dhd = m_drive[m_dsk.drive]; |
| 1652 | 1648 | UINT16 r; |
| 1653 | | int unit = m_dsk.drive; |
| 1654 | | diablo_hd_device* dhd = m_drive[unit]; |
| 1655 | 1649 | |
| 1656 | 1650 | /* KSTAT[4-7] bus is open */ |
| 1657 | 1651 | PUT_KSTAT_DONE(m_dsk.kstat, 017); |
| r26240 | r26241 | |
| 1972 | 1966 | /* start monoflop 31a, which resets ready_mf31a */ |
| 1973 | 1967 | m_dsk.ready_timer->adjust(attotime::from_nsec(TW_READY), 1); |
| 1974 | 1968 | |
| 1975 | | LOG((LOG_DISK,1," CLRSTAT (44a_Q:%d 44b_Q:%d 45a_Q:%d 45b_Q:%d 31a_Q:%d)\n", |
| 1969 | LOG((LOG_DISK,1," CLRSTAT (44a:%d 44b:%d 45a:%d 45b:%d 31a:%d)\n", |
| 1976 | 1970 | m_dsk.ff_44a & JKFF_Q ? 1 : 0, m_dsk.ff_44b & JKFF_Q ? 1 : 0, |
| 1977 | 1971 | m_dsk.ff_45a & JKFF_Q ? 1 : 0, m_dsk.ff_45b & JKFF_Q ? 1 : 0, |
| 1978 | 1972 | m_dsk.ready_mf31a)); |
| r26240 | r26241 | |
| 2264 | 2258 | kwd_timing(clk, bit, 0); |
| 2265 | 2259 | } |
| 2266 | 2260 | |
| 2261 | #if USE_BITCLK_TIMER |
| 2267 | 2262 | /* more bits to clock? */ |
| 2268 | 2263 | if (++arg < dhd->bits_per_sector()) { |
| 2269 | | #if USE_BITCLK_TIMER |
| 2270 | 2264 | m_dsk.bitclk_timer->adjust(dhd->bit_time(), arg); |
| 2265 | } else { |
| 2266 | m_dsk.bitclk_timer->reset(); |
| 2267 | } |
| 2271 | 2268 | #else |
| 2269 | if (++arg < dhd->bits_per_sector()) { |
| 2272 | 2270 | if (!m_dsk.bitclk_time) |
| 2273 | 2271 | m_dsk.bitclk_time = static_cast<int>(dhd->bit_time().as_double() * ATTOSECONDS_PER_NANOSECOND); |
| 2274 | 2272 | m_bitclk_time += m_dsk.bitclk_time; |
| 2275 | 2273 | m_bitclk_index = arg; |
| 2276 | | #endif |
| 2277 | 2274 | } else { |
| 2278 | 2275 | // stop the bitclock timer |
| 2279 | 2276 | m_bitclk_time = -1; |
| 2280 | 2277 | } |
| 2278 | #endif |
| 2281 | 2279 | } |
| 2282 | 2280 | |
| 2283 | 2281 | /** |
| r26240 | r26241 | |
| 2290 | 2288 | diablo_hd_device* dhd = m_drive[unit]; |
| 2291 | 2289 | LOG((LOG_DISK,0,"%s dhd=%p\n", __FUNCTION__, dhd)); |
| 2292 | 2290 | #if USE_BITCLK_TIMER |
| 2293 | | if (m_dsk.bitclk_timer) { |
| 2294 | | LOG((LOG_DISK,0," unit #%d stop bitclk\n", unit)); |
| 2295 | | m_dsk.bitclk_timer->reset(); |
| 2296 | | } |
| 2291 | LOG((LOG_DISK,0," unit #%d stop bitclk\n", unit)); |
| 2292 | m_dsk.bitclk_timer->enable(false); |
| 2297 | 2293 | #else |
| 2298 | 2294 | if (m_bitclk_time >= 0) { |
| 2299 | 2295 | LOG((LOG_DISK,0," unit #%d stop bitclk\n", unit)); |
| r26240 | r26241 | |
| 2380 | 2376 | m_dsk.strobon_timer->reset(); |
| 2381 | 2377 | |
| 2382 | 2378 | m_dsk.seclate_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(alto2_cpu_device::disk_seclate),this)); |
| 2383 | | // m_dsk.seclate_timer->adjust(attotime::from_nsec(TW_SECLATE), 1); |
| 2379 | // m_dsk.seclate_timer->adjust(attotime::from_nsec(TW_SECLATE), 1); |
| 2384 | 2380 | m_dsk.seclate_timer->reset(); |
| 2385 | 2381 | |
| 2386 | 2382 | m_dsk.ok_to_run_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(alto2_cpu_device::disk_ok_to_run),this)); |
branches/alto2/src/emu/cpu/alto2/alto2.h
| r26240 | r26241 | |
| 26 | 26 | #define USE_PRIO_F9318 0 //!< define to 1 to use the F9318 priority encoder code |
| 27 | 27 | #define USE_ALU_74181 0 //!< define to 1 to use the SN74181 ALU code |
| 28 | 28 | #define DEBUG_DISPLAY_TIMING 0 //!< define to 1 to debug the display timing |
| 29 | | #define USE_BITCLK_TIMER 1 //!< define to 1 to use a very high rate timer for the disk bit clock |
| 29 | #define USE_BITCLK_TIMER 0 //!< define to 1 to use a very high rate timer for the disk bit clock |
| 30 | 30 | #define ALTO2_HAMMING_CHECK 0 //!< define to 1 to incorporate the Hamming code and Parity check |
| 31 | 31 | |
| 32 | 32 | #define ALTO2_TASKS 16 //!< 16 task slots |
| r26240 | r26241 | |
| 1409 | 1409 | UINT8 egate; //!< current erase gate signal to the DIABLO hd |
| 1410 | 1410 | UINT8 wrgate; //!< current write gate signal to the DIABLO hd |
| 1411 | 1411 | UINT8 rdgate; //!< current read gate signal to the DIABLO hd |
| 1412 | | UINT16 shiftin; //!< input shift register |
| 1413 | | UINT16 shiftout; //!< output shift register |
| 1414 | | UINT16 datain; //!< disk data in latch |
| 1415 | | UINT16 dataout; //!< disk data out latch |
| 1412 | UINT32 shiftin; //!< input shift register |
| 1413 | UINT32 shiftout; //!< output shift register |
| 1414 | UINT32 datain; //!< disk data in latch |
| 1415 | UINT32 dataout; //!< disk data out latch |
| 1416 | 1416 | UINT8 krwc; //!< read/write/check for current record |
| 1417 | 1417 | UINT8 kfer; //!< disk fatal error signal state |
| 1418 | 1418 | UINT8 wdtskena; //!< disk word task enable (active low) |