Apple IIのハードウエア(2)

目次

Apple IIのハードウエア(1)からの続き

キーボード

Apple IIのキーボード部は専用のキー入力エンコードIC(AY3600)を使用している。

このIC AY3600はキー入力、チャタリング(キー入力が機械的にON/OFFを繰り返す)への対応、キーコード生成を1チップで行える。押されたキーのデータが準備されるとストローブ信号を1パルス出力する。

以下の図がAY3600のタイミングチャートである。

f:id:k_igrs:20180224133755p:plain

 

この仕様からキー入力をシリアルで転送するようなターミナルに使われるICなのかな?

Apple IIマザーボードにはこのICの出力が接続される。ストローブ信号を割り込み入力に接続するのが一般的であるが、Apple IIでは割り込みを使用せずポーリングでストローブの有無を確認する。ストローブの出力は図下のフリップフロップのクロックに接続される。

キーが押されてキーデータの読み取りが可能になるとストローブがフリップフロップのクロックとして出力される。フリップフロップのデータはH固定なので以降出力QはHを維持する。

フリップフロップの出力QはデータバスのBit7に、残りのBit6〜Bit0には図上のキーコードデータ(B7〜B1)が接続される。

ファームウエアはキーボードのIOアドレス$C000をリードしてデータのB7(フリップフロップの出力)がHであれば、有効なキーデータとして読み出した後、IOアドレス$C010アクセスしてフリップフロップのデータをクリアする。このクリア信号はアドレスしかデコードしてないのでリードでもライトでもアクセスすれば良い。

f:id:k_igrs:20180224134029p:plain

このキー入力の仕様(キーエンコード用チップAY3600の仕様)は、キーを離した事を検知できないので、キーボードでアクションゲームを行うとキーボードを離したらキャラが止まるという操作が出来ない。富士通のFM7/8と同じ問題ですね。

キーを離したか分からないということはキーを一回押しただけなのか連続して押しているのか分からないということである。この仕様ではカーソル移動やDeleteキーで文字列を削除するのが不便になる。そこでApple IIのキーボードにはREPEATキーが用意され、任意のキーを押した後にREPEATキーを押すことで連続してキー入力が連続して行われるようキーボード基板上で回路が組まれている。

以下がその部分。

f:id:k_igrs:20190530023459p:plain

キーボード基板のストローブ信号出力

キーが押されて一定時間経つとAY3600 ICのAKO(ANY KEY OUT)出力が{L]から[H]になる。この信号は次のキーが押されると[L]に戻る。REPEATキーが押され続ける間、555タイマーICが発信状態を維持し、定期的にストローブ信号が出力されることでキーの連続入力を実現している。ソフトウエアからは同じキーの入力があると判断される。

この仕様からリピートするキーデータが確定してからREPEATキーを押す必要があることが理解できるだろう。

拡張スロット

IBM-PCやそれから派生したPC-9801などは拡張スロットにマザーボードの信号がそのまま出力されていた為、複数の拡張カードをスロットに差すと割り込みやDMAチャンネルがコンフリクトを起こして動作しないという事態が発生していた。この問題はリソースのコンフィグレーションを行うPCIバスが主流になるまで続く。

Apple IIの場合、拡張スロット毎に専用アドレス空間でアクティブになるDEVICE SELECT信号をスロットに供給する事でリソースがコンフリクトするのを回避している。拡張カード上ではこのDEVICE SELECT信号とゲートして出力すれば他のスロットの出力と同時にアクティブになることはなく、優れた設計と言えるだろう。

またIO空間やメモリ空間もスロット毎に割り当ててコンフリクトが起きないように配慮されている。

図はアドレスをデコードして拡張スロット用のI/O SELECTとDEVICE SELECTを生成している。

DEVICE SELECTはスロット用のI/O信号や出力端子のイネーブル用に使用される。I/O SELECT信号はスロット上の256Byte ROMのチップセレクトとして使われる。スロット0はROM/RAM card用に使用されるのでI/O SELECT信号は存在しない。

 

f:id:k_igrs:20180224145631p:plain

CPUカードの様にスロット上からApple IIを制御する場合、複数のカードが競合しない仕組みが設けられている。

各スロットにプライオリティが設けられていて(slot 0[高]---slot 7[低い])、スロット上の拡張カードは上流の状態をDMA IN信号で確認し、アクティブ(L)でなければDMA信号を有効にする。

下図がその例。slot間のDMA OUTとDMA INは基盤上でつながっている。

f:id:k_igrs:20200509082119j:plain
なお、割り込みにも同様の仕組み(INT IN,INT OUT)があるが、割り込みを使用するのは本体のCPUであるのでDEVICE SELECTで競合しないように制御していたようだ。

フリップフロップのクロックには、IOアドレス$C030のデコード出力が接続されており$C030をアクセスするたびにフリップフロップの出力はL-Hを繰り返す。フリップフロップ出力の変化毎に、その先のコンデンサが充電-放電を行い、一定の時間スピーカーが鳴る。

$C030にアクセスするタイミングをソフトウエアでとることでゲームの効果音などを発生させる。

 

f:id:k_igrs:20180224161830p:plain

 

カセットインターフェース

Apple IIのカセット入力。テープに録音したデータをOPアンプで増幅してそのデータをIOポートから直接リードする。普通ならシリアルインターフェース回路を利用する所をソフトウエアで行ってる。

それでは処理するソフトウエア次第でデータを取りこぼすのでは?と思ったけどリードデータがD7にアサインされているのがミソ。IOポートをリードした後、ROL命令を実行するとリードデータがCarryに入り、その後テープからリードしたデータを格納するアドレスに対してROLを行えば良い。

 

f:id:k_igrs:20180414102949p:plain

記録の方はフリップフロップの出力をトグルさせてカセットテープに記録する。

ソフトウエアは記録するバイトデータのビットが反転していたらカセットインターフェースのアドレスにアクセスしてフリップフロップのデータを反転させる。

f:id:k_igrs:20200513085545j:plain