2015.2.1

前へ
次へ
ホームページトップへ戻る

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;$
;

下はMFTST105のアセンブルリストです。

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  

このプログラムはファンクション18、ファンクション19のテストだけではなくて、指定したドライブにあるファイル名を表示するという余計なことまでしています。
というのもVFTST105はファンクション11、ファンクション12をテストするために作ったプログラム(FTST10−4)にファンクション18、ファンクション19のテストを追加して作ったものがもとになっているからです(「ワンボードマイコンでCP/Mを!」[第207回])。

●MFTST105の実行

MFTST105を実行しました。

drive.?
の表示にカレントドライブ指定の意味で0を入力しました。
ログインベクトルの値0001が表示され、カレントディスクの値00(Aドライブ)が表示されたあと、Aドライブのファイル名が表示されました。


次にBドライブを指定すると、ログインベクトルの値として0003が表示され、カレントディスクとして01(Bドライブ)が表示されました。


次にAドライブを指定すると、カレントディスクの値は00(Aドライブ)になりましたが、ログインベクトルの値は0003が表示されました。
ログインベクトルは一度でもアクセスされたドライブに対応するビットは1になるからです。

MYCPU80でCP/Mを![第118回]
2015.2.1upload

前へ
次へ
ホームページトップへ戻る