復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第146回]
●ファンクションコール21H(ランダムリード)
ファンクションコール21Hは[第108回]で説明をしました。
ランダムファイルのレコードの読み出しを行ないます。
[第108回]ではテストプログラムFTST21を作って、ランダムファイルのレコードの読み出しを行ないました。
FTST21は、その前の回で大きなサイズのランダムアクセスファイルを作成するためのテストをしたことを受けて、2バイトのレコード番号表を読み出して、その番号にしたがって該当するレコードを読み出すというプログラムとして作成しました。
そのときはそれが自然の流れだったのでそうしたのですが、現在の流れで考えますと、前回([第145回])ファンクションコール22H(ランダムファイル)のテストを行ないましたから、1バイトのレコード番号表があって、仮RAMディスクには、それにしたがって作成されたランダムアクセスファイルがあります。
ここでFTST21を使ってランダムリードのテストをしようとしますと、その前に2バイトのレコード番号表を作成して、そしてその番号表にしたがって大きなランダムファイルの作成テストを行なわなければなりません。
大きなランダムファイルの作成についてもあとでテストはするつもりですが、今それをここでするのは、ちょっと手順としては面白くありません。
ですので、今回はまずは前回テストするのに使ったレコード番号表をそのまま読み込んで、そしてそれにしたがって、前回作成したランダムファイルを読むようにしたいと思います。
しかしランダムファイルを読むためのテストプログラムは、2バイトのレコード番号表用に作成したFTST21しかありません。
そこで、そのFTST21を1バイトの番号表を読むように変更して、それを使ってテストを行なうことにしました。
そのように変更したテストプログラムのソースリスト(FTST21−2.TXT)です。
; BDOS TEST21 function21 random read
;2012/3/4 3/7 4/16 4/17 4/27 6/2
;
ORG $8100
FCALL=$8005
NMBRTBL=$8300
FCB=$805C
FCBR0=$807D
FCBR1=$807E
FCBR2=$807F
DMA=$8080
;
LD C,0F;open file
LD DE,FCB
CALL FCALL
INC A;if FFH?
JP Z,OPENERR
;
XOR A
LD (FCBR2),A
LD (FCBR1),A
LD HL,NMBRTBL
PUSH HL
LOOP:POP HL
LD A,(HL)
LD (FCBR0),A
CP FF
JP Z,END
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;$
;
|
2012/6/2 6:13 ftst21-2.txt
END=81F4
; BDOS TEST21 function21 random read
;2012/3/4 3/7 4/16 4/17 4/27 6/2
;
ORG $8100
FCALL=$8005
NMBRTBL=$8300
FCB=$805C
FCBR0=$807D
FCBR1=$807E
FCBR2=$807F
DMA=$8080
;
8100 0E0F LD C,0F;open file
8102 115C80 LD DE,FCB
8105 CD0580 CALL FCALL
8108 3C INC A;if FFH?
8109 CA5781 JP Z,OPENERR
;
810C AF XOR A
810D 327F80 LD (FCBR2),A
8110 327E80 LD (FCBR1),A
8113 210083 LD HL,NMBRTBL
8116 E5 PUSH HL
8117 E1 LOOP:POP HL
8118 7E LD A,(HL)
8119 327D80 LD (FCBR0),A
811C FEFF CP FF
811E CA5181 JP Z,END
8121 23 INC HL
8122 E5 PUSH HL
;
8123 0E21 LD C,21;random read
8125 115C80 LD DE,FCB
8128 CD0580 CALL FCALL
812B B7 OR A
812C C23F81 JP NZ,READERR
;data disp
812F 218080 LD HL,DMA
8132 5E LD E,(HL)
8133 23 INC HL
8134 56 LD D,(HL)
8135 EB EX DE,HL
8136 CDB281 CALL HEX4DP
8139 CD6081 CALL CRLF
813C C31781 JP LOOP
;
813F E1 READERR:POP HL
8140 F630 OR 30
8142 F5 PUSH AF
8143 11F081 LD DE,ERRT
8146 CD5A81 CALL MSGOUT
8149 F1 POP AF
814A 5F LD E,A
814B 0E02 LD C,02
814D CD0580 CALL FCALL
8150 C9 RET
;
8151 11EA81 END:LD DE,OK
8154 C35A81 JP MSGOUT
;
8157 11DC81 OPENERR:LD DE,CANTOPN
815A 0E09 MSGOUT:LD C,09
815C CD0580 CALL FCALL
815F C9 RET
;
;CL & LF
8160 3E0D CRLF:LD A,0D
8162 CD6C81 CALL ADP
8165 3E0A LD A,0A
8167 C36C81 JP ADP
;space disp
816A 3E20 SPDP:LD A,20
;A disp
816C C5 ADP:PUSH BC
816D E5 PUSH HL
816E 5F LD E,A
816F 0E02 LD C,02
8171 CD0580 CALL FCALL
8174 E1 POP HL
8175 C1 POP BC
8176 C9 RET
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
8177 7C B2HEX4:LD A,H
8178 CD7D81 CALL B2HEX2
817B EB EX DE,HL
817C 7B LD A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
817D F5 B2HEX2:PUSH AF
817E 0F RRCA
817F 0F RRCA
8180 0F RRCA
8181 0F RRCA
8182 CD8C81 CALL B2HEX1
8185 57 LD D,A
8186 F1 POP AF
8187 CD8C81 CALL B2HEX1
818A 5F LD E,A
818B C9 RET
;binary to hex, low 4bit to ascii 1charactor
818C E60F B2HEX1:AND 0F
818E C630 ADD A,30
8190 FE3A CP 3A
8192 D8 RET C;0-9
8193 C607 ADD A,07;A-F
8195 C9 RET
;hex to binary, ascii 1charactor to low 4bit
8196 FE30 HTOB1:CP 30;>="0"?
8198 D8 RET C;no
8199 FE3A CP 3A;<="9"?
819B DAAF81 JP C,HTOB1_2;yes,"0" to "9"
819E FE41 CP 41;>="A" ?
81A0 D8 RET C;no
81A1 FE47 CP 47;<="F"?
81A3 DAAD81 JP C,HTOB1_1
81A6 FE61 CP 61;>="a"?
81A8 D8 RET C;no
81A9 FE67 CP 67;<="f"?
81AB 3F CCF
81AC D8 RET C;no
81AD C609 HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
81AF E60F HTOB1_2:AND 0F
81B1 C9 RET
;HL(bynary 2bytes) to asckii 4bytes & disp
81B2 C5 HEX4DP:PUSH BC
81B3 E5 PUSH HL
81B4 CD7781 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
81B7 D5 PUSH DE
81B8 EB EX DE,HL
81B9 CDCE81 CALL DEDP
81BC D1 POP DE
81BD CDCE81 CALL DEDP
81C0 E1 POP HL
81C1 C1 POP BC
81C2 C9 RET
;A(binary) to asckii 2bytes HEX & disp
81C3 C5 B2HEXDP:PUSH BC
81C4 E5 PUSH HL
81C5 CD7D81 CALL B2HEX2
81C8 CDCE81 CALL DEDP
81CB E1 POP HL
81CC C1 POP BC
81CD C9 RET
;
;DE(asckii 2bytes) disp
81CE D5 DEDP:PUSH DE
81CF 5A LD E,D
81D0 0E02 LD C,02
81D2 CD0580 CALL FCALL
81D5 D1 POP DE
81D6 0E02 LD C,02
81D8 CD0580 CALL FCALL
81DB C9 RET
;
81DC 63616E27 CANTOPN:"can'"
81E0 74206F70 "t op"
81E4 656E21 "en!"
81E7 0D DB 0D
81E8 0A DB 0A
81E9 24 DB 24;$
81EA 656E64 OK:"end"
81ED 0D DB 0D
81EE 0A DB 0A
81EF 24 DB 24;$
81F0 65727220 ERRT:"err "
81F4 24 DB 24;$
;
ADP =816C B2HEX1 =818C B2HEX2 =817D
B2HEX4 =8177 B2HEXDP =81C3 CANTOPN =81DC
CRLF =8160 DEDP =81CE DMA =8080
END =8151 ERRT =81F0 FCALL =8005
FCB =805C FCBR0 =807D FCBR1 =807E
FCBR2 =807F HEX4DP =81B2 HTOB1 =8196
HTOB1_1 =81AD HTOB1_2 =81AF LOOP =8117
MSGOUT =815A NMBRTBL =8300 OK =81EA
OPENERR =8157 READERR =813F SPDP =816A
|
logfile nd80zlog\06020614.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** >/ld ftst21-2.bin,8100 loading FTST21-2.BIN ...00f5(245)bytes loaded,from 8100 to 81F4 >jp d233 A>dir A: FTST20 COM : TEST RAF A>save 1 ftst21-2.com A>ftst21-2 test.raf 2626 0F0F 2222 2727 2929 0E0E 1111 1212 1616 0303 0D0D end |
A>b: B>dir B: TEST RAF B>ren test.raf testb.raf B>dir B: TESTB RAF B>a: A>ftst21-2 b:testb.raf can't open! A>b: B>a:ftst21-2 testb.raf 2626 0F0F 2222 2727 2929 0E0E 1111 1212 1616 0303 0D0D end B> |
>/ld zbdos1u.bin,c406 loading ZBDOS1U.BIN ...08cf(2255)bytes loaded,from C406 to CCD4 >jp d233 A>ftst21-2 b:testb.raf 2626 0F0F 2222 2727 2929 0E0E 1111 1212 1616 0303 0D0D end A>end of ZBDOS >0000 00C3 - リモート接続を終了しました logfile closed at Sat Jun 02 06:42:07 2012 |

