復活!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 ; |
; 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;$
;
|
; 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;$
;
|
