SharpKey Multi-HID Interface テクニカルガイド
概要
SharpKey Multi-HIDインターフェースは、PS/2またはBluetoothを介してキーボードやマウスをヴィンテージのSharpおよびNECコンピュータに接続できるデバイスです。ホスト機の色に合わせた小型のKM-24ブラックまたはライトグレーケースに収められており、追加スペースを最小限に抑えます。2つの外部ポートを持ち、一方はPS/2キーボードまたはマウス用、もう一方はホストのキーボードまたはマウス入力ソケットに接続するためのケーブル用です。
このドキュメントでは、SharpKeyの作成に使用されたハードウェア、プロトコル、およびすべての関連情報の技術的な詳細を説明します。
プロトコル
このセクションでは、各ホストコンピュータとキーボード/マウスの間で使用されるプロトコルを詳述します。SharpKeyはキーボードまたはマウスのPS/2またはBluetoothプロトコルをホストプロトコルに変換するためにこれらのプロトコルを複製します。
MZ-2500 キーボードプロトコル
ハードウェアインターフェースは、シールドされた8ピンミニDINソケットとプラグを使用した7つの信号、5VとGNDで構成されており、プラグの配線は以下の通りです。

RTSN、KD4、MPXはメインユニット側からの出力信号です。KD[3:0]はRTSNを使用してメインユニット制御下での方向を持つメインユニットとキーボード間の双方向バスです。
| 信号 | 方向 | 論理状態 | 説明 |
|---|---|---|---|
| RTSN 行ストローブ |
メインユニット -> キーボード | HIGH (1) | 行アドレスがメインユニットからキーボードに送信されています。 |
| LOW (0) | キーボードは4ビット双方向バスKD[3:0]で要求されたデータを送信しています。 | ||
| KD4 タイプストローブ |
メインユニット -> キーボード | HIGH (1) | キーボードは行番号が参照する実際のキーマトリクスデータを返さなければなりません。 |
| LOW (0) | キーボードはすべてのキーの論理AND(D0 = ROW 0〜13のビット0のAND、D1 = ROW 0〜13のビット1のANDなど)を返さなければなりません。 | ||
| MPX ニブルMUXストローブ |
メインユニット -> キーボード | HIGH (1) | 要求されたROW(またはKD4が指示するANDされた行データ)の上位ニブルがキーボードからメインユニットに送信されます。 |
| LOW (0) | 要求されたROW(またはKD4が指示するANDされた行データ)の下位ニブルがキーボードからメインユニットに送信されます。 | ||
| KD[3:0] 双方向バス |
メインユニット -> キーボード | RTSN = HIGH(1)の場合にアクティブ、キーボードマトリクスから行データの4ビット行番号を送信します。 | |
| キーボード -> メインユニット | RTSN = LOW(0)の場合にアクティブ、要求された行の8ビット列データの4ビットを送信します。4ビットはKD4とMPXで選択されます。 |
動作モードは主に2つあります。キー押下を待機している間に使用されるすべて(STROBEALL)のキーテストモードと、続いて押されたキーの位置を特定するためにすべての行を手動スキャンするモードです。
キーデータ取得のプロトコルは以下の通りです:
- RTSNがアクティブHIGHになり1.08usアクティブ状態を維持します。STROBEALLでキーを検出した後の最初のRTSN期間は1.08usアクティブHIGH、660nsインアクティブLOWです。その後の期間は一様に660nsアクティブHIGH、680nsインアクティブLOWです。
- メインボードはキーボードにスキャン行を送信し、RTSNの立ち上がりエッジから160ns後に有効になります。
- スキャン行はKD[3:0]から残りの920nsでキーボードによって読み取られます。KD4の状態(または状態変化)はRTSNの立ち上がりエッジに先行し、一般的にRTSNのトリガーとなるアクティブエッジの前の立ち下がりエッジで変化します。
- KD4がサンプリングされ、LOWの場合は列ごとのすべてのキーの論理ANDが取得のために設定され、HIGHの場合は選択された行の実際の列が取得のために設定されます。
- RTSNの立ち下がりエッジ(RTSNがインアクティブLOWになる)で、MPXは320nsHIGHになり、MPXの立ち上がりエッジから20ns後にKD[3:0]上で取得のために設定されたデータの上位ニブルがキーボードによって出力されます。データは次にMPXがLOWになるまでの残り300ns以内にメインボードによって読み取られます。MPXがLOWになると同じ320nsタイミング間隔でKD[3:0]上に取得のために設定されたデータの下位ニブルが出力されます。320ns後にRTSNが再び立ち上がります。
- 上記はキーが押されている間繰り返されます。送信される行は変化することもあれば、例えばバウンスやリピートを検出するために同じキーを読み取る場合は静止したままのこともあります。
- キーが押されていない場合はSTROBEALLモードに切り替えます。
STROBEALLモードのプロトコルは以下の通りです:
- STROBEALLモード中、KD4はLOWに保持されており、18.996msから198.83msの間で変化する20nsのグリッチを除いて状態は変化しません。このグリッチはハードウェアの見落としのように見えます。
- STROBEALLモード中、RTSNは均一な期間(660nsアクティブHIGH、660nsアクティブLOW)を持ちます。RTSNがHIGHになると、ハードウェアがメインボードからキーボードにROWを送信するように切り替わります(上記プロトコルと同様)。行は無視されます(または意味のない定数値4を繰り返し続けるので無視されているように見えます)。
- KD4がサンプリングされます。
- RTSNの立ち下がりエッジで、MPXは320nsHIGHになり、MPXの立ち上がりエッジから20ns後に有効になるKD[3:0]上に取得のために設定されたデータの上位ニブルがキーボードによって出力されます。MPXがLOWになると同じ320nsタイミング間隔でKD[3:0]上に取得のために設定されたデータの下位ニブルが出力されます。320ns後にRTSNが再び立ち上がります。
- キーが押されている場合はキーデータ取得モードに切り替え、そうでなければ上記をループで繰り返します。
信号は以下のロジックアナライザ図で可視化できます:

