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

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

[第152回]


●大きなランダムファイルを作る(2)

あらためてプログラムリストを眺めてみましたら。
スタックの食い違いなどという単純なものではなくて、もう根本的に考え方がなってなかったことがわかりました。

もう一度おちついて考え直しです。
昔でしたらこういう場合には、まず一服、煙草に火を点けて、紫煙をくゆらしながら腕を組んでしばし黙考、という場面になるのでありますが。

ええ。
もう何十年も昔に禁煙してしまいましたので、ここは熱いコーヒーをすすりながら、沈思黙考することになります。

前にも書きましたように、この程度のプログラムではフローチャートなど書きませぬ。
コーヒーなどを飲みながらしばらくプログラムリストを眺めておりますと、やがて脳裏にフローらしきものがチラチラ浮かんでまいります。
それがだんだんとはっきりしてきたところで、いきなりプログラムを書きなぐります。
こんな具合です。



あ。
もちろんこれで、一発決まってしまうとは限りません。
このように修正したプログラムを実際に実行して、結果を確認し、うまくいかなかった場合にはデバッグを繰り返しながら、だんだんとまともなものに近付けていきます。

そのようにしました結果、どうやらバグがなくなったようです。
下はそのようにして、バグ取りを行なった後の、ランダムアクセスのサブルーチンのアセンブルリストです。

              ;
              ;rec no. to BLOCK aloc position
              ;return value B=this extent no. C=rec no. in this extent
              ;HL=BLOCK ALOC POINT
              ;if err then cf on
CAC8 212100   RNDMSB:LD HL,$0021
CACB 19       	ADD HL,DE
CACC 7E       	LD A,(HL)
CACD 23       	INC HL
CACE 66       	LD H,(HL)
CACF 6F       	LD L,A;HL=next rec no.
CAD0 0607     	LD B,07;
CAD2 7C       RNDMSB2:LD A,H
CAD3 1F       	RRA
CAD4 67       	LD H,A
CAD5 7D       	LD A,L
CAD6 1F       	RRA
CAD7 6F       	LD L,A
CAD8 05       	DEC B
CAD9 C2D2CA   	JP NZ,RNDMSB2
CADC 7C       	LD A,H
CADD 1F       	RRA
CADE 1F       	RRA
CADF 4F       	LD C,A;rec no. in extent
CAE0 45       	LD B,L;extent no.
CAE1 210C00   RNDMSB3:LD HL,$000C
CAE4 19       	ADD HL,DE
CAE5 78       	LD A,B
CAE6 BE       	CP (HL)
CAE7 C217CB   	JP NZ,RNDMSB5;read next extent
CAEA 23       RNDMSB30:INC HL
CAEB 23       	INC HL
CAEC 23       	INC HL
CAED 3A69D0   	LD A,(RWSW)
CAF0 B7       	OR A
CAF1 CAFBCA   	JP Z,RNDMSB31
CAF4 79       	LD A,C
CAF5 3C       	INC A
CAF6 BE       	CP (HL);sectors in this extent
CAF7 DAFBCA   	JP C,RNDMSB31
CAFA 77       	LD (HL),A
CAFB 23       RNDMSB31:INC HL
CAFC EB       	EX DE,HL
CAFD 2A22D0   	LD HL,(BLKSFT)
CB00 EB       	EX DE,HL;E=BLKSFT,D=BLKMSK
CB01 79       	LD A,C
CB02 A2       	AND D
CB03 57       	LD D,A
CB04 79       	LD A,C
CB05 0F       RNDMSB32:RRCA
CB06 1D       	DEC E
CB07 C205CB   	JP NZ,RNDMSB32
CB0A E61F     	AND 1F
CB0C CA14CB   	JP Z,RNDMSB42
CB0F 23       RNDMSB4:INC HL
CB10 3D       	DEC A
CB11 C20FCB   	JP NZ,RNDMSB4
CB14 7A       RNDMSB42:LD A,D;position no. in block
CB15 B7       	OR A;reset cf
CB16 C9       	RET
              ;
