復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第116回]
●シーケンシャルファイルをランダムにアクセスする
前回は、シーケンシャルファイルをオープンして、ランダムリードのファンクションコールを使って、ランダムにレコードを読み出しました。
しかし、そのプログラムをさらによくよく見ていましたら。
まてよ。何もわざわざランダムリードのファンクションコールなど使わなくても、こんなことなら、シーケンシャルリードのファンクションコールでも同じことができるじゃないの。
ということに気が付きました。
もっともそれが簡単にできるのは、同一エクステントの範囲内のレコードを対象にしている限りでは、という但し書きがついてのお話ですけれど。
え?
何を言っているのか、わかりませんか?
あ。
まあ、これは座興のようなものでありますから、余り深く考えなくてもよろしいと思います。
そこで。
前回、ファンクションコール21H(ランダムリード)を使ったところを、ファンクションコール14H(シーケンシャルリード)に書き換えて、同じことをしてみます。
●テストプログラムFTST24−4
前回と同じくシーケンシャルファイルをオープンして、ランダムにリードしてしまうプログラムです。
ただし、前回はファンクションコール21Hであったところをファンクションコール14Hに書き換えています。
そのほかにもちょいと変更しているところがあります。
[第112回]で使った通常のシーケンシャルファイルリードプログラム(FTST24)と、前回のプログラム(FTST24−2)と、そして今回のFTST24−4の、どこがどのように違っているのか、考えてみてください。
こちらがソースプログラムFTST24−4.TXTです。
; BDOS TEST24-4 file read(random read) ; from ftest4-1.txt & ftest3dm.txt & ftst21.txt ;2012/2/28 ;4/30 5/2 5/9 ; ORG $8100 FCALL=$8005 FCB=$805C RECNO=$807C FCBR0=$807D FCBR1=$807E FCBR2=$807F DMA=$8080 NMBRTBL=$8400 ; LD C,0F;open LD DE,FCB CALL FCALL INC A;if FFH? JP Z,OPENERR ; LD HL,NMBRTBL PUSH HL LOOP:POP HL LD A,(HL) LD (RECNO),A CP FF JP Z,END INC HL PUSH HL ; LD C,14;sequential read LD DE,FCB CALL FCALL OR A JP NZ,READERR ; LD HL,DMA LD A,(HL) CALL B2HEXDP 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/5/9 21:3 ftst24-4.txt END=81E9 ; BDOS TEST24-4 file read(random read) ; from ftest4-1.txt & ftest3dm.txt & ftst21.txt ;2012/2/28 ;4/30 5/2 5/9 ; ORG $8100 FCALL=$8005 FCB=$805C RECNO=$807C FCBR0=$807D FCBR1=$807E FCBR2=$807F DMA=$8080 NMBRTBL=$8400 ; 8100 0E0F LD C,0F;open 8102 115C80 LD DE,FCB 8105 CD0580 CALL FCALL 8108 3C INC A;if FFH? 8109 CA4D81 JP Z,OPENERR ; 810C 210084 LD HL,NMBRTBL 810F E5 PUSH HL 8110 E1 LOOP:POP HL 8111 7E LD A,(HL) 8112 327C80 LD (RECNO),A 8115 FEFF CP FF 8117 CA4781 JP Z,END 811A 23 INC HL 811B E5 PUSH HL ; 811C 0E14 LD C,14;sequential read 811E 115C80 LD DE,FCB 8121 CD0580 CALL FCALL 8124 B7 OR A 8125 C23581 JP NZ,READERR ; 8128 218080 LD HL,DMA 812B 7E LD A,(HL) 812C CDB981 CALL B2HEXDP 812F CD5681 CALL CRLF 8132 C31081 JP LOOP ; 8135 E1 READERR:POP HL 8136 F630 OR 30 8138 F5 PUSH AF 8139 11E581 LD DE,ERRT 813C CD5081 CALL MSGOUT 813F F1 POP AF 8140 5F LD E,A 8141 0E02 LD C,02 8143 CD0580 CALL FCALL 8146 C9 RET ; 8147 11DF81 END:LD DE,OK 814A C35081 JP MSGOUT ; 814D 11D281 OPENERR:LD DE,CANTOPN 8150 0E09 MSGOUT:LD C,09 8152 CD0580 CALL FCALL 8155 C9 RET ; ;CL & LF 8156 3E0D CRLF:LD A,0D 8158 CD6281 CALL ADP 815B 3E0A LD A,0A 815D C36281 JP ADP ;space disp 8160 3E20 SPDP:LD A,20 ;A disp 8162 C5 ADP:PUSH BC 8163 E5 PUSH HL 8164 5F LD E,A 8165 0E02 LD C,02 8167 CD0580 CALL FCALL 816A E1 POP HL 816B C1 POP BC 816C C9 RET ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE 816D 7C B2HEX4:LD A,H 816E CD7381 CALL B2HEX2 8171 EB EX DE,HL 8172 7B LD A,E ;binary to hex, 1byte data to ascii 2charactors,A to DE 8173 F5 B2HEX2:PUSH AF 8174 0F RRCA 8175 0F RRCA 8176 0F RRCA 8177 0F RRCA 8178 CD8281 CALL B2HEX1 817B 57 LD D,A 817C F1 POP AF 817D CD8281 CALL B2HEX1 8180 5F LD E,A 8181 C9 RET ;binary to hex, low 4bit to ascii 1charactor 8182 E60F B2HEX1:AND 0F 8184 C630 ADD A,30 8186 FE3A CP 3A 8188 D8 RET C;0-9 8189 C607 ADD A,07;A-F 818B C9 RET ;hex to binary, ascii 1charactor to low 4bit 818C FE30 HTOB1:CP 30;>="0"? 818E D8 RET C;no 818F FE3A CP 3A;<="9"? 8191 DAA581 JP C,HTOB1_2;yes,"0" to "9" 8194 FE41 CP 41;>="A" ? 8196 D8 RET C;no 8197 FE47 CP 47;<="F"? 8199 DAA381 JP C,HTOB1_1 819C FE61 CP 61;>="a"? 819E D8 RET C;no 819F FE67 CP 67;<="f"? 81A1 3F CCF 81A2 D8 RET C;no 81A3 C609 HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F 81A5 E60F HTOB1_2:AND 0F 81A7 C9 RET ;HL(bynary 2bytes) to asckii 4bytes & disp 81A8 C5 HEX4DP:PUSH BC 81A9 E5 PUSH HL 81AA CD6D81 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes 81AD D5 PUSH DE 81AE EB EX DE,HL 81AF CDC481 CALL DEDP 81B2 D1 POP DE 81B3 CDC481 CALL DEDP 81B6 E1 POP HL 81B7 C1 POP BC 81B8 C9 RET ;A(binary) to asckii 2bytes HEX & disp 81B9 C5 B2HEXDP:PUSH BC 81BA E5 PUSH HL 81BB CD7381 CALL B2HEX2 81BE CDC481 CALL DEDP 81C1 E1 POP HL 81C2 C1 POP BC 81C3 C9 RET ; ;DE(asckii 2bytes) disp 81C4 D5 DEDP:PUSH DE 81C5 5A LD E,D 81C6 0E02 LD C,02 81C8 CD0580 CALL FCALL 81CB D1 POP DE 81CC 0E02 LD C,02 81CE CD0580 CALL FCALL 81D1 C9 RET ; 81D2 63616E27 CANTOPN:"can'" 81D6 74206F70 "t op" 81DA 656E "en" 81DC 0D DB 0D 81DD 0A DB 0A 81DE 24 DB 24;$ 81DF 656E64 OK:"end" 81E2 0D DB 0D 81E3 0A DB 0A 81E4 24 DB 24;$ 81E5 65727220 ERRT:"err " 81E9 24 DB 24;$ ; ADP =8162 B2HEX1 =8182 B2HEX2 =8173 B2HEX4 =816D B2HEXDP =81B9 CANTOPN =81D2 CRLF =8156 DEDP =81C4 DMA =8080 END =8147 ERRT =81E5 FCALL =8005 FCB =805C FCBR0 =807D FCBR1 =807E FCBR2 =807F HEX4DP =81A8 HTOB1 =818C HTOB1_1 =81A3 HTOB1_2 =81A5 LOOP =8110 MSGOUT =8150 NMBRTBL =8400 OK =81DF OPENERR =814D READERR =8135 RECNO =807C SPDP =8160 |
logfile nd80zlog\05092109.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** >/ld fille5.bin,8100 loading FILLE5.BIN ...0010(16)bytes loaded,from 8100 to 810F >jp 8100 >/ld ftst23.bin,8100 loading FTST23.BIN ...0076(118)bytes loaded,from 8100 to 8175 >jp d233 a>dir No file a>save 1 ftst23.com a>ftst23 test.saf done a>dir A: FTST23 COM : TEST SAF a>^D end of CP/M > |
>/ld ftst24-4.bin,8100 loading FTST24-4.BIN ...00ea(234)bytes loaded,from 8100 to 81E9 >jp d233 a>save 1 ftst24-4.com a>dir A: FTST23 COM : TEST SAF : FTST24-4 COM a>ftst24-4 test.saf 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 00 end a>^D end of CP/M >0000 00C3 - リモート接続を終了しました logfile closed at Wed May 09 21:12:21 2012 |