Altair8800によるテストプログラミング例の紹介
Altair8800による機械語のプログラミング例をご紹介してみる。私自身もまだまだ十分に理解できたわけではないが、フロントパネルにあるLEDとスイッチだけでどのようにプログラミングするかの一例をご覧頂きたいと思う。なお操作の全体はムービーに撮ったものをご覧いただければお分かりだと思うが、動画で言葉が足りなかったり分かりづらい点も多々あると思うので以下はその補足といった意味も含め説明を進めてみたい。
本プログラムはポピュラーエレクトロニクス誌1975年2月号「 BUILD THE ALTAIR 8800 MINICOMPUTER PART TWO」でAltair8800の開発者であるMITS社社長のエド・ローバーツと技術者のウィリアム・イエーツにより書かれたものだ。なおプログラムの内容は「メモリ128番地と129番地に格納された数値を足してメモリ130番地に演算結果を格納する」という至極シンプルなものである。


※当研究所所有、ポピュラーエレクトロニクス誌1975年2月号表紙(上)と「 BUILD THE ALTAIR 8800 MINICOMPUTER PART TWO」が掲載されているページ(下)
Altair8800本体にはモニタもキーボードも、ましてやマウスといったデバイスはついていない。フロントパネルにある36個のLEDと25個の金属製スイッチが全てであり、これらを駆使してプログラミングおよびその結果を確認することになる。

