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

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

[第114回]


●シーケンシャルファイルとランダムファイル

前回からの続きです。
シーケンシャルファイルのレコードを読んだあとでファンクションコール24Hを実行して、FCBのランダムアクセス用のエリアに、その次のレコードbェ作成されることを確認しました。
でもそれだけでは一体何をやっているのかよくわからないかもしれません。
そこで今回は、前回と同じようにシーケンシャルファイルを読み込んで、その途中でファンクションコール24Hを実行して、それから先はランダムレコードライトを行なうというようなテストプログラムを作るつもりでした。
しかしどうも気が乗らないのですよねえ。
そのような機能の使い道が今ひとつはっきり納得できないものですから、まるでカスのようなプログラムになってしまいます。

実はCP/Mの場合、シーケンシャルファイルとランダムファイルの区別が明確ではないのです。
はっきり言ってしまえば、ファイルを作成する過程でランダムにレコードを書くことができるのがランダムライトで、その結果作成されたファイルはランダムファイルになるのですけれど、それならシーケンシャルファイルはランダムアクセスできないかといいますと、それができてしまうのです。
しかもそれはファンクションコール24Hを使わなくても、できてしまいます。

むむむ。
そういう教科書通りではないことのほうが楽しいのですよねえ。
で。
予定を変更して、そういうプログラムを作って試してみました。

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

シーケンシャルファイルを読み込んで、ランダムライトをしてしまうプログラムです。
こちらがそのソースプログラムFTST20−4.TXTです。

; BDOS TEST20-4 function22 random write(sequential file open)
;2012/3/4 3/7 4/16 4/17 5/2
;
        ORG $8100
        FCALL=$8005
	NMBRTBL=$8500
        FCB=$805C
	FCBR0=$807D
	FCBR1=$807E
	FCBR2=$807F
        DMA=$8080
;
        LD C,0F;file open
        LD DE,FCB
        CALL FCALL
        INC A;if FFH?
        JP Z,OPENERR
;
        XOR A
        LD (FCBR2),A
	LD HL,NMBRTBL
	PUSH HL
LOOP:POP HL
	LD A,(HL)
	CP FF
	JP Z,CLOSE
	LD (FCBR0),A
	LD C,A
	XOR A
	LD (FCBR1),A
	INC HL
	PUSH HL
;data fill
	LD HL,DMA
	LD B,80
LOOP2:LD (HL),C
	INC HL
	DEC B
	JP NZ,LOOP2
;
	LD C,22;random write
	LD DE,FCB
	CALL FCALL
	OR A
	JP Z,LOOP
	POP HL
	OR 30
	PUSH AF
	LD DE,ERRT
	CALL MSGOUT
	POP AF
	LD E,A
	LD C,02
	CALL FCALL
	RET
;
CLOSE:LD C,10;close
	LD DE,FCB
	CALL FCALL
	INC A;if FFH?
	JP Z,CLOSERR
	LD DE,OK
	JP MSGOUT
;
OPENERR:LD DE,CANTOPN
	JP MSGOUT
CLOSERR:LD DE,CANTCLS
MSGOUT:LD C,09
        CALL FCALL
        RET
;
CANTOPN:"can'"
        "t op"
        "en!"
        DB 0D
        DB 0A
        DB 24;$
CANTCLS:"can'"
        "t cl"
        "ose!"
        DB 0D
        DB 0A
        DB 24;$
OK:"done"
        DB 0D
        DB 0A
        DB 24;$
ERRT:"err "
        DB 24;$
;

前回でも使ったシーケンシャルファイルTEST.SAFをファイルオープンして、それを読み込むのではなくて、あらかじめ作成しておいたレコードu\にしたがってランダムにレコードを書き込んでしまうという、なんともメチャクチャなことをやります。
でも、ちゃんとできてしまいます。
CP/Mのファイル構造はかなり原始的なのです。

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

