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

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

[第88回]

●ファンクションコール0E(3) DIR表示

今回は[第85回]およびその前の回で使っておりますファンクションコール0EのテストプログラムFTST10−2に少し手を加えてみたいと思います。

FTST10−2はもともとファイル名の検索機能を試すためのもの(ファンクションコール11H、12Hのテスト)ですから、入力パラメータとして、検索ファイル名が必要です。
しかしこのところやっておりますテストはファンクションコール0Eを試すもので、ファイル名を検索する必要はありません。
指定したドライブがカレントドライブになったことがわかるように、ディレクトリの中味が表示されればよいのですから、それで簡便な方法として、入力パラメータのファイル名にはワイルドカードを使って’*.*’としました。

その結果表示されるファイル名の一覧は、DIRコマンドを実行したときと同じになります(表記の仕方は異なりますが)。
それならいっそのこと、ファイル名を入力しなくても、*.*を入力したのと同じ動作をするようにできれば、DIRコマンドのプログラムになります。
いずれCP/MのCCP(Console Command Processor)部分もオリジナルプログラムとして書き直さなくてはなりませんから、ここでDIRプログラムを書くことは、無駄ではありません。
そのように思いつきましたから、FTST10−2.TXTを手直しすることにいたしました。

ところで、
FTST10−2 *.*[Enter]
を実行したとき、入力したパラメータ部分が置かれる805CH(本来は005CH)から後のFCBエリアには、どのような文字列が書き込まれるのでしょうか?
それがわかれば、プログラム内でFCBエリアにそれと同じ文字列を書き込むことで、パラメータの’*.*’を省略できるはずです。

そこで、
FTST10−2 *.*[Enter]
と入力して、そのあとすぐにCtrl−Zでブレイクし、それからCP/Mを終了してZB3BASICに戻りました。



上の画面の説明です。
drvno?
の表示で[Ctrl][z]を入力しました。
ブレイクして、
a>が表示されました。
そこですぐに[Ctrl][d]を入力しました。
^Dは[Ctrl][d]が入力されたことを示しています。
Ctrl−D(本来はCtrl−C)を入力すると、CP/Mが終了して、
end of CP/M
と表示されたあと、ZB3BASICに戻ります。
>だけが表示され、そこでは普通にZB3BASICのコマンドを入力して実行することができます。
dm 8050,806f[Enter]
と入力して、FCBエリア(805C〜)近辺を表示させました(FCBエリアは、本来は005C〜です)。
ファイル名部分は805DH〜8067H(本来は005DH〜0067H)の11バイトです(名前8バイト+拡張子3バイト)。

おお。
その全てが3Fになっています。
右側のASCIIダンプを見ていただけるとわかりますように、コード3Fは’?’です。
’?’は一文字を置き換える「ワイルドカード」です。
ワイルドカードについては[第85回]で説明をいたしました。
なるほど。
そういう仕組みになっていたのですね。
納得です。

下はFTST10−2.TXTをそのように変更して作成したFTST10−4.TXTのソースリストです。
変更前のFTST10−2.TXTは[第85回]にあります。
FTST10−2.TXTの先頭に、FCBエリアのファイル名+拡張子部分を3FHで埋めるところを追加しました。
LD HL,FCBからJP NZ,FILL3Fまでの部分です。

; BDOS TEST10 filename search   function0e,11,12
;2012/3/19 4/4 
; 4/7 4/9 dir disp
;
        ORG $8100
        FCALL=$8005
        FCB=$805C
        DMA=$8080
;
        LD HL,FCB
        INC HL
        LD A,(HL)
        CP 20;no fcb data
        JP NZ,LOOP
        LD B,0B;=11
        LD A,3F;'?'
FILL3F:LD (HL),A
        INC HL
        DEC B
        JP NZ,FILL3F
LOOP:LD DE,INPMSG
        CALL MSGDP
        LD C,01
        CALL FCALL
        CP 1A;^z
        RET Z
        CP 30
        JP Z,DNOPASS
        AND 0F
        DEC A
        LD E,A
        LD C,0E
        CALL FCALL
DNOPASS:CALL CRLF
        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
        CALL MSGDP
        JP LOOP 
