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

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
|
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> |
a>ftst10-4 drvno.?a FNC0E-1.COM FTST10.COM FTST10-2.COM FTST10-4.COM end drvno.?b FNC0E-0.COM end drvno.? |