以下のように 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.c2. X形式に変換
elf2x68k mouse.elf mouse.x3. XM6i/PX68kで実行
* `mouse.x` をHuman68kのディスクイメージにコピーして実行します。