;
END:LD DE,ENDMSG
        CALL MSGDP
        JP LOOP
;
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
;
INPMSG:"drvn"
        "o."
        DB 3F;?
        DB 24;$
NFMSG:"not "
        "foun"
        "d"
        DB 0D
        DB 0A
        DB 24;$
ENDMSG:"end"
        DB 0D
        DB 0A
        DB 24;$
;

追加部分の説明です。
最初にFCB+1の値が20Hかどうかを確認しています。
入力パラメータを省略した場合にFCBエリアにどのような値が入れられるのかについては、まだ説明をしていませんでした。
入力パラメータを省略すると、FCBエリアのファイル名+拡張子部分には、20Hが入れられます。

そのことを確認するために、プログラム変更前のFTST10−2.COMをパラメータをつけずに入力してみました。
そのあと、Ctrl−Zでブレイクし、Ctrl−DでCP/Mを終了しました。
DMコマンドでFCBエリア近辺を表示させてみました。



ファイル名+拡張子のエリア(805DH〜8067H、本来は005DH〜0067H)には全て20H(スペースの文字コード)が入っています。

ということで、変更したプログラムの先頭で、アドレス805DHの値が20Hかどうかを確認しているのです。
DIRコマンドはパラメータとしてファイル名を指定すると、ファイル検索を行ないます。
そのことを考慮して、ファイル名が指定されているか、それとも省略されているかを区別するために、20Hのチェックを行なっているのです。

ファイル名が指定されている(コード20Hではない)場合は、もとのプログラムと同じで、そのままLOOP:にジャンプします。
ファイル名が省略されている(コード20H)場合には、ファイル名+拡張子のエリアを3FHで埋めてから、LOOP:を実行します。

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

2012/4/9  10:10  ftst10-4.txt
END=81D7
              ; BDOS TEST10 filename search   function0e,11,12
              ;2012/3/19 4/4 
              ; 4/7 4/9 dir disp
              ;
                        ORG $8100
                        FCALL=$8005
                FCB=$805C
                DMA=$8080
              ;
8100 215C80     LD HL,FCB
8103 23         INC HL
8104 7E         LD A,(HL)
8105 FE20       CP 20;no fcb data
8107 C21481     JP NZ,LOOP
810A 060B       LD B,0B;=11
810C 3E3F       LD A,3F;'?'
810E 77       FILL3F:LD (HL),A
810F 23         INC HL
8110 05         DEC B
8111 C20E81     JP NZ,FILL3F
8114 11BE81   LOOP:LD DE,INPMSG
8117 CDA181     CALL MSGDP
811A 0E01       LD C,01
811C CD0580     CALL FCALL
811F FE1A       CP 1A;^z
8121 C8         RET Z
8122 FE30       CP 30
8124 CA3081     JP Z,DNOPASS
8127 E60F       AND 0F
8129 3D         DEC A
812A 5F         LD E,A
812B 0E0E       LD C,0E
812D CD0580     CALL FCALL
8130 CDA781   DNOPASS:CALL CRLF
8133 0E11       LD C,11;first file search
8135 115C80     LD DE,FCB
8138 CD0580     CALL FCALL
813B FEFF       CP FF
813D CA8F81     JP Z,NOFILE
              ; 
8140 218080     LD HL,DMA
8143 112000     LD DE,$0020
8146 B7         OR A;dirctory code 00-03
8147 CA4F81   LOOP1:    JP Z,NMDISP
814A 19         ADD HL,DE
814B 3D         DEC A
814C C34781     JP LOOP1
814F 23       NMDISP:INC HL;pass drive no.
8150 0608       LD B,08
8152 7E       NMDISP2:LD A,(HL)
8153 FE20       CP 20
8155 CA5B81     JP Z,NMDISP3
8158 CDB381     CALL ADP
815B 23       NMDISP3:INC HL
815C 05         DEC B
815D C25281     JP NZ,NMDISP2
8160 3E2E       LD A,2E;"."
8162 CDB381     CALL ADP
8165 0603       LD B,03
8167 7E       NMDISP4:LD A,(HL)
8168 CDB381     CALL ADP
816B 23         INC HL
816C 05         DEC B
816D C26781     JP NZ,NMDISP4
8170 CDA781     CALL CRLF
              ;next file search
