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

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

[第235回]


●ファンクションコール24H(ランダムレコードアクセスポインタの更新)その3

前々回([第233回])はファンクションコール24Hのテストをするための前準備として、シーケンシャルファイルTEST.SAFを作成し、それを確かめるために、VFDUMPでBドライブのセクタを直接読んで確認をしました。
前回は[第112回]と同じようにして、VFTST24を作って、TEST.SAFを読み出してみました。

今回はそのVFTST24にファンクションコール24を追加して、そのファンクションコールによって、ランダムアクセスのためのレコードbェFCB上に作成されることを確認します。
これは[第113回]で行った作業です。

[第113回]ではFTST24をもとにしてFTST25を作成しましたが、前回FTST24からVFTST24を作成するのに2バイトのレコードbノ対応するようにあるていどの部分を書き換えました。
それと同様に今回もFTST25をもとにするよりは、FTST25を参考にしつつ、VFTST24をもとにしてVFTST25を作成したほうが簡単にできる、と判断してそのようにしました。
そのようにして作成したVFTST25のソースリストをお見せします。

●ソースプログラムVFTST25

; BDOS VFTST25 function call 24
; from ftest4-1.txt & ftest3dm.txt
;2012/2/28
;4/30
;10/18
;from vftst24.txt & ftst25.txt 10/21
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
        RECNO=$007C
        FCBR0=$007D
        FCBR1=$007E
        FCBR2=$007F
        DMA=$0080
;
        LD C,0F;open
        LD DE,FCB
        CALL FCALL
        INC A;if FFH?
        JP Z,ERR
        XOR A
        LD (RECNO),A
;
LOOP1:  LD C,14;read
        LD DE,FCB
        CALL FCALL
        OR A
        RET NZ;read end
;
        LD A,(RECNO)
        CALL B2HEXDP
        LD A,28;(
        CALL ADP
        LD HL,DMA
        LD C,(HL)
        INC HL
        LD A,(HL)
        CALL B2HEXDP
        LD A,C
        CALL B2HEXDP
        LD A,29;)
        CALL ADP
        LD A,5B;[
        CALL ADP
        LD DE,FCB
        LD C,24
        CALL FCALL
        LD A,(FCBR2)
        CALL B2HEXDP
        CALL SPDP
        LD A,(FCBR1)
        CALL B2HEXDP
        CALL SPDP
        LD A,(FCBR0)
        CALL B2HEXDP
        LD A,5D;]
        CALL ADP
        CALL SPDP
        CALL SPDP
        JP LOOP1
;
;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
;
ERR:LD DE,ERRMSG
        LD C,09
        CALL FCALL
        RET
ERRMSG:"can'"
        "t op"
        "en"
        DB 0D
        DB 0A
        DB 24;$
;

前回作成したプログラムVFTST24では、シーケンシャルファイルの1レコードデータを読んで、その次のシーケンシャルリードでレコードを読むためのレ コードbェ置かれる、FCBの33バイト目(RECNO)の値を読んで表示し、それからレコードの先頭のデータ2バイトを()で囲んで16 進数で表示しました。
今回のFTST25では、そのあとに追加して、ファンクションコール24Hを実行して、その結果作成されたFCBのランダムアクセス用のレコードb格納しているFCBの34バイト目から36バイト目の値を[]で囲んで16進数で表示します。

●VFTST25の実行

VFTST25.TXTをZASM.COMでアセンブルしてVFTST25.BINを作成し、ZB3DOSを起動して、Bドライブにコピーしました。
そのあとVFTST25を実行しました。
下の画像はVFTST25を実行する直前の画面です。
このあと[Enter]の入力でVFTST25が実行されます。



下は実行を完了したあとの画面です。



一見したところうまくいったようで、なにごともなくめでたく完了したかに思えたのでありましたが…。
やっぱりそうは問屋が卸してはくれないようでありますね。
[]の中の数値は()の中の数値と同じものになるはず(と思います)。
ところがそこが食い違ってしまっています。
どこで食い違いが生じたのかは、画面がスクロールしてしまって見えません。
でも大体の見当はついています。

画面はスクロールしてしまいましたが、ログファイルには記録が残っているはずです。
ここらあたりがCP/M互換DOSの強みであります。

下はログファイルの前半の部分です。
問題が発生しているあたりまでをお見せします。

logfile nd80zlog\10212052.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
can't open D.vfd
>jp d233

A>b:
B>dir
B: VFTST23  COM : TEST     SAF : VFTST24  COM
B>copy z:vftst25.bin

B>dir
B: VFTST23  COM : TEST     SAF : VFTST24  COM : VFTST25  COM

