---------------------------------------
       mips クロス開発環境 第一弾
---------------------------------------

■説明

　GNU binutils の mips (Rシリーズ汎用・リトルエンディアン) 版を移植
しました。ベースは2.8.1です。オリジナルとの主な違いは以下の通りです。

アセンブラ:
・レジスタ名を直接記述できる
・16進定数の表記に '$' が使用できる (従来通りの表記も選択可能)
・デフォルトの出力ファイル名を入力ファイル名から自動生成する
・その他いろいろ(笑)

リンカ:
・デフォルトの出力ファイル名を入力ファイル名から自動生成する
・PS-X EXE (仮称)互換形式のファイルのサポート(任意のアドレスを指定可能)

各種ツール:
・ELF, ECOFF 形式に対応

　もともとのツール自体が高い汎用性を持っているため、設定次第で様々な
環境で利用可能であると思われます。もちろん、PS-X (仮称)のアプリケー
ション開発等にも使用することができます。

　なお、他の PS-X (仮称)の開発環境で、同様に GNU binutils を利用して
いると噂されているものとして、NY (仮名)がありますが、残念ながら本プ
ログラムとの完全な互換性はないかもしれません。

■導入

　GNU binutils に含まれているツールのうち、以下のものが使用可能です。

---
	mipsar		アーカイバ		ar
	mipsas		アセンブラ		as
	mipsld		リンカ			ld
	mipsdump	オブジェクト表示	objdump
---

　GNU binutils には他にも多くのコマンドがありますが、通常の用途であ
れば上記のコマンドだけで十分対処できます。また、上記のコマンドを用い
て他のコマンドの代用をすることも可能です。(雰囲気だけ)

---
	nm:		mipsdump --syms (ほぼ同じ情報量)
	ranlib:		mipsar -s	(完全互換)
	size:		mipsdump -h	(かなり苦しい)
	strip:		mipsld -s	(ファイル作成時のみ)
---

　各プログラムを PATH の通ったディレクトリに置くだけで、特に設定は必
要ありません。

　設定の例を簡単に書いておきます。

--- Installation
Human68k:
	mkdir c:/usr/psx/bin		インストール場所の作成
	move *.x c:/usr/psx/bin		ファイルの移動
	path %path%;c:/usr/psx/bin	パスの設定

MS-DOS:
	mkdir c:\usr\psx\bin		インストール場所の作成
	move *.exe c:\usr\psx\bin	ファイルの移動
	path %path%;c:\usr\psx\bin	パスの設定
---

　各プログラムとも、オプションに --help と記述すると簡単な使用方法が
表示され、--version と記述するとバージョン番号が表示されます。

　使用方法の詳細については、マニュアルを参照してください。
　なお、アセンブラに関する日本語の情報として、『mips RISC アーキテク
チャ -R2000/R3000-』(Gerry Kane著, 前川 守監訳, ISBN4-320-02598-9)等
の書籍が参考になると思います。

　マニュアル類は、本家のホームページ上に HTML 形式のものがあるので、
そちらを参照してください。

	http://www.cygnus.com/pubs/gnupro/

　文字コードは ISO-8859-1(Latin1) なので、読み込んでヘッダを書き換え
ておくと便利です。

---
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
---

■アセンブラについて

　ソース中でのレジスタ名の指定には GNU Assembler のレジスタ名ではな
く、一般的なレジスタ名を使用します。GNU Assembler 本来のレジスタ名で
指定を行ないたい場合は、後述する -N オプションを使用してください。

　レジスタ名とレジスタ番号との対応は以下の通りです。
　なお、レジスタ名の大文字小文字は区別されません。

--- mips Register Name
r0 〜 r31 … 汎用レジスタ0から汎用レジスタ31に対応

zero, at, v0, v1, a0, a1, a2, a3 …  r0 〜  r7 に対応
  t0, t1, t2, t3, t4, t5, t6, t7 …  r8 〜 r15 に対応
  s0, s1, s2, s3, s4, s5, s6, s7 … r16 〜 r23 に対応
  t8, t9, k0, k1, gp, sp, fp, ra … r24 〜 r31 に対応
---

　16進数を表す文字として、従来の「0x…」に加えて、「$…」の表記も使
用可能となっています。

　出力するファイル名は、入力ファイル名の拡張子を .o に変更したものが
使用されます。なお、入力ファイル名が不明(標準入力)の場合には、-o オ
プションで明示的に出力ファイル名を指定しない限りファイルは作成されま
せん。

　実行時のオプションは以下のものが追加されています。

--- mipsas Options
-N	レジスタ名、16進数表記の拡張を禁止します。(--native)
	このオプションを指定すると、「$…」形式のレジスタ名指定のみ
	が可能となり、16 進数の表記は「0x…」のみとなります。

-S	';' をコメント扱いとします。
	マルチステートメントのための区切り文字である ';' がコメント
	と同じ扱いになります。

-B	mdebug セクションの削除を行ないます。
	出力されるファイルのサイズを抑えることができますが、デバッグ
	に必要な情報(の一部)が削除されてしまいます。指定する際には注
	意が必要です。

-F	reginfo セクションの削除を行ないます。
	出力されるファイルのサイズはほとんど変化しません。さらに、gp 
	相対アドレッシングを行なっている場合はリンク時にエラーが発生
	することがあります。指定する際には注意が必要です。
---

■リンカについて

　出力形式として psx 及び binary が拡張されています。-m オプションを
使用することで出力形式を設定することができます。この際、出力形式に応
じて出力ファイルの拡張子が設定されます。(.elf .eco .psx .bin など)

