File:  [Isaki's NoNo m68k/m88k emulator] / nono / vm / x68kkbd.h
Revision 1.1.1.17 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:05:59 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v027, HEAD
nono 1.7.0

//
// nono
// Copyright (C) 2020 nono project
// Licensed under nono-license.txt
//

//
// X68k キーボード
//

#pragma once

#include "keyboard.h"
#include <array>

class MFPDevice;
class SCCDevice;
class SysportDevice;

class X68030Keyboard : public Keyboard
{
	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();
	~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;

	// ホストからの制御コマンド
	void Command(uint32 data) override;

	// ホストからの Ready 通知
	// (実際のハードウェアでは単にキーボードが待っている)
	void Ready();

 private:
	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[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<uint8, 3> mouse_data {};

	MFPDevice *mfp {};
	SCCDevice *scc {};
	SysportDevice *sysport {};

	// マウスイベント
	Event *mouse_event {};

	Monitor *monitor {};

	// X680x0 キーコード
	static const uint NoKey					= 0;
	static const uint X68kKey_ESC			= 0x01;
	static const uint X68kKey_1				= 0x02;
	static const uint X68kKey_2				= 0x03;
	static const uint X68kKey_3				= 0x04;
	static const uint X68kKey_4				= 0x05;
	static const uint X68kKey_5				= 0x06;
	static const uint X68kKey_6				= 0x07;
	static const uint X68kKey_7				= 0x08;
	static const uint X68kKey_8				= 0x09;
	static const uint X68kKey_9				= 0x0a;
	static const uint X68kKey_0				= 0x0b;
	static const uint X68kKey_minus			= 0x0c;
	static const uint X68kKey_circum		= 0x0d;
	static const uint X68kKey_backslash		= 0x0e;
	static const uint X68kKey_BS			= 0x0f;

	static const uint X68kKey_TAB			= 0x10;
	static const uint X68kKey_Q				= 0x11;
	static const uint X68kKey_W				= 0x12;
	static const uint X68kKey_E				= 0x13;
	static const uint X68kKey_R				= 0x14;
	static const uint X68kKey_T				= 0x15;
	static const uint X68kKey_Y				= 0x16;
	static const uint X68kKey_U				= 0x17;
	static const uint X68kKey_I				= 0x18;
	static const uint X68kKey_O				= 0x19;
	static const uint X68kKey_P				= 0x1a;
	static const uint X68kKey_at			= 0x1b;
	static const uint X68kKey_bracketleft	= 0x1c;
	static const uint X68kKey_enter			= 0x1d;
	static const uint X68kKey_A				= 0x1e;
	static const uint X68kKey_S				= 0x1f;

	static const uint X68kKey_D				= 0x20;
	static const uint X68kKey_F				= 0x21;
	static const uint X68kKey_G				= 0x22;
	static const uint X68kKey_H				= 0x23;
	static const uint X68kKey_J				= 0x24;
	static const uint X68kKey_K				= 0x25;
	static const uint X68kKey_L				= 0x26;
	static const uint X68kKey_semicolon		= 0x27;
	static const uint X68kKey_colon			= 0x28;
	static const uint X68kKey_bracketright	= 0x29;
	static const uint X68kKey_Z				= 0x2a;
	static const uint X68kKey_X				= 0x2b;
	static const uint X68kKey_C				= 0x2c;
	static const uint X68kKey_V				= 0x2d;
	static const uint X68kKey_B				= 0x2e;
	static const uint X68kKey_N				= 0x2f;

	static const uint X68kKey_M				= 0x30;
	static const uint X68kKey_comma			= 0x31;
	static const uint X68kKey_period		= 0x32;
	static const uint X68kKey_slash			= 0x33;
	static const uint X68kKey_underscore	= 0x34;
	static const uint X68kKey_space			= 0x35;
	static const uint X68kKey_HOME			= 0x36;
	static const uint X68kKey_DEL			= 0x37;
	static const uint X68kKey_ROLLUP		= 0x38;
	static const uint X68kKey_ROLLDOWN		= 0x39;
	static const uint X68kKey_UNDO			= 0x3a;
	static const uint X68kKey_left			= 0x3b;
	static const uint X68kKey_up			= 0x3c;
	static const uint X68kKey_right			= 0x3d;
	static const uint X68kKey_down			= 0x3e;
	static const uint X68kKey_PAD_CLR		= 0x3f;

	static const uint X68kKey_PAD_divide	= 0x40;
	static const uint X68kKey_PAD_multiply	= 0x41;
	static const uint X68kKey_PAD_minus		= 0x42;
	static const uint X68kKey_PAD_7			= 0x43;
	static const uint X68kKey_PAD_8			= 0x44;
	static const uint X68kKey_PAD_9			= 0x45;
	static const uint X68kKey_PAD_plus		= 0x46;
	static const uint X68kKey_PAD_4			= 0x47;
	static const uint X68kKey_PAD_5			= 0x48;
	static const uint X68kKey_PAD_6			= 0x49;
	static const uint X68kKey_PAD_equal		= 0x4a;
	static const uint X68kKey_PAD_1			= 0x4b;
	static const uint X68kKey_PAD_2			= 0x4c;
	static const uint X68kKey_PAD_3			= 0x4d;
	static const uint X68kKey_PAD_enter		= 0x4e;
	static const uint X68kKey_PAD_0			= 0x4f;

	static const uint X68kKey_PAD_comma		= 0x50;
	static const uint X68kKey_PAD_decimal	= 0x51;
	static const uint X68kKey_kigou			= 0x52;
	static const uint X68kKey_touroku		= 0x53;
	static const uint X68kKey_HELP			= 0x54;
	static const uint X68kKey_XF1			= 0x55;
	static const uint X68kKey_XF2			= 0x56;
	static const uint X68kKey_XF3			= 0x57;
	static const uint X68kKey_XF4			= 0x58;
	static const uint X68kKey_XF5			= 0x59;
	static const uint X68kKey_kana			= 0x5a;
	static const uint X68kKey_romaji		= 0x5b;
	static const uint X68kKey_code			= 0x5c;
	static const uint X68kKey_CAPS			= 0x5d;
	static const uint X68kKey_INS			= 0x5e;
	static const uint X68kKey_hira			= 0x5f;

	static const uint X68kKey_zenkaku		= 0x60;
	static const uint X68kKey_BREAK			= 0x61;
	static const uint X68kKey_COPY			= 0x62;
	static const uint X68kKey_F1			= 0x63;
	static const uint X68kKey_F2			= 0x64;
	static const uint X68kKey_F3			= 0x65;
	static const uint X68kKey_F4			= 0x66;
	static const uint X68kKey_F5			= 0x67;
	static const uint X68kKey_F6			= 0x68;
	static const uint X68kKey_F7			= 0x69;
	static const uint X68kKey_F8			= 0x6a;
	static const uint X68kKey_F9			= 0x6b;
	static const uint X68kKey_F10			= 0x6c;

	static const uint X68kKey_SHIFT			= 0x70;
	static const uint X68kKey_CTRL			= 0x71;
	static const uint X68kKey_OPT1			= 0x72;
	static const uint X68kKey_OPT2			= 0x73;
};

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.