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

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

[第65回]

●ファイルサーチ(ファンクションコール11H&12H)

今回はファイルサーチのファンクションコールについて説明をします。
ファンクションコール11Hは「最初の」ファイルサーチです。
ファンクションコール12Hは「次の」ファイルサーチです。
ファイル名を指定して、ディレクトリから同じファイル名を抽出します。
「最初のファイルサーチ」はディレクトリの先頭からサーチします。
「次のファイルサーチ」は、その前に実行した「最初のファイルサーチ」または「次のファイルサーチ」で見つけたファイル名の次からサーチします。

ファンクションコール11H及び12Hを使ったテストプログラムです。
ソースプログラムリストです。

; BDOS TEST10 filename search   function11,12
;2012/3/19
;
        ORG $8100
        FCALL=$8005
        FCB=$805C
        DMA=$8080
;
        LD C,11;first file search
        LD DE,FCB
        CALL FCALL
        CP FF
        JP Z,NOFILE
;       
        LD HL,DMA
        LD DE,$0020
        OR A;dirctory code 00-03
LOOP1:  JP Z,NMDISP
        ADD HL,DE
        DEC A
        JP LOOP1
NMDISP:INC HL;pass drive no.
        LD B,08
NMDISP2:LD A,(HL)
        CP 20
        JP Z,NMDISP3
        CALL ADP
NMDISP3:INC HL
        DEC B
        JP NZ,NMDISP2
        LD A,2E;"."
        CALL ADP
        LD B,03
NMDISP4:LD A,(HL)
        CALL ADP
        INC HL
        DEC B
        JP NZ,NMDISP4
        CALL CRLF
;next file search
        LD C,12;next file search
        LD DE,FCB
        CALL FCALL
        CP FF
        JP Z,END
        LD HL,DMA
        LD DE,$0020
        OR A;dirctory code 00-03
NXTSRCH:JP Z,NMDISP
        ADD HL,DE
        DEC A
        JP NXTSRCH
;
NOFILE:LD DE,NFMSG
        JP MSGDP        
;
END:LD DE,ENDMSG
MSGDP: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
;
NFMSG:"not "
        "foun"
        "d"
        DB 24;$
ENDMSG:"end"
        DB 24;$
;

下はアセンブルリストです。

2012/3/19  21:48  ftst10.txt
END=818F
              ; BDOS TEST10 filename search   function11,12
              ;2012/3/19
              ;
                        ORG $8100
                        FCALL=$8005
                FCB=$805C
                DMA=$8080
              ;
8100 0E11       LD C,11;first file search
8102 115C80     LD DE,FCB
8105 CD0580     CALL FCALL
8108 FEFF       CP FF
810A CA5C81     JP Z,NOFILE
              ; 
810D 218080     LD HL,DMA
8110 112000     LD DE,$0020
8113 B7         OR A;dirctory code 00-03
8114 CA1C81   LOOP1:    JP Z,NMDISP
8117 19         ADD HL,DE
8118 3D         DEC A
8119 C31481     JP LOOP1
811C 23       NMDISP:INC HL;pass drive no.
811D 0608       LD B,08
811F 7E       NMDISP2:LD A,(HL)
8120 FE20       CP 20
8122 CA2881     JP Z,NMDISP3
8125 CD7781     CALL ADP
8128 23       NMDISP3:INC HL
8129 05         DEC B
812A C21F81     JP NZ,NMDISP2
812D 3E2E       LD A,2E;"."
812F CD7781     CALL ADP
8132 0603       LD B,03
8134 7E       NMDISP4:LD A,(HL)
8135 CD7781     CALL ADP
8138 23         INC HL
8139 05         DEC B
813A C23481     JP NZ,NMDISP4
813D CD6B81     CALL CRLF
              ;next file search
8140 0E12       LD C,12;next file search
8142 115C80     LD DE,FCB
8145 CD0580     CALL FCALL
8148 FEFF       CP FF
814A CA6281     JP Z,END
814D 218080     LD HL,DMA
8150 112000     LD DE,$0020
8153 B7         OR A;dirctory code 00-03
8154 CA1C81   NXTSRCH:JP Z,NMDISP
8157 19         ADD HL,DE
8158 3D         DEC A
8159 C35481     JP NXTSRCH
              ;
815C 118281   NOFILE:LD DE,NFMSG
815F C36581     JP MSGDP        
              ;
8162 118C81   END:LD DE,ENDMSG
8165 0E09     MSGDP:LD C,09
8167 CD0580     CALL FCALL
816A C9         RET
              ;
              ;CL & LF
816B 3E0D     CRLF:LD A,0D
816D CD7781     CALL ADP
8170 3E0A       LD A,0A
8172 C37781     JP ADP
              ;space disp
8175 3E20     SPDP:LD A,20
              ;A disp
