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

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

[第109回]


●ファンクションコール23H(ファイルサイズの取得)

ファンクションコール23Hは、ファイルサイズを取得してFCBエリアの末尾3バイトに入れます。
シーケンシャルファイルもランダムファイルもどちらも読み出せます。

●テストプログラムFTST22.TXT

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

; BDOS TEST22 function23 file size get
;2012/3/4 3/7 4/16 4/17 4/27
;
        ORG $8100
        FCALL=$8005
        NMBRTBL=$8300
        FCB=$805C
        FCBR0=$807D
        FCBR1=$807E
        FCBR2=$807F
        DMA=$8080
;
        LD C,0F;open file
        LD DE,FCB
        CALL FCALL
        INC A;if FFH?
        JP Z,OPENERR
;
        LD C,23;file size read
        LD DE,FCB
        CALL FCALL
;
        LD A,(FCBR2)
        CALL B2HEXDP
        CALL SPDP
        LD A,(FCBR1)
        CALL B2HEXDP
        CALL SPDP
        LD A,(FCBR0)
        CALL B2HEXDP
        CALL CRLF
        LD DE,OK
        JP MSGOUT
;
OPENERR:LD DE,CANTOPN
MSGOUT:LD C,09
        CALL FCALL
        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
;
CANTOPN:"can'"
        "t op"
        "en!"
        DB 0D
        DB 0A
        DB 24;$
OK:"end"
        DB 0D
        DB 0A
        DB 24;$
;

ファイルサイズの取得も、基本的にはシーケンシャルファイルの読み出しと同じ手順です。
シーケンシャルファイルの読み出しは[第46回]で説明をしました。
最初にファイル名情報が書き込まれたFCBを指定してファイルをオープンします。
ファイルオープンはファンクションコール0FHです。

DEレジスタにFCBエリアの先頭アドレスを入れて、Cレジスタに23Hを入れて、システムをコールします。
ファイルサイズはFCBエリアの末尾3バイト(アドレス807D〜807F。本来は007D〜007F)に入ります。
ここはランダムファイルのリード、ライトでレコードb指定するのにも使うエリアです。
807Dが最下位バイト(テストプログラムではFCBR0という変数名にしました)、807Eが中位バイト(テストプログラムではFCBR1という変数名にしました)、807Fが最上位バイト(テストプログラムではFCBR0という変数名にしました)です。

今回は読み出された3バイトの値を上位、中位、下位の順にそのまま16進数で表示します。
16進数で表示するためのサブルーチンは[第42回]で作ったメモリダンププログラムのものをそのままコピーして使いました。

●テストプログラムFTST22.TXTのアセンブル

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

2012/4/27  18:  ftst22.txt
END=81CD
              ; BDOS TEST22 function23 file size get
              ;2012/3/4 3/7 4/16 4/17 4/27
              ;
                      ORG $8100
                      FCALL=$8005
                NMBRTBL=$8300
                      FCB=$805C
                FCBR0=$807D
                FCBR1=$807E
                FCBR2=$807F
                      DMA=$8080
              ;
8100 0E0F             LD C,0F;open file
8102 115C80           LD DE,FCB
8105 CD0580           CALL FCALL
8108 3C               INC A;if FFH?
8109 CA3581           JP Z,OPENERR
              ;
810C 0E23       LD C,23;file size read
810E 115C80     LD DE,FCB
8111 CD0580     CALL FCALL
              ;
8114 3A7F80           LD A,(FCBR2)
8117 CDA181     CALL B2HEXDP
811A CD4881     CALL SPDP
811D 3A7E80     LD A,(FCBR1)
8120 CDA181     CALL B2HEXDP
8123 CD4881     CALL SPDP
8126 3A7D80     LD A,(FCBR0)
8129 CDA181     CALL B2HEXDP
812C CD3E81     CALL CRLF
812F 11C881     LD DE,OK
8132 C33881     JP MSGOUT
              ;
8135 11BA81   OPENERR:LD DE,CANTOPN
8138 0E09     MSGOUT:LD C,09
813A CD0580           CALL FCALL
813D C9               RET
              ;
              ;CL & LF
813E 3E0D     CRLF:LD A,0D
8140 CD4A81     CALL ADP
8143 3E0A       LD A,0A
8145 C34A81     JP ADP
              ;space disp
8148 3E20     SPDP:LD A,20
              ;A disp
