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

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

[第146回]


●ファンクションコール21H(ランダムリード)

ファンクションコール21Hは[第108回]で説明をしました。
ランダムファイルのレコードの読み出しを行ないます。
[第108回]ではテストプログラムFTST21を作って、ランダムファイルのレコードの読み出しを行ないました。

FTST21は、その前の回で大きなサイズのランダムアクセスファイルを作成するためのテストをしたことを受けて、2バイトのレコード番号表を読み出して、その番号にしたがって該当するレコードを読み出すというプログラムとして作成しました。

そのときはそれが自然の流れだったのでそうしたのですが、現在の流れで考えますと、前回([第145回])ファンクションコール22H(ランダムファイル)のテストを行ないましたから、1バイトのレコード番号表があって、仮RAMディスクには、それにしたがって作成されたランダムアクセスファイルがあります。

ここでFTST21を使ってランダムリードのテストをしようとしますと、その前に2バイトのレコード番号表を作成して、そしてその番号表にしたがって大きなランダムファイルの作成テストを行なわなければなりません。

大きなランダムファイルの作成についてもあとでテストはするつもりですが、今それをここでするのは、ちょっと手順としては面白くありません。
ですので、今回はまずは前回テストするのに使ったレコード番号表をそのまま読み込んで、そしてそれにしたがって、前回作成したランダムファイルを読むようにしたいと思います。

しかしランダムファイルを読むためのテストプログラムは、2バイトのレコード番号表用に作成したFTST21しかありません。
そこで、そのFTST21を1バイトの番号表を読むように変更して、それを使ってテストを行なうことにしました。

そのように変更したテストプログラムのソースリスト(FTST21−2.TXT)です。
; BDOS TEST21 function21 random read
;2012/3/4 3/7 4/16 4/17 4/27 6/2
;
        ORG $8100
        FCALL=$8005
        NMBRTBL=$8300
        FCB=$805C
        FCBR0=$807D
        FCBR1=$807E
        FCBR2=$807F
        DMA=$8080
;
        LD C,0F;open file
        LD DE,FCB
        CALL FCALL
        INC A;if FFH?
        JP Z,OPENERR
;
        XOR A
        LD (FCBR2),A
        LD (FCBR1),A
        LD HL,NMBRTBL
        PUSH HL
LOOP:POP HL
        LD A,(HL)
        LD (FCBR0),A
        CP FF
        JP Z,END
        INC HL
        PUSH HL
;
        LD C,21;random read
        LD DE,FCB
        CALL FCALL
        OR A
        JP NZ,READERR
;data disp
        LD HL,DMA
        LD E,(HL)
        INC HL
        LD D,(HL)
        EX DE,HL
        CALL HEX4DP
        CALL CRLF
        JP LOOP
;
READERR:POP HL
        OR 30
        PUSH AF
        LD DE,ERRT
        CALL MSGOUT
        POP AF
        LD E,A
        LD C,02
        CALL FCALL
        RET
;
END:LD DE,OK
        JP MSGOUT
;
OPENERR:LD DE,CANTOPN
MSGOUT: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
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
B2HEX4:LD A,H
        CALL B2HEX2
        EX DE,HL
        LD A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
B2HEX2:PUSH AF
        RRCA
        RRCA
        RRCA
        RRCA
        CALL B2HEX1
        LD D,A
        POP AF
        CALL B2HEX1
        LD E,A
        RET
;binary to hex, low 4bit to ascii 1charactor
B2HEX1:AND 0F
        ADD A,30
        CP 3A
        RET C;0-9
        ADD A,07;A-F
        RET
;hex to binary, ascii 1charactor to low 4bit 
HTOB1:CP 30;>="0"?
        RET C;no
        CP 3A;<="9"?
        JP C,HTOB1_2;yes,"0" to "9"
        CP 41;>="A" ?
        RET C;no
        CP 47;<="F"?
        JP C,HTOB1_1
        CP 61;>="a"?
        RET C;no
        CP 67;<="f"?
        CCF
        RET C;no
HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
HTOB1_2:AND 0F
        RET
;HL(bynary 2bytes) to asckii 4bytes & disp
HEX4DP:PUSH BC
        PUSH HL
        CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
        PUSH DE
        EX DE,HL
        CALL DEDP
        POP DE
        CALL DEDP
        POP HL
        POP BC
        RET
;A(binary) to asckii 2bytes HEX & disp
B2HEXDP:PUSH BC
        PUSH HL
        CALL B2HEX2
        CALL DEDP
        POP HL
        POP BC
        RET
;
;DE(asckii 2bytes) disp
DEDP:PUSH DE
        LD E,D
        LD C,02
        CALL FCALL
        POP DE
        LD C,02
        CALL FCALL
        RET
;
CANTOPN:"can'"
        "t op"
        "en!"
        DB 0D
        DB 0A
        DB 24;$
OK:"end"
        DB 0D
        DB 0A
        DB 24;$
ERRT:"err "
        DB 24;$
;

下はZASM.COMでアセンブルした結果作成されたアセンブルリストです。

2012/6/2  6:13  ftst21-2.txt
END=81F4
              ; BDOS TEST21 function21 random read
              ;2012/3/4 3/7 4/16 4/17 4/27 6/2
              ;
                      ORG $8100
                      FCALL=$8005
                NMBRTBL=$8300
                      FCB=$805C
                FCBR0=$807D
                FCBR1=$807E
                FCBR2=$807F
                      DMA=$8080
              ;
8100 0E0F             LD C,0F;open file
8102 115C80           LD DE,FCB
8105 CD0580           CALL FCALL
8108 3C               INC A;if FFH?
8109 CA5781           JP Z,OPENERR
              ;
810C AF               XOR A
810D 327F80           LD (FCBR2),A
8110 327E80     LD (FCBR1),A
8113 210083     LD HL,NMBRTBL
8116 E5         PUSH HL
8117 E1       LOOP:POP HL
8118 7E         LD A,(HL)
8119 327D80     LD (FCBR0),A
811C FEFF       CP FF
811E CA5181     JP Z,END
8121 23         INC HL
8122 E5         PUSH HL
              ;
8123 0E21       LD C,21;random read
8125 115C80     LD DE,FCB
8128 CD0580     CALL FCALL
812B B7         OR A
812C C23F81     JP NZ,READERR
              ;data disp
812F 218080     LD HL,DMA
8132 5E         LD E,(HL)
8133 23         INC HL
8134 56         LD D,(HL)
8135 EB         EX DE,HL
8136 CDB281     CALL HEX4DP
8139 CD6081     CALL CRLF
813C C31781     JP LOOP
              ;
813F E1       READERR:POP HL
8140 F630       OR 30
8142 F5         PUSH AF
8143 11F081     LD DE,ERRT
8146 CD5A81     CALL MSGOUT
8149 F1         POP AF
814A 5F         LD E,A
814B 0E02       LD C,02
814D CD0580     CALL FCALL
8150 C9         RET
              ;
8151 11EA81   END:LD DE,OK
8154 C35A81     JP MSGOUT
              ;
8157 11DC81   OPENERR:LD DE,CANTOPN
815A 0E09     MSGOUT:LD C,09
815C CD0580           CALL FCALL
815F C9               RET
              ;
              ;CL & LF
8160 3E0D     CRLF:LD A,0D
8162 CD6C81     CALL ADP
8165 3E0A       LD A,0A
8167 C36C81     JP ADP
              ;space disp
816A 3E20     SPDP:LD A,20
              ;A disp