非アクティブ中、メインボードのゲートアレイはSTROBEALLコマンドを送信します。これはKD4がLOWであることで認識され、送信されるROWは考慮されません。返されるデータはすべての行にわたる特定の列のすべてのキーの論理ANDです。

STROBEALLでキーが押されたことが検出されると、KD4がHIGHになり、メインボードがキーボードを調査して押されたキーを特定し始めます。Row 11(特殊キーCTRL、SHIFT、LOCK、KANA、GRAPHを含む行)の列データを返すリクエストを最初に送信することから始まります。

Row 11のスキャンはスイッチバウンスに対応するためだと思われる約30usの間行われます。

Row 11の調査後、Row 12(日本語変換キーを含む行)に切り替わります。これは画像の左側の広いRTSNパルスで確認できます。KD[3:0]の値を見ると2進数で12と読めます。Row 12は約50usの間スキャンされます。

Row 11と12の調査後、メインボードはRow 0から開始して押されたキーを探すためにすべての行の順次スキャンを開始します。広いRTSNシグナルパルスを見るとKD[3:0]がインクリメントしているのがわかります。

順次スキャンは押されたキー(この場合はRow 4 Column 3のC)を見つけるまで続きます。キーバウンスを判定するために同じ行が600us以上スキャンされます。残りの行の順次スキャンが続き、その後キーが離されるまでRow 0から繰り返されます。
MZ-2500が使用するハードウェアは以下の2つの回路で確認できます。

この回路図はキーボード回路を表しており、ゲートアレイ(またはカスタムMCU、部品番号からデバイスの種類は判明しない)と双方向バッファで構成されています。ゲートアレイはメインユニットから行を受け取り、それをキーボードストローブ出力に適用します。キーデータはMPX信号の制御下で読み取られて返されます。

