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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第100回]


●ファンクションコール25H(ディスクドライブのリセット)

ディスクドライブのリセットはファンクションコール0DHでも行なえます。
ファンクションコール0DHは[第92回]で説明しました。
ファンクションコール0DHは全てのディスクドライブのライトプロテクトを解除しますが、それ以外のことはなにも変化させません。

ファンクションコール25Hはドライブb指定して(複数ドライブ指定可能)、そのドライブのライトプロテクトを解除するとともに、ログインベクトルのビットも0にします。

ファンクションコール25HのテストプログラムFTST18.TXTのソースリストです。

; BDOS TEST18 function25 (disk reset )
;2012/4/16
;
     	ORG $8100
     	FCALL=$8005
	FCB=$805C
;
	LD HL,FCB
	LD A,(HL)
	LD HL,$0001
	DEC A
	JP Z,DISKRS
	ADD HL,HL
	DEC A
	JP Z,DISKRS
	LD E,3F;'?'
	LD C,02
	CALL FCALL
	RET
DISKRS:LD C,25
	EX DE,HL
	CALL FCALL
	RET

今回のテストプログラムは一般的なものではありません。
現在の仮RAMディスクシステムはAドライブとBドライブだけですが、今回のプログラムもそれに合わせて簡略化しています。
CP/Mシステムは最大では16台のディスクドライブを接続できますから、それに合わせればもっと複雑なプログラムになります。
ここでそのようにしても無駄ですから、AドライブとBドライブのみを対象にした、簡単なつくりのプログラムにしています。

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

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

FTST18.TXTをZASM.COMでアセンブルします。
下はアセンブルの結果作成されたアセンブルリストです。

2012/4/16  7:19  ftst18.txt
END=811E
              ; BDOS TEST18 function25 (disk reset )
              ;2012/4/16
              ;
                   	ORG $8100
                   	FCALL=$8005
              	FCB=$805C
              ;
8100 215C80   	LD HL,FCB
8103 7E       	LD A,(HL)
8104 210100   	LD HL,$0001
8107 3D       	DEC A
8108 CA1881   	JP Z,DISKRS
810B 29       	ADD HL,HL
810C 3D       	DEC A
810D CA1881   	JP Z,DISKRS
8110 1E3F     	LD E,3F;'?'
8112 0E02     	LD C,02
8114 CD0580   	CALL FCALL
8117 C9       	RET
8118 0E25     DISKRS:LD C,25
811A EB       	EX DE,HL
811B CD0580   	CALL FCALL
811E C9       	RET
DISKRS       =8118  FCALL        =8005  FCB          =805C  

●ログインベクトルとR/Oベクトルの取り出しプログラム

上で作ったテストプログラムFTST18.TXTの実行結果を確認するために、ログインベクトルとR/Oベクトルの取り出しプログラムを作ります。
[第90回]のFTST10−5.TXT(ログインベクトルの取り出しその他)と、[第91回]のFTST12.TXT(R/Oベクトルの取り出し)を合わせてひとつにしました。
ログインベクトルの取り出しはファンクションコール18Hを使います。
R/Oベクトルの取り出しはファンクションコール1DHを使います。
ログインベクトルは’L’に続いて16進数4桁で表示します。
R/Oベクトルは’R’に続いて16進数4桁で表示します。

ログインベクトルとR/Oベクトルの取り出しプログラムFTST19.TXTのソースリストです。

; BDOS TEST19 login vector & r/o vector    function18,1D
;2012/4/10 test12
;4/16 test19
;
        ORG $8100
        FCALL=$8005
        FCB=$805C
;
        LD C,18
        CALL FCALL
        LD A,4C;'L' login vector
        CALL ADP
        CALL SPDP
        CALL HEX4DP
        CALL CRLF
        LD C,1D
        CALL FCALL
        LD A,52;'R' R/O vector
        CALL ADP
        CALL SPDP
        CALL HEX4DP
        RET
        ;
;CL & LF
CRLF:LD A,0D
        CALL ADP
        LD A,0A
        JP ADP
;space disp
SPDP:LD A,20
;A disp
ADP:PUSH BC
        PUSH HL
        LD E,A
        LD C,02
        CALL FCALL
        POP HL
        POP BC
        RET
;
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
B2HEX4:LD A,H
        CALL B2HEX2
        EX DE,HL
        LD A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