※Altair8800 Clone本体
Altair8800 (Clone)を手に入れてからなるべく正確でより良い情報を得たいとその操作方法を探るべくネットでググってはみたが、英語圏の映像や参考となるウェブサイトは意外とあったものの日本語で詳細がわかるような資料はほとんど見つからなかった。無論すでに40年近くも時が過ぎ、今となっては時代錯誤とも思えるマシンだからして当然なのだろう。仕方なく前記したように本家のMITS社が提供したポピュラーエレクトロニクス誌記事のポイントを自身で訳しながらカタツムリのようにゆっくりと…ではあるものの理解を深めつつある。ともあれサンプルプログラムを入力してみる中でAltair8800によるオペレーションに情趣の片鱗を感じている。
※日本語によるAltair8800の操作例、特に動画がほとんどないので無謀ながらまずは挑戦してみた。言葉が足りなかったり分かりにくい箇所もあるはずだが、以下のテキストを参考にしながらご覧頂きたい【音声あり=音量にご注意ください】。
△ステップ1
パワースイッチをONにし、RESET/CLRスイッチでRESETを実行する。
△ステップ2
アドレススイッチのA0からA15までをすべて0位置(下向き)にしてEXAMINE/EXAMINE NEXTスイッチでEXAMINEを実行。これでアドレスのLEDがA0からA15 まで全部が消灯状態になっていればOK。なおD0からD7のデータLEDのいくつかが点灯する場合があるが、それはアドレス0番地にある現在のデータ値を示しているだけなのでここでは無視。
△ステップ3
アキュムレータへのロード命令(58)をD0からD7スイッチにより2進数 (00 111 010)でアドレス0番地に書き込む。D0からD7スイッチをD7から順番に下/下/上/上/上/下/上/下にセットしDEPOSITを実行。これでアドレス0番地に値が書き込まれる。
その際にデータLEDの表示を確認していただきたい。その表示は書き込まれた値通りに点灯しているはずだ。無論LEDの点灯が1を表し消灯が0を表す。また指示通り操作していれば、A0~A15のLEDは全て消灯状態で0番地を指しているはずだ。
△ステップ4
続いてアドレスを指定するが、例えば128番地といったアドレスは16ビットの2進数で表す。具体的にはアドレスの下位8ビットの値はステップ3で実行したアキュムレータへのロード命令に続いて格納し、上位8ビットの値はその次に格納する。
128番地の16ビットの2進数は 0 000 000 010 000 000 だからしてまずD0~D7スイッチを10 000 000(下位8ビット)にしてDEPOSIT NEXTを実行。これで値がメモリ1番地に書き込まれ、A0のLEDが点灯する。なおA0からA7までのLEDを点灯確認する意味はその点灯位置がビット表示としてメモリの番地を表しているからだ。したがってD0~D7の表示と共に、メモリの何番地にデータを間違いなく書き込んだという確認ができるわけだ。
さらにD0~D7スイッチを全て0にしてDEPOSIT NEXTを…。これで上位8ビットの値がメモリ2番地(A1のLEDのみ点灯=00000010)に書き込まれ、「128番地のメモリの値をアキュムレータに読み込め」という指示ができたことになる。
△ステップ5
アキュムレータ内にある数値にもう1つ別の数値を足すためには、現在ある数値を汎用レジスタに移す必要がある。今回の例ではBレジスタを使うが、Aレジスタの値をBレジスタに移せという命令を行う。ちなみにAレジスタとはアキュムレータのことだ。当該の命令は2進数で表現すると01 000 111となるので、D0~D7スイッチでこれを設定しDEPOSIT NEXTを行えばメモリ3番地 (A1とA0のLEDが点灯=00000011) に命令が格納される。
△ステップ6
続いてはメモリ129番地の値をアキュムレータに書き込むロード命令を行う。 操作はステップ3およびステップ4と同様だ。まずD0~D7スイッチを 00 111 010としてDEPOSIT NEXTを実行。これでアキュムレータへのロード命令がメモリ4番地 (A2のLEDが点灯=00000100) に格納された。それからD0~D7スイッチを10 000 001 とし(129の下位8ビット)、DEPOSIT NEXTを実行してメモリ5番地 (A2とA0のLEDが点灯=00000101) に格納する。さらにD0~D7スイッチを全て0 (129の上位8ビット)にしてDEPOSIT NEXTを実行してこの値をメモリ6番地 (A2とA1のLEDが点灯=00000110) に格納する。
△ステップ7
次にD0~D7スイッチを10 000 000(128)としてDEPOSIT NEXTを実行し、メモリ7番地 (A2とA1とA0のLEDが点灯=00000111) に加算命令を書き込む。この命令はBレジスタの値をアキュムレータの値に加算するものだ。
△ステップ8
今度はメモリ130番地に加算結果を書き込むために、まずD0~D7スイッチを 00 110 010としてからDEPOSIT NEXTを実行しメモリ8番地 (A3のLEDが点灯=00001000) に加算命令を書き込む。
次にD0~D7スイッチを10 000 010にしてからDEPOSIT NEXTを行う。これで130番地を表す2進数の下位8ビットがメモリ9番地 (A3とA0のLEDが点灯=00001001) に格納された。さらにD0~D7スイッチを全て0にしてDEPOSIT NEXTを実行し、130番地を表す2進数の上位8ビットをメモリ10番地 (A3とA1のLEDが点灯=00001010) に格納。
△ステップ9
これでメモリ128番地の値と129番地の値を加算し、結果を130番地に書き込むプログラムが入力できたことになる。後はジャンプ命令を使って0番地に処理を戻せば、この加算処理を好きなだけ繰り返せるわけだ。
D0~D7スイッチを11 000 011にしてDEPOSIT NEXTで11番地 (A3とA1とA0のLEDが点灯=00001011) にジャンプ命令を書き込み、さらにD0~D7スイッチを全て0にしてからDEPOSIT NEXTを2回実行する。これにて0番地を示す値がメモリ12番地と13番地 (A3とA2とA0のLEDが点灯=00001101) に格納できたことになる。
△プログラムの実行
以上で加算プログラムは入力できたが実行前に加算する数値をメモリ128番地と129番地に入力する必要がある。ここでは128番地には 12 を、そして129番地には 8 を入力し12+8 の計算を行う。
A0~A15スイッチを 0 000 000 010 000 000 (128の2進数表記) にしてからEXAMINEを行い (A7のLEDが点灯=10000000)、D0~D7スイッチで00 001 100 (12の2進数表記) を設定してDEPOSITを行う。さらにD0~D7スイッチを 00 001 000 (8の2進数表記) にしてDEPOSIT NEXTを行い12と8をそれぞれ128番地と129番地に格納する。
次にA0~A15スイッチを全て0にしてEXAMINEを行う。これでアドレスLEDは全て消灯になっていることを確認。そしてRUNスイッチでプログラムの実行を開始する。D0~07およびA0~A7のLEDが中途半端に点灯しているように見えるが、これはプログラムが毎秒3万回ほどのスピードで実行していることを示すものだ。
△演算結果を確認
頃合いを見てSTOPスイッチで動作を止める。A0~A15スイッチで加算結果が格納されている130番地 (0 000 000 010 000 010) を指定しEXAMINEを実行するとD0~D7のLED表示が 00 010 100 となる。これは申し上げるまでもなく2進数で10進数では 20 を意味する。すなわち 12+8 の加算結果が正確に演算されたことを示している。