この回路図はメインユニット回路を表しており、MZ-2000/80Bと同様にストローブ行を出力して8ビット値を読み取ることを期待するZ-80B PIOに接続されたゲートアレイで構成されています。ゲートアレイはZ80B PIOのリクエストに即座に対応できるようにキーボードマトリクスを内部的にバッファしているようです。そのために、ゲートアレイはRow番号(0〜13)を送出し、キーボードから2ニブルで8ビットのデータブロックを受け取ります。これはメインコンピュータが何をしていても継続的に行われます。
MZ-2800 キーボードプロトコル
MZ-2800はMZ-2500の後継機であり、そのデザインには8ビットZ80ベースのMZ-2500モードと、MS-DOSやその他の16ビット80x86ベースのプログラムを実行できる16ビット80286モードが組み込まれています。MZ-2500と同様に、キーボードハードウェアインターフェースは7つの信号、5VとGNDで構成されていますが、D-Subハウジングに入った旧式のAMP 9ピンUSBスタイルコネクタを使用しています。このコネクタや仕様は見つかりませんでした。
MZ-2800マザーボードには標準的な低プロファイルのボード間9ピンヘッダがあります。これはAMPソケットが取り付けられた娘基板に接続され、外部ケーシングにネジ止めされています。ヴィンテージ機器を改造することを避けたいため、代替品を探し、AMPコネクタと同じサイズのD-Subを使用した解決策を見つけました。これにより、オリジナルのMZ-2800キーボードを入手できた場合は、AMPコネクタに素早く戻すことができます。
信号の概要は以下のテーブルに示します。物理的にはMZ-2500と同一です。
RTSN、KD4、MPXはメインユニット側からの出力信号です。KD[3:0]はRTSNを使用してメインユニット制御下での方向を持つ双方向バスです。
| 信号 | 方向 | 論理状態 | 説明 |
|---|---|---|---|
| RTSN 行ストローブ |
メインユニット -> キーボード | HIGH (1) | 行アドレスがメインユニットからキーボードに送信されています。 |
| LOW (0) | キーボードは4ビット双方向バスKD[3:0]で要求されたデータを送信しています。 | ||
| KD4 タイプストローブ |
メインユニット -> キーボード | HIGH (1) | キーボードは行番号が参照する実際のキーマトリクスデータを返さなければなりません。 |
| LOW (0) | キーボードはすべてのキーの論理ANDを返さなければなりません。 | ||
| MPX ニブルMUXストローブ |
メインユニット -> キーボード | HIGH (1) | 上位ニブルがキーボードからメインユニットに送信されます。 |
| LOW (0) | 下位ニブルがキーボードからメインユニットに送信されます。 | ||
| KD[3:0] 双方向バス |
メインユニット -> キーボード | アクティブ時(RTSN = HIGH)、キーボードマトリクスから行データの4ビット行番号を送信します。 | |
| キーボード -> メインユニット | アクティブ時(RTSN = LOW)、要求された行の8ビット列データの4ビットを送信します。 |
MZ-2800のプロトコルはMZ-2500と同じ物理的な信号を共有しますが、主にタイミングが異なります。基本原理は同じで、RTSNがHIGHになってからキーボードに行番号が送信され、RTSNがLOWになってからSTROBEALLまたはデータが返されます。本質的な違いはタイミングとキーを調査するためのプロトコルの使用方法です。
- RTSNがアクティブHIGHになり、メインボードがキーボードにスキャン行を送信します。
- KD4をサンプリングする前にRTSNがアクティブになってから少なくとも200ns待ちます(KD4はRTSNに遅延します)。
- ROWを読み取る前にRTSNがアクティブになってから少なくとも650ns待ちます(KD[3:0]はRTSNに大幅に遅延します)。
- スキャン行がKD[3:0]から読み取られます。STROBEALLモードでは、MZ-2500と同様に行は定数値4で無限に繰り返され、使用されないようです。
- KD4がサンプリングされます。LOWの場合は列ごとのすべてのキーの論理ANDが取得のために設定され、HIGHの場合は選択された行の実際の列が取得のために設定されます。
- RTSNがインアクティブLOWになるのを待ちます。
- MPX = HIGHの場合、取得のために設定されたデータの上位ニブルがキーボードによってKD[3:0]上に出力され、メインボードによって読み取られます。MPX = LOWの場合、下位ニブルが出力されます。MPXはMZ-2500と同じ期間(640ns、320nsアクティブHIGHと320nsLOW)を持ちます。
- 上記が繰り返されます。送信される行は変化することもあれば、バウンスやリピートを検出するために同じキーを読む場合は静止したままのこともあります。

STROBEALLモード。メインボードはKD4をLOWに保持してキー押下を待機しています。この図の送信される行はRow 0ですが、STROBEALLモードは特定の列に対してすべての行を論理ANDするため明確な目的はありません。

キーが押されると、モードはキー取得モードに変わります。KD4がHIGHになり、メインボードは列データを取得するために有効な行番号の送信を開始します。MZ-2500と同様に、まずRow 11が照会され、続いてRow 12、その後Row 0からの順次スキャンが行われます。

RTSNがアクティブになってから行データが利用可能になるまでのタイミング遅延がこの図で確認できます。残念ながらKD4がRTSNに遅延していることを示すタイミング図を見失ってしまいました。次回ロジックアナライザをセットアップする際にスナップショットを撮影します。

上の画像で順次スキャンが確認できます。

ここで順次スキャンが確認できます。スキャンが押されたキー(C - Row 4 Column 3)の行に達すると、スキャンを続ける前にデバウンスのために同じ行が100usの間読み取られます。

キーが押し続けられると順次スキャンが繰り返されます。スキャンが2回目に押されたキーに到達すると、進む前に300us以上スキャンします(上記の例ではキーAが押されています)。

キーが押されてから離される瞬間までの完全なサイクル。

MZ-2800キーボードとMZ-2500キーボードの違いの一つは14番目の行の追加です。そのスキャンは上に示されています。MZ-2500モードのMZ-2800ではRow 14はスキャンされず、MZ-2800モードの場合にのみスキャンされます。
MZ-2800が使用するハードウェアは以下の2つの回路で確認できます。

