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

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

[第85回]


●ファンクションコール0Eテストプログラム(2)

前回からの続きです。
ファンクションコール0Eは、デフォルトのドライブ(カレントドライブ?)を変更するための機能のはずなのですが、簡単なプログラムを作って試してみたところ、プログラムの実行前と後とでカレントドライブは変更されませんでした。
そこで今回はもう少しましなプログラムを書いて、テストをしてみることにいたします。

[第65回]で作ったファイル名サーチプログラム(FTST10.TXT)をもとにして、そこにファンクションコール0Eを追加しました。

下はそのようにして作ったプログラム(FTST10−2.TXT)のソースリストです。
FTST10.TXTの先頭にドライブb入力する部分を追加しました。
LOOP:からDNOPASS:までです。

; BDOS TEST10 filename search   function0e,11,12
;2012/3/19 4/4
;
        ORG $8100
        FCALL=$8005
        FCB=$805C
        DMA=$8080
;
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;$
;

ドライブbヘA、B、C…またはa、b、c…を入力します。
a、b、c…の代わりに1、2、3…を入力することもできます。
入力した文字コードの下位4ビットの値−1がドライブbノなります。
その値をEレジスタに入れてファンクションコール0Eが実行されます。

Ctrl−Zの入力でブレイクします。
また0を入力すると、現在選択されているカレントディスクのまま次の処理に進みます。
入力のためのINPMSG:を追加しました。

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

2012/4/4  23:3  ftst10-2.txt
END=81C3
              ; BDOS TEST10 filename search   function0e,11,12
              ;2012/3/19 4/4
              ;
                        ORG $8100
                        FCALL=$8005
                FCB=$805C
                DMA=$8080
              ;
8100 11AA81   LOOP:LD DE,INPMSG
8103 CD8D81     CALL MSGDP
8106 0E01       LD C,01
8108 CD0580     CALL FCALL
810B FE1A       CP 1A;^z
810D C8         RET Z
810E FE30       CP 30
8110 CA1C81     JP Z,DNOPASS
8113 E60F       AND 0F
8115 3D         DEC A
8116 5F         LD E,A
8117 0E0E       LD C,0E
8119 CD0580     CALL FCALL
811C CD9381   DNOPASS:CALL CRLF
811F 0E11       LD C,11;first file search
8121 115C80     LD DE,FCB
8124 CD0580     CALL FCALL
8127 FEFF       CP FF
8129 CA7B81     JP Z,NOFILE
              ; 
812C 218080     LD HL,DMA
812F 112000     LD DE,$0020
8132 B7         OR A;dirctory code 00-03
8133 CA3B81   LOOP1:    JP Z,NMDISP
8136 19         ADD HL,DE
8137 3D         DEC A
8138 C33381     JP LOOP1
813B 23       NMDISP:INC HL;pass drive no.
813C 0608       LD B,08
813E 7E       NMDISP2:LD A,(HL)
813F FE20       CP 20
8141 CA4781     JP Z,NMDISP3
8144 CD9F81     CALL ADP
8147 23       NMDISP3:INC HL
8148 05         DEC B
8149 C23E81     JP NZ,NMDISP2
814C 3E2E       LD A,2E;"."
814E CD9F81     CALL ADP
8151 0603       LD B,03
8153 7E       NMDISP4:LD A,(HL)
8154 CD9F81     CALL ADP
8157 23         INC HL
8158 05         DEC B
8159 C25381     JP NZ,NMDISP4
815C CD9381     CALL CRLF
              ;next file search
815F 0E12       LD C,12;next file search
8161 115C80     LD DE,FCB
8164 CD0580     CALL FCALL
8167 FEFF       CP FF
8169 CA8481     JP Z,END
816C 218080     LD HL,DMA
816F 112000     LD DE,$0020
8172 B7         OR A;dirctory code 00-03
8173 CA3B81   NXTSRCH:JP Z,NMDISP
8176 19         ADD HL,DE
8177 3D         DEC A
8178 C37381     JP NXTSRCH
              ;
817B 11B281   NOFILE:LD DE,NFMSG
817E CD8D81     CALL MSGDP
8181 C30081     JP LOOP 
              ;
8184 11BE81   END:LD DE,ENDMSG
8187 CD8D81     CALL MSGDP
818A C30081     JP LOOP
              ;
818D 0E09     MSGDP:LD C,09
818F CD0580     CALL FCALL
8192 C9         RET
              ;
              ;CL & LF
8193 3E0D     CRLF:LD A,0D
8195 CD9F81     CALL ADP
8198 3E0A       LD A,0A
819A C39F81     JP ADP
              ;space disp
819D 3E20     SPDP:LD A,20
              ;A disp
819F C5       ADP:PUSH BC
81A0 E5         PUSH HL
81A1 5F         LD E,A
81A2 0E02       LD C,02
81A4 CD0580     CALL FCALL
81A7 E1         POP HL
81A8 C1         POP BC
81A9 C9         RET
              ;
81AA 6472766E INPMSG:"drvn"
81AE 6F2E       "o."
81B0 3F         DB 3F;?
81B1 24         DB 24;$
81B2 6E6F7420 NFMSG:"not "
81B6 666F756E   "foun"
81BA 64         "d"
81BB 0D         DB 0D
81BC 0A         DB 0A
81BD 24         DB 24;$
81BE 656E64   ENDMSG:"end"
81C1 0D         DB 0D
81C2 0A         DB 0A
81C3 24         DB 24;$
              ;
