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

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

[第95回]


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

アローケーションベクトル(ALV)はディスクドライブ毎に用意されていて、そのディスクの使用状況を示しています。
デイスク上の1ブロックを1ビットに置き換えて示し、使用済みブロックを1で、未使用ブロックを0で示します。
アローケーションベクトルは[第33回]で説明していますので、そちらも参照願います。

ファンクションコール1BHはカレントドライブのアローケーションベクトルのアドレスを取得します。
Cレジスタに1BHを入れてシステムをコールすると、HLレジスタにカレントドライブのアローケーションベクトルのアドレスが入ってリターンしてきます。

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

; BDOS TEST15 function1B (get allocation vector address )
;2012/4/12
;
        ORG $8100
        FCALL=$8005
;
        LD C,1B
        CALL FCALL
        CALL HEX4DP
        CALL CRLF
        LD D,(HL)
        INC HL
        LD E,(HL)
        EX DE,HL
        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
;
ERRMSG:"err"
        DB 24;$
;

長いプログラムに見えますが、ほとんどは結果の表示のためのサブルーチンです。
表示のためのサブルーチンは[第42回]で使ったメモリダンププログラムからのコピーです。
メインプログラム部分は10行しかありません。
本当に簡単なプログラムです。

Cレジスタに1BHを入れて、システムをコールすると、HLレジスタにアローケーションベクトルのアドレスが入ってリターンしてきます。
そのHLレジスタの値を16進数で表示したあと、アローケーションベクトルの値をDレジスタとEレジスタに入れます。
仮RAMディスクはもともと12KBしかなかったところを、さらにAドライブとBドライブに分割しましたから、どちらのドライブも6KBしかありません。
ブロック数は12ですから、1ブロックを1ビットで示すアローケーションベクトルは2バイト(正確には1.5バイト)です。
ですから今回のテストプログラムではDレジスタとEレジスタに入ってしまいます。
DEレジスタの値も16進数で表示します。

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

2012/4/12  21:59  ftst15.txt
END=8192
              ; BDOS TEST15 function1B (get allocation vector address )
              ;2012/4/12
              ;
                        ORG $8100
                        FCALL=$8005
              ;
8100 0E1B       LD C,1B
8102 CD0580     CALL FCALL
8105 CD6581     CALL HEX4DP
8108 CD1381     CALL CRLF
810B 56         LD D,(HL)
810C 23         INC HL
810D 5E         LD E,(HL)
810E EB         EX DE,HL
810F CD6581     CALL HEX4DP
8112 C9         RET
              ;
              ;CL & LF
8113 3E0D     CRLF:LD A,0D
8115 CD1F81     CALL ADP
8118 3E0A       LD A,0A
811A C31F81     JP ADP
              ;space disp
811D 3E20     SPDP:LD A,20
              ;A disp
811F C5       ADP:PUSH BC
8120 E5         PUSH HL
8121 5F         LD E,A
8122 0E02       LD C,02
8124 CD0580     CALL FCALL
8127 E1         POP HL
8128 C1         POP BC
8129 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
812A 7C       B2HEX4:LD A,H
812B CD3081     CALL B2HEX2
812E EB         EX DE,HL
812F 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
8130 F5       B2HEX2:PUSH AF
8131 0F         RRCA
8132 0F         RRCA
8133 0F         RRCA
8134 0F         RRCA
8135 CD3F81     CALL B2HEX1
8138 57         LD D,A
8139 F1         POP AF
813A CD3F81     CALL B2HEX1
813D 5F         LD E,A
813E C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
813F E60F     B2HEX1:AND 0F
8141 C630       ADD A,30
8143 FE3A       CP 3A
8145 D8         RET C;0-9
8146 C607       ADD A,07;A-F
8148 C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
8149 FE30     HTOB1:CP 30;>="0"?
814B D8         RET C;no
814C FE3A       CP 3A;<="9"?
814E DA6281     JP C,HTOB1_2;yes,"0" to "9"
8151 FE41       CP 41;>="A" ?
8153 D8         RET C;no
8154 FE47       CP 47;<="F"?
8156 DA6081     JP C,HTOB1_1
8159 FE61       CP 61;>="a"?
815B D8         RET C;no
815C FE67       CP 67;<="f"?
815E 3F         CCF
815F D8         RET C;no
8160 C609     HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
8162 E60F     HTOB1_2:AND 0F
8164 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
8165 C5       HEX4DP:PUSH BC
8166 E5         PUSH HL
8167 CD2A81     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
816A D5         PUSH DE
816B EB         EX DE,HL
816C CD8181     CALL DEDP
816F D1         POP DE
8170 CD8181     CALL DEDP
8173 E1         POP HL
8174 C1         POP BC
8175 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
8176 C5       B2HEXDP:PUSH BC
8177 E5         PUSH HL
8178 CD3081     CALL B2HEX2
817B CD8181     CALL DEDP
817E E1         POP HL
817F C1         POP BC
8180 C9         RET
              ;
              ;DE(asckii 2bytes) disp
