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

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

[第41回]

●Hello World(ファンクションコール9)

今回もファンクションコールを使ったテストプログラムの説明です。
前回説明しましたファンクションコール2は、コンソール画面に文字を1文字表示するものでしたが、それだとひとまとまりの文章を表示するときなど、その文を先頭から1文字ずつ取り出しながら、文字数の回数分繰り返しファンクションコールしなければなりません。
できないことはありませんが、面倒です。

そんなときは、ファンクションコール9を使うと、1回のコールで済んでしまいます。
表示させたい文字列の最後には文字列の終わりを示すマークとして”$”を置きます。
DEレジスタに文字列の先頭アドレスを入れて、Cレジスタに09を入れて、システムをコールすると、指定したアドレスから”$”の前までの文字コードで示される文字列がコンソール画面に表示されます。

ファンクションコールは0005Hをコールしますが、今はまだテスト中なので8005Hをコールするようにしてあります。

これがテストプログラムです。

; BDOS function 9 test
;
     ORG $8100
     FCALL=$8005
;
	LD DE,LIST
	LD C,09
	CALL FCALL
	RET
;
LIST:"Hell"
	"o Wo"
	"rld"
	DB 24;$"
;

今回は、たったこれだけの短いプログラムです。
このプログラムを実行すると画面に”Hello World”と表示されます。
文字データはASCIIコードで書きますから、本来は1バイトずつDB命令で表記します。
ND80ZVに附属のZ80アセンブラは文字をASCIIコードに置き換える機能がありますから、文字列を””で挟んで書くだけで、ASCIIコードに変換できます。

ただ、この機能は「とりあえず」追加した機能なので、一度に4バイトしか変換できません。
ですから、上のリストのように、ちょっとみっともない書き方になってしまいます。
まあ、でも、一文字ずつASCIIコードに置き換えて書くことを思えば、相当楽だと思います(いずれ改良したいと思ってはおります)。

下は、上のソースリストをND80ZVに附属の中日電工製のZ80アセンブラzasm.comでアセンブルして作成されたアセンブルリストです。
CP/Mソースをアセンブルするのに使った、zasm1.64を使うと、一部文法表現が異なっているため、エラーになってしまいます。

2012/2/22  21:40  ftest2.txt
END=8114
              ; BDOS function 9 test
              ;
                   ORG $8100
                   FCALL=$8005
              ;
8100 110981   	LD DE,LIST
8103 0E09     	LD C,09
8105 CD0580   	CALL FCALL
8108 C9       	RET
              ;
8109 48656C6C LIST:"Hell"
810D 6F20576F 	"o Wo"
8111 726C64   	"rld"
8114 24       	DB 24;$"
              ;
              
FCALL        =8005  LIST         =8109


●実際の実行画面です

下の画面では、まずftest2.txtをアセンブルしています。


ftest2.binが作成されました。
そのあと、zb3[Enter]と入力して、ND80ZVとのUSB接続に成功しました。
ここで”z”を入力すると、ZB3BASICが起動します。

”z”を入力してZB3BASICが起動したあとの画面です。



ZB3BASICが起動したあと、/LDコマンドでftest2.binを8100Hにロードしています。

そのあと、JP D233[Enter]でCP/Mが起動しました。

DIR[Enter]の入力で、ディレクトリを表示させています。

前回も書きましたように、ND80ZVのRAM(アドレス8000〜FFFF)は、バッテリバックアップされていますから、この画面のように、前日のRAMディスクの状態をそのまま保持しています。
しかし、プログラムミスなどで暴走するとRAMディスクの中身が破損してしまいますから、ハードディスクに保存しておいた方が安全です(今回はその作業も行ないます)。

8100Hにロードしたプログラムをftest2.comという名前でRAMディスクにSAVEします。
またキー入力ミスをしてしまいました。
ZB3BASICのSAVEコマンドでは、ファイル名を最初に書くルールにしているため、つい間違えてしまいます。
訂正は[Back Space]キーを使いますが、ND80ZVのZB3BASICシステムのキー入力処理との関係で、[Back Space]キーを押す度に、下に再表示されます。

DIR[Enter]と入力して、ftest2.comが保存されたことを確認しています。

そのあと、ftest2[Enter]と入力して、プログラムを実行しました。
Hello World
と表示されました。

●RAMディスクのバックアップ

今は仮のシステムなので、ND80ZV上のRAMの8800H〜B7FFHを、そのままRAMディスクとして利用しています。
ただのメモリデータですから、その範囲のデータを名前をつけて保存すれば、バックアップしたことになります。
ND80ZV上にあるメモリのデータをアドレスを指定して保存するには/SVコマンドを使います(そのようにして保存したファイルからデータを指定アドレスにロードするには/LDコマンドを使います)。

さきほどのCP/Mを実行している画面の最後のところで、/SVコマンドを使って、RAMディスクのバックアップをしています。
/SVコマンドはZB3BASICの機能ですから、[Ctrl][D]でCP/Mを終了してZB3BASICに戻ってから、実行します。
[Ctrl][D]を入力すると、>が表示されます。
ここで[Enter]を入力するとERRが表示されますが、その後は普通にZB3BASICのコマンドを使うことができます。

/SVコマンドは画面にあるように、ファイル名に続けて、先頭アドレス、終了アドレスを指定します。
このように、ZB3BASICの「マシン語デバッガー」の機能も使うことができますから、とっても便利です。

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

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