CP/Mに夢中♪

CP/Mに夢中♪

CP/Mは昔から名前だけは知っていたのだけど、自分で動かしたことはあまりなくて、知人宅でPC-8001で動くCP/Mを少しいじってほうこんなものか... とやっていた程度だ。
8bitマシンはPC-8001mkIIしか持ってなくて、ほどなくPC-9801に移行してしまったのでディスクがないと動かないCP/Mを自 分のマシンで動かすことはできなかったのだ。その後PC-9801では(たぶんPC-8001にも少しのI/Fを追加することでつなぐことができたはず の)外付けミニフロッピーユニットを使っていたので、頑張ればCP/Mだって動かすことはできたはずなんだけど、わたしの中で8bitマシンはテープベー スのBASICマシンで終わってしまっていた。当時から、「CP/Mを使えばすごいことができるらしいぞ」とは知っていたのだけど、やはりガキだったんだ なぁ、それよりもグラフィックがどうだとかサウンド機能がどうだとかいったことの方が気になっていたようだ。
PC-9801では、アセンブラを使うためだけにCP/M-86を起動することもあったが、そのうちアプリケーションの豊富なMS-DOSばかりいじるようになり、CP/Mは記憶の彼方に埋もれていったのだった。

今やCP/Mとそのアプリケーションは商品価値を失ったということで多くがFreeで公開されている。当時は夢でしかなかった高価なソフトを楽し めるのだ。今わたしは小さなプログラムたちに夢中になっている。Windowsの先祖筋にあたるOSなので温故知新という意味でも面白いんじゃないかと思 う。

まずは実行環境を用意しよう。
ヤフオクなどでZ80マシン(QC-10とかMZ-2500とか)を落とすってのもオツなんだけど、なにしろ20年以上経過しているものだからちゃんと動くかどうかわからないし資料も少なくて苦労しそうだ。なにより意外なほどお金(と場所)が必要になる。
そこで、エミュレータを使おう。Windowsならこの辺がいいのではないだろうか:
CP/M program EXEcutor for Win32

あるいはこんなのも面白そうだ:
CP/M Player for Win32
しかしこの作者さんは本当にスゴイ!様々な機種のエミュレータを作っているパワーには脱帽するしか。

実行環境だけあっても面白くないので(CP/Mの面白さはソフトウェア資産にある)、ソフトウェアを入手しよう。
まずはこちら:
The Unofficial CP/M Web site
CP/Mの権利を持っているCaldera社の許諾を受けたサイトで、DigitalReserch社の製品バイナリなどがある。

Commercial CP/M Software Archive
WordMasterを探していたらたどり着いた。
TurboPascalとかMultiplanといった有名どころが揃っている。
せっかくだからMicrosoftBASICも使ってみよう。

Walnut Creek CP/M CD-ROM Online
色々なものがごちゃごちゃと入ったCD-ROM。

HI-TECH Z80 CP/M C Compiler
HI-TECH Cといえば今でもPIC用など組込コンパイラとしては最高峰のひとつに数えられるものなのだけど、そのCP/M版はなんとフリーウェアになっている。 Z80用のフリーなコンパイラとしてはsdccなどがあるんだけど、どうもかなりbuggyだとのことで評判がよろしくない。高品質なコンパイラがフリー で手に入るとはありがたいことだ。
なおHI-TECH Cはかなり最近のコンパイラの部類に入るようでANSI準拠してたりとなかなか高機能だ。CP/M時代の古いコンパイラとしてはBDS Cなんてものもある:
BDS C

あるいはSmall-Cというのもある。サブセットでフリーなCコンパイラとしてよく使われていた。上記"Unofficial CP/M Web site"などで入手できる。

さてそれでは実行してみよう。MicrosoftBASIC(MBASIC.COM)をCP/M EXEcutor(cpm.exe)と同じディレクトリに置いてコマンドプロンプトから、

cpm mbasic


すると、かつてBASICを使ってた人ならおなじみのプロンプトが立ち上がる。