2012/5/2  11:9  ftst20-4.txt
END=8197
              ; BDOS TEST20-4 function22 random write(sequential file open)
              ;2012/3/4 3/7 4/16 4/17 5/2
              ;
                      ORG $8100
                      FCALL=$8005
              	NMBRTBL=$8500
                      FCB=$805C
              	FCBR0=$807D
              	FCBR1=$807E
              	FCBR2=$807F
                      DMA=$8080
              ;
8100 0E0F             LD C,0F;file open
8102 115C80           LD DE,FCB
8105 CD0580           CALL FCALL
8108 3C               INC A;if FFH?
8109 CA6081           JP Z,OPENERR
              ;
810C AF               XOR A
810D 327F80           LD (FCBR2),A
8110 210085   	LD HL,NMBRTBL
8113 E5       	PUSH HL
8114 E1       LOOP:POP HL
8115 7E       	LD A,(HL)
8116 FEFF     	CP FF
8118 CA4E81   	JP Z,CLOSE
811B 327D80   	LD (FCBR0),A
811E 4F       	LD C,A
811F AF       	XOR A
8120 327E80   	LD (FCBR1),A
8123 23       	INC HL
8124 E5       	PUSH HL
              ;data fill
8125 218080   	LD HL,DMA
8128 0680     	LD B,80
812A 71       LOOP2:LD (HL),C
812B 23       	INC HL
812C 05       	DEC B
812D C22A81   	JP NZ,LOOP2
              ;
8130 0E22     	LD C,22;random write
8132 115C80   	LD DE,FCB
8135 CD0580   	CALL FCALL
8138 B7       	OR A
8139 CA1481   	JP Z,LOOP
813C E1       	POP HL
813D F630     	OR 30
813F F5       	PUSH AF
8140 119381   	LD DE,ERRT
8143 CD6981   	CALL MSGOUT
8146 F1       	POP AF
8147 5F       	LD E,A
8148 0E02     	LD C,02
814A CD0580   	CALL FCALL
814D C9       	RET
              ;
814E 0E10     CLOSE:LD C,10;close
8150 115C80   	LD DE,FCB
8153 CD0580   	CALL FCALL
8156 3C       	INC A;if FFH?
8157 CA6681   	JP Z,CLOSERR
815A 118C81   	LD DE,OK
815D C36981   	JP MSGOUT
              ;
8160 116F81   OPENERR:LD DE,CANTOPN
8163 C36981   	JP MSGOUT
8166 117D81   CLOSERR:LD DE,CANTCLS
8169 0E09     MSGOUT:LD C,09
816B CD0580           CALL FCALL
816E C9               RET
              ;
816F 63616E27 CANTOPN:"can'"
8173 74206F70         "t op"
8177 656E21           "en!"
817A 0D               DB 0D
817B 0A               DB 0A
817C 24               DB 24;$
817D 63616E27 CANTCLS:"can'"
8181 7420636C         "t cl"
8185 6F736521         "ose!"
8189 0D               DB 0D
818A 0A               DB 0A
818B 24               DB 24;$
818C 646F6E65 OK:"done"
8190 0D               DB 0D
8191 0A               DB 0A
8192 24               DB 24;$
8193 65727220 ERRT:"err "
8197 24               DB 24;$
              ;
CANTCLS      =817D  CANTOPN      =816F  CLOSE        =814E  
CLOSERR      =8166  DMA          =8080  ERRT         =8193  
FCALL        =8005  FCB          =805C  FCBR0        =807D  
FCBR1        =807E  FCBR2        =807F  LOOP         =8114  
LOOP2        =812A  MSGOUT       =8169  NMBRTBL      =8500  
OK           =818C  OPENERR      =8160  

●準備

まず最初にレコードu\を作成します。
アドレス8500Hから、大きくない1バイトの適当なwをCMコマンドで作成します。
レコードbP5、1F、13、10、07、03をこの順で作成します。
このうち07と03はすでに存在するレコードです。

