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

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

[第40回]

●参考書を送っていただきました

Amazonから技術参考書が届きました。
ですけれど、注文した覚えはありません。
誤配ではないようです。
ちゃんと宛名は中日電工の私あてになっています。

どなたかが私宛てということで、ご注文いただいたようです。
あの。
ひとことお礼を申し上げたいと思いますので、ぜひメールをいただけませんでしょうか。

書名はここでは書きませんが、いずれやらなきゃならないだろうなあ、と思っておりましたものの参考書です。

まあ、お送りいただいた理由は、いろいろ考えられるのでありますけれど。
これでも読んでちっとは勉強しなさいよ、というお叱りとも取れますし。
これを読んで、こういうものをぜひ作ってくださいよ、ということかも知れません。

今は、とにかくCP/Mにかかりっきりですので、これが片付きましたら、いずれその方面にも挑戦したいと思っております。
いずれはやりたいと思っておりますので、気長にお待ちいただきますよう、お願いいたします。

まずは当ページにてひとことお礼申し上げます。
有難うございました。
今後ともご支援をたまわりますようお願いいたします。

●ファンクションコール1および2を使ったプログラム

前回は、ファンクションコール1とファンクションコール2を使ったテストプログラムのリストをお見せしたところで終わってしまいました。
ファンクションコール1と2については、前回説明しましたが、もう一度下に書いておくことにします。

ファンクションコール 1 は、コンソール入力です。

コンソールというのはキーボードとディスプレイを備えた端末装置ですが、ND80ZVにインストールするCP/Mシステムでは、コンソールはND80ZVとUSB接続したWindowsパソコンのキーボードとDOSプロンプト画面になります。

Cレジスタに01をセットしてシステムをコールすると、キー入力した文字コードがAレジスタに入ってリターンします。
同時に画面にエコー表示が行なわれます。
実際にキー入力されるまでリターンせずに待っています。

ファンクションコール 2 は、コンソール出力です。
Eレジスタに出力したい文字コードをセットして、Cレジスタに02をセットしてシステムをコールすると、画面にその文字が表示されます。

前回はソースプログラムをお見せしましたから、今回はアセンブルリストをお見せすることにします。
ND80ZVに附属の中日電工製のZ80アセンブラzasm.comでアセンブルします。
CP/Mソースをアセンブルするのに使った、zasm1.64を使うと、一部文法表現が異なっているため、エラーになってしまいます。

2012/2/20  22:28  ftest1.txt
END=814C
              ; BDOS function 1 & 2 test
              ;
                   ORG $8100
                   FCALL=$8005
              ;
8100 1E3F     LOOP:LD E,3F;?
8102 0E02       LD C,02
8104 CD0580     CALL FCALL          
8107 0E01       LD C,01
8109 CD0580     CALL FCALL
810C FE1A       CP 1A;^z?
810E C8         RET Z
810F F5         PUSH AF
8110 1E3D       LD E,3D;=
8112 0E02       LD C,02
8114 CD0580     CALL FCALL
8117 F1         POP AF
8118 57         LD D,A
8119 CD4381     CALL HEX1
811C 5F         LD E,A
811D 7A         LD A,D
811E 0F         RRCA
811F 0F         RRCA
8120 0F         RRCA
8121 0F         RRCA
8122 CD4381     CALL HEX1
8125 D5         PUSH DE
8126 5F         LD E,A
8127 0E02       LD C,02
8129 CD0580     CALL FCALL
812C D1         POP DE
812D 0E02       LD C,02
812F CD0580     CALL FCALL
8132 1E0D       LD E,0D
8134 0E02       LD C,02
8136 CD0580     CALL FCALL
8139 1E0A       LD E,0A
813B 0E02       LD C,02
813D CD0580     CALL FCALL
8140 C30081     JP LOOP
8143 E60F     HEX1:AND 0F
8145 C630       ADD A,30
8147 FE3A       CP 3A
8149 D8         RET C;0-9
814A C607       ADD A,07;A-F
814C C9         RET     
              ;
              
FCALL        =8005  HEX1         =8143  LOOP         =8100  

このプログラムを実行すると ? が表示されます。
何かキーを押して1文字入力すると、その文字の16進コードを表示します。

最初に”?”を表示するために、Eレジスタに”?”の文字コード3Fを入れて、Cレジスタに02を入れて、システムをコールします。
次にCレジスタに01を入れてシステムをコールします。
ここでキー入力すると、そのキーのコードがAレジスタに入ってシステムからリターンしてきます。

