home *** CD-ROM | disk | FTP | other *** search
- .ttl COMPARE TWO FILES
-
-
- * os interface
-
- sysreset equ 0
- conout equ 2
- pstring equ 9
- fopen equ 15
- fclose equ 16
- readsequ equ 20
- setdma equ 26
-
-
- * base page offsets
-
- deffcb1 equ $5c * 1st parsed fcb
- deffcb2 equ $38 * 2nd parsed fcb
-
-
- * registers
-
- position equ d5
- f1dmaptr equ a3
- f2dmaptr equ a4
- f1fcbptr equ a5
- f2fcbptr equ a6
-
-
- * ascii characters
-
- lf equ $0a
- cr equ $0d
-
-
- * misc. constants
-
- blank equ $20
- eof equ $ff
- sequrec equ 32 * current record offset
- sectsize equ 128
- bufsize equ 128 * sectors/buffer
-
-
- .text
-
- start:
- move.l 4(sp),a0 * ^base page
- bsr setup
- bsr tryopen * exit on failure
- mainloop:
- bsr f1rd8sct * read file1 sectors
- bsr f2rd8sct * read file2 sectors
- bsr compsect * compare sectors, exit on eof
- bra mainloop
-
-
- setup:
- lea deffcb1(a0),a1 * ^first parsed fcb
- lea file1fcb,f1fcbptr * ^fcb of file1
- move.l f1fcbptr,a2
- bsr xferfcb
- lea deffcb2(a0),a1 * ^2nd parsed fcb
- lea file2fcb,f2fcbptr * ^fcb of file2
- move.l f2fcbptr,a2
- bsr xferfcb
- lea file1dma,f1dmaptr * ^file1 dma address
- lea file2dma,f2dmaptr * ^file2 dma address
- moveq #0,position * position counter
- rts
-
-
- xferfcb:
- movem.l d0/a1-a2,-(sp)
- moveq #12,d0 * drive code & filespec
- xferloop:
- move.b (a1)+,(a2)+
- subq.b #1,d0
- bne xferloop
- movem.l (sp)+,d0/a1-a2
- rts
-
-
- tryopen:
- move.l f1fcbptr,d1
- bsr openfile
- tst.b d0
- bpl trynext
- move.l #f1nftxt,d1
- bra exit
-
-
- trynext:
- move.l f2fcbptr,d1
- bsr openfile
- tst.b d0
- bpl goodtry
- move.l #f2nftxt,d1
-
-
- exit:
- moveq #pstring,d0
- bsr bdos
- moveq #sysreset,d0
- trap #2
-
-
- goodtry:
- clr.b sequrec(f1fcbptr) * clear current record
- clr.b sequrec(f2fcbptr) * field in fcbs
- rts
-
-
- openfile:
- moveq #fopen,d0
- bsr bdos
- rts
-
-
- f1rd8sct:
- movem.l d0-d1/f1dmaptr,-(sp)
- clr.b f1sctib * reset sect in buf count
- f1rd8lp:
- move.l f1dmaptr,d1
- moveq #setdma,d0
- bsr bdos * set dma address
- move.l f1fcbptr,d1
- moveq #readsequ,d0
- bsr bdos * read 1 logical sector
- tst.b d0 * eof?
- bne f1rd8ex * yes, exit
- addq.b #1,f1sctib * update sector count
- cmp.b #bufsize,f1sctib * buffer full?
- beq f1rd8ex * yes, exit
- add.l #sectsize,f1dmaptr * update ^dma buffer
- bra f1rd8lp * go for next sector
-
- f1rd8ex:
- movem.l (sp)+,d0-d1/f1dmaptr
- rts
-
-
- f2rd8sct:
- movem.l d0-d1/f2dmaptr,-(sp)
- clr.b f2sctib * reset sect in buf count
- f2rd8lp:
- move.l f2dmaptr,d1
- moveq #setdma,d0
- bsr bdos * set dma address
- move.l f2fcbptr,d1
- moveq #readsequ,d0
- bsr bdos * read 1 logical sector
- tst.b d0 * eof?
- bne f2rd8ex * yes
- addq.b #1,f2sctib * update sector count
- cmp.b #bufsize,f2sctib * buffer full?
- beq f2rd8ex * yes, exit
- add.l #sectsize,f2dmaptr * update ^dma buffer
- bra f2rd8lp
-
- f2rd8ex:
- movem.l (sp)+,d0-d1/f2dmaptr
- rts
-
-
- ltoahx:
- movem.l d0-d1/position/a0,-(sp)
- lea postring+6,a0 * ^ascii 'hex' string
- moveq #5,d0 * length counter
- ltoahxlp:
- move.b position,d1
- bsr makeascii * convert 1 nibble
- move.b d1,-(a0) * store it
- lsr.l #4,position * prep next nibble
- dbf d0,ltoahxlp * do all 6 nibbles
- movem.l (sp)+,d0-d1/position/a0
- rts
-
-
- btohx:
- move.b d0,d1
- bsr makeascii * convert lo nibble
- exg d0,d1
- lsr.b #4,d1 * move hi to lo nibble
- bsr makeascii * convert hi nibble
- rts
-
-
- makeascii:
- and.b #$0f,d1 * mask hi nibble
- add.b #'0',d1 * 0 becomes '0', etc.
- cmp.b #'9',d1 * >'9'?
- ble makeasc1 * no
- addq.b #7,d1 * $10 becomes 'A', etc.
- makeasc1:
- rts
-
-
- compsect:
- movem.l d0-d2/a3-a4,-(sp)
- move.b f1sctib,d6 * file 1 sectors in buf
- move.b f2sctib,d7 * file 2 sectors in buf
- cmpsctlp:
- move.b #128,d2 * sector length
- cpbytelp:
- move.b (f1dmaptr),d0
- cmp.b (f2dmaptr),d0 * bytes equal?
- beq cmpsctup * yes, just updt ptrs
- cmp.b #blank,d0 * printing char?
- bcs npchr1 * no
- cmp.b #$7f,d0 * > printing char?
- bcc npchr1 * yes, do not print
- move.b d0,f1asc * is printing char
- bra npchr11
-
- npchr1:
- move.b #blank,f1asc * substitute blank
- npchr11:
- bsr btohx
- move.b d1,f1hxhi * store hi asc 'nibble'
- move.b d0,f1hxlo * store lo asc 'nibble'
- move.b (f2dmaptr),d0 * file2 byte
- cmp.b #blank,d0 * printing char?
- bcs npchr2 * no
- cmp.b #$7f,d0 * > printing char?
- bcc npchr2 * yes, do not print
- move.b d0,f2asc * is printing char
- bra npchr21
-
- npchr2:
- move.b #blank,f2asc * substitute blank
- npchr21:
- bsr btohx
- move.b d1,f2hxhi * store hi asc 'nibble'
- move.b d0,f2hxlo * store lo asc 'nibble'
- bsr ltoahx * conv posn to ascii
- bsr ppostrng * print string incl '$'
- cmpsctup:
- addq.l #1,f1dmaptr * ^next byte
- addq.l #1,f2dmaptr
- addq.l #1,position
- subq.b #1,d2 * done complete sector?
- bne cpbytelp * no, loop
- subq.b #1,d6 * sector count file 1
- beq tsteof * file 1 buffer done
- subq.b #1,d7 * sector count file 2
- bne cmpsctlp * compare next sector
- move.l #f2tstxt,d1 * premature end of file 2
- bra exit
-
- tsteof:
- subq.b #1,d7 * file 2 sector count
- cmp.b d6,d7 * both zero?
- bhi f1peof * premature eof file 1
- cmp.b #bufsize,f1sctib * were both buffers full?
- bne botheof * no, must be both eof
- movem.l (sp)+,d0-d2/a3-a4
- rts
-
-
- f1peof:
- move.l #f1tstxt,d1
- bra exit * print txt & exit
-
- botheof:
- move.l #eoptxt,d1
- bra exit
-
-
- ppostrng:
- movem.l d0-d1/a0,-(sp) * print string incl '$'
- moveq #0,d1
- lea postxt,a0 * ^string
- ppostrlp:
- move.b (a0)+,d1
- beq exppostr * end of string
- moveq #conout,d0
- bsr bdos
- bra ppostrlp
-
- exppostr:
- movem.l (sp)+,d0-d1/a0
- rts
-
-
- bdos:
- movem.l d1-d7/a0-a6,-(sp)
- trap #2
- movem.l (sp)+,d1-d7/a0-a6
- rts
-
-
- .data
-
- file1fcb:
- dc.b 0 * drive code
- dc.b 'filename' * file name
- dc.b 'one' * file type
- dc.b 0 * extent #
- dc.b 0 * s1, reserved
- dc.b 0 * s2, reserved
- dc.b 0 * rc, reserved
- ds.b 16 * d0-dn, reserved
- dc.b 0 * current sequ. record
- dc.b 0,0,0 * r0,r1,r2 (r. access)
-
- .even
-
- file2fcb:
- dc.b 0 * drive code
- dc.b 'filename' * file name
- dc.b 'two' * file type
- dc.b 0 * extent #
- dc.b 0 * s1, reserved
- dc.b 0 * s2, reserved
- dc.b 0 * rc, reserved
- ds.b 16 * d0-dn, reserved
- dc.b 0 * current sequ. record
- dc.b 0,0,0 * r0,r1,r2 (r. access)
-
-
- f1sctib:
- dc.b 0 * file 1 buffer fill count
- f2sctib:
- dc.b 0 * file 2 buffer fill count
-
-
- f1nftxt:
- dc.b 'First file not found.'
- dc.b cr,lf,'$'
-
- f2nftxt:
- dc.b 'Second file not found.'
- dc.b cr,lf,'$'
-
- f1tstxt:
- dc.b 'Premature end of first file.'
- dc.b cr,lf,'$'
-
- f2tstxt:
- dc.b 'Premature end of second file.'
- dc.b cr,lf,'$'
-
- eoptxt:
- dc.b 'End of program.'
- dc.b cr,lf,'$'
-
- postxt:
- dc.b 'Position '
- postring:
- dc.b '000000 '
- f1text:
- dc.b 'File 1 = '
- f1hxhi:
- dc.b '0'
- f1hxlo:
- dc.b '0 '
- f1asc:
- dc.b ' '
-
- f2text:
- dc.b 'File 2 = '
- f2hxhi:
- dc.b '0'
- f2hxlo:
- dc.b '0 '
- f2asc:
- dc.b ' '
- dc.b cr,lf,0
-
- .even
-
- .bss
-
- file1dma:
- ds.b sectsize*bufsize
- file2dma:
- ds.b sectsize*bufsize
-
- .end
-