2012.5.5
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第112回]


●ファンクションコール24H(ランダムレコードアクセスポインタの更新)その2

前回からの続きです。
前回はファンクションコール24Hの動作を確認するために、まずシーケンシャルファイルを作成することからスタートしました。
ファンクションコール24Hはシーケンシャルファイルをアクセスした後で使うことが前提だからです。
前回はそのシーケンシャルファイルを作成するためのテストプログラムを作って実行し、シーケンシャルファイルを作成しました。
今回は、前回作成したシーケンシャルファイルのレコードを順に読んで、その内容を表示するプログラムを作成します。

●シーケンシャルファイルリードプログラム

シーケンシャルリードについては、[第46回]で、ファンクションコール14H(シーケンシャルリード)を使ったテストプログラムを作成しました。
しかし前回、シーケンシャルファイル作成プログラムを新規に作成することにした理由と同じで、[第46回]で作ったテストプログラムは、今回のテストには不向きなところがありますから、今回のテスト用にあらためて作成することにしました。

こちらがシーケンシャルファイルリードプログラム(FTST24)のソースリストFTST24.TXTです。

; BDOS TEST24 file read
; from ftest4-1.txt & ftest3dm.txt
;2012/2/28
;4/30
;
        ORG $8100
        FCALL=$8005
        FCB=$805C
        RECNO=$807C
        DMA=$8080
;
        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,72;r
        CALL ADP
        LD A,3D;=
        CALL ADP
        LD A,(RECNO)
        CALL B2HEXDP
        CALL SPDP
        LD A,64;d
        CALL ADP
        LD A,3D;=
        CALL ADP
        LD HL,DMA
LOOP2:LD A,(HL)
        CALL B2HEXDP
        CALL CRLF
        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;$
;

;

ちょっと訳があって、ただレコードを読む以外のこともしています。
シーケンシャルリードは、ファイルのレコードを最初に読むときに、FCBの33バイト目(RECNO)に00を書き込みます。
ここはシーケンシャルリード(またはライト)で、次にアクセスするレコードbェ置かれるところです。
今回のプログラムではレコードを読むとともに、そのRECNOの値も読んで表示するようにしました。
その値も、レコードのデータを読んで表示する値も16進数で表示します。
レコードのデータは128バイトの全部が同じ値(レコードbノ一致)ですから1バイトだけを表示します。
RECNOの値はr=に続けて16進数2桁で表示します。
レコードのデータはd=に続けて16進数2桁で表示します。

こちらがアセンブルリストFTST24.LSTです。

2012/4/30  11:41  ftst24.txt
END=81D5
              ; BDOS TEST24 file read
              ; from ftest4-1.txt & ftest3dm.txt
              ;2012/2/28
              ;4/30
              ;
                      ORG $8100
                      FCALL=$8005
                      FCB=$805C
                      RECNO=$807C
                      DMA=$8080
              ;
8100 0E0F             LD C,0F;open
8102 115C80           LD DE,FCB
8105 CD0580           CALL FCALL
8108 3C               INC A;if FFH?
8109 CAC081           JP Z,ERR
810C AF               XOR A
810D 327C80           LD (RECNO),A
              ;
8110 0E14     LOOP1:  LD C,14;read
8112 115C80           LD DE,FCB
8115 CD0580           CALL FCALL
8118 B7               OR A
8119 C0               RET NZ;read end
              ;
811A 3E72       LD A,72;r
811C CD5081     CALL ADP
811F 3E3D       LD A,3D;=
8121 CD5081     CALL ADP
8124 3A7C80     LD A,(RECNO)
8127 CDA781     CALL B2HEXDP
812A CD4E81     CALL SPDP
812D 3E64       LD A,64;d
812F CD5081     CALL ADP
8132 3E3D       LD A,3D;=
8134 CD5081     CALL ADP
8137 218080           LD HL,DMA
813A 7E       LOOP2:LD A,(HL)
813B CDA781           CALL B2HEXDP
813E CD4481           CALL CRLF
8141 C31081           JP LOOP1
              ;
              ;CL & LF
8144 3E0D     CRLF:LD A,0D
8146 CD5081     CALL ADP
8149 3E0A       LD A,0A
814B C35081     JP ADP
              ;space disp
814E 3E20     SPDP:LD A,20
              ;A disp
