VIC-1001のこと

今日、若い人から「初めて買ったコンピュータは何?」と聞かれてVIC-1001のことを説明したのだけれど、良い機会なので VIC の思い出をまとめておこう。なお記憶だけを頼りに書くので細部は違っているかもしれない。けど調べずに書く。


僕が中学3年だったか、兄貴がマイコンを買おうと言い始めた。なんでも新しいものはこの兄貴が持ち込んでくる。兄貴と同級のRくんが既に買っているというので見に行き(ご近所なので)、兄貴と折半して貯めてた小遣いで買う事にした。6.9 万円だったか、子供には結構な額だったと思う。

いわゆるスイッチオン BASIC なマシンで、専用モニタなどはなく、RFコンバータ経由で家のテレビに接続し、1ch で受像させた。(関東だと 2ch になるのかな?)

ファミコンみたいなROMカートリッジを挿して起動すれば、そのままゲームマシンになった。RALLY-X が異様によく出来ていて、死ぬほど遊んだ。他もう一つゲームカートリッジ買ったと思ったけど、なんだっけ。

スペック的な事を書いておくと、CPUは6502、1MHzだったと思う。6502はAppleIIやファミコンが使っていた、当時の典型的な8bit CPUのひとつ。BASIC起動後のフリーエリア(プログラムコードや実行時メモリに使える領域)は3.5KBだった。画面表示は22文字x23行と一見変則的に見えるが、今にして思えば512バイトに収まる縦横ドット数が近く、ゲームなどに向いたよい構成だったと思う。

当時はマイコンブームというか、高校の時の友達が同時期に何人か同じ VIC-1001 を買った。あるヤツは BASIC の機能拡張カード(たしか SUPER EXPANDER とか言った)を買い、あるヤツは 16KB RAM カートリッジを買った。僕は PROGRAMMER’S AID PACK だかなんだかを買った。SUPER EXPANDERは追加のメモリとPCGによるグラフィクス命令が追加されていて便利だった。僕もそっち買えば良かったかなあ。代わりにPCGを自作してみたけれど、メモリがほとんど残らず実用性は無かった。この高校の友達はいずれも「計算機数学部」という、まあコンピュータの部活で一緒だった連中で、いまでも付き合いがある。幾らかはこの業界で働いてる。(皆そろそろ定年だけど)

普通に電源を入れて BASIC でゲームなり何なり書いて、カセットテープに保存して、といった使い方をしていたのだけれど、チマチマとイジることはよくやった。これはイジってるうちに入らなけれど、当時のVICユーザ定番の工夫の一つは、HAL 研が作っていた VCX-1001 というカセットテープレコーダーのアダプタを使い、市販のレコーダーを使うことだった。専用のデータレコーダーは高かったから。モノラルのレコーダで、リモート端子が付いているものを使った。

また RALLY-X などはジョイスティックで楽しく遊ぶことができたのだけれど、市販のものは高かったので自作して使っていた。ジョイスティックは汎用品?というか ATARI のものが業界標準品だったから、その回路図が何かの雑誌に出ていたのだと思う。ジョイスティックポートのコネクタを買い、ジョイスティックの中身もマイクロスイッチを使って組んだように思うが、最終的にはパーツ屋で相当品のユニットを買って、ケースを作って使ってた。バネで中立位置に戻るようにはなってなかったと思うので、そこはちょっとパチもんくさかったけどしょうがない。

VIC-1001 は完成品のコンピュータだったけれど、僕自身はその前、つまり中学生の頃は電子工作をやっていた。TTL主体の完全デジタル工作。アナログなことはほとんどやらなかった。2SC1855とかLM386とか555とかは使ったけど、音を本格的に触ることも、電波を飛ばすこともしなかった。デジタル一辺倒。ゲート IC とかカウンタとかデコーダとか組み合わせて実体配線図を描き、だいたい万能基板か、たまにエッチングして作った。エッチングと言っても感光基板は高いので大抵はサンハヤトのレタリングとテープ貼り。(なおブレッドボードなんて便利なものは当時は知らなかった。これって僕だけ?あとラッピングもやったことない。専ら半田付け。)

