X68000の開発環境について

[X68000 Z](https://www.zuiki.co.jp/products/x68000z/) がにわかに注目を集めています。
これをきっかけに何か作ってみたくなった方のために、X68000(以下、X68k)の開発環境についてまとめてみました。

# ネイティブ開発環境

X68kの実機、またはエミュレータのHuman68k上で動作する開発環境です。
X68k現役当時はこの環境しかありませんでしたが、今となっては、特に実機でCコンパイラを動かすのは速度的な意味で結構厳しそうです。エミュレータ上でCPUクロックを上げて使うのが良いと思います。

## シャープ純正Cコンパイラ (XC)

* 概要
シャープから発売されていた純正の開発環境です。(商品名 C Compiler PRO-68K)
Cコンパイラ、アセンブラ、リンカ、デバッガにライブラリ群など、ソフトウェア開発に必要なツール類一通りと、分厚い大量のマニュアルのセットでした。

* 開発者
  * シャープ株式会社 

* 入手先
  * 現在はソフトウェア本体が無償で公開されています。以下のリンク先から入手可能です。
  * [X68000 LIBRARY > ソフトウェアライブラリ > 無償公開されたシャープのソフトウェア > C Compiler PRO-68K ver2.1（XC)](http://retropc.net/x68000/software/sharp/xc21/)

* 特徴
  * ツールの機能がコンパイラ、アセンブラ、リンカに分かれ、コンパイラドライバがそれを制御するという構成は現在のCコンパイラと同じです。
  * アセンブリ言語にはモトローラニーモニックが使われています(GNUアセンブラ(GAS)のニーモニックとは異なるもの)。オブジェクトファイル、ライブラリ、実行ファイルのフォーマットはX68k独自のものです。



## フリーソフト開発環境 (gcc他)

* 概要
純正開発環境の機能・性能面での不足解消や速度向上、不具合修正などのため、ユーザーが様々な開発ツールを開発し、フリーソフトで提供してきました。
特に最適化性能でかなり不満のあったCコンパイラについては、gccが移植されたことでほとんどのユーザーがこちらを使っていたものと思われます。

* 開発者
  * GCC - 吉野智興氏 他
  * HAS - Y.Nakamura 他
  * HLK - SILK氏 他
  * LIBC - Project LIBC Group 他

* 入手先
  * [X68000 LIBRARY > ソフトウェアライブラリ](http://retropc.net/x68000/software/) から入手可能です。
    * [Cコンパイラ](http://retropc.net/x68000/software/develop/c/)
    * [アセンブラ](http:///retropc.net/x68000/software/develop/as/)
    * [リンカ](http://retropc.net/x68000/software/develop/lk/)
    * [ライブラリ](http://retropc.net/x68000/software/develop/lib/)

* 特徴
  * gccは当時のgcc 1.42～gcc 2.95のm68k対応を元に、X68k環境に合わせた移植と大幅な拡張を行ったものです。
  * アセンブラ(HAS.X)、リンカ(HLK.X)は純正ツールと機能互換で作られたため、置き換えて使用することが可能でした。
  * ライブラリは純正Cコンパイラに付属のものをそのまま使用することが想定されていました。後にANSI-C等の規格に準拠したLIBCが独自に開発され、こちらを使うこともできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642667/edb0533f-dfd3-58cb-6c36-bc1a7419fbf7.png)

# クロス開発環境

現在のPCの上(Unix/Linux系環境)で動作する開発環境です。
ビルド結果を動作させるために生成物を実機やエミュレータに持っていく手間はありますが、ビルド速度では圧倒的に速いですし、PCで使い慣れたエディタを直接使える、gccも最新のものが使えるなどそれ以上のメリットが大きいです。

## xdev68k

* 概要
現在の最新のgccを用いて構成されているクロス開発環境です。
コンパイルから先の工程は、GASフォーマットのアセンブラ出力をモトローラフォーマットに変換後、ネイティブ環境のアセンブラやリンカをCUIエミュレータ上で動かすことで、ネイティブ開発環境と同等の出力を得るようになっています。
これから開発環境を構築する場合は、まずはここから始めてみるのが良いと思います。

* 開発者
  * ファミベのよっしん氏 (Twitter @yosshin4004)

* 入手先
  *  https://github.com/yosshin4004/xdev68k

* 特徴
  * 使用しているgccは、OSSとして配布されているものをm68k向けのクロス開発用の設定(m68k-elf-gcc)でビルドしているだけなので、今後のgccのバージョンアップにも追従が容易と思われます。
  * gccの出力するアセンブラソースは[MIT Syntax](https://sourceware.org/binutils/docs-2.39/as/M68K_002dSyntax.html) (GASフォーマット)と呼ばれるもので、純正開発環境などが使用するモトローラフォーマットとは異なっています。そのため、gccのコンパイル結果をソースコードで出力して変換スクリプト(x68k_gas2has.pl)によってモトローラフォーマットに変換してから後続の処理を行います。
  * アセンブラ、リンカは、Human68k CUI環境をエミュレーションするエミュレータ(run68)を利用することで、X68k版バイナリをクロス環境上で実行します。
  * リンカがネイティブ環境と同じなので、ライブラリについてもネイティブ環境と同じものをそのまま利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642667/fc62101d-4c25-b281-2573-ae84c4c2efb9.png)

## gcc-human68k

* 概要
GNUの一連の開発環境(gcc, GNU binutils)に独自のX68k対応機能追加を行ったものです。
既存のネイティブ開発環境を全く使用せず、GNUツールチェインへの変更のみでX68k対応するという大変意欲的なものですが、残念ながら2014年頃で開発が止まっているようです。

* 開発者
  Lyderic Maillet氏

* 入手先
  * 以下の場所で説明やサポートが行われていたようです。
    * https://nfggames.com/forum2/index.php?topic=4850.0
  * ソースコードはgithubに置かれています。
    * https://github.com/Lydux

* 特徴
  * gcc-4.6.2、GNU binutils-2.22 への独自の機能追加によってX68k対応を行っています。
  * オブジェクトファイルや実行ファイルはUnix系で用いられるELF形式で生成されます。binutilsのBFDライブラリにX68kのX形式サポートが追加されていて、ビルド後にobjcopyコマンドでフォーマット変換することで実機で実行可能なバイナリが得られます。
  * オブジェクトファイルやライブラリのフォーマットがネイティブ環境と異なるため、既存の実機向けライブラリが使用できません。代わりに、組み込みシステムでよく使われる標準Cライブラリの[Newlib](https://sourceware.org/newlib/)に、X68k対応を行ったものが用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642667/76ac79e0-360a-206a-6514-06607c44325b.png)

## elf2x68k

* 概要
筆者の作成した、「m68k ELFフォーマット実行ファイルをX68kのX形式に変換するスクリプト」(elf2x68k.py) を元にしたクロス開発環境です。
gcc, GNU binutils, Newlibを元に開発環境を構築するという点では前述のgcc-human68kに似ていますが、既存のツールチェイン自体には一切手を加えず、スクリプトやライブラリ等のファイル追加のみでX68kの実行ファイルを生成できるようにしている点が最大の違いです。

* 開発者
  * Y.Nakamura (Twitter @yunkya2 Github @yunkya2)

* 入手先
  * https://github.com/yunkya2/elf2x68k
  * https://github.com/yunkya2/gdbserver-x68k (リモートデバッガ)

* 特徴
  * m68kクロスツールチェインでELF実行ファイルまでの生成を行った後、elf2x68kスクリプトでX形式ファイルに変換します。一連の変換作業はスクリプトファイル(m68k-xelf-ld.x)内で行われ、さらにgccのspecsファイル追加によって通常のld(m68k-xelf-ld)の代わりにこのスクリプトを使用するようになっているため、ユーザーからはm68k-xelf-gccで普通にビルドするだけでX形式実行ファイルが得られます。
  * C標準ライブラリには、gcc-human68kと同様にNewlibを使用します。Newlib本体はオリジナルのコードを修正せずにそのまま利用し、その下位レイヤーとなるシステムコール呼び出し処理とHuman68k DOSコールやIOCSコール呼び出しのみを独自ライブラリ (libx68k.a) として提供しています。このライブラリはspecsファイル指定でリンクされるため、通常は明示的にリンクする必要はありません。
    * libx68k.a の開発には、gcc-human68kでNewlibに対して行ったX68k対応の成果を使わせていただいています。
  * X68k独自形式のオブジェクトファイルやライブラリファイルをELF形式に変換するコマンド x68k2elf を用意しました。これを用いることで、XCのライブラリを使った開発も可能になりました。
  * gdbserverによるリモートデバッグ環境を用意しています。ELF実行ファイルに含まれるデバッグ情報を用いたソースコードデバッグが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642667/a6c4eab8-03a9-5a60-0c53-2d7a56e6cd83.png)