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

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

[第64回]

●ファンクションコール0A(コンソールバッファ入力)

コンソール入力としてはファンクションコール01があります([第39回])。
ファンクションコール01はコンソールから1バイト(1文字)を入力します。
これに対して今回のファンクションコール0Aは、指定した文字数の入力があるか、または[Enter]が押されるまで、入力された文字を指定したバッファに入力します。
入力途中の[BackSpace]も有効です。
ただし[Enter]の文字コードはバッファには入れられません。

ファンクションコール0Aを使ったテストプログラムです。
ソースプログラムリストです。

; BDOS TEST9 console buffer read
;2012/3/16
;
        ORG $8100
        FCALL=$8005
        CONBF=$8200
        CONBF1=$8201
;
        LD A,14;=20
        LD (CONBF),A
LOOP:LD DE,STRIN
        LD C,09;string out
        CALL FCALL
        LD DE,CONBF
        LD C,0A;console buffer in
        CALL FCALL
        CALL CRLF
        LD HL,CONBF1
        LD B,(HL)
        INC HL
        INC B
LOOP1:DEC B
        JP Z,BFDMP
        LD A,(HL)
        CALL ADP
        INC HL
        JP LOOP1
BFDMP:CALL CRLF
        LD HL,CONBF
        LD B,17;=23
BFDMP1:LD A,(HL)
        CALL B2HEXDP
        CALL SPDP
        INC HL
        DEC B
        JP NZ,BFDMP1
        CALL CRLF
        JP LOOP
;
;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/16  18:4  ftst9.txt
END=81A7
              ; BDOS TEST9 console buffer read
              ;2012/3/16
              ;
                ORG $8100
                FCALL=$8005
                CONBF=$8200
                CONBF1=$8201
              ;
8100 3E14       LD A,14;=20
8102 320082     LD (CONBF),A
8105 11A481   LOOP:LD DE,STRIN
8108 0E09       LD C,09;string out
810A CD0580     CALL FCALL
810D 110082     LD DE,CONBF
8110 0E0A       LD C,0A;console buffer in
8112 CD0580     CALL FCALL
8115 CD4481     CALL CRLF
8118 210182     LD HL,CONBF1
811B 46         LD B,(HL)
811C 23         INC HL
811D 04         INC B
811E 05       LOOP1:DEC B
811F CA2A81     JP Z,BFDMP
8122 7E         LD A,(HL)
8123 CD5081     CALL ADP
8126 23         INC HL
8127 C31E81     JP LOOP1
812A CD4481   BFDMP:CALL CRLF
812D 210082     LD HL,CONBF
8130 0617       LD B,17;=23
8132 7E       BFDMP1:LD A,(HL)
8133 CD6C81     CALL B2HEXDP
8136 CD4E81     CALL SPDP
8139 23         INC HL
813A 05         DEC B
813B C23281     JP NZ,BFDMP1
813E CD4481     CALL CRLF
8141 C30581     JP LOOP
              ;
              ;CL & LF
8144 3E0D     CRLF:LD A,0D
8146 CD5081     CALL ADP
8149 3E0A       LD A,0A
814B C35081     JP ADP
              ;space disp
814E 3E20     SPDP:LD A,20
              ;A disp
8150 C5       ADP:PUSH BC
8151 E5         PUSH HL
8152 5F         LD E,A
8153 0E02       LD C,02
8155 CD0580     CALL FCALL
8158 E1         POP HL
8159 C1         POP BC
815A C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
815B C5       HEX4DP:PUSH BC
815C E5         PUSH HL
815D CD8581     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
8160 D5         PUSH DE
8161 EB         EX DE,HL
8162 CD7781     CALL DEDP
8165 D1         POP DE
8166 CD7781     CALL DEDP
8169 E1         POP HL
816A C1         POP BC
816B C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
816C C5       B2HEXDP:PUSH BC
816D E5         PUSH HL
816E CD8B81     CALL B2HEX2
8171 CD7781     CALL DEDP
8174 E1         POP HL
8175 C1         POP BC
8176 C9         RET
              ;
              ;DE(asckii 2bytes) disp
8177 D5       DEDP:PUSH DE
8178 5A         LD E,D
8179 0E02       LD C,02
817B CD0580     CALL FCALL
817E D1         POP DE
817F 0E02       LD C,02
8181 CD0580     CALL FCALL
8184 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
8185 7C       B2HEX4:LD A,H
8186 CD8B81     CALL B2HEX2
8189 EB         EX DE,HL
818A 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
818B F5       B2HEX2:PUSH AF
818C 0F         RRCA
818D 0F         RRCA
818E 0F         RRCA
818F 0F         RRCA
8190 CD9A81     CALL B2HEX1
8193 57         LD D,A
8194 F1         POP AF
8195 CD9A81     CALL B2HEX1
8198 5F         LD E,A
8199 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
819A E60F     B2HEX1:AND 0F
819C C630       ADD A,30
819E FE3A       CP 3A
81A0 D8         RET C;0-9
81A1 C607       ADD A,07;A-F
81A3 C9         RET
              ;
81A4 696E     STRIN:"in"
81A6 3A         DB 3A;:
81A7 24               DB 24;$
              ;