※参考資料のひとつ、ALTAIR COMPUTER SYSTEMのドキュメンテーション(当研究所所有)
以上のオペレーションのうちで加算プログラムに関係する部分、すなわち上記のステップ3からステップ9までをニーモニックおよびビットパターンで表すと次のようになる。

■エピローグ
本稿は冒頭でご説明したとおり、ポピュラーエレクトロニクス誌に載った記事の抄訳のつもりであり、かつその記事に沿って実機を操作した結果である。とはいえまだまだ未熟なマシン語のプログラミングに関することでもあり大いなる勘違いや間違いを犯している可能性もあるが、オペレーションした結果は前記「演算の結果を確認」のとおり、正しい演算結果を導き出したことは確かだ。
それにしてもモニターもキーボードもないコンピュータというものがどれほど不便なのかという事を再認識したが、反面このスイッチとLEDしかない最低限のシステムを前にすると最新鋭のパソコンには感じられない不思議な魅力に圧倒される。そしてスイッチをひとつひとつ「カチッ、カチッ」と操作するとき、キーボードを打つのに慣れた指先に新しい感覚が宿ってくるようにも思える。またこのAltair8800を使い倒した先人たちにとってこのマシンは現在のパソコンに向かう我々とは違い、決してブラックボックスではなかったのだろうと想像している。
動作原理を理解し、かつ可能性と限界を知りつつ、ビル・ゲイツやスティーブ・ドンビアあるいはホームブリュー・コンピュータ・クラブの面々は嬉々としてこのマシンに自分たちの未来を覗いていたに違いない…。
本プログラムはポピュラーエレクトロニクス誌1975年2月号「 BUILD THE ALTAIR 8800 MINICOMPUTER PART TWO」でAltair8800の開発者であるMITS社社長のエド・ローバーツと技術者のウィリアム・イエーツにより書かれたものだ。なおプログラムの内容は「メモリ128番地と129番地に格納された数値を足してメモリ130番地に演算結果を格納する」という至極シンプルなものである。


※当研究所所有、ポピュラーエレクトロニクス誌1975年2月号表紙(上)と「 BUILD THE ALTAIR 8800 MINICOMPUTER PART TWO」が掲載されているページ(下)
Altair8800本体にはモニタもキーボードも、ましてやマウスといったデバイスはついていない。フロントパネルにある36個のLEDと25個の金属製スイッチが全てであり、これらを駆使してプログラミングおよびその結果を確認することになる。

