-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path_x.txt
More file actions
179 lines (137 loc) · 8.61 KB
/
Copy path_x.txt
File metadata and controls
179 lines (137 loc) · 8.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# X 形式実行ファイル
==============================================================================
## ヘッダ構造 64バイト($40バイト)
offset size
$00 2.b 識別子 0x4855 ('HU')
$02 1.b 予約(0)
$03 1.b ロードモード(0:通常 1:最小ブロック 2:高位アドレス)
$04 1.l ベースアドレス
$08 1.l 実行開始アドレス
$0c 1.l テキストセクションサイズ
$10 1.l データセクションサイズ
$14 1.l ブロックストレージセクションサイズ(.comm .stack を含む)
$18 1.l 再配置テーブルサイズ
$1c 1.l シンボルテーブルサイズ
$20 1.l SCD 行番号テーブルサイズ
$24 1.l SCD シンボルテーブルサイズ
$28 1.l SCD 文字列テーブルサイズ
$2c 4.l 予約(0)
$3c 1.l バインドされたモジュールリストのファイル先頭からの位置
実行ファイルは、ベースアドレスにロードしたものとして再配置処理が行われた状態
で格納されている。よって、実際のロードアドレスがベースアドレスと等しければ再配
置は行わなくてよい。また両者が異なる場合は、その差を足すという処理を行う。実行
開始アドレスもベースアドレスが加算された値が格納されているので、こちらも差を足
す。
市販ゲーム等で拡張子が .X でファイル先頭が 0x4855 になっていても、X 形式実行
ファイルではなく圧縮や暗号化が掛けられたファイルというものもあるので注意。
==============================================================================
## 再配置処理
再配置は以下の手続きを再配置テーブルのサイズ分だけ繰り返す。
1. プログラム先頭アドレスを A、ベースアドレスを B とする。
2. A から B を引き、これを C とする。
3. 再配置テーブルから1ワード収得し、D とする。
4. D が1の場合、再配置テーブルから1ロングワード収得し、新しいDとする。
5. D が偶数か奇数か(最下位ビットの値が0か1か)によって処理が異なる。
5-1. D が偶数であれば通常のロングワード処理。A に D を加算し、A のアドレスか
らの1ロングワードに C を足す。
5-2. D が基数の場合はワードサイズ処理。A に D-1 を加算し、A のアドレスからの
1ワードに C を足す。ただしこちらは通常使われることはない。
==============================================================================
## セクションの並び順
1. ヘッダ 64($40)バイト
2. テキストセクション
3. データセクション
3-1. SX-Window 用セクション情報 64($40)バイト
SX モードで作成された実行ファイルには、データセクションの先頭に仮想オブ
ジェクト *SYSTEM* がリンクされ、セクション情報が出力される。
3-2. ".data"
3-3. ".rdata" の実体
3-4. ".rldata" の実体
3-5. 相対オフセットテーブル(n*4 バイト)
SX モード作成された実行ファイルにおいて、".rdata" 及び ".rldata" 内で相
対セクション内へのポインタを使用した場合に出力される。
4. ブロックストレージセクション
実体は出力されない。
4-1. ".bss"
4-2. ".common"
4-3. ".stack"
5. 再配置テーブル
6. シンボルテーブル
7. SCD テーブル
8. バインドされている場合、1~7 の繰り返し。
9. バインドリスト
相対セクションは一種のオフセット定義であり、".rdata" と ".rldata" の実体を除
きその領域は実行ファイルに出力されないが、以下の順で定義される。
1. ".rdata"
2. ".rbss"
3. ".rcommon"
4. ".rstack"
5. ".rldata"
6. ".rlbss"
7. ".rlcommon"
8. ".rlstack"
==============================================================================
## シンボルテーブルの構造
offset size
$00 1.w セクション番号
$02 1.l アドレス
$06 ?.b シンボル名($00 で終端)
??? ?.b .even (奇数アドレスの場合のみ $00 が出力される)
テーブル終端を表すマークはないため、シンボルテーブルサイズで判断する。
・セクション番号
$0003 .comm
$0200 絶対値 (.rdata、.rbss、.rstack、.rldata、.rlbss、.rlstack を含む)
$0201 .text
$0202 .data
$0203 .bss
$0204 .stack
・特殊なシンボル名
HAS.X v3.00 以降でアセンブラ疑似命令 .align、.quad を含むソースコードをアセ
ンブルすると、アドレス境界情報を特殊なシンボルとしてオブジェクトファイルに出力
する(シンボル名 '*'+ファイル名+'*'、.stack セクション)。
これを LK.X でリンクするとシンボルテーブルに出力されるが、値は意味を持たない。
HLK.X v3.00 以降でリンクした場合はアドレス境界情報として扱われ、シンボルテーブ
ルには出力されない。
==============================================================================
## SCD 用情報
SCD 行番号テーブルサイズ、SCD シンボルテーブルサイズ、SCD 文字列テーブルサイ
ズについては中村祐一氏による解析資料 SCDKAISEKI.DOC を参照してください。
https://github.com/kg68k/hlkx/blob/main/scdkaiseki.txt
==============================================================================
## バインドリストの構造
offset size
$00 8.b ファイル名(8バイト目まで。残りはスペースで埋める)
(先頭バイトが $e5 の場合は $05 に変更して埋め込む)
$08 3.b 拡張子(残りはスペースで埋める)
$0b 1.b 属性(%XLAD_VSHR。ただし ASHR 以外を指定してもエラーになる)
$0c 10.b 8バイト以上のファイル名の残り(残りは $00 で埋める)
$16 1.w 最終変更時刻 %mmmS_SSSS_HHHH_HMMM(H:時 Mm:分 S:秒)
$18 1.w 最終変更年月日 %mmmD_DDDD_YYYY_YYYM(Y:年 Mm:月 D:日)
$1a 1.b 特殊属性の変更禁止フラグ ┐BIND.X で使用
$1b 1.b 特殊属性(%00A0_0SHR) ┘
$1c 1.l バインドファイル先頭からのオフセット
Human68k version 2 以降では複数の X 形式実行ファイルをまとめたファイルに対応
しており、これをオーバーレイ X ファイルと呼ぶ。DOS _EXEC で使用するモジュール
番号は先頭のファイルから順に 0, 1, 2, …となる。
バインドリストは、バインドされたファイル一つにつき32バイト($20バイト)のデー
タがファイル数だけ並ぶ。読み込む際はファイルの残りが0バイトでリストが終わり、
32バイト以上の時はまだ続きがあり、それ以外(1~31バイト)ならば異常な構造となる。
構造はディレクトリエントリとほぼ同じ。最終変更年月日と最終変更時刻の上下バイ
トがディレクトリエントリと同じ用に逆転しているので注意すること。
==============================================================================
## デバイスドライバ
デバイスドライバは X 形式実行ファイルとして構成されるが、テキストセクション
の先頭にデバイスヘッダが置かれる。拡張子は .X ではなく .SYS にするのが慣例とな
っている。詳しくは fs_devdrv.txt を参照のこと。
コマンドラインからも実行できるファイルとして構成する場合は、デバイスヘッダが
あるためファイル先頭から実行することができないので、アセンブラ疑似命令 .end で
実行開始アドレスを指定する。拡張子は .X とする。
==============================================================================
## HUMAN.SYS
HUMAN.SYS はベースアドレスがロードアドレスと同じ $6800 となっているため、フ
ロッピーディスクや HDD の IPL はファイルをロード後に再配置処理を行わなくてよい。
ブロックストレージセクションのクリアは必要(ただし Human68k version 3.02 ではブ
ロックストレージセクションサイズは0となっている)。
HUMAN.SYS にデバイスドライバをバインドすると、起動時(SCSI デバイスの登録と
EXCONFIG の実行のあいだ)に自動的に組み込みが行われる。
==============================================================================