復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第108回]
●ファンクションコール21H(ランダムリード)
ファンクションコール21Hはランダムファイルのレコードの読み出しを行ないます。
レコードb指定してコールすると、ランダムファイルのそのレコードbフデータ128バイトがDMAエリアに読み出されます。
●テストプログラムFTST21.TXT
ファンクションコール21HのテストプログラムFTST21.TXTのソースリストです。
; BDOS TEST21 function21 random read ;2012/3/4 3/7 4/16 4/17 4/27 ; 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 HL,NMBRTBL PUSH HL LOOP:POP HL LD A,(HL) LD (FCBR0),A INC HL LD A,(HL) CP FF JP Z,END LD (FCBR1),A 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/4/27 17:53 ftst21.txt END=81F6 ; BDOS TEST21 function21 random read ;2012/3/4 3/7 4/16 4/17 4/27 ; 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 CA5981 JP Z,OPENERR ; 810C AF XOR A 810D 327F80 LD (FCBR2),A 8110 210083 LD HL,NMBRTBL 8113 E5 PUSH HL 8114 E1 LOOP:POP HL 8115 7E LD A,(HL) 8116 327D80 LD (FCBR0),A 8119 23 INC HL 811A 7E LD A,(HL) 811B FEFF CP FF 811D CA5381 JP Z,END 8120 327E80 LD (FCBR1),A 8123 23 INC HL 8124 E5 PUSH HL ; 8125 0E21 LD C,21;random read 8127 115C80 LD DE,FCB 812A CD0580 CALL FCALL 812D B7 OR A 812E C24181 JP NZ,READERR ;data disp 8131 218080 LD HL,DMA 8134 5E LD E,(HL) 8135 23 INC HL 8136 56 LD D,(HL) 8137 EB EX DE,HL 8138 CDB481 CALL HEX4DP 813B CD6281 CALL CRLF 813E C31481 JP LOOP ; 8141 E1 READERR:POP HL 8142 F630 OR 30 8144 F5 PUSH AF 8145 11F281 LD DE,ERRT 8148 CD5C81 CALL MSGOUT 814B F1 POP AF 814C 5F LD E,A 814D 0E02 LD C,02 814F CD0580 CALL FCALL 8152 C9 RET ; 8153 11EC81 END:LD DE,OK 8156 C35C81 JP MSGOUT ; 8159 11DE81 OPENERR:LD DE,CANTOPN 815C 0E09 MSGOUT:LD C,09 815E CD0580 CALL FCALL 8161 C9 RET ; ;CL & LF 8162 3E0D CRLF:LD A,0D 8164 CD6E81 CALL ADP 8167 3E0A LD A,0A 8169 C36E81 JP ADP ;space disp 816C 3E20 SPDP:LD A,20 ;A disp 816E C5 ADP:PUSH BC 816F E5 PUSH HL 8170 5F LD E,A 8171 0E02 LD C,02 8173 CD0580 CALL FCALL 8176 E1 POP HL 8177 C1 POP BC 8178 C9 RET ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE 8179 7C B2HEX4:LD A,H 817A CD7F81 CALL B2HEX2 817D EB EX DE,HL 817E 7B LD A,E ;binary to hex, 1byte data to ascii 2charactors,A to DE 817F F5 B2HEX2:PUSH AF 8180 0F RRCA 8181 0F RRCA 8182 0F RRCA 8183 0F RRCA 8184 CD8E81 CALL B2HEX1 8187 57 LD D,A 8188 F1 POP AF 8189 CD8E81 CALL B2HEX1 818C 5F LD E,A 818D C9 RET ;binary to hex, low 4bit to ascii 1charactor 818E E60F B2HEX1:AND 0F 8190 C630 ADD A,30 8192 FE3A CP 3A 8194 D8 RET C;0-9 8195 C607 ADD A,07;A-F 8197 C9 RET ;hex to binary, ascii 1charactor to low 4bit 8198 FE30 HTOB1:CP 30;>="0"? 819A D8 RET C;no 819B FE3A CP 3A;<="9"? 819D DAB181 JP C,HTOB1_2;yes,"0" to "9" 81A0 FE41 CP 41;>="A" ? 81A2 D8 RET C;no 81A3 FE47 CP 47;<="F"? 81A5 DAAF81 JP C,HTOB1_1 81A8 FE61 CP 61;>="a"? 81AA D8 RET C;no 81AB FE67 CP 67;<="f"? 81AD 3F CCF 81AE D8 RET C;no 81AF C609 HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F 81B1 E60F HTOB1_2:AND 0F 81B3 C9 RET ;HL(bynary 2bytes) to asckii 4bytes & disp 81B4 C5 HEX4DP:PUSH BC 81B5 E5 PUSH HL 81B6 CD7981 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes 81B9 D5 PUSH DE 81BA EB EX DE,HL 81BB CDD081 CALL DEDP 81BE D1 POP DE 81BF CDD081 CALL DEDP 81C2 E1 POP HL 81C3 C1 POP BC 81C4 C9 RET ;A(binary) to asckii 2bytes HEX & disp 81C5 C5 B2HEXDP:PUSH BC 81C6 E5 PUSH HL 81C7 CD7F81 CALL B2HEX2 81CA CDD081 CALL DEDP 81CD E1 POP HL 81CE C1 POP BC 81CF C9 RET ; ;DE(asckii 2bytes) disp 81D0 D5 DEDP:PUSH DE 81D1 5A LD E,D 81D2 0E02 LD C,02 81D4 CD0580 CALL FCALL 81D7 D1 POP DE 81D8 0E02 LD C,02 81DA CD0580 CALL FCALL 81DD C9 RET ; 81DE 63616E27 CANTOPN:"can'" 81E2 74206F70 "t op" 81E6 656E21 "en!" 81E9 0D DB 0D 81EA 0A DB 0A 81EB 24 DB 24;$ 81EC 656E64 OK:"end" 81EF 0D DB 0D 81F0 0A DB 0A 81F1 24 DB 24;$ 81F2 65727220 ERRT:"err " 81F6 24 DB 24;$ ; ADP =816E B2HEX1 =818E B2HEX2 =817F B2HEX4 =8179 B2HEXDP =81C5 CANTOPN =81DE CRLF =8162 DEDP =81D0 DMA =8080 END =8153 ERRT =81F2 FCALL =8005 FCB =805C FCBR0 =807D FCBR1 =807E FCBR2 =807F HEX4DP =81B4 HTOB1 =8198 HTOB1_1 =81AF HTOB1_2 =81B1 LOOP =8114 MSGOUT =815C NMBRTBL =8300 OK =81EC OPENERR =8159 READERR =8141 SPDP =816C |
ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** >/ld ftst21.bin,8100 >loading FTST21.BIN ...00f7(247)bytes loaded,from 8100 to 81F6 >jp d233 a>b: b>save 1 ftst21.com b>dir B: TEST RAF : FTST21 COM b>ftst21 a:test.raf 01A2 03B5 009E 0044 03B6 01A7 009F 009A 03B3 01A5 0098 0047 0042 end b>ftst21 test.raf 01A2 03B5 009E 0044 03B6 01A7 009F 009A 03B3 01A5 0098 0047 0042 end b> |