そういう経験があったので、ジョイスティックを(半分)自作することなどには抵抗が無かった。VCX-1001がパラレル I/O ポートに接続されていて、中身が抵抗など少々とリレー(リモート端子用)なのを見て、こういうの自分でも作れるよなあ、と思ったりしていた。実際、その手のハード的な拡張については VIC は大変に簡単に出来るようになっていた。まあ VIC に限らず、この頃の 8bit マシンは皆そうだったと思う。

たとえばVICだと拡張ポート、というエッジコネクタがあり、そこにバスがモロに出ていた(だからそこにゲームカートリッジを挿せば動く状態を作れた)。またユーザ・ポートには 6522 PIO (Parallel I/O) チップの足がそのまま出ていた。6502 CPUはメモリマップドI/Oだったから、単にそのアドレスに値を書き込みさえすれば、つまり POKE コマンドで値をセットすれば、そのピンに 1/0 が出せた。なんて簡単なんだ。

僕はたくさんの時間を突っ込み、VICですごく多くのことを学べた。それでもさすがに大学に入ると使わなくなっていった(大学にはマトモなコンピュータ、つまりSystem-2060とか FACOM M180II ADがあったから)。ただ、大学三回生の時、なんというかミクロなことをやってみたくて(というか、端末叩いてソフト書くばかりだった今の自分はもうそういうことが出来なくなってるんじゃ無いか、イヤそんな筈は無い、という奇妙な焦燥感に押されて?)、このユーザポートを使ったオモチャを作った。電子ピアノの自動演奏(伴奏)装置だ。

日本橋の質屋で「いつかこれをイジって何かしよう」と思い立って電子ピアノを買ったのは高校生のときだった。61 鍵の、結構大きな奴で、中を開けて配線と基板のパターンを追うと、キーは 8x8 のマトリックス配線になっていて、基板中央に据えられたICチップには3 + 8本の線が入っていた。つまり 8x8 の一方を IC から出る 3bit 出力からデコードして与え、選ばれた(押された)行について 8bit の入力としてスキャンする形で IC に入れていると思えた。

MIDIが出たのは1981年だから僕が高校生のときはギリギリ存在していたはず。でもMIDI音源なんて当時の僕に買えたはずはなく、MIDIプロトコルをちゃんとVICに喋らせるくらいならこうやって自作した方が早かった。なおDX7は1983年。僕がこの自動演奏(伴奏)システムを作ったのは電子ピアノを買って何年も経った1986年で、電子楽器花盛だった。

鍵盤の各キーは通常時は解放で、押せば短絡。複数のキーを同時に押しても構わない作りだった(ただし音高の高い方から4音か5音までしか鳴らない)ので、僕はこのキーと並列に、8列の 8bit ラッチを付けることにした。74LS ICならオープンコレクタだから各ラッチICの出力をただ結線するだけで電子ピアノの IC に与える 8bit ラインが作れる。(とはいえ、鍵盤を完全に外して基板のスイッチ入力(フラットケーブルだった)に置き換えるのは憚られて、僕は鍵盤とラッチ群の 8bit 出力を OR ゲートで合流させた。そのため自動演奏だけでなく、自動伴奏することもできた。)

この 8 並列になっているラッチ IC のチップセレクト信号を電子ピアノの IC から出ている 3bit の走査データからデコードして与えれば良い。バカみたいな設計だけれど、これで実際にうごいた。まあ簡単な作りだこと。TTLバンザイ。

ただラッチの出力側は上のとおりで良いとして、ラッチにどうやって値を与えるかが問題だった、、、あれ?ここどうやったんだっけ?乱暴にユーザポートに出ていた 6522 の出力 8bit をそのまま与えようと思ったらその他の制御ピンが足り無かった、とか無かったかな。。その場合シフトレジスタつけてシリアル転送して 8bit 揃えることになるけど、そんなことをしてた気もする。もう回路図もブツも見当たらない。どこいったんだろう。捨てたのかなあ。