8181 D5       DEDP:PUSH DE
8182 5A         LD E,D
8183 0E02       LD C,02
8185 CD0580     CALL FCALL
8188 D1         POP DE
8189 0E02       LD C,02
818B CD0580     CALL FCALL
818E C9         RET
              ;
818F 657272   ERRMSG:"err"
8192 24         DB 24;$
              ;
ADP          =811F  B2HEX1       =813F  B2HEX2       =8130  
B2HEX4       =812A  B2HEXDP      =8176  CRLF         =8113  
DEDP         =8181  ERRMSG       =818F  FCALL        =8005  
HEX4DP       =8165  HTOB1        =8149  HTOB1_1      =8160  
HTOB1_2      =8162  SPDP         =811D  

●FTST15.COMのセーブ

いつものようにログファイルで説明をいたします。
ZB3BASICにエントリして、
/LD FTST15.BIN,8100[Enter]
を実行します。
そのあと
JP D233[Enter]
でCP/Mを起動し、
save 1 ftst15.com[Enter]
と入力し、FTST15.COMというファイル名でAドライブにセーブしました。
そのあとDIRコマンドを実行して、FTST15.COMがセーブされたことを確認しました。

logfile nd80zlog\04122159.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst15.bin,8100
loading FTST15.BIN ...0093(147)bytes loaded,from 8100 to 8192
>jp d233

a>save 1 ftst15.com
a>dir
A: FNC0E-1  COM : FTST10   COM : FTST10-2 COM : FTST10-4 COM
A: FTST10-5 COM : FTST11   COM : FTST12   COM : FTST13   COM
A: FTST14   COM : FTST15   COM
a>

●FTST15.COMの実行

FTST15[Enter]
と入力して、FTST15.COMを実行しました。

a>ftst15
B884
FFE0
a>

B884に続いてFFE0が表示されました。
カレントドライブはAドライブです。
Aドライブのアローケーションベクトルのアドレスは[第83回]で定義しました。
ALV00 EQU 0B884H
です。
FTST15.COMを実行した結果はその通りに表示されました。
そしてそのアローケーションベクトルの中味はFFE0と表示されました。

Aドライブのブロック数は12で、1ブロックを1ビットで示したものがアローケーションベクトルですから、
それがFFE0ということは、
11111111 1110 (下位4ビットは使われません)
です。

さきほど実行したDIRコマンドによって、Aドライブには10ファイルがセーブされていることがわかりました。
1ファイルには少なくとも1ブロックが使われます。
またディレクトリにも1ブロックが割り当てられていますから、合計11ブロックです。

おお。
正しい結果が得られているようです。
アローケーションベクトルの値を確認すると、空きエリアはわずか1ブロックであることがわかります。

今度はカレントドライブをBドライブにして、同じことを実行してみます。

a>b:
b>a:ftst15
B88A
E000
b>dir
B: TEST     COM : TEST1    COM
b>

a>b:[Enter]
と入力して、カレントドライブをBドライブにしました。
それから、
a:ftst15[Enter]
と入力してFTST15.COMを実行した結果、
B88Aに続いてE000が表示されました。

Bドライブのアローケーションベクトルのアドレスも[第83回]で定義しました。
ALV01 EQU 0B88AH
です。
FTST15.COMを実行した結果はその通りに表示されました。
そしてそのアローケーションベクトルの中味はE000と表示されました。
11100000 0000 (下位4ビットは使われません)
です。

DIRコマンドを実行して、Bドライブのディレクトリを表示させました。
Bドライブには2ファイルがセーブされています。
1ファイルには少なくとも1ブロックが使われます。
またディレクトリにも1ブロックが割り当てられていますから、合計3ブロックです。
こちらも正しい結果が得られたようです。

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

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