3章 68000アセンブラ・リファレンス・マニュアル 3.1 概説 HI-TECH C コンパイラ・システムのアセンブラは、68000 と 68010 に対応したフル装備のリロケーティング・マクロ・アセンブラです。また、このアセンブラは 68020 および モトローラ 683xx シリーズのプロセッサに追加されたオペコード (MOVEC, MOVES, MOVEP) とレジスタ (SFC, DFC, CACR, USP, VBR, CAAR, MSP, ISP) も扱うことができます。このマニュアルはアセンブラとその使用法、およびその疑似命令について説明するものです。オペコードのニーモニックおよびアセンブラ言語の文法はモトローラから公表されている通りであり、ここでは説明いたしません。68000 の命令セットの完全なリファレンスとしてはモトローラ社が発行する “M68000 16/32 BIT MICROPROCESSOR PROGRAMMER'S REFERENCE MANUAL” あるいは、ご使用になる 68000 系 プロセッサーのメーカーのマニュアルを参照下さい。 HI-TECH のアセンブラ・パッケージにはリンカー、ライブラリアン、クロスリファレンス・ジェネレータ、オフジェクトコード・コンバータ、バイナリーファイル・スプリッターが含まれています。 3.2. アセンブラの使い方 本アセンブラは as68k と名付けられており、UNIX と MS-DOS 上で使用できるものがあります。アセンブラの使用方法はこれらの OS の上でほぼ共通しています。MS-DOS においては大文字と小文字は同じように使えますが、UNIX では小文字のみを使います。次の書式で起動します。 as68k [options] files ... ここで files はアセンブルする 1 つ以上のアセンブラ・ソースファイルであり、それぞれをスペースで区切って続けます。ここで注意することは、各ファイルを独立したファイルとしてアセンブルするのではなく、すべてを連結した 1 つのファイルとしてアセンブルするということです。ファイルを別個にアセンブルするには、各ファイルごとにアセンブラを起動します。ファイル名はそのフルネームで指定しなければならず、拡張子を省略することは許されません。 options は、それぞれがマイナス符号“-”で始まる複数のオプションがスペースで区切られ、連なったものです。オプションを表3.1 に示します。 オプション 意味 初期値 -Q クイック・アセンブリ オプティマイズド・アセンブリ -U 未定義のシンボルを無視 -S サイズ・エラーのメッセージを抑止 -X ローカル・シンボルなし -Oourfile オブジェクト・ファイル名 srcfile.OBJ -Llistfile リスティング・ファイルの作成 作成しない -Wwidth リスティングの幅の指定 80 / 132 -Flength リスティングのページ長の指定 66 -I マクロ展開もリストする マクロ展開をリストしない -C クロスリファレンスを作成する 作成しない 表3.1:AS68K コマンドラインオプション 3.2.1 アセンブラ・オプション -Q アセンブラの運用モードの初期値は、分岐を最適化するなどの方法で可能な限り小さいコードが生成されるまでソースコードを繰り返し処理し続けるものです。もし -Q オプションが使われるとソースコードに対して 2 回のパスだけが行われ、よって処理を速くすることができます。これにより、最適化が 2 度目のパスについてのみ行われ、最初のパスにについてはなされない部分のコードに nop 命令が生成されることがあります。 -U アセンブル中に遭遇した未定義のシンボルは external として取り扱われ、-U オプションが使われない限り、それぞれの未定義のシンボルについてエラー・メッセージが出されます。このオプションを使っても、生成されるオブジェクト・コードは変化せず、単にエラー・メッセージが禁止されるだけです。 -S もし、バイトあるいはワードサイズのメモリー領域が、それぞれ 8 ビットや 16 ビットより大きな値で初期化されようとした場合、アセンブラは“Size error”メッセージを出します。-S オプションはこれらのメッセージを禁止します。 -X アセンブラによって作られたオブジェクトファイルは、ローカルシンボルを含むシンボル情報を含みます。-X オプションはオブジェクトファイルにローカルシンボルが含まれるのを防ぎ、ファイルサイズを小さくします。 -Ofile デフォルトではオブジェクト・ファイル名は最初のソースファイルの名前から作られます。そのファイル名の拡張子あるいはファイル・タイプ(すなわち、右端のドット“.”に続くものすべて)は取り除かれ、.obj という拡張子が付けられます。このオプションにより、このデフォルトの規則を変更し、オブジェクト・ファイルを任意の名前に変更できます。なお、このオプションが使われた場合は拡張子が付加されることはありません。すなわち、-Oafile は afile.obj ではなく afile を作ります。 -Llist このオプションは、アセンブリ・リスト生成します。オプションにファイル名を与えると、その名前でリスト・ファイルが生成され、与えないとリスティングは標準出力(つまり、コンソール)に出力されます。 -Wwidth リストを指定された幅のプリンタ用にフォーマットします。単位は文字数で、41 以上の数値を指定します。初期値はリストファイルがデバイスの場合(プリンターなど)は 80、ファイルに出力する場合は 132 です。 -Flength ページ長の初期値は 66 です。-F オプションはこれとは異なるページ長を指定するのに使います。 -I このオプションはアセンブラ疑似命令 NOLIST をオーバーライドし、マクロ展開やアセンブルされない条件部分なども強制的にリストするよう指示します。 -C クロスリファレンス・ファイルを作成します。そのファイル名は srcfile.crf となり、この srcfile は最初のソースファイル名のベース部分です。このファイルは生データですので、この後 CREF ユティリティーを実行してフォーマットされた表記にします。 3.3 アセンブリ言語 先に述べたように、HI-TECH のアセンブラはモトローラ・ニーモニックとアドレッシングモードを受け付けます。標準的な疑似命令に加え、HI-TECH リンカーの機能を活用するためのいくつかの疑似命令が追加されています。以下にこのアセンブリ言語を解説します。 3.3.1 文字セット 使用する文字セットは 7ビットASCII です。大文字、小文字は識別子では判別されることがありますが、オペコードや予約語では判別されません。タブは複数のスペースと同じものとして扱われます。 3.3.2 数値 アセンブラはすべての数値演算を符号付き 32 ビットとして行います。数がメモリーロケーションに入りきらない大きさであるとエラーとなります。すべての数値の基数の初期値は 10 です。それ以外の基数も表 3.2 の基数指定子を付加することで指定することができます。 2進数 0か1の数字にBが続く 11100B 8進数 0から7の数字にO,Q,o,qが続く 37Q,17o 10進数 0から9の数字にD,dが続く 2345,19D 16進数 0から9の数字かAからFが続く 1aFh,0FFFFH aからfの文字にHかhが続く 0xABC, 0X12DE あるいは0Xか0xか$に続く $FF,$ab123 表3.2:AS68K 数字定数の書式 16 進数は識別子と区別するため数字で始まらねばなりません。16 進定数は大文字でも小文字でも受け付けられます。2 進定数は大文字の B で終わっていなければならないことに注意して下さい。小文字の b は一時(数値)ラベルの後方参照に使われるためです。 実数は固定小数点か、DF 疑似命令への指数書式でのみ受け付けられます。実数の指数部と仮数部は 10 進数でなければなりません。実数は IEEE の 32 または 64 ビット書式で保存されます。 3.3.3 デリミタ すべての数字と識別子はスペース、英数字でない文字、あるいは行末で区切られていなければなりません。 3.3.4 シンボル識別子 アセンブラが受け付けるシンボル(ラベル)はどんな長さでもよく、全てのキャラクタが意味を持ちます。シンボルを構成するキャラクタは、大文字および小文字のアルファベット、0-9 の数字、アンダースコア“_”、ドル符号“$”、疑問符“?”などの特殊シンボルから選ぶことができます。最初のキャラクタは数字であってはなりません。大文字と小文字は区別されます。以下に示すシンボルは全て正しく、しかも区別されます。 An_identifier an_identifier an_identifier1 $$$ ?$_123455 シンボル $ は特殊であり(現在の番地を表す)、ラベルとしては使用できません。さらに、オペコード、疑似命令ニーモニック、レジスタ名、あるいは条件コード名も使用できません。後で述べる条件コード名について注意して下さい。 アセンブラの生成する識別子 マクロのブロックに LOCAL 疑似命令が使われると、それぞれのマクロの展開にあたり、アセンブラは唯一無二のシンボルを生成し、それぞれの識別子を置き換えます。これらのシンボルは ??nnnn の形をとります。nnnn は 4 桁の数字です。混乱を避けるためユーザーはこの書式のシンボルを使うのを避けて下さい。 ロケーションカウンター アクティブなプログラムセクションの現在の位置は“$”シンボルでアクセスすることができます。 一時ラベル 一時ラベル(またはローカルラベル)は数字定数の形をとり、0 から 65535 までの正の 10 進数をとることができ、同じ値を何度でも再使用できます。このようなラベルの参照には、その数字列に後方(backward)または前方(forward)の参照を表す各々、b または f を付けて指示します。このようなラベルの使用例を以下に示します。 entry_point: ;これは遠方から参照される 1: move.w adc_res,D0 cmp.w #34,D0 ble 1f move.w #0,value bra 1b 1: move.w D0,value 2: add.w #1,D0 cmp.w upper,D0 ble 2b 2 つの 1: ラベルは f と b を使って参照されます。例えば、後方への参照 1b は、ファイルの現在の位置から後方を捜してみつかる最も近い同じ数値のラベル 1: を参照します。同様に、1fは、ファイル内の現在の位置から前方を捜してみつかった最初の同じ数値のラベル 1: を参照します。 3.3.5 ストリング ストリングは、クォートのペアではさまれた復帰と改行コードを含まない文字の列びです。シングル(')あるいはダブル(")クォートを使うことができますが、同じもののペアを使わなければなりません。DC.B 疑似命令のオペランドとして使われるストリングはどんな長さでもかまいませんが、命令のオペランドに使われるストリングの長さが 1 を越えることは許されません。 3.3.6 式 式は数字、シンボル、ストリングそして演算子から構成されます。演算子を表 3.3 にその優先度の順に示します。 演算子 意 味 優先度 NUL マクロのヌル引き数のテスト 8 *, /, MOD かけ算、わり算、剰余 6 SHR, SHL 右シフト、左シフト 6 >>, << 右シフト、左シフト 6 ROR, ROL 右ローテート、左ローテート 6 +, - 加算、減算(unary or binary) 5 EQ, NE, GT 比較演算 4 GE, LT, LE =, <>, > 比較演算 4 >=, <, <= NOT ビット単位の反転 3 ~ ビット単位の反転 3 AND ビット単位のAND 2 OR,XOR ビット単位のOR、排他的論理和 1 |,^ ビット単位のOR、排他的論理和 1 表 3.3:AS68Kの演算子 式のアトリビュート 式のアトリビュートには absolute と relocatable があります。absolute 式はその値が単純な定数であるものです。例えば 1, 234 とか -99 などがこれにあたります。relocatable 式はアセンブル時にその正確な値がわからないか、リンク時にリンカーによって評価されるものです。外部シンボルの値や、relocatable psects 内の番地の値などがこれにあたります。 メモリー領域の予約をする DS 疑似命令などのいくつかの疑似命令の引き数は absolute 式がでなければなりません。 3.3.7 文の書式 図 3.1 に文の書式を示します。2 番目の書式は MACRO, SET, EQU 疑似命令においてのみ有効です。label: フィールドはオプションであり、もしつけられた場合は一つの識別子を持っていなければなりません。name フィールドは必須であり、一つの識別子を持っていなければなりません。ラベルとマクロ名は最初の桁から始まっている必要はありません。それらは構文により認識され、もし、最初のトークンが識別子であれば、次のトークンはこれがラベルなのかマクロ定義なのか、あるいはマクロ展開なのかを判別するのに使われます。 label: opcode operands ;comment name pseudo-op operands ;comment 図 3.1:AS68K ステートメントの書式 3.3.8 プログラム・セクション プログラム・セクション、またの名を psects は、一つのプログラムの部分部分をグループにまとめるための方法です。ある psect のすべての構成要素は、たとえいくつかの分かれたファイルで定義されていたとしても、あるいは別の psect と一緒に、ただしプログラム上分離された形で一つのファイルの中にあったとしても、連続したメモリ領域にロードされます。psect はその名前で識別され、いくつかの修飾子を持っています。psect 疑似命令を psect の定義に使います。それは名前とコンマで区切られたフラグのリストを引き数としてとります。疑似命令 psect の詳細は別の項を参照下さい。psect の名前そのものはアセンブラにとって意味はありません。psect は 3.3.9 項に説明されている PSECT 疑似命令により定義されます。 3.3.9 AS68K 疑似命令 疑似命令はオペコードと同じように使われますが、それがコードを生成することはなく、またストリングとかデータバイトといった実行されないコードも生成することはありません。疑似命令を表 3.4 に示し、その詳細を以下に説明します。 PUBLIC PUBLIC 疑似命令は現ファイル内に定義されたシンボルをコンマで区切ったリストを引き数としてとり、これらがリンク時に他のモジュールからもアクセスできるようにします。 PUBLIC lab1,lab2,lab3 EXTRN これは PUBLIC の逆です。他のモジュールで定義されているシンボルを現モジュールからも参照できるよう宣言します。 EXTRN lab1,lab2,lab3 疑似命令 用途 PUBLIC シンボルを他のモジュールにも見えるようにする EXTRN 他のモジュールのシンボルにアクセスする GLOBAL public か external シンボルを定義する END アセンブリを終える PSECT プログラムセクションを定義、再開する ORG 位置カウンターをセットする ALIGN 位置カウンターを調整する EQU シンボルの値を定義する SET シンボルの値を最定義する DC バイト、ワード、ロングワード定数を定義 DF 浮動小数点定数を定義 DS バイト、ワード、ロングワードを予約 IF 条件アセンブリ ELSE 条件アセンブリ ENDIF 条件アセンブリの終り MACRO マクロ定義 ENDM マクロ定義の終り LOCAL ローカルラベルの定義 REPT コードのブロックを n 回反復 IRP コードのブロックをリストと反復 IRPC コードのブロックを文字リストを反復 EXITM マクロ展開の中止 FILE デバッガにソースファイル名を与える LINE デバッガにソースのライン番号を与える SIGNAT 関数にシグネチャ値を与える 表 3.4:AS68K 疑似命令 GLOBAL GLOBAL は PUBLIC と EXTRN を合わせたものです。シンボルのリストを宣言しますが、もしそのモジュールの中で定義されれば PUBLIC となり、さもなくば EXTRN とされます。 GLOBAL lab1,lab2,lab3 END END はなくてもかまいません。アセンブリの終了は、ソースファイルの終わりか、あるいは END 疑似命令で示されます。END 疑似命令では、オプションとして、そのプログラムの開始番地を定義する式を続けることができ、その式はリンカーに与えられます。 END END start_label PSECT PSECT 疑似命令はプログラムセクションを宣言または再開します。引き数として名前と、オプションでコンマで区切られたフラグのリストをとります。使用できるフラグは以下の通りです。いったん宣言された psect は、おなじ名前を別の PSECT 疑似命令の引き数として与えることで再開することができます。フラグを繰り返し指定する必要はありません。 PURE このフラグはリンカーにこの psect はランタイムに変更されることはなく、それゆえ ROM に置くことがきることを知らせます。このフラグの有効性の是非はリンカがこの指示を実行する能力を持っているかどうかに左右されます。 ABS これは現 psect を絶対形式として定義します。この psect はゼロ番地にロードされますが、これはこのモジュールがゼロから始まることを必ずしも意味しません。他のモジュールもこの psect に含まれうるからです。 OVRLD OVRLD と定義された psect はランタイムに連結されるのではなく、オーバーレイされた各モジュールからの要素を持ちます。ABS と組み合わされた OVRLD は真に absolute な、その psect 内のあらゆるシンボルが絶対形式の psect を定義します。 GLOBAL GLOBAL として定義された psect はリンク時に他のモジュールから集められた同じ名前のグローバル psect と一つにまとめられます。GLOBAL は初期値です。 LOCAL LOCAL として定義された psect はたとえ他に同じ名前があったとしても、他のローカル psect と一緒にされることはありません。ローカル psect はたとえそれが他のモジュール内のものであったとしてもグローバル psect と同じ名前であってはなりません。ローカル psect は CLASS オプションを持っていなければならず、さもないとリンク時に参照できなくなります。 SIZE このフラグは例えば SIZE = 100h のように、その psect の最大サイズを規定します。リンカーはまずすべてのモジュールからその psect の要素を集め、次ぎにそのサイズをチェックします。 CLASS このフラグは psect のクラス名を伴います。このクラスはリンク時にいくつかの psect、特に複数のローカル psect を正しく参照するために使われます。 RELOC この psect のフラグはその psect の relocatability (再配置性)値を指定します。これはその psect の開始点を置くバウンダリーを指定する値です。例えば RELOC = 100h はその psect が 256 バイトの倍数であるアドレスになるよう強制します。 PSECT 疑似命令の使用例を以下に示します: PSECT fred PSECT bill,size=100h,global PSECT joh,abs,ovrld PSECT text,pure,class=CODE,reloc=16 ORG ORG は現 psect 内の位置カウンターの値を変更します。ORG への引き数は絶対値か、あるいは現在の psect を参照する値でなければなりません。いずれの場合でも位置カウンターの値は引き数の値にされます。例を示します。 org $100 EQU と SET これらの疑似命令はシンボルを定義し、その値を式と同じにします。例を示します。 a_symbol EQU 123h a_symbol 識別子は 123h の値を与えられます。EQU はそのシンボルがすでに定義されて以内場合にのみ有効です。SET は EQU と同じように働きますが、シンボルの再定義に使うことができる点が異なります。 DC この疑似命令は記憶場所を疑似命令に続くサイズ指定に従ってバイト(.B)、ワード(.W)、ロングワード(.L)として初期化します。引き数は式のリストであり、そのそれぞれがバイト、ワード、ロングワードにアセンブルされます。DC.B だけが複数文字のストリングを引き数として取りとることができ、その一文字一文字が一つずつの格納場所にアセンブルされます。例えば値 1020 が DC.B に与えられた場合のように、もし式の値が格納場所には大きすぎる場合はエラーとなります。例を示します。 alabel: DC.B 1,2,3,4,"A string",0 DC.W 23*10,alabel,0,'a' DC.L 20000h,23 DF DF はロングまたはクワッドワードを実数に初期化します。サイズ指定 .L は 32 ビットの浮動小数点値を、また .D は 64 ビット浮動小数点値を生成します。例を示します。 DF.L 3.3,3e10,-23 DF.D 123456.789E-230 DS この疑似命令は記憶場所を予約しますが、初期化はしません。引き数はバイト(.B)、ワード(.W)、ロングワード(.L)、クワッドワード(.D)の数です。 alabel: DS.B 23 xlabel: DS.W 2+3 flabel: DS.D 10 ;80 バイトを予約 IF, ELSE と ENDIF これらの疑似命令が条件アセンブルを可能にします。IF の引き数は絶対式でなければなりません。もしそれがゼロでないと、対応する ELSE か ENDIF までのコードがアセンブルされます。もし式がゼロであると、対応する ELSE か ENDIF まではスキップします。ELSE で条件アセンブルの条件が反転し、ENDIFで条件アセンブルのブロックが終わります。例を示します。 IF some_symbol move.b D0,(A0)+ ELSE move.b D3,(A0)+ ENDIF この例において、もし some_symbol がゼロでないと、最初の move.b 命令がアセンブルされ、次のものはアセンブルされません。逆にもし some_symbol がゼロであると、最初ではなく2番目の move.b がアセンブルされます。 条件アセンブルはネストすることができます。 MACRO, EXITM と ENDM これらの疑似命令はマクロを定義します。MACRO 疑似命令はその前か後にマクロ名がなければならず、カンマで区切られたパラメータのリストが続きます。マクロが使われるときには、マクロ名はアセンブラのステートメントのオペコードと同じように使われ、それにパラメータのリストが続きます。例を示します。 copy MACRO par1,par2,par3 move.&par3 par1,D0 move.&par3 D0,par2 ENDM copy loc1,loc2,w ; 展開結果 move.w loc1,D0 move.w D0,loc2 copy (a0)+,-(a2),b ; 展開結果 move.b (a0)+,D0 move.b D0,-(a2) 上記の例において、& 文字がマクロのパラメータを他のテキストと連結するために使われていますが、展開後は取り除かれていることに注意して下さい。これにより 2 番目の展開の 3 番目のパラメータへの引き数 b がオペコードの一部を形成します。 NUL 演算子はマクロの中ではマクロの引き数をテストするために使えます。コメントをダブルセミコロン“;;”で始めることで、マクロの展開においてコメントを取り除くことができます(これによりマクロの記憶場所を小さくします)。 EXITM 制御命令はマクロ展開を中断するためにマクロの中で使います。これは通常、条件アセンブルとともに使われます。 LOCAL LOCAL 疑似命令は、マクロの展開ごとに唯一無二のラベルが定義されるようにします。LOCAL 疑似命令の後にリストされるすべてのシンボルは、マクロ展開の際に、それに変わる一意的なアセンブラ生成が生成するシンボルを持ちます。例を示します。 xxx MACRO src,dst,cnt LOCAL loop move.w #cnt-1,D0 loop: move.b (src)+,(dst)+ dbra D1,loop ENDM xxx A0,A1,A3 ; 展開結果 move.w #23-1,D0 ??0001: move.b (A0)+,(A1)+ dbra D0,??0001 REPT REPT 疑似命令は、その引き数で決まる回数だけ展開される名前の無いテンポラリ・マクロを定義します。例を示します。 REPT 3 move.w D0,(A2)+ ENDM ;展開結果 move.w D0,(A2)+ move.w D0,(A2)+ move.w D0,(A2)+ IRP と IRPC IRP および IRPC 疑似命令は REPT と似ていますが、指定された回数だけブロックの繰り返しを行う代りに、引き数リストのメンバーごとに 1 回ずつ繰り返す点が異なります。IRP の場合は、リストは一般的なマクロ引き数リストで、IRPC の場合は、ストリングからの連続したキャラクタとなります。例を示します。 IRP arf,lab1,lab2,#23 move.w arg,(A0)+ ENDM ;展開結果 move.w lab1,(A0)+ move.w lab2,(A0)+ move.w #23,(A0)+ IPRC arg,1982 mulu #10,D0 add.w #arg,D0 ENDM ;展開結果 mulu #10,D0 add.w #1,D0 mulu #10,D0 add.w #9,D0 mulu #10,D0 add.w #8,D0 mulu #10,D0 add.w #2,D0 FILE と LINE FILE と LINE 制御命令は高級言語トランスレータ(コンパイラ)がソースファイルの情報をデバッガに伝えるために作ります。FILE 制御命令は引き数としてファイル名をとり、ソースファイル名ラベルとしてオブジェクトファイルへ渡されます。LINE 制御命令は同様に、引き数としてライン番号をとり、ライン番号シンボルとしてオブジェクトファイルへ渡されます。例を示します。 FILE test.c LINE 123 SIGNAT この制御命令は通常 C コンパイラによって作られ、その名前の関数のシグネチャとしてオブジェクトファイル内にエンコードされます。リンク時に、与えられた名前のすべてのシグネチャは一致するか調べられ、一致しないとリンクエラーとなります。これは関数のの宣言とコーリングシーケンスが正しく対応しているかをコンパイラが確認するために使われます。C 関数のシグネチャを知る最も簡単な方法は、ダミーの C の関数を作り、アセンブラにコンパイルし、その際生成された SIGNAT 制御命令をコピーすることです。例を示します。 SIGNAT _afunc,12345 ALIGN 68000 プロセッサを使うとき、記憶場所をワード(あるいはロングワード)境界に配置する必要が生じます。ALIGN 制御命令にはサイズ指定子(.W か .L)が付き、それに続く記憶場所がそれぞれの境界にそったものになるようゼロ挿入を行います。例を示します。 ALIGN.W 3.3.10 MACRO の使用 マクロを起動する際、引き数は必ずコンマで区切られていなければなりません。もし、引き数にコンマを含めたいのであれば、アングルブラケット(“<”と“>”)を使って引き数を囲むことで、カンマのような区切り記号を含む任意のテキストを一つの引き数として渡すことができます。加えて、“!”を任意の一文字に使うことが出来ます。“!”の直後に続く文字は、たとえそれがコメントを表すセミコロンであってもマクロの引き数に渡されます。 引き数が“%”で始まっている場合は、ストリングとしてではなく式として評価され、10 進数として渡されます。これはマクロボディー内における引き数の評価により異なった結果を与える場合に役立ちます。 3.3.11 アセンブラ制御命令 制御行は、ソースファイルのなかの1行であり、コードを生成するのではなく、アセンブラの動作をコントロールするものです。制御行は行の最初の文字がドル記号“$”で始まり、その後にスペースで区切られた制御キーワードのリストが続きます。制御キーワードはプログラム内のどこにあってもかまいません。いくつかのキーワードにはその後にパラメータが続きます。多くのキーワードは正と負の形を持っており、すべてに 2 文字の省略形があります。負の形は、キーワードあるいは省略形の前に NO を付したものです。表 3.5 にキーワードのリストを示します。それぞれの詳細は以下の通りです。 キーワード 省略形 初期値 PAGELENGTH(n) PL PL(66) PAGEWIDTH(n) PW PW(80 / 132) XREF/NOXREF XR/NOXR NOXR COND/NOCOND CO/NOCO CO EJECT EJ GEN/NOGEN GE/NOGE NOGE INCLUDE“パス名” IC LIST/NOLIST LI/NOLI LI TITLE("文字列") TT 表 3.5: AS68K アセンブラ制御 PAGELENGTH(n) この制御命令はリスティング・フォームの長さを指定します。初期値は 66 行です。 PAGEWIDTH(n) 1 行の長さを指定します。初期値はコンソールに対しては 80、プリンターに対しては 132 です。 XREF XREF はコマンドライン・オプションの -C と同じものであり、アセンブラにクロスリファレンスの生データファイルを生成するよう指示します。 COND COND が指定されていると、条件アセンブルのためにアセンブルされない行もリストされます。もし NOCOND が指定されると、実際にアセンブルされた行だけがリストされます。 EJECT その位置からリストの新しいぺージが開始されます。ソース内の改ページ文字 (ctrl-L) と同じ効果があります。 GEN GEN が有効であると、マクロ展開によって生成されたコードもリストされます。もし NOGEN が有効であると、マクロの呼び出しだけがリストされます。 INCLUDE "パス名" パス名で指定されたファイルがリストのこの位置に挿入されます。INCLUDE 制御命令はその行のもっとも右になければなりません。 LIST LIST と NOLIST はそれぞれリスティングのオン・オフを切り換えます。 TITLE("ストリング") この制御命令キーワードはリスティングの毎ページの一番上に現れます。ストリングはシングル(')あるいはダブル・クォート(")でくくられていなければなりません。 例を示します。 $ TITLE("Test module") GEN NOCOND $ INCLUDE "/headers/sys.as" 3.4 診断 アセンブラがエラーを見つけると、標準出力(通常はスクリーン)にソースファイル名とライン番号が付されたエラーメッセージが書き込まれます。もし、リスティングが生成されていると、エラーメッセージはそのエラーを生じた行のすぐ上に出力されます。 第4章 LUCIFERソースレベル・デバッガ 4.1. 概   説 Lucifer(ルシファー)は、ハイテック C コンパイラとともに使用する C 言語ソースレベル・リモート・デバッガです。本デバッガは、ホスト・マシン(通常は MS-DOS か Unix )上で走るプログラムであり、シリアル・ラインを介してターゲットである 68000 ベースのマイクロコンピュータ・システムと通信します。 ホスト・プログラムは、ソースコードの表示、逆アセンブル、メモリの表示などのユーザー・インタフェースを提供します。ターゲットとなるシステムは、メモリおよびレジスタを読み書きしたり、シングル・ステップ実行する機能を持っていなければなりません。Luciferには、これらの機能を実現するための小さなプログラムが用意されています。このプログラムをコンパイルして、ターゲット・システムの ROM に書き込みます。ホスト・プログラムは、シリアル・ラインを介してこの ROM プログラム、すなわちターゲット・デバッギング・モニター(TDM)との通信を行います。 4.2. Luciferの使用法 Lucifer を使うには、自分が使おうとする Lucifer ターゲット・モニターの環境との干渉を避けたユーザー・プログラムのコーディングを行ない、そのプログラムをコンパイルする際にはモニタの環境を配慮した ROM / RAM / RAM SIZE を指定し、シンボル名、行番号およびファイル名を含んだシンボル・ファイルを生成するよう指示します。このシンボル・ファイルを作成するには、68KC の -G オプションを使います。-H オプションを使っても、Lucifer に使えるシンボル・ファイルを作成できますが、この場合には C 言語ソースコード・レベルの情報は一切含まれません。 ROM 化する際と、Lucifer 上でデバッグする際のユーザー・コードの違いは、Lucifer の使うリソースとベクタの干渉を考慮することだけであり、基本的に同じものに出来ます。ユーザー・プログラム内で set_vector() マクロにより設定されたベクタ・テーブルは Lucifer により RAM にロードされますが、Lucifer モニタはこれを参照し、ユーザーの割り込み処理ルーチンは ROM にロードされた場合と同様に動作します。 デバッギング中のプログラムが標準 I/O 関数(printf()、scan()など)のどれかを使っている場合には、ユーザーのプログラムを TGETCH.OBJ 内の特別な I/O ルーチン群とリンクする必要があります。TGETCH モジュールのソースコード TGETCH.C は Lucifer のディレクトリにあります。TGETCH.C には、正しいプロトコルを使って Lucifer ホスト・プログラムと通信を行う関数群が入っています。次のように、コンパイル・コマンドの終りにユーザーのソースファイル名に続けて TGETCH.OBJ を追加するだけで、TGETCH.C をユーザーのプログラムにリンクすることができます。 68KC -Gtest.sym test.c tgetch.obj また、統合開発環境 HPD68K を使って、Lucifer に使用する HEX ファイルとシンボル・ファイルを作成することもできます。Options メニューにて Symbolic debug info をタグし、Symbol file name ... を指定します。Motorola HEX をタグし、ROM & RAM adresses ... を Lucifer ターゲットモニターの環境に合わせて設定します。ユーザーのソースコードを TGETCH.C のようなその他のモジュールと一緒にリンクするには、“Make”メニュー内のコマンドを使って、マルチファイル・プロジェクトを設定します。HPD68K の詳細については、“HPD68K ユーザーズ・マニュアル”のセクションを参照ください。 ホストのシリアルポートとターゲットとの接続は送信データ (TXD)、受信データ (RXD)と接地 (SG) の 3 本の線をクロス結線することで行います(注:NEC9801 本体の RS-232C の CTS は RTS または DSR に折り返し、常時 ON にしておきます)。 HEX ファイルおよびシンボル・ファイルを作成したら、次のように Lucifer を起動します。 luc68k -sSPEED -pCOMn test luc68k -sSPEED test (NEC9801の場合) MS-DOS システムを使用している場合は、COMn は COM1 か COM2 でなければなりません(注:NEC9801版では COMn は無効)。Unix システムでは、たとえば -p/dev/ttya のように、ターゲットに接続されているシリアル・ポート名を指定するだけになります。いずれの場合も、デフォルトの通信速度は 19200bps です(注:NEC9801 版は 9600bps)。また、デフォルトのシリアル・ポートは、MS-DOS の場合 COM1、Unix の場合は /dev/ttya になります。デフォルト以外のポートをアクセスするには、-s(スピード)および-p(ポート)オプションを使用します。Unix では /dev をデバイス名から除いても差し支えなく、/dev が自動的に付加されます。したがって、-ptty0 も -p/dev/tty0 も同じデバイスをアクセスします。MS-DOS 環境では、次の例は、9600bps のボーレートで COM2 をアクセスします。 luc68k -s9600 -pCOM2 NEC9801 ではプライマリー・シリアル・ポートのみをサポートしており、-p オプションは無効であることに注意して下さい。 環境変数 LUC68K_ARGS を使えば、デフォルトの通信速度とポートの値を変更することができます。LUC68K_ARGSは、Luciferの“-”オプション(ただし、ファイル名オプションではない)を任意に組み合わせて指定できます。たとえば、デフォルト・オプションを 9600 ボーでポート COM2 にしたい場合、AUTOEXEC.BAT ファイルに次の行を付加します。 SET LUC68K_ARGS=-s9600 -pCOM2 Lucifer は上記のスピードおよびポートのオプションの他に、オプションで 2 つの引き数をとります。(表記順でいうと)1 つは使用するシンボル・ファイルの名前で、もう1 つはダウンロードする .HEX もしくは .BIN ファイルの名前です。ダウンロードするファイルのベース名だけを指定し、拡張子を指定しないと Lucifer は自動的に .SYM 、 .HEX および .BIN ファイルをサーチします。これらのファイルは通常同じベース名が与えられています。このため、次のコマンドは、自動的に test.sym と test.hex あるいは test.bin を探し出し、それらを使用します。 luc68k test HEX もしくは BIN ファイルのオートロードをしたくないときは、シンボル・ファイルに異なった名前を付けます。 通常は HEX ファイルを使います。バイナリ・ファイルをダウンロードしようとするとダウンロード・アドレスのプロンプト(入力要求)が出ます。コマンド行から直接ダウンロードを行うときは、LUC68K コマンド行に -baddr[:end] オプションを付加することで、このプロンプトの出力をオーバーライドすることができます。たとえば、$20000 番地にファイル test.bin をダウンロードさせたいときには、次のようにコマンドを使います。 luc68k -b20000 test オプションの“:end”の値は、ダウンロードを終わりにする番地を指定します。たとえば、test.bin の最初の $2000 バイトを $4000 から $6000 番地までにロードしたいのであれば、コマンドは次のようになります。 luc68k -b4000:6000 test Luciferは起動メッセージを表示して、ターゲットとの通信を試みます。通信がうまくいけば、ターゲットから送られた Lucifer の識別メッセージ“Lucifer 68000 V3.00”を表示します。その後、コロン“:”のプロンプトを表示し、コマンド待ちの状態となります。コマンドのリストは、? をタイプして、リターン・キーを押すと表示されます。なお、コマンドはすべて小文字でなければならないことに注意してください。 4.3. 式内のシンボル名 Lucifer のコマンドが引き数として数値またはアドレスをとるときには、シンボル名、レジスタ名および行番号を使用できます。シンボルは、ソースコードで定義されたとおりに、そっくりそのまま正確に入力する必要があります。式が必要なところでは、次の形式をとります。 表記 例 symbol_name main symbol+hexnum barray+20 $hexnum $2000 :linenumber :10 regname A5 b (ブレークポイント)コマンドでは、デフォルトによって、10 進数はすべて行番号として解釈され、一方 u (逆アセンブル)コマンドでは、同じくデフォルトにより、数字はすべてアドレスを表わす 16 進数として解釈されます。ただし、コロン“:”もしくはドルマーク“$”を使うことで、これらの設定をいつでも変更することができます。 シンボル入力の際、C コンパイラにより付加されるアンダースコア“_”を入れる必要はありませんが、デバッガがシンボルをプリントアウトするときには、常にアンダースコアが付けられます。シンボルが期待される部分には、レジスタ名を使用することもできます。 4.4. Lucifer のコマンド・セット 4.4.1.  B コマンド:ブレークポイントの設定と表示 b コマンドでブレークポイントの設定と表示を行います。b コマンドの後に式が与えられない場合には、現在設定されているすべてのブレークポイントのリストが表示されます。式が与えられたときは、指定された行もしくは番地にブレークポイントが設定されます。すでに存在しているブレークポイントを設定しようとするか、または Lucifer が認識できない式を入力しようとすると、エラー・メッセージが表示されます。 注意:指定された 10 進数は、デフォルトでは行番号として解釈されます。絶対番地を指定したいときは、次の例のように、前にドルマーク“$”を付けてください。 : b 10 Set breakpoint at _main+$28 : ブレークポイントには、セミコロン“;”で区切られた Lucifer コマンドのリストを続けることもできます。これらのコマンドは、ブレークポイントに遭遇したときに実行されます。これによって、いったん停止して値を表示した後、実行を再開するといったブレークポイントを作ることができます。たとえば、次のコマンドは、いったん停止してグローバル変数の“pi”の値を表示した後、実行を継続するブレークポイントを作成します。 : b 10 @f pi;g 4.4.2. C コマンド:プログラム・カウンタの指す命令の表示  c コマンドは、プログラム・カウンタの現在の値が指すアセンブラ命令および C ソース行を表示します。このコマンドは、Lucifer を使っていて、プログラム・カウンタがどこを指しているかわからなくなったような場合に便利です。以下に例を示します。 : c 10: printf("answer = %d\n",j); _main+$22 move.l _j,D0 4.4.3. D コマンド:メモリ内容の表示 d コマンドは、ターゲットシステム上のメモリの 16 進ダンプを表示します。式が与えられていない場合は、最後の d コマンドで到達した番地から 16 バイトがダンプされます。番地が 1 つ指定されていると、指定の番地から 16 バイト分がダンプされ、2 つ指定されていると、最初の番地から 2 番目の番地までのメモリの内容が表示されます。ダンプ・アドレスの指定には、シンボル、行番号、レジスタ名または絶対メモリ番地が使用できます。 4.4.4. E コマンド:C ソースコードを表示 e コマンドでは、関数またはファイルの C ソースコードを調べることができます。関数名が指定されていると、Lucifer は要求された関数を含むソースファイルを探し出し、関数の先頭のすぐ上から表示を行います。ファイル名を指定すると、指定したファイルの 1 行目から表示します。 : e main 2: 3:int value, result; 4: 5:main() 6:{ 7: scan("%d",&value); 8: result = (value << 1) + 6; 9: printf("result = %d\n",result); 10:} : 4.4.5. G コマンド:実行の開始 g コマンドでターゲットシステム上のプログラムの実行を開始させます。g コマンドの後に式を与えないときは、現在のプログラムカウンタ(PC)の位置から実行を開始します。式があるときは、指定の番地から実行を開始します。ブレークポイントに到達するか、control-C によるユーザーの割込みがあるまで、実行が続けられます。ブレークポイントに到達した後は、g、s および t コマンドを使って、その場所から実行を続けることができます。 4.4.6. I コマンド:命令トレース・モードのトグル i コマンドは、命令トレース・モードをトグルします。命令トレース・モードが有効なときは、s コマンドで C ソースの各行をステッピング実行している際に、命令実行前に各命令が表示されます。 例として PC が 9 を指しているものとします。 printf("result = %d\n",result); 命令トレース・モードがオフであると、ステップ実行は次のように表示されます。 : s result = 20 Stepped to 10:} : 命令トレース・モードをオンにすると、ステップ実行は次のように表示されます。 : s _main+$22 move.l _result,-(a7) _main+$28 move.l #__Lstrings+$12,-(a7) _main+$2E jsr _printf result = 20 _main+$34 add.l#8,a7 Stepped to 10:} : ライブラリ関数 printf() はステッピング・メカニズムではトレースされず、全速度で正しく機能したことに注意して下さい。 4.4.7. L コマンド:16 進ファイルのロード l コマンドは、オブジェクトファイルをターゲットシステムにダウンロードするのに使います。Lucifer はモトローラの S-レコードのフォーマット、インテル HEX フォーマットかバイナリーファイルを受け付けます。そのいずれでもないフォーマットのファイルのロードは拒否します。このコマンドは“l filename”の形をとります。 4.4.8. M コマンド:メモリの修正 m コマンドは、メモリの指定された番地の内容を修正するのに使います。このコマンドは次の書式をとります。 m addr val1 [val2 ...] ここで、addr は書き込む番地であり、つづく引き数はその番地に書き込む値やストリングです。ストリングにはシングルクォートもダブルクォートも使うことができます。例: : m buf "hello" 13 10 'world' 0 4.4.10. Q コマンド:オペレーティング・システムへの復帰 q コマンドは、Luciferを抜け出てオペレーティング・システムに戻るために使用します。 注意:q コマンドを使っても、ターゲット・プログラムは終了しない(Lucifer モニタはターゲットシステムで実行を続ける)ので、ターゲットを再度初期化することなく、再びLucifer に入ることができます。 4.4.11. R コマンド:ブレクポイントの除去 r コマンドは、b コマンドで設定したブレークポイントを取り除きます。引き数を与えないと、それぞれのブレークポイントについて、ブレークポイントを取り除くかどうかユーザーに尋ねてきますので y/n で答えます。 : r Remove _main+$28 ? y Remove _main+$44 ? n Remove _test ? n : r main+$44 Removed breakpoint _main+$44 4.4.12. S コマンド:1 行ステップ s コマンドは、C あるいはアセンブラのソースコードの 1 行ごとのステップ実行を行います。これは、一般にいくつかの機械語命令をシングルステップで実行することにより実現されますが、それゆえきわめて低速です。もしその行に関数コールおよびコントロール構造(break、continueなど)がないことを Lucifer が判定できれば、次の行に一時的なブレークポイントを設定して、その行をフル・スピードで実行します。 機械語命令ごとにシングルステップする際、ステップ(s)コマンドは外部関数およびライブラリ関数へのサブルーチン・コールをフル・スピードで実行し、それによって、printf() や scan() といった複雑なライブラリ・ルーチンをシングルステップすることで処理が遅くなるのを回避します。通常のライブラリ・コンソール I/O は、シングルステップの間でも正しく機能します。ライブラリールーチンなどのようにライン番号情報が得られない場合は、s コマンドは t コマンドのようにアセンブラをステップ実行します。 カレントの PC が行 6 を指していると想定 { : s Stepped to 7: scan("%d",&value); : s Target wants input: 7 Stepped to 8: resuit = (value << 1) + 6; : s Stepped to 9: printf("result = %d\n",result); : s result = 20 Stepped to 10:} : 図4.1:S コマンドの実行例 4.4.13. T コマンド:1 命令のトレース t コマンドは、ターゲット上の機械語命令 1 つをトレースします。プログラムカウンタ(PC)のその時の値が、実行される命令の番地として使われます。その命令の実行終了後、次の命令とすべてのレジスタの内容が表示されます。 4.4.14. U コマンド:逆アセンブル u コマンドは、ターゲットシステムのメモリのオブジェクト・コードを逆アセンブルし、表示します。式を指定すると、指定の番地から逆アセンブルを開始します。番地を指定しないと、最後に逆アセンブルが終了した命令から逆アセンブルを開始します。逆アセンブルされるプログラムのシンボルテーブルが利用できるときは、オブジェクトコード内の番地を自動的にシンボルに変換します。逆アセンブルされる C プログラムの C のソースコードが利用できるときは、各命令群に対応する C プログラムの行も表示されます。 注意:指定されたすべての値はデフォルトにより、絶対番地として解釈されます。ライン番号を指定するときは、前にコロンを付けます。 : U 8: printf("result = %d\n", result); _test+1E move.l 8(a7),-(a7) _test+$22 move.l #__Lstrings,-(a7) _test+$28 jst _printf _test+$2E add.l #8,a7 9: } _test+$34 add.l #12,a7 _test+$3A rts _test+$3C sub.l #12,a7 _test+$42 bra _test+$1E _putch bra _putch+$48 _putch+ move.b d3,d0 図4.2:U コマンドの実行例 4.4.15. W コマンド:バイナリのアップロード w コマンドは、ターゲットメモリの内容をホストへアップロードしてバイナリファイルとして書き出します。このコマンドは、ファイル名、開始番地およびその長さの 3 つの引き数をとります。開始番地と長さの値は16進数であたえます。たとえば、Lucifer モニタ ROM がターゲットシステムの $0000 から $1FFF にある場合、次のコマンドによりバイナリファイルにアップロードすることができます。 :w lucrom.bin 0 2000 ...... Uploaded 8192 (0x2000) bytes to lucrom.bin : 4.4.16. X コマンド:レジスタの表示と変更 x コマンドは、ターゲット CPU のレジスタの内容を調べたり、変更するために使います。パラメータを指定しないと、レジスタの内容は変更されることなくただ表示されます。レジスタの内容を変更するには、有効なレジスタ名と、そのレジスタの新しい値の 2 つのパラメータを指定してください。新しい値を設定した後、レジスタの内容を表示します。 :x d0 1024 d2 1f PC=00000D98 SSP=0007F238 USP=00000000 SR/CCR=2000 ----- D0=0000102D D4=00000000 A0=00000000 A4=00000000 D1=0000102D D5=00000000 A1=00000000 A5=00000000 D2=0000102D D6=00000000 A2=00000000 A6=00000000 D3=0000102D D7=00000000 A3=00000000 : どの68000のレジスタ名も使うことができます。レジスタのいくつかは別名を持っています。例えば SP, USP, A7 は同じものです。 4.4.17. @ コマンド:C 変数の表示 @ コマンドは、メモリの内容を C の標準型の 1 つとして解釈して表示します。@ コマンドのフォーマットは次のとおりです。 @t[*]expr ここで、t は表示される変数の型を表わし、* はゼロあるいは任意の個数の間接演算子“*”からなり、expr は表示される変数の番地です。 コマンド 型 表示 @c char 文字と値 @cu unsigned char 10進 @cx unsigned char 16進 @co unsigned char 8進 @h short 10進 @hu unsigned short 10進 @hx unsigned short 16進 @ho unsigned short 8進 @i int 10進 @iu unsigned int 10進 @ix unsigned int 16進 @io unsigned int 8進 @l long 10進 @lu unsigned long 10進 @lx unsigned long 16進 @lo unsigned long 8進 @d double 10進 @f float 10進 @p pointer シンボル+オフセット @s string ストリング 図4.2:@ コマンドオプション 例:long変数“longvar”の16進での表示 @lx longvar ポインタ“cptr”で指し示されるキャラクタの表示 @c *cptr “ihandle”の逆参照:unsigned intへのポインタに対するポインタ @iu **ihandle 変数を表示した後、現在の番地は表示された型の大きさだけ進められ、リターンキーを繰り返し押すことにより、配列をステップすることを可能にしています。“:”プロンプトで ?@ と入力すれば、@ コマンドのオンラインヘルプを表示することができます。 4.4.18. “.”コマンド:ブレークポイントの設定と実行の開始 . コマンドは、一時的なブレークポイントを設定するために使用し、プログラムカウンタの現在の値から実行を再開するために使われます。実行は、次のブレークポイントに到達するか、control-Cでユーザーに中断されるまで継続され、その後、このブレークポイントは取り除かれます。 注意:異なるブレークポイントで実行が停止するか、実行に割込みがかかった場合も、一時的なブレークポイントは取り除かれます。ブレークポイントの番地を指定しないと、現在有効なブレークポイントのリストを表示します。 PCがプログラムの先頭を指していることを想定 : . 10 Target wants to input: 7 result = 20 Breakpoint 10:} _main+$28 rts : . コマンドの例 C プログラムの行番号 10 に対して実行する 4.4.19 “;”コマンド:ソース行の表示 : コマンドは、ソースファイルの指定位置からソースコードを 10 行表示します。行番号を指定しないと、表示されたソースコードの最後のページが再表示されます。以下に、例を示します。 : ;4 4: 5: main() 6:{ 7: scanf("%d",&value); 8: result = (value << 1) + 6; 9: printf("result = %d\n",result); 10:} 4.4.20. “=”コマンド:ソースの次ページの表示 = コマンドは、現在のファイルからソースコードを次の 10 行表示します。たとえば、表示された最後のソース行が行番号 7 とすると、= コマンドは 8 行目から始まる 10 行を表示します。 4.4.21. “-”コマンド:ソースの前ページの表示 - コマンドは現在のファイルから前の 10 行分のソースコードを表示するのに使います。例えば、表示された最後のソース行が 15 行目から始まっていた場合は、5 行目から始まる 10 行分を表示します。 4.4.22 “/”コマンド:文字列のソースファイル内の検索 / コマンドは、カレントのソースファイルの中の文字列を検索します。/ コマンドの後にタイプされたテキストが、ソースファイルの検索に使われます。指定された文字列を含む最初のソース行が表示されます。/ コマンドの後にテキストを入力しないと、その前に使った検索用の文字列が再び使用されます。文字列検索は、毎回その前の検索が終了した地点から開始され、ソースファイルを通してステップしながら一致する文字列をすべて検索することができます。 : /printf 10: printf("Enter a number:"); : / 14: printf("Result = %d\n",answer); : / Can't find printf : / コマンドの使用例 4.4.23. “!”コマンド:DOS コマンドの実行 ! コマンドは Lucifer を終了させることなく、オペレーティングシステムのシェルコマンド行を実行するのに使います。! の後にタイプしたテキストが、変更なしにそのままシェルに渡されます。 4.4.24. その他のコマンド 上述したコマンドに加えて、Lucifer は打ち込まれた有効な 10 進数すべてをソース行番号として解釈し、その行の C ソースコードを表示します。 コマンドを入力せずにリターンキーを押すと、その前のコマンドが d、e、s、t または u であった場合には、そのコマンドが再実行されます。いずれの場合も、前のコマンドをやめたところから再開されます。たとえば、直前のコマンドが“d 2000”であったとすると、リターンキーだけを押すと、コマンド“d 2010”と同じ結果になります。 4.5. ターゲットへの Lucifer モニタのインストール Lucifer をユーザーのシステムで使用するには、付属の Lucifer モニタをターゲットのハードウェアに合わせて変更し、コンパイルしてターゲットのROMに入れておく必要があります。場合によっては付属の Lucifer モニタをほとんど変更することなく使うことができますが、参考例を基本にして移植する必要があります。2 つのターゲットモニタのソースが参考例として LUCIFER ディレクトリ内に用意されています。TARG340.C は 68340 とその内蔵シリアルポート用に構成されており、68340 ベースのターゲットシステムであれば、ボーレイト/タイマーの初期化コードを変更するだけで使うことができます。TARGET.C は 68000 と 2681 UART を使ったターゲットの例で、68000シリーズを使ったシステムへの移植の基本として利用できます。 ターゲットモニタ TARGET.C をコンパイルするには、次のコマンドを使用します。 68KC -O -Zg -Arom,ram,ramsize TARGET.C ここで、 romはモニタが常駐するROM内の番地 ramはモニタのグローバル変数とスタックが置かれるRAM内の番地 ramsizeはモニタのグローバル変数とスタック領域のサイズ、512バイトあれば十分 を、それぞれ表しています。 4.5.1. ターゲット・モニタ・ソースの移植 ターゲットモニタソースの移植作業は、68340 の内蔵シリアルポート用に書かれた TARG340.C 、あるいは 68000 + 2681 UART用に書かれている TARGET.C をもとにしてその中のシリアル I/O 関数 putch()、getch()および init_uart() を変更するだけです。 なお、市販コンピュータボード用に移植したターゲットモニタのソースコードを集めたターゲットモニタ・ソースコード集を有償で用意しております。弊社のHI-TECH C サポート係までお問合せください。 私どもではなるべく多くの市販ボードを支援すべく、ボード・メーカーとユーザーに協力をお願いしております。現在 ターゲットモニター集がサポートしていない市販の68000系システムボード上で走るターゲットモニタを作成された場合は、そのコードをお送りいただければ幸いです。ターゲットモニタ・ソース集への追加を検討させて頂きます。