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

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

[第79回]


●ファンクションコール06(ダイレクトコンソール入出力)

今回はファンクションコール06について説明をいたします。
ダイレクトコンソール入出力です。

コンソール入力には、ファンクションコール01があります。
またコンソール出力には、ファンクションコール02があります。
それに対して、ファンクションコール06は入力にも出力にも使えます。

Cレジスタに06をセットして、EレジスタにFFをセットしてシステムをコールすると、コンソール入力になり、キー入力があるときには、その入力コードがAレジスタに入ってリターンします。
同じくCレジスタに06をセットして、Eレジスタに文字コードをセットしてシステムをコールすると、その文字がコンソール出力されます。

ファンクションコール06の入力、出力の機能は、ファンクションコール01、02とちょっと異なっているところがあります。

ファンクションコール01ではコンソール入力があるまでリターンしてきませんが、ファンクションコール06の入力モードでは、コンソール入力がない場合にはAレジスタに00が入って、すぐにリターンしてきます。

ファンクションコール02では、コンソール出力時にコンソール入力のチェックを行なっていて、Ctrl−Sが入力されるとポーズしてコンソール入力を待ちますが、ファンクションコール06の出力モードではCtrl−Sのチェックは行なわれません。

入力も出力もそれぞれBIOSのコンソール入力、コンソール出力ルーチンをほとんどダイレクトにコールしています。

テストプログラムFNC06T2.TXTです。

; BDOS function06 test
;2012/3/31
;
        ORG $8100
        FCALL=$8005
;
LOOP:LD C,06
        LD E,FF
        CALL FCALL
        PUSH AF
        CALL B2HEXDP
        POP AF
        OR A
        JP NZ,AOUT
NEXT:CALL SPDP
        JP LOOP
AOUT:PUSH AF
        LD C,06
        LD E,A
        CALL FCALL
        POP AF
        CP 1A;^z
        RET Z
        JP NEXT
;

表示のためのサブルーチンは今まで作ったテストプログラムと同じですから、省略してあります。

こちらはFNC06T2.TXTをZASM.COMでアセンブルした結果作成されたアセンブルリストです。

2012/3/31  17:50  fnc06t2.txt
END=8187
              ; BDOS function06 test
              ;2012/3/31
              ;
                ORG $8100
                FCALL=$8005
              ;
8100 0E06     LOOP:LD C,06
8102 1EFF       LD E,FF
8104 CD0580     CALL FCALL
8107 F5         PUSH AF
8108 CD4C81     CALL B2HEXDP
810B F1         POP AF
810C B7         OR A
810D C21681     JP NZ,AOUT
8110 CD2E81   NEXT:CALL SPDP
8113 C30081     JP LOOP
8116 F5       AOUT:PUSH AF
8117 0E06       LD C,06
8119 5F         LD E,A
811A CD0580     CALL FCALL
811D F1         POP AF
811E FE1A       CP 1A;^z
8120 C8         RET Z
8121 C31081     JP NEXT
              ;

いつものようにログファイルで説明をします。
ZB3BASICを起動して、FNC06T2.BINをロードしたあと、JP D233[Enter]でCP/Mを起動しました。
SAVE 1 FNC06T2.COM[Enter]と入力して、FNC06T2.COMという名前でテストプログラムをRAMディスクにセーブしたあと、FNC06T2[Enter]で、テストプログラムを実行しました。

logfile nd80zlog\03311753.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld fnc06t2.bin,8100
loading FNC06T2.BIN ...0088(136)bytes loaded,from 8100 to 8187
>jp d233

a>save 1 fnc06t2.com
a>fnc06t2
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 61a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61a 00 00 00 00 61a 0
0 00 00 00 00 00 00 00 00 00 61a 00 00 00 00 00 00 00 00 00 61a 00 00 00 00 00 0
0 61a 00 00 00 00 00 00 00 61a 00 00 61a 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0
0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62b 00 00 00 00 00 00 00
 00 00 00 00 00 00 62b 00 00 00 00 00 00 00 00 62b 00 00 00 00 62b 00 00 00 00 6
2b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 62b 00 00 00 00 62b 00 00 62b 00 00 00 00 00 00 00 62b 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 63c 00 00 00 00 63c 00 00 00 00 00 00 00 00 00 63c 00 00 00 00 00 00 00 00 0
0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63c 00 00 00 00 63c 00 00 6
3c 00 00 00 00 63c 00 00 00 00 00 00 00 00 00 00 00 63c 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0
0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 00 00 13 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0
0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0
0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 1A
a>a
A?

a>

テストプロラムを実行すると、システムコール06が実行されて、コンソールステータスのチェック結果が表示されます。
コンソール入力が無いときは00が表示されます。
コンソール入力があるときには、その入力された文字コードを16進表示したあと、ファンクションコール06の出力モードで、その文字をコンソール出力します。

上のログファイルを見ていただきますと、a(コード61)、b(62)、c(63)と入力している様子がわかります。
そのあと[Ctrl][S]を入力してみましたが、ポーズはされませんでした。
13と表示されているところです。
13HはCtrl−Sの文字コードです。

実は16進表示を行なっているサブルーチンではファンクションコール02(コンソール出力)を使っていて、そこではCtrl−Sのチェックを行なっていますから、繰り返し[Ctrl][S]を入力すれば、受け付けられる可能性があります。
ところがWindowsではオートリピート(キーを長押しすると、そのキーが繰り返し入力されたようになります)が働きますから、Ctrl−Sで一旦停止してもすぐに解除されてしまいます。
Ctrl−SとCtrl−D(本来はCtrl−C)によるシステムブレイクは、ちょっと難しいところがあります。

ここでは、最後に[Ctrl][z]を入力してブレイクしました。

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

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