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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第59回]

●ファイル内容比較プログラム(5)

前回はファイル内容を比較するプログラムcmp.comを使って、その前にcopy.comで作成したtestdata.txtファイルと、そのもとになったftest4−1.txtファイルを比較しました。
cmp.comは2つのファイルを先頭から1バイトずつ比較して、不一致のところだけ表示するというプログラムですから、完全に一致しているファイルを比較しても何も表示されません。
結果としてはそれでよいのですけれど、作ったばかりのプログラムですから、なんとなく、いいのかなあ、という気になってしまいます。

そこで今回は短いファイルで、かつ一致している部分と不一致の部分があるような、2つのファイルを比較してみることにいたします。
そういうファイルを新しく作ってもいいのですけれど、わざわざ作るのも面倒ですから、何かすでにあるファイルで手頃なものはないものか、と思いましたら、ありました。手頃なものが。


2012/3/7  9:40  fillff.txt
END=810D
              ; FILL FF 805c-807c
              ;
              	ORG $8100
              	FCB=$805C
                            ;
                   REENT=$1033
              ;          
8100 215C80   	LD HL,FCB
8103 0624     	LD B,24
8105 0EFF     	LD C,FF
8107 71       LOOP:LD (HL),C
8108 23       	INC HL
8109 05       	DEC B
810A C20781   	JP NZ,LOOP
810D C9       	RET
              ;
              
FCB          =805C  LOOP         =8107  REENT        =1033  


[第54回]で使いましたFILLFFプログラムです。
もともとこのプログラムは[第54回]で書いておりますように、[第48回]で作りましたFILL00プログラムをちょいと直して作ったものです。
こちらがそのもとになったFILL00プログラムです。

2012/3/2  19:59  fill00.txt
END=808F
              ; FILL 00 8100-87ff
              ;
                   ORG $8080
                   REENT=$1033
              ;          
8080 210081   	LD HL,$8100
8083 0600     	LD B,00
8085 70       LOOP:LD (HL),B
8086 23       	INC HL
8087 7C       	LD A,H
8088 FE88     	CP 88
808A C28580   	JP NZ,LOOP
808D C33310   	JP REENT
              ;
              
LOOP         =8085  REENT        =1033  

両方とも同じぐらいの長さの短いファイルですから比較するには手頃です。
ただし、CP/Mの場合、最低でも256バイトのサイズのファイルになってしまいますから、事前に細工が必要です。
そうでないと、実際のプログラムサイズに関係無く256バイト分の比較が行なわれてしまいます。

FILLFFプログラムはすでにRAMディスクに保存されています。
CP/MにエントリしてDIRコマンドで確認してみました。

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>jp d233

a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM
a>

しかしFILLFF.COMはそんなことは何も考えないで保存したファイルですから、プログラムの後には意味の無いデータもくっついて256バイトのファイルになってしまっています。
そこで、まずFILL00プログラムでトランジェントエリアを00でクリアしてから、そこにFILLFF.BINをロードして、それをあらためてセーブすることにします。

a>^D>a>^D>

ERR:23 
>/ld fill00.bin,8080
loading FILL00.BIN ...0010(16)bytes loaded,from 8080 to 808F
>jp 8080
>/ld fillff.bin,8100
loading FILLFF.BIN ...000e(14)bytes loaded,from 8100 to 810D
>dm 8100,81ff
8100  21 5C 80 06 24 0E FF 71-23 05 C2 07 81 C9 00 00  !\..$..q#.ツ..ノ..
8110  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8120  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8130  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8140  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8150  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8160  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8170  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8180  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8190  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
81A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
81B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
81C0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
81D0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
81E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
81F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
>jp d233

a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM
a>save 1 fillff.com
a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM
a>

上のログファイルの説明です。

[Ctrl][D]でZB3BASICに戻って、
/LD FILL00.BIN,8080[Enter]
で、FILL00プログラムを8080Hにロードしました。

そのあと、
JP 8080[Enter]
で、FILL00プログラムを実行しました。
これで8100H〜87FFHの範囲が00になりました。

そして、そこに
/LD FILLFF.BIN,8100[Enter]
で、FILLFFプログラムをロードしました。

DM 8100,81FF[Enter]
で、8100H〜81FFHのメモリ内容を表示させました。
プログラムの後は全て00になっています。

JP D233[Enter]
でCP/Mに戻りました。

DIRコマンドでディレクトリを表示させてみたあと、
SAVE 1 FILLFF.COM[Enter]
で、8100H〜81FFHの内容をFILLFF.COMの名前で保存しました。

もう一度DIRコマンドで、ディレクトリを表示させました。
表示は先に表示したものと同じですが、FILLFF.COMはあとからセーブした内容で上書きされています。

次に同じようにして、FILL00プログラムもRAMディスクに保存します。
FILL00はCP/Mのプログラムではなくて、ZB3BASICシステムで動くプログラムで、本来は8080Hにロードして実行します。
しかし、今回はプログラムとして実行することが目的ではなくて、ファイル比較のためのサンプルとして使うだけですから、CP/Mでファイルとして保存できるようにトランジェントエリア(8100H。本来は0100H)にロードします。

a>^D>a>^D>

ERR:23 
>/ld fill00.bin,8100
loading FILL00.BIN ...0010(16)bytes loaded,from 8100 to 810F
>jp d233

a>save 1 fill00.bin
a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM : FILL00   BIN
a>cmp fillff.com fill00.bin
0001 5C-00
0002 80-81
0004 24-00
0005 0E-70
0006 FF-23
0007 71-7C
0008 23-FE
0009 05-88
000B 07-85
000C 81-80
000D C9-C3
000E 00-33
000F 00-10

a>

ログファイルの説明です。

[Ctrl][D]でZB3BASICに戻って、
/LD FILL00.BIN,8100[Enter]
で、FILL00プログラムを8100Hにロードしました。
ここにはさきほどFILLFF.BINをロードしましたが、810EHからうしろは00になっていました。
そこに上書きする形でFILL00.BINをロードしていますが、プログラムの終わりは810FHですから、そこからうしろはやはり全て00です。

JP D233[Enter]
でCP/Mに戻りました。

SAVE 1 FILL00.BIN[Enter]
で、8100H〜81FFHの内容をFILL00.BINの名前で保存しました。

[注記]このプログラムはCP/Mで実行するプログラムではありませんし、本来は8080Hにロードして実行されるプログラムですから、「COM」ではなくて「BIN」にしました。

DIRコマンドで、ディレクトリを表示させました。
FILL00.BINが保存されました。

いよいよcmp.comの実行です。
CMP FILLFF.COM FILL00.BIN[Enter]
を実行しました。

ファイルの先頭から1バイトずつ比較を行ない、不一致だったところだけが表示されています。
これで、CMP.COMが正しく実行されていることが確認できました。

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

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