cpu部分では、外部バスへのマッピングのみ定義する必要があります。これは、後でmemory部分で定義する ことができます。次の例には、2つの外部バスexternal_ram_busとexternal_rom_busへの参照が含ま れています。
bus address_bus { mau 8;
mem addr=0 chips=rom_chip;
map src=0x100 size=0x7f00 dst=0x100 bus=external_rom_bus;
mem addr=32k chips=ram_chip;
map src=0x8100 size=0x7f00 dst=0x100 bus=external_ram_bus;
}
5.4 software部分
5.4.1 はじめに
software部分には、次の2つの主要な部分があります。
1. load̲mod 2. layout記述
software {
load_mod start = start_label;
layout {
// ordering of sections }
}
5.4.2 ロードモジュール
キーワードload_modは、プログラムの開始ラベルを定義します。プログラムの開始ラベルはコードの開始 点を示し、リセットベクタがこのラベルをポイントします。このラベルが参照されない場合、ロケータは 警告を生成します。
load_mod start = start_label;
5.4.3 layout記述
layout定義は、省略することができます。layout定義を省略した場合、ロケータは、cpu部分(5.3節を参照)に あるamode(アドレッシングモード)のDELFEE記述に基づいてlayout定義を生成します。ただしこれは、(ス タックやヒープのような)セクションをロケートするときの順序を制御するときに使用できません。layout 部分を定義する場合、ロケータはこの記述を使用します。
layout部分は、DELFEE言語でもっとも難しい部分と言えるでしょう。この部分は、セクションを正しくロ ケートするときに必要な情報を、ロケートアルゴリズムに提供する目的で設計されています。いくつかの 例を使用することで、DELFEE言語を使用してロケートアルゴリズムに影響を与える方法を紹介します。
全体を把握しやすくするため、まず、layout部分の例を示します。
layout {
space address_space { block rom {
cluster first_code_clstr { attribute i;
amode near_code;
amode far_code;
}
cluster code_clstr { attribute r;
amode near_code {
section selection=x;
section selection=r;
}
amode far_code { table;
section selection=x;
section selection=r;
copy; // locate rom copies here }
} }
block ram {
cluster data_clstr { attribute w;
amode near_data {
section selection=w;
}
amode far_data {
section selection=w;
heap;
stack;
} }
} }
}
layout定義は、次の構文で定義します。
layout {
// space definitions }
最初に、layout定義の中で指定されるさまざまなレベルについて説明します。
space このレベルは、layoutレベルの中でのみ使用できます。cpu部分にあるspace定義と同じspaceレベル
があります。
block このレベルは、spaceレベルの中でのみ使用できます。cpu部分にあるspace定義で定義されている
マッピングと同じblockレベルがあります。
cluster このレベルは、blockレベルの中でのみ使用できます。blockには複数のclusterがある場合もありま
す。主な目的は、(コード/データ)セクションをグループ化することです。ロケータは、指定され た順序でそれぞれのクラスタをロケートします。
amode このレベルは、clusterレベルの中でのみ使用できます。amodeはcpu部分のamode定義に対応しま
す。amode内では、データ/コードセクションがロケートされる順序を指定することができます。
4つのレベルは、大きく2つのグループに分けることができます。spaceおよびblock定義はアドレス範囲に対 応し、clusterおよびamode定義はセクション(のグループ)に対応します。
次の節では、まずspaceおよびblock定義について説明します。その次の節では、セクションの一定のグルー プを選択する方法と、clusterおよびamode定義でこれを使用する方法について説明します。
5.4.4 space定義
5.3.3節で、cpu部分のspaceのアドレス変換についてすでに定義しています。5.3.3節の例では、次のspaceが定 義されています。
space address_space { mau 8;
map src=0 size=32k dst=0 bus=address_bus label=rom;
map src=32k size=32k dst=32k bus=address_bus label=ram;
}
layout定義では、cpu部分で定義されているすべてのspaceについて記述する必要があります。
spaceレベルは、必ずlayout定義の中に入れ、spaceレベルの中には、blockレベルのみ(複数指定可)を入れる ことができます。
spaceの名前は、cpu部分のspace定義に対応している必要があります。
構文は次のようになります。
space name {
// block definitions }
以下は、software部分のspace定義の例です。
space address_space { block rom {
....
}
block ram { ....
} }
この例では、space address_spaceで、block romとblock ramの2つのブロックが定義されています。
5.4.5 block定義
block定義を使用すると、チップサイズに基づいてセクションに境界を設定できるようになります。
ブロックは、メモリの物理領域を参照します。block記述の範囲内では、選択されるセクションのみを使用 することができます。結果的に、ブロックにより、セクションをロケートできる範囲が決まります。
ブロックの物理アドレス範囲は、実際にはラベルの付いたマッピングによってcpu部分で定義されています。
space address_space { mau 8;
map src=0 size=32k dst=0 bus = address_bus label = rom; //<--// --> block name; rom map src=32k size=32k dst=32k bus = address_bus label = ram;
//<--// --> block name; ram }
block記述の名前は、cpu部分のspace定義にあるmap定義のラベルに対応させる必要があります。block定 義は、必ずspace定義の中に入れ、block定義の中には、clusterレベルのみ(複数指定可)を入れることがで きます。
構文は次のようになります。
block name {
// cluster definitions }
以下は、software部分のbus定義の例です。
block rom {
cluster first_code_clstr { ...
}
cluster code_clstr { ...
} }
この例では、block romで、cluster first_code_clstrとcluster code_clstrの2つのクラスタが定義され ています。
5.4.6 セクションの選択
前の節では、block定義によってアドレス範囲を定義する方法について説明しました。次に、これらのブロッ クに入れるセクションを選択します。DELFEEには、ロケートの順序を定義するレベルとして次の2つがあ ります。
1. cluster 2. amode
ロケート順を定義するとき、セクションやセクションのグループを指定するために、ある種のハンドルが 必要になります。DELFEEでは、次のようなセクションの特性が認識されます。
セクションの名前
特定のセクションを示す固有の名前です。
セクションの属性
アセンブラまたはコンパイラによってセクションの属性が指定されます。指定可能な属性には、表 5.4.6.1のようなものがあります。属性を選択することにより、セクションのグループを選択します。属 性は、by1wなどのような属性文字列でグループ化することができます。
アドレッシングモード
すべてのセクションには、(cpu部分で定義されたものと同じ)アドレッシングモードがあります。
表5.4.6.1 セクションの属性 attr
W R X Z Ynum
A B F I N P
意 味 書き込み可能 読み取り専用 実行専用 ゼロページ
アドレッシングモード 絶対
ブランク 未充てん 初期化 今 延期
説 明 RAMにロケートする必要があります。
ROMにロケートすることができます。
ROMにロケートすることができます。
ゼロページにロケートする必要があります。
アドレッシングモードnumでロケートする必要があります。
すでにアセンブラによってロケートされています。
セクションを"0"で初期化する必要があります(クリア)。
セクションが充てんされておらずクリアもされていません(スクラッチ)。
セクションをROMで初期化する必要があります。
セクションが、(NもPもない)通常のセクションの前にロケートされます。
セクションが、(NもPもない)通常のセクションの後にロケートされます。
DELFEEでは、セクション(のグループ)を指定するとき、次の構文を使用します。
1. セクション属性でグループを選択する場合。
section selection = attr;
2. 名前でセクションを選択する場合。
section name;
3. 特殊なセクションを選択する場合。
heap; / /locate heap here stack; / /locate stack here table; / /locate copy table here copy; / /locate all initial data here
copy name; / /locate initial data of the named section here 4. セクションを作成する場合。
reserved label=name length=number;
DELFEEでは、属性でセクションを選択する代わりに、属性によって、あるセクションを除外することもで きます。属性を除外するときは"-"(マイナス記号)をattrの前に置きます。
そのため、次の例は、
section selection=attr1-attr2
属性attr1を持ち属性attr2を持たないセクションのグループを選択します。