※Altair8800 Clone本体
Altair8800 (Clone)を手に入れてからなるべく正確でより良い情報を得たいとその操作方法を探るべくネットでググってはみたが、英語圏の映像や参考となるウェブサイトは意外とあったものの日本語で詳細がわかるような資料はほとんど見つからなかった。無論すでに40年近くも時が過ぎ、今となっては時代錯誤とも思えるマシンだからして当然なのだろう。仕方なく前記したように本家のMITS社が提供したポピュラーエレクトロニクス誌記事のポイントを自身で訳しながらカタツムリのようにゆっくりと…ではあるものの理解を深めつつある。ともあれサンプルプログラムを入力してみる中でAltair8800によるオペレーションに情趣の片鱗を感じている。
※日本語によるAltair8800の操作例、特に動画がほとんどないので無謀ながらまずは挑戦してみた。言葉が足りなかったり分かりにくい箇所もあるはずだが、以下のテキストを参考にしながらご覧頂きたい【音声あり=音量にご注意ください】。
△ステップ1
パワースイッチをONにし、RESET/CLRスイッチでRESETを実行する。
△ステップ2
アドレススイッチのA0からA15までをすべて0位置(下向き)にしてEXAMINE/EXAMINE NEXTスイッチでEXAMINEを実行。これでアドレスのLEDがA0からA15 まで全部が消灯状態になっていればOK。なおD0からD7のデータLEDのいくつかが点灯する場合があるが、それはアドレス0番地にある現在のデータ値を示しているだけなのでここでは無視。
△ステップ3
アキュムレータへのロード命令(58)をD0からD7スイッチにより2進数 (00 111 010)でアドレス0番地に書き込む。D0からD7スイッチをD7から順番に下/下/上/上/上/下/上/下にセットしDEPOSITを実行。これでアドレス0番地に値が書き込まれる。
その際にデータLEDの表示を確認していただきたい。その表示は書き込まれた値通りに点灯しているはずだ。無論LEDの点灯が1を表し消灯が0を表す。また指示通り操作していれば、A0~A15のLEDは全て消灯状態で0番地を指しているはずだ。
△ステップ4
続いてアドレスを指定するが、例えば128番地といったアドレスは16ビットの2進数で表す。具体的にはアドレスの下位8ビットの値はステップ3で実行したアキュムレータへのロード命令に続いて格納し、上位8ビットの値はその次に格納する。
128番地の16ビットの2進数は 0 000 000 010 000 000 だからしてまずD0~D7スイッチを10 000 000(下位8ビット)にしてDEPOSIT NEXTを実行。これで値がメモリ1番地に書き込まれ、A0のLEDが点灯する。なおA0からA7までのLEDを点灯確認する意味はその点灯位置がビット表示としてメモリの番地を表しているからだ。したがってD0~D7の表示と共に、メモリの何番地にデータを間違いなく書き込んだという確認ができるわけだ。
さらにD0~D7スイッチを全て0にしてDEPOSIT NEXTを…。これで上位8ビットの値がメモリ2番地(A1のLEDのみ点灯=00000010)に書き込まれ、「128番地のメモリの値をアキュムレータに読み込め」という指示ができたことになる。
△ステップ5
アキュムレータ内にある数値にもう1つ別の数値を足すためには、現在ある数値を汎用レジスタに移す必要がある。今回の例ではBレジスタを使うが、Aレジスタの値をBレジスタに移せという命令を行う。ちなみにAレジスタとはアキュムレータのことだ。当該の命令は2進数で表現すると01 000 111となるので、D0~D7スイッチでこれを設定しDEPOSIT NEXTを行えばメモリ3番地 (A1とA0のLEDが点灯=00000011) に命令が格納される。
△ステップ6
続いてはメモリ129番地の値をアキュムレータに書き込むロード命令を行う。 操作はステップ3およびステップ4と同様だ。まずD0~D7スイッチを 00 111 010としてDEPOSIT NEXTを実行。これでアキュムレータへのロード命令がメモリ4番地 (A2のLEDが点灯=00000100) に格納された。それからD0~D7スイッチを10 000 001 とし(129の下位8ビット)、DEPOSIT NEXTを実行してメモリ5番地 (A2とA0のLEDが点灯=00000101) に格納する。さらにD0~D7スイッチを全て0 (129の上位8ビット)にしてDEPOSIT NEXTを実行してこの値をメモリ6番地 (A2とA1のLEDが点灯=00000110) に格納する。
△ステップ7
次にD0~D7スイッチを10 000 000(128)としてDEPOSIT NEXTを実行し、メモリ7番地 (A2とA1とA0のLEDが点灯=00000111) に加算命令を書き込む。この命令はBレジスタの値をアキュムレータの値に加算するものだ。
△ステップ8
今度はメモリ130番地に加算結果を書き込むために、まずD0~D7スイッチを 00 110 010としてからDEPOSIT NEXTを実行しメモリ8番地 (A3のLEDが点灯=00001000) に加算命令を書き込む。
次にD0~D7スイッチを10 000 010にしてからDEPOSIT NEXTを行う。これで130番地を表す2進数の下位8ビットがメモリ9番地 (A3とA0のLEDが点灯=00001001) に格納された。さらにD0~D7スイッチを全て0にしてDEPOSIT NEXTを実行し、130番地を表す2進数の上位8ビットをメモリ10番地 (A3とA1のLEDが点灯=00001010) に格納。
△ステップ9
これでメモリ128番地の値と129番地の値を加算し、結果を130番地に書き込むプログラムが入力できたことになる。後はジャンプ命令を使って0番地に処理を戻せば、この加算処理を好きなだけ繰り返せるわけだ。
D0~D7スイッチを11 000 011にしてDEPOSIT NEXTで11番地 (A3とA1とA0のLEDが点灯=00001011) にジャンプ命令を書き込み、さらにD0~D7スイッチを全て0にしてからDEPOSIT NEXTを2回実行する。これにて0番地を示す値がメモリ12番地と13番地 (A3とA2とA0のLEDが点灯=00001101) に格納できたことになる。
△プログラムの実行
以上で加算プログラムは入力できたが実行前に加算する数値をメモリ128番地と129番地に入力する必要がある。ここでは128番地には 12 を、そして129番地には 8 を入力し12+8 の計算を行う。
A0~A15スイッチを 0 000 000 010 000 000 (128の2進数表記) にしてからEXAMINEを行い (A7のLEDが点灯=10000000)、D0~D7スイッチで00 001 100 (12の2進数表記) を設定してDEPOSITを行う。さらにD0~D7スイッチを 00 001 000 (8の2進数表記) にしてDEPOSIT NEXTを行い12と8をそれぞれ128番地と129番地に格納する。
次にA0~A15スイッチを全て0にしてEXAMINEを行う。これでアドレスLEDは全て消灯になっていることを確認。そしてRUNスイッチでプログラムの実行を開始する。D0~07およびA0~A7のLEDが中途半端に点灯しているように見えるが、これはプログラムが毎秒3万回ほどのスピードで実行していることを示すものだ。
△演算結果を確認
頃合いを見てSTOPスイッチで動作を止める。A0~A15スイッチで加算結果が格納されている130番地 (0 000 000 010 000 010) を指定しEXAMINEを実行するとD0~D7のLED表示が 00 010 100 となる。これは申し上げるまでもなく2進数で10進数では 20 を意味する。すなわち 12+8 の加算結果が正確に演算されたことを示している。

