2015.1.20

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

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


[第106回]


●ファンクション07、09、0C

ファンクション07のテストは「ワンボードマイコンでCP/Mを!」[第203回]で行なっています。
ファンクション07はI/Oバイトの取り出しです。
ZB3DOS(CP/M互換DOS)ではI/Oバイトは使いませんから、ファンクション07のテストはやっても意味がないのですが「ワンボードマイコンでCP/Mを!」[第203回]でテストプログラムを作ってテストをしていますので、MYCPU80でもテストしてみることにしました。
テストプログラムはVFTST7です。
それをインテルニーモニックに書き直してMFTST7を作りました。

無意味なテストの割には結構長いプログラムです。
何をやっているのかと思ってプログラムリストをよくよく眺めてみましたら、ファンクション07だけではなくて、ついでにファンクション0Cのテストもしていました。
また結果の表示にはファンクション09を使っています。

ファンクション0Cはバージョンbフ取り出しです。
ファンクション0Cも「ワンボードマイコンでCP/Mを!」[第203回]で説明をしています。
ファンクション09は文字列出力です。
こちらは「ワンボードマイコンでCP/Mを!」[第199回]で説明をしています。
そこでは簡単なテストプログラムVFTST2を使ってテストをしています。
そこでこのVFTST2もインテルニーモニックに書き直してMFTST2を作りました。

●テストプログラムMFTST2

下はMFTST2のソースプログラムリストです。

; BDOS function 9 test
;2012/6/16
;
	ORG $0100
	FCALL=$0005
;
	LXI D,LIST
	MVI C,09
	CALL FCALL
	RET
;
LIST:"Hell"
	"o Wo"
	"rld$"
;

これはもうお決まりのプログラムです。
DEレジスタに文字列の先頭アドレスを入れてコールすると、その文字列が画面に表示されます。
文字列の最後には’$’を置きます。
下はMFTST2のアセンブルリストです。

2015/1/20  21:52  mftst2.txt
END=0114
              ; BDOS function 9 test
              ;2012/6/16
              ;
              	ORG $0100
              	FCALL=$0005
              ;
0100 110901   	LXI D,LIST
0103 0E09     	MVI C,09
0105 CD0500   	CALL FCALL
0108 C9       	RET
              ;
0109 48656C6C LIST:"Hell"
010D 6F20576F 	"o Wo"
0111 726C6424 	"rld$"
              ;
FCALL        =0005  LIST         =0109  

●テストプログラムMFTST7

下はMFTST7のソースプログラムリストです。

; BDOS TEST7 get IOBYTE & version No.
;2012/3/15 8/23
;
        ORG $0100
        FCALL=$0005
;       
;IOBYTE
        MVI C,07;get iobyte
        CALL FCALL
        PUSH PSW
        LXI D,IOBYTE
        MVI C,09;string out
        CALL FCALL
        POP PSW
        CALL B2HEXDP
        CALL CRLF
;version no.
        MVI C,0C;version no. get
        CALL FCALL
        PUSH H
        LXI D,VERNO
        MVI C,09;string out
        CALL FCALL
        POP H
        CALL HEX4DP
        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
;
IOBYTE:"ioby"
        "te"
        DB 3D;=
        DB 24;$
VERNO:"vers"
        "ion "
        "HL"
        DB 3D
        DB 24;$
;

プログラムは結構長いのですがそれほど大したことはやっていません。
16進数の表示に大半を費やしています。
下はMFTST7のアセンブルリストです。

2015/1/20  21:52  mftst7.txt
END=019B
              ; BDOS TEST7 get IOBYTE & version No.
              ;2012/3/15 8/23
              ;
                ORG $0100
                FCALL=$0005
              ; 
              ;IOBYTE
0100 0E07       MVI C,07;get iobyte
0102 CD0500     CALL FCALL
0105 F5         PUSH PSW
0106 118801     LXI D,IOBYTE
0109 0E09       MVI C,09;string out
010B CD0500     CALL FCALL
010E F1         POP PSW
010F CD5001     CALL B2HEXDP
0112 CD2801     CALL CRLF
              ;version no.
