復活!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;$ ; |