復活!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;$
;
|
