復活!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
前へ
次へ
ホームページトップへ戻る