You are here

ASのIM6100対応(その3)


カテゴリー:

ASでは数多くのエラーメッセージが用意されており大抵はその中から選べるのですが、新たなプロセッサへの対応をしているとどれもしっくりこないことがあります。

そこで3回目の今回はエラーメッセージの追加方法を書いてみます。

IM6100には元になったミニコンPDP-8のコンソールパネルを再現するための特別なモードがあり、そのモードでしか実行できない命令あるいは逆に通常モードでしか実行できない命令があります。これは他のプロセッサにはない概念なので適当なエラーメッセージは存在しません。

これを例にエラーメッセージの追加方法について書いていきます。

まずはエラーの名称(表示内容ではなくプログラム中から参照するときの識別子です)とエラー番号を決めます。ちなみにエラー番号は1000未満だと"Warning", 1000以上だと"Error"として扱われます。

最初はどう決めてよいかわからないと思いますので既存のものを参考にするのが良いでしょう。

これをerrmsg.hに追加します。

  ErrNum_IndexedForIndirect = 380,
  ErrNum_NotInNormalmode = 390,
  ErrNum_NotInPanelmode = 400,
  ErrNum_DoubleDef = 1000,

追加したのはErrNum_NotInNormalmode(通常モードでしか使えない命令が通常モード以外で使われた)番号は390と、ErrNum_NotInPanelmode(パネル専用命令がパネルモード以外で使われた)番号は400です。

次が1000ですから"Warning"の最後に追加したわけです。

発生させるときはWrError(ErrNum_NotInPanelmode);などとすればOKです。

"Warning"の場合はアセンブルは止まりませんのでCodeLenに0以外を入れてコードを生成するべきです。というか生成できないなら"Error"にするべきでしょう。

続いて表示メッセージを作ります。これはas.resというファイルに追加します。

Message ErrMsgIndexedForIndirect
 "verwende indizierte anstelle indirekter Adressierung"
 "using indexed instead of indirect addressing"

Message ErrMsgNotInNormalmode
 ""
 "not allowed in normal mode"

Message ErrMsgNotInPanelmode
 ""
 "not allowed in panel mode"

;*****

Message ErrMsgDoubleDef
 "Symbol doppelt definiert"
 "symbol double defined"

Messageの後の名称は先ほどの名称と無関係に決めても動作はしますが、混乱を避けるため合わせておくことをお勧めします。
メッセージ自体は2行、1行目がドイツ語で2行目が英語です。私はドイツ語は書けないのでとりあえず空欄にしてあります。本家にマージすることになった場合は作者のAlfredさんにお願いしようと思っています。

このファイルからビルドの過程でas.msg(メッセージカタログ、バイナリ)とas.rsc(ヘッダファイル)が生成されます。前者はそのままインストールされます。

後者には以下のような定義が含まれます。

#define Num_ErrMsgIndexedForIndirect 47
#define Num_ErrMsgNotInNormalmode 48
#define Num_ErrMsgNotInPanelmode 49
#define Num_ErrMsgDoubleDef 50

ここまででErrNum_xxxxNum_ErrMsgxxxxの2種類が出てきました。これらの対応関係を決めているのがasmerr.cです。巨大なswitch文の中に追加します。

    case ErrNum_IndexedForIndirect:
      msgno = Num_ErrMsgIndexedForIndirect; break;
    case ErrNum_NotInNormalmode:
      msgno = Num_ErrMsgNotInNormalmode; break;
    case ErrNum_NotInPanelmode:
      msgno = Num_ErrMsgNotInPanelmode; break;
    case ErrNum_DoubleDef:
      msgno = Num_ErrMsgDoubleDef; break;

以上でエラーメッセージの追加は完了です。

好きにエラー追加できるようになったのでもっと検知できるようにと検討を始めたら...

その1で示した複合命令の処理がイマイチな気がしてきて、現在大規模な書き直し中です。命令テーブルも1つになります。次回この変更について書けるといいな。


Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。