この回路図はキーボード回路を表しており、ゲートアレイ(またはカスタムMCU)と双方向バッファで構成されています。ゲートアレイはメインユニットから行を受け取り、それをキーボードストローブ出力に適用します。

この回路図はメインユニット回路を表しており、ストローブ行を出力して8ビット値を読み取ることを期待するZ-80B PIOに接続されたゲートアレイで構成されています。ゲートアレイはRow番号(MZ-2500モードでは0〜13、MZ-2800モードでは0〜14)を送出し、キーボードから2ニブルで8ビットのデータブロックを受け取ります。これはメインコンピュータが何をしていても継続的に行われます。
Sharp X1 キーボードプロトコル
Sharp X1は5年間で3つの主要なバリアント(X1オリジナル、X1 Turbo I/II/III、X1 TurboZ I/II/III)を持ちました。すべてのモデルは同じ基本的なキーボード技術とプロトコルを共有していました。基本的には、3.5mmステレオジャックを使用した1線非同期5V TTLキーボード-ホスト信号で、キーボードの電源要件とデータ転送を提供しました。
キーデータはスタートビットとストップビット、その間の16データビットにカプセル化されています:

TurboおよびTurboZモデルは追加のモード(モードB)を追加しました。モードAと同様のプロトコルとなりますが、ゲーム向けに最適化されており、スタートビット、24データビット、ストップビットを送信します。モードBのビット時間の幅はモードAの半分で、24ビットはモードAの16ビットよりも短い時間で送信されます。

各ビットの時間はモードAとモードBで異なります。モードBはゲーム向けに最適化されています。
プロトコルをより深く理解するために、以下の図はモードAとモードBのデータ送信を可視化しています。
モードA、キーAが押された状態。
モードA、キーBが押された状態。
モードB、キーAが押された状態。
Sharp X68000 キーボードプロトコル
Sharp X68000は6年間の製造で11のバリアントを持ちました。すべてのモデルは同じキーボード技術を共有しており、2400ボード非同期プロトコル(5V TTLレベル)に基づくスタート + 8ビット + ストップビットを使用しました。プロトコルは双方向であり、ホストがキーボードの設定とLEDの状態を変更できます。物理的な接続はミニDIN7コネクタに基づいており、電源、マウス、レディ状態信号を含みます。
データリンク層でのプロトコルは比較的シンプルです。キーボードは各キー押下に対してスキャンコードを送信し、MSBはキー押下(1)またはリリース(0)を示します。さらに、ホストはキーボードに対していくつかのコマンドを送信できます。キーボードLEDの点灯、輝度、タイプマティックリピート時間および遅延に関する4つのコマンドが知られています。
無線規制に関する注意事項
本デバイスは 2.4 GHz ISM バンドで送信する事前認証済み ESP32-S 無線モジュール(AI Thinker)を搭載しており、世界各国の無線周波数規制(米国の FCC Part 15 Subpart C、欧州連合の無線機器指令 2014/53/EU を含む)において意図的放射器に該当します。
ESP32-S モジュールは無改造で使用されており、独自の規制認証(FCC、CE など)を取得しています。ただし、そのモジュールレベルの認証は、モジュールを組み込んだ完成品に自動的に適用されるものではありません。事前認証モジュールの免除規定は、個人の趣味愛好家が個人使用、実験、または教育目的で少数のデバイスを製作する場合に、個別の機器認可を取得せずに行うことを許可するものです。
重要な制限事項
本設計に基づいて製作されたデバイスが、管轄区域内の適用されるすべての無線周波数規制に準拠することは、製作者の単独の責任です。著者は本設計を個人使用、教育、および趣味愛好家向けに提供しており、本設計から製作されたデバイスが商業的配布の規制要件を満たすことについて、いかなる表明も行いません。
- 組み立てられたデバイスは、完成品が独自にテストされ、該当する管轄区域で機器認可(例:FCC ID、認定機関による CE マーキング評価)を取得しない限り、第三者への販売、販売の申し出、贈与、またはその他の方法での配布を行ってはなりません。
- 個人使用のために少数を製作することは、趣味愛好家および実験使用の規定(例:FCC § 15.23)に基づき、デバイスが有害な干渉を引き起こさない限り、一般的に許可されています。
- 規制要件は国によって異なります。米国外の製作者は、適用される規則について自国の無線周波数当局に確認してください。
本設計に基づいて製作されたデバイスが、管轄区域内の適用されるすべての無線周波数規制に準拠することは、製作者の単独の責任です。著者は本設計を個人使用、教育、および趣味愛好家向けに提供しており、本設計から製作されたデバイスが商業的配布の規制要件を満たすことについて、いかなる表明も行いません。