[2012.2.22注記]
当記事をお読みいただいた方から、下記説明文中”1F”は”1A”の間違いでは?とのご指摘をいただきました。
ご指摘いただいた通りです。
うっかり間違えてしまい、ご指摘いただくまで全く気が付きませんでした。
さっそく訂正させていただきました。
(下記文章は訂正済みです)
TM様、ご指摘いただき有難うございました。
今後ともよろしくお願いいたします。
[注記ここまで]

入力されたコードが”1A”だったら、プログラムを終了してCP/Mに戻ります(CP/Mに戻るには、RETを実行します)。
1Aは[Ctrl][z]です。
[Ctrl][a]〜[Ctrl][z]のコードは01〜1Aです。

ここでは、[Ctrl][z]を入力したら、プログラムを終了してシステムに戻るようにしていますが、[Ctrl][z]を使わなければならない、ということではありません。
これはひとつの参考例ですから、もっと自由に考えても構いません。

さて、入力された文字コードが1A以外のときは、まず”=”を表示します。
”=”の文字コードは3Dです。
ここでファンクションコールの前後でPUSH AF、POP AFを実行して、入力された文字コードが入っているAレジスタをスタックに退避しています。
ファンクションコールは、システム内で全レジスタを使いますから、使用中のレジスタは必ずスタックに退避しておく必要があります。

1バイトのコードを16進数で表記すると、0〜Fを2桁使って表示します。
ここではサブルーチンHEX1を使って、Aレジスタの下位4ビットを1桁の16進数に変換します。
0〜Fは30〜39、41〜46のASCIIコードで表されます。
上位4ビットは、ひとまずDレジスタにコピーして残しておきます。

CALL HEX1で下位4ビットを16進数のASCIIコード1文字に変換して、結果を表示するためにEレジスタにコピーします。
しかしこれは下位桁ですから、後で表示します。
次に上位桁を16進数の文字コードに変換します。
DレジスタにコピーしておいたデータをAレジスタに戻し、上位4ビットを下位4ビットに移動します。
それからCALL HEX1を実行します。

下位桁の文字コードを入れたEレジスタを保存するためにPUSH DEを実行してから、Eレジスタに上位桁の文字コードを入れます。
ファンクションコール2を実行すると、上位桁の16進数が表示されます。
続いてPOP DEを実行してEレジスタをもとに戻してから(Eレジスタには下位桁の16進数の文字コードが入っている)、ファンクションコール2を実行すると、下位桁の16進数が表示されます。

そのあと0Dを、続いて0Aを表示することで、改行が行なわれます。
以上を繰り返し行なうために、プログラムの先頭に戻ります。

●実際の実行画面です

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



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

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



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

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

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

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

8100Hにロードしたプログラムをftest1.comという名前でRAMディスクにSAVEします。
キー入力ミスをしてしまいました。
訂正は[Back Space]キーを使いますが、ND80ZVのZB3BASICシステムのキー入力処理との関係で、[Back Space]キーを押す度に、下に再表示されます。

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

そのあと、ftest1[Enter]と入力して、プログラムを実行しました。
キーを押すごとに、その文字コードの16進数が表示されています。

下の画面は、続いて[Ctrl][f] [Ctrl][g] … と入力してみたところです。



[Ctrl][f]の文字コードは06、 [Ctrl][g]は07です。
ファンクションコール1では、コード20よりも前のキー入力では、08(BS)、09(TAB)、0A(LF)、0D(CR)、以外は、エコー表示されません。
ですから”?”の後にすぐ”=”が表示されています。

[Ctrl][e]よりも前のコードはZB3BASICで使っていますから、入力すると、いきなりシステムが終了してしまったりします。
[Ctrl][f]から後を入力しているのはそういう理由からです。

[Ctrl][i](コード09)はTABコードと同じです。
TABが実行されています。

[Ctrl][m](コード0D)は、キャリッジリターンコードと同じなので、カーソルが行の先頭に戻ります(その結果”?”が消えています)。
[Enter]も0Dコードを送りますから、同じ表示になります。

画面には表示されていませんが、画面の下から2行目で、[Ctrl][z]を入力しました。
その結果、CP/Mにリターンして、a>が表示されました。

●いろいろなキーを入力してみました

[insert]や[Delete]などの、いろいろなキーを入力してみました。



カナ文字が表示されているのは、[insert]や[Delete]や[←][↑]などのキーコードが、カナ文字のコードと同じためです。

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

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