8173 0E12       LD C,12;next file search
8175 115C80     LD DE,FCB
8178 CD0580     CALL FCALL
817B FEFF       CP FF
817D CA9881     JP Z,END
8180 218080     LD HL,DMA
8183 112000     LD DE,$0020
8186 B7         OR A;dirctory code 00-03
8187 CA4F81   NXTSRCH:JP Z,NMDISP
818A 19         ADD HL,DE
818B 3D         DEC A
818C C38781     JP NXTSRCH
              ;
818F 11C681   NOFILE:LD DE,NFMSG
8192 CDA181     CALL MSGDP
8195 C31481     JP LOOP 
              ;
8198 11D281   END:LD DE,ENDMSG
819B CDA181     CALL MSGDP
819E C31481     JP LOOP
              ;
81A1 0E09     MSGDP:LD C,09
81A3 CD0580     CALL FCALL
81A6 C9         RET
              ;
              ;CL & LF
81A7 3E0D     CRLF:LD A,0D
81A9 CDB381     CALL ADP
81AC 3E0A       LD A,0A
81AE C3B381     JP ADP
              ;space disp
81B1 3E20     SPDP:LD A,20
              ;A disp
81B3 C5       ADP:PUSH BC
81B4 E5         PUSH HL
81B5 5F         LD E,A
81B6 0E02       LD C,02
81B8 CD0580     CALL FCALL
81BB E1         POP HL
81BC C1         POP BC
81BD C9         RET
              ;
81BE 6472766E INPMSG:"drvn"
81C2 6F2E       "o."
81C4 3F         DB 3F;?
81C5 24         DB 24;$
81C6 6E6F7420 NFMSG:"not "
81CA 666F756E   "foun"
81CE 64         "d"
81CF 0D         DB 0D
81D0 0A         DB 0A
81D1 24         DB 24;$
81D2 656E64   ENDMSG:"end"
81D5 0D         DB 0D
81D6 0A         DB 0A
81D7 24         DB 24;$
              ;
ADP          =81B3  CRLF         =81A7  DMA          =8080  
DNOPASS      =8130  END          =8198  ENDMSG       =81D2  
FCALL        =8005  FCB          =805C  FILL3F       =810E  
INPMSG       =81BE  LOOP         =8114  LOOP1        =8147  
MSGDP        =81A1  NFMSG        =81C6  NMDISP       =814F  
NMDISP2      =8152  NMDISP3      =815B  NMDISP4      =8167  
NOFILE       =818F  NXTSRCH      =8187  SPDP         =81B1  

●FTST10−4.COMのセーブと実行

いつものようにログファイルで説明をいたします。
ZB3BASICにエントリして、
/LD FTST10−4.BIN,8100[Enter]
を実行します。
そのあと
JP D233[Enter]
でCP/Mを起動します。

logfile nd80zlog\04091012.txt open

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

a>save 1 ftst10-4.com
a>dir
A: FNC0E-1  COM : FTST10   COM : FTST10-2 COM : FTST10-4 COM
a>

CP/Mを起動したあと、
SAVE 1 FTST10−4.COM[Enter]
を実行して、FTST10−4.COMというファイル名でAドライブにセーブしました。
DIRコマンドを実行して、セーブされたことを確認しました。

FTST10−4.COMを実行します。

a>ftst10-4
drvno.?a
FNC0E-1.COM
FTST10.COM
FTST10-2.COM
FTST10-4.COM
end
drvno.?b
FNC0E-0.COM
end
drvno.?

パラメータをつけずに、
ftst10−4[Enter]
と入力しました。

drvno.?の表示に

と入力しました。
Aドライブにセーブされているファイル名が表示され、最後にendと表示されました。

次のdrvno?の表示には
bと入力しました。
今度はBドライブにセーブされているファイル名が表示されて、最後にendと表示されました。

これで表示を整えれば、DIRプログラムの出来あがりです(その作業は今は行ないません)。

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

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