home *** CD-ROM | disk | FTP | other *** search
-
- ; --------------------------------------------------------
- ; BINCOM.COM is a program which can be used to compare
- ; two files, which will probably be binary, to find the
- ; differences between them. The files are compared byte
- ; for byte. No attempt is made to vary the match points
- ; to establish a different synchronization if a prolonged
- ; mismatch is found, as would be done for ASCII files.
- ; The command line is:
- ;
- ; BINCOM [X:]FILE1.COM,[Y:]FILE2.COM
- ;
- ; Discrepancies will be noted at the console in a line
- ; of the form
- ; XXXX YY ZZ
- ; where XXXX is the number of the discrepant byte, YY in
- ; FILE1 but ZZ in FILE2. Pressing any key at the console
- ; will stop the comparison, but in any event there will
- ; be a final total shown of the bytes compared and the
- ; number of mismatches encountered.
- ;
- ; BINCOM .ASM Copyright (C) 1983
- ; Universidad Autonoma de Puebla
- ; September 16, 1983
- ;
- ; [Harold V. McIntosh, 16 September 1983]
- ; --------------------------------------------------------
-
-
- LF equ 0AH ;line feed
- CR equ 0DH ;carriage return
-
- BDOS equ 0005H ;jump to BDOS
- TFCB equ 005CH ;DDT's file control block
- TSIZ equ 0080H ;size of record buffer
-
- ; -------------
- org 0100H
- ; -------------
-
- begn: lxi h,0000
- dad sp
- shld stak
- lxi sp,stak
- lxi h,logo ;"BINCOM/UAP"
- call mssg
- lda TFCB+1 ;file name
- cpi ' '
- jz tuto
- call setup
-
- mvi c,15 ;(0F) open file
- lxi d,fcb1
- call BDOS
- inr a
- jz err1
- mvi c,15 ;(0F) open file
- lxi d,fcb2
- call BDOS
- inr a
- jz err2
-
- xra a
- sta fcb1+32
- sta fcb2+32
- sta byct
- sta neql
- inr a
- sta rect
- mvi a,4
- sta clmn
-
- lxi h,0000
- shld erct
-
- lxi b,0000
-
- loop: lda byct
- ani 07FH
- jnz rnb ;bytes in the buffer
- lda rect
- dcr a
- jnz rna
- push b
-
- lxi b,0008H ;eight-sector buffer
- lxi d,buf1
- lxi h,fcb1
- call filb
-
- push b
- lxi b,0008H ;eight-sector buffer
- lxi d,buf2
- lxi h,fcb2
- call filb
-
- pop psw
- cmp b
- jz eql
- lxi h,neql
- jc neq
- mov a,b
- mvi m,'2'
- jmp eql
- neq: mvi m,'1'
- eql: pop b
- cpi 00
- jz enfi ;end of record
- lxi d,buf1
- lxi h,buf2
- rna: sta rect
- mvi a,80H
- rnb: dcr a ;read next pair of bytes
- sta byct
- ldax d
- cmp m
- cnz rprt ;report discrepancy
- call recs
- jnz quit
- inx b
- inx d
- inx h
- jmp loop
-
- ; Type summary message at the end of the run.
-
- quit: call crlf
- lxi h,me3
- call mssg
- enfi: push b
- call crlf
- lxi h,me1
- call mssg
- pop h
- call word
- mvi a,'H'
- call aout
- call crlf
- lxi h,me2
- call mssg
- lhld erct
- call word
- mvi a,'H'
- call aout
- call crlf
- lda neql
- ora a
- jz gbye
- lxi h,fcb1+1
- cpi '1'
- jz enf
- lxi h,fcb2+1
- enf: call mssg
- lxi h,me4
- call mssg
- gbye: lhld stak
- sphl
- ret
-
- setup: mvi b,16
- lxi d,TFCB
- lxi h,fcb1
- call moov
-
- lxi h,me5
- call mssg
- lxi h,fcb1+1
- call mssg
- call crlf
-
- mvi b,16
- lxi d,TFCB+16
- lxi h,fcb2
- call moov
-
- lxi h,me6
- call mssg
- lxi h,fcb2+1
- call mssg
- call crlf
- jmp crlf
-
- moov: ldax d
- mov m,a
- inx d
- inx h
- dcr b
- jnz moov
- lxi d,-7
- dad d
- mov a,m
- cpi ' '
- rnz
- mvi m,'C'
- inx h
- mvi m,'O'
- inx h
- mvi m,'M'
- ret
-
- ; Fill buffer DE using FCB HL. On return, B = # sectors read.
-
- filb: push b
- push d
- push h
- mvi c,26 ;(1A) set DMA address
- call BDOS
- pop d
- push d
- mvi c,20 ;(14) read one record
- call BDOS
- pop d
- pop h
- lxi b,TSIZ
- dad b
- xchg
- pop b
- cpi 00
- jnz fic
- inr b
- dcr c
- jnz filb
- ret
- fic: cpi 01
- rz
- ret
-
- ; Type CR,LF.
-
- crlf: mvi a,CR
- call aout ;A to console
- mvi a,LF
- jmp aout ;A to console
-
- ; Type one, two, or four spaces.
-
- quad: call dubl
- dubl: call sngl
- sngl: mvi a,' '
-
- ; A to console
-
- aout: push h
- push d
- push b
- mov e,a
- mvi c,02 ;(02) A to console
- call BDOS
- pop b
- pop d
- pop h
- ret
-
- ; Read console status: nz/z = char waiting/not.
-
- recs: push b
- push d
- push h
- mvi c,11 ;(0B) read console status
- call BDOS
- ani 01
- push psw
- jz rcs
- mvi c,1 ;(01) read console
- call BDOS
- rcs: pop psw
- pop h
- pop d
- pop b
- ret
-
- ; Type A as two nibbles
-
- word: mov a,h
- call byte
- mov a,l
- byte: push psw
- rar
- rar
- rar
- rar
- call nybl
- pop psw
- nybl: ani 0FH
- adi 90H
- daa
- aci 40H
- daa
- jmp aout ;A to console
-
- ; Type discrepancy report.
-
- rprt: push h
- push b
- lhld erct
- inx h
- shld erct
- pop h
- call word
- call dubl
- pop h
- mov a,m
- call byte
- call sngl
- ldax d
- call byte
- call sngl
- call quad
- lda clmn
- dcr a
- jnz rpr
- call crlf
- mvi a,4
- rpr: sta clmn
- ret
-
- ; Message terminated by zero to console
-
- mssg: mov a,m
- ora a
- rz
- call aout ;A to console
- inx h
- jmp mssg
-
- err1: lxi h,er1
- jmp cmss
-
- err2: lxi h,er2
- jmp cmss
-
- tuto: lxi h,scrp
- cmss: call mssg
- jmp gbye
-
- ; ---------------------------------------------------------
-
- logo: db ' BINCOM/ICUAP',CR,LF
- db 'Universidad Autonoma de Puebla',CR,LF
- db ' September 16, 1983',CR,LF,CR,LF,00
-
- er1: db 'Cannot open first file.',00
- er2: db 'Cannot open second file.',00
- me1: db 'Number of bytes compared: ',00
- me2: db 'Number of mismatches found: ',00
- me3: db 'Comparison interrupted...',00
- me4: db ' was shorter.',CR,LF,00
- me5: db 'File 1: ',00
- me6: db 'File 2: ',00
- scrp: db 'BINCOM.COM is a program which can be used to compare',CR,LF
- db 'two files, which will probably be binary, to find the',CR,LF
- db 'differences between them. The files are compared byte',CR,LF
- db 'for byte. No attempt is made to vary the match points',CR,LF
- db 'to establish a different synchronization if a prolonged',CR,LF
- db 'mismatch is found, as would be done for ASCII files.',CR,LF
- db 'The command line is:',CR,LF,CR,LF
- db ' BINCOM [X:]FILE1.COM,[Y:]FILE2.COM',CR,LF,CR,LF
- db 'Discrepancies will be noted in the form',CR,LF,CR,LF
- db ' XXXX YY ZZ',CR,LF,CR,LF
- db 'where XXXX is the discrepant byte, YY in FILE1 but ZZ',CR,LF
- db 'in FILE2. Use any key to halt the comparison. Final',CR,LF
- db 'totals - of bytes compared and mismatches found - will',CR,LF
- db 'always be shown.',CR,LF
- db 00
-
- ds 20
- stak: ds 2
- fcb1: ds 33
- fcb2: ds 33
- byct: ds 1 ;byte count
- rect: ds 1 ;record count
- erct: ds 2
- neql: ds 1 ;FF=different file lengths
- clmn: ds 1 ;coumn counter
- borg: ds 2
- buf1: ds 400H ;eight-sector buffer
- buf2: ds 400H ;eight-sector buffer
-
- end
-