復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第226回]
●ファンクションコール23H(ファイルサイズの取得)
ファンクションコール23H(ファイルサイズの取得)については、最初に[第109回]で説明をしました。
そこで作ったテストプログラムはFTST22です。
仮RAMディスク版としては、[第148回]で説明をしました。
[第148回]ではシーケンシャルファイルに対してFTST22を実行したあと、ランダファイルに対して実行したところ、ファイルサイズが正しく表示されませんでした。
DOSプログラムにバグがあったことがわかりましたので、それを修正したあと、あらためてランダムファイルに対してFTST22を実行して正しい結果を得ることができました。
そこで今回は[第148回]と同じようにシーケンシャルファイルとランダムファイルに対してテストプログラムを実行してみることにします。
今回はFTST22を64KBフルRAM用に一部を書き換えてファイル名をVFTST22にしました。
下はそのソースプログラムリストです。
●ソースプログラムVFTST22.TXT
; BDOS TEST22 function23 file size get ;2012/3/4 3/7 4/16 4/17 4/27 ;10/3 ; ORG $0100 FCALL=$0005 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 ; LD C,23;file size read LD DE,FCB CALL FCALL ; LD A,(FCBR2) CALL B2HEXDP CALL SPDP LD A,(FCBR1) CALL B2HEXDP CALL SPDP LD A,(FCBR0) CALL B2HEXDP CALL CRLF 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;$ ; |
●VFTST22の実行
VFTST22の実行です。
シーケンシャルファイルとしてはF80.COMを、そしてランダムファイルはTEST.RAFを対象にして実行してみます。
最初にDIRを実行したのですが、その後のプログラムの実行でF80.COMは画面から消えてしまいました。
最初にTEST.RAFに対してVFTST22を実行した結果、03E6と表示されました。
次にF80.COMに対してVFTST22を実行して00E0と表示されました。
結果が正しいかどうかを確認するために、VFDUMPを実行して、aドライブのディレクトリを表示させてみました。
F80.COMはエクステントが2つあります。
16バイト目の値がそのエクステントが管理しているデータブロックのサイズです。
最初のエクステントは80Hで次のエクステントは60Hです。
80H+60H=E0H
ですから、シーケンシャルファイルについては正しい結果が得られました。
ランダムファイルはどうでしょうか。
TEST.RAFにはエクステントが4つあります。
各エクステントのファイルサイズを合計してみます。
48H+28H+66H+48H=011EH
あれ?
合いませんね。
どうしたのでしょう。
本日は時間がありません。
この続きは次回にいたします。
ワンボードマイコンでCP/Mを![第226回]
2012.10.3upload
前へ
次へ
ホームページトップへ戻る