(お願い)とあるゲーム内の謎解きに関係する内容らしい、と聞いています。このゲームを遊んでおられる方は、そっとこのページを閉じてください。
MZ-700に停止命令を入力して止めたい
シャープが1982年に発売したホビー・教育向けコンピュータ「MZ-700」は、Zilog社のCPU(中央演算装置)「Z80A」を搭載しています。
写真:「マイコン博物館」に展示されている MZ-700
このパソコンで停止命令を入力して止めたい、そんなときはどうすればいいのでしょう…。
まず、MZ-700に動作を命令する、すなわちプログラムを記述する際には、このZ80A向けの命令セット(Instruction Set)で記載する方法が、最もロスが少なく高速に実行することができます。
Z80Aには、動作を停止する命令セットがあります。
Z80 Microprocessors Z80 CPU User Manualの181ページに記載されている、
HALT
命令です。
HALT命令を使用しても、割り込みが発生してしまう
名前からしても、停止っぽく見える命令ですが…正確には停止する命令ではありません。以下の記載があります。
The HALT instruction suspends CPU operation until a subsequent interrupt or reset is
received. (略)
(訳)HALT命令は、後続の割り込みまたはリセットを受信するまでCPUの動作を停止します。
正確には、停止ではなく「割り込み」を受け取るまで、待っている命令なのです。(「リセット」は、その名の通りリセット信号を受けたときの動作です)。
「割り込み」ってなんだろう
コンピュータは、CPUだけで動作しているわけではなく、プログラムや情報を保持するメモリ、文字を入力するキーボードなど、周辺のいろいろな部品の組み合わせで動作しています。
CPUは周辺の部品からの特定の信号(割り込み信号)を受け取ったとき、プログラムの読み込み場所を変更して、別のプログラムを実行する機能を「割り込み」と呼びます。
例えば音楽を演奏したいときは、テンポに合わせて音を出力することになります。CPUは、時間を測ってくれる部品から信号を受け取り「割り込み」で時間を測定します。測定した時間に合わせ、音を出す部品に信号を送信することで、テンポが一定の音楽を演奏することができます。
また、この割り込みを上手く利用することで、画面を描画しながら音楽を演奏するなど、複数の処理を擬似的に動作することができます。(windows,linuxなど、OSがソフトウェアを管理している場合は、別の方法で複数の処理を並列に動作しています)
MZ-700の割り込み
どのような条件で「割り込み」は発生するかは、コンピュータのハードウェア設計で決まります。具体的には、CPUであるZ80Aの割り込みを行う信号を受け取る端子に、割り込みを行いたい部品の信号を接続します。
MZ-700の場合は、i8253と呼ばれている、時間を測ってくれる部品が接続されています。i8253に割り込みを行う時間間隔を設定することで、設定した時間間隔ごとに割り込みが発生します。
先程の例として記載した、音楽を演奏する場合は、この割り込みの回数を数えながら、音を出力する処理を行うことで、音楽を演奏することができます。
どうすれば、割り込みをコントロールできるの?
Z80 Microprocessors Z80 CPU User Manualの182ページ「Example」によると、
When the CPU executes the instruction DI the maskable interrupt is disabled until it is
subsequently re-enabled by an EI instruction. The CPU does not respond to an Interrupt
Request (INT) signal.
(訳)CPUがDI命令を実行すると、割り込みは(略)EI命令によって再度有効になるまで、無効になります(略)。
DI
命令で割り込みを無効にすることで、その後HALT命令を実行すると、割り込みが発生しないために、ずっと停止したままになります。
EI
命令で割り込みを有効にできます。(割り込みを受け取る状態になります)
補足:割り込み先のプログラムを実行中に割り込みが発生すると、再度割り込みが発生してしまいます。これを避けるため、割り込み先のプログラムの最初で「DI」を実行して割り込みを禁止し、最後で「EI」を実行して割り込み可能にします。
まとめ
- MZ-700の動作と割り込みに関係する命令として、CPU「Z80A」の命令セットとして以下があります。この命令セットを組み合わせることで「停止命令を入力して止めたい」を実現できます。
- 「 HALT 」…「割り込み」を受け取るまで、待っている命令
- 「 DI 」…「割り込み」を禁止する命令
- 「 EI 」…「割り込み」を許可する命令