--- nono/vm/lunakbd.h 2026/04/29 17:04:28 1.1 +++ nono/vm/lunakbd.h 2026/04/29 17:05:49 1.1.1.15 @@ -1,42 +1,93 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// LUNA のキーボードとマウス // #pragma once #include "keyboard.h" +class SIODevice; + class LunaKeyboard : public Keyboard { - typedef Keyboard inherited; + using inherited = Keyboard; public: LunaKeyboard(); - virtual ~LunaKeyboard(); + ~LunaKeyboard() override; + + bool Init() override; - // キーを押した - virtual void MakeKey(uint); - // キーを離した - virtual void BreakKey(uint); + // シフト状態なら true を返す + bool IsShift() const override; + + // マウス入力 + void MouseInput(int x, int y, bool rb, bool lb, bool mb) override; + + // マウスデータを VM に送信する MD 処理 + void MouseSendStart() override; + + // ホストからの制御コマンド + void Command(uint32 data) override; private: - // 共通キーコードから LUNA キーコードへの変換 - uint keycode2lunakey(uint); + // キーボードの接続と取り外し + void MDConnect() override; + void MDDisconnect() override; + + // MD キーコードに変換 + uint KeyToMDKey(uint keystat) const override; + + // キーを1つ処理する + void KeyInput(uint keystat) override; + + // キーイベントを起こせる空きスロットを計算して、イベントを開始 + void SendStart() override; + + // イベントを開始 + void Start(uint64 period); + + // コールバック + void Callback(Event *); + + // 共通キーコードから LED 番号を取得。 + // 0: かな + // 1: CAPS + int Keycode2LED(uint keycode) const; + // LED 番号から共通キーコードを取得。 + uint LED2Keycode(int ledcode) const; + + // マウスサンプリング + void MouseSampling(); + void MouseOn(); + void MouseOff(); + + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + + // マウスサンプリング + bool mouse_on {}; + + // ブザー + uint buzzer_msec {}; // コマンドで指定した発音時間 [msec] + uint buzzer_freq {}; // コマンドで指定した発音周波数 [Hz] + uint64 buzzer_end {}; // ブザーを鳴らし終わる仮想時刻 + + // イベント + Event *event {}; - // 変換テーブル - static const uint keycode2lunakey_table[128]; + Monitor *monitor {}; - // キー名テーブル - static const char * const keyname[128]; + SIODevice *sio {}; - // キーリピート用のテーブル。 - // LUNA のキーボードはキーを押し続けてもキーボードはオートリピート - // しないが、wxWidgets はキーを押し続けると KEY_DOWN イベントが連続 - // して飛んでくる。そのためすでに押されているキーについて再び - // KEY_DOWN が来てもこれを本体に送らないようにする。 - uint8 reptable[128] {}; + // 変換テーブル (実行時に機種によって書き換える) + static uint keycode2lunakey_table[KC_max]; - // LUNA キーコード + // LUNA キーコード (LUNA-I/-88K 共通) static const uint NoKey = 0; static const uint LunaKey_TAB = 0x09; static const uint LunaKey_CTRL = 0x0a; @@ -62,6 +113,8 @@ class LunaKeyboard : public Keyboard static const uint LunaKey_right = 0x1e; static const uint LunaKey_down = 0x1f; + static const uint LunaKey_INSERT = 0x20; + static const uint LunaKey_COPY = 0x21; static const uint LunaKey_1 = 0x22; static const uint LunaKey_2 = 0x23; static const uint LunaKey_3 = 0x24; @@ -75,7 +128,10 @@ class LunaKeyboard : public Keyboard static const uint LunaKey_minus = 0x2c; static const uint LunaKey_circum = 0x2d; static const uint LunaKey_backslash = 0x2e; + static const uint LunaKey_buzzer = 0x2f; + static const uint LunaKey_CUT = 0x30; + static const uint LunaKey_PASTE = 0x31; static const uint LunaKey_Q = 0x32; static const uint LunaKey_W = 0x33; static const uint LunaKey_E = 0x34; @@ -114,6 +170,7 @@ class LunaKeyboard : public Keyboard static const uint LunaKey_slash = 0x5b; static const uint LunaKey_underscore = 0x5c; + static const uint LunaKey_PAD_HOME = 0x60; static const uint LunaKey_PAD_plus = 0x61; static const uint LunaKey_PAD_minus = 0x62; static const uint LunaKey_PAD_7 = 0x63;