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