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

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

アドレス810Cの 3E01 LD A,01 が今回変更した部分です。

下は、アセンブルによって作成されたバイナリファイルftest4−2.binを8100Hからロードして、それを実行してみるまでを記録したログファイルです。
ftest4−2.comというファイル名でRAMディスクに保存しておいて、
ftest4−2 ftest4−1.txt[Enter]
を実行しました。

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>

おお。
テキストファイルの途中から表示されました。
080
というところから、開始されています。

さらにもう少し続けてテストをしてみます。
一旦[Ctrl][D]でZB3BASICに戻って、CMコマンドで810Dの01を02に変更してみました。
その後、そのように変更したプログラムをftest4−3.comというファイル名でRAMディスクに保存しておいてから
ftest4−3 ftest4−1.txt[Enter]
を実行してみました。

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

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