816C C5       ADP:PUSH BC
816D E5         PUSH HL
816E 5F         LD E,A
816F 0E02       LD C,02
8171 CD0580     CALL FCALL
8174 E1         POP HL
8175 C1         POP BC
8176 C9         RET
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
8177 7C       B2HEX4:LD A,H
8178 CD7D81     CALL B2HEX2
817B EB         EX DE,HL
817C 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
817D F5       B2HEX2:PUSH AF
817E 0F         RRCA
817F 0F         RRCA
8180 0F         RRCA
8181 0F         RRCA
8182 CD8C81     CALL B2HEX1
8185 57         LD D,A
8186 F1         POP AF
8187 CD8C81     CALL B2HEX1
818A 5F         LD E,A
818B C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
818C E60F     B2HEX1:AND 0F
818E C630       ADD A,30
8190 FE3A       CP 3A
8192 D8         RET C;0-9
8193 C607       ADD A,07;A-F
8195 C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
8196 FE30     HTOB1:CP 30;>="0"?
8198 D8         RET C;no
8199 FE3A       CP 3A;<="9"?
819B DAAF81     JP C,HTOB1_2;yes,"0" to "9"
819E FE41       CP 41;>="A" ?
81A0 D8         RET C;no
81A1 FE47       CP 47;<="F"?
81A3 DAAD81     JP C,HTOB1_1
81A6 FE61       CP 61;>="a"?
81A8 D8         RET C;no
81A9 FE67       CP 67;<="f"?
81AB 3F         CCF
81AC D8         RET C;no
81AD C609     HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
81AF E60F     HTOB1_2:AND 0F
81B1 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
81B2 C5       HEX4DP:PUSH BC
81B3 E5         PUSH HL
81B4 CD7781     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
81B7 D5         PUSH DE
81B8 EB         EX DE,HL
81B9 CDCE81     CALL DEDP
81BC D1         POP DE
81BD CDCE81     CALL DEDP
81C0 E1         POP HL
81C1 C1         POP BC
81C2 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
81C3 C5       B2HEXDP:PUSH BC
81C4 E5         PUSH HL
81C5 CD7D81     CALL B2HEX2
81C8 CDCE81     CALL DEDP
81CB E1         POP HL
81CC C1         POP BC
81CD C9         RET
              ;
              ;DE(asckii 2bytes) disp
81CE D5       DEDP:PUSH DE
81CF 5A         LD E,D
81D0 0E02       LD C,02
81D2 CD0580     CALL FCALL
81D5 D1         POP DE
81D6 0E02       LD C,02
81D8 CD0580     CALL FCALL
81DB C9         RET
              ;
81DC 63616E27 CANTOPN:"can'"
81E0 74206F70         "t op"
81E4 656E21           "en!"
81E7 0D               DB 0D
81E8 0A               DB 0A
81E9 24               DB 24;$
81EA 656E64   OK:"end"
81ED 0D               DB 0D
81EE 0A               DB 0A
81EF 24               DB 24;$
81F0 65727220 ERRT:"err "
81F4 24               DB 24;$
              ;
ADP          =816C  B2HEX1       =818C  B2HEX2       =817D  
B2HEX4       =8177  B2HEXDP      =81C3  CANTOPN      =81DC  
CRLF         =8160  DEDP         =81CE  DMA          =8080  
END          =8151  ERRT         =81F0  FCALL        =8005  
FCB          =805C  FCBR0        =807D  FCBR1        =807E  
FCBR2        =807F  HEX4DP       =81B2  HTOB1        =8196  
HTOB1_1      =81AD  HTOB1_2      =81AF  LOOP         =8117  
MSGOUT       =815A  NMBRTBL      =8300  OK           =81EA  
OPENERR      =8157  READERR      =813F  SPDP         =816A  

●プログラムのセーブと実行

ZB3BASICで、
/ld ftst21−2.bin,8100[Enter]
と入力して、FTST21−2.BINを8100にロードしてから、
jp d233[Enter]
でCP/M互換DOSを起動しました。
FTST21−2.COMのファイル名でセーブしてから
FTST21−2 TEST.RAF[Enter]
と入力しました。