確認のために、既に作成済みのシーケンシャルファイルTEST.SAFのレコードbR、bVのデータを一部変更しておきます。
ND80ZV上のRAMエリアを利用した仮RAMディスクだからこそできることです。
データの先頭4バイトをFFで置き換えました。

logfile nd80zlog\05021109.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>cm 8500
8500 FC-15
8501 CF-1F
8502 BD-13
8503 E7-10
8504 D7-07
8505 3B-03
8506 A7-ff
8507 DF-
>dm 8d00,8dff
8D00  02 02 02 02 02 02 02 02-02 02 02 02 02 02 02 02  ................
8D10  02 02 02 02 02 02 02 02-02 02 02 02 02 02 02 02  ................
8D20  02 02 02 02 02 02 02 02-02 02 02 02 02 02 02 02  ................
8D30  02 02 02 02 02 02 02 02-02 02 02 02 02 02 02 02  ................
8D40  02 02 02 02 02 02 02 02-02 02 02 02 02 02 02 02  ................
8D50  02 02 02 02 02 02 02 02-02 02 02 02 02 02 02 02  ................
8D60  02 02 02 02 02 02 02 02-02 02 02 02 02 02 02 02  ................
8D70  02 02 02 02 02 02 02 02-02 02 02 02 02 02 02 02  ................
8D80  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8D90  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DA0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DB0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DC0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DD0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DE0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DF0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
>cm 8d80
8D80 03-ff
8D81 03-ff
8D82 03-ff
8D83 03-ff
8D84 03-
>dm 8d80,8dff
8D80  FF FF FF FF 03 03 03 03-03 03 03 03 03 03 03 03  ................
8D90  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DA0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DB0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DC0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DD0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DE0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DF0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
>cm 8f80
8F80 07-ff
8F81 07-ff
8F82 07-ff
8F83 07-ff
8F84 07-
>dm 8f80,8fff
8F80  FF FF FF FF 07 07 07 07-07 07 07 07 07 07 07 07  ................
8F90  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FA0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FB0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FC0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FD0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FE0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FF0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
>

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

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

>/ld ftst20-4.bin,8100
loading FTST20-4.BIN ...0098(152)bytes loaded,from 8100 to 8197
>jp d233

a>dir
A: FTST23   COM : TEST     SAF : FTST24   COM : FTST24-2 COM
a>save 1 ftst20-4.com
a>ftst20-4 test.saf
done

a>^D
end of CP/M
>

●実行結果の確認

ディレクトリエリアをDMコマンドで表示させました。
TEST.SAFのFCBエリアを見るとランダムなブロックbェ作成されています。
当初は16レコードのシーケンシャルファイルですから、ブロック02、03、04、05の4ブロックだけでしたが、そこに0B、09、0Aが追加されています。

>dm 8800,88ff
8800  00 46 54 53 54 32 33 20-20 43 4F 4D 00 00 00 02  .FTST23  COM....
8810  01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8820  00 54 45 53 54 20 20 20-20 53 41 46 00 00 00 20  .TEST    SAF... 
8830  02 03 04 05 0B 09 00 0A-00 00 00 00 00 00 00 00  ................
8840  00 46 54 53 54 32 34 20-20 43 4F 4D 00 00 00 02  .FTST24  COM....
8850  06 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8860  00 46 54 53 54 32 34 2D-32 43 4F 4D 00 00 00 02  .FTST24-2COM....
8870  07 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8880  00 46 54 53 54 32 30 2D-34 43 4F 4D 00 00 00 02  .FTST20-4COM....
8890  08 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88A0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
88B0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
88C0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
88D0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
88E0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
88F0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
>

レコードの中味を確認してみます。

8D80  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8D90  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DA0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DB0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DC0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DD0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DE0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
8DF0  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................

8F90  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FA0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FB0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FC0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FD0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FE0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................
8FF0  07 07 07 07 07 07 07 07-07 07 07 07 07 07 07 07  ................