C:\misc\CPM>cpm mbasic
BASIC-80 Rev. 5.21
[CP/M Version]
Copyright 1977-1981 (C) by Microsoft
Created: 28-Jul-81
39474 Bytes free
Ok
10 PRINT "hello,world"
run
hello,world
Ok


ゲームのひとつでもやってみようか。上記 "Commercial CP/M Software Archive" に、ccgames.zipというファイルがある。なんだろうと思って開けてみたらなんとその昔ASCII出版から翻訳が出ていた「マイクロコンピュー タ・ゲーム集」のナカミでないの。懐かしいなあ。小学生の頃楽しんでた本だ。
ということでこの中からAcey Ducyなるゲームを実行してみよう。100ドルの資金を元手にして、2枚のカードが表向きに配られ、次のカードがその2枚の間になるかならないかを賭ける。
アーカイブからほどいて取り出し、やはり同じディレクトリに置いておく(もっとスマートな方法もあるんだろうけど、なにしろCP/Mにはディレクトリなんてないし)。
ちょっとだけ問題があって、最終行が

1050 RUN "MENU"


となっていて、終了するとメニュープログラムが動いてしまう。次にやることへの伏線として、修正しよう。

1050 END 'RUN "MENU"


では実行してみよう。

C:\misc\CPM cpm mbasic ACEYDUCY

ACEY DUCEY CARD GAME


CREATIVE COMPUTING MORRISTOWN, NEW JERSEY


ACEY-DUCEY IS PLAYED IN THE FOLLOWING MANNER:

THE DEALER (COMPUTER) DEALS TWO CARDS FACE UP.
YOU HAVE AN OPTION TO BET OR NOT BET DEPENDING
ON WHETHER OR NOT YOU FEEL THE CARD WILL HAVE
A VALUE BETWEEN THE FIRST TWO.

IF YOU DO NOT WANT TO BET, INPUT A 0


YOU NOW HAVE 100 DOLLARS.

HERE ARE YOUR NEXT TWO CARDS:
5
6

WHAT IS YOUR BET?


5と6の間って確率は低いので降りる。

WHAT IS YOUR BET? 0
CHICKEN!!


おいおいいきなりチキン呼ばわりかよ。

HERE ARE YOUR NEXT TWO CARDS:
6
9

WHAT IS YOUR BET? 100
2
SORRY, YOU LOSE.


SORRY, FRIEND, BUT YOU BLEW YOUR WAD.


TRY AGAIN (YES OR NO)?


男なら一発勝負だ!と負けてみた。

現代のマシンなら充分以上に高速に動作するんだけど、「BASICはインタプリタだから遅い!」と感じていた昔をしのんでBASCOM(BASICコンパイラ)を使ってみよう。まずはBASCOM.ZIPのナカミを同じディレクトリにぶちまけておく。
次に、BASCOMを動かすのは少々面倒なので、SUBMITファイルを作ってしまおう。これはバッチファイルの先祖なんだが、CP/Mはこんなものも外部コマンドとして実現していたのだ。
BC.SUBという名前のテキストファイルを作る。ここでWordMasterを使ったりするとまた雰囲気が出ていいかも;-)

BASCOM $1,$1=$1
L80 $1/E,$1/N


ではコンパイルしてみよう。

C:\misc\CPM>cpm rccp
RCCP 1.0
b>submit bc ACEYDUCY

b>BASCOM ACEYDUCY,ACEYDUCY=ACEYDUCY

00000 Fatal Error(s)
28638 Bytes Free

b>L80 ACEYDUCY/E,ACEYDUCY/N

Link-80 3.44 09-Dec-81 Copyright (c) 1981 Microsoft

Data 4000 49A1 < 2465>

44186 Bytes Free
[402C 49A1 73]

b>dir ACEYDUCY.*
b: ACEYDUCY BAK : ACEYDUCY BAS : ACEYDUCY COM : ACEYDUCY PRN : ACEYDUCY REL