814A C5       ADP:PUSH BC
814B E5         PUSH HL
814C 5F         LD E,A
814D 0E02       LD C,02
814F CD0580     CALL FCALL
8152 E1         POP HL
8153 C1         POP BC
8154 C9         RET
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
8155 7C       B2HEX4:LD A,H
8156 CD5B81     CALL B2HEX2
8159 EB         EX DE,HL
815A 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
815B F5       B2HEX2:PUSH AF
815C 0F         RRCA
815D 0F         RRCA
815E 0F         RRCA
815F 0F         RRCA
8160 CD6A81     CALL B2HEX1
8163 57         LD D,A
8164 F1         POP AF
8165 CD6A81     CALL B2HEX1
8168 5F         LD E,A
8169 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
816A E60F     B2HEX1:AND 0F
816C C630       ADD A,30
816E FE3A       CP 3A
8170 D8         RET C;0-9
8171 C607       ADD A,07;A-F
8173 C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
8174 FE30     HTOB1:CP 30;>="0"?
8176 D8         RET C;no
8177 FE3A       CP 3A;<="9"?
8179 DA8D81     JP C,HTOB1_2;yes,"0" to "9"
817C FE41       CP 41;>="A" ?
817E D8         RET C;no
817F FE47       CP 47;<="F"?
8181 DA8B81     JP C,HTOB1_1
8184 FE61       CP 61;>="a"?
8186 D8         RET C;no
8187 FE67       CP 67;<="f"?
8189 3F         CCF
818A D8         RET C;no
818B C609     HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
818D E60F     HTOB1_2:AND 0F
818F C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
8190 C5       HEX4DP:PUSH BC
8191 E5         PUSH HL
8192 CD5581     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
8195 D5         PUSH DE
8196 EB         EX DE,HL
8197 CDAC81     CALL DEDP
819A D1         POP DE
819B CDAC81     CALL DEDP
819E E1         POP HL
819F C1         POP BC
81A0 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
81A1 C5       B2HEXDP:PUSH BC
81A2 E5         PUSH HL
81A3 CD5B81     CALL B2HEX2
81A6 CDAC81     CALL DEDP
81A9 E1         POP HL
81AA C1         POP BC
81AB C9         RET
              ;
              ;DE(asckii 2bytes) disp
81AC D5       DEDP:PUSH DE
81AD 5A         LD E,D
81AE 0E02       LD C,02
81B0 CD0580     CALL FCALL
81B3 D1         POP DE
81B4 0E02       LD C,02
81B6 CD0580     CALL FCALL
81B9 C9         RET
              ;
81BA 63616E27 CANTOPN:"can'"
81BE 74206F70         "t op"
81C2 656E21           "en!"
81C5 0D               DB 0D
81C6 0A               DB 0A
81C7 24               DB 24;$
81C8 656E64   OK:"end"
81CB 0D               DB 0D
81CC 0A               DB 0A
81CD 24               DB 24;$
              ;
ADP          =814A  B2HEX1       =816A  B2HEX2       =815B  
B2HEX4       =8155  B2HEXDP      =81A1  CANTOPN      =81BA  
CRLF         =813E  DEDP         =81AC  DMA          =8080  
FCALL        =8005  FCB          =805C  FCBR0        =807D  
FCBR1        =807E  FCBR2        =807F  HEX4DP       =8190  
HTOB1        =8174  HTOB1_1      =818B  HTOB1_2      =818D  
MSGOUT       =8138  NMBRTBL      =8300  OK           =81C8  
OPENERR      =8135  SPDP         =8148  

●プログラムのセーブと実行

ZB3BASICで、
/ld ftst22.bin,8100[Enter]
と入力して、FTST22.BINを8100にロードしてから、
jp d233[Enter]
でCP/Mを起動しました。

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst22.bin,8100
loading FTST22.BIN ...00ce(206)bytes loaded,from 8100 to 81CD
>jp d233

a>b:
b>dir
B: TEST     RAF : FTST21   COM
b>era ftst21.com
b>save 1 ftst22.com
b>ftst22 a:test.raf
00 03 B7
end

b>ftst22 test.raf
00 03 B7
end

b>

Aドライブには空きがありませんから、テストプログラムはBドライブにセーブします。
a>b:[Enter]
と入力してカレントドライブをBドライブにします。
実はBドライブにも空きはありません。
そこでまず前回使ったFTST21.COMを削除してから、FTST22.COMをセーブしました。

ftst22 a:test.raf[Enter]
と入力して、AドライブのランダムアクセスファイルTEST.RAFのファイルサイズを取得しました。

そのあと続いて
ftst22 test.raf[Enter]
と入力して、BドライブのランダムアクセスファイルTEST.RAFのファイルサイズを取得しました。

どちらの場合も、ファイルサイズは0003B7と表示されました。
ファイルサイズはセクタ数で示されます。
TEST.RAFは使用セクタ数が03B7H(951)である、と表示されました。
間違いではないか、と思えるほど大きな値です。
どういうことなのか、考えてみたいと思います。

下は[第106回]で作成したレコードcfータです。
そのうちの最大のb着色して示します。

01A2
03B5
009E
0044
03B6
01A7
009F
0044
03B3
01A5
0098
0042
FFFF

最大のレコードbヘ03B6Hです。
レコードbヘ0000から始まりますから、このレコードcfータを読み込んで作成されたランダムファイルのファイルサイズが、最大のレコードa{1と同じ、ということは、0000からその最大のレコードbワでが隙間無く作成されたシーケンシャルファイルと同じファイルサイズであるということになります。
実際はTEST.RAFは1ブロック8セクタのブロックを4ブロック使っただけですから、本当のファイルサイズは32セクタに過ぎません。

このようにランダムファイルは実際の使用セクタサイズよりも大きなサイズとして認識されることがありますが、それはそういう仕組みになっているためで、決して間違っているわけではありません。

ところで普通のシーケンシャルファイルの場合はどのように表示されるでしょうか?
AドライブのFTST20−2.COMと、BドライブのFTST22.COMのファイルサイズを表示してみました。

b>ftst22 a:ftst20-2.com
00 00 02
end

b>ftst22 ftst22.com
00 00 02
end

b>

どちらも実際のサイズである2(セクタ)と表示されました。

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

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