ADP          =819F  CRLF         =8193  DMA          =8080  
DNOPASS      =811C  END          =8184  ENDMSG       =81BE  
FCALL        =8005  FCB          =805C  INPMSG       =81AA  
LOOP         =8100  LOOP1        =8133  MSGDP        =818D  
NFMSG        =81B2  NMDISP       =813B  NMDISP2      =813E  
NMDISP3      =8147  NMDISP4      =8153  NOFILE       =817B  
NXTSRCH      =8173  SPDP         =819D  

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

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

logfile nd80zlog\04070812.txt open

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

a>save 1 ftst10-2.com
a>dir
A: FNC0E-1  COM : FTST10   COM : FTST10-2 COM
a>b:
b>dir
B: FNC0E-0  COM

CP/Mを起動したあと、
SAVE 1 FTST10−2.COM[Enter]
を実行して、FTST10−2.COMというファイル名でAドライブにセーブしました。
DIRコマンドを実行して、セーブされたことを確認したあと、念の為に
a>b:[Enter]
と入力して、カレントドライブをBドライブにして、そこでもDIRコマンドで、ディレクトリを表示させました。

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

b>a:ftst10-2 *.*
drvno.?a
FNC0E-1.COM
FTST10.COM
FTST10-2.COM
end
drvno.?b
FNC0E-0.COM
end
drvno.?c
Bdos Err On C: Select

a:ftst10−2 *.*[Enter]
と入力しました。
このように、ファイル名の前にドライブbつけて入力することにより、カレントドライブ以外のディスクドライブにあるファイルを実行させることができます。

drvno.?の表示に

と入力しました。
Aドライブにセーブされているファイル名が表示され、最後にendと表示されました。
カレントドライブがBドライブ(b>)のときにプログラムをスタートしたのですが、Aドライブのディレクトリの内容が表示されましたから、確かにファンクションコール0Eは正しく機能したようです。

次のdrvno?の表示には
bと入力しました。
すると今度はBドライブにセーブされているファイル名が表示されて、最後にendと表示されました。
やはりファンクションコール0Eはちゃんと機能していますねえ。

最後はdrvno?の表示に
cと入力しました。
Cドライブはありませんから、
Bdos Err On C: Select
と表示されました。

●ワイルドカード

ログファイルの説明の途中ですが、ちょいと用語の解説です。

FTEST10−2の後につけた*.*は検索表示するファイル名の代わりとして使っています。
ここでは特定のファイルではなくて、存在する全てのファイルを表示させるために、’*’で代用しました。
この’*’を「ワイルドカード」と言います。
’*’は複数の文字列を代用するのに使います。
ワイルドカードには’*’のほかに、1文字のみを代用する’?’があります。
「文字」なのに「カード」というのは面白い表現です。
カードゲームのジョーカーを連想させます。

初期のコンピュータ少年たちは、さまざまな「ゲーム」のプログラムを書くことに熱中したようです。
今日に伝わる、ちょいとしたネーミングにも、そのようなルーツが想起されます。
かのビル・ゲイツ少年も、学校のコンピュータで三目並べのプログラムを作って、熱中したあまり、学校のコンピュータ予算を一人で使い切ってしまったのだったとか。

このエピソードにつきましては、以前にY様からいただいたメールにて読ませていただきました(Y様は当時の業界の事情にとても詳しくていらっしゃいます)。

以下、Y様からいただいたメールからの引用です。

ビルゲイツの場合は、15歳のときに在籍していたハイスクールにDEC社のミニコンのオンライン端末(TSS端末)がPTAの寄付金で設置されて、端末経由でDEC社のミニコンのBASICプログラミングを体験できたのが天才プログラマー誕生のきっかけでした。

このTSS端末に飛びついたのが15歳のビルゲイツでした。

ビルゲイツが一日中、夜中もTSS端末にかじりついて利用したので、PTAが寄付したTSS端末の利用予算を彼1人で使い切ってしまったという状況でした。

因みに、1973年当時のTSS端末の利用料金は月額百万円程度と思われます。
年間1千万円程度の寄付をしたPTAも凄いです。(それを1人で使い切ったやつも凄い)

ビルゲイツが在籍していたハイスクールは裕福な家庭の子供が多い学校だったようで、寄付金の金額も相当多かったようです。

もし、ハイスクールのPTAがTSS端末導入予算の寄付をしなかったらビルゲイツ氏と、コンピュータの出会いは無く、彼は親の後を就いて弁護士になっていたでしょう。

以上、Y様からいただいたメールから引用させていただきました。

●テストの続きです

上で行なったテストによって、ファンクション0Eは、「プログラムの中では」正しく機能していることが確かめられました。
まあ。でも、せっかく作ったテストプログラムですから、もう少し続けてテストをしてみました。

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

今度は、’a’の代わりに’1’、’b’の代わりに’2’を入れてみました。
プログラム中では指定した通りのドライブbェ選択されました。
やはりファンクション0Eによる「カレントドライブ」の選択は、プログラム中でのみ有効なようです。
プログラムを終了すると、プログラム中で行なったカレントドライブの指定はキャンセルされてしまうようです。
Bドライブを選択したあと、Ctrl−Zの入力でブレイクしましたが、ブログラムを開始したときと同じ、a>と表示されました。

念の為、今度はb>でプログラムをスタートさせてみました。

a>b:
b>a:ftst10-2 *.*
drvno.?a
FNC0E-1.COM
FTST10.COM
FTST10-2.COM
end
drvno.?
b>

今度はカレントドライブをBドライブにして、プログラムをスタートしてから、Aドライブを選択して、そこでCtrl−Zでブレイクしました。
ブレイク後は、やはりb>と表示されました。

どうやら、そういうこと(ファンクションコール0Eによるカレントドライブの指定はプログラムの中だけ有効)らしい、とわかりましたが、ちょっとテストにまだ甘いところがあることに気が付きましたので、次回ももう少しテストを続けてみたいと思います。

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

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