2015.1.22

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第108回]


●ファンクション0A

ファンクション0Aはコンソールバッファ入力です。
あらかじめ設定したバッファサイズ(最大255バイト)に入力文字数が達するか[Enter]が押されるとリターンします。
ファンクション0Aは「ワンボードマイコンでCP/Mを」[第198回]で説明をしています。
そこではテストプログラムVFTST9を使ってテストを行なっています。
そこで今回はいままでと同様にVFTST9をインテルニーモニックに変換してMFTST9を作りました。

●テストプログラムMFTST9

下はMFTST9のソースプログラムです。

; BDOS TEST9 console buffer read
;2012/3/16 8/16
;2013/4/17
;
        ORG $0100
        FCALL=$0005
        CONBF=$0200
        CONBF1=$0201
        CONBF2=$0202
;
        MVI A,FF;=255
        STA CONBF
LOOP:LXI D,STRIN
        MVI C,09;string out
        CALL FCALL
        LXI D,CONBF
        MVI C,0A;console buffer in
        CALL FCALL
        CALL CRLF
        LXI H,CONBF1
        MOV B,M
        INX H
        INR B
LOOP1:DCR B
        JZ BFDMP
        MOV A,M
        CALL ADP
        INX H
        JMP LOOP1
BFDMP:CALL CRLF
        LXI H,CONBF
        MVI B,17;=23
BFDMP1:MOV A,M
        CALL B2HEXDP
        CALL SPDP
        INX H
        DCR B
        JNZ BFDMP1
        CALL CRLF
        LHLD CONBF2
        MOV A,L
        CPI 2F;/
        JNZ LOOP
        MOV A,H
        CPI 45;E
        JNZ LOOP
        RET
;
;CL & LF
CRLF:MVI A,0D
        CALL ADP
        MVI A,0A
        JMP ADP
;space disp
SPDP:MVI A,20
;A disp
ADP:PUSH B
        PUSH H
        MOV E,A
        MVI C,02
        CALL FCALL
        POP H
        POP B
        RET
;HL(bynary 2bytes) to asckii 4bytes & disp
HEX4DP:PUSH B
        PUSH H
        CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
        PUSH D
        XCHG
        CALL DEDP
        POP D
        CALL DEDP
        POP H
        POP B
        RET
;A(binary) to asckii 2bytes HEX & disp
B2HEXDP:PUSH B
        PUSH H
        CALL B2HEX2
        CALL DEDP
        POP H
        POP B
        RET
;
;DE(asckii 2bytes) disp
DEDP:PUSH D
        MOV E,D
        MVI C,02
        CALL FCALL
        POP D
        MVI C,02
        CALL FCALL
        RET
;
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
B2HEX4:MOV A,H
        CALL B2HEX2
        XCHG
        MOV A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
B2HEX2:PUSH PSW
        RRC
        RRC
        RRC
        RRC
        CALL B2HEX1
        MOV D,A
        POP PSW
        CALL B2HEX1
        MOV E,A
        RET
;binary to hex, low 4bit to ascii 1charactor
B2HEX1:ANI 0F
        ADI 30
        CPI 3A
        RC;0-9
        ADI 07;A-F
        RET
;
STRIN:"in"
        DB 3A;:
        DB 24;$
;

そして下はMFTST9のアセンブルリストです。

2015/1/21  14:56  mftst9.txt
END=01B4
              ; BDOS TEST9 console buffer read
              ;2012/3/16 8/16
              ;2013/4/17
              ;
                ORG $0100
                FCALL=$0005
                CONBF=$0200
                CONBF1=$0201
                CONBF2=$0202
              ;
0100 3EFF       MVI A,FF;=255
0102 320002     STA CONBF
0105 11B101   LOOP:LXI D,STRIN
0108 0E09       MVI C,09;string out
010A CD0500     CALL FCALL
010D 110002     LXI D,CONBF
0110 0E0A       MVI C,0A;console buffer in
0112 CD0500     CALL FCALL
0115 CD5101     CALL CRLF
0118 210102     LXI H,CONBF1
011B 46         MOV B,M
011C 23         INX H
011D 04         INR B
011E 05       LOOP1:DCR B
011F CA2A01     JZ BFDMP
0122 7E         MOV A,M
0123 CD5D01     CALL ADP
0126 23         INX H
0127 C31E01     JMP LOOP1
012A CD5101   BFDMP:CALL CRLF
012D 210002     LXI H,CONBF
0130 0617       MVI B,17;=23
0132 7E       BFDMP1:MOV A,M
0133 CD7901     CALL B2HEXDP
0136 CD5B01     CALL SPDP
0139 23         INX H
013A 05         DCR B
013B C23201     JNZ BFDMP1
013E CD5101     CALL CRLF
0141 2A0202     LHLD CONBF2
0144 7D         MOV A,L
0145 FE2F       CPI 2F;/
0147 C20501     JNZ LOOP
014A 7C         MOV A,H
014B FE45       CPI 45;E
014D C20501     JNZ LOOP
0150 C9         RET
              ;
              ;CL & LF