8177 C5       ADP:PUSH BC
8178 E5         PUSH HL
8179 5F         LD E,A
817A 0E02       LD C,02
817C CD0580     CALL FCALL
817F E1         POP HL
8180 C1         POP BC
8181 C9         RET
              ;
8182 6E6F7420 NFMSG:"not "
8186 666F756E   "foun"
818A 64         "d"
818B 24         DB 24;$
818C 656E64   ENDMSG:"end"
818F 24         DB 24;$
              ;
ADP          =8177  CRLF         =816B  DMA          =8080  
END          =8162  ENDMSG       =818C  FCALL        =8005  
FCB          =805C  LOOP1        =8114  MSGDP        =8165  
NFMSG        =8182  NMDISP       =811C  NMDISP2      =811F  
NMDISP3      =8128  NMDISP4      =8134  NOFILE       =815C  
NXTSRCH      =8154  SPDP         =8175  

●プログラムの説明

サーチするファイル名はコマンド(プログラム名)を入力するときにパラメータとして与えます。
第1パラメータとして与えたファイル名はFCBエリアの805CH(本来は005CH)以後に入れられます([第45回])。

ファンクションコール11H及び12HはDEレジスタに検索元のファイル名情報の入ったFCBアドレスを指定してコールします。
指定したファイルがみつからなかったときはAレジスタにFFが入ります。
指定したファイルがみつかったときは、デフォルトのDMAエリア(通常は8080H〜80FFH。本来は0080H〜00FFH)に、そのファイルのFCBが含まれるディレクトリセクタ128バイトが読み込まれます。
ディレクトリの1セクタには4つのFCBが入れられますから、その何番目に目的のファイルのFCBがあるかを示す数値(00〜03)がAレジスタに入ります。

プログラムではファンクションコール11Hおよび12Hの実行の結果得られたAレジスタの値をもとに、目的のファイルのFCBがある位置が、ディレクトリバッファ(8080H〜80FFH)の先頭、32バイト目、64バイト目、96バイト目のいずれであるかを算出します。
FCBの先頭バイトにはドライブo報がありますが、今回はそれは省略することにしてスキップします。
次からの8バイトにファイル名があります。
ファイル名が8バイトに満たないときは8バイトになるまで後にスペースが入れられます。
そのあと続いてエクステント(拡張子)3バイトがあります。
今回のプログラムではみつかったファイル名を表示するのに、ファイル名の余分なスペースは表示させないようにするとともに、ファイル名と拡張子の間に .(ピリオド)を表示するようにしました。

●FTST10.TXTのアセンブル画面です

FTST10.TXTをZASM.COMでアセンブルしたあと、ZB3[Enter]でND80ZVとUSB接続しました。


この後はいつものように、ログファイルで説明をします。

logfile nd80zlog\03192148.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst10.bin,8100
loading FTST10.BIN ...0090(144)bytes loaded,from 8100 to 818F
>jp d233

a>save 1 ftst10.com
a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM : FILL00   BIN : FTST7    COM
A: FTST8    COM : FTST9    COM : FTST10   COM
a>ftst10 copy.com
COPY.COM
end
a>ftst10 ftest*.*
FTEST1.COM
FTEST2.COM
FTEST4.COM
FTEST4-1.TXT
FTEST4-2.COM
FTEST4-3.COM
end
a>ftst10 c?p*.*
COPY.COM
CMP.COM
end
a>^D>a>^D>

ERR:23 
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Mon Mar 19 21:53:38 2012

/LDコマンドでFTST10.BINを8100Hにロードしました。
そのあと、
JP D233[Enter]
でCP/Mを起動しました。

SAVE 1 FTST10.COM[Enter]
と入力して、8100HからのプログラムをFTST10.COMの名前でRAMディスクに保存したあと、DIRコマンドで確認をしています。

FTST10 COPY.COM[Enter]
と入力してみました。
COPY.COMが発見されました。

次はワイルドカード(*)を使ってみました。
FTST10 FTEST*.*[Enter]
と入力しました。
FTESTで始まるファイルがリストアップされました。

次に?を使ってみました。
FTST10 C?P*.*[Enter]
と入力しました。
C□P….…
というファイルがリストアップされました。

いま気が付いたのですけれど、これってSEARCHというファイル名にしたほうがよいのでは?
そのように名前を変更しました。

logfile nd80zlog\03192158.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>jp d233

a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM : FILL00   BIN : FTST7    COM
A: FTST8    COM : FTST9    COM : FTST10   COM
a>ren search.com=ftst10.com
a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM : FILL00   BIN : FTST7    COM
A: FTST8    COM : FTST9    COM : SEARCH   COM
a>search ftst*.*
FTST7.COM
FTST8.COM
FTST9.COM
end
a>^D>a>^D>

ERR:23 
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Mon Mar 19 21:59:19 2012

おお。
確かに、このほうがいいですねえ。

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

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