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

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

[第47回]

●TYPEプログラム(2)

前回は時間がなくてあせりながら書いたものですから、とんでもない勘違いやら早とちりをしてしまったために、まともな動作確認ができないまま間違ったことを書いてしまいました。
本日になりましてから、とんでもない勘違いをしていたことに気が付きましたので、前回分はばっさり削って、書き直しました。
結局前回最初にお見せしたプログラムリストが正しかったのでした。
今回はそのソースプログラムをもとにして、テスト作業を行ないます。

●ソースプログラムのアセンブル

それではまず、前回のソースプログラムをアセンブルして、それから作成されたバイナリファイルをRAMディスクに保存します。



zasm ftest4−1.txt[Enter]を実行しました。
画面にはEND=8141としか表示されませんが、バイナリファイルftest4−1.binが作成されています。
ND80ZVに接続して、このあとZB3BASICを起動します。

上の画面で、zを入力してZB3BASICを起動しました。
下はそれ以後の操作を行なっている画面です。



/LDコマンドでftest4−1.binを8100Hにロードしました。
そのあと jp d233[Enter]でCP/Mを起動して、dirコマンドでディレクトリを表示させました。

8100Hにロードしたftest4−1.binを名前をつけてRAMディスクにセーブします。
FTEST4.COMという名前でセーブします。
save 1 ftest4.com[Enter]を実行しました。
そのあと、dirコマンドでftest4.comがセーブされたことを確認しました。

●TYPEプログラムのアセンブルリスト

下はFTEST4−1.TXTをアセンブルして作成されたアセンブルリストです。

2012/2/29  21:10  ftest4-1.txt
END=8141
              ; BDOS TEST4 TYPE
              ;2012/2/28
              ;
                      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 CA2C81           JP Z,ERR
810C AF               XOR A
810D 327C80           LD (RECNO),A
              ;
8110 0E14     LOOP1:  LD C,14;read
8112 115C80           LD DE,FCB
8115 CD0580           CALL FCALL
8118 B7               OR A
8119 C0               RET NZ;read end
              ;
811A 218080           LD HL,DMA
811D 5E       LOOP2:LD E,(HL)
811E 0E02             LD C,02
8120 E5               PUSH HL
8121 CD0580           CALL FCALL
8124 E1               POP HL
8125 2C               INC L
8126 C21D81           JP NZ,LOOP2
8129 C31081           JP LOOP1
              ;
812C 113581   ERR:LD DE,ERRMSG
812F 0E09             LD C,09
8131 CD0580           CALL FCALL
8134 C9               RET
8135 63616E27 ERRMSG:"can'"
8139 74206F70         "t op"
813D 656E             "en"
813F 0D               DB 0D
8140 0A               DB 0A
8141 24               DB 24;$
              ;
DMA          =8080  ERR          =812C  ERRMSG       =8135  
FCALL        =8005  FCB          =805C  LOOP1        =8110  
LOOP2        =811D  RECNO        =807C

プログラムの先頭のところで、ファイルオープンをしています。
Cレジスタに0FHを入れて、DEレジスタにはFCBエリアのアドレス(805CH)を入れてから、システムをコールしています。
FCBについては[第45回]で説明をしました。

DEレジスタには、開こうとするファイル名情報を置いたメモリエリアのアドレスをセットします。それがなぜFCBエリアなのか、ということについて、[第45回]で説明をしたのですが、説明例が不適切でした。

そこでもう一度テストをして、確認をしてみます。
[第45回]でしたのと同じように、何もしないでCP/Mに戻ってくるプログラムTEST.COMを下のようにパラメータ c:abc.txt をつけて実行してみました。
そしてその後ZB3BASICに戻って、DMコマンドで8000H〜80FFHの内容を表示しました。



805CH〜がデフォルトのFCBエリアです(本来は005CH〜)。
そこにはパラメータとして入力したABC.TXTが書き込まれています。
先頭の03はCドライブを示しています。

このようにCP/Mシステムによって、パラメータのファイル名部分が、デフォルトのFCBエリアに書き込まれるので、今回のように、パラメータとしてファイル名を指定して、そのファイルをオープンする、というようなプログラムでは、そのままデフォルトのFCBアドレスを指定するだけで、ファイル名情報をBDOSに伝えることができるのです。

なおパラメータはそのままのレイアウトでアドレス8080H〜のデフォルトのDMAエリアにも入れられます。
ファイル名以外のパラメータはここを見ることで知ることができます。
先頭に置かれた0Aは、入力されたパラメータの文字数を示しています。

ファンクションコール0FHは、ファイルオープンに失敗すると、AレジスタにFFHを入れてリターンします。

ところで、ファンクションコール14H(=20)のファイルリード(シーケンシャルリード)もファイルオープンと同じように、Cレジスタに14Hを入れ、DEレジスタにFCBアドレスを入れて、システムをコールしています。
ファイルオープンのためのシステムコール時点ではFCBエリアにはファイル名しか書かれていませんが、ファイルオープンに成功すると、FCBエリアにはディレクトリにある、そのファイルのFCBデータが読み込まれます。
ファイルリードでは、ファイルオープンによって読み込まれたFCBの情報をもとにして、データの置かれているセクタを算出して、セクタリードを行ないます。
ファイルリードでもファイルオープンと同じFCBアドレスを指定しているのは、その理由からです。

説明の途中ですが、本日も時間がなくなってしまいました。
この続きは次回にいたします。

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

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