2015.1.26

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

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


[第112回]


●ファンクション0D、1C、1D

やっとビルトインコマンドの説明が終りましたので、またファンクションコールに戻って説明を続けます。
表記のファンクションはリードオンリーディスクのためのファンクションコールです。
各ファンクションについては「ワンボードマイコンでCP/Mを!」の下記の各回で説明をしています。

ファンクション0DH(全ディスクドライブリセット) [第208回]
ファンクション1CH(ライトプロテクトセット) [第207回]
ファンクション1DH(R/Oベクトルの取り出し) [第207回]

リードオンリーディスク(ディスクライトプロテクト)については「ワンボードマイコンでCP/Mを!」[第394回]で説明をしています。
CP/Mでは補助記憶装置がフロッピーディスクだったために、システムディスクなどの大切なディスクは誤って消去してしまわないように書き込み禁止にしておくのが常識でした。
その延長としてソフトウェアでディスクにライトプロテクトをかける機能が用意されていたのだと思います。

しかしZB3DOS(CP/M互換DOS)はフロッピーディスクに代わるものとしてWindowsパソコンのハードディスク内に「仮想フロッピーディスク」を設けてそれを使うシステムになっています。
ハードディスク内に設定した仮想フロッピーディスクはZB3DOS(CP/M互換DOS)から見ればドライブ装置です(ソフトウェア上は「ディレクトリ」と考えてもよい)が、Windowsではただの1個のファイルです。
このファイル(仮想フロッピーディスク)はZB3DOS(CP/M互換DOS)からは誤操作によっても消すことはできません。
仮想フロッピーディスク内の個々のファイルに対してのみ上書き、削除などができます。

ディスクの丸ごとコピーの操作としてはZB3DOS(CP/M互換DOS)上ではCOPYコマントが考えられます。
しかし
COPY A: B:
という操作は無効です(エラーにはなりませんが no file と表示されて何も行なわれません)。
COPY A:*.* B:
は有効です。
この場合にはBドライブに同じファイルがあればそのファイルは上書きされますが、そのほかのファイルはそのまま残ります。

仮想フロッピーディスクそのものに対してはZB3DOS(CP/M互換DOS)を離れてWindows上から操作することで初めて上書きや削除などが可能になります。
当然上書きや削除などの操作に際してはWindowsから警告が出されます。
万一の誤操作やアクシデントに対してはWindows上でのバックアップコピーなどの手段が有効です。
そのように考えてくるとZB3DOS(CP/M互換DOS)レベルでの「ライトプロテクト」は無意味だということになります。
そこでZB3DOS(CP/M互換DOS)では互換性を維持するためにリードオンリーディスク関係のファンクションも実装しましたが、ライトプロテクトの操作を行なっても実際にはそのようには機能せず、単にライトプロテクトマークがつけられるだけということになっています。

そういうことですので、表記のファンクションについてテストすることには余り意味はないのですが、今までのテストプログラムと同様に、インテルニーモニックに書き換えてテストをすることにします。

説明の都合上、順番が前後します。
ファンクション1Cと1Dは「ワンボードマイコンでCP/Mを!」[第207回]でテストをしました。
テストプログラムはVFTST11とVFTST12です。
いつものようにソースプログラムをインテルニーモニックに書き直してMFTST11とMFTST12を作りました。

●テストプログラムMFTST11

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

; BDOS TEST11 set 'read only ' function1C
;2012/4/10 8/29
;
     	ORG $0100
     	FCALL=$0005
;
	MVI C,1C
	CALL FCALL
	RET
;

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

2015/1/26  19:2  mftst11.txt
END=0105
              ; BDOS TEST11 set 'read only ' function1C
              ;2012/4/10 8/29
              ;
                   	ORG $0100
                   	FCALL=$0005
              ;
0100 0E1C     	MVI C,1C
0102 CD0500   	CALL FCALL
0105 C9       	RET
              ;
FCALL        =0005  

●テストプログラムMFTST12

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

; BDOS TEST12 get r/o vector    function1D
;2012/4/10 8/29
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
;
        MVI C,1D
        CALL FCALL
        CALL HEX4DP
        ;
;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
;

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

2015/1/26  19:2  mftst12.txt
END=0183
              ; BDOS TEST12 get r/o vector    function1D
              ;2012/4/10 8/29
              ;
                        ORG $0100
                        FCALL=$0005
                FCB=$005C
              ;
0100 0E1D       MVI C,1D
0102 CD0500     CALL FCALL
0105 CD5A01     CALL HEX4DP
                ;
              ;CL & LF
0108 3E0D     CRLF:MVI A,0D
010A CD1401     CALL ADP
010D 3E0A       MVI A,0A
010F C31401     JMP ADP
              ;space disp
0112 3E20     SPDP:MVI A,20
              ;A disp
