SkillAgentSearch skills...

Xdev68k

Cross development environment for the SHARP X68K.

Install / Use

/learn @yosshin4004/Xdev68k
About this skill

Quality Score

0/100

Supported Platforms

Universal

Tags

README

xdev68k

解説

xdev68k は、SHARP X680x0 シリーズ対応のクロスコンパイル環境です。 最新の gcc を用いて X68K 対応の実行ファイルが作成可能です。 ホスト環境は、msys+mingw、cygwin、linux、WSL 等々の Unix 互換環境が利用可能です(mac も恐らく利用可能ですが未検証)。

xdev68k は、 旧プロジェクトである x68k_gcc_has_converter( https://github.com/yosshin4004/x68k_gcc_has_converter )から発展したものです。 旧プロジェクトは終了し、本プロジェクトに統合されました。

環境構築手順

  1. Unix 互換環境のインストールと環境構築(作業時間 : 10 分程度)
    msys+mingw、cygwin、linux、WSL 等々の Unix 互換環境を用意します。 ここでは、推奨環境である msys+mingw を利用する場合のインストール手順のみを示します。

    msys のインストーラは https://www.msys2.org/ から入手可能です。 インストールが終わったら、msys のコンソール上で以下を実行し、gcc や perl 等、環境構築に必要なツールをインストールします。

    pacman -S base-devel
    pacman -S mingw-w64-i686-toolchain
    pacman -S mingw-w64-x86_64-toolchain
    pacman -S autoconf-wrapper
    pacman -S msys/autoconf
    pacman -S msys/automake-wrapper
    pacman -S unzip
    pacman -S cmake
    pacman -S libiconv
    pacman -S git
    pacman -S pax
    

    msys の perl は初期状態ではロケールが正しく設定されておらず、perl 起動の度に以下のように警告されます。

    perl: warning: Setting locale failed.
    perl: warning: Please check that your locale settings:
    

    これを解消するため、C:/msys64/home/ユーザー名/.bashrc に以下のような指定を追加しておきます。

    # perl の locale 警告対策
    export LC_ALL="C"
    export LC_CTYPE="C"
    export LANG="en_US.UTF-8"
    

    msys の bash コンソールは、スタートメニューの「MSYS2 MinGW 64bit」のショートカットから起動します。 ここから起動しないと、ネイティブのコンパイラ環境にパスが通った状態にならず、クロスコンパイラ構築に失敗するのでご注意下さい。

    screen_shot_gfx

  2. xdev68k を取得(作業時間 : 1 分程度)
    本リポジトリを clone します。

    git clone https://github.com/yosshin4004/xdev68k.git
    

    以降、ディレクトリ xdev68k に clone された前提で説明を進めます。

  3. クロスコンパイラ作成(作業時間 : 環境によっては数時間)
    十分なディスク容量(10GB 程度)があることを確認した上で、 ホスト環境の bash コンソール上で先ほど clone したディレクトリ xdev68k に移動し、以下のコマンドを実行します。

    bash ./build_m68k-toolchain.sh
    

    xdev68k/m68k-toolchain 以下に、Motorola 680x0 シリーズ対応のクロスコンパイラである m68k-elf-gcc が構築されます。 以下のメッセージがコンソールに出力されれば完了です。

    The building process is completed successfully.
    
  4. ユーティリティのインストール(作業時間 : 数分程度)
    ここの操作では、以下のファイルが自動でダウンロードまたはインストールされます。 対象ファイルの詳細については、以下の URL でご確認頂けます。

    • SHARP C Compiler PRO-68K ver2.1 システムディスク 1 & 2
      http://retropc.net/x68000/software/sharp/xc21/ (ファイル名 XC2101.LZH, XC2102_02.LZH)
    • HAS060.X
      http://retropc.net/x68000/software/develop/as/has060/ (ファイル名 HAS06091.LZH)
    • HLK v3.01
      http://retropc.net/x68000/software/develop/lk/hlk/ (ファイル名 HLK301B.LZH)
    • g2as g2lk (Charlie 版 GCC の一部) http://retropc.net/x68000/software/develop/c/gcc2/ (ファイル名 G3_20.LZH)
    • X68K コマンドラインエミュレータ run68
      https://github.com/GOROman/run68mac

    ホスト環境の bash コンソール上で、先ほどと同じディレクトリ(xdev68k)から以下のコマンドを実行します。

    bash ./install_xdev68k-utils.sh
    

    クロスコンパイル環境で必要になるユーティリティの実行ファイル、ヘッダおよびライブラリがインストールされます。 以下のメッセージがコンソールに出力されれば完了です。

    The installation process is completed successfully.
    Please set the current directory path to environment variable XDEV68K_DIR.
    
  5. 環境変数設定(作業時間 : 1 分程度)
    環境変数 XDEV68K_DIR に、ディレクトリ xdev68k のフルパスを設定します。 msys の場合、C:/msys64/home/ユーザー名/.bashrc に次のように記述しておくと良いでしょう。

    export XDEV68K_DIR=ディレクトリxdev68kのフルパス
    

    フルパスは、C: 等のドライブ名から始まる windows スタイルではなく、 /c 等から始まる unix スタイルで指定してください。

ファイル構成

正しく環境構築が完了した状態のディレクトリ構造は以下のようになります。

xdev68k/
│
├ archive/
│	│	利用させて頂いたソフトウェアのアーカイブファイル
│	├ readme.txt
│	│		原作者、入手元の情報、利用規約をまとめたテキスト
│	├ libgcc_src.tar.gz
│	│		libgcc のソースコード
│	├ libstdc++_src.tar.gz
│	│		libstdc++ のソースコード
│	├ *.zip *.lzh
│	│		原本のアーカイブファイル
│	└ download/
│			ダウンロードしたソフトウェアのアーカイブファイル
├ build_gcc/
│		クロスコンパイラのソースコードとビルドにより生成された中間ファイル群
│		このディレクトリ以下には 18 万近いファイルが存在する。削除しても問題ない。
├ example/
│		サンプルコード
├ include/
│	│	ヘッダファイル
│	├ xc/
│	│		SHARP C Compiler PRO-68K ver2.1 のヘッダファイル
│	└ xdev68k/
│			xdev68k 環境で追加されたヘッダファイル等
├ m68k-toolchain/
│		クロスコンパイラのビルド結果
│		このディレクトリ以下には 1700 程度のファイルが存在する。削除してはいけない。
├ run68/
│	│	X68K コマンドラインエミュレータ run68
│	├ run68.exe
│	│		run68 実行ファイル
│	└ run68.ini
│			run68 設定ファイル
├ lib/
│	│	ライブラリファイル
│	├ xc/
│	│		SHARP C Compiler PRO-68K ver2.1 のライブラリファイル
│	└ m68k_elf/
│		│
│		├ m68000/ m68020/ m68040/ m68060/ 
│		│	└ *.a
│		│			各種 CPU 構成ごとのライブラリファイル
│		└ *.a		
│				CPU の種類を問わないライブラリファイル
├ util/
│	│
│	├ atomic.lock
│	│		atomic.pl で利用するロックファイル
│	├ atomic.pl
│	│		指定のコマンドラインをシングルスレッド実行するスクリプト
│	├ db_pop_states.txt
│	│		割り込み処理のステート復活を行うデバッガコマンド
│	├ db_push_states.txt
│	│		割り込み処理のステート退避を行うデバッガコマンド
│	├ xeij_*.bat
│	│		XEiJ 制御用バッチファイル
│	├ xeij_remote_debug.sh
│	│		XEiJ 上で指定ファイルをデバッグ実行するスクリプト
│	└ x68k_gas2has.pl
│			GAS to HAS コンバータ
├ x68k_bin/
│	│	X68K のコマンドラインユーティリティ
│	├ AR.X
│	│		X68k Archiver v1.00
│	├ DB.X
│	│		X68k Debugger v2.00
│	├ g2as.x
│	│		X68k High-speed Assembler v3.08 modified for GCC
│	├ g2lk.x
│	│		X68k SILK Hi-Speed Linker v2.29 modified for GCC
│	├ HAS060.X
│	│		High-speed Assembler 68060 対応版 version 3.09+91
│	├ hlk301.x
│	│		HLK v3.01
│	└ MEMSIZE.X
│			フリーメモリサイズをコンソール出力する(run68 の動作テスト用)
├ build_m68k-toolchain.sh
│		クロスコンパイラのビルドスクリプト
├ build_x68k-libgcc.sh
│		libgcc のビルドスクリプト
├ build_x68k-libstdc++.sh
│		libstdc++ のビルドスクリプト
└ install_xdev68k-utils.sh
		ユーティリティのインストールスクリプト

Hello World サンプルの実行

環境構築が完了したら、 テストを兼ねて基本サンプルをビルド&実行してみましょう。 ホスト環境の bash コンソール上でディレクトリ xdev68k に移動し、以下を実行します。

cd example/hello
make

カレントディレクトリに MAIN.X というファイルが生成されます。これが X68K の実行ファイルです。 MAIN.X を、X68K 実機またはエミュレータ環境にコピーして実行します(makefile で自動化されていないので手動で行います)。 X68K のコンソールに以下のように出力されれば成功です。

hello world.

コンパイル~実行ファイル生成までの詳細

先ほどの Hello World サンプルのソースファイル main.c を例に、 コンパイルから実行ファイル生成までの流れを解説します。 ビルド作業は、ホスト環境の bash コンソール上で行います。

  1. コンパイル
    main.c をクロスコンパイラ m68k-elf-gcc でコンパイルします。

    # main.c をコンパイルする。
    # -I${XDEV68K_DIR}/include/xc : include パスの指定
    # -Os : サイズ優先最適化
    # -fcall-used-d2 -fcall-used-a2 : X68K と ABI を一致させるため d2 a2 を破壊可能レジスタに指定
    # -Wno-builtin-declaration-mismatch : 警告の抑制
    ${XDEV68K_DIR}/m68k-toolchain/bin/m68k-elf-gcc main.c -I${XDEV68K_DIR}/include/xc -S -Os -m68000 -fcall-used-d2 -fcall-used-a2 -Wno-builtin-declaration-mismatch -o main.m68k-gas.s
    

    カレントディレクトリにソースファイル main.m68k-gas.s が生成されます。

  2. アセンブラソースを変換
    main.m68k-gas.s は、GAS 形式と呼ばれる書式で記述されています。 x68k_gas2has.pl を用いて、X68K で利用可能な HAS 形式に変換します。

    # HAS.X がアセンブル可能な書式に変換する。
    # -cpu オプション : 対象とする CPU の種類
    # -inc オプション : ソース冒頭で include するファイル
    perl ${XDEV68K_DIR}/util/x68k_gas2has.pl -i main.m68k-gas.s -o main.s -cpu 68000 -inc doscall.mac,iocscall.mac
    

    カレントディレクトリに、HAS 形式のソースファイル main.s が生成されます。

  3. アセンブル
    main.s を X68K 対応アセンブラ HAS060.X でアセンブルします。 アセンブラの実行は、X68K コマンドラインエミュレータ run68 で行います。

    # main.s をアセンブルする。
    # -u : 未定義シンボルを外部参照にする 
    # -e : 外部参照オフセットをロングワードにする 
    # -w0 : 警告の抑制
    # -I${XDEV68K_DIR}/include/xc : include パスの指定
    HAS="${XDEV68K_DIR}/run68/run68 ${XDEV68K_DIR}/x68k_bin/HAS060.X"
    ${HAS} -e -u -w0 -I${XDEV68K_DIR}/include/xc -o main.o main.s
    

    カレントディレクトリにオブジェクトファイル main.o が生成されます。

  4. リンク
    main.o を X68K 対応リンカ hlk301.x でリンクします。 リンカの実行は、X68K コマンドラインエミュレータ run68 で行います。 本リポジトリに含まれているランタイムライブラリをリンクする必要があります。

    # main.o をリンクする。
    # HLK に長いパス文字を与えることは難しいので、
    # 回避策としてリンク対象ファイルを lk_tmp 以下にコピーし、
    # 短い相対パスを用いてリンクを実行させる。
    rm -rf lk_tmp
    mkdir -p lk_tmp
    cp main.o lk_tmp/
    cp ${XDEV68K_DIR}/lib/xc/CLIB.L lk_tmp/
    cp ${XDEV68K_DIR}/lib/xc/FLOATFNC.L lk_tmp/
    cp ${XDEV68K_DIR}/lib/m68k_elf/m68000/libgcc.a lk_tmp/
    ls lk_tmp/ > lk_list.txt
    HLK="${XDEV68K_DIR}/run68/run68 ${XDEV68K_DIR}/x68k_bin/hlk301.x"
    ${HLK} -Llk_tmp/ -o MAIN.X -i lk_list.txt
    

    カレントディレクトリに実行ファイル MAIN.X が生成されます。

GAS 形式 → HAS 形式変換例

ディレクトリ xdev68k/util 以下に置かれている x68k_gas2has.pl は、 アセンブラソースの GAS 形式 → HAS 形式変換を行うコンバータです。 x68k_gas2has.pl が生成するソースコードは以下に示すように、 左側が HAS 形式、右側が元になった GAS 形式となります。

* NO_APP
RUNS_HUMAN_VERSION      equ     3
        .cpu 68000
* X68 GCC Develop
                                                        *#NO_APP
        .file   "adler32.c"                             *       .file   "adler32.c"
        .text                                           *       .text
        .globl ___umodsi3                               *       .globl  __umodsi3
        .globl ___modsi3                                *       .globl  __modsi3
        .globl ___mulsi3                                *       .globl  __mulsi3
        .align  2                                       *       .align  2
                                                        *       .type   adler32_combine_, @function
_adler32_combine_:                                      *adler32_combine_:
        movem.l d3/d4/d5/d6/d7/a3,-(sp)                 *       movem.l #7952,-(%sp)
        move.l 28(sp),d3                                *       move.l 28(%sp),%d3
        move.l 32(sp),d6                                *       move.l 32(%sp),%d6
        move.l 36(sp),d0                                *       move.l 36(%sp),%d0
        jbmi _?L6                                       *       jmi .L6
        lea ___umodsi3,a3                               *       lea __umodsi3,%a3
        move.l #65521,-(sp)                             *       move.l #65521,-(%sp)
        move.l d0,-(sp)                                 *       move.l %d0,-(%sp)
        jbsr (a3)                                       *       jsr (%a3)
        addq.l #8,sp                                    *       addq.l #8,%sp
        move.l d0,d5                                    *       move.l %d0,%d5
        move.l d3,d7                                    *       move.l %d3,%d7
        and.l #65535,d7                                 *       and.l #65535,%d7
        move.l d7,-(sp)                                 *       move.l %d7,-(%sp)
        move.l d0,-(sp)                                 *       move.l %d0,-(%sp)

GAS 形式では、MIT syntax と呼ばれる記法(右)が利用されることがあります。 HAS.X 形式(左)では Motorola syntax に変換されます。

                                    * .type __mulsi3,function
 .globl ___mulsi3                   * .globl __mulsi3
___mulsi3:                          *__mulsi3:
 move.w 4(sp),d0                    * movew %sp@(4), %d0
 mulu.w 10(sp),d0                   * muluw %sp@(10), %d0
 move.w 6(sp),d1                    * movew %sp@(6), %d1

Related Skills

View on GitHub
GitHub Stars77
CategoryDevelopment
Updated1mo ago
Forks8

Languages

Perl

Security Score

80/100

Audited on Jan 28, 2026

No findings