そしてこの 8bit 出力を 8 つのラッチ全部に並列に与え、6522 の残りの PIO ピンで3bit のチップセレクト信号をやはりセットしてから、ラッチへのクロック(セット信号)を与えていた、と思う。これで順繰りに 8 つのラッチに合計 64bit のデータをセットした。ソフトでやるとはいえ、この操作は煩雑なので結構時間が掛かり、動作確認だけBASICでPOKEして行い、データ転送処理は当初想定どおりマシン語で書くことになった。

そうそう。ソフトの話の前に配線のことがある。これを書かなければ。

この回路で悩ましかったのは 8 つのラッチを平面の基板に配置し、入力・出力の 8bit それぞれを結線するのが困難だったことだ。なんどか実体配線図を描いてみたが余りにも広い場所を取り、あまりにも長い配線を大量に引き回すことになる。半田付け箇所も多く、めんどくさい。そこで僕はラッチ IC ひとつだけが載る小さな万能基板を 8枚重ねることにした。8枚の基板を入力 8 ピン、出力 8 ピン、あと電源とGNDの 18 本のスズメッキ線で縦に(串刺し状態で)つなぐ。最下段以外にある IC の足の半田付けミスなんかあったら、スズメッキ線を切り離して再ハンダしないといけない(幸いそのようなことはなく一発で動いた)。これでものすごくコンパクトに回路は仕上がり、後はソフトを作るのみ、となった。

ソフトの話に戻る。とにかく BASIC でやらせるとメチャクチャに遅く、人間が弾いた方が遥かに速い状態になる。僕はこの自動演奏を学園祭のサークルの出展物、つまりデモとして作っており、コンピュータを使ってものすごい早弾きが出来る、一曲が4 秒くらいで終わる、すげー、おもしろーい、というのをやりたかったから、これでは話にならない。まずはデータ転送だけマシン語で書いた(実際にはニモニックで書いてハンドアセンブルした)が、それでもまだまだ遅い。あれこれやって、最終的には楽曲の演奏データ(64bitのキー押し下げ状態データ列を 64 分音符として並べたもの)をメモリに書き込み(ここまではBASIC)、そのあとデータを一定間隔でラッチ回路に流し込む作業については全部マシン語でやることになった。それで十分早くなったが、しかしまだ耳でちゃんとメロディラインが聞き取れる程度の速度が限界で、一曲4秒とはいかず、ちょっと不満が残った。

流す楽曲はチャカチャカした皆が知るものが良かったので、うる星やつらのタイトル曲にした。ただ当時はそうした楽曲について都合よく4パート程度になっている楽譜データなんてなものはなく、せいぜいメロディラインだけか、2パートくらいのもんだった。そこで僕は高校の2年だか3年だかのとき、いつかこういうことをやろうと思って、同級の女の子にこの曲のテープを渡して「これを同時最大 4 音の楽譜にして」と頼んだ。元の楽譜は無いので、テレビで流れていたあの派手なアレンジそのままを耳で聞いて、64 音階の範囲で適当にパート分けしてそれっぽく聞こえるようにして、というお願いね。今にして思うと結構な手間だったはずだが、だいぶ経ってから(もう忘れた頃に?)彼女はちゃんとやって渡してくれた。ちょっと尖った子だったけれど、音楽、特にピアノの才能があって、確か音大に行ったんじゃなかったっけ?ただ僕は高校ではそれを使うことはなく、それから3, 4 年経ってようやっと日の目を見たわけだ。いやあ、作って貰って良かった。

ソフト的にはこの4パートを個別に ON/OFF できるようにしたので、楽譜を見ながら特定パートを自分で弾いて、あとは自動伴奏させるようなことができた。VIC にはフルキーの右側に大きなファンクションキーが四つあるのだけれど、それを各パートのトグルに割りあてて演奏中、動的にON/OFFできるようにしたから、学園祭の出し物としてはそれなりに面白い感じに仕上がったと思う。当時、そういうシステムは余り無かったと思うし。

ともかく、コレを最後に僕は VIC を動かすことはなく、納屋に片付けてしまった。ミクロなことがまだ出来る、という自己暗示を掛けることができて満足したんだろうなあ。面白いプロジェクトだった。

