[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