9A80  15 15 15 15 15 15 15 15-15 15 15 15 15 15 15 15  ................
9A90  15 15 15 15 15 15 15 15-15 15 15 15 15 15 15 15  ................
9AA0  15 15 15 15 15 15 15 15-15 15 15 15 15 15 15 15  ................
9AB0  15 15 15 15 15 15 15 15-15 15 15 15 15 15 15 15  ................
9AC0  15 15 15 15 15 15 15 15-15 15 15 15 15 15 15 15  ................
9AD0  15 15 15 15 15 15 15 15-15 15 15 15 15 15 15 15  ................
9AE0  15 15 15 15 15 15 15 15-15 15 15 15 15 15 15 15  ................
9AF0  15 15 15 15 15 15 15 15-15 15 15 15 15 15 15 15  ................

9D80  1F 1F 1F 1F 1F 1F 1F 1F-1F 1F 1F 1F 1F 1F 1F 1F  ................
9D90  1F 1F 1F 1F 1F 1F 1F 1F-1F 1F 1F 1F 1F 1F 1F 1F  ................
9DA0  1F 1F 1F 1F 1F 1F 1F 1F-1F 1F 1F 1F 1F 1F 1F 1F  ................
9DB0  1F 1F 1F 1F 1F 1F 1F 1F-1F 1F 1F 1F 1F 1F 1F 1F  ................
9DC0  1F 1F 1F 1F 1F 1F 1F 1F-1F 1F 1F 1F 1F 1F 1F 1F  ................
9DD0  1F 1F 1F 1F 1F 1F 1F 1F-1F 1F 1F 1F 1F 1F 1F 1F  ................
9DE0  1F 1F 1F 1F 1F 1F 1F 1F-1F 1F 1F 1F 1F 1F 1F 1F  ................
9DF0  1F 1F 1F 1F 1F 1F 1F 1F-1F 1F 1F 1F 1F 1F 1F 1F  ................
9E00  10 10 10 10 10 10 10 10-10 10 10 10 10 10 10 10  ................
9E10  10 10 10 10 10 10 10 10-10 10 10 10 10 10 10 10  ................
9E20  10 10 10 10 10 10 10 10-10 10 10 10 10 10 10 10  ................
9E30  10 10 10 10 10 10 10 10-10 10 10 10 10 10 10 10  ................
9E40  10 10 10 10 10 10 10 10-10 10 10 10 10 10 10 10  ................
9E50  10 10 10 10 10 10 10 10-10 10 10 10 10 10 10 10  ................
9E60  10 10 10 10 10 10 10 10-10 10 10 10 10 10 10 10  ................
9E70  10 10 10 10 10 10 10 10-10 10 10 10 10 10 10 10  ................

9F80  13 13 13 13 13 13 13 13-13 13 13 13 13 13 13 13  ................
9F90  13 13 13 13 13 13 13 13-13 13 13 13 13 13 13 13  ................
9FA0  13 13 13 13 13 13 13 13-13 13 13 13 13 13 13 13  ................
9FB0  13 13 13 13 13 13 13 13-13 13 13 13 13 13 13 13  ................
9FC0  13 13 13 13 13 13 13 13-13 13 13 13 13 13 13 13  ................
9FD0  13 13 13 13 13 13 13 13-13 13 13 13 13 13 13 13  ................
9FE0  13 13 13 13 13 13 13 13-13 13 13 13 13 13 13 13  ................
9FF0  13 13 13 13 13 13 13 13-13 13 13 13 13 13 13 13  ................
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Wed May 02 11:17:03 2012

レコード03、07は実行前に先頭4バイトにFFを書き込みましたが、それが無くなっていますから、上書きが行なわれたことが確認できます。
すでに作成済みのシーケンシャルレコードにランダムアクセスで上書きすることができてしまいました。
さらにランダムレコード15、1F、10、13が追加されました。

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

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