B2HEX2:PUSH AF
        RRCA
        RRCA
        RRCA
        RRCA
        CALL B2HEX1
        LD D,A
        POP AF
        CALL B2HEX1
        LD E,A
        RET
;binary to hex, low 4bit to ascii 1charactor
B2HEX1:AND 0F
        ADD A,30
        CP 3A
        RET C;0-9
        ADD A,07;A-F
        RET
;hex to binary, ascii 1charactor to low 4bit 
HTOB1:CP 30;>="0"?
        RET C;no
        CP 3A;<="9"?
        JP C,HTOB1_2;yes,"0" to "9"
        CP 41;>="A" ?
        RET C;no
        CP 47;<="F"?
        JP C,HTOB1_1
        CP 61;>="a"?
        RET C;no
        CP 67;<="f"?
        CCF
        RET C;no
HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
HTOB1_2:AND 0F
        RET
;HL(bynary 2bytes) to asckii 4bytes & disp
HEX4DP:PUSH BC
        PUSH HL
        CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
        PUSH DE
        EX DE,HL
        CALL DEDP
        POP DE
        CALL DEDP
        POP HL
        POP BC
        RET
;A(binary) to asckii 2bytes HEX & disp
B2HEXDP:PUSH BC
        PUSH HL
        CALL B2HEX2
        CALL DEDP
        POP HL
        POP BC
        RET
;
;DE(asckii 2bytes) disp
DEDP:PUSH DE
        LD E,D
        LD C,02
        CALL FCALL
        POP DE
        LD C,02
        CALL FCALL
        RET
;


FTST19.TXTをZASM.COMでアセンブルします。
下はアセンブルの結果作成されたアセンブルリストです。

2012/4/16  9:26  ftst19.txt
END=819F
              ; BDOS TEST19 login vector & r/o vector    function18,1D
              ;2012/4/10 test12
              ;4/16 test19
              ;
                        ORG $8100
                        FCALL=$8005
                FCB=$805C
              ;
8100 0E18       LD C,18
8102 CD0580     CALL FCALL
8105 3E4C       LD A,4C;'L' login vector
8107 CD3081     CALL ADP
810A CD2E81     CALL SPDP
810D CD7681     CALL HEX4DP
8110 CD2481     CALL CRLF
8113 0E1D       LD C,1D
8115 CD0580     CALL FCALL
8118 3E52       LD A,52;'R' R/O vector
811A CD3081     CALL ADP
811D CD2E81     CALL SPDP
8120 CD7681     CALL HEX4DP
8123 C9         RET
                ;
              ;CL & LF
8124 3E0D     CRLF:LD A,0D
8126 CD3081     CALL ADP
8129 3E0A       LD A,0A
812B C33081     JP ADP
              ;space disp
812E 3E20     SPDP:LD A,20
              ;A disp
8130 C5       ADP:PUSH BC
8131 E5         PUSH HL
8132 5F         LD E,A
8133 0E02       LD C,02
8135 CD0580     CALL FCALL
8138 E1         POP HL
8139 C1         POP BC
813A C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
813B 7C       B2HEX4:LD A,H
813C CD4181     CALL B2HEX2
813F EB         EX DE,HL
8140 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
8141 F5       B2HEX2:PUSH AF
8142 0F         RRCA
8143 0F         RRCA
8144 0F         RRCA
8145 0F         RRCA
8146 CD5081     CALL B2HEX1
8149 57         LD D,A
814A F1         POP AF
814B CD5081     CALL B2HEX1
814E 5F         LD E,A
814F C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
8150 E60F     B2HEX1:AND 0F
8152 C630       ADD A,30
8154 FE3A       CP 3A
8156 D8         RET C;0-9
8157 C607       ADD A,07;A-F
8159 C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
815A FE30     HTOB1:CP 30;>="0"?
815C D8         RET C;no
815D FE3A       CP 3A;<="9"?
815F DA7381     JP C,HTOB1_2;yes,"0" to "9"
8162 FE41       CP 41;>="A" ?
8164 D8         RET C;no
8165 FE47       CP 47;<="F"?
8167 DA7181     JP C,HTOB1_1
816A FE61       CP 61;>="a"?
816C D8         RET C;no
816D FE67       CP 67;<="f"?
816F 3F         CCF
8170 D8         RET C;no
8171 C609     HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
8173 E60F     HTOB1_2:AND 0F
8175 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
8176 C5       HEX4DP:PUSH BC
8177 E5         PUSH HL
8178 CD3B81     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
817B D5         PUSH DE
817C EB         EX DE,HL
817D CD9281     CALL DEDP
8180 D1         POP DE
8181 CD9281     CALL DEDP
8184 E1         POP HL
8185 C1         POP BC
8186 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
8187 C5       B2HEXDP:PUSH BC
8188 E5         PUSH HL
8189 CD4181     CALL B2HEX2
818C CD9281     CALL DEDP
818F E1         POP HL
8190 C1         POP BC
8191 C9         RET
              ;
              ;DE(asckii 2bytes) disp
8192 D5       DEDP:PUSH DE
8193 5A         LD E,D
8194 0E02       LD C,02
8196 CD0580     CALL FCALL
8199 D1         POP DE
819A 0E02       LD C,02
819C CD0580     CALL FCALL
819F C9         RET
              ;
ADP          =8130  B2HEX1       =8150  B2HEX2       =8141  
B2HEX4       =813B  B2HEXDP      =8187  CRLF         =8124  
DEDP         =8192  FCALL        =8005  FCB          =805C  
HEX4DP       =8176  HTOB1        =815A  HTOB1_1      =8171  
HTOB1_2      =8173  SPDP         =812E  


●Aドライブの整理

作成したプログラムを実行するまえに、Aドライブを整理します。
今までの作業でAドライブに空きがなくなってしまいましたから、ファイルをいくつか削除して、空きを作ります。
その前に現在のRAMディスクの内容をバックアップしておきます。

ZB3BASICにエントリして、
/sv rmdskab1.bin,8800,b7ff[Enter]
を実行して、RAMディスクのバックアップをしました。
そのあと
JP D233[Enter]
でCP/Mを起動しました。

前回の作業でR/OかつSYSファイルにしたFTST13.COMを、FTST17.COMを使ってR/Wかつ普通のファイルに戻しました。
そのあとERAコマンドでいくつかのファイルを削除しました。

logfile nd80zlog\04160719.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/sv rmdskab1.bin,8800,b7ff
3000(12288)bytes saved
>jp d233

a>dir
A: FNC0E-1  COM : FTST10   COM : FTST10-2 COM : FTST10-4 COM
A: FTST10-5 COM : FTST11   COM : FTST14   COM : FTST15   COM
A: FTST16   COM : FTST10-6 COM
a>b:ftst17 ftst13.com
RorW?w
SorD?d
ok

a>dir
A: FNC0E-1  COM : FTST10   COM : FTST10-2 COM : FTST10-4 COM
A: FTST10-5 COM : FTST11   COM : FTST13   COM : FTST14   COM
A: FTST15   COM : FTST16   COM : FTST10-6 COM
a>era ftst12.com
a>era ftst13.com
a>era ftst14.com
a>era ftst15.com
a>era ftst16.com
a>era ftst10-6.com
a>dir
A: FNC0E-1  COM : FTST10   COM : FTST10-2 COM : FTST10-4 COM
A: FTST10-5 COM : FTST11   COM
a>^D
end of CP/M
>

FTST18.COMをセーブするために、一旦CP/Mを終了して、ZB3BASICに戻りました。

●FTST18.COMとFTST19.COMのセーブ

/LD FTST18.BIN,8100[Enter]
を実行しました。
そのあと
JP D233[Enter]
でCP/Mを起動し、
save 1 ftst18.com[Enter]
と入力し、FTST18.COMというファイル名でAドライブにセーブしました。

そのあともう一度ZB3BASICに戻って、今度は
/LD FTST19.BIN,8100[Enter]
を実行し、
JP D233[Enter]
でCP/Mを起動して、
save 1 ftst19.com[Enter]
と入力し、FTST19.COMというファイル名でAドライブにセーブしました。
DIRコマンドを実行して、FTST18.COMとFTST19.COMがセーブされたことを確認しました。

>/ld ftst18.bin,8100
loading FTST18.BIN ...001f(31)bytes loaded,from 8100 to 811E
>jp d233

a>save 1 ftst18.com
a>^D
end of CP/M
>/ld ftst19.bin,8100
loading FTST19.BIN ...00a0(160)bytes loaded,from 8100 to 819F
>jp d233

a>save 1 ftst19.com
a>dir
A: FNC0E-1  COM : FTST10   COM : FTST10-2 COM : FTST10-4 COM
A: FTST10-5 COM : FTST11   COM : FTST18   COM : FTST19   COM
a>

●FTST18とFTST19の実行

それでは準備もできましたので、FTST18を実行してみます。
実行の結果はFTST19で確認します。

a>ftst19  
L 0001
R 0000
a>ftst11

a>ftst19
L 0001
R 0001
a>

最初にまずFTST19を実行しました。
Aドライブにログインしましたから、ログインベクトルはAドライブを示すビット0のみ1になっています。
次にFTST11を実行しました。
FTST11はカレントドライブにライトプロテクトをセットします([第91回])。
そのあとでもう一度FTST19を実行しました。
AドライブがR/O(リードオンリー)になりましたから、R/OベクトルはAドライブを示すビット0のみ1になりました。

次にカレントドライブをBドライブにして、テストを続けます。

a>b:
b>a:ftst11

b>a:ftst19
L 0003
R 0003
b>a:ftst18 a:

b>a:ftst19
L 0003
R 0002

カレントドライブをBドライブにして、そこでFTST11を実行しました。
FTST11はカレントドライブにライトプロテクトをセットしますから、BドライブもR/Oになりました。
それを確認するためにFTST19を実行しました。
Bドライブにもログインしましたからログインベクトルはビット0とビット1が1になって、0003と表示されました。
同様にR/Oベクトルもビット0とビット1が1になって、0003と表示されました。

そこで
b>a:ftst18 a:[Enter]
と入力しました。
ファンクションコール25HでAドライブをリセットしました。
もう一度FTST19を実行して確認をしました。
Aドライブがリセットされて、ライトプロテクトが解除されましたから、R/Oベクトルはビット0が0になって、0002と表示されました。
R/Oと同時にログインベクトルも解除されるはずなのですが、ログインベクトルは0003のままです。
いろいろ試してわかったことですが、ここでa:ftst19を実行したために、Aドライブが再びログインディスクとして認識されたようです。

そのことを確認するために、さらにテストをしてみました。
今度はカレントドライブをAドライブにして、そこでもういちどFTST11を実行しました。
ふたたびAドライブもR/Oディスクになりましたから、FTST19を実行すると、ログインベクトルもR/Oベクトルも0003と表示されました。

b>a:
a>ftst11

a>ftst19
L 0003
R 0003
a>ftst18 b:

a>ftst19
L 0001
R 0001
a>

そこで今度は
a>ftst18 b:[Enter]
と入力しました。
ファンクションコール25HでBドライブをリセットしました。
もう一度FTST19を実行して確認をしました。
こんどはBドライブがリセットされて、ライトプロテクトが解除されましたから、R/Oベクトルはビット1が0になって、0001と表示されました。
今回はBドライブにはログインしていませんから、R/Oと同時にログインベクトルも解除されて、ログインベクトルも0001になりました。


ライトプロテクトはともかくとしまして、ログインベクトルはなかなかややこしいものがあります。
もう少しテストを続けます。
Aドライブにログインした状態で(つまりa>と表示された状態で)、
ftst18 a:
を実行しました。
そのあと、FTST19で確認しましたら、ログインベクトルもR/Oベクトルも0000と表示されました。
Aドライブにログインしていても、ファンクションコール25Hを実行すると、現在ログインしているディスクのログイン情報もリセットされてしまうようです(このことがどのように、何に影響するのかよくわかりません)。

a>ftst18 a:

a>ftst19
L 0000
R 0000
a>


そこで、
a>b:[Enter]
と入力して、Bドライブにログインしておいて、
b>a:ftst19[Enter]
と入力して、ログインベクトルを確認してみました。
Bドライブにログインして、そこからAドライブのFTST19.COMを実行しましたから、ログインベクトルは0003と表示されました。

a>b:
b>a:ftst19
L 0003
R 0000
b>


ログインベクトルについては、どうも、なんだかなあ、という感じでいまひとつ、しっくりきませんが、このあたりで終了することにいたします。


ワンボードマイコンでCP/Mを![第100回]
2012.4.23upload

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