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 ; |
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 |
; 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 ; |
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 |
; BDOS TEST13 function0D (disk reset ) ;2012/4/10 8/31 ; ORG $0100 FCALL=$0005 ; MVI C,0D CALL FCALL RET ; |
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 |