　psx 形式は PS-X EXE (仮称)互換形式となっていますが、一部の文字列が
入っている部分(謎)には何も設定されません(全て0が入ります)。

　binary 形式は --oformat binary の代用形式です。複数セクションに分
かれたオブジェクトも正常に変換することができます。

　psx 及び binary 形式では各セクションは以下の順序で配置されます。

1: .text .rodata/.rdata	… TEXT	(アドレス:_ftext 〜 _etext サイズ:_ltext)
2: .data .sdata		… DATA	(アドレス:_fdata 〜 _edata サイズ:_ldata)
3: .sbss .bss 		… BSS	(アドレス:_fbss  〜 _ebss  サイズ:_lbss)

　各セクションの先頭アドレス及びサイズは、上記のラベル名で参照するこ
とが可能です。また、gp レジスタの初期値としてラベル _gp に .sdata セ
クションの先頭アドレス + $8000 が設定されています。あらかじめラベル _
gp の値を設定しておくことで、任意のアドレスに設定することも可能です。

　gp レジスタを使用する(.sdata/.sbss セクションを宣言してある)プログ
ラムでは、開始直後に la gp,_gp として gp レジスタの設定を行ない、必
要に応じて BSS 領域の初期化等を行なう必要があります。

　psx 及び binary 形式ともに、プログラムの先頭アドレスを変更したい場
合は -Ttext オプションを使用してください。デフォルトの先頭アドレスは 
elf32, ecoff, psx, binary 全ての形式で $80100000 となっています。

　psx 形式の場合は、実行開始アドレス及びスタック開始アドレスを設定す
ることができます。(ラベルを .global 宣言しておく必要があります。)

・ラベル _start が定義されている場合は、そこが実行開始アドレスとなり、
　定義されていない場合は .text セクションの先頭アドレスが実行開始ア
　ドレスとなります。

・ラベル _stack が定義されている場合は、そこがスタック開始アドレスと
　なり、未定義の場合は $801FFFF0 が設定されます。

■問題

「とにかく最終的なコードさえ出力できればよい」というかなり適当な方針
のため、一部機能が正常に動作しないなどの不具合が潜んでいるかもしれま
せん。なお、Human68k/Win32 版ともに、まだ修正を加えている段階であり、
設定方法等が今後大幅に変わる可能性もあるので注意が必要です。

　現時点で判明している問題点を以下に書いておきます。

・as に間違ったファイルを入力すると暴走する場合がある
・ld の一部のスクリプトが正常に動作しない場合がある
・その他いろいろ(泣)

■参考例

　アセンブラのサンプルとして mult.s を同封しておきます。アセンブル方
法は以下の通りです。詳細はソースリストを参照してください。

1. mult.s をアセンブルして mult.o を出力
	mipsas mult.s

2. mult.o をリンクして mult.psx を出力
	mipsld -Ttext 801F8000 -m psx mult.o

　長いオプション名は判別が可能な程度まで短縮できます。(この場合 -Tt, -mp)

■履歴

v2.8.1 初版:
	・ようやくコンパイルが通って動いた版

	◆アセンブラ
	・通常のレジスタ名の扱いを拡張
	(Oh!MAGICOM 版のパッチを参考にしました。ありがとうございます)

v2.8.1+α1:
	◆アセンブラ
	・アセンブル途中で異常終了する仕様を修正
	・C++ 風のコメントに対応
	・レジスタ名 r の追加
	・レジスタ名判定の高速化(気分の問題)(笑)
	・16進定数に '$' を使用できるようにし、-N オプションを追加
	・-S オプションを追加
	・出力ファイル名(*.o)を自動生成

	◆リンカ
	・出力ファイル名(*.elf *.bin)を自動生成

v2.8.1+α2:
	◆アセンブラ
	・シフトJISコードに対応(文字列中のみ)
	・.sbss セクションを明示的に指定できるように拡張
	・擬似命令 .byte .dc.b .ascii において、文字列と定数を同一
	　に扱えるように拡張
	・擬似命令 .insert (ファイルをそのまま取り込む機能)を追加
	・擬似命令の先頭文字 . の省略に対応

	◆リンカ
	・ファイル探索パスにプログラムと同じディレクトリを追加
	・binary 形式の複数セクション対策のため bin 形式(*.bin)を追加
	・PS-X EXE (仮称)互換形式(*.psx)を追加

	◆その他
	・BFD64 (内部処理64ビット)に対応
	・各プログラムのコンパイル不備を修正

v2.8.1+α3:
	◆アセンブラ
	・GCC 対策のため、-N オプション指定時は表記の拡張を行なわな
	　いように変更

	◆リンカ
	・出力フォーマットはエミュレーション名で指定するように変更
	　(根本的に間違っていたらしい… ^^;)
	・エミュレーション名称を短縮指定できるように変更
	・各種形式のオブジェクトの混在に対応
	・ELF/ECOFF 形式の開始アドレスを$80100000に変更
	・PSX/BINARY 形式のシンボル名を ELF/ECOFF に合わせて変更
	・ECOFF 形式の -s オプションが正常に動作しない仕様を修正

	◆その他
	・ECOFF 形式(*.eco)に対応
	・出力ファイルにゴミが混入する仕様を修正

v2.8.1+α4:
	・アセンブラに -B -F オプションを追加
	・通常ファイルの属性の扱いを "rw-r--r--" に変更

v2.8.1+α5:
	・アセンブラにレジスタ名 s8 を追加(fp と等価)
	・ラベル _gp を任意の値に設定できるように修正

--
co
