|
|
|
@ -2067,8 +2067,7 @@ FCP_XFRCNT .DW 00H ; BYTES TRANSFERRED DURING COMMAND PHASE |
|
|
|
; |
|
|
|
FXP_XR .DW 00H ; INPUT: ADDRESS OF EXECUTION ROUTINE TO INVOKE |
|
|
|
FXP_TO .DB 00H ; TIMEOUT COUNTDOWN TIMER USED IN SOME VARIATIONS |
|
|
|
FXP_XFRCNT .DW 00H ; BYTES TRANSFERRED DURING EXECUTION |
|
|
|
FXP_ITER .DB 00H ; LOOP ITERATION WORKING COUNTER |
|
|
|
FXP_ITER .DB 00H ; LOOP ITERATION COUNTER (MUST IMMEDIATELY FOLLOW FXP_TO) |
|
|
|
FXP_A .DB 00H ; LAST VALUE OF REG A RECORDED DURING EXECUTION |
|
|
|
FXP_BC .DW 00H ; LAST VALUE OF REG BC RECORDED DURING EXECUTION |
|
|
|
FXP_DE .DW 00H ; LAST VALUE OF REG DE RECORDED DURING EXECUTION |
|
|
|
@ -2882,6 +2881,8 @@ FOP_X1: |
|
|
|
CALL JPHL ; CALL INDIRECTLY VIA HL |
|
|
|
|
|
|
|
LD A,(FST_RC) ; CURRENT RESULT CODE |
|
|
|
;CALL PC_SPACE |
|
|
|
;CALL PRTHEXBYTE |
|
|
|
CP FRC_OK ; ERROR? |
|
|
|
RET NZ ; IF SO, ALL DONE |
|
|
|
|
|
|
|
@ -2903,14 +2904,14 @@ FOP_RES0: |
|
|
|
FOP_RES1: |
|
|
|
CALL DELAY ; FDC MAY TAKE UP TO 12us TO UPDATE MSR |
|
|
|
IN A,(C) ; READ MAIN STATUS REGISTER |
|
|
|
;CALL PC_SPACE |
|
|
|
;CALL PRTHEXBYTE |
|
|
|
LD (FST_MSR),A ; SAVE IT FOR POTENTIAL LATER DIAGNOSIS |
|
|
|
AND 0F0H ; REMOVE SEEK BITS |
|
|
|
CP 0D0H ; LOOKING FOR RQM=1, DIO=1, BUSY=1 (FDC BYTE PENDING) |
|
|
|
AND $F0 ; REMOVE SEEK BITS |
|
|
|
CP $D0 ; LOOKING FOR RQM=1, DIO=1, BUSY=1 (FDC BYTE PENDING) |
|
|
|
JR Z,FOP_RES2 ; GOOD, GO TO RECEIVE BYTE |
|
|
|
CP $80 ; DONE? |
|
|
|
JR Z,FOP_EVAL ; IF SO, GO TO EVAL |
|
|
|
;CALL PC_SPACE |
|
|
|
;CALL PRTHEXBYTE |
|
|
|
DEC DE |
|
|
|
LD A,D |
|
|
|
OR E |
|
|
|
@ -3150,8 +3151,8 @@ FXRX: |
|
|
|
FXRX1: |
|
|
|
CALL DELAY |
|
|
|
IN A,(C) ; GET MSR |
|
|
|
AND 0E0H ; ISOLATE RQM/DIO/EXM |
|
|
|
CP 0C0H ; WE WANT RQM=1,DIO=1,EXM=0 (READY TO READ A BYTE W/ EXEC INACTIVE) |
|
|
|
;AND 0E0H ; ISOLATE RQM/DIO/EXM |
|
|
|
CP $D0 ; WE WANT RQM=1,DIO=1,EXM=0 (READY TO READ A BYTE W/ EXEC INACTIVE) |
|
|
|
JP Z,FXR_END ; GOT IT, EXIT CLEAN |
|
|
|
DEC DE ; DECREMENT COUNTER (16 BIT) |
|
|
|
LD A,D ; CHECK FOR ZERO |
|
|
|
@ -3170,10 +3171,11 @@ FXRR: LD A,E ; LOW BYTE OF COUNT TO ACCUM |
|
|
|
FXRR1: LD B,E ; LOW BYTE OF COUNT TO B |
|
|
|
LD A,D ; HIGH BYTE OF COUNT |
|
|
|
LD (FXP_ITER),A ; ... IS ITERATION COUNT |
|
|
|
LD IX,FXP_ITER ; SETUP IX AS POINTER TO ITERATION COUNT |
|
|
|
LD A,(CPUSPD) ; CPU SPEED SCALER |
|
|
|
LD (FXP_TO),A ; SAVE IT AS OUTER LOOP TIMEOUT |
|
|
|
LD IX,FXP_TO ; (IX) IS FXP_TO, (IX+1) IS FCP_ITER |
|
|
|
LD C,(IY+CFG_DATA) ; SET C TO DATA PORT |
|
|
|
LD DE,0 |
|
|
|
DI ; DISABLE INTERRUPTS TO AVOID OVERRUN |
|
|
|
FXRR2: DEC C ; [04] SET C TO MSR PORT |
|
|
|
FXRR3: LD DE,0 ; [10] TIMEOUT COUNTER |
|
|
|
@ -3187,16 +3189,14 @@ FXRR4: IN A,(C) ; [12] GET MSR |
|
|
|
JP Z,FXR_ABORT ; [10] IF NOT SET, EXECUTION ABORTED |
|
|
|
DEC D ; [04] DEC MSB OF INNER TIMEOUT COUNTER |
|
|
|
JR NZ,FXRR4 ; [12/7] LOOP IF MSB IS NOT EXHAUSTED |
|
|
|
LD A,(FXP_TO) ; [13] GET OUTER LOOP COUNTER |
|
|
|
DEC A ; [04] DECREMENT |
|
|
|
LD (FXP_TO),A ; [13] SAVE NEW COUNTER VALUE |
|
|
|
DEC (IX) ; [23] DECREMENT OUTER LOOP COUNTER |
|
|
|
JR NZ,FXRR3 ; [12/7] LOOP IF NOT EXHAUSTED |
|
|
|
JP FXR_TO ; [10] OTHERWISE, HANDLE TIMEOUT |
|
|
|
FXRR5: INC C ; [04] POINT TO DATA PORT |
|
|
|
INI ; [16] (HL) := (C), HL++, B-- |
|
|
|
JR NZ,FXRR2 ; [12/7] LOOP |
|
|
|
DEC (IX) ; [23] DECREMENT ITERATION COUNT |
|
|
|
JR NZ,FXRR2 ; [12] IF MORE ITERATIONS, GO DO IT |
|
|
|
DEC (IX+1) ; [23] DECREMENT ITERATION COUNT |
|
|
|
JR NZ,FXRR2 ; [12] IF MORE ITERATIONS, LOOP |
|
|
|
JP FXR_END ; [10] ELSE DONE |
|
|
|
|
|
|
|
; |
|
|
|
@ -3275,10 +3275,11 @@ FXRW: LD A,E ; LOW BYTE OF COUNT TO ACCUM |
|
|
|
FXRW1: LD B,E ; LOW BYTE OF COUNT TO B |
|
|
|
LD A,D ; HIGH BYTE OF COUNT |
|
|
|
LD (FXP_ITER),A ; ... IS ITERATION COUNT |
|
|
|
LD IX,FXP_ITER ; SETUP IX AS POINTER TO ITERATION COUNT |
|
|
|
LD A,(CPUSPD) ; CPU SPEED SCALER |
|
|
|
LD (FXP_TO),A ; SAVE IT AS OUTER LOOP TIMEOUT |
|
|
|
LD IX,FXP_TO ; (IX) IS FXP_TO, (IX+1) IS FCP_ITER |
|
|
|
LD C,(IY+CFG_DATA) ; SET C TO DATA PORT |
|
|
|
LD DE,0 |
|
|
|
DI ; DISABLE INTERRUPTS TO AVOID OVERRUN |
|
|
|
FXRW2: DEC C ; [04] SET C TO MSR PORT |
|
|
|
FXRW3: LD DE,0 ; [10] TIMEOUT COUNTER |
|
|
|
@ -3292,19 +3293,18 @@ FXRW4: IN A,(C) ; [12] GET MSR |
|
|
|
JP Z,FXR_ABORT ; [10] IF NOT SET, EXECUTION ABORTED |
|
|
|
DEC D ; [04] DEC MSB OF INNER TIMEOUT COUNTER |
|
|
|
JR NZ,FXRW4 ; [12/7] LOOP IF MSB IS NOT EXHAUSTED |
|
|
|
LD A,(FXP_TO) ; [13] GET OUTER LOOP COUNTER |
|
|
|
DEC A ; [04] DECREMENT |
|
|
|
LD (FXP_TO),A ; [13] SAVE NEW COUNTER VALUE |
|
|
|
DEC (IX) ; [23] DECREMENT OUTER LOOP COUNTER |
|
|
|
JR NZ,FXRW3 ; [12/7] LOOP IF NOT EXHAUSTED |
|
|
|
JP FXR_TO ; [10] OTHERWISE, HANDLE TIMEOUT |
|
|
|
FXRW5: INC C ; [04] POINT TO DATA PORT |
|
|
|
OUTI ; [16] (C) := (HL), HL++, B-- |
|
|
|
JR NZ,FXRW2 ; [12/7] LOOP |
|
|
|
DEC (IX) ; [23] DECREMENT ITERATION COUNT |
|
|
|
DEC (IX+1) ; [23] DECREMENT ITERATION COUNT |
|
|
|
JR NZ,FXRW2 ; [12] IF MORE ITERATIONS, GO DO IT |
|
|
|
JP FXR_END ; [10] ELSE DONE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
; INT WRITE DATA - SAFE VERSION |
|
|
|
; HANDLES FDC ERRORS, BUT NO TIMEOUT |
|
|
|
@ -3372,24 +3372,36 @@ WFXRW2: |
|
|
|
; |
|
|
|
|
|
|
|
FXR_TO: |
|
|
|
; SAVE CURRENT MSR VALUE |
|
|
|
;LD C,(IY+CFG_MSR) ; SET C TO MSR PORT |
|
|
|
;IN A,(C) |
|
|
|
LD (FST_MSR),A |
|
|
|
; SET ERROR AND GET OUT W/O PULSING TC |
|
|
|
LD A,FRC_TOEXEC |
|
|
|
LD (FST_RC),A |
|
|
|
JR FXR_END2 |
|
|
|
|
|
|
|
FXR_ABORT: |
|
|
|
; SAVE CURRENT MSR VALUE |
|
|
|
;LD C,(IY+CFG_MSR) ; SET C TO MSR PORT |
|
|
|
;IN A,(C) |
|
|
|
LD (FST_MSR),A |
|
|
|
; LET RESULTS PHASE HANDLE ERROR, DO NOT PULSE TC, COMMAND ALREADY TERMINATED |
|
|
|
;LD A,FRC_ABORT |
|
|
|
;LD (FST_RC),A |
|
|
|
JR FXR_END2 |
|
|
|
|
|
|
|
FXR_END: |
|
|
|
; SAVE CURRENT MSR VALUE |
|
|
|
;LD C,(IY+CFG_MSR) ; SET C TO MSR PORT |
|
|
|
;IN A,(C) |
|
|
|
LD (FST_MSR),A |
|
|
|
; DO NOT PULSE TC AT END OF FORMAT OR READID, THOSE COMMANDS SELF-TERMINATE |
|
|
|
LD A,(FCP_CMD) |
|
|
|
CP CMD_FMTTRK |
|
|
|
JR Z,FXR_END2 |
|
|
|
CP CMD_READID |
|
|
|
JR Z,FXR_END2 |
|
|
|
;LD A,(FCP_CMD) |
|
|
|
;CP CMD_FMTTRK |
|
|
|
;JR Z,FXR_END2 |
|
|
|
;CP CMD_READID |
|
|
|
;JR Z,FXR_END2 |
|
|
|
|
|
|
|
CALL FC_PULSETC |
|
|
|
|
|
|
|
@ -3400,10 +3412,6 @@ FXR_END2: |
|
|
|
LD (FXP_DE),DE |
|
|
|
LD (FXP_HL),HL |
|
|
|
|
|
|
|
LD C,(IY+CFG_MSR) ; SET C TO MSR PORT |
|
|
|
IN A,(C) |
|
|
|
LD (FST_MSR),A |
|
|
|
|
|
|
|
CALL FXR_DUMP |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
|