ottmar@micomvax.UUCP (02/25/87)
--- Some time ago, someone asked the net how to determine if a CoCo was running at double speed. I didn't see any answers posted, so I assume that there is no known flag maintained by hardware. In the absence of such an indicator, I would suggest that the next-best thing is subroutine DBLCHK ("Double-speed Check") listed below. It takes at most about 1/7 of a *millisecond* to execute, and will return with the carry flag set if the CoCo is operating at the standard (i.e. slow) .894 MHz speed. To avoid some confusion I should mention that this subroutine is only applicable to the CoCo III environment. It is checking for double-speed access to RAM which for CoCo II was unusable anyhow due to loss of video refresh. DBLCHK uses the CoCo's video scan-line duration (63.5 microseconds) as a timing reference. Every 63.5 us. bit 7 of $FF01 is set by the video timing hardware; the bit can be reset by loading $FF00. This parallels the 16.7 millisecond timer which uses $FF03/$FF02 instead of $FF01/$FF00 (I don't have my references handy, so you might want to double-check those addresses ...). Note that the above mechanism is independent of whether or not the 16.7 ms or 63.5 us. IRQs have been enabled. DBLCHK waits for the end of a scan line and just *counts* until the next scan line ends. At .894 MHz the count is always 5 or 6 while at 1.788 MHz the count is consistently 11. It uses the value of 9 as a threshold. DBLCHK CLRA Initialize counter to 0 ORCC #$50 Disable interrupts LDB $FF00 Clear the scan-line flag WAIT LDB $FF01 Wait for bit 7 to be set BPL WAIT (i.e. end of scan line) LDB $FF00 Clear the scan-line flag, again COUNT INCA Start counting ... LDB $FF01 Keep counting until the BPL COUNT end of the scan line ANDCC #$AF Re-enable interrupts CMPA #9 Set carry if slow speed RTS It may be possible to apply the above technique to CoCo II's intermediate- speed mode (single-speed RAM, double-speed ROM). You would have to call the BASIC ROM delay routine - the one that consists of LEAX -1,X / BNE .-2 / RTS. This of course leads to another question : on a CoCo 2, how can you tell if the upper 32K is mapped into ROM ... ? Does anyone out there have any comments on routine DBLCHK ? Is there an easier or faster method of checking CPU speed? Ottmar Bochardt ... philabs!micomvax!ottmar