近藤です。 お世話になっております。 日立のモニタ改造における、問題点について日立の 鹿取さんから、アドバイス頂きました。 鹿取さんの、了承を得ておりますので、その内容に ついて、下記に掲載します。 尚、このアドバイス通りに修正したら、問題なく動作しました。 鹿取さんありがとうございました。 以下、鹿取さんのメールより ------------------------------------------ メーリングリストのアーカイブを拝見しました。 上手く動作しているみたいですが、疑問点に付いてお答えしておきます。 ・ベクタテーブルのイニシャライズ ベクタテーブルのイニシャライズはご指摘の通りです。モニタプログラムでは システム起動時、及びユーザプログラムをダウンロード時に仮想ベクタ領域を イニシャライズ(VECTOR_INITをサブルーチンコール)します。理由は未定義割 込みの有無を判断するためです。 この処理は近藤さまのような使い方の場合は不要です。削除して頂いて構 いません。 しかしながら、削除すると、本当に未定義割込みが起こった場合に暴走する ことになります。それでも良しとするか、ないしは未定義割込みのベクタアドレ スに対して特別な(例えば無限ループするなどの)ハンドラのアドレスを登録し ておくべきかもしれません。 ・RAM領域の先頭アドレス + H'40番地 これはユーザプログラムの初期SPを格納するエリアです。モニタプログラム を使わない本当のシステムであれば、SPの初期化はリセット直後の最初の 命令で行います。 しかしながら、モニタプログラムはRTE命令でユーザプログラムを起動するた め、どうしてもユーザプログラム実行前にSPが決定されていなければならな いのです。そこでリンケージのサブコマンドファイルでDEFINE $STACKを使 い、初期SPの値を尋ねているのです。 ここで指定された値はモニタプログラムのイニシャライズ処理(R_COM_INIT サブルーチン)の中で「RAM領域の先頭アドレス + H'40番地」に設定されま す。通常動作であれば何の問題も無いのですが、近藤さまのように直接ユー ザプログラムを起動する場合、モニタプログラムに変わってユーザプログラム の初期SPを目的の番地に設定しなければなりません。 従いまして、細かいコーディングは別として、対策自体は正解です。 ただし、現状のコーディングではリロケータブル性が良くありません。RAM 領域の番地を変えると、動かなくなってしまいますからね。 そこで、宜しければ以下のようなコーディングに変更してみてはどうでしょうか? mov.l #h'00ffff0c,er0 mov.l er0,@h'3f040 この部分を MOV.L #$STACK,ER0 MOV.L ER0,@(36,ER7) です。それと.IMPORTで$STACKを宣言しておいてください。多分、これで良い はずです。 以上、よろしくお願い致します。 -------------------------------------------------------- (株)日立製作所 半導体グループ カスタマサービス本部 半導体トレーニングスクール 鹿取 祐二 TEL 03-3266-9344 FAX 03-3235-5940 E-Mail katori-yuji@xxxxxxxxxxxxxxxxx katori-yuji@xxxxxxxxxxxxxxxxxxxxxxxxx(旧) --------------------------------------------------------