|
|
|
@ -37,12 +37,13 @@ |
|
|
|
; 2017-09-02: V5.0 RENAMED APP TO FDU (FLOPPY DISK UTILITY) |
|
|
|
; DYNAMIC FDC SELECTION AT STARTUP |
|
|
|
; DYNAMIC CPU SPEED ADJUSTMENT |
|
|
|
; 2017-12-16: V5.1 IMPROVED POLLING READ/WRITE PERFORMANCE |
|
|
|
; |
|
|
|
;_______________________________________________________________________________ |
|
|
|
; |
|
|
|
; BUILDING: |
|
|
|
; CAN BE BUILT WITH TASM LIKE THIS: |
|
|
|
; TASM -t80 -b -fFF FD.ASM FD.COM FD.LST |
|
|
|
; TASM -t80 -b -fFF FDU.ASM FDU.COM FDU.LST |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; 1) CURRENT TRACK IS UPDATED EVEN IF SEEK FAILS! (DEFER, RECOVERS AUTOMATICALLY) |
|
|
|
@ -56,8 +57,6 @@ |
|
|
|
;_______________________________________________________________________________ |
|
|
|
; |
|
|
|
; |
|
|
|
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS |
|
|
|
; |
|
|
|
FDC_DIO .EQU 0 |
|
|
|
FDC_DIO3 .EQU 1 |
|
|
|
FDC_ZETA .EQU 2 |
|
|
|
@ -198,7 +197,7 @@ INIT5: |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
|
|
|
|
STR_BANNER .DB "Floppy Disk Utility (FDU) v5.0, 02-Sep-2017$" |
|
|
|
STR_BANNER .DB "Floppy Disk Utility (FDU) v5.1, 16-Dec-2017$" |
|
|
|
STR_BANNER2 .DB "Copyright (C) 2017, Wayne Warthen, GNU GPL v3","$" |
|
|
|
STR_HBIOS .DB " [HBIOS]$" |
|
|
|
STR_UBIOS .DB " [UBIOS]$" |
|
|
|
@ -2067,8 +2066,9 @@ FCP_XFRCNT .DW 00H ; BYTES TRANSFERRED DURING COMMAND PHASE |
|
|
|
; FDC EXECUTION PHASE |
|
|
|
; |
|
|
|
FXP_XR .DW 00H ; INPUT: ADDRESS OF EXECUTION ROUTINE TO INVOKE |
|
|
|
FXP_TO .DW 00H ; TIMEOUT COUNTDOWN TIMER USED IN SOME VARIATIONS |
|
|
|
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_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 |
|
|
|
@ -2881,8 +2881,9 @@ FOP_X1: |
|
|
|
LD HL,(FXP_XR) ; LOAD THE EXECUTION ROUTINE ADDRESS |
|
|
|
CALL JPHL ; CALL INDIRECTLY VIA HL |
|
|
|
|
|
|
|
; FIX: NEED TO CHECK REG A FOR STATUS, DEPENDING ON STATUS |
|
|
|
; IT MAY BE NECESSARY TO DO SOMETHING SPECIAL? |
|
|
|
LD A,(FST_RC) ; CURRENT RESULT CODE |
|
|
|
CP FRC_OK ; ERROR? |
|
|
|
RET NZ ; IF SO, ALL DONE |
|
|
|
|
|
|
|
; JP FOP_RES ; CONTINUE WITH GETRESULTS |
|
|
|
|
|
|
|
@ -2890,9 +2891,9 @@ FOP_X1: |
|
|
|
; RESULTS PHASE |
|
|
|
; |
|
|
|
FOP_RES: |
|
|
|
LD B,0 ; D = BYTES RECEIVED |
|
|
|
LD B,0 ; B = BYTES RECEIVED |
|
|
|
LD HL,FRB_LEN ; POINT TO BUFFER LENGTH |
|
|
|
LD (HL),D ; UPDATE NUMBER OF BYTES RECEIVED |
|
|
|
LD (HL),B ; UPDATE NUMBER OF BYTES RECEIVED |
|
|
|
LD HL,FRB ; POINT TO RECEIVE BUFFER |
|
|
|
|
|
|
|
FOP_RES0: |
|
|
|
@ -2903,11 +2904,13 @@ FOP_RES1: |
|
|
|
CALL DELAY ; FDC MAY TAKE UP TO 12us TO UPDATE MSR |
|
|
|
IN A,(C) ; READ MAIN STATUS REGISTER |
|
|
|
LD (FST_MSR),A ; SAVE IT FOR POTENTIAL LATER DIAGNOSIS |
|
|
|
AND 0F0H ; ISOLATE RQM/DIO |
|
|
|
AND 0F0H ; REMOVE SEEK BITS |
|
|
|
CP 0D0H ; LOOKING FOR RQM=1, DIO=1, BUSY=1 (FDC BYTE PENDING) |
|
|
|
JP Z,FOP_RES2 ; GOOD, GO TO RECEIVE BYTE |
|
|
|
CP 080H ; CHECK FOR RQM=1, DIO=0 (NOTHING LEFT) |
|
|
|
JP Z,FOP_EVAL ; IF NOTHING, ALL DONE, LEFT GO TO EOD/EXIT |
|
|
|
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 |
|
|
|
@ -3156,45 +3159,45 @@ FXRX1: |
|
|
|
JR NZ,FXRX1 ; NOT ZERO YET, KEEP CHECKING |
|
|
|
JP FXR_TO ; OTHERWISE, TIMEOUT ERROR |
|
|
|
RET |
|
|
|
|
|
|
|
; |
|
|
|
; READ DATA |
|
|
|
; |
|
|
|
FXRR: |
|
|
|
DI ; DISABLE INTERRUPTS TO AVOID TIMEOUTS |
|
|
|
LD A,(CPUFREQ + 3) / 4 ; HIGH BYTE OF OUTER LOOP COUNTER |
|
|
|
LD (FXP_TO+1),A ; SAVE HIGH BYTE OF COUNTER |
|
|
|
XOR A ; LOW BYTE IS ZERO |
|
|
|
LD (FXP_TO),A ; SAVE LOW BYTE |
|
|
|
LD B,A ; INIT INNER LOOP COUNTER |
|
|
|
LD C,(IY+CFG_MSR) ; SET C TO MSR PORT |
|
|
|
FXRR1: LD B,0 ; SETUP FOR 256 ITERATIONS (INNER LOOP) |
|
|
|
; INNER LOOP |
|
|
|
FXRR2: IN A,(C) ; GET MSR |
|
|
|
CP 0F0H ; WE WANT RQM=1,DIO=1,EXM=1,BUSY=1 (READY TO RECEIVE A BYTE W/ EXEC ACTIVE) |
|
|
|
JP Z,FXRR3 ; GOT IT, DO BYTE READ |
|
|
|
DJNZ FXRR2 ; NOT READY, LOOP IF COUNTER NOT ZERO |
|
|
|
; OUTER LOOP |
|
|
|
AND 0E0H ; MASK TO ISOLATE RQM, DIO, EXM |
|
|
|
CP 0C0H ; IF RQM=1, DIO=1, EXM=0 (EXECUTION ABORTED) |
|
|
|
JP Z,FXR_ABORT ; IF ZERO, BAIL OUT TO ERR ROUTINE, FIX: GO TO SPECIFIC ROUTINE FOR THIS??? |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
LD HL,(FXP_TO) ; GET DOWN COUNTER |
|
|
|
DEC HL ; DECREMENT |
|
|
|
LD (FXP_TO),HL ; SAVE IT |
|
|
|
LD A,L ; CHECK COUNTER |
|
|
|
OR H ; ... FOR ZERO |
|
|
|
POP HL ; RESTORE HL |
|
|
|
JR NZ,FXRR1 ; LOOP IF NOT ZERO |
|
|
|
JP FXR_TO ; OTHERWISE, TIMEOUT |
|
|
|
FXRR3: ; READ A PENDING BYTE |
|
|
|
INC C ; SET C TO DATA PORT |
|
|
|
INI ; READ PORT C TO (HL) AND INC HL |
|
|
|
DEC C ; SET C BACK TO STATUS PORT |
|
|
|
DEC DE ; DECREMENT BYTE COUNT |
|
|
|
LD A,D ; TEST COUNTER |
|
|
|
OR E ; ... FOR ZERO |
|
|
|
JP NZ,FXRR1 ; IF NOT ZERO, REPEAT LOOP |
|
|
|
JP FXR_END ; CLEAN EXIT |
|
|
|
FXRR: LD A,E ; LOW BYTE OF COUNT TO ACCUM |
|
|
|
OR A ; TEST FOR ZERO |
|
|
|
JR Z,FXRR1 ; IF ZERO, DO NOT ADJUST ITERATIONS |
|
|
|
INC D ; OTHERWISE, ITERATIONS IS ONE MORE THAN HIGH BYTE |
|
|
|
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 C,(IY+CFG_DATA) ; SET C TO DATA PORT |
|
|
|
DI ; DISABLE INTERRUPTS TO AVOID OVERRUN |
|
|
|
FXRR2: DEC C ; [04] SET C TO MSR PORT |
|
|
|
FXRR3: LD DE,0 ; [10] TIMEOUT COUNTER |
|
|
|
FXRR4: IN A,(C) ; [12] GET MSR |
|
|
|
CP $F0 ; [07] BYTE READY? |
|
|
|
JR Z,FXRR5 ; [12/7] GET IT |
|
|
|
;LD (FST_MSR),A ; [13] *DEBUG* SAVE MSR FOR LATER |
|
|
|
DEC E ; [04] DEC LSB OF INNER TIMEOUT COUNTER |
|
|
|
JR NZ,FXRR4 ; [12/7] LOOP IF LSB IS NOT EXHAUSTED |
|
|
|
CP $D0 ; [07] IF RQM=1, DIO=1, EXM=0, CB=1, EXECUTION ABORTED |
|
|
|
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 |
|
|
|
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 |
|
|
|
JP FXR_END ; [10] ELSE DONE |
|
|
|
|
|
|
|
; |
|
|
|
; INT READ DATA - SAFE VERSION |
|
|
|
@ -3265,42 +3268,42 @@ WFXRR2: |
|
|
|
; |
|
|
|
; WRITE DATA |
|
|
|
; |
|
|
|
FXRW: |
|
|
|
DI ; DISABLE INTERRUPTS TO AVOID TIMEOUTS |
|
|
|
LD A,(CPUFREQ + 3) / 4 ; HIGH BYTE OF OUTER LOOP COUNTER |
|
|
|
LD (FXP_TO+1),A ; SAVE HIGH BYTE OF COUNTER |
|
|
|
XOR A ; LOW BYTE IS ZERO |
|
|
|
LD (FXP_TO),A ; SAVE LOW BYTE |
|
|
|
LD B,A ; INIT INNER LOOP COUNTER |
|
|
|
LD C,(IY+CFG_MSR) ; SET C TO MSR PORT |
|
|
|
FXRW1: LD B,0 ; SETUP FOR 256 ITERATIONS |
|
|
|
; INNER LOOP |
|
|
|
FXRW2: IN A,(C) ; GET MSR |
|
|
|
CP 0B0H ; WE WANT RQM=1,DIO=0,EXM=1,BUSY=1 (READY TO SEND A BYTE W/ EXEC ACTIVE) |
|
|
|
JR Z,FXRW3 ; GOT IT, DO BYTE WRITE |
|
|
|
DJNZ FXRW2 ; NOT READY, LOOP IF COUNTER NOT ZERO |
|
|
|
; OUTER LOOP |
|
|
|
AND 0E0H ; MASK TO ISOLATE RQM, DIO, EXM |
|
|
|
CP 0C0H ; IF RQM=1, DIO=1, EXM=0 (EXECUTION ABORTED) |
|
|
|
JP Z,FXR_ABORT ; IF ZERO, BAIL OUT TO ERR ROUTINE, FIX: GO TO SPECIFIC ROUTINE FOR THIS??? |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
LD HL,(FXP_TO) ; GET DOWN COUNTER |
|
|
|
DEC HL ; DECREMENT |
|
|
|
LD (FXP_TO),HL ; SAVE IT |
|
|
|
LD A,L ; CHECK COUNTER |
|
|
|
OR H ; ... FOR ZERO |
|
|
|
POP HL ; RESTORE HL |
|
|
|
JR NZ,FXRW1 ; LOOP IF NOT ZERO |
|
|
|
JP FXR_TO ; OTHERWISE, TIMEOUT |
|
|
|
FXRW3: ; READ A PENDING BYTE |
|
|
|
INC C ; SET C TO DATA PORT |
|
|
|
OUTI ; WRITE (HL) TO PORT C AND INC HL |
|
|
|
DEC C ; SET C BACK TO STATUS PORT |
|
|
|
DEC DE ; DECREMENT LOOP COUNTER |
|
|
|
LD A,D ; TEST COUNTER |
|
|
|
OR E ; ... FOR ZERO |
|
|
|
JP NZ,FXRW1 ; IF NOT ZERO, REPEAT LOOP |
|
|
|
JP FXR_END ; CLEAN EXIT |
|
|
|
FXRW: LD A,E ; LOW BYTE OF COUNT TO ACCUM |
|
|
|
OR A ; TEST FOR ZERO |
|
|
|
JR Z,FXRW1 ; IF ZERO, DO NOT ADJUST ITERATIONS |
|
|
|
INC D ; OTHERWISE, ITERATIONS IS ONE MORE THAN HIGH BYTE |
|
|
|
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 C,(IY+CFG_DATA) ; SET C TO DATA PORT |
|
|
|
DI ; DISABLE INTERRUPTS TO AVOID OVERRUN |
|
|
|
FXRW2: DEC C ; [04] SET C TO MSR PORT |
|
|
|
FXRW3: LD DE,0 ; [10] TIMEOUT COUNTER |
|
|
|
FXRW4: IN A,(C) ; [12] GET MSR |
|
|
|
CP $B0 ; [07] BYTE READY? |
|
|
|
JR Z,FXRW5 ; [12/7] GET IT |
|
|
|
;LD (FST_MSR),A ; [13] *DEBUG* SAVE MSR FOR LATER |
|
|
|
DEC E ; [04] DEC LSB OF INNER TIMEOUT COUNTER |
|
|
|
JR NZ,FXRW4 ; [12/7] LOOP IF LSB IS NOT EXHAUSTED |
|
|
|
CP $D0 ; [07] IF RQM=1, DIO=1, EXM=0, CB=1, EXECUTION ABORTED |
|
|
|
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 |
|
|
|
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 |
|
|
|
JR NZ,FXRW2 ; [12] IF MORE ITERATIONS, GO DO IT |
|
|
|
JP FXR_END ; [10] ELSE DONE |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
; INT WRITE DATA - SAFE VERSION |
|
|
|
@ -3369,34 +3372,41 @@ WFXRW2: |
|
|
|
; |
|
|
|
|
|
|
|
FXR_TO: |
|
|
|
; SET ERROR AND GET OUT W/O PULSING TC |
|
|
|
LD A,FRC_TOEXEC |
|
|
|
JP FXR_ERR |
|
|
|
LD (FST_RC),A |
|
|
|
JR FXR_END2 |
|
|
|
|
|
|
|
FXR_ABORT: |
|
|
|
LD A,FRC_ABORT |
|
|
|
JP FXR_ERR |
|
|
|
FXR_ERR: |
|
|
|
LD (FST_RC),A |
|
|
|
JP FXR_END2 |
|
|
|
; 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: |
|
|
|
; DO NOT PULSE TC AT END OF FORMAT |
|
|
|
; 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 |
|
|
|
|
|
|
|
; DO NOT PULSE TC AT END OF READID |
|
|
|
CP CMD_READID |
|
|
|
JR Z,FXR_END2 |
|
|
|
|
|
|
|
CALL FC_PULSETC |
|
|
|
|
|
|
|
FXR_END2: |
|
|
|
#IF 0 |
|
|
|
LD (FXP_A),A |
|
|
|
LD (FXP_BC),BC |
|
|
|
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 |
|
|
|
|
|
|
|
EI ; I/O FINISHED, INTS BACK ON |
|
|
|
RET |
|
|
|
|
|
|
|
@ -3562,6 +3572,12 @@ FXR_DUMP: |
|
|
|
CALL WRITESTR |
|
|
|
LD A,(FST_MSR) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
|
|
LD DE,STR_A |
|
|
|
CALL WRITESTR |
|
|
|
LD A,(FXP_A) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
|
|
LD DE,STR_BC |
|
|
|
CALL WRITESTR |
|
|
|
LD BC,(FXP_BC) |
|
|
|
@ -3569,6 +3585,7 @@ FXR_DUMP: |
|
|
|
CALL PRTHEXBYTE |
|
|
|
LD A,C |
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
|
|
LD DE,STR_DE |
|
|
|
CALL WRITESTR |
|
|
|
LD BC,(FXP_DE) |
|
|
|
@ -3576,6 +3593,7 @@ FXR_DUMP: |
|
|
|
CALL PRTHEXBYTE |
|
|
|
LD A,C |
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
|
|
LD DE,STR_HL |
|
|
|
CALL WRITESTR |
|
|
|
LD BC,(FXP_HL) |
|
|
|
@ -3583,6 +3601,17 @@ FXR_DUMP: |
|
|
|
CALL PRTHEXBYTE |
|
|
|
LD A,C |
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
|
|
LD DE,STR_ITER |
|
|
|
CALL WRITESTR |
|
|
|
LD A,(FXP_ITER) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
|
|
LD DE,STR_TO |
|
|
|
CALL WRITESTR |
|
|
|
LD A,(FXP_TO) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
|
|
RET |
|
|
|
; |
|
|
|
; DOR BITS (3AH) |
|
|
|
@ -3823,17 +3852,16 @@ COPYSTR: |
|
|
|
; PRINT CONTENTS OF A |
|
|
|
;________________________________________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
COUT_BUFFER .TEXT " $" |
|
|
|
; |
|
|
|
COUT: |
|
|
|
PUSH BC ; |
|
|
|
PUSH AF ; |
|
|
|
PUSH HL ; |
|
|
|
PUSH DE ; |
|
|
|
LD (COUT_BUFFER),A ; |
|
|
|
LD DE,COUT_BUFFER ; |
|
|
|
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL |
|
|
|
CALL 0005H |
|
|
|
|
|
|
|
LD C,2 ; BDOS FUNC: CONSOLE WRITE CHAR |
|
|
|
LD E,A ; CHARACTER TO E |
|
|
|
CALL $0005 ; CALL BDOS |
|
|
|
|
|
|
|
POP DE ; |
|
|
|
POP HL ; |
|
|
|
POP AF ; |
|
|
|
@ -4403,9 +4431,12 @@ STR_SN .TEXT " SN=$" |
|
|
|
STR_NCN .TEXT " NCN=$" |
|
|
|
STR_PCN .TEXT " PCN=$" |
|
|
|
STR_MSR .TEXT " MSR=$" |
|
|
|
STR_A .TEXT " A=$" |
|
|
|
STR_BC .TEXT " BC=$" |
|
|
|
STR_DE .TEXT " DE=$" |
|
|
|
STR_HL .TEXT " HL=$" |
|
|
|
STR_TO .TEXT " TO=$" |
|
|
|
STR_ITER .TEXT " ITER=$" |
|
|
|
STR_DSKCHG .TEXT " DC=$" |
|
|
|
; |
|
|
|
KEYBUFLEN .EQU 80 |
|
|
|
|