これで出来上がったACEYDUCY.COMが実行ファイルだ。なんと2.5KBしかない。
(それなりのプログラムなんだけどさ)

もうちょっと現代的にCのプログラムでも書いてみようか。上記HI-TECH Cを使ってみよう。やはりアーカイブをほどいておく。

C:\misc\CPM>cpm rccp
RCCP 1.0
b>type hello.c
#include

int main(int argc, char **argv){
 int i;
 printf("hello,world.\n");
 for(i=0;i<10;i++){
  printf("%d\n",i*i);
 }
}

b>c hello.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE

b>hello
hello,world.
0
1
4
9
16
25
36
49
64
81

b>


プログラムをしていればCP/M自体の資料も必要になってくるだろう。
明倫館を探索してもなかったBIOS(そう、現在も使われているBIOSの語源はこのOSなのだ)やBDOSの資料なのだが、どこかにあるはずだと探していたらここで見つけることができた。

この頃から、PCの性能は1万倍ほどまでに上がっている。
でも、現代のPCの1万分の1しかないちっぽけなリソースで、今と同じようなことができてしまうというのが、たまらなく面白いのだ。
そしてちょっと考えてしまう。果たしてPCは当時の1万倍便利になったのだろうか?と。

(Nov. 9, 2006)

物欲進行中

物欲はいつもとーとつに巻き起こるものであって、今モーレツにPC-G850Vが欲しかったりする。
冷静に考えるとポケコンは2台ばかり所有してたりするんだけど、やはり最新機種だけにそこは21世紀に設計されたものだけあって細かいところが実によくできているのに惚れ込んでしまったのだ。こうなると後戻りはできない。
そこでヤフオクを覗いてみると、あるではないか。状態も良さげだしお値段も4,000円くらいだった。新品が20,000円くらいであることを考えるとまぁこんなもんかなと思いウォッチリストに。

ちょっと用事があって出かけてから帰宅してみると... なんと!値が上がりまくってるじゃないか!もうじき7,000円という勢い!
同好の士がそんなに沢山いるんだろうか?いやわたしは仕事で使おうと思ってるんだけどね... f^^;;

今モーレツに悩んでおります。今どきZ80マシンにあんまり金かけたくないんだけど、自分で作ること考えたら絶対にこの値段になんないしなぁ...

(Oct. 1, 2006)

Z80への愛

なぜ今どきPC-G850Vなのかというと、CPUがZ80だから、ということはあるかもしれない。
最初にわたしが見た「マイコン」はPC-8001で、その後自分で初めて手にしたマシンがPC-8001mkII、中学校で遊んでいたのが PASOPIA7やらMSXやらだったので(これらのパソコンのCPUはどれもZ80だった)、いわば「刷り込み」のように「Z80ならなんとかなる」と いう感覚が身についてしまっているのだ。何かと影響を受けやすい10歳の頃の話だし、その後実際にZ80でいくつかプログラムを書いたという経験もそれを 裏打ちしている。

正直なところ、今はそれほどZ80を愛しているわけじゃない。
アセンブラで何かを書いた経験となるとx86の方が多いし、憶えたての頃はよく思えたZ80のニモニック体系も他を知ってしまうといくつもの命令 群を無造作にまとめてしまっただけの大雑把なものに思えてしまって欠点ばかり目に付いてしまうのである。大体、今どきメモリがたったの64KBしかハンド リングできないとか(バンク切り替えとか、I/Oマップを使ってさらに64KB増やすとかいった裏ワザはあるけどね)、相対ジャンプが8bit幅でしか使 えないとか、そもそも役割分担が決まりすぎたレジスタ構成だとか、どれもコンパイラが常識の現代のプログラミング環境からすると「時代遅れ」の感は否めな いのである。
マイコンがいじれるだけでなにか嬉しかった小学生の頃は、これらが欠点とは感じてなかったのだろう。MMUを搭載して大きなメモリを扱えるとさ れた後継CPU、Z800の資料を雑誌で読んではワクワクしていたものである。上に書いたような欠点はかなり本質的なものも含まれていて、たぶんザイログ が本当にZ800を発売していたとしてもZ80のようなポピュラリティを得ることはなかったと想像できるが、今ほぼ同スペックと考えられるZ280の仕様 を見ても当時のワクワク感はまったく甦ってこない。70年代から80年代初頭にかけてという時代が、Z80の隆盛を支えていたのは間違いない。

