ArduinoベースのAltair 8800シミュレータキット - レトロコンピュータの構築とプログラミング
コンポーネントと用品
| Arduino Mega 2560 | × | 1 |
| Arduino Due | × | 1 |
| LED(汎用) | × | 36 |
| 汎用NPNトランジスタ | × | 36 |
| 抵抗 10kΩ | × | 36 |
| 抵抗 150Ω | × | 36 |
| ミニトグルスイッチ SPDT On-On | × | 17 |
| モメンタリスイッチ SPDT (On)-Off-(On) | × | 8 |
| フロントパネル用金属シート | × | 1 |
| SparkFun Bluetooth Modem - BlueSMiRF Silver(オプション) | × | 1 |
| microSDカードとSDカードアダプタ(オプション) | × | 1 |
アプリとオンラインサービス
- Arduino IDE
- Arduino DueFlashStorageライブラリ
- Arduino Due soft_uartライブラリ
このプロジェクトについて
Chris Davis氏のAltair-Duinoキットも参考になります。すべてのコンポーネント、PCB、ケース、プリプログラム済みArduino Dueが含まれています。
背景
長年、Altair 8800コンピュータで遊んでみたいと思っていました。しかし、動作するヴィンテージAltairは希少で、入手できても$1,500〜$2,500と高価です。altairclone.comのような選択肢もありますが、それでも$600かかり、限定的な用途のために払うには高すぎます。
幸いなことに、Altair Cloneの開発者Mike Douglas氏が、彼が収集した古いドキュメントやソフトウェアをコミュニティに公開してくれました。これにより、Altairの内部動作や人気の周辺機器に関する豊富な情報が手に入ります。
Arduino Mega 2560の仕様を見て、フロントパネルのLEDとスイッチを接続して独自のエミュレータソフトウェアを書くのに十分なI/Oピンがあるかどうか気になりました。なんと、Arduino Megaにはまさに必要な数のI/Oピンがありました。これで自分だけのAltairクローンを作れます。

Arduino Mega版とDue版の比較
Arduino Megaでシミュレータを動かすことはできましたが、エミュレーション速度はAltairの約25%、エミュレートRAMは6KBのみです(当時としては大容量ですが)。また、MegaのEEPROMは4KBしかないため、シミュレータ内で作成したプログラム/データの永続保存容量も限られます。
一方、Arduino Dueなら十分なメモリがあり、フル64KBのエミュレートRAMをサポートし、Megaより高速に動作します。さらにDueは実行時にフラッシュメモリにデータを保存できるため、シミュレータ自体が使用していない512KBのフラッシュの任意の部分を半永続的なストレージとして利用できます。
Dueを使えば、オリジナルとほぼ同速で動作し、64KBのエミュレートRAMを備え、多くのAltairソフトウェアを含み、さらに32KBの半永続ストレージでエミュレータ内のプログラム/データのロード/セーブが可能なAltair 8800シミュレータが完成します。
目指したもの:本物のAltair 8800の感覚
このプロジェクトの目標は、シミュレータを操作するときにできるだけ「本物の」Altair 8800に近い感覚を得ることです。これには、フロントパネルのライトが可能な限り本物と同じ振る舞いをすることが含まれます。その基準の一つが、フロントパネルの「Kill-the-Bit」ゲームが遊べることです——そしてそれは可能です。
シミュレーションはオリジナルに十分忠実で、Altair 8800のミュージックデモさえ動作します。これはAMラジオがAltairの回路から発生する電磁干渉を拾うことに依存しています!



