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
|
