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

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

[第116回]


●シーケンシャルファイルをランダムにアクセスする

前回は、シーケンシャルファイルをオープンして、ランダムリードのファンクションコールを使って、ランダムにレコードを読み出しました。
しかし、そのプログラムをさらによくよく見ていましたら。

まてよ。何もわざわざランダムリードのファンクションコールなど使わなくても、こんなことなら、シーケンシャルリードのファンクションコールでも同じことができるじゃないの。
ということに気が付きました。

もっともそれが簡単にできるのは、同一エクステントの範囲内のレコードを対象にしている限りでは、という但し書きがついてのお話ですけれど。
え?
何を言っているのか、わかりませんか?
あ。
まあ、これは座興のようなものでありますから、余り深く考えなくてもよろしいと思います。

そこで。
前回、ファンクションコール21H(ランダムリード)を使ったところを、ファンクションコール14H(シーケンシャルリード)に書き換えて、同じことをしてみます。

●テストプログラムFTST24−4

前回と同じくシーケンシャルファイルをオープンして、ランダムにリードしてしまうプログラムです。
ただし、前回はファンクションコール21Hであったところをファンクションコール14Hに書き換えています。
そのほかにもちょいと変更しているところがあります。
[第112回]で使った通常のシーケンシャルファイルリードプログラム(FTST24)と、前回のプログラム(FTST24−2)と、そして今回のFTST24−4の、どこがどのように違っているのか、考えてみてください。

こちらがソースプログラムFTST24−4.TXTです。

; BDOS TEST24-4 file read(random read)
; from ftest4-1.txt & ftest3dm.txt & ftst21.txt
;2012/2/28
;4/30 5/2 5/9
;
        ORG $8100
        FCALL=$8005
        FCB=$805C
        RECNO=$807C
        FCBR0=$807D
        FCBR1=$807E
        FCBR2=$807F
        DMA=$8080
        NMBRTBL=$8400
;
        LD C,0F;open
        LD DE,FCB
        CALL FCALL
        INC A;if FFH?
        JP Z,OPENERR
;
        LD HL,NMBRTBL
        PUSH HL
LOOP:POP HL
        LD A,(HL)
        LD (RECNO),A
        CP FF
        JP Z,END
        INC HL
        PUSH HL
;
        LD C,14;sequential read
        LD DE,FCB
        CALL FCALL
        OR A
        JP NZ,READERR
;
        LD HL,DMA
        LD A,(HL)
        CALL B2HEXDP
        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;$
;

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

2012/5/9  21:3  ftst24-4.txt
END=81E9
              ; BDOS TEST24-4 file read(random read)
              ; from ftest4-1.txt & ftest3dm.txt & ftst21.txt
              ;2012/2/28
              ;4/30 5/2 5/9
              ;
                      ORG $8100
                      FCALL=$8005
                      FCB=$805C
                      RECNO=$807C
                FCBR0=$807D
                FCBR1=$807E
                FCBR2=$807F
                      DMA=$8080
                NMBRTBL=$8400
              ;
8100 0E0F             LD C,0F;open
8102 115C80           LD DE,FCB
8105 CD0580           CALL FCALL
8108 3C               INC A;if FFH?
8109 CA4D81           JP Z,OPENERR
              ;
810C 210084     LD HL,NMBRTBL
810F E5         PUSH HL
8110 E1       LOOP:POP HL
8111 7E         LD A,(HL)
8112 327C80     LD (RECNO),A
8115 FEFF       CP FF
8117 CA4781     JP Z,END
811A 23         INC HL
811B E5         PUSH HL
              ;
811C 0E14       LD C,14;sequential read
811E 115C80     LD DE,FCB
8121 CD0580     CALL FCALL
8124 B7         OR A
8125 C23581     JP NZ,READERR
              ;
8128 218080           LD HL,DMA
812B 7E         LD A,(HL)
812C CDB981           CALL B2HEXDP
812F CD5681           CALL CRLF
8132 C31081           JP LOOP
              ;
8135 E1       READERR:POP HL
8136 F630       OR 30
8138 F5         PUSH AF
8139 11E581     LD DE,ERRT
813C CD5081     CALL MSGOUT
813F F1         POP AF
8140 5F         LD E,A
8141 0E02       LD C,02
8143 CD0580     CALL FCALL
8146 C9         RET
              ;
8147 11DF81   END:LD DE,OK
814A C35081     JP MSGOUT
              ;
814D 11D281   OPENERR:LD DE,CANTOPN
8150 0E09     MSGOUT:LD C,09
8152 CD0580           CALL FCALL
8155 C9               RET
              ;
              ;CL & LF
8156 3E0D     CRLF:LD A,0D
8158 CD6281     CALL ADP
815B 3E0A       LD A,0A
815D C36281     JP ADP
              ;space disp
8160 3E20     SPDP:LD A,20
              ;A disp