ADP          =8150  B2HEX1       =819A  B2HEX2       =818B  
B2HEX4       =8185  B2HEXDP      =816C  BFDMP        =812A  
BFDMP1       =8132  CONBF        =8200  CONBF1       =8201  
CRLF         =8144  DEDP         =8177  FCALL        =8005  
HEX4DP       =815B  LOOP         =8105  LOOP1        =811E  
SPDP         =814E  STRIN        =81A4  

●プログラムの説明

入力バッファはトランジェントエリアの中ならどこにでも置けます。
今回はプログラムの少し後(8200H)に置きました。
入力バッファのサイズは最大256バイトですが、今回はテストですから20バイト(14H)にしました。
(2012.5.24訂正。バッファの最大サイズは255バイトです)
バッファの先頭アドレスにバッファのサイズを入れておきます。
その次のアドレスには、入力された文字数が入れられます。
実際の入力バッファはその次のアドレスからです。

プログラムでは、最初に in: と表示したあと、バッファへのキー入力を待ちます。
[Enter]が入力されるか、バッファサイズと同じ文字数(ここでは20文字)が入力されるとファンクションコールからリターンしてきます。
バッファ先頭から2番目のアドレス(ここでは8201H)に入力された文字数が入ります。
それをカウンタにして、入力バッファの中味を表示します。
そのあと、バッファの先頭からバッファの終わり+1バイトの内容を16進数で表示します。
ここで+1バイトとしたのは、バッファの終わりの次のアドレスの値は変わらないことを確認するためです。

今回のプログラムも前回のプログラムと同様に、結果を表示するのに、[第42回]で作ったメモリダンププログラムのサブルーチンをそのまま利用しています。

●FTST9.TXTのアセンブル画面です

FTST9.TXTをZASM.COMでアセンブルしたあと、ZB3[Enter]でND80ZVとUSB接続しました。



この後はいつものように、ログファイルで説明をします。

logfile nd80zlog\03161804.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst9.bin,8100
loading FTST9.BIN ...00a8(168)bytes loaded,from 8100 to 81A7
>jp d233

a>save 1 ftst9.com
a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM : FILL00   BIN : FTST7    COM
A: FTST8    COM : FTST9    COM
a>ftst9
in:abcxyz
abcxyz
14 06 61 62 63 78 79 7A 80 54 D0 14 13 8C CD 35 FA 7B 89 79 EE B7 9E 
in:123456789ABCXYZ
123456789ABCXYZ
14 0F 31 32 33 34 35 36 37 38 39 41 42 43 58 59 5A 7B 89 79 EE B7 9E 
in:12345678901234567890
12345678901234567890
14 14 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 9E 
in:abcde#
   abcd#
   abc
abc
14 03 61 62 63 64 65 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 9E 
in:^D>in:^D>
WHAT?
>dm 8200,823f
8200  14 03 04 62 63 64 65 36-37 38 39 30 31 32 33 34  ...bcde678901234
8210  35 36 37 38 39 30 9E FF-6B F5 7B 57 EE F7 E9 7F  567890..k.{W...
8220  F2 00 80 30 09 12 0B 1A-A2 0C 20 10 02 40 C1 85  ...0....「. ..@チ.
8230  BF B4 76 5E C9 EC E8 FF-F7 FB EF AD 07 CB 3C C3  ソエv^ノ......ュ.ヒ<テ
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Fri Mar 16 18:10:02 2012

/LDコマンドでFTST9.BINを8100Hにロードしました。
そのあと、
JP D233[Enter]
でCP/Mを起動しました。

SAVE 1 FTST9.COM[Enter]
と入力して、8100HからのプログラムをFTST9.COMの名前でRAMディスクに保存したあと、DIRコマンドで確認をしています。

FTST9[Enter]
で、FTST9.COMを実行しました。

最初に
abcxyz[Enter]
と入力しました。
入力した文字列abcxyzが表示されたあと、入力バッファの内容が16進数で表示されました。
先頭の14Hは入力バッファのサイズ(=20)です。
次の06は入力された文字数です。
その次から6バイトが入力された文字コード(61 62 63 78 79 7A)です。

次に
123456789abcxyz[Enter]
と入力しました。
入力した文字列123456789abcxyzが表示されたあと、入力バッファの内容が16進数で表示されました。

次は
12345678901234567890
と入力しました。
入力バッファのサイズと同じ文字数(今回のプログラムでは20字)を入力したので、[Enter]を入力しなくても、そのまま入力バッファに取り込まれました。

次は
abcde
と入力したあと、[BackSpace]を2回押しました。
そのあと[Enter]を入力しました。
abc
と表示されたあと、入力バッファの中味が16進数で表示されました。
入力バッファには入力したままの文字コード(61 62 63 64 65)が入っていますが、アドレス8201Hには入力文字数として03が入っています。

入力待ちのときにブレイクするには、[Ctrl][D](本来は[Ctrl][C])を入力します。
[Ctrl][D]の入力でCP/Mもブレイクして、ZB3BASICに戻っています。
ZB3BASICに戻ったことを確認するため、dmコマンドを実行してみました。

ワンボードマイコンでCP/Mを![第64回]
2012.3.18upload
2012.5.24訂正

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