logfile nd80zlog\06020614.txt open

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

A>dir
A: FTST20   COM : TEST     RAF
A>save 1 ftst21-2.com

A>ftst21-2 test.raf
2626
0F0F
2222
2727
2929
0E0E
1111
1212
1616
0303
0D0D
end

レコード番号表の通りの順番でレコードがランダムリードされて、レコードの内容が表示されました。
FTST21を部分的に変更しましたので、2バイトずつ表示されています。
ここまではOKです。

●問題が発生

念の為、同じことをBドライブにセーブしたTEST.RAFに対しても行なってみることにしました。
この「念の為に」というのが大切なのですよねえ。
念の為に、試してみて、正解でした。

ちょっと理由があって、まずはBドライブのランダムファイルのファイル名をTEST.RAFからTESTB.RAFに変更しました。
その後、一旦Aドライブに戻ってから、そこでFTST21−2を実行しました。
ftst21−2 b:testb.raf[Enter]
の入力です。
そうしましたら。

A>b:
B>dir
B: TEST     RAF
B>ren test.raf testb.raf

B>dir
B: TESTB    RAF
B>a:
A>ftst21-2 b:testb.raf
can't open!

A>b:
B>a:ftst21-2 testb.raf
2626
0F0F
2222
2727
2929
0E0E
1111
1212
1616
0303
0D0D
end

B>

can’t open!
と表示されてしまいました。
まさかのエラーです。
Aドライブから実行したプログラムで、Bドライブ上のファイルが読み出せません。

それならば、ということで、今度はBドライブに変更して、そこからAドライブ上のプログラムを実行して、カレントドライブ(この場合にはBドライブ)のTESTB.RAFを開いてみました。
今度はうまくいきました。

どうもファイル名にドライブbつけると、うまくいかないようです。

ううう。
これって…。
前にどこかで、同じようなことを経験したような…。
むむ。
デジャブか?

デジャブではありませんでした。
[第140回]で書いておりました。
どうもドライブbフ扱いにバグがあるようです。

バグを修正して、再実行しました。

>/ld zbdos1u.bin,c406
loading ZBDOS1U.BIN ...08cf(2255)bytes loaded,from C406 to CCD4
>jp d233

A>ftst21-2 b:testb.raf
2626
0F0F
2222
2727
2929
0E0E
1111
1212
1616
0303
0D0D
end

A>end of ZBDOS
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Sat Jun 02 06:42:07 2012

今度はうまくいきました。

●ファンクションコール11H(最初のファイルサーチ)の修正

前項に関連して、ひょっとしたらということでいろいろ調べてみましたら、ファイル名サーチのところで、カレントドライブとは異なるドライブを指定してのサーチの処理に問題があることがわかりました。

ファンクションコール11Hは[第65回][第138回]で説明をしました。
テストプログラムはFTST10です。
[第138回]では別のドライブにあるファイル名をサーチするテストはおこなっていませんでした。
あらためてテストをしてみますと。



ftst10 b:*.*[Enter]
と入力したのに、Aドライブのファイル名が表示されてしまいました。
やはりカレントドライブと異なるドライブのアクセスができていないようです。

ファンクションコール11Hを修正いたしました。
下は修正後のZBDOSプログラム(ZBDOS1V.BIN)をロードして、FTST10を再実行したときの画面です。



間にスペースを入れずに
ftst10b:*.*[Enter]
と入力してしまいました。

今度は間違い無く
ftst10 b:*.*[Enter]
と入力しました。
うまくいったようです。
BドライブにはTESTB.RAFしかありません。
そのTESTB.RAFだけが表示されました。

次に念の為にカレントドライブをBドライブに変更して、そこで
a:ftst10 a:ftst*.*[Enter]
と入力しました。
結果は、AドライブにあるFTST*.*ファイルが全て表示されました。

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

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