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

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

X68000(17)

修正した「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;
}