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

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

[第54回]

●FILLFFプログラム

前回からの続きです。
COPYプログラムによって新規に作成されたファイルがDIRコマンドで表示されなかったのは、FCBのディレクトリ拡張bェ00になっていなかったためであることがわかりました。

COPYプログラムを直さなければならないのですが、それには、FCBのディレクトリ拡張bノプログラムで00を書き込むようにする、というのが最も安直な方法です。

しかし、もしもCP/MシステムによってCP/MシステムのFCBエリア(805CH〜807FH。本来は005CH〜007FH)にファイル名がインプットされるときに、このディレクトリ拡張bノも00がセットされるようになっているのでしたら、806CH〜の12バイトだけをFCBWK(803BH〜)にコピーするようにしていたところを、その後のデータ(8078H〜)も含めてコピーすればよいので、それをわざわざ後から00を書き込むというのは、いかにもみっともないプログラムだと思います。

いずれの方法にするのかを決めるためには、まず本当にそうなのか(CP/Mシステムによって8078H〜が00でクリアされるのか)、そうではないのかを確認する必要があります。

実はその確認作業はすでに[第44回]でやっております。
何もしないですぐにリターンするプログラム(test.com)を作って、それでパラメータをつけて実行したらどうなるかを確認しました。
そのときのメモリダンプリストを見ますと、ファイル名(および拡張子)の後の数バイトは00になっています。
しかしそれだけでは、ファイル名が書き込まれるときに同時に00が書き込まれたのか、もとから00であったのかは、はっきりしません。

そこで、もう一度[第44回]と同じテストをすることにしますが、ただし今回はtest.comを実行するよりも前に、FCBエリア(805CH〜807FH。本来は005CH〜007FH)にFFを書き込んでおくことにします。
ZB3BASICのCMコマンドで1バイトずつFFを書き込んでいってもよいのですけれど、[第48回]で作りましたFILL00プログラムをちょいと直せばできてしまいますから、そのようにしてみました。

FILLFFプログラムのソースリストです。

; FILL FF 805c-807c
;
	ORG $8100
	FCB=$805C
              ;
     REENT=$1033
;          
	LD HL,FCB
	LD B,24
	LD C,FF
LOOP:LD (HL),C
	INC HL
	DEC B
	JP NZ,LOOP
	RET
;

もとのFILL00.TXTはZB3BASIC上のプログラムとして作りましたから、プログラムの終わりはZB3BASICシステムへのエントリ(JP $1033)にしていましたが、今回はCP/Mのトランジェントプログラムとして作成しますから、プログラムの開始は8100Hからで、プログラムの終わりはRET命令です。
ラベルREENTは使わなくなったのですが、うっかりして残ったままになっています。
REENT=$1033
は不要でした。

下の画像はいつものように、まずZASM.COMでFILLFF.TXTをアセンブルしてから、ZB3[Enter]でND80ZVとUSB接続をしたところです。



下のリストは、ZASM.COMでFILLFF.TXTをアセンブルして、バイナリファイルとともに作成された、アセンブルリストです。

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  


このプログラムはかなり乱暴なプログラムです。
8100Hからロードして、CP/Mのトランジェントプログラムとして実行しますが、その目的はCP/MシステムエリアにFFを書き込むことです。
いわばシステムエリアの破壊ですから、こういうプログラムは内容をわかった上で使わないと危険ですし、また期待した通りの結果が得られない場合もあります。
今回はもちろんわかったうえで行ないますから、大丈夫です。

このあとの作業は、ログファイルを見ながら説明していくことにいたします。

ZB3BASICを起動して、/LDコマンドでfillff.binを8100Hからロードしました。
その後、
JP D233[Enter]でCP/Mを起動しました。

logfile nd80zlog\03070940.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld fillff.bin,8100
loading FILLFF.BIN ...000e(14)bytes loaded,from 8100 to 810D
>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 :
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>fillff

a>

念の為にDIRコマンドでディレクトリを表示してから、8100H〜にロードしたプログラムを、SAVEコマンドでfillff.comの名前でRAMディスクに保存しました。
もう一度DIRコマンドを実行してfillff.comがRAMディスクにセーブされたことを確認しました。

そして、FILLFF.COMを実行しました。
ここまでが上のログファイルの説明です。

下はその続きの部分です。
実行後、[Ctrl][D]でZB3BASICに戻って、DMコマンドで8000〜80FFの内容を表示させてみました。

a>^D>a>^D>

ERR:23 
>dm 8000,80ff
8000  C3 62 D2 00 00 C3 06 C4-03 6A 45 68 42 88 51 E6  テbメ..テ.ト.jEhB.Q.
8010  FC DF 41 00 45 53 54 34-00 00 04 00 F8 DF 44 00  .゚A.EST4.....゚D.
8020  45 53 54 34 00 00 04 00-FC 32 A0 10 3F 3D 54 F2  EST4.....2.?=T.
8030  EF 86 20 08 3F 8F 15 BA-DA EC AF 00 54 45 53 54  .. .?..コレ.ッ.TEST
8040  44 41 54 41 54 58 54 B8-00 00 06 0D 0E 00 00 00  DATATXTク........
8050  00 00 00 00 00 00 00 00-00 00 00 06 FF FF FF FF  ................
8060  FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF  ................
8070  FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF  ................
8080  00 00 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
8090  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80A0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80B0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80C0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80D0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80E0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80F0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
>

805CH〜807FHにFFが書き込まれました。
これで準備完了です。

