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