世界初の市販パーソナルコンピュータとして知られる「Apple II」を、ワンボードマイコン「Arduino Uno」で再現する様子が、Arduinoを使った電子工作をブログで紹介するダミアン・ペケット氏によって公開されています。

Turning The Arduino Uno Into An Apple ][

http://dpeckett.com/turning-the-arduino-uno-into-an-apple

Apple IIは1977年、Apple共同創業者のスティーブ・ウォズニアックによって設計された世界初の個人向けコンピュータで、まさしく歴史に残るモデルです。ペケット氏は「現代のマイクロコンピュータがどれほどパワフルなのか」を証明するために、この1980年代の歴史的な名機をArduino Unoを使って再現しようと決意したとのこと。



Apple IIはCPUに「MOS 6502」を搭載しています。なお、MOS 6502は当時としては破格の安さで登場したCPUで、その互換CPUがファミリーコンピュータPCエンジンなどにも用いられたことでも知られています。Apple IIをエミュレートするための第一歩は、MOS 6502を完全にエミュレートすることだったとのこと。

ANSI Cを使って書かれたウォズニアックのコードはBCD演算をサポートしないシンプルなもの。また、MOS 6502の命令セット自体、各オペコードが8ビットの固定長、56個の命令、13個のアドレスモードとシンプルなものだとのこと。



MOS 6502のプログラミングガイドを読破してMOS 6502のエミュレートが完了すると、ペケット氏はAppleのファームウェアをシミュレートする作業に移行しました。しかし、原因不明のバグに悩まされて、この作業には大いにイライラさせられたそうです。

Apple IIの画像表示はビデオメモリの1ビットが画面上の1ピクセルに対応しています。



ペケット氏はArduino UnoのUSBインターフェースを使ってビデオインターフェースを設計。なお、Arduino Unoのメモリを節約するためにフレームバッファの格納を二次プロセッサに任せているとのこと。



これはApple IIのビデオインターフェースのXORゲートのブロックダイアグラム。



XORを再現する擬似コードはこんな感じ。



Apple IIは独自のキーボードプロトコルを採用していました。そのため、キー入力の結果をArduinoで簡単に扱えるPS/2デバイス対応に変換する必要があります。なお、下記URLからペケット氏作成のキーボードデコーダーをダウンロード可能です。

http://static.dpeckett.com/apple/keyboard.c

これはApple IIのデフォルトのキーコード。



これはキーボードタイミングを示すダイアグラム。



Apple IIは外部記憶装置としてカセットタイプのインターフェースを採用。データは少なくとも1500baud(ボー)のシンプルな周波数シフトキーで保存していました。



Apple IIのカセットインターフェースで採用されたZero Crossing Detectorの概略図はこんな感じ。



記憶用カセットインターフェースをArduino Unoで扱えるように、ソフトウェアで復調するとこんなプログラムになるとのこと。



そして、Apple IIを完全に再現するArduino Unoエミュレーターが完成。なお、Arduino UnoエミュレーターはAtmega328pを搭載しており、オリジナルのApple IIのMOS 6502と比べてパフォーマンスは5分の1から8分の1程度とのこと。



Arduino Unoエミュレーターでマンデルブロ集合をプログラムすると……



こんな感じで出力結果を得られました。



なお、ペケットさんのブログでは、Apple IIを完全に再現したArduino Unoエミュレーターが実際に動く様子をムービーで確認することができます。

Turning The Arduino Uno Into An Apple ][