0115 0E0C       MVI C,0C;version no. get
0117 CD0500     CALL FCALL
011A E5         PUSH H
011B 119001     LXI D,VERNO
011E 0E09       MVI C,09;string out
0120 CD0500     CALL FCALL
0123 E1         POP H
0124 CD3F01     CALL HEX4DP
0127 C9         RET
              ;
              ;CL & LF
0128 3E0D     CRLF:MVI A,0D
012A CD3401     CALL ADP
012D 3E0A       MVI A,0A
012F C33401     JMP ADP
              ;space disp
0132 3E20     SPDP:MVI A,20
              ;A disp
0134 C5       ADP:PUSH B
0135 E5         PUSH H
0136 5F         MOV E,A
0137 0E02       MVI C,02
0139 CD0500     CALL FCALL
013C E1         POP H
013D C1         POP B
013E C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
013F C5       HEX4DP:PUSH B
0140 E5         PUSH H
0141 CD6901     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
0144 D5         PUSH D
0145 EB         XCHG
0146 CD5B01     CALL DEDP
0149 D1         POP D
014A CD5B01     CALL DEDP
014D E1         POP H
014E C1         POP B
014F C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
0150 C5       B2HEXDP:PUSH B
0151 E5         PUSH H
0152 CD6F01     CALL B2HEX2
0155 CD5B01     CALL DEDP
0158 E1         POP H
0159 C1         POP B
015A C9         RET
              ;
              ;DE(asckii 2bytes) disp
015B D5       DEDP:PUSH D
015C 5A         MOV E,D
015D 0E02       MVI C,02
015F CD0500     CALL FCALL
0162 D1         POP D
0163 0E02       MVI C,02
0165 CD0500     CALL FCALL
0168 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
0169 7C       B2HEX4:MOV A,H
016A CD6F01     CALL B2HEX2
016D EB         XCHG
016E 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
016F F5       B2HEX2:PUSH PSW
0170 0F         RRC
0171 0F         RRC
0172 0F         RRC
0173 0F         RRC
0174 CD7E01     CALL B2HEX1
0177 57         MOV D,A
0178 F1         POP PSW
0179 CD7E01     CALL B2HEX1
017C 5F         MOV E,A
017D C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
017E E60F     B2HEX1:ANI 0F
0180 C630       ADI 30
0182 FE3A       CPI 3A
0184 D8         RC;0-9
0185 C607       ADI 07;A-F
0187 C9         RET
              ;
0188 696F6279 IOBYTE:"ioby"
018C 7465             "te"
018E 3D         DB 3D;=
018F 24               DB 24;$
0190 76657273 VERNO:"vers"
0194 696F6E20   "ion "
0198 484C       "HL"
019A 3D         DB 3D
019B 24         DB 24;$
              ;
ADP          =0134  B2HEX1       =017E  B2HEX2       =016F  
B2HEX4       =0169  B2HEXDP      =0150  CRLF         =0128  
DEDP         =015B  FCALL        =0005  HEX4DP       =013F  
IOBYTE       =0188  SPDP         =0132  VERNO        =0190  


●ファンクション08

ファンクション08はI/Oバイトのセットです。
上に書きましたようにZB3DOS(CP/M互換DOS)ではI/Oバイトは使いませんからファンクション08のテストをするのは無意味なのですがこちらも「ワンボードマイコンでCP/Mを!」[第203回]でテストプログラムを作ってテストをしていますから、このプログラムもインテルニーモニックに書き直してテストをしてみることにしました。
もとのプログラムはVFTST8です。
それを書き直してMFTST8を作りました。

●テストプログラムMFTST8

下はMFTST8のソースプログラムリストです。

; BDOS TEST8 IOBYTE set/get
;2012/3/15 8/23
;
        ORG $0100
        FCALL=$0005
;
        MVI E,55;010101
        CALL IOSETGET
        MVI E,AA;10101010
        CALL IOSETGET
        MVI E,FF;11111111       
;IOBYTE set/get
IOSETGET:PUSH D
        LXI D,SETIO
        MVI C,09;string out
        CALL FCALL
        POP D
        MOV A,E
        PUSH D
        CALL B2HEXDP
        CALL CRLF
        POP D
        MVI C,08;iobyte set
        CALL FCALL
        MVI C,07;iobyte get
        CALL FCALL
        CALL B2HEXDP
        CALL CRLF
        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
