非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

X68000(13)

以下のように ChatGPT で入力すると、クロスコンパイラでコンパイルできるコードが返ってきました。しかしエミュレーターで実行するとエラーになります。前回はコンパイルがエラーになっていたので、少し改善されました。

「Human68k BIOS の呼び出し」が何なのかよくわかりません。『プログラマーのためのX68000環境ハンドブック』の「IOCSコール」に対応させると良いのではないかと思いますが、まだできていません。

Visual Studio で編集すると、X68000 向けのコードを自動的に補完してくれるということがわかりました。Copilot がやっているのでしょうか。コードが正しいかどうか不明です。

X68000エミュレーター上でマウスの処理をする GCC68k の C 言語のプログラムのサンプルを作ってください

と入力すると以下のような回答が返されました。

いいですね!
それでは、X68000 エミュレーター上(例えば XM6i や PX68k)で動く、GCC68k を使ったマウス処理のC言語サンプル を作ってみましょう。

💡 方向性

  • Human68k上で動作

Human68k BIOS のマウスサービス(INT 3Eh)を呼び出す形にします。

  • GCC68k(m68k-elf-gcc)向け

組み込みアセンブラ(`__asm__`)を使って BIOS コールを行います。

  • elf2x68kで変換して実行

ELF → X形式に変換して、XM6i/PX68kでテストできます。

📝 サンプルコード(`mouse.c`)

#include <stdio.h>

// Human68k BIOS マウスサービス (INT 3Eh)
// AX=0: Get Mouse Status
typedef struct {
    short x;
    short y;
    short buttons;
} MouseState;

// BIOSコールをアセンブラで呼び出す
void get_mouse_state(MouseState *state)
{
    unsigned short x, y, buttons;

    __asm__ volatile (
        "moveq  #0, %%d0\n\t"      // AH=0: Get Mouse Status
        "trap   #0x3E\n\t"         // INT 3Eh 呼び出し
        "move.w %%d1, %0\n\t"      // X座標
        "move.w %%d2, %1\n\t"      // Y座標
        "move.w %%d3, %2\n\t"      // ボタン状態
        : "=r"(x), "=r"(y), "=r"(buttons)
        :                          // 入力なし
        : "d0", "d1", "d2", "d3"   // 使用するレジスタ
    );

    state->x = x;
    state->y = y;
    state->buttons = buttons;
}

int main(void)
{
    MouseState state;

    printf("X68000 Mouse Sample (GCC68k)\n");
    printf("Press any key to exit.\n");

    while (1)
    {
        get_mouse_state(&state);

        printf("\rX: %d  Y: %d  Buttons: %d  ", state.x, state.y, state.buttons);
        fflush(stdout);

        // キー入力をチェックして終了(Human68kのBIOSで1文字入力チェック)
        int key_ready = 0;
        __asm__ volatile (
            "moveq  #0, %%d0\n\t"   // AH=0: Check Console Key
            "trap   #0x09\n\t"      // Console Key BIOS
            "move.w %%d0, %0\n\t"
            : "=r"(key_ready)
            :
            : "d0"
        );
        if (key_ready)
            break;
    }

    // キー読み捨て
    getchar();

    printf("\nBye!\n");
    return 0;
}

⚡ 使い方(ビルド方法)

1. コンパイル(ELF形式)

   m68k-elf-gcc -O2 -o mouse.elf mouse.c

2. X形式に変換

   elf2x68k mouse.elf mouse.x

3. XM6i/PX68kで実行

* `mouse.x` をHuman68kのディスクイメージにコピーして実行します。

🔍 補足

✅ Human68k BIOS の呼び出しは `trap #0x3E`(マウスサービス)と `trap #9`(Console Key)です。
✅ GCC68k では `__asm__ volatile` でm68kアセンブラを埋め込めます。
✅ Human68k のBiosインターフェースを使っているので、OS上で普通に動作します。

もし `libx68k` や特定のライブラリを使いたい、または別のAPI(GEM等)を使いたい場合はそちらもお手伝いできますよ!

どうでしょう?もっと詳しく解説が必要なら教えてくださいね! 🖱️