CB17 C5       RNDMSB5:PUSH BC
CB18 F5       	PUSH AF
CB19 3A69D0   	LD A,(RWSW)
CB1C B7       	OR A
CB1D C4C1C7   	CALL NZ,CLOSE;save this FCB
CB20 CDF6C7   	CALL SRCHFST
CB23 F1       RNDMSB52:POP AF
CB24 E5       	PUSH HL
CB25 010C00   	LD BC,$000C
CB28 09       	ADD HL,BC
CB29 BE       	CP (HL);same extent No.?
CB2A CA3ACB   	JP Z,RNDMSB6;FCB found
CB2D E1       	POP HL
CB2E F5       	PUSH AF
CB2F CD6FC8   	CALL SRCHNXT
CB32 FEFF     	CP FF
CB34 CA50CB   	JP Z,RNDMSB7;then,make new FCB
CB37 C323CB   	JP RNDMSB52
              ;
CB3A E1       RNDMSB6:POP HL
CB3B D5       	PUSH DE
CB3C 0620     	LD B,20
CB3E 7E       RNDMSB62:LD A,(HL)
CB3F 12       	LD (DE),A
CB40 23       	INC HL
CB41 13       	INC DE
CB42 05       	DEC B
CB43 C23ECB   	JP NZ,RNDMSB62
CB46 D1       	POP DE
CB47 210C00   	LD HL,$000C
CB4A 19       	ADD HL,DE
CB4B C1       	POP BC
CB4C 70       	LD (HL),B;extent No.
CB4D C3EACA   	JP RNDMSB30
              ;
CB50 F1       RNDMSB7:POP AF
CB51 3A69D0   	LD A,(RWSW)
CB54 B7       	OR A
CB55 C25BCB   	JP NZ,RNDMSB71
CB58 C1       	POP BC
CB59 37       	SCF
CB5A C9       	RET
CB5B C1       RNDMSB71:POP BC
CB5C 210C00   	LD HL,$000C
CB5F 19       	ADD HL,DE
CB60 70       	LD (HL),B;extent No.
CB61 E5       	PUSH HL
CB62 23       	INC HL
CB63 0613     	LD B,13
CB65 AF       	XOR A
CB66 77       RNDMSB72:LD (HL),A
CB67 23       	INC HL
CB68 05       	DEC B
CB69 C266CB   	JP NZ,RNDMSB72
CB6C C5       	PUSH BC
CB6D CD0CCD   	CALL DIRSET
CB70 CDECC9   	CALL SRCHE5
CB73 FEFF     	CP FF
CB75 C27CCB   	JP NZ,RNDMSB73
CB78 C1       	POP BC
CB79 E1       	POP HL
CB7A 37       	SCF
CB7B C9       	RET
CB7C D5       RNDMSB73:PUSH DE
CB7D 0620     	LD B,20
CB7F 1A       RNDMSB74:LD A,(DE)
CB80 77       	LD (HL),A
CB81 23       	INC HL
CB82 13       	INC DE
CB83 05       	DEC B
CB84 C27FCB   	JP NZ,RNDMSB74
CB87 2A62D0   	LD HL,(DIRBFADRS)
CB8A EB       	EX DE,HL
CB8B CD2AD2   	CALL B_WRITE
CB8E D1       	POP DE
CB8F C1       	POP BC
CB90 E1       	POP HL
CB91 C3EACA   	JP RNDMSB30

めちゃめちゃ複雑なものになってしまいました。
なにをやっているか、おそらくおわかりいただけませんでしょう。
こういう複雑なプログラムは、書いた本人でないと、なかなか理解できないものです。
ま。
そういうことなのでありますが。

当連載も毎日多数の方にお読みいただいておりまして、あらためまして感謝申しあげます。
おそらく、どういうプログラムを書いたらこういう動作をするのだろう?というご興味をお持ちになってお読みいただいていらっしゃるのでは、と拝察いたしております。

なのに。
これじゃあ、全然わからんではないか。
お叱りを頂戴いたしかねません。

そういたしますと。
ここは、やっぱり、ご理解いただけるように、せめて簡単に解説などしませんといかんかなあ、と思ってはおります。
いずれ、一段落つきましたら、あらためまして、できるだけ解説するようにしたいと思います。

