復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第50回]
●ファンクションコール14Hのレコードnw定
前回からの続きです。
ファンクションコール14H(シーケンシャルファイルリード)では、FCBエリアの33バイト目、デフォルトのFCBエリア(805CH〜807FH、本来は005CH〜007FH)の場合は、アドレス807CH(本来は007CH)に、00を書いておくことで、ファイルの先頭から読み出しを開始します、ということを前回書きました。
それでは、そのアドレス807CH(本来は007CH)に、00を書く代わりにたとえば01を書いておくとどうなるでしょうか?
というところまでで、前回は終わりました。
そこで、そのようにプログラムを変更して、どうなるかを確認してみました。
807CHに01を書くように変更したプログラムです(アセンブルリストで示します)。
2012/3/3 21:44 ftest4-2.txt
END=8142
; BDOS TEST4 TYPE
;2012/2/28 3/3
;
ORG $8100
FCALL=$8005
FCB=$805C
RECNO=$807C
DMA=$8080
;
8100 0E0F LD C,0F;open
8102 115C80 LD DE,FCB
8105 CD0580 CALL FCALL
8108 3C INC A;if FFH?
8109 CA2D81 JP Z,ERR
810C 3E01 LD A,01
810E 327C80 LD (RECNO),A
;
8111 0E14 LOOP1: LD C,14;read
8113 115C80 LD DE,FCB
8116 CD0580 CALL FCALL
8119 B7 OR A
811A C0 RET NZ;read end
;
811B 218080 LD HL,DMA
811E 5E LOOP2:LD E,(HL)
811F 0E02 LD C,02
8121 E5 PUSH HL
8122 CD0580 CALL FCALL
8125 E1 POP HL
8126 2C INC L
8127 C21E81 JP NZ,LOOP2
812A C31181 JP LOOP1
;
812D 113681 ERR:LD DE,ERRMSG
8130 0E09 LD C,09
8132 CD0580 CALL FCALL
8135 C9 RET
8136 63616E27 ERRMSG:"can'"
813A 74206F70 "t op"
813E 656E "en"
8140 0D DB 0D
8141 0A DB 0A
8142 24 DB 24;$
;
DMA =8080 ERR =812D ERRMSG =8136
FCALL =8005 FCB =805C LOOP1 =8111
LOOP2 =811E RECNO =807C
|
logfile nd80zlog\03032144.txt open
ND80ZVに接続しました
0001 0000 - z
1000 00C3 -
*** nd80z3 basic ****
>/ld ftest4-2.bin,8100
loading FTEST4-2.BIN ...0043(67)bytes loaded,from 8100 to 8142
>jp d233
a>dir
A: FILLE5 COM : FTEST1 COM : FTEST2 COM : DM COM
A: TEST COM : FTEST4 COM : FTEST4-1 TXT
a>save 1 ftest4-2.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-2 ftest4-1.txt
080
;
LD C,0F;open
LD DE,FCB
CALL FCALL
INC A;if FFH?
JP Z,ERR
XOR A
LD (RECNO),A
;
LOOP1: LD C,14;read
LD DE,FCB
CALL FCALL
OR A
RET NZ;read end
;
LD HL,DMA
LOOP2:LD E,(HL)
LD C,02
PUSH HL
CALL FCALL
POP HL
INC L
JP NZ,LOOP2
JP LOOP1
;
ERR:LD DE,ERRMSG
LD C,09
CALL FCALL
RET
ERRMSG:"can'"
"t op"
"en"
DB 0D
DB 0A
DB 24;$
;
a>
|
a>^D>a>^D>
ERR:23
>cm 810d
810D 01-02
810E 32-
>jp d233
a>save 1 ftest4-3.com
a>ftest4-3 ftest4-1.txt
LD (RECNO),A
;
LOOP1: LD C,14;read
LD DE,FCB
CALL FCALL
OR A
RET NZ;read end
;
LD HL,DMA
LOOP2:LD E,(HL)
LD C,02
PUSH HL
CALL FCALL
POP HL
INC L
JP NZ,LOOP2
JP LOOP1
;
ERR:LD DE,ERRMSG
LD C,09
CALL FCALL
RET
ERRMSG:"can'"
"t op"
"en"
DB 0D
DB 0A
DB 24;$
;
a>^D>a>^D>
ERR:23
>0000 00C3 -
リモート接続を終了しました
logfile closed at Sat Mar 03 21:50:46 2012
|
今度もテキストファイルの途中から表示されました。
今回は、
LD (RECNO),A
というところから、開始されました。
807CH(本来は007CH)に00を入れて、ファイルリードをすると、テキストファイルの先頭から読み込んだデータが表示されました。
00の代わりに01を入れて、ファイルリードをすると、テキストファイルの途中(”080”というところ)からデータが表示されました。
次に、今度は02を入れて、ファイルリードをすると、テキストファイルの途中(”LD (RECNO),A”というところ)からデータが表示されました。
01を入れた場合の”080”、02を入れた場合の”LD (RECNO),A”、はそれぞれもとのテキストファイルのどの位置にあるのでしょうか?
●MSDOSのDEBUGコマンド
それを確かめるために、MSDOSのDEBUGコマンドを使ってみました。