;
SETIO:"set "
        "ioby"
        "te "
        DB 24;$
;

下はMFTST8のアセンブルリストです。

2015/1/20  21:52  mftst8.txt
END=019B
              ; BDOS TEST8 IOBYTE set/get
              ;2012/3/15 8/23
              ;
                ORG $0100
                FCALL=$0005
              ;
0100 1E55       MVI E,55;010101
0102 CD0C01     CALL IOSETGET
0105 1EAA       MVI E,AA;10101010
0107 CD0C01     CALL IOSETGET
010A 1EFF       MVI E,FF;11111111       
              ;IOBYTE set/get
010C D5       IOSETGET:PUSH D
010D 119001     LXI D,SETIO
0110 0E09       MVI C,09;string out
0112 CD0500     CALL FCALL
0115 D1         POP D
0116 7B         MOV A,E
0117 D5         PUSH D
0118 CD5801     CALL B2HEXDP
011B CD3001     CALL CRLF
011E D1         POP D
011F 0E08       MVI C,08;iobyte set
0121 CD0500     CALL FCALL
0124 0E07       MVI C,07;iobyte get
0126 CD0500     CALL FCALL
0129 CD5801     CALL B2HEXDP
012C CD3001     CALL CRLF
012F C9         RET
              ;
              ;CL & LF
0130 3E0D     CRLF:MVI A,0D
0132 CD3C01     CALL ADP
0135 3E0A       MVI A,0A
0137 C33C01     JMP ADP
              ;space disp
013A 3E20     SPDP:MVI A,20
              ;A disp
013C C5       ADP:PUSH B
013D E5         PUSH H
013E 5F         MOV E,A
013F 0E02       MVI C,02
0141 CD0500     CALL FCALL
0144 E1         POP H
0145 C1         POP B
0146 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
0147 C5       HEX4DP:PUSH B
0148 E5         PUSH H
0149 CD7101     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
014C D5         PUSH D
014D EB         XCHG
014E CD6301     CALL DEDP
0151 D1         POP D
0152 CD6301     CALL DEDP
0155 E1         POP H
0156 C1         POP B
0157 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
0158 C5       B2HEXDP:PUSH B
0159 E5         PUSH H
015A CD7701     CALL B2HEX2
015D CD6301     CALL DEDP
0160 E1         POP H
0161 C1         POP B
0162 C9         RET
              ;
              ;DE(asckii 2bytes) disp
0163 D5       DEDP:PUSH D
0164 5A         MOV E,D
0165 0E02       MVI C,02
0167 CD0500     CALL FCALL
016A D1         POP D
016B 0E02       MVI C,02
016D CD0500     CALL FCALL
0170 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
0171 7C       B2HEX4:MOV A,H
0172 CD7701     CALL B2HEX2
0175 EB         XCHG
0176 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
0177 F5       B2HEX2:PUSH PSW
0178 0F         RRC
0179 0F         RRC
017A 0F         RRC
017B 0F         RRC
017C CD8601     CALL B2HEX1
017F 57         MOV D,A
0180 F1         POP PSW
0181 CD8601     CALL B2HEX1
0184 5F         MOV E,A
0185 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
0186 E60F     B2HEX1:ANI 0F
0188 C630       ADI 30
018A FE3A       CPI 3A
018C D8         RC;0-9
018D C607       ADI 07;A-F
018F C9         RET
              ;
0190 73657420 SETIO:"set "
0194 696F6279   "ioby"
0198 746520           "te "
019B 24               DB 24;$
              ;
ADP          =013C  B2HEX1       =0186  B2HEX2       =0177  
B2HEX4       =0171  B2HEXDP      =0158  CRLF         =0130  
DEDP         =0163  FCALL        =0005  HEX4DP       =0147  
IOSETGET     =010C  SETIO        =0190  SPDP         =013A  


●テストプログラムを実行しました

MFTST2、MFTST7、MFTST8の順でテストしてみました。


あれえ?
MFTST7の実行でVersion No.がおかしい値になっていますねえ。
本来ならばVersion2.2を示す0022にならなければいけないのですが…。
どこかにバグがあるようです。

MYCPU80でCP/Mを![第106回]
2015.1.20upload

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