8150 C5       ADP:PUSH BC
8151 E5         PUSH HL
8152 5F         LD E,A
8153 0E02       LD C,02
8155 CD0580     CALL FCALL
8158 E1         POP HL
8159 C1         POP BC
815A C9         RET
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
815B 7C       B2HEX4:LD A,H
815C CD6181     CALL B2HEX2
815F EB         EX DE,HL
8160 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
8161 F5       B2HEX2:PUSH AF
8162 0F         RRCA
8163 0F         RRCA
8164 0F         RRCA
8165 0F         RRCA
8166 CD7081     CALL B2HEX1
8169 57         LD D,A
816A F1         POP AF
816B CD7081     CALL B2HEX1
816E 5F         LD E,A
816F C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
8170 E60F     B2HEX1:AND 0F
8172 C630       ADD A,30
8174 FE3A       CP 3A
8176 D8         RET C;0-9
8177 C607       ADD A,07;A-F
8179 C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
817A FE30     HTOB1:CP 30;>="0"?
817C D8         RET C;no
817D FE3A       CP 3A;<="9"?
817F DA9381     JP C,HTOB1_2;yes,"0" to "9"
8182 FE41       CP 41;>="A" ?
8184 D8         RET C;no
8185 FE47       CP 47;<="F"?
8187 DA9181     JP C,HTOB1_1
818A FE61       CP 61;>="a"?
818C D8         RET C;no
818D FE67       CP 67;<="f"?
818F 3F         CCF
8190 D8         RET C;no
8191 C609     HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
8193 E60F     HTOB1_2:AND 0F
8195 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
8196 C5       HEX4DP:PUSH BC
8197 E5         PUSH HL
8198 CD5B81     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
819B D5         PUSH DE
819C EB         EX DE,HL
819D CDB281     CALL DEDP
81A0 D1         POP DE
81A1 CDB281     CALL DEDP
81A4 E1         POP HL
81A5 C1         POP BC
81A6 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
81A7 C5       B2HEXDP:PUSH BC
81A8 E5         PUSH HL
81A9 CD6181     CALL B2HEX2
81AC CDB281     CALL DEDP
81AF E1         POP HL
81B0 C1         POP BC
81B1 C9         RET
              ;
              ;DE(asckii 2bytes) disp
81B2 D5       DEDP:PUSH DE
81B3 5A         LD E,D
81B4 0E02       LD C,02
81B6 CD0580     CALL FCALL
81B9 D1         POP DE
81BA 0E02       LD C,02
81BC CD0580     CALL FCALL
81BF C9         RET
              ;
81C0 11C981   ERR:LD DE,ERRMSG
81C3 0E09             LD C,09
81C5 CD0580           CALL FCALL
81C8 C9               RET
81C9 63616E27 ERRMSG:"can'"
81CD 74206F70         "t op"
81D1 656E             "en"
81D3 0D               DB 0D
81D4 0A               DB 0A
81D5 24               DB 24;$
              ;
              
              ;
ADP          =8150  B2HEX1       =8170  B2HEX2       =8161  
B2HEX4       =815B  B2HEXDP      =81A7  CRLF         =8144  
DEDP         =81B2  DMA          =8080  ERR          =81C0  
ERRMSG       =81C9  FCALL        =8005  FCB          =805C  
HEX4DP       =8196  HTOB1        =817A  HTOB1_1      =8191  
HTOB1_2      =8193  LOOP1        =8110  LOOP2        =813A  
RECNO        =807C  SPDP         =814E  

●テストプログラムの実行

ZB3BASICを起動して、
/ld ftst24.bin,8100[Enter]
と入力して、FTST24.BINをロードしました。
そのあと、
jp d233[Enter]
と入力してCP/Mを起動しました。

logfile nd80zlog\04301139.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst24.bin,8100
loading FTST24.BIN ...00d6(214)bytes loaded,from 8100 to 81D5
>jp d233

a>save 1 ftst24.com
a>dir
A: FTST23   COM : TEST     SAF : FTST24   COM
a>ftst24 test.saf
r=01 d=00
r=02 d=01
r=03 d=02
r=04 d=03
r=05 d=04
r=06 d=05
r=07 d=06
r=08 d=07
r=09 d=08
r=0A d=09
r=0B d=0A
r=0C d=0B
r=0D d=0C
r=0E d=0D
r=0F d=0E
r=10 d=0F

a>^D
end of CP/M
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Mon Apr 30 11:44:52 2012


CP/Mを起動後、
save 1 ftst24.com[Enter]
と入力して、FTST24.COMの名前でテストプログラムをAドライブにセーブしました。

DIRコマンドでFTST24.COMがセーブされていることを確認してから、
ftst24 test.saf[Enter]
と入力して、ftst24.comを実行しました。

その結果はレコードを読むたびに、次にアクセスするレコードbニ、読み出したレコードの中味が表示されました。

本日もちょっと時間がありません。
この続きは次回にすることにいたします。

ワンボードマイコンでCP/Mを![第112回]
2012.5.5upload

前へ
次へ
ホームページトップへ戻る