そんなわけで、今でもZ80を教えているらしいシラバス類をネット上で見かけるというのはちょっと驚きである。これに限らず、コンピュータ系の授 業というのは十年一日どころか二十年一日と言えそうなくらい古臭い内容のものを見かけることが多くて、こんなことで大丈夫なんだろうかと心配になったりす るんだが。

ひょんなことで組込みプログラミングを始めることになってしまった時、最初に購入したのはZ80の上位互換CPUを搭載しているAKI-80というボードだった。
20年も前の記憶を頼りに開発環境も揃え、まぁなんとかなるだろうと手をつけようとしていたところに複数の人から「H8なら簡単ですよ」と言わ れ、主体性なくH8を使ってみたらこれがZ80よりはるかにいい。現代的な開発環境が使えるしヘンな制限もない。驚くほど沢山集積された周辺機能群も、 Z80によく使われる周辺LSIに見られるような妙なクセがなく使いやすかった。AKI-80はなし崩しに抽斗の肥やしになってしまった。

その後、Rabbit3000というプロセッサを使ったいくつかのプロジェクトを経験した。これはZ80に愛のある技術者たちが現代に甦らせた高 速Z80互換風プロセッサで、組込み用途に使いやすくデザインされた周辺機能と非常によくできたIPスタックが特徴となっている。I/Oがメモリマップ内 に配置されていてIN/OUT命令がなくなっているあたりが「互換風」たる由縁なんだけど、現代的な開発環境が提供されていてクセは強いけど使いやすかっ た。あまりZ80をいじっているという感覚はなかったかな。

H8やらPICやらをいじっていると、ついつい昔のZ80への「夢」が湧き起こってしまうのである。UZIXだとか、Contikiだとかを見て いると、現代的なOSをZ80(などの過去の8bitCPU)の上で動かしたいと考えている同好の士が世界中にいるんだなと嬉しくなる。今なら過去の技術 に捉われずにいろいろなことができるので、SDカードを繋いでみたいとかUSBはどうだろうとかEthernetもいいよねとかはたまた無線LANもとか 余計なことをついつい考えてしまう。
たぶんそれは、20年以上前に感じていたZ80への愛が形を変えて表出しちゃっているのだと思う。感傷だとわかっているのだけど、PC-8001mkIIは捨てられずに取ってあったりする。

(Oct. 3, 2006)

ezTCP

前のエントリに書いたみたいに、8bit程度の古めのCPUでTCP/IPを使いたい場合には、処理能力の小ささやメモリ空間の狭さから色々と苦労するこ とになる。PICNICのような小さな実装もあるんだけど、通信のためにメモリを使い切っちゃったりしたら実用的でないので合目的的じゃないかもしれな い。TCP/IPスタック書くって大変だしね(デバッグも)。
そこで、旧来のI/F、たとえばEIA-232みたいな信号をTCP/IPに変換するモジュールを外につけるという方法がよく取られる。わたし自身よく使う手法だし(ネットワーク機能を持つマイコンボードを利用してブリッジするのだ)、そのための製品もいくつも存在する。
例えばXPortがそうだ。この製品は、RJ45コネクタの中にPHYやらCPUやらを仕込んでしまったなかなかにクレイジーなもので、シリアル ポートと高々数bitのGPIOを持つ。たぶん、単純な機器をネットワーク経由で動かすのには便利なのだろう。使ったことないけど。

