Hothotレビュー
昔を思い出しつつPasocomMini PC-8001でマシン語プログラミングしてみた
~カセットデータの読み込み方も紹介
2019年8月10日 11:00
既報のとおり、NEC PCが8月5日に、「PC-8001 40周年記者発表会」を行なうとともに、当時のPC-8001を再現する小さな小さなパソコン(マイコン)、PasonomMini PC-8001を発表した(細部まで再現し、BASICが動作する「PasocomMini PC-8001」参照)。
これは見た目もソックリで手のひらに乗るミニチュアだが、なかにはRaspberry Pi Zero WHが入っており、それでPC-8001を完全にエミュレーションしているのだ。
PasocomMini PC-8001自体の開発はハル研究所で、非売品。NECのPCを購入することで入手可能となっているが、発表会に参加することで入手することができた。筆者は、高校時代にPC-8001でコンピュータを学び、それが今の仕事、生活、すべての原点になっており、本当に思い入れの強いコンピュータだ。当時の記憶を振り返りつつ、このPasocomMini PC-8001を試してみたので、ややディープな内容にはなるが、紹介していこう。
PC-8001とPasocomMini PC-8001
PC-8001は1981年に、筆者が高校に入学してすぐに、それまで貯めてきたお小遣いすべてをつぎ込んで購入したマシン。今年(2019年)が40周年であるとおり、PC-8001自体の発売は1979年だったが、1981年4月に内部のファームウェアとも言えるBASICインタプリタ、N-BASICのバージョンが1.0から1.1になったタイミングだ。
消費税がなかったその当時、本体価格は168,000円だったが、それにPC-8048という89,000円のディスプレイとセットで18万円程度で購入。ただ、1.1への切り替えで生産に時間がかかっていたようで、製品が届くまで1カ月程度を要し、ゴールデンウィーク明けに入手したのを今も覚えている。今回のPasocomMiniに搭載されているのも、その時と同じN-BASIC Ver1.1となっている。
高校時代に買ったPC-8001は、とっくの昔に廃棄してしまったのだが、つい数週間前、ふと気になって中古市場で入手したばかりだった。運よく、完動品で、ディスプレイに接続して動くことを確認したところだったが、そこに小さいヤツがやってきたわけだ。
見た目はそっくりだけど、大きさ的には4分の1のサイズであり、当然キーボードもスイッチ類もすべてダミー。上のカバーを取り外すと、なかに小さなRaspberry Piの基板が入っているだけ。PC-8001の中身と見比べてみると、その差は歴然。ちなみに、このいっぱい並んだICのなかで「NEC D780C-1」というチップがザイログのZ-80コンパチで作られたNECのCPUだ。40年の技術進化はすごいんだな、と改めて感じる次第だ。
Raspberry Pi Zero WHiにはMicro USBが2つ、Mini HDMIが1つ、そしてmicroSDスロットが1つ用意されている。microSDスロットに付属のmicroSDカードを入れるとともに、Micro USB端子の片方に電源供給し、もう片方に一般のPC用のキーボードを接続、Mini HDMIにディスプレイを接続するとPC-8001を起動させることができる。
最初、Micro USB端子に接続できるキーボードなんてもってないぞ……と焦ったが、スマートフォンに周辺機器を接続するために使っていたOTGケーブルを介すことで、ワイヤレスキーボードのUSBレシーバとうまく接続することができた。
ちなみに付属のmicroSDカードにはPC-8001のエミュレータが入っており、このバックアップをとることもできるし、PasocomMiniのサイトからイメージファイルをダウンロードして使うことも可能。ただし、特殊なプロテクトが仕掛けられているので、市販のRaspberry PiにこのmicroSDカードを挿しても動作はしないようだ。
PasocomMini PC-8001に電源投入
電源を入れると、ローダーがソフトウェアの読み込みをはじめ、HAL Laboratoryのコピーライト表示がされた後、昔ながらのPC-8001の画面が現れる。オリジナルのPC-8001の解像度的には640×200ドット(正確には8×8ドットで構成される文字を最大で80×25で表示できるという仕様で、グラフィック表示は160×100しかできない)であり、縦横比率が現在のディスプレイとは違うわけだが、Raspberry Piからは1,280×720で出力されるとともに、その中央部に640×200の画面が展開される格好だ。
【お詫びと訂正】初出時に「640×400ドット」という表記がありましたが、正しくは640×200ドットです。お詫びして訂正させていただきます。
PC-8001など、当時の8bitマイコンをご存知の方ならおわかりのとおり、そのころのほとんどのマシンにはOSという概念がなく、電源を入れると、すぐにBASIC画面が起動するかたちだった。
現在のように、ソフトウェアが簡単に入手できる時代ではなかったため、基本的にはユーザーがBASICのプログラムを入力して動かす。だから所有者は、自然とプログラミングが身につくというか、プログラミングができないと、まともに使うことができなかったのだ。
もっとも、その作成したプログラムをユーザー同士が共有したり、広めるためのメディアとして、コンピュータ雑誌が存在した。当時はアスキー、I/O、マイコン、RAMという4誌だったが、それぞれの雑誌にはプログラムが掲載されており、それをみんな1文字も間違えないよう一所懸命に入力して、動作させるという、なんともローテクな時代だったのだ。
そして入力したプログラムは、電源を落とすと消えてしまうため、保存する必要があるが、USBメモリも、HDDも、フロッピーディスクもない時代(実際にはPC-8001用のFDDは存在していたが、高校生ユーザーには高価すぎて手の届くものではなかった)。そこで、このプログラムを600ボー(600bps)のオーディオ信号に変換した上でカセットテープレコーダに保存したのだ。反対に、プログラムを呼び戻すさいは、カセットテープレコーダを再生して読み込ませるという仕組み。その辺が、PasocomMiniでどうなっているのかも気になっていたところだ。
懐かしのBASICでプログラムを走らせる
さっそく簡単にBASICでプログラムを入力し、RUNコマンドで実行させてみると、普通に動く。
久しぶりに触るBASICは懐かしい感覚であり、古い記憶がフラッシュバックしてくる。とはいえPC-9801時代のMS-DOSの記憶とやや混同しているところもあり、BASICのプログラムなどでグチャグチャになった画面をクリアしようと「CLS」と入力すると、「Syntax Error」と表示され、ピーとビープ音が鳴ってしまう。
どうするんだっけ……と、いろいろ試しているうちに思い出した。「PRINT CHR$(12)」とするのだ。PC-8001は漢字などは扱えず8×8ドットで構成される半角文字、全256文字が扱え(コード番号0~255)、そのうち0~31までがコントロールコードに割り振られていて12番が画面を消すコードだったのだ。
もっとも、そんな大昔の記憶だけを頼りにこのPasocomMiniを使うのは無理だし、はじめてのユーザーにとっては完全に不可能。そこで、PasocomMini独自機能としてヘルプが用意されている。ファンクションキーのF11を押すと、画面右側にオーバーレイされるかたちでQuick Comand Referenceというヘルプ画面が現れ、全18ページで簡単なコマンド紹介が出てくる。
これを頼りにしていけば、なんとか使えそうになっているのだ。ちなみに前述の256文字のキャラクタコード表も、このヘルプ内に表示されるようになっている。
PasocomMini PC-8001でも「平安京エイリアン」が遊べる!
ところで、そのプログラム入力だけでPasocomMiniを使いこなせるという人は、なかなかいないだろう。一方で、40年前、みんながPC-8001で遊んでいたのはやはりゲームだった。まさにインベーダーゲームの後、平安京エイリアンやパックマン……といったものが出てきた時代。せっかくPC-8001が入手できるなら、そんな懐かしいゲームをやってみたい、という人も多いはず。
ただ、そのためにプログラムを入力していくというのは現実的ではない。そこでPasocomMini開発元のハル研究所では、このPasocomMini付属のmicroSDカード内に、当時のゲームプログラム16本を収録し、キー操作だけで実行できるようにしている。具体的にはBASICの画面表示がされている状態でF12キーを押すと、とつぜんカラフルなゲーム紹介画面が登場してくる。
この画面はPC-8001のエミュレーションとはまったく独立したかたちで動いていて、再度F12を押せば、元のN-BASICの状態に戻れるし、ENTER(RETURN)キーを押すと、そのゲームが読み込まれて実行される。
PasocomMiniの開発元である、ハル研究所はゲーム開発メーカーであり、当時からPC-8001のゲーム開発をしていたので、それらを収録しているほか、当時の雑誌に掲載していたプログラムの開発者に連絡を取って許諾を得た上で掲載したとのことで、かなりの苦労があったようだ。この辺の話はAKIBA PC Hotlineにインタビュー記事が掲載されているので、読んでみるとおもしろい(誕生から40年、N-BASICが動く「PasocomMini PC-8001」が降臨!開発者に聞いた)。なお、ハル研究所は来年(2020年)に設立40周年を迎える。
遊んだ覚えのある懐かしいゲームもいっぱいだが、そのレビューは割愛。ここで困ったのは、どうやって元のN-BASICの画面に戻るかという点。ゲームがBASICで構成されているプログラムであれば、STOPキーを押せばプログラムを強制終了されることができるが、これらのゲームはSTOPキーで止まるBASICのプログラムなどではない。
そうBASICでのプログラムでは動作が遅くて使い物にならないため、多くのゲームはマシン語を使ってプログラミングされており、一度動き出したら、止める術がない。そのため、当時はゲームをやめるときには、そのまま電源を切るか、リセットボタンを押して再起動をするという乱暴なことが許されていたのだ。
ところが、このPasocomMiniのPC-8001は、おそらくLinuxのOS上でエミュレーションによって動いているシステム。そのため、いきなり電源を切るとシステム全体が壊れてしまう可能性があり、電源を切るというのはNG。
そこで、用意されているのが2つの手段。1つはF10を長押しして、システム全体をシャットダウンさせるためのモードに移行する方法。もう1つはエミュレーションされているPC-8001だけをソフトリセットする方法。
後者については、F9キーを押すと、PasocomMiniのエミュレーション制御の画面に切り替わるようになっており、MACHINEタブ画面においてRESETを実行するとソフトリセットがかかるのだ。はじめて使うと、戸惑うところが多いが、使っていくと、ものすごくよくできたエミュレータになっていることを実感でき、感動してしまうほど。その最たるものがカセットテープのエミュレーションだ。
PasocomMini PC-8001からmicroSDカードにファイルを保存可能
前述のとおり、オリジナルのPC-8001ではカセットテープレコーダを使ってプログラムのセーブ、ロードができるようになっていた。BASICコマンドとしてはCSAVE、CLOADを使い、たとえば「CSAVE "PC-WATCH"」とすれば、保存ができ、「CLOAD "PC-WATCH"」とすると読み込んで再現することができるようになっていた。当然、ファイル容量によって読み込み、書き出し時間に差が出るし、カセットテープレコーダとテープメディアの相性によってはロードエラーが起きるようなこともあった。
そこで、このPasocomMiniにおいては、カセットテープレコーダを仮想的に実現させ、オーディオデータとしてではなく、バイナリファイルとしてmicroSDに保存する仕組みを実装している。
具体的には、先ほどのリセットと同様にF9を押した画面でMEDIAタブ画面で、保存するファイルをあらかじめ作成。
その後、BASIC画面に戻ってCSAVEを実行することで、ここに保存することができるのだ。
その後MEDIA画面を見ると、そのファイル名の右側に3桁の数字が表示されており、ファイルが大きくなるほど大きな数字になる。
これがなにかの説明はされていなかったが、先日の記者発表会で、開発を担当されたハル研究所の開発担当ディレクターの郡司照幸氏に聞いたところ、カセットテープレコーダのカウンタを意味しているのだとか。本当に細かなところまでマニアックに作り込んでいるのには感激する。このファイルベースでのCSAVE、CLOADなので、カセットテープへの読み書きと異なり、圧倒的に高速だし、当然ながら安定していて、エラーなども起こらないのはうれしいところだ。
じつは、ここで読み書きするファイル形式はCMTファイルというものなのだが、PasocomMini独自というわけではない。これまでコアな愛好家が作り上げてきたPC-8001をエミュレーションするWindows上のソフトなどで使われていたファイル形式だ。
実際、ネットを検索してみると、CMTファイルが公開されていたりもするのだが、これを入手すれば読み込んで使えるようになっている。この際は一度PasocomMiniからmicroSDを取り外した上で、microSDカード内のPCMというフォルダにコピーすればいいのだ。また、読み書きできるのはBASICのプログラムだけでなく、マシン語のプログラムも対象となっているので、昔のPC-8001と比較して圧倒的に扱いやすくなっている。
カセットテープからファイルを読み出す機能も実装
このカセットテープとの関係で、もう1つおもしろいのはPasocomMiniには、当時のカセットテープが残っていれば、それを読み込む機能も備えているという点。これはあらかじめカセットテープを再生した音をデジタル的に録音したWAVファイルを用意しておく必要がある。
簡単に説明しておくと、可能であれば当時使っていたカセットテープレコーダを使用して再生するのがベストだが、なければ手持ちのポータブルプレーヤーでもOK。
そのLINE出力をPCのオーディオ入力に接続して録音するのだ。もちろん最近のUSB端子搭載のカセットプレーヤーで、USB経由での取り込みでもかまわない。ただし、DOLBY NRなどノイズリダクションを搭載のプレーヤーの場合は、その機能をオフに設定すること。そして、レベルオーバーにならない範囲で、なるべく大きなレベルで録音するのが重要だ。
録音するソフトはなんでもかまわないが、ファイルフォーマットとして44.1kHz/8bit/モノラルで保存できるものを使用する。
このようにして保存したWAVをCONVERTフォルダにコピーしておく。その後、PasocomMini側において、CONVタブ画面で変換を行なうと、CMTファイルに変換され、読み込むことができるのだ。
試しに手元にあったカセットテープをこの方法で変換し、読み込んでみたところ完全に再現できたのは、ちょっと感動ものだった。ちなみに、ここで試してみたのは、当時、工学舎の雑誌I/Oに掲載されていた、「スクランブル」というマシン語でのプログラム。ドラクエの開発者でもある現スパイク・チュンソフト会長の中村光一氏が、学生時代に開発し、雑誌で公開したプログラムだ。
このようにマシン語レベルのプログラムが完璧に再現できるというのが、PasocomMini PC-8001のすごいところ。発表会の場で、開発したハル研究所の取締役所長・三津原敏氏に伺ったところ、PC-8001のハードウェア、そしてその内部にあるCPU、Z-80そのものをエミュレーションしていて、その上にホンモノのPC-8001のファームウェアをそのまま搭載しているので、マシン語レベルでのプログラムも含め、実機そのままに動作するのだと話していた。
PasocomMini PC-8001でマシン語をいじる
PC-8001でそのマシン語をいじるためには「MON」コマンドを用いてモニターモードに入る必要がある。このモニターモードに入ると、不愛想に「*」というプロンプト表示がされるだけで、知っていないとどうすることもできない。
さすがにモニターモードに入ると、先ほどのヘルプ画面にも解説はなく、記憶と手探りで操作するしかない。カセットテープの読み込みは「L」コマンドで実行できる一方、書き込みは「W」コマンドに続けて「C000,C0FF」のように、メモリのアドレスを直接指定してやりとりすることまではわかった。
また各メモリに読み込まれているデータを表示するにはダンプコマンドの「D」にアドレスを指定することで、16進数の羅列=マシン語が表示される。
また、書き込みは「S」コマンドで行なう。そんな操作をしていると、いろいろなことを思い出してくるわけだが、まずRAMのメモリ空間は8000H-FFFFHの32KB。このうちF300HからはV-RAMエリアといって、ここに書き込まれたキャラクタコードが画面上にそのまま表示される仕組みとなっているのも、思い出す。試しに、F300Hに直接「A」のキャラクタコード41Hを書き込んでみると、確かに画面左上に表示されていた「NEC」の「N」が「A」に代わっている。
ここまで思い出してくると、やっぱりちょっとマシン語でプログラムを組んで、動くかどうか試してみたくなる。といっても、そんなにしっかりしたプログラムを書く能力も気力もないので、動くかどうかのテストだけ。
というわけで今のV-RAMエリアにA~Zを表示させるという、単純なものを作ってみることにした。そもそも、どんなマシン語命令=ニーモニックがあるのかの記憶も薄れていたので、高校生時代に使っていたZ-80のコード表であるNECの「μCOM-82インストラクション活用表」を引っ張り出してきた。
これを見ながら書いてみたのが、このプログラムだ。
(LIST 1)
C000 21 00 F3 LD HL F300
C003 06 41 LD B,41
C005 3E 0F LD A,1A
C007 70 LBL: LD (HL),B
C008 23 INC HL
C009 23 INC HL
C00A 04 INC B
C00B 3D DEC A
C00C C2 07 C0 JP NZ LBL
CO0F C3 66 5C JP MONITOR
今の時代であれば、コンパイラならぬアセンブルソフトを用いてニーモニックをマシン語変換するところだが、そんなものは手元にないので、高校生当時と同じく表を見ながら手で1つ1つコードを変換していく、ハンドアセンブルという手段でのプログラミング。1つでも間違えれば、暴走してリセットされてしまうという世界。
実際やってみると、こんな短いプログラム作成でも案の定ミスの連発。とはいえ15分程度で、なんとか動くところまで持っていくことができた。
現代のソフトウェア技術の世界から考えると、なんとも原始的な馬鹿馬鹿しい低レベルなプログラムではあるが、まさに童心に帰る楽しい作業でもあった。
ところで、このPasocomMini PC-8001にはもう1つ特筆すべき機能が搭載されている。それが当時PC-8001用に発売されていたサードパーティーの周辺機器、PCG-8100が、やはりソフトウェアでエミュレーションされるかたちで実装されているのだ。
PCGとはProgrammable Character Generatorの略であり、まさにPasocom Miniの開発元であるハル研究所が開発/販売していた機材。
当時49,800円で発売されていたPCGは多くのゲーム好きなPC-8001ユーザーにとっては憧れの機材。そう、これは8×8ドットであらかじめ用意されているキャラクターを自由に好きなキャラクターに変更できるというものだ。かなり強引な仕掛けになっていて、PC-8001に搭載されているキャラクターを収容したROMを引っこ抜き、そこにケーブルを差し込んでキャラクタROMの振りをする。
Pasocom Miniにおいては、先ほどのエミュレーション制御画面において、PCG8100タブを開くと設定ができるようになっている。
当時のPCG-8100にはPCGAIDというソフトが付属しており、これでユーザーがキャラクタを変更できるようになっていたが、ここにはそのソフトが付属していない。そのため、マシン語を使って書き換え作業をする必要があるのだが、さすがにどうすればいいか手元に資料がなかったので断念した。
一方で、このPCGには最大3和音を出すことが可能なサウンド機能が搭載されている。これも本来はマシン語を使って制御するものではあるが、I/Oポートを使って動かすことはできそうなので、BASICからも鳴らすことならできそう。
資料を漁ってみたところ、PCG-8100のマニュアルを見つけ、その制御手段を発見。マニュアルによると、「まずポートOFHに36Hを出力、続いてポート0CHに分周比n(0~FFFFH)の下位バイト、上位バイトの順に出力。最後にポート02Hに08Hを出力すればオン、00Hを出力すればオフ」とあった。
その分周比とは「周波数(Hz)=4000000/n」の関係にある、と記載されている。なんとも不親切なマニュアルではあるが、それをもとに簡単にベーシックで組んだプログラムがこちら。
(LIST 2)
100 INPUT "frequency=";F
110 N=INT(4E+06/F)
120 H=INT(N/256)
130 L=N-H*256
140 OUT &HF,&H36
150 OUT &HC,L
160 OUT &CH,H
170 OUT 2,8
180 FOR I=1 TO 1000:NEXT
190 OUT 2,0
BASICだから、マシン語のように暴走する危険はないものの、やはりちゃんと動くまでに何度かトライしたが、周波数を入力すると、その周波数の音が出るというプログラムとしてできあがった。
ちなみに、このPCGのサウンドも、PC-8001の機能であるBEEP音も、HDMI経由で出力されるためディスプレイがHDMIのサウンドに対応している必要があるのは要注意点だ。
こんな感じで、いちいちプログラムを組まなくては動かせないのが、このPC-8001の醍醐味。今のPCを考えれば比較にならないほど、原始的で不自由なものだけれど、使ってみるとやっぱり楽しい。機会があれば、こんなPasocom Miniで、プログラミング遊びをしてみてはいかがだろうか?