ファイル名を指定してデバッグコマンド(debug)を実行すると、そのファイルはメモリアドレスの0100Hから読み込まれます。
CP/Mの話ではありません。
MSDOSのDEBUGコマンドのことです。
MSDOSがCP/Mの影響を強く受けていることが、こんなところからもわかります。
d 100[Enter]
と入力すると、ファイルの最初から128バイトのデータが表示されます。
おや。
この128バイトという表示単位もまるでCP/Mそのままですね。
次に
d[Enter]
だけを入力すると、その次のアドレスから128バイトが表示されます。
最初の128バイトが、レコードbOです。
その次の128バイトが、レコードbPです。
右側のASCIIダンプを見てください。
おお。
先頭に”080”の文字が見えます。
先ほど、807CHに01を指定したときは、ここから読み込みが開始されたのです。
もう一回
d[Enter]
を実行して、次の128バイトを表示させました。
次はレコードbQです。

先頭には”LD (RECNO),A”の文字が見えます。
さらによく見ますと、先の”080”はレコードの先頭にありました。
ログファイルに戻って表示を確かめてみますと、左端から”080”が表示されています。
これに対して”LD (RECNO),A”は、レコードの先頭に20H(スペース)が5個あって、その次に置かれています。
これもログファイルを確かめてみますと、左端から6文字目から”LD (RECNO),A”が表示されています。
ということで、807CHがリードファイルのレコードカウンタとして使われていることがわかりました。
む?
レコードカウンタ?
ひょっとすると、このアドレスの値はレコードを読むたびに、インクリメントされているのでは?
●ZB3BASICのDMコマンド
ZB3BASICを立ち上げて、DMコマンドでCP/Mのシステムエリアを表示させてみました。

水色の枠で囲ったところがデフォルトのFCBエリアです。
FTEST4−1TXTの文字が見えます。
そして、807CHの値を見ますと、06になっています。
FTEST4−1.TXTのサイズは3ページ(6レコード)です。
最後のレコードbTを読んだ後、カウンタを次のレコードの06にしたところでブレイクしたことがわかります。
さて。
ここではCP/Mについて書いておりますけれど、そのCP/Mが動作しておりますのは、WindowsパソコンとUSBで接続したND80ZVのZB3BASICシステムの上です。
そして、そのND80ZVシステムはMSDOSのDOSプロンプト(コマンドプロンプト)の中で機能しています。
なんだかややこしいようですけれど、オリジナルのCP/Mが動いていた環境から比べますと、今回説明しましたように、ZB3BASICのマシン語モニタの機能や、MSDOSのDEBUG機能なども必要に応じて使うことができますから、これはなかなかに便利なものだと思うのですが、いかがでしょうか?
ワンボードマイコンでCP/Mを![第50回]
2012.3.4upload
前へ
次へ
ホームページトップへ戻る