From 409c3064748d8f4128110075c6ac1d9ed18885fd Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 17 Dec 2017 14:53:11 -0800 Subject: [PATCH] Update Survey App Updated SURVEY app to properly handle Z80 16 bit I/O port addressing. Minor improvements to FDU. --- Source/Apps/FDU/FDU.asm | 64 +++++++++++++++++++++++------------------ Source/Apps/Survey.asm | 16 ++++++----- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/Source/Apps/FDU/FDU.asm b/Source/Apps/FDU/FDU.asm index 46ece7d0..4d952e42 100644 --- a/Source/Apps/FDU/FDU.asm +++ b/Source/Apps/FDU/FDU.asm @@ -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 diff --git a/Source/Apps/Survey.asm b/Source/Apps/Survey.asm index a30252e9..33c71236 100644 --- a/Source/Apps/Survey.asm +++ b/Source/Apps/Survey.asm @@ -15,6 +15,9 @@ ; ;VERSION LIST - Most recent version first. ; +;16/Dec/17 - Handle 16-bit port addressing using +; Z80 IN A,(C) instruction. Wayne Warthen +; ;06/Jul/82 - Added Godbout DISK 1 equate and added SKIP equate ; Bill Bolton - Software Tools, Australia ; @@ -239,7 +242,7 @@ START: SHLD OLDSP LXI SP,FINIS+64 CALL TYPE ; Type initial CRLF - DB TAB,TAB,'*** System Survey (June 82) ***' + DB TAB,TAB,'*** System Survey (December 17) ***' DW CRLF,CRLFE ;DISK SURVEY @@ -594,14 +597,13 @@ PORTLP: JZ ISPORT ; Print mask port ENDIF - mov b,a ; save port # - STA INPORT+1 -INPORT: - IN 0 ; Modifiable code -; by trial and error, inactive port could return FF or echo port # + mov c,a ; port number to reg c + mvi b,0 ; for 16 bit port addressing + db 0edh,078h ; z80: in a,(c) +; inactive port could return 0xFF or 0x78 CPI 0FFH JZ NEXTPT - cmp b + cpi 078h jz nextpt ISPORT: mov a,d ; got a live one, probably