MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第118回]
●ファンクション18、19
表記のファンクションはログインディスクのためのファンクションコールです。
ログインディスクというのはカレントディスクのことです。
CP/M2.2では最大16台のディスクを接続することができました。
ディスクドライブはA〜Pの名前をつけて識別します。
そしてそのAドライブ〜Pドライブをビット0〜ビット15までの各ビットに順に割り当てた16ビットの値がログインベクトルです。
ただしZB3DOS(CP/M互換DOS)には仮想フロッピーディスクドライブとしてA〜Dの4つのドライブしかありませんから、ビット0〜3の4ビットしか使われません(Zドライブはログインベクトルには割り当てられません)。
あるドライブに1回でもアクセスすると、ログインベクトルの、そのドライブに対応するビットが1になります。
ファンクション18はログインベクトルの16ビットの値を取得してHLレジスタに入れます。
ファンクション19は現在のカレントドライブb取得してAレジスタに入れます。
ファンクション18と19は「ワンボードマイコンでCP/Mを!」[第207回]でテストをしました。
テストプログラムはVFTST105です。
いつものようにVFTST105のソースプログラムをインテルニーモニックに書き直してMFTST105を作りました。
●テストプログラムMFTST105
MFTST105のソースプログラムです。
; BDOS TEST10 filename search function0e,11,12,18,19
;2012/3/19 4/4
; 4/7 4/9 dir disp
;4/10 func18,19
;8/29
;
ORG $0100
FCALL=$0005
FCB=$005C
DMA=$0080
;
LXI H,FCB
INX H
MOV A,M
CPI 20;no fcb data
JNZ LOOP
MVI B,0B;=11
MVI A,3F;'?'
FILL3F:MOV M,A
INX H
DCR B
JNZ FILL3F
LOOP:LXI D,INPMSG
CALL MSGDP
MVI C,01
CALL FCALL
CPI 1A;^z
RZ
CPI 30
JZ DNOPASS
ANI 0F
DCR A
MOV E,A
MVI C,0E
CALL FCALL
DNOPASS:CALL CRLF
;
MVI C,18
CALL FCALL
CALL HEX4DP
CALL CRLF
MVI C,19
CALL FCALL
CALL B2HEXDP
CALL CRLF
;
MVI C,11;first file search
LXI D,FCB
CALL FCALL
CPI FF
JZ NOFILE
;
LXI H,DMA
LXI D,$0020
ORA A;dirctory code 00-03
LOOP1: JZ NMDISP
DAD D
DCR A
JMP LOOP1
NMDISP:INX H;pass drive no.
MVI B,08
NMDISP2:MOV A,M
CPI 20
JZ NMDISP3
CALL ADP
NMDISP3:INX H
DCR B
JNZ NMDISP2
MVI A,2E;"."
CALL ADP
MVI B,03
NMDISP4:MOV A,M
CALL ADP
INX H
DCR B
JNZ NMDISP4
CALL CRLF
;next file search
MVI C,12;next file search
LXI D,FCB
CALL FCALL
CPI FF
JZ END
LXI H,DMA
LXI D,$0020
ORA A;dirctory code 00-03
NXTSRCH:JZ NMDISP
DAD D
DCR A
JMP NXTSRCH
;
NOFILE:LXI D,NFMSG
CALL MSGDP
JMP LOOP
;
END:LXI D,ENDMSG
CALL MSGDP
JMP LOOP
;
MSGDP:MVI C,09
CALL FCALL
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
;
INPMSG:"drvn"
"o."
DB 3F;?
DB 24;$
NFMSG:"not "
"foun"
"d"
DB 0D
DB 0A
DB 24;$
ENDMSG:"end"
DB 0D
DB 0A
DB 24;$
;
|
2015/1/29 21:51 mftst105.txt
END=0252
; BDOS TEST10 filename search function0e,11,12,18,19
;2012/3/19 4/4
; 4/7 4/9 dir disp
;4/10 func18,19
;8/29
;
ORG $0100
FCALL=$0005
FCB=$005C
DMA=$0080
;
0100 215C00 LXI H,FCB
0103 23 INX H
0104 7E MOV A,M
0105 FE20 CPI 20;no fcb data
0107 C21401 JNZ LOOP
010A 060B MVI B,0B;=11
010C 3E3F MVI A,3F;'?'
010E 77 FILL3F:MOV M,A
010F 23 INX H
0110 05 DCR B
0111 C20E01 JNZ FILL3F
0114 113902 LOOP:LXI D,INPMSG
0117 CDB701 CALL MSGDP
011A 0E01 MVI C,01
011C CD0500 CALL FCALL
011F FE1A CPI 1A;^z
0121 C8 RZ
0122 FE30 CPI 30
0124 CA3001 JZ DNOPASS
0127 E60F ANI 0F
0129 3D DCR A
012A 5F MOV E,A
012B 0E0E MVI C,0E
012D CD0500 CALL FCALL
0130 CDBD01 DNOPASS:CALL CRLF
;
0133 0E18 MVI C,18
0135 CD0500 CALL FCALL
0138 CD0F02 CALL HEX4DP
013B CDBD01 CALL CRLF
013E 0E19 MVI C,19
0140 CD0500 CALL FCALL
0143 CD2002 CALL B2HEXDP
0146 CDBD01 CALL CRLF
;
0149 0E11 MVI C,11;first file search
014B 115C00 LXI D,FCB
014E CD0500 CALL FCALL
0151 FEFF CPI FF
0153 CAA501 JZ NOFILE
;
0156 218000 LXI H,DMA
0159 112000 LXI D,$0020
015C B7 ORA A;dirctory code 00-03
015D CA6501 LOOP1: JZ NMDISP
0160 19 DAD D
0161 3D DCR A
0162 C35D01 JMP LOOP1
0165 23 NMDISP:INX H;pass drive no.
0166 0608 MVI B,08
0168 7E NMDISP2:MOV A,M
0169 FE20 CPI 20
016B CA7101 JZ NMDISP3
016E CDC901 CALL ADP
0171 23 NMDISP3:INX H
0172 05 DCR B
0173 C26801 JNZ NMDISP2
0176 3E2E MVI A,2E;"."
0178 CDC901 CALL ADP
017B 0603 MVI B,03
017D 7E NMDISP4:MOV A,M
017E CDC901 CALL ADP
0181 23 INX H
0182 05 DCR B
0183 C27D01 JNZ NMDISP4
0186 CDBD01 CALL CRLF
;next file search
0189 0E12 MVI C,12;next file search
018B 115C00 LXI D,FCB
018E CD0500 CALL FCALL
0191 FEFF CPI FF
0193 CAAE01 JZ END
0196 218000 LXI H,DMA
0199 112000 LXI D,$0020
019C B7 ORA A;dirctory code 00-03
019D CA6501 NXTSRCH:JZ NMDISP
01A0 19 DAD D
01A1 3D DCR A
01A2 C39D01 JMP NXTSRCH
;
01A5 114102 NOFILE:LXI D,NFMSG
01A8 CDB701 CALL MSGDP
01AB C31401 JMP LOOP
;
01AE 114D02 END:LXI D,ENDMSG
01B1 CDB701 CALL MSGDP
01B4 C31401 JMP LOOP
;
01B7 0E09 MSGDP:MVI C,09
01B9 CD0500 CALL FCALL
01BC C9 RET
;
;CL & LF
01BD 3E0D CRLF:MVI A,0D
01BF CDC901 CALL ADP
01C2 3E0A MVI A,0A
01C4 C3C901 JMP ADP
;space disp
01C7 3E20 SPDP:MVI A,20
;A disp
01C9 C5 ADP:PUSH B
01CA E5 PUSH H
01CB 5F MOV E,A
01CC 0E02 MVI C,02
01CE CD0500 CALL FCALL
01D1 E1 POP H
01D2 C1 POP B
01D3 C9 RET
;
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
01D4 7C B2HEX4:MOV A,H
01D5 CDDA01 CALL B2HEX2
01D8 EB XCHG
01D9 7B MOV A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
01DA F5 B2HEX2:PUSH PSW
01DB 0F RRC
01DC 0F RRC
01DD 0F RRC
01DE 0F RRC
01DF CDE901 CALL B2HEX1
01E2 57 MOV D,A
01E3 F1 POP PSW
01E4 CDE901 CALL B2HEX1
01E7 5F MOV E,A
01E8 C9 RET
;binary to hex, low 4bit to ascii 1charactor
01E9 E60F B2HEX1:ANI 0F
01EB C630 ADI 30
01ED FE3A CPI 3A
01EF D8 RC;0-9
01F0 C607 ADI 07;A-F
01F2 C9 RET
;hex to binary, ascii 1charactor to low 4bit
01F3 FE30 HTOB1:CPI 30;>="0"?
01F5 D8 RC;no
01F6 FE3A CPI 3A;<="9"?
01F8 DA0C02 JC HTOB1_2;yes,"0" to "9"
01FB FE41 CPI 41;>="A" ?
01FD D8 RC;no
01FE FE47 CPI 47;<="F"?
0200 DA0A02 JC HTOB1_1
0203 FE61 CPI 61;>="a"?
0205 D8 RC;no
0206 FE67 CPI 67;<="f"?
0208 3F CMC
0209 D8 RC;no
020A C609 HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
020C E60F HTOB1_2:ANI 0F
020E C9 RET
;HL(bynary 2bytes) to asckii 4bytes & disp
020F C5 HEX4DP:PUSH B
0210 E5 PUSH H
0211 CDD401 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
0214 D5 PUSH D
0215 EB XCHG
0216 CD2B02 CALL DEDP
0219 D1 POP D
021A CD2B02 CALL DEDP
021D E1 POP H
021E C1 POP B
021F C9 RET
;A(binary) to asckii 2bytes HEX & disp
0220 C5 B2HEXDP:PUSH B
0221 E5 PUSH H
0222 CDDA01 CALL B2HEX2
0225 CD2B02 CALL DEDP
0228 E1 POP H
0229 C1 POP B
022A C9 RET
;
;DE(asckii 2bytes) disp
022B D5 DEDP:PUSH D
022C 5A MOV E,D
022D 0E02 MVI C,02
022F CD0500 CALL FCALL
0232 D1 POP D
0233 0E02 MVI C,02
0235 CD0500 CALL FCALL
0238 C9 RET
;
0239 6472766E INPMSG:"drvn"
023D 6F2E "o."
023F 3F DB 3F;?
0240 24 DB 24;$
0241 6E6F7420 NFMSG:"not "
0245 666F756E "foun"
0249 64 "d"
024A 0D DB 0D
024B 0A DB 0A
024C 24 DB 24;$
024D 656E64 ENDMSG:"end"
0250 0D DB 0D
0251 0A DB 0A
0252 24 DB 24;$
;
ADP =01C9 B2HEX1 =01E9 B2HEX2 =01DA
B2HEX4 =01D4 B2HEXDP =0220 CRLF =01BD
DEDP =022B DMA =0080 DNOPASS =0130
END =01AE ENDMSG =024D FCALL =0005
FCB =005C FILL3F =010E HEX4DP =020F
HTOB1 =01F3 HTOB1_1 =020A HTOB1_2 =020C
INPMSG =0239 LOOP =0114 LOOP1 =015D
MSGDP =01B7 NFMSG =0241 NMDISP =0165
NMDISP2 =0168 NMDISP3 =0171 NMDISP4 =017D
NOFILE =01A5 NXTSRCH =019D SPDP =01C7
|