上に書いたように、VIC を買う前、僕はデジタル電子工作をやっていた。ただキットを半田付けするだけなどではなく、自分でロジックを組んで半田付けして遊んでいた。そのためこの当時から僕の中では論理と回路はつながっていた。そんな中学生当時の僕が見ていた書籍はこの二冊。

この時期、父親に買って貰ったテスター(SANWA T-50D)とラジオペンチはまだ使っている。テスターは 10Ωのレンジが接触不良になったけれど、何年か前に何かして直したと思う。いまだに僕にとっての第一テスターだったりする。これで慣れたせいでアナログテスター大好きというかデジタルテスター嫌いになってしまった。単車の発電機の電圧を見るようなシーンではデジタルテスターは役に立たないので大活躍。

こんな電子工作中学生が BASIC プログラムを書き換えると動作が変わるのを目の当たりにしたときの衝撃を想像してほしい。つまり電子回路で何かを変更しようと思ったら、あれこれ設計を見直して半田を剥がして部品をつけ替えて、ひょっとしたら間違えたり手直しなどして何時間も掛けて実現していたようなことが、ささっとその場で作業するだけで反映される。

ソフトウェアってすごいな!

というわけで、それから僕はソフトウェアを書くことに集中したわけだけれど、ただ、BASIC のコードと電子回路は僕の中ではつながらないままだった。つまり高校に行った僕は部活動で幾つかの卓上電子計算機(プログラミング電卓の大型判)や大型機(DEC System2060, M-180II AD などで FORTRAN)を使い始めたけれど、かなり長い間ソフトウェアは「架空」の存在だったんだな。

しかし VIC-1001 のマニュアル (ex, Internet Archive) にはなんと 6502 のニモニック表まで含まれていた。これと僅かながらのマシン語のサンプルコードを参考にして、僕(と一緒にVICをいじっていた同級のOくん)は、なんとか最低限の機械語の動作を把握、、というか断片的に推定した。R先輩(冒頭のRくん、同じ高校・部活の先輩となった)が逆アセンブルツールをもっていて、同級のIくんがプリンタを買ったこともあって夏休みに高校の教室で BASIC ROM (8KB) などを延々と逆アセンブルした結果を印刷して読み込んだりしていた。

やはり上に書いたが VIC というか 6502 は簡単なハードウェア構成で、PIO の 6522 チップは各ピンがそのままメモリマップされている。VIC-1001 の名前の由来である VIC - Video Interface Chip もまたメモリマップされていて、マップされたアドレスに数値を書き込めば、そのままビットの値を反映してピンに電圧が出たり、画面上の文字や色が変わったりした。これがすべて BASIC の PEEK, POKE 文でテストできるのだから話がはやい。メモリ保護とか境界とかそういう下品なものは全く無い。ステキだ。

このあたりを延々とイジって、機械語が命令を読み込んで逐次ハードウェアを制御する仕組み(構造)が推定できた瞬間があった。つまり僕の中でソフトウェアとハードウェアがつながった、ということね。こうすれば CPU というのは作れるな、つまり機械語ってそういうものか、と。ただ、この時僕が推定したのは今で言う RISC というかワイヤード・ロジックなCPUで、マイクロプログラム、という概念は僕には無かった。6502 がワイヤードなのかマイクロプログラムベースなのかは知らないが(簡単すぎるからワイヤードでもできそうだけど)、ともかくマイクロプログラムについては大学に入ってから授業を通して知った。その点では僕の推定には誤りがあったわけだけれど、ともかく頭の中でソフトウェアとハードウェアがダイレクトに結びついた、その瞬間の衝撃は減らない。ああいう感覚(体験)は大事だと思う。

