復活!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 |
>/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 ................ > |
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
前へ
次へ
ホームページトップへ戻る