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

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

X68000(19)

キーボード入力のサンプルで

で切り替えることができるものを作成しました。

#include <string>
#include <sstream>
#include <iostream>

#define USE_PC // 定義を切り替えることでPC版とX68000版を切り替え可能

#ifdef USE_PC
#include <conio.h>  // _kbhit, _getch
#else
#include <stdio.h>
#include <stdint.h>

// IOCSコールをアセンブラで呼び出す
void keyinp(int* pkey)
{
    uint32_t key;

    __asm__ volatile (
        "moveq  #0, %%d0\n\t" // _B_KEYINP
        "trap   #15\n\t"
        "move.l %%d0, %0\n\t"
        : "=r"(key)
        :                        // 入力なし
        : "d0"   // 使用するレジスタ
        );

    *pkey = key;
}

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 bitsns(int grp, int* pkey)
{
    uint32_t key;

    __asm__ volatile (
        "moveq  #4, %%d0\n\t" // _BITSNS
        "move.w %1, %%d1\n\t"
        "trap   #15\n\t"
        "move.l %%d0, %0\n\t"
        : "=r"(key)
        : "r"(grp)     // 入力
        : "d0", "d1"   // 使用するレジスタ
        );

    *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 skeymod_mouse()
{
    __asm__ volatile (
        "moveq  #0x7d, %%d0\n\t" // _SKEY_MOD
        "moveq  #-1, %%d1\n\t"
        "trap   #15\n\t"
        :
        :                        // 入力なし
        : "d0", "d1"   // 使用するレジスタ
        );
}
#endif

bool is_key_pressed() {
#ifdef USE_PC
    return _kbhit();
#else
    int key;
    keysns(&key);
    return (key & 0xff) != 0; // キーが押されているかどうかをチェック
#endif
}

int key_input() {
#ifdef USE_PC
    if (_kbhit()) {
        return _getch(); // キー入力を取得
    }
    return 0; // 入力がない場合は0を返す
#else
    int key;
    keyinp(&key); // IOCSコールでキー入力を取得
    return key & 0xff; // キーコードを返す
#endif
}

int main() {
    printf("Start\n");
    fflush(stdout);

    while (true) {
        int key = 0;
        if (is_key_pressed()) {
            key = key_input();
            printf("\rKey Input: %x", key & 0xff);
            fflush(stdout);
            if (key == 'q') {
                // 'q'キーが押されたら終了
                printf("\nExit on 'q' key.\n");
                fflush(stdout);
                break;
            }
        }
    }

    return 0;
}