8162 C5       ADP:PUSH BC
8163 E5         PUSH HL
8164 5F         LD E,A
8165 0E02       LD C,02
8167 CD0580     CALL FCALL
816A E1         POP HL
816B C1         POP BC
816C C9         RET
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
816D 7C       B2HEX4:LD A,H
816E CD7381     CALL B2HEX2
8171 EB         EX DE,HL
8172 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
8173 F5       B2HEX2:PUSH AF
8174 0F         RRCA
8175 0F         RRCA
8176 0F         RRCA
8177 0F         RRCA
8178 CD8281     CALL B2HEX1
817B 57         LD D,A
817C F1         POP AF
817D CD8281     CALL B2HEX1
8180 5F         LD E,A
8181 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
8182 E60F     B2HEX1:AND 0F
8184 C630       ADD A,30
8186 FE3A       CP 3A
8188 D8         RET C;0-9
8189 C607       ADD A,07;A-F
818B C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
818C FE30     HTOB1:CP 30;>="0"?
818E D8         RET C;no
818F FE3A       CP 3A;<="9"?
8191 DAA581     JP C,HTOB1_2;yes,"0" to "9"
8194 FE41       CP 41;>="A" ?
8196 D8         RET C;no
8197 FE47       CP 47;<="F"?
8199 DAA381     JP C,HTOB1_1
819C FE61       CP 61;>="a"?
819E D8         RET C;no
819F FE67       CP 67;<="f"?
81A1 3F         CCF
81A2 D8         RET C;no
81A3 C609     HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
81A5 E60F     HTOB1_2:AND 0F
81A7 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
81A8 C5       HEX4DP:PUSH BC
81A9 E5         PUSH HL
81AA CD6D81     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
81AD D5         PUSH DE
81AE EB         EX DE,HL
81AF CDC481     CALL DEDP
81B2 D1         POP DE
81B3 CDC481     CALL DEDP
81B6 E1         POP HL
81B7 C1         POP BC
81B8 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
81B9 C5       B2HEXDP:PUSH BC
81BA E5         PUSH HL
81BB CD7381     CALL B2HEX2
81BE CDC481     CALL DEDP
81C1 E1         POP HL
81C2 C1         POP BC
81C3 C9         RET
              ;
              ;DE(asckii 2bytes) disp
81C4 D5       DEDP:PUSH DE
81C5 5A         LD E,D
81C6 0E02       LD C,02
81C8 CD0580     CALL FCALL
81CB D1         POP DE
81CC 0E02       LD C,02
81CE CD0580     CALL FCALL
81D1 C9         RET
              ;
81D2 63616E27 CANTOPN:"can'"
81D6 74206F70         "t op"
81DA 656E             "en"
81DC 0D               DB 0D
81DD 0A               DB 0A
81DE 24               DB 24;$
81DF 656E64   OK:"end"
81E2 0D               DB 0D
81E3 0A               DB 0A
81E4 24               DB 24;$
81E5 65727220 ERRT:"err "
81E9 24               DB 24;$
              ;
ADP          =8162  B2HEX1       =8182  B2HEX2       =8173  
B2HEX4       =816D  B2HEXDP      =81B9  CANTOPN      =81D2  
CRLF         =8156  DEDP         =81C4  DMA          =8080  
END          =8147  ERRT         =81E5  FCALL        =8005  
FCB          =805C  FCBR0        =807D  FCBR1        =807E  
FCBR2        =807F  HEX4DP       =81A8  HTOB1        =818C  
HTOB1_1      =81A3  HTOB1_2      =81A5  LOOP         =8110  
MSGOUT       =8150  NMBRTBL      =8400  OK           =81DF  
OPENERR      =814D  READERR      =8135  RECNO        =807C  
SPDP         =8160  

●もう一度ディスクをクリアしました

今までのテストでシーケンシャルファイルTEST.SAFもいろいろさわってしまっていますし、Aドライブがまたしてもディスクフルの状態になってしまっていますから、もういちどディスクをクリアして中をすっきりさせてからテストを行なうことにいたします。

FILLE5.BINを実行して仮RAMディスクをクリアしてから、シーケンシャルファイルをもう一度作成しました。
シーケンシャルファイル作成プログラムは[第111回]で作ったFTST23を実行して作成します。

DIRコマンドでTEST.SAFが作成されたことを確認してから、一度CP/Mを終了して、ZB3BASICに戻ります。
今回のテストプログラムFTST24−4.binをロードするためです。

logfile nd80zlog\05092109.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld fille5.bin,8100
loading FILLE5.BIN ...0010(16)bytes loaded,from 8100 to 810F
>jp 8100
>/ld ftst23.bin,8100
loading FTST23.BIN ...0076(118)bytes loaded,from 8100 to 8175
>jp d233

a>dir
No file
a>save 1 ftst23.com
a>ftst23 test.saf
done

a>dir
A: FTST23   COM : TEST     SAF
a>^D
end of CP/M
>


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

アドレス8100HにFTST24−4.BINをロードしたあと、
jp d233[Enter]
でCP/Mを起動しました。
そのあと
save 1 ftst24−4.com[Enter]
と入力して、FTST24−4.COMのファイル名でAドライブにセーブし、
それから
ftst24−4 test.saf[Enter]
と入力して、プログラムを実行しました。

>/ld ftst24-4.bin,8100
loading FTST24-4.BIN ...00ea(234)bytes loaded,from 8100 to 81E9
>jp d233

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

a>^D
end of CP/M
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Wed May 09 21:12:21 2012

なんと、ご覧の通り、ファンクションコール14H(シーケンシャルリード)を使って、ランダムアクセス(!)して、逆順で読み出すことができました。

中味が見えなくて融通がきかずにいらいらさせられてしまうWindowsAPIなどに比べますと、なんとおおらかなことでしょう。
なんだか楽しくなってしまいます。
やっぱりマシン語(それも8ビット)が楽しくてよいのではありませんか、ねえ。

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

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