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

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

[第78回]


●RS232C通信のテスト(ファンクションコール03及び04のテスト)

[第74回]で、ファンクションコール0BHの動作確認をするために、ファンクションコール04(パンチ出力)にRS232C送信を割り当ててテストを行ないました。
また[第76回]では、BIOSのパンチ出力としてRS232C送信を、READER入力としてRS232C受信を割り当てて、そのためのプログラムを追加しました。

RS232C送信については、[第74回]で、ファンクションコール0BHのテストプログラムの中で使いましたから、それで動作の確認はできたことになります。
しかしRS232C受信については、何もテストをしていませんから、あらためて送信と受信をあわせてテストすることにします。
[第74回]でのテストでは、RS232C送信の相手としては、最も簡単なものとして、ZBKシリーズのZB28K+RS232Cレベル変換ボードを選びました。
今回も同じ構成でテストをすることにいたします。

テストプログラムのソースプログラムリストです。
FNC0304T.TXTというファイル名でハードディスクに保存しました。

; BDOS function0304 test
;2012/3/29
;
        ORG $8100
        FCALL=$8005
        SINBF=$8300
;
;
;sousin
;
        LD HL,MSG
LOOP:LD A,(HL)
        CP 24;$
        JP Z,END
        CALL SOUT
        INC HL
        JP LOOP
END:LD DE,MSG
        LD C,09
        CALL FCALL      
;jusin
        LD HL,SINBF
        LD B,00
LOOP2:CALL SIN
        CP 05
        JP C,ERR
        CP 0A
        JP Z,MSGOUT
        LD A,B
        OR A
        JP NZ,LOOP2
;
MSGOUT:LD HL,SINBF
LOOP3:LD A,(HL)
        CALL ADP
NEXT:INC HL
        DEC B
        JP NZ,LOOP3
        RET
;
        ERR:LD DE,ERRT
        PUSH AF
        LD C,09
        CALL FCALL
        POP AF
        CALL B2HEXDP
        RET
;
SOUT:PUSH HL
        LD E,A
        LD C,04
        CALL FCALL
        POP HL
        RET
;
SIN:PUSH HL
        PUSH BC
        LD C,03
        CALL FCALL
        POP BC
        POP HL
        LD (HL),A
        INC HL
        INC B
        RET
;
MSG:"Hell"
        "o"
        DB 2C;','
        "How "
        "are "
        "you"
        DB 3F;'?'
        DB 0D
        DB 0A
        DB 24;$
;
ERRT:"ERR "
        DB 24;'$'
;
;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;$
;

こちらはZASM.COMでアセンブルして作成された、アセンブルリストです。

2012/3/30  12:39  fnc0304t.txt
END=81DD
              ; BDOS function0304 test
              ;2012/3/29
              ;
                ORG $8100
                FCALL=$8005
                SINBF=$8300
              ;
              ;
              ;sousin
              ;
8100 216081     LD HL,MSG
8103 7E       LOOP:LD A,(HL)
8104 FE24       CP 24;$
8106 CA1081     JP Z,END
8109 CD4A81     CALL SOUT
810C 23         INC HL
810D C30381     JP LOOP
8110 116081   END:LD DE,MSG
8113 0E09       LD C,09
8115 CD0580     CALL FCALL      
              ;jusin
8118 210083     LD HL,SINBF
811B 0600       LD B,00
811D CD5381   LOOP2:CALL SIN
8120 FE05       CP 05
8122 DA3C81     JP C,ERR
8125 FE0A       CP 0A
8127 CA2F81     JP Z,MSGOUT
812A 78         LD A,B
812B B7         OR A
812C C21D81     JP NZ,LOOP2
              ;
812F 210083   MSGOUT:LD HL,SINBF
8132 7E       LOOP3:LD A,(HL)
8133 CD8681     CALL ADP
8136 23       NEXT:INC HL
8137 05         DEC B
8138 C23281     JP NZ,LOOP3
813B C9         RET
              ;
813C 117581     ERR:LD DE,ERRT
813F F5         PUSH AF
8140 0E09       LD C,09
8142 CD0580     CALL FCALL
8145 F1         POP AF
8146 CDA281     CALL B2HEXDP
8149 C9         RET
              ;
814A E5       SOUT:PUSH HL
814B 5F         LD E,A
814C 0E04       LD C,04
814E CD0580     CALL FCALL
8151 E1         POP HL
8152 C9         RET
              ;
8153 E5       SIN:PUSH HL
8154 C5         PUSH BC
8155 0E03       LD C,03
8157 CD0580     CALL FCALL
815A C1         POP BC
815B E1         POP HL
815C 77         LD (HL),A
815D 23         INC HL
815E 04         INC B
815F C9         RET
              ;
8160 48656C6C MSG:"Hell"
8164 6F         "o"
8165 2C         DB 2C;','
8166 486F7720   "How "
816A 61726520   "are "
816E 796F75     "you"
8171 3F         DB 3F;'?'
8172 0D         DB 0D
8173 0A         DB 0A
8174 24         DB 24;$
              ;
8175 45525220 ERRT:"ERR "
8179 24         DB 24;'$'
              ;
              ;CL & LF
817A 3E0D     CRLF:LD A,0D
817C CD8681     CALL ADP
817F 3E0A       LD A,0A
8181 C38681     JP ADP
              ;space disp
8184 3E20     SPDP:LD A,20
              ;A disp
