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

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

[第234回]


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

前回はファンクションコール24Hのテストをするための前準備として、シーケンシャルファイルTEST.SAFを作成しました。
そしてTEST.SAFが正しく作成されたかどうかを確かめるために、VFDUMPでBドライブのセクタを直接読んで確認をしました。
それでTEST.SAFの中身の確認はできたのですけれど、[第112回]ではFTST24.COMを作って、TEST.SAFの内容を読み出しています。

ですので今回は[第112回]と同じようにして、TEST.SAFをプログラムで読み出してみることにします。
FTST24は1バイトのデータを読み出して表示するプログラムでしたが、前回作成したTEST.SAFはレコードbノ相当する2バイトのデータを書き込みました。
そこで今回はFTST24をフルRAM用に書き換えるとともに、2バイトのデータを読み込んで表示するように変更して、ファイル名VFTST24を作成しました。

●ソースプログラムVFTST24

; BDOS VFTST24 file read
; from ftest4-1.txt & ftest3dm.txt
;2012/2/28
;4/30
;10/18
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
        RECNO=$007C
        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
        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;$
;

[第112回]でも書きましたが、シーケンシャルリードは、ファイルのレコードを最初に読むときに、FCBの33バイト目(RECNO)に00を書き込みます。
ここはシーケンシャルリード(またはライト)で、次にアクセスするレコードbェ置かれるところです。
今回のプログラムではレコードの値を読むとともに、そのRECNOの値も読んで表示するようにしました。
その値も、レコードのデータを読んで表示する値も16進数で表示します。
1つのレコードには、128バイトの全部にレコードbノ相当する2バイトの値が繰り返して書き込まれていますから、最初の2バイトだけを読んで表示します。
最初にRECNOの値を16進数2桁で表示します。
次に括弧で囲んでレコードのデータを16進数2桁で表示します。

●VFTST24の実行

前回と同様、作成したVFTST24.TXTをZASM.COMでアセンブルしてVFTST24.BINを作成したあと、ZB3DOSを起動して、Bドライブにコピーしました。

B>COPY Z:VFTST24.BIN[Enter]

の実行です。
そのあと下記のように入力して、VFTST24.COMを実行しました。

B>VFTST24 TEST.SAF[Enter]

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


全部で512レコードありますから前のほうのデータはスクロールしてしまって見えません。
終わりのあたりのデータだけが表示されています。
しかしこれでも十分内容の確認はできます。
よく見るとRECNOの値は01〜80が繰り返されています。
シーケンシャルファイルの場合には次に表示するレコードbニして00〜80Hを使います。
最後の80Hは、実は次のエクステントの先頭のレコード(セクタ)であることを示しています。
ですからこの値が80Hで終わって、次は01から始まっていても、レコードは途切れないで正しい順序でちゃんと読み出されます。
80Hの前後でも()内の値が連続していることに注目してください。

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

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