B>vftst25 test.saf
01(0000)[00 00 01]  02(0001)[00 00 02]  03(0002)[00 00 03]  04(0003)[00 00 04]  
05(0004)[00 00 05]  06(0005)[00 00 06]  07(0006)[00 00 07]  08(0007)[00 00 08]  
09(0008)[00 00 09]  0A(0009)[00 00 0A]  0B(000A)[00 00 0B]  0C(000B)[00 00 0C]  
0D(000C)[00 00 0D]  0E(000D)[00 00 0E]  0F(000E)[00 00 0F]  10(000F)[00 00 10]  
11(0010)[00 00 11]  12(0011)[00 00 12]  13(0012)[00 00 13]  14(0013)[00 00 14]  
15(0014)[00 00 15]  16(0015)[00 00 16]  17(0016)[00 00 17]  18(0017)[00 00 18]  
19(0018)[00 00 19]  1A(0019)[00 00 1A]  1B(001A)[00 00 1B]  1C(001B)[00 00 1C]  
1D(001C)[00 00 1D]  1E(001D)[00 00 1E]  1F(001E)[00 00 1F]  20(001F)[00 00 20]  
21(0020)[00 00 21]  22(0021)[00 00 22]  23(0022)[00 00 23]  24(0023)[00 00 24]  
25(0024)[00 00 25]  26(0025)[00 00 26]  27(0026)[00 00 27]  28(0027)[00 00 28]  
29(0028)[00 00 29]  2A(0029)[00 00 2A]  2B(002A)[00 00 2B]  2C(002B)[00 00 2C]  
2D(002C)[00 00 2D]  2E(002D)[00 00 2E]  2F(002E)[00 00 2F]  30(002F)[00 00 30]  
31(0030)[00 00 31]  32(0031)[00 00 32]  33(0032)[00 00 33]  34(0033)[00 00 34]  
35(0034)[00 00 35]  36(0035)[00 00 36]  37(0036)[00 00 37]  38(0037)[00 00 38]  
39(0038)[00 00 39]  3A(0039)[00 00 3A]  3B(003A)[00 00 3B]  3C(003B)[00 00 3C]  
3D(003C)[00 00 3D]  3E(003D)[00 00 3E]  3F(003E)[00 00 3F]  40(003F)[00 00 40]  
41(0040)[00 00 41]  42(0041)[00 00 42]  43(0042)[00 00 43]  44(0043)[00 00 44]  
45(0044)[00 00 45]  46(0045)[00 00 46]  47(0046)[00 00 47]  48(0047)[00 00 48]  
49(0048)[00 00 49]  4A(0049)[00 00 4A]  4B(004A)[00 00 4B]  4C(004B)[00 00 4C]  
4D(004C)[00 00 4D]  4E(004D)[00 00 4E]  4F(004E)[00 00 4F]  50(004F)[00 00 50]  
51(0050)[00 00 51]  52(0051)[00 00 52]  53(0052)[00 00 53]  54(0053)[00 00 54]  
55(0054)[00 00 55]  56(0055)[00 00 56]  57(0056)[00 00 57]  58(0057)[00 00 58]  
59(0058)[00 00 59]  5A(0059)[00 00 5A]  5B(005A)[00 00 5B]  5C(005B)[00 00 5C]  
5D(005C)[00 00 5D]  5E(005D)[00 00 5E]  5F(005E)[00 00 5F]  60(005F)[00 00 60]  
61(0060)[00 00 61]  62(0061)[00 00 62]  63(0062)[00 00 63]  64(0063)[00 00 64]  
65(0064)[00 00 65]  66(0065)[00 00 66]  67(0066)[00 00 67]  68(0067)[00 00 68]  
69(0068)[00 00 69]  6A(0069)[00 00 6A]  6B(006A)[00 00 6B]  6C(006B)[00 00 6C]  
6D(006C)[00 00 6D]  6E(006D)[00 00 6E]  6F(006E)[00 00 6F]  70(006F)[00 00 70]  
71(0070)[00 00 71]  72(0071)[00 00 72]  73(0072)[00 00 73]  74(0073)[00 00 74]  
75(0074)[00 00 75]  76(0075)[00 00 76]  77(0076)[00 00 77]  78(0077)[00 00 78]  
79(0078)[00 00 79]  7A(0079)[00 00 7A]  7B(007A)[00 00 7B]  7C(007B)[00 00 7C]  
7D(007C)[00 00 7D]  7E(007D)[00 00 7E]  7F(007E)[00 00 7F]  80(007F)[00 00 80]  
01(0080)[00 01 01]  02(0081)[00 01 02]  03(0082)[00 01 03]  04(0083)[00 01 04]  

下から2行目、シーケンシャルアクセスのためのRECNOの値が80Hから01Hに戻るところで問題が発生しています。
[]内はランダムアクセスのためのレコードbナすから、今回の場合000080Hから000101Hのように不連続になってはいけないはずです。
000080Hの次は当然000081Hにならなければいけないはずなのですが…。

むむむ。
バグのようです。
やれやれ。

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

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