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