X68000 IOCSワーク直接参照
インターネット黎明のころ、パソコン通信のBBSへの書き込みした方からその当時どんな雰囲気だったかを聞きます。
com(51/565) 93/08/12 23:50 私は教えてもらったので
<50:そういえば$800から>
2rep 406B
私は教えてもらったのでえらそうなことはあんまりいえないのですが、$800から1バイト単位でIOCSのBITSNSのキーコードグループの順番に16バイト格納されています。
具体的には
moveq #$00,d1/iocs BITSNS/btst #1,d0/bne ....
というESCキーのチェックはスーパーバイザ状態で
btst #1,$800/bne ....
という感じでチェック出来るということになっているようです。
X68000のキーボード関係のワークメモリらしいものであるアドレス$800~についての質問に対してのリプライです。キーボードのひとつのキーが押されているかどうかを内部のワークメモリを直接参照することで、簡単に判定できるようです。教えてもらったと書かれているあたり、オフィシャルのマニュアルなどに書かれていない情報なのでしょうか。
X68000にはIOCS(Input Output Control System)という名称で、BIOSに相当するハードウェア制御などの基本処理を取り扱うソフトウェアが内蔵ROMにある。各機能を呼び出すことによってハードウェアを制御したり、状態を取得したりできるようになっている。必要とするIOCS処理番号やパラメータをレジスタに入れてソフトウェア割り込み(trap #15)をおこすことで呼び出しする。キーボードの各キーが押されているかどうかはBITSNSというIOCS呼び出しにより、1回の呼び出しでキーコードグループに属する8個のキーの状態を取得できる。
メモリのアドレス$800からはIOCSのワークメモリとなっていて、ユーザープログラムは通常のユーザーモードではこのメモリを直接参照できず、読み書きしようとするとエラーになり保護されている。ユーザープログラムがスーパーバイザモードへ移行している場合は制限を受けずIOCSが管理しているメモリを直接参照出来る。IOCSのBITSNSが参照しているキーの押し下げ状態は$800から格納されているため、プログラムがスーパーバイザモードの場合はキーボードを状態を確認したい場合はソフトウェア割り込みを繰り返してIOCSを呼び出さなくても、ビットテストの1命令で各キーの状態を参照できるという書き込み。
$800の格納データと使い方については人伝に聞いたものの、当時は市販されているソフトでも使われているくらい一般的になっている方法のよう。ゲーム等では1/60秒毎に操作に必要なキーをすべて読み出す必要があり、またスーパーバイザモードのままで動作することが多いため、IOCSのキーボード用ワークメモリを直接参照する方法が使われるようになりだしたのかもしれない。記載されているところを読み飛ばしていただけで、実はどこかに記載されていた可能性もある。
X68000の新しい機種が出ればIOCSのワークメモリの位置や使われ方が変更になってもおかしくないところ、幸い後に発売された機種でIOCS ROMのバージョンが上がってもキーボードや各種ハードウェア制御のワークメモリのアドレスは変更されることなく、ハードウェアの追加機能などにより増えたワークメモリは未使用だった後ろに追加される形で拡張されており、直接参照するプログラムに対する互換性は保たれている。
書き込みのリプライでキーの押し下げ状態だけでなく、キーボードLED制御やキーバッファ等のポインタなどが説明されていて以下の通り。
$0800~$080f IOCS BITSNSで返って来るワーク
$0810.w IOCS _B_SFTSNSで返って来るワーク
($0810.b キーボードLED点燈制御データ)
$0812.w バッファ内の有効データー数(未受け渡しデーター数)
$0814.l キー入力バッファのFIFOポインタ
$0818.l キー入力バッファのFIFOポインタ
(IOCS _B_KEYINPとIOCS _B_KEYSNSで取得するデータのポインタ)
$081e~$089bがキー入力バッファ(FIFO)本体
IOCSという、ソフトウェア割り込みを使用する事で互換性を保つという設計からすると、公式に説明の無さそうなIOCS内部のワークメモリ参照というのは、かなり行儀が悪そうです。そうはいうものの、ゲームなどではスーパーバイザモードに移行したままスプライト等の各種ハードウェアをアドレス指定で直接制御する事も多く、割り込みまで直接制御している事が多い事を考えると、ワーク直接参照もまたアリということなのかもしれません。
当時はIOCS内を解析して動作の確認をしつつ、ワークの使われ方を把握して直接参照したりしているような方が多かったということなのかも。
用語
・スーパーバイザモード
Motorola 68000 MCUには実行モードが2種類あり、X68000では通常ユーザープログラムはユーザーモードという、システム領域が保護されている状態で実行されるようになっている。ユーザーモード時に保護されている領域へのアクセスをしようとするとエラーが発生する。IOCS B_SUPERの呼び出し等によりスーパーバイザモードという特権モードに移行することにより全ての領域にアクセス可能となる。
・IOCS使用メモリ
IOCSやシステム用に使用されているメモリのアドレスは、Cコンパイラに付属するマニュアルにおおまかに記載されている。$000800~$000FFFがIOCSワークとなっており、詳細についてはマニュアルに記載が無い。

・IOCS BITSNS
キー押下状態のセンスをするIOCS。1回の呼び出しでキーコードグループに属する8個のキー入力状態を取得できる。たとえばキーコードグループ4であれば、「DFGHJKL;」の8個のキーの状態が取得できる。ゲーム等では上下左右移動の4方向に対応する4個のキーと動作のボタン等が同時に押下される事が多いため、このような押下状態のセンスが使われる事が多い。

株式会社瑞起より、X68000を復活させた「X68000 Z LIMITED EDITION EARLY ACCESS KIT」のクラウドファンディングが12月3日より開始。2023年1月28日まで実施中です。
X68000Z https://www.zuiki.co.jp/x68000z/
クラウドファンディング https://kibidango.com/2285

インターネット黎明のころの草の根BBSももりこみつつ、いろんなエピソードをつめこんだ「ちょっと偏ったインターネット老人会へようこそ」を同人誌として頒布します。
参加予定イベント
12月31日 V-43a コミックマーケット 101
同人サークル BLACK FTZやってます twitter @black_ftz