2015.2.2

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第119回]


●ファンクション25

ファンクション25はディスクドライブをリセットします。
[第112回]でテストしたファンクションコール0Dもディスクドライブをリセットしました。
ファンクション0Dは全てのドライブのライトプロテクトを解除しますが、それ以外はなにも変更しません。
ファンクション25はドライブb指定して(複数のドライブを指定可能)、そのドライブのライトプロテクトを解除するとともに、ログインベクトルの該当するビットも0にします。

ファンクション25は「ワンボードマイコンでCP/Mを!」[第209回]でテストをしました。
そこで作ったテストプログラムはVFTST18です。
また結果を確認するために、ログインベクトルとR/Oベクトルを取り出して表示するプログラムVFTST19も作りました。
ログインベクトルは[第118回]で、またR/Oベクトルは[第112回]で説明をしました。

いつものようにVFTST18、VFTST19のソースプログラムをインテルニーモニックに書き直してMFTST18、19を作りました。

●テストプログラムMFTST18

MFTST18のソースプログラムです。

; BDOS TEST18 function25 (disk reset )
;2012/4/16 8/31
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
;
        LXI H,FCB
        MOV A,M
        LXI H,$0001
        DCR A
        JZ DISKRS
        DAD H
        DCR A
        JZ DISKRS
        MVI E,3F;'?'
        MVI C,02
        CALL FCALL
        RET
DISKRS:MVI C,25
        XCHG
        CALL FCALL
        RET

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

2015/1/29  22:42  mftst18.txt
END=011E
              ; BDOS TEST18 function25 (disk reset )
              ;2012/4/16 8/31
              ;
                        ORG $0100
                        FCALL=$0005
                FCB=$005C
              ;
0100 215C00     LXI H,FCB
0103 7E         MOV A,M
0104 210100     LXI H,$0001
0107 3D         DCR A
0108 CA1801     JZ DISKRS
010B 29         DAD H
010C 3D         DCR A
010D CA1801     JZ DISKRS
0110 1E3F       MVI E,3F;'?'
0112 0E02       MVI C,02
0114 CD0500     CALL FCALL
0117 C9         RET
0118 0E25     DISKRS:MVI C,25
011A EB         XCHG
011B CD0500     CALL FCALL
011E C9         RET
DISKRS       =0118  FCALL        =0005  FCB          =005C  

ユーザープログラムを実行するためにファイル名入力するときにパラメータでドライブ名のみを指定すると、FCBの先頭にドライブ名を示す数値が入れられます(Aドライブは01、Bドライブは02になります)。
ファンクション25の使い方は、16ビットの値のうち、リセットしたいドライブに対応するビットを1にしたものをDEレジスタに入れて、Cレジスタに25Hを入れて、システムをコールします。

パラメータとして入力するドライブ名はA:〜D:です。
FCBの先頭バイトの値は、Aドライブなら01、Bドライブなら02になります。
AドライブのときはHLレジスタの値は0001ですが、BドライブのときはDAD Hの実行によって、HLレジスタの値は0002になります。
CALL FCALLの直前でXCHGによって、HLレジスタの値がDEレジスタに入れられます。

ファンクション25は同時に複数のドライブのリセットが可能ですが、このテストプログラムでは一度に1ドライブのみをリセットします。

●テストプログラムMFTST19

MFTST19のソースプログラムです。

; BDOS TEST19 login vector & r/o vector    function18,1D
;2012/4/10 test12
;4/16 test19
;9/3
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
;
        MVI C,18
        CALL FCALL
        MVI A,4C;'L' login vector
        CALL ADP
        CALL SPDP
        CALL HEX4DP
        CALL CRLF
        MVI C,1D
        CALL FCALL
        MVI A,52;'R' R/O vector
        CALL ADP
        CALL SPDP
        CALL HEX4DP
        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
;

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

2015/1/29  22:43  mftst19.txt
END=019F
              ; BDOS TEST19 login vector & r/o vector    function18,1D
              ;2012/4/10 test12
              ;4/16 test19
              ;9/3
              ;
                        ORG $0100
                        FCALL=$0005
                FCB=$005C
              ;
0100 0E18       MVI C,18
0102 CD0500     CALL FCALL
0105 3E4C       MVI A,4C;'L' login vector
0107 CD3001     CALL ADP
010A CD2E01     CALL SPDP
010D CD7601     CALL HEX4DP
0110 CD2401     CALL CRLF
0113 0E1D       MVI C,1D
0115 CD0500     CALL FCALL
0118 3E52       MVI A,52;'R' R/O vector
011A CD3001     CALL ADP
011D CD2E01     CALL SPDP
0120 CD7601     CALL HEX4DP
0123 C9         RET
                ;
              ;CL & LF
