復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第115回]
●シーケンシャルファイルとランダムファイル(2)
前回は、シーケンシャルファイルをオープンして、そのファイルにランダムライトのファンクションコールで、ランダムにレコードを書き込んでしまうという、メチャクチャなことをやりました。
まあメチャクチャというのは、「シーケンシャルファイルとランダムファイルは違うだろう」という「常識」から見たら、そのように思うということでありまして、実は(少なくともCP/Mに限っては)シーケンシャルファイルもランダムファイルも基本的には同じものなのです。
ですからシーケンシャルファイルをランダムにアクセスすることだって自由にできてしまいます。
あ。
その逆はちょっと難しいところがあるのですけれど…。
それで。
前回はシーケンシャルファイルにレコードをランダムにライト(書き込み)しました。
そこで、今回はシーケンシャルファイルをランダムにリード(読み出し)してみます。
●テストプログラムFTST24−2
シーケンシャルファイルをオープンして、ランダムにリードしてしまうプログラムです。
こちらがそのソースプログラムFTST24−2.TXTです。
; BDOS TEST24-2 file read(random read) ; from ftest4-1.txt & ftest3dm.txt & ftst21.txt ;2012/2/28 ;4/30 5/2 ; 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 ; 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 ; 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/2 11:9 ftst24-2.txt END=81F0 ; BDOS TEST24-2 file read(random read) ; from ftest4-1.txt & ftest3dm.txt & ftst21.txt ;2012/2/28 ;4/30 5/2 ; 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 CA5481 JP Z,OPENERR ; 810C AF XOR A 810D 327F80 LD (FCBR2),A 8110 327E80 LD (FCBR1),A 8113 210084 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 CA4E81 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 C23C81 JP NZ,READERR ; 812F 218080 LD HL,DMA 8132 7E LD A,(HL) 8133 CDC081 CALL B2HEXDP 8136 CD5D81 CALL CRLF 8139 C31781 JP LOOP ; 813C E1 READERR:POP HL 813D F630 OR 30 813F F5 PUSH AF 8140 11EC81 LD DE,ERRT 8143 CD5781 CALL MSGOUT 8146 F1 POP AF 8147 5F LD E,A 8148 0E02 LD C,02 814A CD0580 CALL FCALL 814D C9 RET ; 814E 11E681 END:LD DE,OK 8151 C35781 JP MSGOUT ; 8154 11D981 OPENERR:LD DE,CANTOPN 8157 0E09 MSGOUT:LD C,09 8159 CD0580 CALL FCALL 815C C9 RET ; ;CL & LF 815D 3E0D CRLF:LD A,0D 815F CD6981 CALL ADP 8162 3E0A LD A,0A 8164 C36981 JP ADP ;space disp 8167 3E20 SPDP:LD A,20 ;A disp 8169 C5 ADP:PUSH BC 816A E5 PUSH HL 816B 5F LD E,A 816C 0E02 LD C,02 816E CD0580 CALL FCALL 8171 E1 POP HL 8172 C1 POP BC 8173 C9 RET ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE 8174 7C B2HEX4:LD A,H 8175 CD7A81 CALL B2HEX2 8178 EB EX DE,HL 8179 7B LD A,E ;binary to hex, 1byte data to ascii 2charactors,A to DE 817A F5 B2HEX2:PUSH AF 817B 0F RRCA 817C 0F RRCA 817D 0F RRCA 817E 0F RRCA 817F CD8981 CALL B2HEX1 8182 57 LD D,A 8183 F1 POP AF 8184 CD8981 CALL B2HEX1 8187 5F LD E,A 8188 C9 RET ;binary to hex, low 4bit to ascii 1charactor 8189 E60F B2HEX1:AND 0F 818B C630 ADD A,30 818D FE3A CP 3A 818F D8 RET C;0-9 8190 C607 ADD A,07;A-F 8192 C9 RET ;hex to binary, ascii 1charactor to low 4bit 8193 FE30 HTOB1:CP 30;>="0"? 8195 D8 RET C;no 8196 FE3A CP 3A;<="9"? 8198 DAAC81 JP C,HTOB1_2;yes,"0" to "9" 819B FE41 CP 41;>="A" ? 819D D8 RET C;no 819E FE47 CP 47;<="F"? 81A0 DAAA81 JP C,HTOB1_1 81A3 FE61 CP 61;>="a"? 81A5 D8 RET C;no 81A6 FE67 CP 67;<="f"? 81A8 3F CCF 81A9 D8 RET C;no 81AA C609 HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F 81AC E60F HTOB1_2:AND 0F 81AE C9 RET ;HL(bynary 2bytes) to asckii 4bytes & disp 81AF C5 HEX4DP:PUSH BC 81B0 E5 PUSH HL 81B1 CD7481 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes 81B4 D5 PUSH DE 81B5 EB EX DE,HL 81B6 CDCB81 CALL DEDP 81B9 D1 POP DE 81BA CDCB81 CALL DEDP 81BD E1 POP HL 81BE C1 POP BC 81BF C9 RET ;A(binary) to asckii 2bytes HEX & disp 81C0 C5 B2HEXDP:PUSH BC 81C1 E5 PUSH HL 81C2 CD7A81 CALL B2HEX2 81C5 CDCB81 CALL DEDP 81C8 E1 POP HL 81C9 C1 POP BC 81CA C9 RET ; ;DE(asckii 2bytes) disp 81CB D5 DEDP:PUSH DE 81CC 5A LD E,D 81CD 0E02 LD C,02 81CF CD0580 CALL FCALL 81D2 D1 POP DE 81D3 0E02 LD C,02 81D5 CD0580 CALL FCALL 81D8 C9 RET ; 81D9 63616E27 CANTOPN:"can'" 81DD 74206F70 "t op" 81E1 656E "en" 81E3 0D DB 0D 81E4 0A DB 0A 81E5 24 DB 24;$ 81E6 656E64 OK:"end" 81E9 0D DB 0D 81EA 0A DB 0A 81EB 24 DB 24;$ 81EC 65727220 ERRT:"err " 81F0 24 DB 24;$ ; ADP =8169 B2HEX1 =8189 B2HEX2 =817A B2HEX4 =8174 B2HEXDP =81C0 CANTOPN =81D9 CRLF =815D DEDP =81CB DMA =8080 END =814E ERRT =81EC FCALL =8005 FCB =805C FCBR0 =807D FCBR1 =807E FCBR2 =807F HEX4DP =81AF HTOB1 =8193 HTOB1_1 =81AA HTOB1_2 =81AC LOOP =8117 MSGOUT =8157 NMBRTBL =8400 OK =81E6 OPENERR =8154 READERR =813C RECNO =807C SPDP =8167 |
logfile nd80zlog\05021051.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** >cm 8400 8400 1A-0f 8401 28-0e 8402 10-0d 8403 11-0c 8404 90-0b 8405 0A-0a 8406 04-09 8407 00-08 8408 30-07 8409 30-06 840A 00-05 840B 42-04 840C 45-03 840D 01-02 840E C0-01 840F 85-00 8410 73-ff 8411 BE- > |
>/ld ftst24-2.bin,8100 loading FTST24-2.BIN ...00f1(241)bytes loaded,from 8100 to 81F0 >jp d233 a>dir A: FTST23 COM : TEST SAF : FTST24 COM a>save 1 ftst24-2.com a>ftst24-2 test.saf 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 00 end a> |