home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG040.ARK
/
COMPARE.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
3KB
|
222 lines
;COMPARE.ASM
;11/??/77 ORIGINALLY WRITTEN BY WARD CHRISTENSEN
;12/31/77 ADD PICKUP OF SECOND FILENAME IF BLANK
;01/08/77 ADD SEQIO MACLIB TO READ BIG BLOCKS
BSIZE EQU 4096 ;DISK BUFFER SIZE (TIMES 2)
ORG 100H
MACLIB SEQIO
MOVE MACRO ?F,?T,?L
MVI B,?L
LXI D,?F
LXI H,?T
CALL MOVER
ENDM
;TYPE SINGLE CHAR OR CHAR IN A
TYPE MACRO ?C
IF NOT NUL ?C
MVI A,?C
ENDIF
PUSH B
PUSH D
PUSH H
PUT CON
POP H
POP D
POP B
ENDM
PRINT MACRO ?L
LOCAL Z
CALL Z
IRP ?M,<?L>
DB ?M
ENDM
DB '$'
Z POP D
MVI C,@MSG
CALL @BDOS
ENDM
;
;COMPARE.ASM - COMPARES 2 FILES
;
;COMMAND FORMAT: COMPARE NAME1 NAME2
; IF NAME2 = NAME1 BUT IS ON B DISK,
; JUST TYPE: COMPARE NAME1 B:
;
PRINT <'COMPARE.COM 1/8/78',0DH,0AH>
;
;INIT STACK
;
POP H ;GET CP/M RET ADDR
SHLD EXIT+1 ;MODIFY RETURN ADDR
LXI SP,STACK ;GET MY STACK
;
;IF THE SECOND FCB IS BLANK,
;MOVE IN THE NAME FROM THE FIRST
;
LDA @TFCB+17
CPI ' '
JNZ MOVE2 ;NOT BLANK
MOVE @TFCB+1,@TFCB+17,11
;
;'DECLARE' BOTH FCB'S
;
MOVE2 FILE INFILE,FILE1,,1,,BSIZE
FILE INFILE,FILE2,,2,,BSIZE
;
;COMPARE THE 2 FILES 1 BYTE AT A TIME
;
COMP CALL READ1
MOV B,A ;SAVE CHAR
PUSH B
CALL READ2
POP B
CMP B
JZ COMP
;
;FILES UNEQUAL
;
UNEQUAL PRINT 'FILES UNEQUAL AFTER '
PRBYTES LXI D,BYTES
MVI C,@MSG
CALL @BDOS
PRINT <'LAST DATA READ FROM FILE 1:',0DH,0AH>
LHLD PRTPTR
DCR L
MVI B,0
PRTLP INR L
MOV A,M
CPI 0DH
JZ GOTCR
CPI 0AH
JZ TYPEIT
CPI 9 ;TAB
JZ TYPEIT
CPI ' '
JC HEX
CPI 7FH
JNC HEX
TYPEIT TYPE
LDA COL
INR A
STA COL
CPI 60
JC NEXT
XRA A
STA COL
PUSH B
PUSH H
PRINT <0DH,0AH>
POP H
POP B
JMP NEXT
GOTCR XRA A
STA COL
MVI A,0DH
JMP TYPEIT
HEX PUSH PSW ;SAVE CHAR
TYPE '('
POP PSW
PUSH PSW
RAR
RAR
RAR
RAR
CALL NIBBL
POP PSW
CALL NIBBL
LDA COL
ADI 3
STA COL
MVI A,')'
JMP TYPEIT
NEXT DCR B
JNZ PRTLP
JMP EXIT
;
;READ BYTE FROM FILE 1
;
READ1 GET FILE1
JZ EOF1 ;GOT EOF?
LHLD PRTPTR
MOV M,A
INR L
SHLD PRTPTR
PUSH PSW ;SAVE CHAR
LXI H,BYTES+5
READI MOV A,M
ORI '0' ;IN CASE IT WAS BLANK
INR A
MOV M,A
CPI '9'+1 ;TIME TO CARRY?
JNZ READNC
MVI M,'0'
DCX H
JMP READI
READNC POP PSW
RET
;
;EOF ON FILE 1 - SET FLAG, READ 2
;
EOF1 MVI A,'Y'
STA EOFLG
CALL READ2
PRINT <'EOF FILE 1, NOT FILE 2',0DH,0AH>
JMP UNEQUAL
;
READ2 GET FILE2
RNZ ;NO EOF
;
;GOT EOF ON FILE 2, MUST HAVE GOTTEN IT ON FILE 1
;
EOF2 LDA EOFLG
CPI 'Y'
JZ AOK
PRINT <'EOF FILE 2 BEFORE FILE 1',0DH,0AH>
JMP UNEQUAL
;
;A-OK - FILES MATCH
;
AOK PRINT 'FILES MATCH, LENGTH IS '
LXI D,BYTES
MVI C,@MSG
CALL @BDOS
;NOTE THE FOLLOWING DOES NOT RESTORE CP/M'S
;STACK POINTER, BUT THAT IS 'OK' BECAUSE THE
;FIRST INSTRUCTION IN CP/M IS A LXI SP
EXIT JMP $-$ ;CP/M RET ADDR (MODIFIED)
ERXIT POP D ;GET MESSAGE
MVI C,@MSG
CALL @BDOS
JMP EXIT
NIBBL ANI 0FH
CPI 10
JC NUM
ADI 7
NUM ADI '0'
TYPE
RET
;MOVE FROM (DE) TO (HL) LENGTH IN B
MOVER LDAX D
MOV M,A
INX D
INX H
DCR B
JNZ MOVER
RET
EOFLG DB 'N'
COL DB 0
BYTES DB ' BYTES',0DH,0AH,'$'
PRTPTR DW BUFF
DS 30 ;STACK
STACK EQU $
;ORG TO PAGE BECAUSE 'INR L' USED TO LOOP THRU IT
ORG ($+255) AND 0FF00H ;TO PAGE
BUFF EQU $
REPT 16
DB ' '
ENDM
BUFFERS EQU $
MEMSIZE EQU BUFFERS+@NXTB
END