8186 C5       ADP:PUSH BC
8187 E5         PUSH HL
8188 5F         LD E,A
8189 0E02       LD C,02
818B CD0580     CALL FCALL
818E E1         POP HL
818F C1         POP BC
8190 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
8191 C5       HEX4DP:PUSH BC
8192 E5         PUSH HL
8193 CDBB81     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
8196 D5         PUSH DE
8197 EB         EX DE,HL
8198 CDAD81     CALL DEDP
819B D1         POP DE
819C CDAD81     CALL DEDP
819F E1         POP HL
81A0 C1         POP BC
81A1 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
81A2 C5       B2HEXDP:PUSH BC
81A3 E5         PUSH HL
81A4 CDC181     CALL B2HEX2
81A7 CDAD81     CALL DEDP
81AA E1         POP HL
81AB C1         POP BC
81AC C9         RET
              ;
              ;DE(asckii 2bytes) disp
81AD D5       DEDP:PUSH DE
81AE 5A         LD E,D
81AF 0E02       LD C,02
81B1 CD0580     CALL FCALL
81B4 D1         POP DE
81B5 0E02       LD C,02
81B7 CD0580     CALL FCALL
81BA C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
81BB 7C       B2HEX4:LD A,H
81BC CDC181     CALL B2HEX2
81BF EB         EX DE,HL
81C0 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
81C1 F5       B2HEX2:PUSH AF
81C2 0F         RRCA
81C3 0F         RRCA
81C4 0F         RRCA
81C5 0F         RRCA
81C6 CDD081     CALL B2HEX1
81C9 57         LD D,A
81CA F1         POP AF
81CB CDD081     CALL B2HEX1
81CE 5F         LD E,A
81CF C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
81D0 E60F     B2HEX1:AND 0F
81D2 C630       ADD A,30
81D4 FE3A       CP 3A
81D6 D8         RET C;0-9
81D7 C607       ADD A,07;A-F
81D9 C9         RET
              ;
81DA 696E     STRIN:"in"
81DC 3A         DB 3A;:
81DD 24               DB 24;$
              ;
ADP          =8186  B2HEX1       =81D0  B2HEX2       =81C1  
B2HEX4       =81BB  B2HEXDP      =81A2  CRLF         =817A  
DEDP         =81AD  END          =8110  ERR          =813C  
ERRT         =8175  FCALL        =8005  HEX4DP       =8191  
LOOP         =8103  LOOP2        =811D  LOOP3        =8132  
MSG          =8160  MSGOUT       =812F  NEXT         =8136  
SIN          =8153  SINBF        =8300  SOUT         =814A  
SPDP         =8184  STRIN        =81DA  

画面表示(コンソールOUT)のためのサブルーチンは今まで使ったものと同じです。

最初にこちらから「Hello,How are you?」という文を送信します。
そのあとは受信を待ちます。
受信は1文字ごとに行なわれますが、受信したデータは、0D0Aコードを受信するまで(実際は0Aコードのみをチェック)、トランジェントエリアに設けた受信バッファ(256バイト)に格納していきます。
0D0Aを受信するか、バッファが一杯になったとき、受信バッファの中味をコンソール出力します。
今回は送受信のテストですから、最初に送信して、次に受信したら、そこでプログラムを終了します。
実用的なプログラムでは必要に応じて、相互に複数回の送受信が行なわれるようにプログラムしなければならないと思います。

下はテストプログラムを実行した直後の画面です。



右側がND80ZVをUSB接続してCP/Mを起動しているDOSプロンプトウィンドウです。
左側はZB28Kを接続してZBKBASICを実行しているDOSプロンプトウィンドウです。

右のウィンドウでは、ND80ZVをUSB接続してZB3BASICを起動したあと、前回変更して作成したCPM22J.BINと、今回のテストプログラムFNC0304T.BINをロードしたあと、JP D233[Enter]と入力してCP/Mを起動しています。

テストプログラムFNC0304T.BINを、SAVE 1 FNC0304T.COM[Enter]でRAMディスクにセーブしました。
そのあとFNC0304T[Enter]と入力し、ファンクションコール04によって文字列を送信したあと、その文字列をファンクションコール09で画面に表示しています。
Hello,How are you?の表示です。

左のウィンドウに表示されているプログラムリストが、ZB28K側の232C受信、送信プログラムです。
READ#が受信命令、WRITE#が送信命令です。
R.(RUNコマンドの省略形)[Enter]の入力で、startと表示したあと、受信スタンバイになります。
受信した文字列Hello,How are you?が表示されています。

そのあと、CP/M側に文字列を送信して、プログラムの実行を終了します。
CP/M側(右のウィンドウ)には、受信した文字列
I’m fine.Thank you.
が表示されました。

今回はCP/Mのファンクションコール03、04のテストを簡単に行なうためにZB28K+RS232Cレベル変換ボードを使いましたが、そのほかにハイパーターミナルを使う方法やフリーのN88互換BASICを使う方法などがあります。
それらにつきましては、過去記事にて説明をしておりますので、そちらを参照願います。

ハイパーターミナルを使ったRS232C通信については、「ワンボードマイコンをつくろう![第121回]」で紹介をしています。
ただし、同記事中でも書きましたが、Windows7にはハイパーターミナルはありません。
Microsoftによりますと、どうやらハイパーターミナルにはセキュリティ上の脆弱性があるとのことで、使わないほうがよいのだそうです。

フリーのN88互換BASICについては、同じく「ワンボードマイコンをつくろう![第122回]」で紹介をしています。
なお、フリーのN88互換BASICでRS232Cを使う場合に、同上[第122回][第124回]で書きましたように、ちょっと面倒な作業やら手続きが必要になってしまうこともあるようです。

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

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