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

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

[第203回]


●ファンクションコール07(IOバイト取り出し)、0CH(バージョンn謔闖oし)

ファンクションコール07とファンクションコール0CHのテストは[第62回]で行なっています。
テストプログラムはFTST7です。

[第137回]ではRAMディスク版での動作テストをしています。
IOバイトはアドレス0003H番地の値ですから、ファンクションコール07はその値を読み出してAレジスタに格納してリターンするだけです。
簡単そのもので何の問題もありません。
ファンクションコール0CHのバージョンn謔闖oしも同様に簡単そのもので、CP/M2.2の場合、Hレジスタ=00、Lレジスタ=22を格納してリターンするだけです。
これまた何の問題も無いはずだったのですが…。

実は[第157回]で紹介いたしましたMBASIC(BASIC−80)が、そこで書きましたように最初はなかなか動いてくれませんでした。
動いてくれなかったのにはいろいろ原因があったのですが、このファンクションコール0CHもその原因の1つでした。

何度も登場しております「応用CP/M」(村瀬康治著。アスキー出版局)によりますと、ファンクションコール0CHは、上で書きましたようにHレジスタに00、Lレジスタに22を入れてリターンすることになっています。

ところがMBASIC(BASIC−80)がこけてしまった原因を追求してみましたら、MBASICは起動時にファンクションコール0CHを実行していて、しかもその値のチェックはHLレジスタではなくてAレジスタに対して行なわれていることがわかりました。

それで。
あらためて[第5回]で入手しましたCP/M2.2のソースリストを確認してみましたら。
なんと。
ファンクションコール0CHではバージョンナンバーをAレジスタに入れてリターンすることがわかりました。
下はCP/M2.2のソースリストのその部分です。

;
;   Function to return the current cp/m version number.
;
GETVER	MVI	A,022h	;version 2.2
	JMP	SETSTAT
;

すると、「応用CP/M」(村瀬康治著。アスキー出版局)の記載ミスかということになるのですが、同書ではわざわざサンプルプログラムを書いて、そのリストとともに、それを実行した結果についても記載していますので、記載ミスの線もちょっと考えられません。

ネット上でいろいろ探ってみましたら、
H=00(CP/Mの場合)、L=A=22H(CP/M2.2の場合)
という説明をみつけました。

上でお見せしましたCP/M2.2のソースプログラムリストとMBASICの解析の結果から、ファンクションコール0CHの動作は、「Aレジスタに22Hを入れてリターンする」ということでよいと思いますが、他方ネット上の情報や「応用CP/M」の記載内容から、
H=00、L=22H
という「バージョン」も存在していたようにも考えられます。

そういうことになりますと、ネット上の情報にありましたように、
H=00、L=A=22H
とするのが適当であろうかと思います。

CP/M互換DOSプログラムをそのように直した上で、ファンクションコール0CHの動作テストを行ないました。
動作テストについては、ファンクションコール08のテストと一緒に行なったときの画像をのちほどお見せします。
ですので、まずはテストプログラムのソースリストを先にお見せすることにいたします。

●ソースプログラムVFTST7.TXT

FTST7を64KBフルRAM用に一部を書き換えてファイル名をVFTST7にしました。
下はそのソースプログラムリストです。

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

●ファンクションコール08(IOバイトセット)

ファンクションコール08のテストは[第63回]で行なっています。
テストプログラムはFTST8です。

[第137回]ではRAMディスク版での動作テストをしています。
FTST8を64KBフルRAM用に一部を書き換えてファイル名をVFTST8にしました。
下はそのソースプログラムリストです。

●ソースプログラムVFTST8.TXT

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

●VFTST7とVFTST8の実行

いつものように[第137回]を開いてそれをバックにして、VFTST7とVFTST8を実行しました。



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

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