修正した「IOCSコール」のマウスのサンプルは以下のようになります。
#include <stdio.h> #include <stdint.h> // IOCSコールをアセンブラで呼び出す void msinit() { __asm__ volatile ( "moveq #0x70, %%d0\n\t" // _MS_INIT "trap #15\n\t" : : // 入力なし : "d0" // 使用するレジスタ ); } void mscuron() { __asm__ volatile ( "moveq #0x71, %%d0\n\t" // _MS_CURON "trap #15\n\t" : : // 入力なし : "d0" // 使用するレジスタ ); } void msstat(int* px, int* py, int* pbl, int* pbr) { uint32_t stat; __asm__ volatile ( "moveq #0x74, %%d0\n\t" // _MS_GETDT "trap #15\n\t" "move.l %%d0, %0\n\t" : "=r"(stat) : // 入力なし : "d0" // 使用するレジスタ ); *px = (stat >> 24) & 0xff; *py = (stat >> 16) & 0xff; *pbl = (stat >> 8) & 0xff; *pbr = (stat >> 0) & 0xff; } void mspos(int* px, int* py) { uint32_t pos; __asm__ volatile ( "moveq #0x75, %%d0\n\t" // _MS_CURGT "trap #15\n\t" "move.l %%d0, %0\n\t" : "=r"(pos) : // 入力なし : "d0" // 使用するレジスタ ); *px = (pos >> 16) & 0xffff; *py = (pos >> 0) & 0xffff; } void keysns(int* pkey) { uint32_t key; __asm__ volatile ( "moveq #1, %%d0\n\t" // _B_KEYSNS "trap #15\n\t" "move.l %%d0, %0\n\t" : "=r"(key) : // 入力なし : "d0" // 使用するレジスタ ); *pkey = key; } // ソフトウェアキーボード消去 void skeymod_off() { __asm__ volatile ( "moveq #0x7d, %%d0\n\t" // _SKEY_MOD "moveq #0, %%d1\n\t" "trap #15\n\t" : : // 入力なし : "d0", "d1" // 使用するレジスタ ); } void mouse_init() { msinit(); mscuron(); skeymod_off(); } typedef struct { int x; int y; int bl; int br; } MouseState; void get_mouse_state(MouseState *state) { int x, y, x2, y2, bl, br; mspos(&x, &y); msstat(&x2, &y2, &bl, &br); state->x = x; state->y = y; state->bl = bl; state->br = br; } int main(void) { MouseState state; printf("X68000 Mouse Sample (GCC68k)\n"); printf("Press any key to exit.\n"); mouse_init(); while (1) { get_mouse_state(&state); printf("\rX: %d Y: %d LButton: %d RButton: %d ", state.x, state.y, state.bl, state.br); fflush(stdout); // キー入力をチェックして終了 int key = 0; keysns(&key); if (key) break; } // キー読み捨て getchar(); printf("\nBye!\n"); return 0; }




