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

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

[第188回]


●RT@コマンド(CP/M互換DOSのための変更その3)

今回はCP/M互換DOSのための変更を行なったブレーク処理プログラムについての説明の最終回です。
FFコード(RST7)を利用してブレークしたあと、そのブレークポイントからプログラムの続きの実行を再開するためのコマンドがRTコマンドです。
RTコマンドについて説明をする前に、BPコマンドについて説明を補足しておきます(BPコマンドについては[第186回]を参照)。

ブレークポイントを設定するためのBPコマンドはフルRAMに対応するようにプログラム変更を行ないましたが、DM@コマンドやCM@コマンドのように、対象になるメモリアドレスがフルRAMの0000H〜7FFFHである場合の@記号を使うようにはしませんでした。
それはBPコマンドの特殊性からきています。
BPコマンドはブレークアドレスのマシン語命令コードをFF(RST7)で置き換えるためのコマンドです。
アドレス0000H〜7FFFHがもしもROMであった場合、その行為そのものが意味をもちません(当然ブレークすることはできません)。

つまりBPコマンドの場合には、ブレークアドレスとして0000H〜7FFFHが指定されたならば、それはフルRAM構成を選択していると考えればよいことになります。
ですからわざわざBP@とする必要はありません。

RTコマンドの場合はどうでしょうか。
RTコマンドを入力する時点では、0000H〜7FFFHはROMが選択されています。
ブレークしたアドレスから実行を再開するのですが、そのアドレスが0000H〜7FFFHの範囲でしたら、当然フルRAM構成を選択することになります。
では8000H以降のアドレスならば、フルRAMなのでしょうか?
それともROMのままなのでしょうか?

これはアドレスからだけでは決められません。
むむむ。
今気がつきました。
ブレークしたときにフルRAMかROMかいずれが選択されているかという情報を保存しておけば、RTコマンド入力時にその情報から同じ状態に戻すことができますね。
いずれ時間ができたら、そのように考えてみましょう。

今はRTコマンドならば0000H〜7FFFHはROM、RT@コマンドを使ったならばフルRAMを選択する、というプログラムになっています。
下がそのように変更を行なったあとのRTプログラムのリストです。
変更前のリストは[第184回]にあります。
プログラムの変更を行なったために、アドレスが少し変わっています。

              ;;;
              ;;;RETURN
1B98 1A       RT:LD A,(DE)
1B99 32D1F2   LD (RAMCK),A
1B9C 2100ED   LD HL,STCWK
1B9F 1100F5   LD DE,STC
1BA2 010003   LD BC,$0300
1BA5 EDB0     LDIR
1BA7 3184F0   RT2:LD SP,HLBF2   
1BAA E1       POP HL
1BAB D1       POP DE
1BAC C1       POP BC
1BAD D9       EXX
1BAE F1       POP AF
1BAF 08       EX AF,AF'
1BB0 E1       POP HL
1BB1 D1       POP DE
1BB2 C1       POP BC
1BB3 F1       POP AF
1BB4 FDE1     POP IY
1BB6 DDE1     POP IX
1BB8 F5       PUSH AF
1BB9 3AD1F2   LD A,(RAMCK)
1BBC FE40     CP 40;@
1BBE CA39D2   JP Z,RTRAM
1BC1 F1       POP AF
1BC2 ED7B99F0 LD SP,(SPBF)
1BC6 228CF0   LD (HLBF1),HL   
1BC9 2A9BF0   LD HL,(PCL)
1BCC E5       PUSH HL
1BCD 2A8CF0   LD HL,(HLBF1)   
1BD0 C9       RET
              ;;;

変更前のRTプログラムは、エントリ部分でZB3BASICのもとになったシステムのための処理をしているところ([第184回]のリストのアドレス1BAAH〜1BB9H)が残ったままになっていましたので、その部分は今回の変更と同時に削除しました。
CP/M互換DOSのための変更は、上のリストの1B98H〜1B9BHと、1BB9H〜1BC0Hの部分です。
RTの後に’@’がついていたら、BIOSのRTRAMへジャンプします。

●BIOSのRTRAMルーチン

下はCP/M互換DOSのBIOSプログラムの先頭のジャンプテーブルです。
アドレスD239HにRTRAMルーチンへのジャンプ命令があります。

              ;
              	ORG $D200
              ;
D200 C377D2   	JP SETENTRY;coldboot
D203 C37ED2   BOOT:JP WBOOTJ
D206 C312D3   	JP CONSTJ
D209 C334D3   	JP CONINJ
D20C C354D3   	JP CONOUTJ
D20F C374D3   	JP LISTJ
D212 C375D3   	JP PUNCHJ
D215 C387D3   	JP READERJ
D218 C3A6D3   	JP HOMEJ
D21B C3B1D3   	JP SELDSKJ
D21E C3CDD3   	JP SETTRKJ
D221 C3D5D3   	JP SETSECJ
D224 C3DBD3   	JP SETDMAJ
D227 C3E1D3   	JP READJ
D22A C34AD4   	JP WRITEJ
D22D C36AD4   	JP PRSTATJ
D230 C36BD4   	JP SECTRNJ
D233 C377D2   	JP SETENTRY
D236 C36ED4   	JP ZREENTJ
D239 C3DED2   	JP RTRAM
D23C C387D4   	JP LOADZ
D23F C3F2D2   	JP RAMWR
D242 C3FED2   	JP RAMRD
D245 C306D3   	JP RAMJP
              ;

RTRAMルーチンです。
I/Oアドレス9CHにFFHを出力してフルRAMにします。
そのあとスタックポインタの値を元に戻して、ブレーク時に保存しておいたPC(プログラムカウンタ)の値をスタックトップにPUSHしてリターンします。

              ;
D2DE 3EFF     RTRAM:LD A,FF
D2E0 D39C     	OUT (9C),A
D2E2 F1       	POP AF
D2E3 ED7B99F0 	LD SP,(SPBF)
D2E7 228CF0   	LD (HLBF1),HL
D2EA 2A9BF0   	LD HL,(PCL)
D2ED E5       	PUSH HL
D2EE 2A8CF0   	LD HL,(HLBF1)
D2F1 C9       	RET
              ;

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

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