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

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

[第225回]


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

ファンクションコール21H(ランダムリード)については、最初に[第108回]で説明をしました。
そこで作ったテストプログラムはFTST21です。
仮RAMディスク版としては、[第146回]で説明をしました。

ところがあらためて[第146回]を読んでみましたら、[第108回]で作成したFTST21は2バイトのレコードwpだったものをわざわざ1バイトに直してテストをしていることがわかりました。
仮RAMディスク版としては、[第151回]で「大きなランダムファイルをつくる」ということで、そこであらためて2バイトのレコードb読み込んでランダムファイルをつくりました。

それではその後でランダムリードについてもテストをしているのか、と思ってさらに読み進んでみましたら、なんと[第152回]で、ランダムファイルを作成しただけで、めでたしめでたしで終わってしまっておりました。
ランダムライトのテストをしただけで、ランダムリードのテストはせずに終わってしまいました。

むむ。
だめじゃないか。
かなりボケが進行しているようで、ちょいと不安ですなあ。

とすると、もとになるプログラムはFTST21ということになります。
そこで、今回はFTST21を64KBフルRAM用に一部を書き換えてファイル名をVFTST21にしました。
下はそのソースプログラムリストです。

●ソースプログラムVFTST21.TXT

; BDOS TEST21 function21 random read
;2012/3/4 3/7 4/16 4/17 4/27
;10/1
;
        ORG $0100
        FCALL=$0005
        NMBRTBL=$0300
        FCB=$005C
        FCBR0=$007D
        FCBR1=$007E
        FCBR2=$007F
        DMA=$0080
;
        LD C,0F;open file
        LD DE,FCB
        CALL FCALL
        INC A;if FFH?
        JP Z,OPENERR
;
        XOR A
        LD (FCBR2),A
        LD HL,NMBRTBL
        PUSH HL
LOOP:POP HL
        LD A,(HL)
        LD (FCBR0),A
        INC HL
        LD A,(HL)
        CP FF
        JP Z,END
        LD (FCBR1),A
        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;$
;



●VFTST21の実行

VFTST21の実行です。
ND80ZVのメモリには前回までのテストで使用したレコード番号表がそのまま残っていますから、それを読み込んで、これも前回までのテストで作成したTEST.RAFからレコードを読み込んでそのデータの先頭2バイト(レコードbニ同じ値)を表示します。
[第106回]をバックにして実行しました。


今回はうまくいったようです。
[第223回]で追加した4レコードもちゃんと読み出しています。
いつもこんなふうに何事もなく終わってくれると楽なのですけれど。
ともあれ、今回はめでたしめでたし、でありました。

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

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