2012.3.9
前へ
次へ
ホームページトップへ戻る

復活!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;$
;

説明の途中ですが、本日はお得意様から急ぎの注文を受けてしまいましたので、その作業のため、ちょっと時間がありません。 この続きは次回にすることにいたします。

ワンボードマイコンでCP/Mを![第55回]
2012.3.9upload

前へ
次へ
ホームページトップへ戻る