問題は、XPortのようなシリアル→TCP/IP変換機は、よくできすぎている、ということだ。このテの製品には通常COMポートリダイレクタ というWindows用のデバイスドライバがついていて、COMポートの置き換えとして利用することができる。裏を返せば、それ以上の使い方をしたくても できない、ということだ。XPortでもファームウェアをカスタマイズすることで自由度を増すことはできるようなのだが、イマイチよくわからない。

そこで、完全にすべてが自由になるネットワークマイコンボードと、XPortのようなシリアルポートリダイレクタとの中間のようなアダプタがある といいなと思うわけだ。TCP/IPのセッション開始・切断などはシリアルポートからのコマンドで制御し、通信内容もシリアルポートに流してやるのであ る。これならばシリアルポートの先につく機器から、アプリケーション層のプロトコルを制御できる。

同じことを考える人というのはいるものですな。アルファプロジェクトのezTCPというのがまさにそういった製品で、ATコマンドの拡張で TCP/IPのセッションを張る制御ができる。もちろん、単なるシリアルポートリダイレクタとしても利用できる。基板サイズも小さくてなかなかいい感じ だ。

これは面白い!入手してみたい!と思ったところなのだが... よく読んでみるとDNSもサポートしてないじゃないか。PPPoEサポートもあるのに。やはり自作に走るしかないのか... orz

(Oct. 4, 2006)

MSX

もちろん忙しいのでezTCPモドキの実装に取り掛かってなんかいないんだけど(やりたいキモチを抑えつつ)、それができたとして何に使おう?と妄想したりするわけで。
キッカケになったPC-G850Vは入手できるか謎だし、PICでアプリケーション層の実装なんて面白そうだけどあまりに無意味っぽくてナニだ。アマチュア用にはいい素材かもしれないけどね。
そこで自然と視線がレトロコンピューティングに向いてしまうんだけど、PC-9801だとNICが入手できてしまうし(手元にもいくつか、ある)、わざわざアダプタを自作する価値は殆どない。
倉庫にはPC-8001mkIIが眠っているはずなんだけど、これがまた厄介な代物で専用のディスプレイを必要とする。狭い家なんだからわざわざレトロなCRTを買う気にはなれなくて、TVにサクっと繋いで使えたほうが便利だし子供のおもちゃにするにも適している。
そうなるとPC-6001かMSX、ということになるのだろうか。

巷では1chip-MSXなるものが話題になっている。正直なところわたしはこのプロダクトに注がれている熱い視線が理解できなくかった。わたしとMSXとの関わりが、間接的なものでしかなかったからだ。

MSXに関する資料をはじめて見たのはたぶん1980年代のはじめの方、ASCII誌に載った記事だったと思う。日電からはPC-8001の後継 機としてPC-8801は既に発売されており、富士通も名機FM-8の廉価版ともいえるFM-7を出すなど、8bitパソコンが一部マニアのものからもう 少し一般的なものへと変化しだした時期だった。
各社横断的に共通規格のパソコンを作る、という発想は、日電ユーザーだったわたしにとってさほど魅力的に見えなかったし、雑誌でみる限りMSX の性能はよいと思えなかった。TV接続という足かせから画面の解像度は低く、スプライトをハードウェアでサポートするといった仕掛けもゲームから興味を失 い始めていたわたしにはさしたるアドバンテージと感じなかった。
そうこうしているうちにPC-9801Eを使うようになり、8bit機への興味そのものが薄れてしまった。その頃PC-9801に手が出なかった層に、主にゲーム用途としてMSXが人気を博していたということは、つい最近まで知らなかった。

ゲーム機としての8bit機パソコンの普及は、そんなわけで同時代史なんだけども横目で見ていただけである。MSXも次第に多色表示をサポートし CPU性能も上げCP/MをMS-DOSっぽく作り直したOSが載るなど進化を遂げていたわけで、多少羨ましく思いつつも面白みには欠けるが仕事をするに は何かと都合のよいPC-9801にしがみついていた。