0114 C5       ADP:PUSH B
0115 E5         PUSH H
0116 5F         MOV E,A
0117 0E02       MVI C,02
0119 CD0500     CALL FCALL
011C E1         POP H
011D C1         POP B
011E C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
011F 7C       B2HEX4:MOV A,H
0120 CD2501     CALL B2HEX2
0123 EB         XCHG
0124 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
0125 F5       B2HEX2:PUSH PSW
0126 0F         RRC
0127 0F         RRC
0128 0F         RRC
0129 0F         RRC
012A CD3401     CALL B2HEX1
012D 57         MOV D,A
012E F1         POP PSW
012F CD3401     CALL B2HEX1
0132 5F         MOV E,A
0133 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
0134 E60F     B2HEX1:ANI 0F
0136 C630       ADI 30
0138 FE3A       CPI 3A
013A D8         RC;0-9
013B C607       ADI 07;A-F
013D C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
013E FE30     HTOB1:CPI 30;>="0"?
0140 D8         RC;no
0141 FE3A       CPI 3A;<="9"?
0143 DA5701     JC HTOB1_2;yes,"0" to "9"
0146 FE41       CPI 41;>="A" ?
0148 D8         RC;no
0149 FE47       CPI 47;<="F"?
014B DA5501     JC HTOB1_1
014E FE61       CPI 61;>="a"?
0150 D8         RC;no
0151 FE67       CPI 67;<="f"?
0153 3F         CMC
0154 D8         RC;no
0155 C609     HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
0157 E60F     HTOB1_2:ANI 0F
0159 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
015A C5       HEX4DP:PUSH B
015B E5         PUSH H
015C CD1F01     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
015F D5         PUSH D
0160 EB         XCHG
0161 CD7601     CALL DEDP
0164 D1         POP D
0165 CD7601     CALL DEDP
0168 E1         POP H
0169 C1         POP B
016A C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
016B C5       B2HEXDP:PUSH B
016C E5         PUSH H
016D CD2501     CALL B2HEX2
0170 CD7601     CALL DEDP
0173 E1         POP H
0174 C1         POP B
0175 C9         RET
              ;
              ;DE(asckii 2bytes) disp
0176 D5       DEDP:PUSH D
0177 5A         MOV E,D
0178 0E02       MVI C,02
017A CD0500     CALL FCALL
017D D1         POP D
017E 0E02       MVI C,02
0180 CD0500     CALL FCALL
0183 C9         RET
              ;
ADP          =0114  B2HEX1       =0134  B2HEX2       =0125  
B2HEX4       =011F  B2HEXDP      =016B  CRLF         =0108  
DEDP         =0176  FCALL        =0005  FCB          =005C  
HEX4DP       =015A  HTOB1        =013E  HTOB1_1      =0155  
HTOB1_2      =0157  SPDP         =0112  

●MFTST11、MFTST12の実行

「ワンボードマイコンでCP/Mを!」[第207回]を開いて、参考にしながらMFTST11、MFTST12を実行しました。



MFTST12(ファンクション1D)はリードオンリーベクトルを読み出します。
16ビットの各ビットにドライブbェ割り当てられています。
Aドライブがビット0、Bドライブがビット1、Cドライブがビット2、Dドライブがビット3です。
Zドライブは割り当てられません。
リードオンリーディスクのビットが1になります。
CP/M互換DOSはA〜Dしか実装しませんから、ビット0〜3以外は常に0です。
CP/M互換DOSにエントリしたときはライトプロテクトはかかっていませんからMFTST12で読み出した値は0000になっています。
MFTST11(ファンクション1C)はカレントドライブをリードオンリーにします。
BドライブでMFTST11を実行しましたから、そのあとでMFTST12を実行すると0002になっています。

●テストプログラムMFTST13

ファンクション0Dは「ワンボードマイコンでCP/Mを!」[第208回]でテストをしました。
テストプログラムはVFTST13です。
ソースプログラムをインテルニーモニックに書き直してMFTST13を作りました。

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

; BDOS TEST13 function0D (disk reset )
;2012/4/10 8/31
;
     	ORG $0100
     	FCALL=$0005
;
	MVI C,0D
	CALL FCALL
	RET
;

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

2015/1/26  19:2  mftst13.txt
END=0105
              ; BDOS TEST13 function0D (disk reset )
              ;2012/4/10 8/31
              ;
                   	ORG $0100
                   	FCALL=$0005
              ;
0100 0E0D     	MVI C,0D
0102 CD0500   	CALL FCALL
0105 C9       	RET
              ;
FCALL        =0005  

●MFTST13の実行

「ワンボードマイコンでCP/Mを!」[第208回]を開いて、参考にしながらMFTST13を実行しました。



MFTST13(ファンクション0D)は全ディスクドライブのライトプロテクトを解除します。

さきほどの続きでAドライブもリードオンリーにしました。
MFTST12を実行すると0003が表示されました。
そのあとMFTST13を実行してから、MFTST12を実行すると0000が表示されました。

上のテストで表示されたようにライトプロテクトの設定動作は行なわれますが、今回のはじめのところで書きましたように、CP/M互換DOSでは実際にはライトプロテクト(書き込み禁止状態)にはなりません。

MYCPU80でCP/Mを![第112回]
2015.1.26upload

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