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

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

[第186回]


●ブレークプログラム(CP/M互換DOSのための変更)

[第180回]から[第185回]まで6回にわたってブレークプログラムについて説明をしてきました。
その中で何回か書きましたように、ブレークプログラムはND80ZVのROMに書かれているZB3BASICプログラムの一部です。
当然のことながらそのままでは、フルRAMの状態では使うことができません。

ところがすでに書きましたように、MBASICやFORTRAN80をCP/M互換DOSのもとで実行しようとしたところ、最初はうまく動作してくれなかったために、どうしてもブレークポイントを設定してデバッグしなければならないことになってしまいました。

そのためには、フルRAMの状態でもブレークプログラムが機能するように、プログラムを書き換えなくてはなりません。
基本的な考え方は[第163回]でDMコマンドの変更作業のところで説明したのと同じことなのですが、それで果たしてブレーク処理がうまくいくのかやや心配なところもありました。

しかし実際にプログラムを書き換えて試してみましたら、[第180回]に書きましたように、フルRAMの状態でも問題無く機能してくれました。
今回は、そのフルRAMのためにブレークプログラムに対して行なった変更作業について説明をいたします。

●BP

まずはブレークポイントの設定(BPコマンド)のプログラムです。
変更前のプログラムリストは[第182回]でお見せしました。
そのときと今回のリストとではプログラムアドレスが少し異なっています。
プログラムを変更した結果、その変更箇所から後のプログラムが変わってしまいました。
大幅な変更ではありませんから、アドレスは少し異なっていますが、プログラムの中味はほとんど同じです。

              ;;;
              ;;;BP SET
1BD1 3EC3     BP:LD A,C3
1BD3 32CCFF   LD (RST7JC),A   
1BD6 21531B   LD HL,BROUT   
1BD9 22CDFF   LD (RST7JA),HL   
1BDC 13       INC DE
1BDD D5       PUSH DE
1BDE CD4510   CALL ASHX4   
1BE1 DAFC1B   JP C,BPST3   
1BE4 C1       POP BC
1BE5 2280F0   LD (BRKAD),HL
1BE8 3E80     	LD A,80
1BEA 3283F0   BPST2:LD (BRKCK),A
1BED CDCE1C   	CALL MEMRD2
1BF0 3282F0   LD (BRKBF),A
1BF3 3EFF     	LD A,FF
1BF5 CDE11C   	CALL MEMWR2
1BF8 77       LD (HL),A
1BF9 C3A418   JP ENTRY   
1BFC D1       BPST3:POP DE
1BFD 1A       LD A,(DE)
1BFE FE44     CP 44
1C00 CA1F1C   JP Z,BPST4   
1C03 FE30     CP 30
1C05 C23010   JP NZ,WHTDP   
1C08 3A83F0   LD A,(BRKCK)   
1C0B B7       OR A
1C0C CAA418   JP Z,ENTRY
1C0F 2A80F0   BPST6:LD HL,(BRKAD)   
1C12 3A82F0   LD A,(BRKBF)   
1C15 CDE11C   	CALL MEMWR2
1C18 AF       BPST5:XOR A
1C19 3283F0   LD (BRKCK),A   
1C1C C3A418   JP ENTRY   
1C1F 3A83F0   BPST4:LD A,(BRKCK)   
1C22 B7       OR A
1C23 CAA418   JP Z,ENTRY
1C26 2A80F0   LD HL,(BRKAD)   
1C29 CD4E10   CALL HXDP4
1C2C CD1B10   CALL CRLF
1C2F C3A418   JP ENTRY   
              ;

フルRAMのために行なった変更は、アドレス1BEDHのCALL MEMRD2と、1BF5のCALL MEMWR2です。
1C15HにもCALL MEMWR2が使われていますが、ここはブレークポイントの設定ではなくて、ブレークポイントの解除です。
お話が横にそれてしまいますので、ここは無視しておいてください。

MEMWR2は[第165回]で説明をしました。
プログラムも説明も短いですから、下に再掲いたします。

1CE1 F5       MEMWR2:PUSH AF
1CE2 7C       	LD A,H
1CE3 B7       	OR A
1CE4 F23FD2   	JP P,RAMWR
1CE7 F1       	POP AF
1CE8 77       	LD (HL),A
1CE9 C9       	RET

LD (HL),Aを変更して、その代わりにこのMEMWR2を実行します。
対象になるメモリアドレスはHLレジスタにあります。
Hレジスタの正負を判定しています。
00〜7Fは正数です。
80〜FFは負数です。
Hの値が正のとき(00〜7Fのとき)はCP/M互換DOSのBIOSのRAMWRにジャンプします。
負のとき(80〜FFのとき)は、
LD (HL),A
を実行します。
RAMWRについては[第164回]で説明をしました。

MEMRD2は今回が初めてです。
下がMEMRD2のプログラムリストです。

              ;
1CCE 7C       MEMRD2:LD A,H
1CCF B7       	OR A
1CD0 F242D2   	JP P,RAMRD
1CD3 7E       	LD A,(HL)
1CD4 C9       	RET
              ;

たったこれだけの短いルーチンです。
考え方はMEMWR2と同じです。
Hの値が正のときは、CP/M互換DOSのBIOSのRAMRDにジャンプします。
RAMRDについては[第163回]で説明をしました。

ちょっと時間がなくなってしまいました。
この続きはまた次回にすることにいたします。

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

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