下のログファイルの説明です。
もういちどJP D233で、CP/Mに戻ります。
そして、
test name1.txt name2.txt[Enter]
を実行しました。

>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>test name1.txt name2.txt

a>

結果を確認するために、またZB3BASICに戻って、DMコマンドでさきほどの8000〜80FFの範囲のメモリ内容を表示させてみました。

a>^D>a>^D>

ERR:23 
>dm 8000,80ff
8000  C3 62 D2 00 00 C3 06 C4-03 6A 45 68 42 88 51 E6  テbメ..テ.ト.jEhB.Q.
8010  FC DF 41 00 45 53 54 34-00 00 04 00 F8 DF 44 00  .゚A.EST4.....゚D.
8020  45 53 54 34 00 00 04 00-FC 32 A0 10 3F 3D 54 F2  EST4.....2.?=T.
8030  EF 86 20 08 3F 8F 15 BA-DA EC AF 00 54 45 53 54  .. .?..コレ.ッ.TEST
8040  44 41 54 41 54 58 54 B8-00 00 06 0D 0E 00 00 00  DATATXTク........
8050  00 00 00 00 00 00 00 00-00 00 00 06 00 4E 41 4D  .............NAM
8060  45 31 20 20 20 54 58 54-00 00 00 02 00 4E 41 4D  E1   TXT.....NAM
8070  45 32 20 20 20 54 58 54-00 00 00 00 00 FF FF FF  E2   TXT........
8080  14 20 4E 41 4D 45 31 2E-54 58 54 20 4E 41 4D 45  . NAME1.TXT NAME
8090  32 2E 54 58 54 00 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  2.TXT...........
80A0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80B0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80C0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80D0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80E0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
80F0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Wed Mar 07 09:50:47 2012

test.comを実行する前にはFFだった805CH〜807CHにファイル名と拡張子が書き込まれ、注目の8078H〜807CHには00が書き込まれています。
これでCP/Mシステムによって、その範囲に強制的に00が書き込まれることが確認できました。
なお、807DHから807FHには何も書き込まれないことも確認できました。

●修正後のCOPYプログラムです

以上によって、8078H〜807CHには、CP/Mシステムによって00が書き込まれることが確認できましたので、その範囲も含めてFCBWKにコピーするようにCOPYプログラムを修正しました。
下はそのように修正したCOPYプログラムです。

修正したのは、LOOP1:の1行上の
LD B,11;=17
のところだけです。
ここは、修正前は、
LD B,0C;=12
でした。

; BDOS TEST5 COPY
;2012/3/4 3/7
;
        ORG $8100
        FCALL=$8005
        FCBWK=$803B
        RECNO2=$805B
        FCB=$805C
        FCB2=$806C
        RECNO=$807C
        DMA=$8080
;
        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,13;delete
        LD DE,FCBWK
        CALL FCALL
;
        LD C,16;make file
        LD DE,FCBWK
        CALL FCALL
        INC A;if FFH?
        JP Z,DFULERR
;
        XOR A
        LD (RECNO),A
        LD (RECNO2),A
;
LOOP2:  LD C,14;read
        LD DE,FCB
        CALL FCALL
        OR A
        JP NZ,CLOSE;read end
        LD C,15;write
        LD DE,FCBWK
        CALL FCALL
        INC A;if FFH?
        JP Z,DFULERR
        JP LOOP2
;
CLOSE:LD C,10;close
        LD DE,FCBWK
        CALL FCALL
        INC A;if FFH?
        JP Z,CLOSERR
        LD DE,OK
        JP MSGOUT
;
NOFILERR:LD DE,CANTOPN
        JP MSGOUT
DFULERR:LD DE,DFULL
        JP MSGOUT
CLOSERR:LD DE,CANTCLS
MSGOUT:LD C,09
        CALL FCALL
        RET
;
CANTOPN:"can'"
        "t op"
        "en!"
        DB 0D
        DB 0A
        DB 24;$
DFULL:"disk"
        " ful"
        "l!"
        DB 0D
        DB 0A
        DB 24;$
CANTCLS:"can'"
        "t cl"
        "ose!"
        DB 0D
        DB 0A
        DB 24;$
OK:"copy"
        " don"
        "e"
        DB 0D
        DB 0A
        DB 24;$
;

修正後のftst5cpy.txtをZASM.COMでアセンブルしました。
その後、ZB3[Enter]で、ND80ZVとUSB接続しました。



このあとはいつものように、ログファイルで説明をいたします。

logfile nd80zlog\03071119.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst5cpy.bin,8100
loading FTST5CPY.BIN ...00af(175)bytes loaded,from 8100 to 81AE
>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>save 1 copy.com
a>copy ftest4-1.txt testdat2.txt
copy done

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
a>

上のログファイルの説明です。
ZB3BASICを起動後、/LDコマンドでftst5cpy.binを8100H〜にロードしました。

その後、
JP D233[Enter]
でCP/Mを起動し、/LDコマンドで8100H〜にロードしたプログラムを、saveコマンドでcopy.comの名前でRAMディスクに保存しました。
RAMディスクには修正前のcopy.comが保存されていましたが、
save 1 copy.com
の再実行によって、上書きされます。

さて、そこで

copy test4−1.txt testdat2.txt[Enter]

を実行して、そのあとDIRコマンドでディレクトリを表示させてみたところ、今回はCOPYプログラムによって新規作成されたTESTDAT2.TXTも正しく表示されました。

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

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