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

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

[第113回]


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

前回からの続きです。
前回は、[第111回]で作成したシーケンシャルファイルのレコードを順に読んで、その内容を表示するプログラムを作成して実行しました。
今回はそのプログラムにファンクションコール24Hを追加して、そのファンクションコールによって、ランダムアクセスのためのレコードbェFCB上に作成されることを確認します。

●テストプログラムFTST25

こちらが前回作成したFTST24.TXTにファンクションコール24Hを追加して作成したFTST25のソースリストFTST25.TXTです。

; BDOS TEST25 functioncall 24
; from ftest4-1.txt & ftest3dm.txt
;from test24
;2012/2/28
;4/30 5/2
;
        ORG $8100
        FCALL=$8005
        FCB=$805C
        RECNO=$807C
        FCBR0=$807D
        FCBR1=$807E
        FCBR2=$807F
        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
        LD A,(HL)
        CALL B2HEXDP
        CALL SPDP
        LD DE,FCB
        LD C,24
        CALL FCALL
        LD A,(FCBR2)
        CALL B2HEXDP
        CALL SPDP
        LD A,(FCBR1)
        CALL B2HEXDP
        CALL SPDP
        LD A,(FCBR0)
        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;$
;

前回作成したプログラムFTST24では、シーケンシャルファイルの1レコードデータを読んで、その次のシーケンシャルリードでレコードを読むためのレコードbェ置かれる、FCBの33バイト目(RECNO)の値を読んで、r=に続けて16進数2桁で表示し、それからレコードのデータをd=に続けて16進数2桁で表示しました。
今回のFTST25では、そのあとファンクションコール24Hを実行して、その結果作成されたFCBのランダムアクセス用のレコードb格納しているFCBの34バイト目から36バイト目の値をそれぞれ16進数で表示します。

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

2012/5/2  11:50  ftst25.txt
END=81F8
              ; BDOS TEST25 functioncall 24
              ; from ftest4-1.txt & ftest3dm.txt
              ;from test24
              ;2012/2/28
              ;4/30 5/2
              ;
                      ORG $8100
                      FCALL=$8005
                      FCB=$805C
                      RECNO=$807C
                FCBR0=$807D
                FCBR1=$807E
                FCBR2=$807F
                      DMA=$8080
              ;
8100 0E0F             LD C,0F;open
8102 115C80           LD DE,FCB
8105 CD0580           CALL FCALL
8108 3C               INC A;if FFH?
8109 CAE381           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 CD7381     CALL ADP
811F 3E3D       LD A,3D;=
8121 CD7381     CALL ADP
8124 3A7C80     LD A,(RECNO)
8127 CDCA81     CALL B2HEXDP
812A CD7181     CALL SPDP
812D 3E64       LD A,64;d
812F CD7381     CALL ADP
8132 3E3D       LD A,3D;=
8134 CD7381     CALL ADP
8137 218080           LD HL,DMA
813A 7E         LD A,(HL)
813B CDCA81           CALL B2HEXDP
813E CD7181     CALL SPDP
8141 115C80     LD DE,FCB
8144 0E24       LD C,24
8146 CD0580     CALL FCALL
8149 3A7F80           LD A,(FCBR2)
814C CDCA81     CALL B2HEXDP
814F CD7181     CALL SPDP
8152 3A7E80     LD A,(FCBR1)
8155 CDCA81     CALL B2HEXDP
8158 CD7181     CALL SPDP
815B 3A7D80     LD A,(FCBR0)
815E CDCA81     CALL B2HEXDP
8161 CD6781     CALL CRLF
8164 C31081           JP LOOP1
              ;
              ;CL & LF
8167 3E0D     CRLF:LD A,0D
8169 CD7381     CALL ADP
816C 3E0A       LD A,0A
816E C37381     JP ADP
              ;space disp
8171 3E20     SPDP:LD A,20
              ;A disp
