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
|
