MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第121回]
●ファンクション1B
ファンクション1Bはディスクアローケーションアドレスの取り出しです。
カレントドライブのディスクアローケーションベクトル(ALV)の先頭アドレスがHLレジスタに入ります。
アローケーションベクトル(ALV)については「ワンボードマイコンでCP/Mを!」[第210回]〜[第212回]で詳しく説明をしています。
ファンクション1Bは「ワンボードマイコンでCP/Mを!」[第210回]でテストをしました。
そこで作ったテストプログラムはVFTST15です。
最初にカレントドライブのアローケーションベクトルの先頭アドレスを表示したあと、アローケーションベクトル(128バイト)の内容を表示します。
テストプログラムVFTST15のソースプログラムをインテルニーモニックに書き直してMFTST15を作りました。
●テストプログラムMFTST15
MFTST15のソースプログラムです。
; BDOS TEST15 function1B (get allocation vector address ) ;2012/4/12 9/4 ; ORG $0100 FCALL=$0005 ; MVI C,1B CALL FCALL CALL HEX4DP CALL CRLF MVI C,08 LOOP:MVI B,10 LOOP1:MOV A,M CALL B2HEXDP INX H DCR B JNZ LOOP1 CALL CRLF DCR C 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 ; ;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 ;hex to binary, ascii 1charactor to low 4bit HTOB1:CPI 30;>="0"? RC;no CPI 3A;<="9"? JC HTOB1_2;yes,"0" to "9" CPI 41;>="A" ? RC;no CPI 47;<="F"? JC HTOB1_1 CPI 61;>="a"? RC;no CPI 67;<="f"? CMC RC;no HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F HTOB1_2:ANI 0F 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 ; ERRMSG:"err" DB 24;$ ; |
2015/1/31 9:42 mftst15.txt END=019F ; BDOS TEST15 function1B (get allocation vector address ) ;2012/4/12 9/4 ; ORG $0100 FCALL=$0005 ; 0100 0E1B MVI C,1B 0102 CD0500 CALL FCALL 0105 CD7201 CALL HEX4DP 0108 CD2001 CALL CRLF 010B 0E08 MVI C,08 010D 0610 LOOP:MVI B,10 010F 7E LOOP1:MOV A,M 0110 CD8301 CALL B2HEXDP 0113 23 INX H 0114 05 DCR B 0115 C20F01 JNZ LOOP1 0118 CD2001 CALL CRLF 011B 0D DCR C 011C C20D01 JNZ LOOP 011F C9 RET ; ;CL & LF 0120 3E0D CRLF:MVI A,0D 0122 CD2C01 CALL ADP 0125 3E0A MVI A,0A 0127 C32C01 JMP ADP ;space disp 012A 3E20 SPDP:MVI A,20 ;A disp 012C C5 ADP:PUSH B 012D E5 PUSH H 012E 5F MOV E,A 012F 0E02 MVI C,02 0131 CD0500 CALL FCALL 0134 E1 POP H 0135 C1 POP B 0136 C9 RET ; ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE 0137 7C B2HEX4:MOV A,H 0138 CD3D01 CALL B2HEX2 013B EB XCHG 013C 7B MOV A,E ;binary to hex, 1byte data to ascii 2charactors,A to DE 013D F5 B2HEX2:PUSH PSW 013E 0F RRC 013F 0F RRC 0140 0F RRC 0141 0F RRC 0142 CD4C01 CALL B2HEX1 0145 57 MOV D,A 0146 F1 POP PSW 0147 CD4C01 CALL B2HEX1 014A 5F MOV E,A 014B C9 RET ;binary to hex, low 4bit to ascii 1charactor 014C E60F B2HEX1:ANI 0F 014E C630 ADI 30 0150 FE3A CPI 3A 0152 D8 RC;0-9 0153 C607 ADI 07;A-F 0155 C9 RET ;hex to binary, ascii 1charactor to low 4bit 0156 FE30 HTOB1:CPI 30;>="0"? 0158 D8 RC;no 0159 FE3A CPI 3A;<="9"? 015B DA6F01 JC HTOB1_2;yes,"0" to "9" 015E FE41 CPI 41;>="A" ? 0160 D8 RC;no 0161 FE47 CPI 47;<="F"? 0163 DA6D01 JC HTOB1_1 0166 FE61 CPI 61;>="a"? 0168 D8 RC;no 0169 FE67 CPI 67;<="f"? 016B 3F CMC 016C D8 RC;no 016D C609 HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F 016F E60F HTOB1_2:ANI 0F 0171 C9 RET ;HL(bynary 2bytes) to asckii 4bytes & disp 0172 C5 HEX4DP:PUSH B 0173 E5 PUSH H 0174 CD3701 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes 0177 D5 PUSH D 0178 EB XCHG 0179 CD8E01 CALL DEDP 017C D1 POP D 017D CD8E01 CALL DEDP 0180 E1 POP H 0181 C1 POP B 0182 C9 RET ;A(binary) to asckii 2bytes HEX & disp 0183 C5 B2HEXDP:PUSH B 0184 E5 PUSH H 0185 CD3D01 CALL B2HEX2 0188 CD8E01 CALL DEDP 018B E1 POP H 018C C1 POP B 018D C9 RET ; ;DE(asckii 2bytes) disp 018E D5 DEDP:PUSH D 018F 5A MOV E,D 0190 0E02 MVI C,02 0192 CD0500 CALL FCALL 0195 D1 POP D 0196 0E02 MVI C,02 0198 CD0500 CALL FCALL 019B C9 RET ; 019C 657272 ERRMSG:"err" 019F 24 DB 24;$ ; ADP =012C B2HEX1 =014C B2HEX2 =013D B2HEX4 =0137 B2HEXDP =0183 CRLF =0120 DEDP =018E ERRMSG =019C FCALL =0005 HEX4DP =0172 HTOB1 =0156 HTOB1_1 =016D HTOB1_2 =016F LOOP =010D LOOP1 =010F SPDP =012A |
「ワンボードマイコンでCP/Mを!」[第210回]を書いた時点ではディスクアローケーションベクトルはD800〜D7FFに置いていましたが、その後ND80Z3.5(ND80ZV)用ZB3DOS(CP/M互換DOS)を供給開始した時までに、E600〜E7FFに変更しました。
●ファンクション1F
ファンクション1FはCP/M起動時にメモリに読み込まれるディスクパラメータブロックの先頭アドレスを取得してHLレジスタに入れます。
ディスクパラメータブロックについては「ワンボードマイコンでCP/Mを!」[第143回]で説明をしています。
ディスクパラメータブロックは15バイトのエリアで、ディスクの基本的な情報(セクタ数/トラックや総ブロック数など)が書かれています。
ファンクション1Fは「ワンボードマイコンでCP/Mを!」[第212回]でテストをしました。
そこで作ったテストプログラムはFTST16です。
テストプログラムVFTST16のソースプログラムをインテルニーモニックに書き直してMFTST16を作りました。
●テストプログラムMFTST16
MFTST16のソースプログラムです。
; BDOS TEST16 function1F (get disk parameter address ) ;2012/4/12 9/10 ; ORG $0100 FCALL=$0005 ; MVI C,1F CALL FCALL CALL HEX4DP CALL CRLF MVI B,0F;=15 LOOP:MOV A,M CALL B2HEXDP CALL SPDP INX H DCR B 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 ; ;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 ;hex to binary, ascii 1charactor to low 4bit HTOB1:CPI 30;>="0"? RC;no CPI 3A;<="9"? JC HTOB1_2;yes,"0" to "9" CPI 41;>="A" ? RC;no CPI 47;<="F"? JC HTOB1_1 CPI 61;>="a"? RC;no CPI 67;<="f"? CMC RC;no HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F HTOB1_2:ANI 0F 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 ; ERRMSG:"err" DB 24;$ ; |
2015/1/31 10:32 mftst16.txt END=0199 ; BDOS TEST16 function1F (get disk parameter address ) ;2012/4/12 9/10 ; ORG $0100 FCALL=$0005 ; 0100 0E1F MVI C,1F 0102 CD0500 CALL FCALL 0105 CD6C01 CALL HEX4DP 0108 CD1A01 CALL CRLF 010B 060F MVI B,0F;=15 010D 7E LOOP:MOV A,M 010E CD7D01 CALL B2HEXDP 0111 CD2401 CALL SPDP 0114 23 INX H 0115 05 DCR B 0116 C20D01 JNZ LOOP 0119 C9 RET ; ;CL & LF 011A 3E0D CRLF:MVI A,0D 011C CD2601 CALL ADP 011F 3E0A MVI A,0A 0121 C32601 JMP ADP ;space disp 0124 3E20 SPDP:MVI A,20 ;A disp 0126 C5 ADP:PUSH B 0127 E5 PUSH H 0128 5F MOV E,A 0129 0E02 MVI C,02 012B CD0500 CALL FCALL 012E E1 POP H 012F C1 POP B 0130 C9 RET ; ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE 0131 7C B2HEX4:MOV A,H 0132 CD3701 CALL B2HEX2 0135 EB XCHG 0136 7B MOV A,E ;binary to hex, 1byte data to ascii 2charactors,A to DE 0137 F5 B2HEX2:PUSH PSW 0138 0F RRC 0139 0F RRC 013A 0F RRC 013B 0F RRC 013C CD4601 CALL B2HEX1 013F 57 MOV D,A 0140 F1 POP PSW 0141 CD4601 CALL B2HEX1 0144 5F MOV E,A 0145 C9 RET ;binary to hex, low 4bit to ascii 1charactor 0146 E60F B2HEX1:ANI 0F 0148 C630 ADI 30 014A FE3A CPI 3A 014C D8 RC;0-9 014D C607 ADI 07;A-F 014F C9 RET ;hex to binary, ascii 1charactor to low 4bit 0150 FE30 HTOB1:CPI 30;>="0"? 0152 D8 RC;no 0153 FE3A CPI 3A;<="9"? 0155 DA6901 JC HTOB1_2;yes,"0" to "9" 0158 FE41 CPI 41;>="A" ? 015A D8 RC;no 015B FE47 CPI 47;<="F"? 015D DA6701 JC HTOB1_1 0160 FE61 CPI 61;>="a"? 0162 D8 RC;no 0163 FE67 CPI 67;<="f"? 0165 3F CMC 0166 D8 RC;no 0167 C609 HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F 0169 E60F HTOB1_2:ANI 0F 016B C9 RET ;HL(bynary 2bytes) to asckii 4bytes & disp 016C C5 HEX4DP:PUSH B 016D E5 PUSH H 016E CD3101 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes 0171 D5 PUSH D 0172 EB XCHG 0173 CD8801 CALL DEDP 0176 D1 POP D 0177 CD8801 CALL DEDP 017A E1 POP H 017B C1 POP B 017C C9 RET ;A(binary) to asckii 2bytes HEX & disp 017D C5 B2HEXDP:PUSH B 017E E5 PUSH H 017F CD3701 CALL B2HEX2 0182 CD8801 CALL DEDP 0185 E1 POP H 0186 C1 POP B 0187 C9 RET ; ;DE(asckii 2bytes) disp 0188 D5 DEDP:PUSH D 0189 5A MOV E,D 018A 0E02 MVI C,02 018C CD0500 CALL FCALL 018F D1 POP D 0190 0E02 MVI C,02 0192 CD0500 CALL FCALL 0195 C9 RET ; 0196 657272 ERRMSG:"err" 0199 24 DB 24;$ ; ADP =0126 B2HEX1 =0146 B2HEX2 =0137 B2HEX4 =0131 B2HEXDP =017D CRLF =011A DEDP =0188 ERRMSG =0196 FCALL =0005 HEX4DP =016C HTOB1 =0150 HTOB1_1 =0167 HTOB1_2 =0169 LOOP =010D SPDP =0124 |