0151 3E0D     CRLF:MVI A,0D
0153 CD5D01     CALL ADP
0156 3E0A       MVI A,0A
0158 C35D01     JMP ADP
              ;space disp
015B 3E20     SPDP:MVI A,20
              ;A disp
015D C5       ADP:PUSH B
015E E5         PUSH H
015F 5F         MOV E,A
0160 0E02       MVI C,02
0162 CD0500     CALL FCALL
0165 E1         POP H
0166 C1         POP B
0167 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
0168 C5       HEX4DP:PUSH B
0169 E5         PUSH H
016A CD9201     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
016D D5         PUSH D
016E EB         XCHG
016F CD8401     CALL DEDP
0172 D1         POP D
0173 CD8401     CALL DEDP
0176 E1         POP H
0177 C1         POP B
0178 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
0179 C5       B2HEXDP:PUSH B
017A E5         PUSH H
017B CD9801     CALL B2HEX2
017E CD8401     CALL DEDP
0181 E1         POP H
0182 C1         POP B
0183 C9         RET
              ;
              ;DE(asckii 2bytes) disp
0184 D5       DEDP:PUSH D
0185 5A         MOV E,D
0186 0E02       MVI C,02
0188 CD0500     CALL FCALL
018B D1         POP D
018C 0E02       MVI C,02
018E CD0500     CALL FCALL
0191 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
0192 7C       B2HEX4:MOV A,H
0193 CD9801     CALL B2HEX2
0196 EB         XCHG
0197 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
0198 F5       B2HEX2:PUSH PSW
0199 0F         RRC
019A 0F         RRC
019B 0F         RRC
019C 0F         RRC
019D CDA701     CALL B2HEX1
01A0 57         MOV D,A
01A1 F1         POP PSW
01A2 CDA701     CALL B2HEX1
01A5 5F         MOV E,A
01A6 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
01A7 E60F     B2HEX1:ANI 0F
01A9 C630       ADI 30
01AB FE3A       CPI 3A
01AD D8         RC;0-9
01AE C607       ADI 07;A-F
01B0 C9         RET
              ;
01B1 696E     STRIN:"in"
01B3 3A         DB 3A;:
01B4 24               DB 24;$
              ;
ADP          =015D  B2HEX1       =01A7  B2HEX2       =0198  
B2HEX4       =0192  B2HEXDP      =0179  BFDMP        =012A  
BFDMP1       =0132  CONBF        =0200  CONBF1       =0201  
CONBF2       =0202  CRLF         =0151  DEDP         =0184  
FCALL        =0005  HEX4DP       =0168  LOOP         =0105  
LOOP1        =011E  SPDP         =015B  STRIN        =01B1  

MFTST9を実行しました。
上のほうで書きましたようにVFTST9のテストは「ワンボードマイコンでCP/Mを」[第198回]でやっていますが、そのテストについての説明は「ワンボードマイコンでCP/Mを」[第132回]で行なっています。
そこで「ワンボードマイコンでCP/Mを」[第198回]でやったのと同じように、「ワンボードマイコンでCP/Mを」[第132回]を開いて、その説明を参照しながらテストを行ないました。
下の画像で左上は今回のテストの実行画面で、右下は「ワンボードマイコンでCP/Mを」[第132回]の表示画面です。



なお上の画面ではやっていませんが、MFTST9を終了するときは/E[Enter]を入力します。
これはファンクション0Aの機能ではなくてMFTST9でそのようにプログラムしているからです。
実際にはプログラムに手抜きがあって、/E[Enter]ではなくても入力した文字列の先頭2バイトが/Eならばプログラムが終了します。

●テストプログラムMFTST92

ND80Z3.5(ND80ZV)用のZB3DOS(CP/M互換DOS)操作説明書ではVFTST9とは別にVFTST92も参考プログラムとして簡単に説明しています。
あらかじめバッファのサイズを5バイトに指定して、入力がその文字数に達したらリターンします。
VFTST92をインテルニーモニックに変換してMFTST92を作りました。

MFTST92はMFTST9がプログラムの先頭でバッファサイズとしてFF(=255)を指定しているところを05に変更しただけですから全体のプログラムリストは割愛します。
下は先頭の変更部分です。

2015/1/21  14:57  mftst92.txt
END=01B4
              ; BDOS TEST9 console buffer read
              ;2012/3/16 8/16
              ;2013/4/17
              ;
                ORG $0100
                FCALL=$0005
                CONBF=$0200
                CONBF1=$0201
                CONBF2=$0202
              ;
0100 3E05       MVI A,05;=5
0102 320002     STA CONBF
0105 11B101   LOOP:LXI D,STRIN

MFTST92を実行しました。



こちらはMFTST9に比べるときわめて簡単なテストです。
in: の表示に5文字を入力するとバッファフルになりリターンします。
その後バッファの中身(入力された文字列)を表示したあとバッファの内容を16進数で表示します。
ここでは操作例としてABCDE、12345を入力しました。
最後に/E[Enter]を入力してMFTST92の実行を終了しました。

MYCPU80でCP/Mを![第108回]
2015.1.22upload

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