ですが。
目下のところは、まずはこの、CP/M互換DOSを完成させて皆様方に早く供給できるようにしなければなりません。
それまでの間は、その作業のための製作ノートを兼ねておりますので、詳細解説につきましては、いましばらくのご猶予をお願い申しあげます。

さて。
そういうことでありますから、なんだかちっともわからんリストのようでありますけれども、私はわかっておりますから、そのようにプログラムを直したうえで、再度前回のテストを行ないますと。

ほら。
ご覧の通り。

>/ld zbdos1y.bin,c406
loading ZBDOS1Y.BIN ...098d(2445)bytes loaded,from C406 to CD92
>/ld fille5.bin,8100
loading FILLE5.BIN ...0010(16)bytes loaded,from 8100 to 810F
>jp 8100
>/ld ftst20-2.bin,8100
loading FTST20-2.BIN ...00a9(169)bytes loaded,from 8100 to 81A8
>jp d233

A>save 1 ftest20-2.com

A>ftst20-2 test.raf
done

A>dir
A: FTST20-2 COM : TEST     RAF
A>end of ZBDOS
>dm 8800,88ff
8800  00 46 54 53 54 32 30 2D-32 43 4F 4D 00 00 00 02  .FTST20-2COM....
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 52 41 46 00 00 00 48  .TEST    RAF...H
8830  00 00 00 00 00 00 00 00-05 00 00 00 00 00 00 00  ................
8840  00 54 45 53 54 20 20 20-20 52 41 46 03 00 00 28  .TEST    RAF...(
8850  00 00 00 00 02 00 00 00-00 00 00 00 00 00 00 00  ................
8860  00 54 45 53 54 20 20 20-20 52 41 46 07 00 00 37  .TEST    RAF...7
8870  00 00 00 00 00 00 03 00-00 00 00 00 00 00 00 00  ................
8880  00 54 45 53 54 20 20 20-20 52 41 46 01 00 00 20  .TEST    RAF... 
8890  00 00 00 04 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  ................
>

今度はちゃんとTEST.RAFが作成されて、Aドライブのディレクトリを見てみますと、TEST.RAFのFCBが4つ、しっかり作成されています。
その内容も[第107回]のときの実行結果と全く同じ内容になっています。
あ。
戻っていただくのもお手間ですので、[第107回]に確認したAドライブのディレクトリの内容を下に再掲いたします。

a>^D
end of CP/M
>dm 8800,88ff
8800  00 46 54 53 54 32 30 2D-32 43 4F 4D 00 00 00 02  .FTST20-2COM....
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 52 41 46 00 00 00 48  .TEST    RAF...H
8830  00 00 00 00 00 00 00 00-05 00 00 00 00 00 00 00  ................
8840  00 54 45 53 54 20 20 20-20 52 41 46 03 00 00 28  .TEST    RAF...(
8850  00 00 00 00 02 00 00 00-00 00 00 00 00 00 00 00  ................
8860  00 54 45 53 54 20 20 20-20 52 41 46 07 00 00 37  .TEST    RAF...7
8870  00 00 00 00 00 00 03 00-00 00 00 00 00 00 00 00  ................
8880  00 54 45 53 54 20 20 20-20 52 41 46 01 00 00 20  .TEST    RAF... 
8890  00 00 00 04 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  ................
>


2つのリストは全く同じ内容のように見えますが、先にお見せしたリストはCP/M互換DOSで実行した結果を表示したもので、後からお見せしておりますリストは[第107回]でCP/M2.2で実行した結果を表示したものです。
両者をよく見比べていただきますと、前者は’end of ZBDOS’と表示されていますが、後者は’end of CP/M’と表示されていて、それぞれ別のOSのもとで実行されたということがわかります。

いやあ。
さすがに。
今回はちょっと、苦しかったですねえ。
まあ、それだけに。
この達成感は。
ちょいと泣けますねぇ。

とりあえず。
CP/M互換DOS、仮RAMディスク版プロトタイプ。
堂々の、完成です。

むむ。
なにをさておいても、ここは。
金麦で、乾杯!!

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

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