※参考資料のひとつ、ALTAIR COMPUTER SYSTEMのドキュメンテーション(当研究所所有)
以上のオペレーションのうちで加算プログラムに関係する部分、すなわち上記のステップ3からステップ9までをニーモニックおよびビットパターンで表すと次のようになる。

■エピローグ
本稿は冒頭でご説明したとおり、ポピュラーエレクトロニクス誌に載った記事の抄訳のつもりであり、かつその記事に沿って実機を操作した結果である。とはいえまだまだ未熟なマシン語のプログラミングに関することでもあり大いなる勘違いや間違いを犯している可能性もあるが、オペレーションした結果は前記「演算の結果を確認」のとおり、正しい演算結果を導き出したことは確かだ。
それにしてもモニターもキーボードもないコンピュータというものがどれほど不便なのかという事を再認識したが、反面このスイッチとLEDしかない最低限のシステムを前にすると最新鋭のパソコンには感じられない不思議な魅力に圧倒される。そしてスイッチをひとつひとつ「カチッ、カチッ」と操作するとき、キーボードを打つのに慣れた指先に新しい感覚が宿ってくるようにも思える。またこのAltair8800を使い倒した先人たちにとってこのマシンは現在のパソコンに向かう我々とは違い、決してブラックボックスではなかったのだろうと想像している。
動作原理を理解し、かつ可能性と限界を知りつつ、ビル・ゲイツやスティーブ・ドンビアあるいはホームブリュー・コンピュータ・クラブの面々は嬉々としてこのマシンに自分たちの未来を覗いていたに違いない…。
- 関連記事
-
- 新年明けましておめでとうございます (2015/01/01)
- ブログの解析でApple Inc.からのおかしなアクセスを発見?! (2014/12/31)
- ドメイン話しとブックマーク再確認のお願い (2014/12/19)
- 2014年Macテクノロジー研究所的10大ニュース (2014/12/15)
- スティーブ・ウォズニアックの発言が変だ!? (2014/12/10)
- Altair8800によるテストプログラミング例の紹介 (2014/12/08)
- Altair8800 Cloneに思いを寄せて〜 Altair8800 って、どんなコンピュータなのか? (2014/11/21)
- 撮影小物として木製ハンドモデルを手に入れた... (2014/11/14)
- 私にとっての "最後のコンピュータ" とは? (2014/11/12)
- Yosemiteへのアップデートで生じたトラブルの覚書 (2014/11/10)
- Apple 1、9700万円で落札というニュースに接して... (2014/11/07)