0124 3E0D     CRLF:MVI A,0D
0126 CD3001     CALL ADP
0129 3E0A       MVI A,0A
012B C33001     JMP ADP
              ;space disp
012E 3E20     SPDP:MVI A,20
              ;A disp
0130 C5       ADP:PUSH B
0131 E5         PUSH H
0132 5F         MOV E,A
0133 0E02       MVI C,02
0135 CD0500     CALL FCALL
0138 E1         POP H
0139 C1         POP B
013A C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
013B 7C       B2HEX4:MOV A,H
013C CD4101     CALL B2HEX2
013F EB         XCHG
0140 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
0141 F5       B2HEX2:PUSH PSW
0142 0F         RRC
0143 0F         RRC
0144 0F         RRC
0145 0F         RRC
0146 CD5001     CALL B2HEX1
0149 57         MOV D,A
014A F1         POP PSW
014B CD5001     CALL B2HEX1
014E 5F         MOV E,A
014F C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
0150 E60F     B2HEX1:ANI 0F
0152 C630       ADI 30
0154 FE3A       CPI 3A
0156 D8         RC;0-9
0157 C607       ADI 07;A-F
0159 C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
015A FE30     HTOB1:CPI 30;>="0"?
015C D8         RC;no
015D FE3A       CPI 3A;<="9"?
015F DA7301     JC HTOB1_2;yes,"0" to "9"
0162 FE41       CPI 41;>="A" ?
0164 D8         RC;no
0165 FE47       CPI 47;<="F"?
0167 DA7101     JC HTOB1_1
016A FE61       CPI 61;>="a"?
016C D8         RC;no
016D FE67       CPI 67;<="f"?
016F 3F         CMC
0170 D8         RC;no
0171 C609     HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
0173 E60F     HTOB1_2:ANI 0F
0175 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
0176 C5       HEX4DP:PUSH B
0177 E5         PUSH H
0178 CD3B01     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
017B D5         PUSH D
017C EB         XCHG
017D CD9201     CALL DEDP
0180 D1         POP D
0181 CD9201     CALL DEDP
0184 E1         POP H
0185 C1         POP B
0186 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
0187 C5       B2HEXDP:PUSH B
0188 E5         PUSH H
0189 CD4101     CALL B2HEX2
018C CD9201     CALL DEDP
018F E1         POP H
0190 C1         POP B
0191 C9         RET
              ;
              ;DE(asckii 2bytes) disp
0192 D5       DEDP:PUSH D
0193 5A         MOV E,D
0194 0E02       MVI C,02
0196 CD0500     CALL FCALL
0199 D1         POP D
019A 0E02       MVI C,02
019C CD0500     CALL FCALL
019F C9         RET
              ;
ADP          =0130  B2HEX1       =0150  B2HEX2       =0141  
B2HEX4       =013B  B2HEXDP      =0187  CRLF         =0124  
DEDP         =0192  FCALL        =0005  FCB          =005C  
HEX4DP       =0176  HTOB1        =015A  HTOB1_1      =0171  
HTOB1_2      =0173  SPDP         =012E  

●MFTST18、MFTST19の実行

「ワンボードマイコンでCP/Mを!」[第209回]では、もとになったテストを行なっている「ワンボードマイコンでCP/Mを!」[第142回]を開いて、それを見ながらテストを行ないました。
今回はそれと同じように「ワンボードマイコンでCP/Mを!」[第209回]を開いて、その画面をバックにして同じ手順でテストを行ないました。



最初にAドライブとBドライブでMFTST11を実行し、そのあとMFTST19を実行しました。
MFTST11は[第112回]で説明をしました。
カレントドライブをリードオンリーにします(CP/M互換DOSでは、そのようにR/Oベクトルをセットするだけで、実際には仮想ディスクドライブはリードオンリーにはなりません)。

ログインベクトル(L)もR/Oベクトル(R)も0003と表示されました。
次に MFTST18 a: を実行してからMFTST19を実行すると、MFTST18によってAドライブのライトプロテクトが解除されたため、Rは0002と表示されました。

そのあとAドライブでMFTST11を実行すると、それによってまたAドライブにライトプロテクトがセットされたため、MFTST19の実行によって、R=0003が表示されました。
次にAドライブで MFTST18 b: を実行すると、ログインベクトルとR/Oベクトルの、Bドライブのビットがクリアされたため、L=0001、R=0001と表示されました。

MYCPU80でCP/Mを![第119回]
2015.2.2upload

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