復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第234回]
●ファンクションコール24H(ランダムレコードアクセスポインタの更新)その2
前回はファンクションコール24Hのテストをするための前準備として、シーケンシャルファイルTEST.SAFを作成しました。
そしてTEST.SAFが正しく作成されたかどうかを確かめるために、VFDUMPでBドライブのセクタを直接読んで確認をしました。
それでTEST.SAFの中身の確認はできたのですけれど、[第112回]ではFTST24.COMを作って、TEST.SAFの内容を読み出しています。
ですので今回は[第112回]と同じようにして、TEST.SAFをプログラムで読み出してみることにします。
FTST24は1バイトのデータを読み出して表示するプログラムでしたが、前回作成したTEST.SAFはレコードbノ相当する2バイトのデータを書き込みました。
そこで今回はFTST24をフルRAM用に書き換えるとともに、2バイトのデータを読み込んで表示するように変更して、ファイル名VFTST24を作成しました。
●ソースプログラムVFTST24
; BDOS VFTST24 file read ; from ftest4-1.txt & ftest3dm.txt ;2012/2/28 ;4/30 ;10/18 ; ORG $0100 FCALL=$0005 FCB=$005C RECNO=$007C DMA=$0080 ; LD C,0F;open LD DE,FCB CALL FCALL INC A;if FFH? JP Z,ERR XOR A LD (RECNO),A ; LOOP1: LD C,14;read LD DE,FCB CALL FCALL OR A RET NZ;read end ; LD A,(RECNO) CALL B2HEXDP LD A,28;( CALL ADP LD HL,DMA LD C,(HL) INC HL LD A,(HL) CALL B2HEXDP LD A,C CALL B2HEXDP LD A,29;) CALL ADP CALL SPDP CALL SPDP JP LOOP1 ; ;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 ; ERR:LD DE,ERRMSG LD C,09 CALL FCALL RET ERRMSG:"can'" "t op" "en" DB 0D DB 0A DB 24;$ ; |