--- nono/vm/x68kkbd.h 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/x68kkbd.h 2026/04/29 17:05:59 1.1.1.17 @@ -1,33 +1,115 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// X68k キーボード // #pragma once #include "keyboard.h" +#include + +class MFPDevice; +class SCCDevice; +class SysportDevice; class X68030Keyboard : public Keyboard { - typedef Keyboard inherited; + using inherited = Keyboard; + + // マウスステータスデータ + static const uint8 YUNFL = 0x80; + static const uint8 YOVFL = 0x40; + static const uint8 XUNFL = 0x20; + static const uint8 XOVFL = 0x10; + static const uint8 SW_R = 0x02; + static const uint8 SW_L = 0x01; + public: X68030Keyboard(); - virtual ~X68030Keyboard(); + ~X68030Keyboard() override; + + bool Init() override; + + // シフト状態なら true を返す + bool IsShift() const override; + + // マウス入力 + void MouseInput(int x, int y, bool rb, bool lb, bool mb) override; + + // マウスデータを VM に送信する MD 処理 + void MouseSendStart() override; - // キーを押した - virtual void MakeKey(uint); - // キーを離した - virtual void BreakKey(uint); + // ホストからの制御コマンド + void Command(uint32 data) override; + + // ホストからの Ready 通知 + // (実際のハードウェアでは単にキーボードが待っている) + void Ready(); private: - // 共通キーコードから LUNA キーコードへの変換 - uint keycode2x68kkey(uint); + DECLARE_MONITOR_SCREEN(MonitorScreen); + + // キーボードの接続と取り外し + void MDConnect() override; + void MDDisconnect() override; + + // MD キーコードに変換 + uint KeyToMDKey(uint keystat) const override; + + // キーを1つ処理する + void KeyInput(uint keystat) override; + + // キーイベントを登録(追加)する + void SendStart() override; + + // キーリピートイベント + void ReptCallback(Event *); + + // マウスイベント + void MouseCallback(Event *); // 変換テーブル - static const uint keycode2x68kkey_table[133]; + static const uint keycode2x68kkey_table[KC_max]; + + // キーリピート開始時間 + uint rept_delay_data {}; // 設定値 + uint64 rept_delay {}; // [nsec] + // キーリピート間隔 + uint rept_time_data {}; // 設定値 + uint64 rept_time {}; // [nsec] + // キーリピートイベント + Event *rept_event {}; + // リピートしている共通キーコード + uint rept_key {}; + + // LED 暗さ (0 明るい <-> 3 暗い) + uint32 led_darkness {}; + + // LED は以下の7つ。 + // 0: かな + // 1: ローマ字 + // 2: コード入力 + // 3: CAPS + // 4: INS + // 5: ひらがな + // 6: 全角 + + // マウス送信データ + std::array mouse_data {}; + + MFPDevice *mfp {}; + SCCDevice *scc {}; + SysportDevice *sysport {}; + + // マウスイベント + Event *mouse_event {}; - // キー名テーブル - static const char * const keyname[128]; + Monitor *monitor {}; // X680x0 キーコード static const uint NoKey = 0;