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
/
CPMUG006.ARK
/
COMPARE.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
5KB
|
287 lines
; * * * * * * * * * * * * * * * * * * * * * * * *
; *
; COMPARE.ASM *
; *
; * * * * * * * * * * * * * * * * * * * * * * * *
;
;USED TO COMPARE 2 CP/M PROGRAMS ON DISK
;
;IF SENSE SWITCH A8 (01H) UP, PRINTS FILE 1
;AS IT IS BEING READ
;
;10/01/77 ORIGINALLY WRITTEN
;
ORG 100H
CALL START ;PRINT ID MESSAGE
DB 'COMPARE.COM AS OF 10/01/77',0DH,0AH,'$'
START POP D
CALL PRINT$MESSAGE
;INIT PRIVATE STACK
LXI H,0 ;HL=0
DAD SP ;HL=CP/M'S STACK
SHLD STACK ;SAVE IT
LXI SP,STACK ;USE MY OWN
;
;MOVE THE SECOND FCB SO OPENING THE FIRST
;WON'T WIPE IT OUT
;
CALL MOVE$FCB
;
;OPEN BOTH FILES, EXITING IF EITHER DOESN'T EXIST
;
CALL OPEN$FILES
;
;READ EACH FILE 1 BYTE AT A TIME, COMPARING THEM
;
COMPARE CALL READ1
MOV B,A ;SAVE CHAR READ
CALL READ2
CMP B ;SAME?
JZ COMPARE
;
;UNEQUAL COMPARE
;
LXI D,UNEQ$MSG
CALL PRINT$MESSAGE
LHLD SECTOR$COUNT
CALL PRINT$HEX$HL
LXI D,BYTE$MSG
CALL PRINT$MESSAGE
LDA BUFAD1 ;GET FIRST BUFF ADDR
SUI 80H ;SUBTRACT BIAS
CALL XO ;PRINT IN HEX
EXIT LHLD STACK ;GET CP/M'S STACK
SPHL ;RESTORE IT
RET ;..AND RETURN
;
ERXIT POP D ;GET MESSAGE
CALL PRINT$MESSAGE
JMP EXIT
;
UNEQ$MSG:
DB 0DH,0AH,'++FILES UNEQUAL IN SECTOR $'
BYTE$MSG:
DB 'AT BYTE $'
; * * * * * * * * * * * * * * * * * * * * * * * *
; *
; SUBROUTINES *
; *
; * * * * * * * * * * * * * * * * * * * * * * * *
PRINT$MESSAGE:
MVI C,PRINT
JMP BDOS ;PRINT, RETURN
;
PRINT$HEX$HL:
MOV A,H
CALL XO
MOV A,L
CALL XO
MVI A,' '
;FALL INTO 'TYPE'
;
TYPE: PUSH B
PUSH D
PUSH H
MOV E,A ;AS REQ'D BY CP/M
MVI C,WRCON
CALL BDOS
POP H
POP D
POP B
RET
;
XO PUSH PSW ;HEX OUT
RAR
RAR
RAR
RAR
CALL NIBBL ;LEFT NIBBL
POP PSW
NIBBL ANI 0FH
CPI 10
JC ISNUM
ADI 7
ISNUM ADI '0'
JMP TYPE
;
OPEN$FILES:
LXI D,FCB
MVI C,OPEN
CALL BDOS
INR A ;OPEN OK?
JNZ FILE$1$OPEN
CALL ERXIT
DB '++CAN''T OPEN FILE 1 ',0DH,0AH,'$'
FILE$1$OPEN:
LXI D,FCB2
MVI C,OPEN
CALL BDOS
INR A
RNZ
CALL ERXIT
DB '++CAN''T OPEN FILE 2',0DH,0AH,'$'
;
READ1:
LHLD BUFAD1 ;TIME TO READ?
DCR H ;AT 100H?
JNZ NO$READ$1
;
;PHYSICALLY READ FILE 1
;
LXI H,80H ;BUFFER ADDR
SHLD BUFAD1
XCHG ;TO D,E
MVI C,STDMA
CALL BDOS
LXI D,FCB
MVI C,READ
CALL BDOS
ORA A ;OK?
JNZ EOF$FILE$1
LHLD SECTOR$COUNT
INX H
SHLD SECTOR$COUNT
NO$READ$1:
LHLD BUFAD1
MOV A,M ;GET CHAR
INX H ;POINT TO NEXT
SHLD BUFAD1
;
;REQUEST TO PRINT?
;
MOV L,A ;SAVE CHAR
IN 0FFH ;READ SSW
ANI 1 ;PRINT?
MOV A,L ;RESTORE CHAR FOR RET
RZ ;RET IF NO PRINT REQ
;SHOW THE CHARACTER
CPI 0DH ;C/R?
JZ SHOWIT
CPI 0AH ;L/F?
JZ SHOWIT
CPI 9 ;TAB?
JZ SHOWIT
CPI ' ' ;PRINTABLE?
JC SHOWHEX ;HEX IF NOT PRINTABLE
CPI 7FH
JC SHOWIT
;SHOW IN HEX
SHOWHEX MVI A,'('
CALL TYPE
MOV A,L ;GET CHAR
CALL XO
MVI A,')'
SHOWA CALL TYPE
MOV A,L ;GET CHAR
RET
SHOWIT MOV A,L ;GET CHAR
JMP SHOWA
RET
;
;GOT EOF ON FILE 1 - SHOULD GET EOF ON FILE 2
;
EOF$FILE$1:
MVI A,1 ;GET FLAG
STA EOF$FLAG
CALL READ2 ;SHOULD NOT RETURN
CALL ERXIT
DB 0DH,0AH,'++EOF ON FILE 1, NOT FILE 2$'
;
READ2:
LHLD BUFAD2 ;GET SECOND BUFF
MOV A,L ;GET ADDR
CPI (BUF2+128) AND 0FFH ;END?
JNZ NO$READ$2
;
;DO PHYSICAL READ ON FILE 2
;
LXI H,BUF2
SHLD BUFAD2
XCHG ;TO DE
MVI C,STDMA
PUSH B ;SAVE CHAR FROM FILE 1
CALL BDOS
LXI D,FCB2
MVI C,READ
CALL BDOS
POP B
ORA A
JNZ EOF$FILE$2
NO$READ$2:
LHLD BUFAD2
MOV A,M ;GET CHAR
INX H ;POINT TO NEXT
SHLD BUFAD2 ;SAVE BACK
RET
;
EOF$FILE$2:
;SHOULD HAVE EOF ON 1, THUS EOF$FLAG SHOULD BE ON
LDA EOF$FLAG
ORA A ;ON?
JNZ A$OK
CALL ERXIT
DB 0DH,0AH,'++EOF ON FILE 2 BEFORE FILE 1$'
A$OK LXI D,MATCH$MSG
CALL PRINT$MESSAGE
LHLD SECTOR$COUNT
CALL PRINT$HEX$HL
CALL ERXIT
DB '(HEX) SECTORS',0DH,0AH,'$'
MATCH$MSG:
DB 0DH,0AH,'FILES MATCH, LENGTH IS $'
;
MOVE$FCB:
LXI H,FCB2
LXI D,FCB+16
MVI B,16 ;FCB LENGTH
MOVEIT LDAX D
MOV M,A
INX D
INX H
DCR B
JNZ MOVEIT
RET
;
DS 40 ;STACK AREA
STACK DS 2
SECTOR$COUNT:
DW 0
EOF$FLAG:
DB 0 ;=1 IF EOF FILE 1
FCB2 DB 0,'XXXXXXXXYYY',0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
BUFAD1 DW 80H+128 ;INIT TO READ FIRST
BUFAD2 DW BUF2+128 ;LIKEWISE
BUF2 DS 128
;
; * * * * * * * * * * * * * * * * * * * * * * * *
; *
;BDOS/CBIOS EQUATES (VERSION 5) *
; *
RDCON EQU 1 ; *
WRCON EQU 2 ; *
PRINT EQU 9 ; *
OPEN EQU 15 ;0FFH=NOT FOUND *
CLOSE EQU 16 ; " " *
SRCHF EQU 17 ; " " *
SRCHN EQU 18 ; " " *
ERASE EQU 19 ;NO RET CODE *
DELT EQU ERASE ; *
READ EQU 20 ;0=OK, 1=EOF *
WRITE EQU 21 ;0=OK, 1=ERR, 2=?, *
; 0FFH=NO DIR SPC *
MAKE EQU 22 ;0FFH=BAD *
REN EQU 23 ;0FFH=BAD *
STDMA EQU 26 ; *
BDOS EQU 5 ; *
FCB EQU 5CH ; *
SYSSIZ EQU 24 ;SYSTEM SIZE *
CBIOS EQU SYSSIZ*1024-512 ; *
SELDSK EQU CBIOS+1BH ; *
SETTRK EQU SELDSK+3 ; *
SETSEC EQU SETTRK+3 ; *
SETDMA EQU SETSEC+3 ; *
RDSEC EQU SETDMA+3 ; *
WRSEC EQU RDSEC+3 ; *
; * * * * * * * * * * * * * * * * * * * * * * * *