オリジナルのAltairを持っていないため、すべての情報はドキュメントとビデオから得ました(後述の謝辞参照)。細かな違いはあるかもしれませんが、全体としてオリジナルの振る舞いをかなり忠実に再現しています。既知の(意図的な)違いの一つはHLDAステータスライトです:オリジナルではCPUが外部デバイスによる停止を認識したことを示しますが、この機能はシミュレータで使われないため、ここではファイル(シリアル/テープのキャプチャ/リプレイ)が現在開いていることを示します。
主な特徴
- Altairのフロントパネル要素の振る舞いを正確に再現
- Arduino Due使用時はオリジナルAltair 8800とほぼ同速、Mega使用時は25%速度で動作
- エミュレートRAMサイズ:64KB(Due)または6KB(Mega)
- 多数のAltairプログラムを内蔵し、エミュレータに簡単にロード可能:Pong、Altair 4K BASIC(Microsoft初の製品)、Altair Extended BASIC、MITS Programming System II(Dueのみ)、Altair Time Sharing BASIC(複数ユーザーが同時にBASICを使用可能)
- BASICおよびアセンブラのサンプルプログラムを内蔵し、BASIC/アセンブラに簡単にロード可能
- 1つの88-SIO、88-2SIO、88-ACR(オーディオカセットレコーダーインターフェース)ボードをエミュレート。各シミュレートシリアルデバイスをArduinoのシリアルインターフェースにマッピング可能。デフォルトでは最も一般的な2つ(88-SIOと88-2SIOポート1)がArduinoのメインシリアルポート(115200ボー、8n1)にマッピングされ、USBケーブルでアクセス可能。シリアル- BluetoothドングルをRX/TXピンに接続すれば、Bluetooth対応デバイスをAltairの端末として使用可能
- Arduino Dueでは、メインシリアルインターフェース(USB)とSerial1インターフェース(ピン18/19)を同時に使用可能
- 各シリアルデバイス(ACRテープ含む)に送信されたデータを、最大256ファイルとしてArduinoのローカルストレージ(EEPROMまたはフラッシュ)にキャプチャ/リプレイ可能
- カセットインターフェースはExtended BASICのCSAVE/CLOADコマンドをサポート(ユーザー操作不要で自動サポート)。自作BASICプログラムの開発に最適!
- Cromemco Dazzlerグラフィックボードをエミュレート(追加ハードウェア/ソフトウェアが必要、ドキュメント参照)
- Processor Technology VDM-1ビデオ端末ボードをエミュレート(追加ハードウェア/ソフトウェアが必要、ドキュメント参照)
- 最大16台の88-DCDDディスクドライブをエミュレート(デフォルト設定では4台)。ディスクドライブエミュレーションはオプションだが、ArduinoのSPIヘッダーにSDカードを接続する必要あり。Arduino Dueのみサポート
- 最大4台のハードドライブユニット、ユニットあたり4プラッターの88-HDSKハードドライブコントローラーをエミュレート(デフォルト設定では1台)
- リアルタイムクロックとベクタ割り込み処理を備えた88-RTC-VIボードをエミュレート。これによりAltair Time Sharing Basicが実行可能
- メモリの256バイトページを永続ストレージに保存し、メモリに読み戻し可能。フロントパネルスイッチで入力したプログラムを保存する簡易的な方法を提供
- 多くの設定を統合設定エディタで簡単に変更可能
注意(Due使用時):シミュレータ内でキャプチャまたは保存したすべてのデータは、Dueに新しいスケッチをアップロードすると消去されます。これはデータがフラッシュメモリに保存されており、新しいスケッチのアップロード時にフラッシュが消去されるためです(Dueには永続ストレージ用のEEPROMがありません)。SDカードをDueに接続している場合、保存データはSDカードに格納されるため、新しいスケッチをアップロードしてもデータは失われません。
ドキュメント
シミュレータはAltair 8800とまったく同じように動作するため、オリジナルのAltairのドキュメント(Googleで簡単に見つかります)があれば、フロントパネルスイッチの操作に必要な情報はすべて得られます。
ただし、シミュレータにはオリジナルのAltairにはなかった追加機能や内蔵ソフトウェアが多数あり、それらはフロントパネルのAUX1/AUX2スイッチ(オリジナルでは搭載されていたが未使用)からアクセスできます。これらの機能については、開発中に作成した別ドキュメントで説明しています。ページ数が多く、こちらに全情報を載せると膨大になるため、ソースリポジトリ内のDocumentation.pdfを参照してください。
組み立て手順
目標の一つは、サポート回路を最小限にすることでした。Arduino MegaもDueも、フロントパネルのすべての要素を直接配線するのに十分なI/Oピンを持っています。必要な追加回路は、36個のLEDを駆動するためのトランジスタと抵抗のみです(LEDをArduinoの出力ピンに直接接続し、同時に多くのLEDが点灯すると、総電流がArduinoの制限を超えてしまうため)。
このプロジェクトの完全な回路図を作成するのは面倒で、繰り返しが多く(36個の同一LEDドライバ回路、32個のスイッチ配線)、あまり役に立ちません。そのため、回路図ドキュメントには、各要素をどのArduinoピンに接続するかの詳細なテーブルと、個別のサブ回路(LEDドライバなど)の回路図を記載しています。また、ストリップボード上のLEDドライバコンポーネントのレイアウトを示すFritzingファイルも追加しています。
フロントパネルの作成には、Altairのフロントパネルの高品質スキャン(www.vintage-computer.comで入手)を用い、コピーショップで厚紙に印刷しました。裏打ち(スイッチとLEDを固定するため)には22ゲージの金属シートを使用し、通常の電動ドリルでLEDとスイッチ用の穴を開けました。LEDドライバ回路はストリップボードの断片にはんだ付けし、それが直接LEDにはんだ付けされ、金属シートで固定されています。

