|
|
|
@ -883,15 +883,15 @@ FD_DETECT: |
|
|
|
LD (FST_DOR),A ; AND PUT IN SHADOW REGISTER |
|
|
|
CALL FC_RESETFDC ; RESET FDC |
|
|
|
|
|
|
|
IN A,(FDC_MSR) ; READ MSR |
|
|
|
IN_A_NN(FDC_MSR) ; READ MSR |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
|
|
CP $D0 ; SPECIAL CASE: DATA PENDING? |
|
|
|
JR NZ,FD_DETECT1 ; NOPE, MOVE ALONG |
|
|
|
IN A,(FDC_DATA) ; SWALLOW THE PENDING DATA |
|
|
|
IN_A_NN(FDC_DATA) ; SWALLOW THE PENDING DATA |
|
|
|
CALL DLY32 ; SETTLE |
|
|
|
IN A,(FDC_MSR) ; ... AND REREAD THE STATUS |
|
|
|
IN_A_NN(FDC_MSR) ; ... AND REREAD THE STATUS |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
|
|
@ -902,7 +902,7 @@ FD_DETECT1: |
|
|
|
; WE HAVE SEEN AN FDC THAT NEEDS A SECOND READ TO GET |
|
|
|
; DESIRED VALUE, SO TRY ONE MORE TIME |
|
|
|
CALL DLY32 ; WAIT A BIT |
|
|
|
IN A,(FDC_MSR) ; ... AND REREAD THE STATUS |
|
|
|
IN_A_NN(FDC_MSR) ; ... AND REREAD THE STATUS |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
CP $80 ; CHECK FOR CORRECT VALUE |
|
|
|
@ -1452,7 +1452,7 @@ FC_SETUPSPECIFY: |
|
|
|
; |
|
|
|
FC_SETDOR: |
|
|
|
LD (FST_DOR),A |
|
|
|
OUT (FDC_DOR),A |
|
|
|
OUT_NN_A(FDC_DOR) |
|
|
|
#IF (FDTRACE >= 3) |
|
|
|
CALL NEWLINE |
|
|
|
LD DE,FDSTR_DOR |
|
|
|
@ -1471,7 +1471,7 @@ FC_SETDOR: |
|
|
|
; |
|
|
|
FC_SETDCR |
|
|
|
LD (FST_DCR),A |
|
|
|
OUT (FDC_DCR),A |
|
|
|
OUT_NN_A(FDC_DCR) |
|
|
|
#IF (FDTRACE >= 3) |
|
|
|
CALL NEWLINE |
|
|
|
LD DE,FDSTR_DCR |
|
|
|
@ -1644,11 +1644,11 @@ FOP: |
|
|
|
LD B,0 ; B IS LOOP COUNTER |
|
|
|
FOP_CLR1: |
|
|
|
CALL DELAY ; FDC MAY TAKE UP TO 12us TO UPDATE MSR |
|
|
|
IN A,(FDC_MSR) ; GET STATUS |
|
|
|
IN_A_NN(FDC_MSR) ; GET STATUS |
|
|
|
AND 0C0H ; ISOLATE HIGH NIBBLE, RQM/DIO/NDM/CB |
|
|
|
CP 0C0H ; LOOKING FOR RQM=1, DIO=1, BYTES PENDING |
|
|
|
JR NZ,FOP_CMD1 ; NO BYTES PENDING, GO TO NEXT PHASE |
|
|
|
IN A,(FDC_DATA) ; GET THE PENDING BYTE AND DISCARD |
|
|
|
IN_A_NN(FDC_DATA) ; GET THE PENDING BYTE AND DISCARD |
|
|
|
DJNZ FOP_CLR1 |
|
|
|
JP FOP_TOFDCRDY ; OTHERWISE, TIMEOUT |
|
|
|
; |
|
|
|
@ -1664,7 +1664,7 @@ FOP_CMD2: ; START OF LOOP TO SEND NEXT BYTE |
|
|
|
|
|
|
|
FOP_CMD4: ; START OF STATUS LOOP, WAIT FOR FDC TO BE READY FOR BYTE |
|
|
|
CALL DELAY ; FDC MAY TAKE UP TO 12us TO UPDATE MSR |
|
|
|
IN A,(FDC_MSR) ; READ MAIN STATUS REGISTER |
|
|
|
IN_A_NN(FDC_MSR) ; READ MAIN STATUS REGISTER |
|
|
|
AND 0C0H ; ISOLATE RQM/DIO |
|
|
|
CP 080H ; LOOKING FOR RQM=1, DIO=0 (FDC READY FOR A BYTE) |
|
|
|
JR Z,FOP_CMD6 ; GOOD, GO TO SEND BYTE |
|
|
|
@ -1675,7 +1675,7 @@ FOP_CMD4: ; START OF STATUS LOOP, WAIT FOR FDC TO BE READY FOR BYTE |
|
|
|
|
|
|
|
FOP_CMD6: ; SEND NEXT BYTE |
|
|
|
LD A,(HL) ; POINT TO NEXT BYTE TO SEND |
|
|
|
OUT (FDC_DATA),A ; PUSH IT TO FDC |
|
|
|
OUT_NN_A(FDC_DATA) ; PUSH IT TO FDC |
|
|
|
INC HL ; INCREMENT POINTER FOR NEXT TIME |
|
|
|
DEC D ; DECREMENT NUM BYTES LEFT TO SEND |
|
|
|
JR NZ,FOP_CMD2 ; DO NEXT BYTE |
|
|
|
@ -1706,7 +1706,7 @@ FXR_NULL: |
|
|
|
LD BC,$7000 ; LOOP COUNTER, $7000 * 16us = ~485ms |
|
|
|
FXR_NULL1: |
|
|
|
CALL DELAY ; FDC MAY TAKE UP TO 12us TO UPDATE MSR |
|
|
|
IN A,(FDC_MSR) ; GET MSR |
|
|
|
IN_A_NN(FDC_MSR) ; GET MSR |
|
|
|
AND 0E0H ; ISOLATE RQM/DIO/NDM |
|
|
|
CP 0C0H ; WE WANT RQM=1,DIO=1,NDM=0 (READY TO READ A BYTE W/ EXEC INACTIVE) |
|
|
|
JP Z,FOP_RES ; EXEC DONE, EXIT CLEAN W/O PULSING TC |
|
|
|
@ -1737,13 +1737,13 @@ FXR_READ: |
|
|
|
LD (FCD_TO),A ; INIT TIMEOUT COUNTER |
|
|
|
FXRR1 LD C,0 ; OUTER LOOP TIMEOUT COUNTER |
|
|
|
FXRR2: LD B,0 ; SETUP FOR 256 ITERATIONS |
|
|
|
FXRR3: IN A,(FDC_MSR) ; GET MSR |
|
|
|
FXRR3: IN_A_NN(FDC_MSR) ; GET MSR |
|
|
|
CP 0F0H ; WE WANT RQM=1,DIO=1,NDM=1,BUSY=1 (READY TO RECEIVE A BYTE W/ EXEC ACTIVE) |
|
|
|
JR Z,FXRR4 ; GOT IT, DO BYTE READ |
|
|
|
DJNZ FXRR3 ; NOT READY, LOOP IF COUNTER NOT ZERO |
|
|
|
JR FXRR5 ; COUNTER ZERO, GO TO OUTER LOOP LOGIC |
|
|
|
|
|
|
|
FXRR4: IN A,(FDC_DATA) ; GET PENDING BYTE |
|
|
|
FXRR4: IN_A_NN(FDC_DATA) ; GET PENDING BYTE |
|
|
|
LD (HL),A ; STORE IT IN BUFFER |
|
|
|
INC HL ; INCREMENT THE BUFFER POINTER |
|
|
|
DEC DE ; DECREMENT BYTE COUNT |
|
|
|
@ -1780,13 +1780,13 @@ FXR_WRITE: |
|
|
|
LD (FCD_TO),A |
|
|
|
FXRW1 LD C,0 ; OUTER LOOP TIMEOUT COUNTER |
|
|
|
FXRW2: LD B,0 ; SETUP FOR 256 ITERATIONS |
|
|
|
FXRW3: IN A,(FDC_MSR) ; GET MSR |
|
|
|
FXRW3: IN_A_NN(FDC_MSR) ; GET MSR |
|
|
|
CP 0B0H ; WE WANT RQM=1,DIO=0,NDM=1,BUSY=1 (READY TO SEND A BYTE W/ EXEC ACTIVE) |
|
|
|
JR Z,FXRW4 ; GOT IT, DO BYTE WRITE |
|
|
|
DJNZ FXRW3 ; NOT READY, LOOP IF COUNTER NOT ZERO |
|
|
|
JR FXRW5 ; COUNTER ZERO, GO TO OUTER LOOP LOGIC |
|
|
|
FXRW4: LD A,(HL) ; GET NEXT BYTE TO WRITE |
|
|
|
OUT (FDC_DATA),A ; WRITE IT |
|
|
|
OUT_NN_A(FDC_DATA) ; WRITE IT |
|
|
|
INC HL ; INCREMENT THE BUFFER POINTER |
|
|
|
DEC DE ; DECREMENT LOOP COUNTER |
|
|
|
LD A,D |
|
|
|
@ -1830,7 +1830,7 @@ FOP_RES0: |
|
|
|
|
|
|
|
FOP_RES1: |
|
|
|
CALL DELAY ; FDC MAY TAKE UP TO 12us TO UPDATE MSR |
|
|
|
IN A,(FDC_MSR) ; READ MAIN STATUS REGISTER |
|
|
|
IN_A_NN(FDC_MSR) ; READ MAIN STATUS REGISTER |
|
|
|
AND 0F0H ; ISOLATE RQM/DIO/EXEC/BUSY |
|
|
|
CP 0D0H ; LOOKING FOR RQM/DIO/BUSY |
|
|
|
JR Z,FOP_RES2 ; GOOD, GO TO RECEIVE BYTE |
|
|
|
@ -1848,7 +1848,7 @@ FOP_RES2: ; PROCESS NEXT PENDING BYTE |
|
|
|
LD A,FRB_SIZ ; GET BUF SIZE |
|
|
|
CP D ; REACHED MAX? |
|
|
|
JR Z,FOP_BUFMAX ; HANDLE BUF MAX/EXIT |
|
|
|
IN A,(FDC_DATA) ; GET THE BYTE |
|
|
|
IN_A_NN(FDC_DATA) ; GET THE BYTE |
|
|
|
LD (HL),A ; SAVE VALUE |
|
|
|
INC HL ; INCREMENT BUF POS |
|
|
|
INC D ; INCREMENT BYTES RECEIVED |
|
|
|
|