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

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

[第210回]


●ファンクションコール1BH(アローケーションベクトルアドレスの取得)

ファンクションコール1BHはカレントドライブのアローケーションベクトルの先頭アドレスを取得します。
アローケーションベクトル(ALV)はディスクドライブ毎に、RAM上に用意されていて、そのディスクの使用状況を示しています。
デイスク上の1ブロックを1ビットに置き換えて示し、使用済みブロックを1で、未使用ブロックを0で示します。

ファンクションコール1BHは[第95回]でテストしました。
作成したテストプログラムはFTST15です。
[第143回]ではRAMディスク版での動作テストをしています。
今回はFTST15を64KBフルRAM用に一部を書き換えてファイル名をVFTST15にしました。

下はそのソースプログラムリストです。

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

; BDOS TEST15 function1B (get allocation vector address )
;2012/4/12 9/4
;
        ORG $0100
        FCALL=$0005
;
        LD C,1B
        CALL FCALL
        CALL HEX4DP
        CALL CRLF
        LD C,08
LOOP:LD B,10
LOOP1:LD A,(HL)
        CALL B2HEXDP
        INC HL
        DEC B
        JP NZ,LOOP1
        CALL CRLF
        DEC C
        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;$
;


[第143回]では仮RAMデイスクでのテストだったためALVは2バイト(もっと厳密に言うと12ブロックしかありませんから、1.5バイト)しかありませんでした。
今回は大きなサイズの仮想フロッピーディスクドライブが対象ですからALVは128バイトもあります(詳細は後述)。
VFTST15ではその128バイトの中味を表示するための変更も行ないました。

●VFTST15の実行

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



最初にカレントドライブがAドライブのときにVFTST15を実行しました。
アローケーションベクトルの先頭アドレスがD800と表示され、D800〜D87Fの128バイトの内容が表示されました。
次にカレントドライブをBドライブにして、同じようにVFTST15を実行しました。
アローケーションベクトルの先頭アドレスがD880と表示され、D880〜D8FFの128バイトの内容が表示されました。

仮想フロッピーディスクドライブは各ドライブともサイズは2MBです。
CP/Mはドライブをブロックという単位で管理しています。
仮想フロッピーディスクドライブは16セクタを1ブロックにしています。
CP/Mの1セクタは128バイトです。
ですから1ブロックは2048バイトになります。
2MB(2048KB)はちょうど1K(1024)ブロックになります。
ALV(アローケーションベクトル)は1ブロックを1ビットに割り当てます。
そのことからALVのバイト数は1024/8=128バイトになります。

VFTST15を実行した結果、AドライブのALVは先頭から14バイトがFFになっています。
15バイト目は80ですから、1ブロックだけ消費されています。
全体では14×8+1=113ブロックが使われていることになります。
このうち最初の2ブロック(bO、bP)はディレクトリ用にリザーブされています。
するとファイルとして使われているブロックはbQ〜bP12になります。

●仮想FDDのディレクトリセクタを表示

実際にブロックがどのように割り当てられているのかをちょっと確認してみることにします。
[第167回]で紹介しましたVFDUMPを実行して仮想FDDのAドライブのセクタ内容を表示させてみます。



セクタbOとセクタbPを表示させました。
ここはディレクトリエリアの先頭セクタです。
32バイトのFCB(File Control Block)が並んでいます。
各FCBの後半16バイトがデータブロックのブロックb配置するエリアです。
最初のF80.COMは1個のFCBでは足りなくて2個のFCBを使っています。
ブロックbヘ2バイトで示されます。
F80.COMはデータブロックとしてbO002〜bO00Fを使っていることがわかります。
その次のHELL1.FORはbO010を使っています。

今度はディレクトリの終わりを見てみましょう。
セクターbP5とセクターbP6を表示させました。



どうやらここが現在使われているディレクトリの終わりのところのようです。
最後にあるのは今回説明しましたVFTST15.COMと次回説明する予定のVFTST16.COMです。
VFTST16.COMのFCBを見てみますと、データエリアとしてブロックbO070が使われています。
0070Hを10進数に直すと112になります。

今回は時間がなくなってしまいました。
次回はこの続きをもう少し説明したいと思います。

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

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