mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
725 lines
14 KiB
725 lines
14 KiB
;
|
|
; PROGRAM: DIFF
|
|
; AUTHOR: Richard Conn
|
|
; VERSION: 2.0
|
|
; DATE: 18 MAY 84
|
|
; PREVIOUS VERSIONS: 1.6 (16 JAN 83)
|
|
; PREVIOUS VERSIONS: 1.5 (9 JAN 83), 1.4 (6 JAN 83), 1.3 (4 JAN 83)
|
|
; PREVIOUS VERSIONS: 1.2 (19 DEC 82), 1.1 (8 DEC 82), 1.0 (24 JULY 82)
|
|
; DERIVATION: COMPARE, VERSION 1.1
|
|
;
|
|
VERS EQU 20
|
|
z3env SET 0f400h
|
|
|
|
;
|
|
; DIFF is designed to provide the user with a convenient method
|
|
; to compare the contents of two files. It is invoked by one of two basic
|
|
; forms:
|
|
;
|
|
; DIFF filename.typ
|
|
; or
|
|
; DIFF file1.typ file2.typ
|
|
;
|
|
; The first form compares the file named "filename.typ" on drive A:
|
|
; to the file of the same name on drive B:; the second form compares the
|
|
; file named "file1.typ" on drive A: to the file named "file2.typ" on drive
|
|
; B:. Wild cards may NOT be used. The listing generated by the program gives
|
|
; relative offsets (in hex and decimal) as well as the different byte values
|
|
; in hex, decimal, and ASCII.
|
|
;
|
|
|
|
; SIZE OF BUFFER
|
|
BLIMIT EQU 32 ; NUMBER OF 128-BYTE BLOCKS
|
|
BSIZE EQU BLIMIT*128 ; 4K
|
|
|
|
; CP/M Constants
|
|
CPM equ 0 ; CP/M Warm Boot
|
|
BUFF equ CPM+80H ; Temporary Buffer
|
|
CR equ 0DH ; <CR>
|
|
LF equ 0AH ; <LF>
|
|
CTRLC EQU 'C'-'@'
|
|
CTRLX EQU 'X'-'@'
|
|
|
|
; SYSLIB and Z3LIB ROUTINES
|
|
EXT Z3INIT,ZFNAME,GETCRT
|
|
EXT PHL4HC,PHLDC,PA2HC,PADC
|
|
EXT BDOS,INITFCB
|
|
EXT LOGUD,RETUD
|
|
EXT F$OPEN,F$CLOSE,F$READ
|
|
EXT CAPS,CIN,COUT,CRLF,MOVEB,PRINT
|
|
EXT CODEND
|
|
|
|
;
|
|
; Environment Definition
|
|
;
|
|
if z3env ne 0
|
|
;
|
|
; External ZCPR3 Environment Descriptor
|
|
;
|
|
jmp start
|
|
db 'Z3ENV' ;This is a ZCPR3 Utility
|
|
db 1 ;External Environment Descriptor
|
|
z3eadr:
|
|
dw z3env
|
|
start:
|
|
lhld z3eadr ;pt to ZCPR3 environment
|
|
;
|
|
else
|
|
;
|
|
; Internal ZCPR3 Environment Descriptor
|
|
;
|
|
MACLIB Z3BASE.LIB
|
|
MACLIB SYSENV.LIB
|
|
z3eadr:
|
|
jmp start
|
|
SYSENV
|
|
start:
|
|
lxi h,z3eadr ;pt to ZCPR3 environment
|
|
endif
|
|
|
|
;
|
|
; Start of Program -- Initialize ZCPR3 Environment
|
|
;
|
|
call z3init ;initialize the ZCPR3 Env and the VLIB Env
|
|
;
|
|
; SET BUFFER LOCATIONS
|
|
;
|
|
CALL CODEND ; ALLOCATE BUFFER SPACE
|
|
SHLD INLINE ; SET PTR TO INPUT LINE
|
|
LXI D,100H ; BUFFER SIZE
|
|
DAD D
|
|
SHLD BUFF1 ; SOURCE 1 BUFFER
|
|
LXI D,BSIZE ; SIZE OF BUFFER
|
|
INR D ; ADD 1
|
|
DAD D
|
|
SHLD BUFF2 ; SOURCE 2 BUFFER
|
|
;
|
|
; SET OPERATIONS FLAGS
|
|
;
|
|
XRA A ; A=0
|
|
STA MULT ; SET NO MULTIPLE RUN
|
|
STA COMP ; SET NO COMPARE ONLY
|
|
CALL GETCRT ; GET CRT CHARACTERISTICS
|
|
INX H ; PT TO TEXT LINE COUNT
|
|
INX H
|
|
MOV A,M ; GET COUNT
|
|
STA LSET ; SET COUNTER
|
|
;
|
|
; EXTRACT COMMAND LINE INFORMATION
|
|
;
|
|
LHLD INLINE ; PT TO INPUT LINE BUFFER
|
|
XCHG ; ... IN DE
|
|
LXI H,BUFF+1 ; PROCESS OPTIONS IN BUFFER
|
|
MVI B,80H ; ARBITRARY 80H BYTES
|
|
CALL MOVEB
|
|
XCHG ; PT TO FIRST CHAR WITH HL
|
|
CALL SBLANK ; SKIP SPACES
|
|
ORA A ; EOL?
|
|
JZ PRHELP ; PRINT HELP IF SO
|
|
CPI '/' ; ASKING FOR HELP?
|
|
JZ PRHELP
|
|
LXI D,FCBS ; PT TO SOURCE FCB
|
|
MVI A,0 ; DIR BEFORE DU
|
|
CALL ZFNAME ; EXTRACT NAME AND DIRECTORY DATA
|
|
MOV A,M ; GET NEXT CHAR
|
|
CPI ','
|
|
JZ START2
|
|
PUSH H ; SAVE PTR
|
|
LXI H,FCBS+1 ; NO 2ND NAME, SO SET IT TO SAME AS FIRST
|
|
LXI D,FCBD+1
|
|
MVI B,11 ; 11 BYTES
|
|
CALL MOVEB
|
|
CALL RETUD ; GET CURRENT USER/DISK
|
|
MOV A,B ; GET DISK
|
|
INR A ; A=1
|
|
STA FCBD ; SET DISK
|
|
MOV A,C ; GET USER
|
|
STA FCBD+13 ; PT TO S1 FOR USER
|
|
POP H ; GET PTR
|
|
JMP START3
|
|
START2:
|
|
INX H ; PT TO NEXT CHAR AFTER COMMA
|
|
LXI D,FCBD ; SET DEST FCB
|
|
MVI A,0 ; DIR BEFORE DU
|
|
CALL ZFNAME ; PROCESS NAME
|
|
LDA FCBD+1 ; CHECK FOR NO NAME
|
|
CPI ' ' ; SPACE MEANS NO NAME
|
|
JNZ START3
|
|
PUSH H ; SAVE PTR
|
|
PUSH B ; SAVE USER/DISK
|
|
LXI H,FCBS+1 ; SET NAMES THE SAME
|
|
LXI D,FCBD+1 ; COPY SOURCE TO DEST
|
|
MVI B,11 ; 11 BYTES
|
|
CALL MOVEB
|
|
POP B ; RESTORE BC
|
|
POP H ; RESTORE PTR
|
|
START3:
|
|
CALL SBLANK ; SKIP SPACES
|
|
CALL OPTS ; PROCESS OPTIONS
|
|
START4:
|
|
LXI H,FCBS ; SET UP SOURCE FCB
|
|
CALL QCHECK ; NO AMBIGUOUS ENTRIES PERMITTED
|
|
LXI H,FCBD ; SET UP DESTINATION FCB
|
|
CALL QCHECK ; NO AMBIGUOUS ENTRIES PERMITTED
|
|
CALL RETUD ; GET CURRENT DU IN BC
|
|
LXI H,FCBS ; PT TO SOURCE DISK
|
|
MOV A,M ; GET SOURCE DISK
|
|
ORA A ; CURRENT?
|
|
JNZ START5
|
|
MOV A,B ; SET CURRENT DISK
|
|
INR A ; ADJUST FOR A=1
|
|
START5:
|
|
STA SDISK
|
|
MVI M,0 ; CLEAR SOURCE DISK
|
|
LDA FCBS+13 ; GET USER
|
|
STA SUSER
|
|
LXI H,FCBD ; GET DESTINATION DISK
|
|
MOV A,M ; GET DEST DISK
|
|
ORA A ; CURRENT?
|
|
JNZ START6
|
|
MOV A,B ; SET CURRENT DISK
|
|
INR A ; ADJUST FOR A=1
|
|
START6:
|
|
STA DDISK
|
|
MVI M,0 ; CLEAR DEST DISK
|
|
LDA FCBD+13 ; GET USER
|
|
STA DUSER
|
|
MLOOP:
|
|
CALL BANNER ; PRINT BANNER
|
|
CALL PRS1 ; PRINT SOURCE FILE NAMES
|
|
CALL PRS2
|
|
LDA MULT ; MULTIPLE RUNS
|
|
ORA A
|
|
JZ MLOOP1
|
|
CALL PRINT
|
|
DB CR,LF,' Type ^C to Abort or RETURN to Proceed - ',0
|
|
CALL CIN ; GET RESPONSE
|
|
CALL CAPS ; CAPITALIZE
|
|
CPI CTRLC ; ABORT?
|
|
RZ
|
|
MVI C,13 ; RESET DISKS
|
|
CALL BDOS
|
|
MLOOP1:
|
|
CALL LOGS ; LOG IN SOURCE
|
|
LXI D,FCBS ; TRY TO OPEN SOURCE 1
|
|
CALL INITFCB ; INIT FCB
|
|
CALL F$OPEN ; Z IF NO ERROR
|
|
JNZ FERR
|
|
CALL LOGD ; LOG IN DEST DISK/USER
|
|
LXI D,FCBD ; TRY TO OPEN SOURCE 2
|
|
CALL INITFCB ; INIT FCB
|
|
CALL F$OPEN
|
|
JNZ FERR
|
|
XRA A ; A=0
|
|
STA FIRST ; SET FLAG FOR FIRST ERROR
|
|
LXI H,0 ; INIT OFFSET
|
|
SHLD OFFSET
|
|
CALL VERIFY ; PERFORM VERIFICATION
|
|
LDA FIRST ; ANY ERRORS?
|
|
ORA A ; 0=NO ERRORS
|
|
JNZ MLOOP2
|
|
CALL PRINT
|
|
DB CR,LF,' Files are Identical',0
|
|
MLOOP2:
|
|
LDA MULT ; CHECK FOR MULTIPLE RUNS
|
|
ORA A ; 0=NO
|
|
RZ
|
|
CALL CRLF ; NEW LINES
|
|
CALL CRLF
|
|
JMP MLOOP
|
|
FERR:
|
|
CALL PRINT
|
|
DB CR,LF,' File Not Found -- ',0
|
|
CALL PRFN
|
|
JMP MLOOP2
|
|
|
|
;
|
|
; PROCESS OPTIONS
|
|
;
|
|
OPTS:
|
|
MOV A,M ; GET NEXT OPTION CHAR
|
|
INX H ; PT TO NEXT
|
|
ORA A ; END OF LINE?
|
|
RZ
|
|
CPI ' ' ; SKIP SPACES
|
|
JZ OPTS
|
|
LXI D,OTAB ; PT TO OPTION TABLE
|
|
MOV B,A ; OPTION CHAR IN B
|
|
OPTS1:
|
|
LDAX D ; GET TABLE CHAR
|
|
ORA A ; OPTION NOT FOUND?
|
|
JZ OPTSE ; PROCESS ERROR
|
|
CMP B ; MATCH?
|
|
JZ OPTS2
|
|
INX D ; SKIP TO NEXT
|
|
INX D
|
|
INX D
|
|
JMP OPTS1
|
|
OPTS2:
|
|
XCHG ; USE HL
|
|
INX H ; GET ADDRESS
|
|
MOV A,M ; GET LOW
|
|
INX H
|
|
MOV H,M ; GET HIGH
|
|
MOV L,A ; PUT LOW
|
|
XCHG ; DE PTS TO OPTION ADDRESS, HL TO NEXT BYTE
|
|
LXI B,OPTS ; SET UP RETURN ADDRESS
|
|
PUSH B
|
|
PUSH D ; SET UP OPTION ADDRESS
|
|
RET ; "RUN" OPTION
|
|
OPTSE:
|
|
CALL PRHELP ; PRINT HELP MESSAGE
|
|
POP PSW ; CLEAR RETURN ADDRESS
|
|
RET ; RETURN TO OPSYS
|
|
;
|
|
; OPTION TABLE
|
|
;
|
|
OTAB:
|
|
DB 'C' ; COMPARE ONLY
|
|
DW SCOMPF
|
|
DB 'M' ; MULTIPLE RUN
|
|
DW SMULTF
|
|
DB 0 ; END OF TABLE
|
|
;
|
|
; SET COMPARE FLAG
|
|
;
|
|
SCOMPF:
|
|
MVI A,0FFH ; SET FLAG
|
|
STA COMP
|
|
RET
|
|
;
|
|
; SET MULTIPLE RUN FLAG
|
|
;
|
|
SMULTF:
|
|
MVI A,0FFH ; SET FLAG
|
|
STA MULT
|
|
RET
|
|
;
|
|
; SKIP TO NON-BLANK CHAR
|
|
;
|
|
SBLANK:
|
|
MOV A,M ; GET CHAR
|
|
INX H ; PT TO NEXT
|
|
CPI ' ' ; BLANK?
|
|
JZ SBLANK
|
|
DCX H ; PT TO NON-BLANK
|
|
RET
|
|
|
|
;
|
|
; PRINT HELP MESSAGE
|
|
;
|
|
PRHELP:
|
|
CALL BANNER ; PRINT BANNER
|
|
CALL PRINT
|
|
DB CR,LF,'Syntax:'
|
|
DB CR,LF,' DIFF ufn1,ufn2 o... -or- DIFF ufn o...'
|
|
db cr,lf,'Options:'
|
|
db cr,lf,' C Compare Files Only (Stop at First Difference)'
|
|
db cr,lf,' M Multiple Runs (Keep on prompting for disks)'
|
|
DB CR,LF,'Examples:'
|
|
DB CR,LF,' Command Files Compared'
|
|
DB CR,LF,' DIFF T.COM,A1: $$:T.COM, A1:T.COM'
|
|
DB CR,LF,' DIFF A:T.COM A$:T.COM, $$:T.COM'
|
|
DB CR,LF,' DIFF A:T.COM,ROOT: A$:T.COM, ROOT:T.COM'
|
|
DB CR,LF,' DIFF A:T.COM,B:S.COM A$:T.COM, B$:S.COM'
|
|
DB 0
|
|
RET
|
|
|
|
;
|
|
; CHECK FOR ANY QUESTION MARKS FROM HL+1 TO HL+11
|
|
; AFFECT ONLY AF REGISTERS IF OK
|
|
;
|
|
QCHECK:
|
|
PUSH H ; SAVE HL
|
|
PUSH B ; SAVE BC
|
|
INX H ; PT TO FIRST CHAR
|
|
MVI B,11 ; 11 BYTES
|
|
MVI C,'?' ; SCAN FOR '?'
|
|
QC:
|
|
MOV A,M ; GET BYTE
|
|
CMP C ; '?'?
|
|
JZ QC1
|
|
INX H ; PT TO NEXT
|
|
DCR B ; COUNT DOWN
|
|
JNZ QC
|
|
POP B ; RESTORE
|
|
POP H
|
|
RET
|
|
QC1:
|
|
POP B ; RESTORE AND ABORT
|
|
POP H
|
|
POP D ; CLEAR RETURN ADDRESS
|
|
XCHG ; FCB PTR IN DE
|
|
CALL CRLF
|
|
CALL PRFN ; PRINT FILE NAME
|
|
CALL PRINT
|
|
DB ' AFN not Allowed',CR,LF,0
|
|
RET
|
|
|
|
;
|
|
; PRINT BANNER
|
|
;
|
|
BANNER:
|
|
CALL PRINT
|
|
DB 'DIFF Version '
|
|
DB VERS/10+'0','.',(VERS MOD 10)+'0'
|
|
DB 0
|
|
RET
|
|
|
|
;
|
|
; PRINT NAMES OF SOURCE FILES
|
|
; PRS1 -- SOURCE FILE 1
|
|
; PRS2 -- SOURCE FILE 2
|
|
;
|
|
PRS1:
|
|
CALL PRINT
|
|
DB CR,LF,'Source 1 -- ',0
|
|
LXI H,SDISK ; PT TO FIRST BYTE
|
|
CALL PRUD
|
|
LXI D,FCBS ; SOURCE FCB
|
|
JMP PRFN ; PRINT FILE NAME
|
|
PRS2:
|
|
CALL PRINT
|
|
DB CR,LF,'Source 2 -- ',0
|
|
LXI H,DDISK ; PT TO FIRST BYTE
|
|
CALL PRUD
|
|
LXI D,FCBD ; DESTINATION FCB
|
|
JMP PRFN ; PRINT FILE NAME
|
|
|
|
;
|
|
; MAIN VERIFY ROUTINE
|
|
;
|
|
VERIFY:
|
|
LHLD BUFF1 ; PT TO BUFFER 1
|
|
PUSH H ; SAVE PTR
|
|
CALL LOGS ; LOG IN SOURCE 1
|
|
LXI D,FCBS ; SOURCE 1 FCB
|
|
CALL LOAD ; READ IN BLOCK
|
|
LDA BCNT ; GET OLD BLOCK COUNT
|
|
STA BCNT1 ; SAVE IT
|
|
LHLD BUFF2 ; PT TO BUFFER 2
|
|
PUSH H ; SAVE PTR
|
|
CALL LOGD ; LOG IN SOURCE 2
|
|
LXI D,FCBD ; SOURCE 2 FCB
|
|
CALL LOAD ; READ IN BLOCK
|
|
POP D ; DE PTS TO BUFF 2
|
|
POP H ; HL PTS TO BUFF 1
|
|
LDA BCNT ; CHECK FOR NO BLOCK READ
|
|
MOV B,A
|
|
LDA BCNT1
|
|
ORA B
|
|
RZ ; DONE IF NONE READ
|
|
;
|
|
; VERIFY LOADED BUFFERS BY COMPARING THEM AND PRINTING DIFFERENCES
|
|
;
|
|
VERBLOCK:
|
|
MVI B,128 ; SCAN ONE BLOCK
|
|
VERBL:
|
|
LDAX D ; GET BYTE
|
|
CMP M ; COMPARE
|
|
CNZ NOMATCH ; PRINT DIFFERENCE
|
|
PUSH H ; INC OFFSET
|
|
LHLD OFFSET
|
|
INX H
|
|
SHLD OFFSET
|
|
POP H
|
|
INX H ; PT TO NEXT
|
|
INX D
|
|
DCR B ; COUNT DOWN
|
|
JNZ VERBL
|
|
LDA BCNT ; COUNT DOWN
|
|
DCR A
|
|
STA BCNT
|
|
LDA BCNT1
|
|
DCR A
|
|
STA BCNT1
|
|
JZ VEREQ
|
|
LDA BCNT ; CHECK FIRST BUFFER COUNT
|
|
ORA A
|
|
JNZ VERBLOCK ; CONTINUE COMPARE IF NOT EMPTY
|
|
VEREQ:
|
|
LDA BCNT ; CHECK FOR BOTH DONE
|
|
MOV B,A
|
|
LDA BCNT1
|
|
ORA B ; IF ZERO, BOTH DONE AT SAME TIME AND CONTINUE
|
|
JZ VERIFY
|
|
LDA BCNT1 ; CHECK FOR ONE DONE BEFORE THE OTHER
|
|
ORA A ; 2ND DONE?
|
|
MVI C,'2' ; GET LETTER
|
|
JZ DONE1
|
|
MVI C,'1' ; GET LETTER
|
|
; ONE FILE IS SHORTER THAN THE OTHER -- SAY SO
|
|
DONE1:
|
|
CALL PRINT
|
|
DB CR,LF,' Source ',0
|
|
MOV A,C
|
|
CALL COUT ; PRINT LETTER
|
|
CALL PRINT
|
|
DB ' has terminated prematurely',0
|
|
JMP DABORT
|
|
; MATCH ERROR
|
|
NOMATCH:
|
|
LDA COMP ; GET COMPARE FLAG
|
|
ORA A ; NZ=SIMPLE COMPARE
|
|
JNZ CABORT
|
|
PUSH H ; SAVE REGS
|
|
PUSH D
|
|
PUSH B
|
|
LDA FIRST ; FIRST TIME THRU?
|
|
ORA A ; 0=YES
|
|
JZ NMAT0
|
|
LDA LCNT ; CHECK FOR NEW SCREEN
|
|
ORA A ; ZERO IF DONE
|
|
JNZ NMAT1
|
|
CALL PRINT
|
|
DB CR,LF,' DIFF Pause -- Strike RETURN to Continue, '
|
|
DB '^C to Abort, or ^X to Advance - ',0
|
|
CALL CIN ; GET RESPONSE
|
|
CALL CAPS
|
|
CPI CTRLC ; ABORT?
|
|
JZ NMAT00
|
|
CPI CTRLX ; ADVANCE?
|
|
JNZ NMAT0
|
|
POP B ; CLEAR REGS
|
|
POP D
|
|
POP H
|
|
POP D ; CLEAR STACK
|
|
CALL PRINT
|
|
DB CR,LF,' DIFF Advancing',0
|
|
RET ; RETURN TO VERIFY CALLER
|
|
NMAT00:
|
|
POP B ; CLEAR REGS
|
|
POP D
|
|
POP H
|
|
POP D ; CLEAR STACK
|
|
POP D
|
|
DABORT:
|
|
CALL PRINT
|
|
DB CR,LF,' DIFF Aborting',0
|
|
RET ; RETURN TO OPSYS
|
|
CABORT:
|
|
POP D ; CLEAR STACK
|
|
MVI A,1 ; SET ERROR FLAG
|
|
STA FIRST
|
|
CALL PRINT
|
|
DB CR,LF,' Files are Different',0
|
|
RET ; RETURN TO VERIFY CALLER
|
|
NMAT0:
|
|
MVI A,0FFH ; CLEAR FIRST TIME FLAG
|
|
STA FIRST
|
|
CALL HEADER ; PRINT HEADING AND RETURN NEW LINE COUNT
|
|
NMAT1:
|
|
DCR A ; COUNT DOWN 1 LINE
|
|
STA LCNT ; NEW LINE COUNT
|
|
CALL CRLF
|
|
PUSH H ; SAVE HL
|
|
LHLD OFFSET ; PRINT OFFSET VALUE
|
|
CALL PHL4HC ; PRINT AS HEX
|
|
CALL SPACER ; PRINT SPACES
|
|
CALL PHLDC ; PRINT AS DEC
|
|
POP H ; RESTORE HL
|
|
CALL SPACER
|
|
CALL SPACER
|
|
MVI A,' '
|
|
CALL COUT
|
|
MOV A,M ; GET SOURCE 1 VALUE
|
|
CALL PRVAL ; PRINT AS HEX, DEC, ASCII
|
|
CALL SPACER ; 10 SPACES
|
|
CALL SPACER
|
|
CALL SPACER
|
|
CALL SPACER
|
|
CALL SPACER
|
|
LDAX D ; GET SOURCE 2 VALUE
|
|
CALL PRVAL ; PRINT AS HEX, DEC, ASCII
|
|
POP B ; RESTORE REGS
|
|
POP D
|
|
POP H
|
|
RET
|
|
|
|
; PRINT HEADER AND RETURN NEW LINE COUNT IN A
|
|
HEADER:
|
|
PUSH D ; SAVE REGS
|
|
PUSH H
|
|
CALL PRINT
|
|
DB CR,LF,' Rel Offset ',0
|
|
LXI H,SDISK ; PRINT DISK/USER
|
|
CALL PRUD
|
|
LXI D,FCBS
|
|
CALL PRFN ; PRINT FILE NAME
|
|
CALL SPACER ; 5 SPACES
|
|
CALL SPACER
|
|
CALL SPACE1
|
|
LXI H,DDISK ; PRINT DISK/USER
|
|
CALL PRUD
|
|
LXI D,FCBD
|
|
CALL PRFN ; PRINT FILE NAME
|
|
CALL PRINT
|
|
DB CR,LF,' Hex Dec Hex Dec Asc Hex Dec Asc',0
|
|
LDA LSET ; SET LINE COUNT
|
|
SUI 1 ; ADJUST FOR HEADING AND FOOTER
|
|
STA LCNT
|
|
POP H
|
|
POP D ; RESTORE REGS
|
|
RET
|
|
|
|
; PRINT A AS HEX, DEC, AND ASCII
|
|
PRVAL:
|
|
CALL SPACER ; 3 SPACES
|
|
CALL SPACE1
|
|
CALL PA2HC ; PRINT AS HEX
|
|
CALL SPACER
|
|
CALL PADC ; PRINT AS DEC
|
|
CALL SPACER
|
|
ANI 7FH ; MASK OUT MSB
|
|
CPI 7FH ; DOT FOR <DEL>
|
|
JZ PRDOT
|
|
CPI ' ' ; PRINT DOT IF LESS THAN <SP>
|
|
JNC COUT
|
|
PRDOT:
|
|
MVI A,'.' ; PRINT DOT
|
|
JMP COUT
|
|
; PRINT 2 SPACES
|
|
SPACER:
|
|
PUSH PSW ; SAVE A
|
|
MVI A,' ' ; <SP>
|
|
CALL COUT
|
|
POP PSW
|
|
SPACE1:
|
|
PUSH PSW
|
|
MVI A,' '
|
|
CALL COUT
|
|
POP PSW
|
|
RET
|
|
|
|
;
|
|
; LOAD BUFFER FROM FILE WHOSE FCB IS PTED TO BY DE
|
|
; ON OUTPUT, BCNT=NUMBER OF BLOCKS LOADED (UP TO BLIMIT)
|
|
;
|
|
LOAD:
|
|
XRA A ; A=0
|
|
STA BCNT ; SET BLOCK COUNT
|
|
|
|
; MAIN LOAD LOOP
|
|
LOAD1:
|
|
CALL F$READ ; READ A BLOCK
|
|
ORA A ; END OF FILE?
|
|
RNZ ; RETURN IF DONE
|
|
PUSH D ; SAVE FCB PTR
|
|
LXI D,BUFF ; PT TO BUFFER
|
|
MVI B,128 ; COPY 128 BYTES
|
|
LOAD2:
|
|
LDAX D ; GET BYTE READ
|
|
MOV M,A ; PUT BYTE
|
|
INX H ; PT TO NEXT
|
|
INX D
|
|
DCR B ; COUNT DOWN
|
|
JNZ LOAD2
|
|
POP D ; GET FCB PTR
|
|
LDA BCNT ; GET BLOCK COUNT
|
|
INR A ; INCREMENT IT
|
|
STA BCNT ; SET IT
|
|
CPI BLIMIT ; LAST BLOCK READ?
|
|
JNZ LOAD1
|
|
RET
|
|
|
|
;
|
|
; LOG IN SOURCE (LOGS) AND DESTINATION (LOGD) DRIVES/USERS
|
|
;
|
|
LOGS:
|
|
LDA SDISK ; GET DISK
|
|
DCR A ; A=0
|
|
MOV B,A
|
|
LDA SUSER ; GET USER
|
|
MOV C,A
|
|
CALL LOGUD ; LOG IN
|
|
RET
|
|
LOGD:
|
|
LDA DDISK ; GET DISK
|
|
DCR A ; A=0
|
|
MOV B,A
|
|
LDA DUSER ; GET USER
|
|
MOV C,A
|
|
CALL LOGUD ; LOG IN
|
|
RET
|
|
|
|
;
|
|
; PRINT DISK/USER PTED TO BY HL (2 BYTES)
|
|
;
|
|
PRUD:
|
|
MOV A,M ; GET DISK
|
|
ADI 'A'-1 ; CONVERT TO LETTER
|
|
CALL COUT
|
|
INX H ; PT TO USER
|
|
MOV A,M ; GET USER
|
|
CALL PADC ; PRINT AS DEC
|
|
CALL PRINT
|
|
DB ': ',0
|
|
RET
|
|
|
|
;
|
|
; PRINT FILE NAME WHOSE FCB IS PTED TO BY DE
|
|
;
|
|
PRFN:
|
|
PUSH H ; SAVE REGS
|
|
PUSH D
|
|
PUSH B
|
|
XCHG ; FN PTED TO BY HL
|
|
INX H ; PT TO FIRST CHAR
|
|
MVI B,8 ; 8 CHARS
|
|
CALL PRFN1
|
|
MVI A,'.'
|
|
CALL COUT
|
|
MVI B,3 ; 3 CHARS FOR FILE TYPE
|
|
CALL PRFN1
|
|
POP B ; RESTORE REGS
|
|
POP D
|
|
POP H
|
|
RET
|
|
PRFN1:
|
|
MOV A,M ; GET CHAR
|
|
INX H ; PT TO NEXT
|
|
CALL COUT ; PRINT
|
|
DCR B ; COUNT DOWN
|
|
JNZ PRFN1
|
|
RET
|
|
|
|
;
|
|
; BUFFERS
|
|
;
|
|
BUFF1:
|
|
DS 2 ; PTR TO BUFFER 1
|
|
BUFF2:
|
|
DS 2 ; PTR TO BUFFER 2
|
|
OFFSET:
|
|
DS 2 ; RELATIVE OFFSET
|
|
FIRST:
|
|
DS 1 ; ERROR INDIC
|
|
LSET:
|
|
DS 1 ; NUMBER OF TEXT LINES ON SCREEN
|
|
LCNT:
|
|
DS 1 ; LINE COUNT
|
|
COMP:
|
|
DS 1 ; COMPARE FLAG (0=NO SIMPLE COMPARE)
|
|
MULT:
|
|
DS 1 ; MULTIPLE RUN FLAG (0=NO MULT RUNS)
|
|
SDISK:
|
|
DS 1 ; SOURCE DISK (MUST BE FOLLOWED BY SUSER)
|
|
SUSER:
|
|
DS 1 ; SOURCE USER
|
|
FCBS:
|
|
DS 36 ; SOURCE FCB
|
|
DDISK:
|
|
DS 1 ; DEST DISK (MUST BE FOLLOWED BY DUSER)
|
|
DUSER:
|
|
DS 1 ; DEST USER
|
|
FCBD:
|
|
DS 36 ; DESTINATION FCB
|
|
BCNT:
|
|
DS 1 ; BUFFER COUNT
|
|
BCNT1:
|
|
DS 1 ; SECOND BUFFER COUNT
|
|
INLINE:
|
|
DS 2 ; PTR TO INPUT LINE BUFFER
|
|
|
|
END
|
|
|