復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第68回]
●ファンクションコール0BH(コンソールステータスチェック)
ファンクションコール0BHはコンソールのステータスをチェックしてキー入力があったかどうかを調べます。
キー入力があればAレジスタに01を入力するとともに、1バイトのキャラクタバッファに、入力されたキーコードを入力してリターンします。
キー入力がなければ、Aレジスタに00を入れてリターンします。
村瀬康治著「応用CP/M」(アスキー出版局)には記述ミスがあります。
同書50ページにファンクションコールを一覧表形式でまとめてありますが、その中のファンクションコール11(0BH)の説明では、「入力ありのときA←FF」とありますが、A←FFではなくて、A←01です。
キャラクタバッファに入れられたキーコードは、ファンクションコール01を実行すると、そのときにAレジスタに入れられます。
実はファンクションコール01は、最初にキャラクタバッファを調べて、そこにキー入力された文字コードが入れられていたら、実際にコンソールにはアクセスしないで、そのキャラクタバッファのキー入力コードをAレジスタに入れてリターンする仕組みになっているのです。
なぜこんな面倒な仕組みにしているのか、ということなのですが、ファンクションコール01だけだと、キー入力があるまで待っていてリターンしてきませんから、プログラムがそこで止まってしまいます。
それでは困る場合もあることを考えて、この仕組みがあるのでは、と思います。
ファンクションコール0BHとファンクションコール01を組み合わせることで、BASICのINKEY$のような機能になります。
しかし、その用途にはダイレクトコンソール入出力(ファンクションコール06)がありますから、そちらを使ったほうが簡単なのに、と思ってしまいます。
ファンクションコール0BHは、ただキー入力の有無をチェックするだけにも使える(それに何の意味があるか疑問ですが)、とも思えるのですが、上で説明しましたように、ただキー入力の有無をチェックするだけではなくて、キー入力があったときには、あらためてコンソール入力を行ない、実際にキー入力コードをキャラクタバッファに入力してしまいます。
このキャラクタバッファに入れられた文字コードはファンクションコール01を実行するまで、そこに残ります。
もしファンクションコール01を実行しないままプログラムを終了すると、プロンプトマーク(>)が表示された直後に、そのコードがコマンドの一部として読み込まれて表示されてしまいます。
ちょいと面倒で厄介なファンクションコールです。
まあ、でも、一通りはファンクションコールについて検証をするつもりで作業をしておりますので、今回はファンクションコール0Bについて、テストをしてみることにしたのですが…。
やっぱりちょいと厄介なファンクションコールでした。
テストプログラムのソースリストです。
; BDOS function0B test ;2012/3/22 ; ORG $8100 FCALL=$8005 CHARBUF=$C70E ; LOOP:LD C,0B CALL FCALL PUSH AF CALL B2HEXDP LD A,(CHARBUF) CP 1A;^Z RET Z CALL B2HEXDP POP AF OR A JP NZ,KEYIN NEXT:CALL SPDP JP LOOP KEYIN:LD C,01 CALL FCALL CALL ADP JP NEXT ; ;CL & LF CRLF:LD A,0D CALL ADP LD A,0A JP ADP ;space disp SPDP:LD A,20 ;A disp ADP:PUSH BC PUSH HL LD E,A LD C,02 CALL FCALL POP HL POP BC RET ;HL(bynary 2bytes) to asckii 4bytes & disp HEX4DP:PUSH BC PUSH HL CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes PUSH DE EX DE,HL CALL DEDP POP DE CALL DEDP POP HL POP BC RET ;A(binary) to asckii 2bytes HEX & disp B2HEXDP:PUSH BC PUSH HL CALL B2HEX2 CALL DEDP POP HL POP BC RET ; ;DE(asckii 2bytes) disp DEDP:PUSH DE LD E,D LD C,02 CALL FCALL POP DE LD C,02 CALL FCALL RET ; ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE B2HEX4:LD A,H CALL B2HEX2 EX DE,HL LD A,E ;binary to hex, 1byte data to ascii 2charactors,A to DE B2HEX2:PUSH AF RRCA RRCA RRCA RRCA CALL B2HEX1 LD D,A POP AF CALL B2HEX1 LD E,A RET ;binary to hex, low 4bit to ascii 1charactor B2HEX1:AND 0F ADD A,30 CP 3A RET C;0-9 ADD A,07;A-F RET ; STRIN:"in" DB 3A;: DB 24;$ ; |
2012/3/22 20:45 fnc0bt1.txt END=818B ; BDOS function0B test ;2012/3/22 ; ORG $8100 FCALL=$8005 CHARBUF=$C70E ; 8100 0E0B LOOP:LD C,0B 8102 CD0580 CALL FCALL 8105 F5 PUSH AF 8106 CD5081 CALL B2HEXDP 8109 3A0EC7 LD A,(CHARBUF) 810C FE1A CP 1A;^Z 810E C8 RET Z 810F CD5081 CALL B2HEXDP 8112 F1 POP AF 8113 B7 OR A 8114 C21D81 JP NZ,KEYIN 8117 CD3281 NEXT:CALL SPDP 811A C30081 JP LOOP 811D 0E01 KEYIN:LD C,01 811F CD0580 CALL FCALL 8122 CD3481 CALL ADP 8125 C31781 JP NEXT ; ;CL & LF 8128 3E0D CRLF:LD A,0D 812A CD3481 CALL ADP 812D 3E0A LD A,0A 812F C33481 JP ADP ;space disp 8132 3E20 SPDP:LD A,20 ;A disp 8134 C5 ADP:PUSH BC 8135 E5 PUSH HL 8136 5F LD E,A 8137 0E02 LD C,02 8139 CD0580 CALL FCALL 813C E1 POP HL 813D C1 POP BC 813E C9 RET ;HL(bynary 2bytes) to asckii 4bytes & disp 813F C5 HEX4DP:PUSH BC 8140 E5 PUSH HL 8141 CD6981 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes 8144 D5 PUSH DE 8145 EB EX DE,HL 8146 CD5B81 CALL DEDP 8149 D1 POP DE 814A CD5B81 CALL DEDP 814D E1 POP HL 814E C1 POP BC 814F C9 RET ;A(binary) to asckii 2bytes HEX & disp 8150 C5 B2HEXDP:PUSH BC 8151 E5 PUSH HL 8152 CD6F81 CALL B2HEX2 8155 CD5B81 CALL DEDP 8158 E1 POP HL 8159 C1 POP BC 815A C9 RET ; ;DE(asckii 2bytes) disp 815B D5 DEDP:PUSH DE 815C 5A LD E,D 815D 0E02 LD C,02 815F CD0580 CALL FCALL 8162 D1 POP DE 8163 0E02 LD C,02 8165 CD0580 CALL FCALL 8168 C9 RET ; ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE 8169 7C B2HEX4:LD A,H 816A CD6F81 CALL B2HEX2 816D EB EX DE,HL 816E 7B LD A,E ;binary to hex, 1byte data to ascii 2charactors,A to DE 816F F5 B2HEX2:PUSH AF 8170 0F RRCA 8171 0F RRCA 8172 0F RRCA 8173 0F RRCA 8174 CD7E81 CALL B2HEX1 8177 57 LD D,A 8178 F1 POP AF 8179 CD7E81 CALL B2HEX1 817C 5F LD E,A 817D C9 RET ;binary to hex, low 4bit to ascii 1charactor 817E E60F B2HEX1:AND 0F 8180 C630 ADD A,30 8182 FE3A CP 3A 8184 D8 RET C;0-9 8185 C607 ADD A,07;A-F 8187 C9 RET ; 8188 696E STRIN:"in" 818A 3A DB 3A;: 818B 24 DB 24;$ ; ADP =8134 B2HEX1 =817E B2HEX2 =816F B2HEX4 =8169 B2HEXDP =8150 CHARBUF =C70E CRLF =8128 DEDP =815B FCALL =8005 HEX4DP =813F KEYIN =811D LOOP =8100 NEXT =8117 SPDP =8132 STRIN =8188 |
>/ld fnc0bt1.bin,8100 loading FNC0BT1.BIN ...008c(140)bytes loaded,from 8100 to 818B >jp d233 a>save 1 fnc0bt1.com a>dir A: FNC0BTST COM : FNC0BT2 COM : FNC0BT3 COM : FNC0BT4 COM A: FNC0BT1 COM a>fnc0bt1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0061 0161aa 0000 000 0 0161aa 0000 0161aa 0000 0000 0000 0161aa 0000 0000 0061 0161aa 0000 0000 0000 0061 0161aa 0161aa 0000 0061 0161aa 0000 0000 0161aa 0000 0161aa 0000 0161aa 000 0 0000 0000 0161aa 0000 0000 0000 0161aa 0000 0161aa 0000 0161aa 0000 0161aa 000 0 0161aa 0000 0161aa 0000 0000 0000 0000 0161aa 0000 0000 0000 0161aa 0000 0000 0161aa 0000 0062 0162bb 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0 000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0 000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0 000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0 000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |