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

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

[第212回]


●ALV(Allocation Vector)

前回、前々回とVFTST15について書いてきました。
今回はその締めくくりとして、ALVについて少しまとめておきたいと思います。

VFTST15はファンクションコール1BHを実行してALV(Allocation Vector)アドレスを取得するプログラムです。
ALVはディスクの使用済みエリアを管理するための領域で、RAM上に置かれて、ディスクの1ブロックをメモリの1ビットで示します。

MSDOSではALVはディスク上に置かれていて、名前もALVではなくてFAT(File Allocation Table)になりました。
ALVはディスクの使用状況を管理するものですから、MSDOSのようにディスク上に置くほうがよいように思われますが、それをRAM上に置いたことには、それなりの利点もありそうです。

ALVはファイルのセーブや削除の度にアクセスされ更新されますが、それがディスク上にあると、その度に余計なディスクアクセスをしなければなりません。
RAM上に置けば、高速でアクセスすることができます。

しかしRAM上に置いたALVはディスクに記録されないのだとすると、その情報はどこにどのようにして保持されているのでしょうか。
ちょっと気になりませんか?

実はCP/Mでは、システムのリブートが行なわれたり、新しいディスク(フロッピーディスク)が挿入されたりすると、そのディスクのディレクトリエリアを全部読み込んで、ファイルのFCB情報から使用済みのブロックb全部洗い出して、それをもとにRAM上にそのディスクのALVを構築するのです。

その後そのディスクに新しいファイルがセーブされたり、ファイル削除が行なわれたりする度にRAM上のALVが更新されますが、その更新されたALVはどこにも保存されることなく、CP/Mを終了すると捨てられてしまいます。

でも更新された情報はディスクディレクトリの各ファイルのFCBにブロックbニして記録されていますから、リブートしたときに、また最初から読み込んで最新のALVを作成することが可能なのです。
なかなかよく考えられていると思います。
もちろんCP/M互換DOSもその通りの動作をするようにプログラムされています。
[第143回]にも書いておりますが、互換DOSを作るということは、なかなかに骨の折れる作業なのです。

●ファンクションコール1FH(ディスクパラメータアドレスの取得)

ファンクションコール1FHはCP/M起動時にメモリに読み込まれるディスクパラメータブロックの先頭アドレスを取得します。
ファンクションコール1FHについては[第96回]で説明しました。
そこで作ったテストプログラムはFTST16です。
先に説明しましたファンクションコール1BHと同様、これもアドレスを取得するだけですから、特に何というほどのルーチンでもありません。
[第143回]ではRAMディスク版での動作テストをしています。
今回はFTST16を64KBフルRAM用に一部を書き換えてファイル名をVFTST16にしました。
下はそのソースプログラムリストです。

●ソースプログラムVFTST16.TXT

; BDOS TEST16 function1F (get disk parameter address )
;2012/4/12 9/10
;
        ORG $0100
        FCALL=$0005
;
        LD C,1F
        CALL FCALL
        CALL HEX4DP
        CALL CRLF
        LD B,0F;=15
LOOP:LD A,(HL)
        CALL B2HEXDP
        CALL SPDP
        INC HL
        DEC B
        JP NZ,LOOP
        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
;
ERRMSG:"err"
        DB 24;$
;

●VFTST16の実行

[第143回]を開いて、それをバックにしてVFTST16を実行しました。



ディスクパラメータは15バイトのサイズです。
VFTST16を実行すると、最初にディスクパラメータの先頭アドレスを表示し、その次にディスクパラーメータの15バイトの内容を表示します。
ディスクパラメータの先頭アドレスとしてD268が表示されました。
続いてその内容が表示されています。
念の為に、CP/M互換DOSを終了して、DMコマンドでD268からの内容を表示させました。

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

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