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 |