[Coco] No HALT floppy IO (was Questions about the 502 controller vs theDisto SCII)
Robert Gault
robert.gault at worldnet.att.net
Sat Jul 29 06:33:25 EDT 2006
Warren Hoslet wrote:
>>> I implemented a read routine that works (with limited testing) on a
>>> CoCo 2 with an FD-501. You just have to monitor the DRQ bit in the
>>> status register ($FF48) to know when a byte is available. The trick
>>> is that after a certian number of cycles have elapsed without a DRQ,
>>> you must assume the transfer is complete and stop testing the
>>> status register so that you don't clear the INTRQ request when it
>>> comes. Below is just the read loop portion of my routine. The DP
>>> register is set to $FF, and B contains the mask for the DRQ status bit.
>
>
>> On read, yes, this does work. It's on write that we can't get it
>> to fully keep up. I believe myself, Robert Gault and Alan Dekok all
>> tried, and we just couldn't quite make it.
>
>
> Well, if anyone still cares about this, I did manage to get no-HALT
> sector writing to work on a standard shack FD501 controller. At first I
> had difficulty, but after reading the description of the Write Sector
> command in the 1773 datasheet, it became clear what the problem was. The
> FDC sets the DRQ status bit long before it is actually ready to write
> your data. After you respond to the initial DRQ by supplying the first
> byte, you have to wait for the FDC to process 36 gap bytes, 1 Data Mark
> byte, and your first data byte before it gives you another DRQ. This
> means you need an additional loop just to wait for the second DRQ.
>
> Below is a listing of the main portion of the write routine. I created a
> modified version of Disk Basic 1.1 which uses this for sector writes in
> DSKCON. I tested it by perfoming a BACKUP, and it worked without error.
> I ran it on a stock CoCo 2 (0.889 mhz 6809e). The routine would probably
> need to be modified in order to work at higher speeds.
>
> LDY #0 ; PREP TIMEOUT COUNTER
> LDU #$FF48 ; POINTER TO FDC REGISTERS
> LDB #$02 ; THE DRQ MASK
> WAIT1 BITB ,U ; READY FOR FIRST BYTE?
> BNE WRFRST ; BRANCH IF READY
> LEAY -1,Y ; DECREMENT TIMEOUT COUNTER
> BNE WAIT1 ; KEEP WAITING FOR DRQ
> JMP NOTRDY ; GO HANDLE TIMEOUT ERROR
>
> WRFRST LDA ,X+ ; FIRST BYTE FROM BUFFER
> STA 3,U ; GIVE IT TO FDC
> LDA ,X+ ; SECOND BYTE FROM BUFFER
>
> WAIT2 BITB ,U ; WAIT FOR FDC TO WRITE..
> BEQ WAIT2 ; ..GAP, DATA MARK, BYTE 1
>
> WRLOOP STA 3,U ; GIVE DATA BYTE TO FDC
> LDA ,X+ ; GET NEXT DATA BYTE
> BITB ,U ; CHECK FOR DRQ AND..
> BNE WRLOOP ; ..BRANCH IF READY
> BITB ,U ; CHECK AGAIN
> BNE WRLOOP
> BITB ,U ; ..AND AGAIN
> BNE WRLOOP
> BITB ,U ; ..AND ONE LAST TIME
> BNE WRLOOP
> CWAI #$FF ; DONE! WAIT FOR NMI
>
>
>
How does this code succeed in no-halt operation other than the
technicality of not using the Halt line? The point of "no-halt"
operation is that you can type (or otherwise multi-task) while doing
disk I/O and no keys are missed.
More information about the Coco
mailing list