復活!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.? |