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

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

[第181回]


●ブレークポイントの設定とレジスタダンプ(2)

前回は説明の途中で時間が無くなってしまいました。
前回はF80(FORTRAN80)をデバッグするのに、ブレークポイントを設定して、レジスタダンプをしながら解析したときのログファイルをお見せしました。

ブレークポイントの設定とレジスタダンプはマシン語のデバッガなどではごく普通の機能なので、とりたてて珍しいものではありませんが、ここで説明しておりますブレークとレジスタダンプは、自分で言うのも何なのですけれど、ちょいとすごいものなのです。

もう一度前回のログファイルをお見せします。

logfile nd80zlog\07082124.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
can't open D.vfd
>/ld zbds1f.bin,bc00
loading ZBDS1F.BIN ...18d0(6352)bytes loaded,from BC00 to D4CF
>bp c238
>jp d233

最初に
bp c238[Enter]
を実行しています。
これだけではよくわからないかもしれませんが、実はこの時点では、ZB3BASICモードなのです。

その上の/ldコマンドも、また下のjpコマンドもZB3BASICのマシン語モニタコマンドです。
こういうマシン語コマンドは、普通はマシン語デバッグツールを起動して、そこで使えるようになるものなのですが、ND80ZVのZB3BASICシステムでは「そんな固いことは言わないで」、BASICモードの状態でいつでもマシン語コマンドを受け付けて実行することができます。
そのことだけでも、ND80ZVのシステムはそんじょそこらにあるシステムとは一味違っているのです。

たとえば。
CP/Mにもマシン語のデバッグ機能はありますが、それはCP/M本体にではなくて、アプリケーションとして用意されています。
DDT.COMというファイルをロードして実行することではじめてマシン語のデバッグ機能を使うことができるようになります。
このことはMSDOSでも同じで、MSDOSプロンプトの状態ですぐにマシン語のデバッグはできず、
DEBUGコマンドを入力して、つまりDEBUG.COMを起動して、その中ではじめてマシン語のデバッグ機能が使えるようになります。

ま。このことは、CP/MやMSDOSがOSのレベルでは直接メモリやI/Oをユーザーにアクセスさせないという思想があるようで、デバッガの対象もメモリそのものではなくて、「メモリにロードされたユーザープログラム」を対象にしていることからきているように思われます。

でも。
私の考えでは、OSのレベルでメモリに直接アクセスしたいのですよね。
ということで。
ZB3BASICにエントリすると、そのままの状態でマシン語デバッグコマンドが使えるようにできているのです。

またお話がそれてしまいました。
もとに戻ります。
さきほどのログファイルの先頭で、
bp c238[Enter]
を実行しています。
アドレスc238Hにブレークポイントを設定していますが、このc238Hというアドレス、実はCP/M互換DOSのプログラムアドレスなのです。

その部分のリストです。

              ;
C221 218000   	LD HL,DMABF
C224 2262D0   	LD (DIRBFADRS),HL
C227 2206D0   	LD (DMABFADRS),HL
C22A 3A05D0   	LD A,(CDRV_DIRWK)
C22D 2104D0   	LD HL,CURDRV
C230 BE       	CP (HL)
C231 CA38C2   	JP Z,USRCMD722
C234 5F       	LD E,A
C235 CD33C4   	CALL DRVNOSET
C238 CD0001   USRCMD722:CALL TRNS0
C23B 3A05D0   USRCMD73:LD A,(CDRV_DIRWK)
C23E 3204D0   	LD (CURDRV),A
C241 C328BC   	JP CCPENTRY
              ;

これはCP/M互換DOSのCCP(Console Command Processor)プログラムの一部です。
ユーザープログラムのファイルネームを入力することで、そのプログラムを、アドレス0100Hから始まるトランジェントエリアにロードして、それを実行する部分です。

アドレスC238Hはトランジェントエリアにロードしたユーザープログラムに対するCALL命令が書かれているアドレスです。
なぜここにブレークポイントが必要かと言いますと、それはCP/Mの仕組みからきています。
CP/Mではユーザープログラムをメモリーにロードする機能と、それを実行する機能が分離していません。
上で書きましたように、マシン語プログラムに対するLDコマンドもマシン語プログラムを実行するためのJPまたはCALLコマンドもありません。

CP/Mではユーザープログラムはメモリにロードされるとその直後に実行されます。
ロード前にはユーザープログラムにブレークポイントを設定することはできません。
ですからユーザープログラムがロードされて、まさにこれからそのプログラムを実行する、というその直前を狙ってブレークポイントを設定する必要があったのです。

このようなCP/Mの仕組みから、マシン語デバッガDDT.COMは、ファイル名を指定して実行することで、ユーザープログラムをロードして、実行直前の状態でスタンバイするようになっています。

だいたいシステムにブレークポイントを設定するなどは普通はご法度でありますから、そういうようにはできていないものです。
ですけれど。
ND80ZVのZB3BASICシステムから見ますと、CP/M互換DOSそのものが、ただのユーザプログラムにすぎませんから、ブレークポイントの設定もできてしまいます。

そして、
JP D233[Enter]
で、CP/Mを起動します。

CP/Mを起動して、そこで
f80[Enter]
と入力して、FORTRAN80を起動しようとしました。

A>f80

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0042 0006 D084 D004 0000 0000 0000 0000 C238 F7FE 0000 0000 FF 01000010
>

仮想FDDのAドライブからF80.COMがロードされて、実行される直前にブレークしました。
これでやっとF80プログラムにブレークポイントを設定することができるようになりました。

下はその続きです。
bp 19c0[Enter]
と入力して、F80プログラムにブレークポイントを設定して、
rt@[Enter]
で、さきほどブレークしたところに戻って続きを実行します。
上でブレークしたあとはZB3BASICシステムに戻っていますから(0000〜7FFFがROMになっていますから)、rt@でフルRAMにしてから、ブレークしたアドレスに戻ります。

>bp 19c0
>rt@

*=HELL11

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0044 0000 FE70 02C8 0000 0000 0000 0000 19C0 C403 0000 0000 FF 01000100
>

rt@でさきほどブレークしたところに戻ると、そこでF80が実行されますから、

が表示されます。
そこで
=HELL11[Enter]
と入力すると、次に指定したF80のブレークポイント19c0Hでブレークしました。

ご覧いただきました通り、CP/M互換DOSでもFORTRAN80でも、自由にブレークさせてデバッグすることだってできてしまうのです。

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

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