MSXによる世界統一の夢は結局叶わなかったわけだが、今じゃ同じMSが作ったWindowsがパソコンの代名詞となっている。これまたなんの不満もないんだけど、そんな時代を知っているとちょっと面白くなかったりするわけだ。

MSXの世界も、同人ハードやらなにやらが存在してなかなかに面白そうだ。TCP/IP接続もいろいろな人がチャレンジしている形跡がある。
いまさらだけど、「MSXでTCP/IP」なんて実現したら需要あるのかな?

などとげんぢつとぉひしてみたり。

(Oct. 5, 2006)

ゼッパチ熱

「作りながら学ぶマイコン設計トレーニング」(神崎康弘著、1983年)

「古典電脳物語」をイッキ読みした後、80年代当時の設計詳細を思い出すべく本棚から引っ張り出してみた。
1983年ということはわたしはまだ小学生だったわけで、その頃からこんな本を読んでたらしい。この本は「トランジスタ技術」をまとめたもので、 1冊の中でワンボードマイコンから始めて実用的なシステムを組み上げてしまうというなかなかすごい内容だ。今の、コンポーネントを組み上げて「自作PC」 と称している本とはまったく訳が違う。いまどきのPCはおいそれとチップから自作するってわけにはいかないんだけど。
当時は同様の書籍として「RAM」の連載をまとめたものも出ていたんだけど、そちらは6800を使っていたのに対しこの本はZ80。なんでか当時からZ80マニアだったようだ。

今から見ると箱庭みたいな環境なんだけど、そこでなんでもやっていたのだ。アセンブラは当然のこと、ちょっとしたものならBASICで対話的に作 れたし、CP/MならCコンパイラでセルフコンパイルまでできた。BASICからCまでは数年の時間が必要だったけど。Z80にここまで思い入れがあるの は、それが自分が育っていった時期と重なる同時代史だからなんだろうな。

さすがに今さらZ80でコンピュータを作る気にはなれないんだけど(配線大変だし)、PC-G850Vも結局手に入れてしまったしエミュレータも なかなか面白そう。フリー配布されているCコンパイラをエミュレータで動かしてみて、当たり前のことだけどちゃんと動くのに感動してしまった。
さっきまで仕事がらみで作っていたWindowsプログラムのバイナリサイズは600KBを超えている。その1/10以下のメモリで、ちゃんと 完結したシステムが作れるというのを再認識し、ああ昔の人はエラかったんだなぁ、そういえばオレもそんなことやってたんだよなぁと驚くやらなにやら。

そういう目でCP/Mを眺めると、少ないリソースでプログラム実行環境をうまく抽象化しているのは感動的ですらある。ごくわずかなBIOSコールとBDOSコールは「これだけ?」と思う一方、ちゃんとそれだけでCUI環境を構築できるようにできているのだ。
自作のシステムでも、BIOSをどうにかするだけで実用的なプログラムが動いちゃったんだよね。今でも頑張ればなんとかならないこともないのかも しれないけど、チップから組んで標準的なプログラムが動いてしまうというのはすごいと思う。MS-DOSだって(本当の)自作機で動かそうとしたら大変な ことになるし。
#あ。漏貧って悪い前例もあったな(笑)

--

関係者が見ていないことを祈りつつ書くが、とあるプロジェクトを引き継ぐことになってしまった。
急ぎとのことなので回路を見直しつつプログラムまで書かなければならないのだが... いやぁ参ったこの回路は一体なんじゃらほい?な状態で、回路図を一から描きなおすことになりそう。試作品をじっくり見回して、そりゃあ動かねぇよなと頭を抱えている次第。
使用するコントローラはZ80が贅沢に見えるほど小さなリソースしか持っていない。こういう小さなモノをやるのって楽しいんだよね。Z80いじっている時とはまた違った楽しさが。

--

そんなこんなで「Z80マシンでTCP/IPを」計画は当分先になりそうです... orz

(Oct. 19, 2006)


ご意見・ご感想、お待ちしてます。
e-mail:shig@esprix.net

駄文のページに戻る

ホームに戻る