フロントパネルの電源スイッチ配線には、Arduinoと同じ電源ソケットをボックスに追加し、フロントパネルスイッチを経由してArduinoに差し込む電源プラグに配線しました。
Arduino Dueを使用する場合、DueのSPIポートにSDカードを接続することで、最大16台の88-DCDDディスクドライブのエミュレーションを有効化できます。回路図ドキュメントの最後のページに詳細な配線を記載しています。
Arduino Dueにスケッチをアップロードする前に、Arduinoコンパイラの最適化設定を「performance」に切り替えてください。デフォルトは「size」になっています(Dueには512KBのフラッシュがあるのに理由不明)。以下のファイルをテキストエディタで開き、-Osをすべて-O3に変更してください:
c:\Users\[user]\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.9\platform.txt
この手順をスキップしても動作しますが、シミュレータの動作が大幅に遅くなります。
シミュレータソフトウェアは、フロントパネルコントロールを接続しないベアボーンのArduino(MegaまたはDue)でも動作します。これにより、フロントパネル要素を主に使わない内蔵プログラム(シリアル端末を主に使用するもの)をかなり実行できます。これを行うには、config.hソースファイルを編集し、#define STANDALONE 1(デフォルトは0)に設定してください。仮想フロントパネル要素の操作方法については、ドキュメントの「デバッグ機能」を参照してください。ただし、これはシミュレータの意図された用途ではありません。フロントパネルハードウェアを作りたくない場合は、PCベースのオールソフトウェアエミュレータの使用をお勧めします。config.hにはシミュレータ機能を含める/除外するための多数のスイッチがあり、デフォルト設定で問題なく動作しますが、シミュレータをカスタマイズしたい場合はここから始めてください。
謝辞
Altairを持っていないため、情報はインターネットから収集しました。Mike Douglas氏(deramp5113、altairclone.com)が制作したAltair 8800のインストラクショナルビデオは大変参考になり、見応えがあります。ビデオ制作に加え、Mike氏はAltair関連のハードウェア/ソフトウェアマニュアルを大量に収集し、自身のサイトで公開しています。
(Mike氏のビデオは、シミュレータ完成後に何をすべきかのアイデアを得るのにも非常に役立ちます)
Martin Eberhard氏のADEXERツールは、ハードドライブサポートの低レベルデバッグに不可欠でした。また、シミュレータで使用されている2つのブートローダーを作成しました:ディスクとミニディスクの両方でブート可能なコンボディスクブートローダー(CDBL)、オリジナルより短く安定したハードディスクブートローダー(HDBL)。
CPUエミュレーションを含むすべてのコードは自分で書きましたが、ハーフキャリー計算とDAA命令の効率的な実装については、i8080コアモデルプロジェクトから着想を得ました。
シミュレータにはAltair 8800用のオリジナルソフトウェアがいくつか含まれています。Mike Douglas氏が膨大な時間をかけて収集し、動作させ、altairclone.comで公開してくれたものです:
- Altair 4K BASIC(MITS 1975)
- Altair Extended ROM Basic(MITS 1975)
- Altair Time Sharing Basic(MITS 1977)
- Kill-the-Bitゲーム(Dean McDaniel、1975)
- フロントパネルを使ったPongゲーム(Mike Douglas)
- 『Daisy, Daisy...』ミュージック(Steve Dompier、1975)
- Music System(Processor Technology 1977)
- MITS Programming System II(MITS 1976)
- Altair Turnkey Monitor(MITS 1977)
- i8080 CPU診断(Microcosm Associates、1980)
- i8080 CPU Exerciser(Frank D. Cringle 1994、Ian Bartholomew 2009)
ディスク/ハードディスクイメージ(ソースアーカイブのdisksサブディレクトリに含む)もaltairclone.comとderamp.com(Mike Douglas氏の個人サイト)から入手しました。CP/M、各種ディスクBASIC、Altair DOS(Fortran含む)などが含まれます。Mike氏がこれらすべてのソフトウェアを発見し、Altairコミュニティで使える動作するディスクイメージを作成したのは驚異的です。ここでは一部のみ使用していますので、altairclone.comやderamp.comでさらに探してみてください。
ディスカッションフォーラム
Altairduino.comのChris Davis氏が、Altair-Duino関連の質問用にGoogleグループを設置しています:
https://groups.google.com/forum/#!forum/altair-duino
自由に訪問し、議論に参加してください!
コード
Arduino Altair 8800シミュレータコード(GitHub)
回路図
完全な回路図(非常に繰り返しが多い)の代わりに、どのピンをどのフロントパネル要素に接続するか、およびサブ回路(LEDドライバ回路など)の回路図を記載したドキュメントを用意しました。ストリップボード上のLED接続レイアウトを示す試みです。少し込み入っていますが、部品の接続関係は理解できるはずです。重要なのは、各LEDのコンポーネントがストリップボード上で5スペース以内に収まることです。これにより、LEDを十分近接配置でき、フロントパネルをオリジナルサイズにできます。
ledstrip_4OVCpRyKQS.fzz
製造プロセス
- Arduino Nano 33 IoT製 フライトシミュレーター2020用コックピットパネル - LCD&CDI表示
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoプロジェクトのための最適化電源ソリューション
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- ゲーム用カスタムArduinoジョイスティックハンドルの製作
- Arduino Nano R3で本格的なCNCマシンを自作する