復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第55回]
●ファイル内容比較プログラム
[第53回]で、COPYプログラムによって作成されたファイルがコピー元のファイルと内容が同じかどうかをチェックするプログラムを作るとよいのですが…、と書きました。
前回COPYプログラムについて、一件落着いたしましたので、今回はファイル内容を比較するプログラムを作ってみました。
ファイル内容を比較するプログラムはWindowsアプリケーションにもたくさんあるようです。
文章や文節単位に比較して、追加挿入が行なわれたかどうかを知ることができるものなどもあるようです。
が、今回作成したプログラムはそのような高機能なものではありません。
単純に2つのファイルを先頭からバイト単位で比較しているだけです。
まあ、しかし、コピー元のファイルとコピー先のファイルが同じかどうかを比較するだけですから、それで十分でしょう。
ソースプログラムです。
今回はかなり長いプログラムになりました。
; BDOS TEST6 COMPARE
;2012/3/7
;
ORG $8100
FCALL=$8005
FCBWK=$803B
RECNO2=$805B
FCB=$805C
FCB2=$806C
RECNO=$807C
DMA1=$8080
DMA2=$8300
BYTECNTR=$8380
AWK=$8382
;
LD HL,FCB2
LD DE,FCBWK
LD B,11;=17
LOOP1:LD A,(HL)
LD (DE),A
INC HL
INC DE
DEC B
JP NZ,LOOP1
;
LD C,0F;open
LD DE,FCB
CALL FCALL
INC A;if FFH?
JP Z,NOFILERR
;
LD C,0F;open
LD DE,FCBWK
CALL FCALL
INC A;if FFH?
JP Z,NOFILERR
;
XOR A
LD (RECNO),A
LD (RECNO2),A
LD HL,BYTECNTR
LD (HL),A
INC HL
LD (HL),A
;
LOOP2:LD C,1A;DMA address set
LD DE,DMA1
CALL FCALL
LD C,14;read
LD DE,FCB
CALL FCALL
OR A
JP NZ,CMPEND;read end
;
LD C,1A;DMA address set
LD DE,DMA2
CALL FCALL
LD C,14;read
LD DE,FCBWK
CALL FCALL
OR A
JP NZ,CMPEND;read end
;
LD C,80
LD HL,DMA1
LD DE,DMA2
LOOP3:LD A,(DE)
CP (HL)
CALL NZ,NOTEQ
INC HL
INC DE
PUSH HL
LD HL,(BYTECNTR)
INC HL
LD (BYTECNTR),HL
POP HL
DEC C
JP NZ,LOOP3
JP LOOP2
;
NOFILERR:LD DE,CANTOPN
LD C,09
CALL FCALL
CMPEND:LD C,1A;DMA address set
LD DE,DMA1
CALL FCALL
RET
;
NOTEQ:PUSH BC
PUSH DE
PUSH HL
LD HL,(BYTECNTR)
CALL HEX4DP
CALL SPDP
POP HL
LD A,(HL)
LD (AWK),A
POP DE
LD A,(DE)
PUSH DE
PUSH HL
PUSH AF
LD A,(AWK)
CALL B2HEXDP
LD A,2D;"-"
CALL ADP
POP AF
CALL B2HEXDP
CALL CRLF
POP HL
POP DE
POP BC
RET
;
;CL & LF
CRLF:LD A,0D
CALL ADP
LD A,0A
JP ADP
;space disp
SPDP:LD A,20
;A disp
ADP:PUSH BC
PUSH HL
LD E,A
LD C,02
CALL FCALL
POP HL
POP BC
RET
;HL(bynary 2bytes) to asckii 4bytes & disp
HEX4DP:PUSH BC
PUSH HL
CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
PUSH DE
EX DE,HL
CALL DEDP
POP DE
CALL DEDP
POP HL
POP BC
RET
;A(binary) to asckii 2bytes HEX & disp
B2HEXDP:PUSH BC
PUSH HL
CALL B2HEX2
CALL DEDP
POP HL
POP BC
RET
;
;DE(asckii 2bytes) disp
DEDP:PUSH DE
LD E,D
LD C,02
CALL FCALL
POP DE
LD C,02
CALL FCALL
RET
;
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
B2HEX4:LD A,H
CALL B2HEX2
EX DE,HL
LD A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
B2HEX2:PUSH AF
RRCA
RRCA
RRCA
RRCA
CALL B2HEX1
LD D,A
POP AF
CALL B2HEX1
LD E,A
RET
;binary to hex, low 4bit to ascii 1charactor
B2HEX1:AND 0F
ADD A,30
CP 3A
RET C;0-9
ADD A,07;A-F
RET
;
CANTOPN:"can'"
"t op"
"en!"
DB 0D
DB 0A
DB 24;$
;
|