ところで6502はかなり面白いプロセッサで、1MH, 2MHz くらいまでしか出ないし、レジスタは A, X, Y つまりアキュムレータ(演算レジスタ)と2つのインデックスレジスタしか無い。しかし X, Y レジスタはそれぞれ異なる間接参照のアドレッシングモードをもっていたり、アキュムレータは1つしかないがゼロページ(アドレスが $0000〜$00ff)のメモリについてはその読み書きが実質 1 cycle だった。つまり6502は命令のロードとフェッチを内部的にはパイプライン構成で並行処理していた。そのためゼロページに主要なデータを置いておけば、何十本ものレジスタを持っているのと同等の速度で実行できた。ゼロページ向けのアドレッシングモードもあり、普通は LDA $003d などと3バイト書かなければならないところ、LDA $3d と書いて1バイト節約できた。

プロセッサだけでなくシステム設計もかなり興味深いものがあり、プリンタはシリアル・ポートに接続するようになっていた。RS-232c などではなく、独自のものだった、、のかなあ。デバイスには ID が振られており、プリンタにデータを送りたい時は PRINT#5, “TEST” などとデバイスを指定して行った。本体にはシリアルポートは一つしか無いが、プリンタやフロッピーディスクドライブなどにはシリアルポートが二つあり、それを使って複数のデバイスをデイジーチェーンできた。他のマイコンではプリンタはパラレルポート、モデムはシリアルポートと、各周辺機器でインタフェイスが異なり、かつ1対1接続なのでそれ以上拡張性がないものがほとんどだったため、このあたりなかなか興味深い設計だった。

変なところも結構あった。初期に最も謎だったのはビデオメモリだった。仕様ではRAM 5KBとなっており、基板上のSRAMチップ、2114 は 4bit x 1024 word 構成だから、10個で 5KB を作ることになる。しかし 2114 チップは基板上に 11 個だった。なんだこの半端な一個は、と思ったが、答はカラーメモリだった。16色しか VIC チップは表現できないため、このチップは色情報の下位 4 bit だけを見て動く。そこでシステムの設計者は「使われることがない上位 4bit に高価なチップを実装する意味がない」と考えて(ごく当たり前)、「そのアドレスに色情報を割りあてたが、実装したのは下位4bit のみ、上位 4bit ぶんはチップなし」という状態を作った。つまり write の際は上位 4bit ぶんは何を書いても実際には書かれることはなく、read の際は上位 4bit は変な値が得られる(不定値が返っていたと思う)。そういう理由から、マニュアルにはBASIC プログラムで、ある文字の色コードを調べるときは下位 4bit だけマスクして使えと書かれていた。当時僕は色情報については分からないままそのようにして使っていたが、そりゃ高校生にはちょっと分からんよ。

ただある時「VICが下位4bitしか使わないのなら、上位4bitにゲーム盤面の属性情報を置けるのでは?」と思ったことがあった。何しろフリーエリアが3.5KBしかないなかで 22x23文字=0.5K個の属性データが「無駄になっているところ」に書けるなんて大変なことだった。良いアイディアだと思ったものの、x6C書いて読み出したら xECとかが返ってきて何で??と混乱した。そこから散々悩んで基板を見たらチップが一つ(4bit幅)しか載ってない!ああ!無いんだ!だからこんな挙動なんだ!となった衝撃といったら。。。

こういうソフトウェアレベルでの不思議な挙動と実物、マニュアルの記述などが一つ一つ整合されていくと、ああ、なるほど、と納得すると同時に自分がこのシステムを正しく理解できている、という実感が高まっていく。こういう体感はとても重要で、というか、人間はそういう感覚に喜んでヒートアップしていくサルだから、このあたりがうまく作用して僕はこの単純すぎる 8bit マイコンを足場にコンピュータというシステムにのめり込んでいった。

ともあれいろいろと面白いシステムだった。僕はこの中学から高校に掛けての2年ほどの間に、マイコン、プログラミング電卓、大型汎用機(FORTRAN)を並行に使っていった。この時期に僕の中では(マイクロプログラムの概念が無いなど大きな穴があったが)ソフトウェアからハードウェアまでの接続ができていたのは良かったと思う。この時期の体験が僕の計算機に関する理解の骨になった。VICはその中でも大きな重みを持っている、僕にとってはとても大切なマシンだ。

あのとき僕をVICに会わせてくれたのはウチの兄貴とR先輩だった。ありがとう。



Yutaka Yasuda

2024.09.29