8173 C5       ADP:PUSH BC
8174 E5         PUSH HL
8175 5F         LD E,A
8176 0E02       LD C,02
8178 CD0580     CALL FCALL
817B E1         POP HL
817C C1         POP BC
817D C9         RET
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
817E 7C       B2HEX4:LD A,H
817F CD8481     CALL B2HEX2
8182 EB         EX DE,HL
8183 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
8184 F5       B2HEX2:PUSH AF
8185 0F         RRCA
8186 0F         RRCA
8187 0F         RRCA
8188 0F         RRCA
8189 CD9381     CALL B2HEX1
818C 57         LD D,A
818D F1         POP AF
818E CD9381     CALL B2HEX1
8191 5F         LD E,A
8192 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
8193 E60F     B2HEX1:AND 0F
8195 C630       ADD A,30
8197 FE3A       CP 3A
8199 D8         RET C;0-9
819A C607       ADD A,07;A-F
819C C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
819D FE30     HTOB1:CP 30;>="0"?
819F D8         RET C;no
81A0 FE3A       CP 3A;<="9"?
81A2 DAB681     JP C,HTOB1_2;yes,"0" to "9"
81A5 FE41       CP 41;>="A" ?
81A7 D8         RET C;no
81A8 FE47       CP 47;<="F"?
81AA DAB481     JP C,HTOB1_1
81AD FE61       CP 61;>="a"?
81AF D8         RET C;no
81B0 FE67       CP 67;<="f"?
81B2 3F         CCF
81B3 D8         RET C;no
81B4 C609     HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
81B6 E60F     HTOB1_2:AND 0F
81B8 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
81B9 C5       HEX4DP:PUSH BC
81BA E5         PUSH HL
81BB CD7E81     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
81BE D5         PUSH DE
81BF EB         EX DE,HL
81C0 CDD581     CALL DEDP
81C3 D1         POP DE
81C4 CDD581     CALL DEDP
81C7 E1         POP HL
81C8 C1         POP BC
81C9 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
81CA C5       B2HEXDP:PUSH BC
81CB E5         PUSH HL
81CC CD8481     CALL B2HEX2
81CF CDD581     CALL DEDP
81D2 E1         POP HL
81D3 C1         POP BC
81D4 C9         RET
              ;
              ;DE(asckii 2bytes) disp
81D5 D5       DEDP:PUSH DE
81D6 5A         LD E,D
81D7 0E02       LD C,02
81D9 CD0580     CALL FCALL
81DC D1         POP DE
81DD 0E02       LD C,02
81DF CD0580     CALL FCALL
81E2 C9         RET
              ;
81E3 11EC81   ERR:LD DE,ERRMSG
81E6 0E09             LD C,09
81E8 CD0580           CALL FCALL
81EB C9               RET
81EC 63616E27 ERRMSG:"can'"
81F0 74206F70         "t op"
81F4 656E             "en"
81F6 0D               DB 0D
81F7 0A               DB 0A
81F8 24               DB 24;$
              ;
ADP          =8173  B2HEX1       =8193  B2HEX2       =8184  
B2HEX4       =817E  B2HEXDP      =81CA  CRLF         =8167  
DEDP         =81D5  DMA          =8080  ERR          =81E3  
ERRMSG       =81EC  FCALL        =8005  FCB          =805C  
FCBR0        =807D  FCBR1        =807E  FCBR2        =807F  
HEX4DP       =81B9  HTOB1        =819D  HTOB1_1      =81B4  
HTOB1_2      =81B6  LOOP1        =8110  RECNO        =807C  
SPDP         =8171  

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

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

logfile nd80zlog\05021130.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst25.bin,8100
loading FTST25.BIN ...00f9(249)bytes loaded,from 8100 to 81F8
>jp d233

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

a>

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

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

その結果はレコードを読むたびに、次にアクセスするレコードbニ、読み出したレコードの中味が表示され、さらに次のレコードからランダムアクセスできるように、FCBの34バイト目から36バイト目に入れられるレコードb表示しました。
このレコードbヘ、その次のレコードのb示していますから、シーケンシャルアクセスのためのレコードair= で示したajに一致します。

それが一体どうしたの?
うーん。
何のことだかよくわからないかも知れませんね。

次回はこのファンクションコール24Hの機能を使ってシーケンシャルファイルを「ランダムアクセス」してみます。

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

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