復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第225回]
●ファンクションコール21H(ランダムリード)
ファンクションコール21H(ランダムリード)については、最初に[第108回]で説明をしました。
そこで作ったテストプログラムはFTST21です。
仮RAMディスク版としては、[第146回]で説明をしました。
ところがあらためて[第146回]を読んでみましたら、[第108回]で作成したFTST21は2バイトのレコードwpだったものをわざわざ1バイトに直してテストをしていることがわかりました。
仮RAMディスク版としては、[第151回]で「大きなランダムファイルをつくる」ということで、そこであらためて2バイトのレコードb読み込んでランダムファイルをつくりました。
それではその後でランダムリードについてもテストをしているのか、と思ってさらに読み進んでみましたら、なんと[第152回]で、ランダムファイルを作成しただけで、めでたしめでたしで終わってしまっておりました。
ランダムライトのテストをしただけで、ランダムリードのテストはせずに終わってしまいました。
むむ。
だめじゃないか。
かなりボケが進行しているようで、ちょいと不安ですなあ。
とすると、もとになるプログラムはFTST21ということになります。
そこで、今回はFTST21を64KBフルRAM用に一部を書き換えてファイル名をVFTST21にしました。
下はそのソースプログラムリストです。
●ソースプログラムVFTST21.TXT
; BDOS TEST21 function21 random read ;2012/3/4 3/7 4/16 4/17 4/27 ;10/1 ; ORG $0100 FCALL=$0005 NMBRTBL=$0300 FCB=$005C FCBR0=$007D FCBR1=$007E FCBR2=$007F DMA=$0080 ; 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;$ ; |
●VFTST21の実行
VFTST21の実行です。
ND80ZVのメモリには前回までのテストで使用したレコード番号表がそのまま残っていますから、それを読み込んで、これも前回までのテストで作成したTEST.RAFからレコードを読み込んでそのデータの先頭2バイト(レコードbニ同じ値)を表示します。
[第106回]をバックにして実行しました。
今回はうまくいったようです。
[第223回]で追加した4レコードもちゃんと読み出しています。
いつもこんなふうに何事もなく終わってくれると楽なのですけれど。
ともあれ、今回はめでたしめでたし、でありました。
ワンボードマイコンでCP/Mを![第225回]
2012.10.1upload
前へ
次へ
ホームページトップへ戻る