MZ-2000 と CP/M移植


■はじまり

 ★2010年10月現在のMZ-2000

 確か高校1年の秋か、冬だったと思うが(注:1987年)、親類の会社から、不要に
なった シャープ MZ-2000 とFDD、プリンタなど一式が送られてきた。確か、 エプソンの
PC-286 に買い替えたとか。(記憶は確かでない)

 事務所で、かなり使い込まれていて、キーボードの周囲などの塗装は剥がれていた。
それとタバコの焦げ跡。付属していたフロッピーは、ワープロ、ゲーム、表計算、
BASICで作った技術計算プログラムなどがたくさんあり、大活躍していたのだろう。

 その冬は、MZ-2000をいじるのに夢中になっていたと思うが、無知が災いして
大事なフロッピーを間違って捨ててしまった。 Hu-BASIC と シャープBASICとで
フォーマットが違っていて読めないとか、そういうのを最初知らなかった。

 フロッピーを片っ端から突っ込み、FILES(注:MS-DOSで言えばDIRか、いや、これも
現在では知らない人が多いか・・・)をやってみて、なんで、このフロッピー読めないんだ、
エラーか、と勘違いしたんだな。確かに、磁性面に傷が入っているのは、読めない事がある。
それで、見た目もひどいやつは、傷か汚れで読めないんだな、と判断して捨てたり、
比較的まともなやつはフォーマットして使ったりして、それが、あとから考えたら大失敗だった。
なんで古いのをフォーマットして使うかというと、使い回す感覚が普通だったんだな。
金がなかったから、新しいのをポンポン買ったりできなかった。買いに行くにも店が遠かった。

 それから、プリンタ MZ-1P07 を壊してしまった。もともと、酷使されて老朽化していたの
だろう、ベタ画面のハードコピーを印刷している途中で、プリンタヘッドから煙が出て、
動かなくなった。修理の見積をとったら、5万円だという回答が来てあきらめた。

(この故障したプリンタから、EPROMの2764などをはずして、のちに自作マイコン1号機に
活用した)

 翌年の夏、親類の会社に遊びに行った時、プリンタを買いたいといって、大阪の
日本橋に連れて行ってもらった。何軒か回った後に、OAシステムプラザで、同じ
MZ-1P07 の中古のいいやつがあったので購入した。

 その時にふと思い出して、一緒に送ってもらったフロッピーにCP/Mは無かったん
でしょうか、と聞いたら、あったはずだよ、との事・・・、まさかアレだったのでは?と
記憶がよみがえった。確かCBASICとか何とか書いてあったやつだ。読めないからダメ
なんだと、捨てたやつ。なんで、あのフロッピーから起動してみなかったんだろう。
とても後悔した。

 なんでCP/Mが必要かというと、開発環境が必要だったわけ。ハンドアセンブル
だったら、アセンブリ言語で長いプログラムを作るのはとても大変だし、時間がかかって
効率が悪い。当時は、とにかくハンドアセンブルしか方法がなかった。

 CP/Mに標準で入っているアセンブラASMは、確か8080用で、Z80のニーモニックに
慣れた自分には使えなかった。マイクロソフトのアセンブラ M80、リンカ L80、
ライブラリアン LIB80 (だったかな?)、が必要だったのだ。

 また、その頃に読んでいたマイコンの自作本(神崎康宏さんの著書)から、
「CP/Mは異なるハードウェアにも移植できる」という知識を得ていた。そしてその本には
実例として、自作マイコンへのCP/M移植方法が載っていた。上記のM80等の知識も
たぶんその本から得たと思う。そう、当時は、情報源としては本か、知っている人に
聞くぐらいしかなかった。それも、場合によっては断片をつなぎ合わせるようにして
目的にたどりついていたのだ。

 よし、CP/Mさえ入手できれば、MZ-2000に移植することも可能だと考えて、
チャレンジを始めたのだった。(市販品を買うという発想は無かった。なぜなら、金は
無いのが当たり前だったからだ。コピーするにも、周囲にそれを(MZ-2000用を)
持っている人はいなかった)

 今では、そんな遠回りをしないなあ。開発環境を手に入れるのが目的であって・・・。
CP/Mの移植は、やむを得ない手段だったと思う。

 MZ-2000については、0082にちょっと書きましたけど、リクエストもありましたので、
ここに詳しく書いていきたいと思います。


■1983年

 MZ-2000は、確か、1982年に発売されたと思う。
 ここに、1983年1月号のI/O(工学社)があるので、MZ-2000関係の部分を少し
紹介しよう。



 I/Oは今でも続いている。本のサイズは昔はB5だったけど(トラ技と同じ)、
いまはラジオライフと同じサイズで小さくなっているな。

 次の写真は、 テクノソフト の広告。
 左ページにMZ-2000が載っている。右には各ゲームソフトの紹介があるが、
みんな、色鉛筆で着色したような手書きの絵だ。CGじゃないぞ。



 ちなみに テクノソフト は、 長崎県佐世保市 にあった。道路を走っていると、
川のそばに、自社ビルが建っているのが見えた。土星みたいなロゴマークが
つい最近まで付いていたと思うが、いまは無くなっている。

 私が高校3年の時、就職先を検討する時期で、
電子工学科の科長先生から、「テクノソフトを受けたらどうか?」とアドバイスを
受けたのを今でも覚えている。応募はしなかったけど・・・。私はソフトより
ハードをやりたかったし、高卒で就職しないで進学するつもりだった。


 次の写真は、MZ-2000用の投稿ゲーム「FIGHTER X1」のダンプリストだ。
MZなのにX1とは(?)。



 こんなの、今のパソコン雑誌には載ってないが、昔は必死になって
これを打ち込んでいたのだ。学校から帰ってから、毎晩、コツコツと
少しずつ進めたのである。

 上の2ページだけじゃないぞ。何ページもあった。

 もちろん、間違わないように正確に入力しなければ、動かないし、暴走して
せっかく打ち込んだプログラムが消えたりする。動かす前に、必ずダンプリスト
をチェックして、間違いがないことを確かめなければならなかった。

 1バイトずつチェックしてもいいが、それじゃあんまり大変なので、タテ・ヨコの
チェックサムが載っていた。それだけ見ていけば基本的には間違いなかった。
細かいことは忘れたけど、完璧じゃなかったっけな。バイトが入れ替わっていたら
分からなかったんだっけ。何度見直しても動きがおかしい事があって、だいぶ
苦しんだ覚えがあるのだが、どうだったか忘れた。最後は1バイトずつ追いかける
しかなかったのだが、本当に苦労した。

 いろいろな記事を見ていくと、なかなか面白い。ダンプリストを打ち込むのが
大変なので、フォトトランジスタを利用した「リストリーダー」の考案も載っていた。
テンキーの数字キーの周辺に、A〜Fを割り付けるとか、音声で読み上げさせるとか、
みんな色々工夫していたと思う。

 私はMZ-2000で打ち込むとき、左手でA〜Fを、右手で(テンキーの)0〜9を打っていた。

 ソノシート(レコード)が付録に付いて、それにプログラムが録音されていたのも
あったな。実際にロードを試みたけど、なかなかうまくいかなくてエラーが出たり、
雑音のせいか、プログラムが所々、文字化けしたりした。みんな苦労していたようで、
ロードを成功させるための工夫がいろいろ投稿されていたのも覚えている。

 いまのPCに比べたら、解像度は低いし、色数も少なかった。ただ画面に女の子
のイラストを表示するためだけに、画像データのダンプリストを、一生懸命に
打ち込んでいたっけな。
 こんなふうに不便な中から、データの圧縮とか、いろんな工夫が生まれてきたんだ
と思う。データを圧縮すれば、打ち込む手間は減るわけだし。

 最初から、便利な物が与えられていたら、工夫しようという気持ちは生まれないだろう。
満たされてしまって、もう、何か新しいことをしようという気持ちが薄れてしまう。中身が
わからないブラックボックスだったから、なおさら、手が出せないだろう。

 現状より、よりよく、さらに進化しようという姿勢は持ち続けたいものだ。


こんなのがあります

 ここで言ってしまうと、ここから先に進めなくなるかもしれないが(笑)、素晴らしいので
紹介します。

 これは近年見つけたものだが、CP/Mを移植するだけではなく、はるかに完成度の
高いものに仕上げている。限られたメモリを有効に活用している。(限られたメモリを・・・
は死語だな・・・)

 福井利夫さんのサイト

 その中の、ここです。
 64K CP/M 2.2 for SHARP MZ-2000/2200

 MZ-2000実機がなくても、エミュレータで試してみてください。


■移植(学生時代)

 結局、学生時代には情報・知識不足でCP/M移植は挫折したのだが、思い出ということで
以下、読んでいただければ幸いです。


●高校の頃

 最初は高校生の頃、CP/Mの移植に挑戦した。

 まず、CP/Mのフロッピーを入手するところから始めた。同級生で、 X1turbo を持っている
奴に聞いたら、X1用のCP/Mなら持ってるとの事で、コピーしてもらった。さらに、学校の
PC-8001 にもCP/Mのフロッピーがあったので、先生に頼んで借りてきた。

 当時はコピーしたけど、現在は本物を持っているのでカンベンしてください。(意味不明)

 ←本物のX1用CP/M V2.2

 X1turbo用、PC-8001用、どちらも2D(320KB)の5インチフロッピー、これをMZ-2000につっこめば
起動するか? 何も知らないから、一応試してみたのだった・・・。 当然、起動しなかった。
(MZ-2000に、じゃなくて MZ-1F07 だろ、とか細かいことは言わないように)

 その、起動の細かいカラクリから理解しなければならなかったのだが(起動だけの問題では
ないが)、親切な資料は手元になかった。MZ-2000のオーナーズマニュアル等はあったが、
IPL(イニシャルプログラムローダー)を地道に読み解いていくしかない。ソースリストは載って
いても、細かいコメントは書いてないのである。ソースリストがあれば十分とも言うが(笑)。
あわせて、FDC(フロッピーディスクコントローラ)MB8876の制御方法も理解しなければ
ならなかった。どのI/Oアドレスに何がつながっているかの情報も無かった。必要なら、
基板のパターンを追いかけて、回路図を起こすしかなかった。フロッピーディスクの、セクター、
トラック、ヘッド、フォーマット等に関する知識も必要だった。
とにかく、当時の自分にとっては、クリアしなければならないハードルが高く、そして多かった。

 とりあえず、Hu-BASICからセクターを読み込むプログラムを作り、X1turbo用のCP/Mフロッピー
の中をどんどんダンプしながらのぞいたら、BIOSのソースリストらしき物が入っているのを発見して、
プリントアウトした。X1turboのハードウェアに依存する部分が書かれていた。その内容を読むだけで
大変だったし、ハードウェアの異なるMZ-2000用のBIOSを新たに書くことを考えたら、その作業量
だけで相当なものになることは想像できた。何しろハンドアセンブルだ。

 前述した神崎さんの本の、CP/M移植の部分を読みながら、FDDのプログラムを試行錯誤
したのだが、よくわからなくて、資料も少ないので行き詰まってしまった。

 現在、振り返って色々調べてみれば、いろんな書籍があった事が分かるのだが、当時は
そういった情報の入手はごく限られていたし、地方だったので、本屋に専門書はほとんど
置いていなかった。(本屋にあったのは、雑誌、漫画、受験参考書ぐらいだ)

※神崎さんの本・・・ 「 作りながら学ぶマイコン設計トレーニング 」 CQ出版社


●専門学校の頃

 高校を卒業して、ビジネス系のコンピュータ専門学校に入学した。長崎市内の下宿屋に
引っ越したのだが、その時に MZ-2000 も一式持っていった。

(注: 2010年現在、 長崎コンピュータ専門学校 は無くなった模様)


 同じ下宿屋に住むFが、MSXユーザーで、すぐに意気投合した。うなぎの寝床みたいな
細長い部屋だったのだが、ドアが開いていると、廊下から室内が丸見えになる。
 たまたまFが、私の部屋の前を通ったら、MZ-2000が見えて、それで声をかけてきたのだ。
私も、中学1年からMSXユーザーだった。

 彼はマシン語やゲーム作りに関しては、私よりはるかに先を走っていた。雑誌によく投稿
していたし、出身地では周囲にそういう仲間が多かったそうで、ほとんどひとりでやって
いた私はうらやましかった。教えあったり競争しあう仲間がいれば、自分も、もっと向上できた
はずだった。しかし今日からはFがそういう仲間だと思った。

なんか嬉しくて跳ねている(笑) ←下宿屋の屋上にて。左がFで、右は私。

 Fは私のことを師匠と呼んだが、これは私が電子回路に詳しい事からそう呼んでいた。
彼は電子工作の勉強を始めていた。そうやって、お互いの得意分野から教えあったり
刺激を受けたりしていた。彼とは親友と呼べる仲になった。

 Z80で、ある入力ポートの特定のビットを、別の出力ポートにそのまま出力する時(あるいは、
8ビットずつ固めるとき)、それまでの私は、クソ真面目に、ビットを見てZかNZかでジャンプさせて、
それぞれビットセット、リセット、のように作っていた。それしか考えられなかった。

 ところが、Fは、シフト命令を使って、キャリフラグ経由でビットを持ってくるような、簡単な
プログラムを作ったのだ。これが正解だと思った。キャリフラグ経由なんて、それまで想像も
しなかった。当たり前だという人もいるかもしれないけど、一人でやっていたら、永遠に、
気づかなかったかもしれない。一人だったら、いつまでも無駄なプログラムを作っていた。
Z80をいじっていた頃は、ひとつでも命令を削ることが速度的にもメモリ的にも重要だった。

 それと、出力ポートに0、128を出力してパルスを作るために、
    XOR A
    OUT (0D8H),A

    LD A,128
    OUT (0D8H),A

のように記述していたが、これだとデューティ(波形のLレベル、Hレベルの比)が均等に
ならない。Lレベル幅が短くなってしまう。

 Aレジスタを0にするのは、頭からXOR Aだと信じ込んでいたのだ。そうすれば1バイトで
済むのだから。 しかしパルス幅までは考えが回らなかった。XOR AじゃなくてLD A,0と
すべきだったのだ。

 ※特定のビットを0、1に変化させるのは、本当なら、bit7だったら01111111と11111111を
  交互に出力すべきだ。上記は分かりやすくするため簡略化して書いた。
  パルス幅を気にするのだったら、割り込み禁止も考慮しなければならない。

 ※余談ながら Apple][ は、チップセレクトにトグルフリップフロップが接続されていたので
  そのアドレスにアクセスするたびにフリップフロップが反転し、スピーカからクリック音が
  鳴る仕組みだった。
   わざわざ、0とか1を出力する必要がない合理的な考え方だ。


 (上記のプログラムは何に使ったかというと、カセットテープの入力ポートからRAMに録音、
あるいはRAMからスピーカ等に再生する、録音・再生プログラムだった。確かポケコンと、
MZ-2000の両方で作った。あらかじめハードウェアを設計する時に、シフトが最小で済むように
ポートのビットの割付を考慮したりとか、いま思えばマニアックだったな。)

 ところで、当時パソコンを持っていて、やることといえば、今みたいにインターネットどころか
ネットワークも無いから(あっても金がかかり学生には辛い)、オフラインで、プログラムを
作るか、ゲームで遊ぶぐらいしかなかった。我々はプログラムを作ることを主にやっていた。

 ちょうどこの頃、1990〜1991年には、 Tim Berners-Lee によって、WWWが構築されたのだが
当時そんな事は全く知る由もなかった。ただ、NeXTやMacintoshを店で見て、スゲェとか
言っていたぐらいだ。(余談:初めてMacintoshを触ったのは高校生の時で、建築科の先生が
所有していたMacintoshIIだった。学校に持ってきていたので触らせてもらった。)

 Fは簡単なプログラムならハンドアセンブルしていた(ニーモニック表を縮小コピーした
のをノートにはさんで持ち歩いていた)。それは「 Z80マシン語秘伝の書 」(日高徹)の巻末
資料をコピーしたものだったが、一部に間違いがあったと話していた。※

 ※P.219のOUT (C),EのコードがE 59と書いてあるのは脱字で、ED 59 だと思うが、
  その上のOUT n,A はOUT (n),A で、IN n,AもIN (n),A、ジャンプ・コール・リターンの
  JP x, nnの下のJP x,eとなっているのはJRだろう。
  これら以外にコードのミスがあったようなのだが、今さら分からない。Fは指摘していた。
  ここも見てね。新日本プログラミング (Z80マシン語秘伝の書の著者、日高徹氏のサイト)
  ”著書別「ごめんなさい」の山”の中に、上記のE 59だけは書いてあったのだが・・・。

 Fは、MSX上で、確かモニタアセンブラ?というものを使っていた。
 それは、 MSX-BASIC のプログラムとしてソースを記述していく。但し、各行はコメントとして
書く。行番号のあとに REM か、 ' (アポストロフィ)を入れて、あとはニーモニックだ。BASICの
命令だったら中間コードに変換されるので1命令1バイトしか食わないが、コメントだから
その文字数分はメモリを食う。

 モニタアセンブラ自体もメモリを使うので、番地や容量の制約があった。アセンブルした
結果のオブジェクトもメモリ上に展開される。とても、メモリをフルに使ったプログラムを作るのは
難しいことだった。

 ポケコン用のアセンブラだったかなあ、結果を出力するためにアセンブラ自体が浸食
されてしまうというのがあったような。とにかく、少ないメモリをやりくりしていたのだ。
いまのWindowsではとても有り得ないことをやっていた。仮想記憶なんか無いよ。HDD
どころかFDDも無い。

部屋の横幅は170cmぐらい。うなぎの寝床。 ←プログラム中のF、暑いので上半身裸。
(1990年7月30日)

 この写真は、私の部屋でFが松下のMSX、 FS-A1F を使ってプログラムを打ち込んでいる。
FDD付きのマシンだが、こいつのゴムベルトが伸びやすくて、使えなくなるのが早かったように
記憶している。なんか1回壊れなかったっけな。それでカホ( デンキのカホ )に行ったら、ちょうど
ジャンクコーナーに同型のFDDがあって、交換したのを覚えている。

 モニタは普通のテレビ(14型)を使っていた。右側にあるのがそれだ。Fはこのテレビを、
自分の部屋から抱えて持ってきたのだ。
 ちなみに私は、ゴミ置き場から拾ってきたのを修理して使っていた。この写真を撮影した
当時には自分のテレビは無い。

 奥を見るとクーラーがある。なんでクーラーがあるのに使わないのかというと、電気代が
クソ高かったからである。この下宿では、1kWあたり55円になっていた。真夏の1ヶ月、
クーラーを普通に使っただけで1万円近い請求が来た。高すぎると怒る仲間もいて、管理人と
ケンカになっていた。

 とにかく金がないので、できるだけクーラーを使わないようにガマンしていた。

 ある夜、暑さをしのぐ為に、Fと水を大量に飲む競争をしたことがある。その後に寝ていたら
ベッドの自分が寝ていたところがじっくり濡れていた。おねしょじゃなくて、汗で。
 暑い屋外から帰ってきた時は、よく、蛇口の下に頭をつっこんで、水をドバーとかぶっていた
ものである。スカッとするのでオススメ。

 ところで、テレビの後ろのほうに置いてあるのが(見えにくいが)MZ-2000とプリンタ、FDDだ。
CP/Mを移植しようとした時も、この位置で作業していたのを覚えている。

 2年目だったか、とても強力な台風(19号)が長崎を襲った。その時、このボロ下宿は崩壊する
のではないかと思うぐらいグラグラしたが(笑)、上の写真で見えている窓のスキマから、雨が
吹き込んで、MZ-2000が水をかぶってしまった。学校から帰ったら、部屋が水びたしになっていて
MZ-2000を傾けたら、水がジャジャーと流れ出したぐらいだ。もちろんすぐに水を拭き取って
乾かしたが、それで壊れなかったのだから、大したもんだ(?)。

 風速40mを瞬間的に超えたと思うが、窓から外を見ていたら、向こうのアパートの屋根が
(瓦ではなく、屋根そのもの!!)、バリバリと、剥がれて吹っ飛んでいったのにはビックリ仰天した。
いまでも信じられない。看板やら色んな物が吹っ飛び、街路樹や信号機の電柱などがボッキリ
折れていた。

 脱線してMSXの話題になるが、最初の頃はカセットテープを使ってセーブ/ロードしていた。
Fは最初、ビクターのMSX1を使っていたと思う。そのうちに外付けFDDを買ってきて、それを使い
始めたのではなかったか。次にFS-A1F(FDD付き)を手に入れて使っていたような気がする。

 私がMZ-2000にCP/Mを移植するより先に、MSX-DOSを手に入れてしまったので、結局、
専門学校に在学中はCP/Mを使わなかったと思う。

 CP/Mのフロッピーから、アセンブラM80(MACRO80)や、フォートランF80などを抜き出して、
それらをMSX-DOS上で使うことはしていた。

 CP/Mの移植には気合いを入れて取り組んだのだが、結局できなかった。完成するまで
部屋から出ないなどと宣言して、カップラーメンばかり食っていたのを覚えている。ところが
具合が悪くなってしまった。


●データ転送、ハンドシェーク

 持っていたCP/Mのフロッピーは5インチなので、そのままではMSXで読めなかった。
(MSXは3.5インチ)。

 そこでMZ-2000から読み込み、自作のパラレルか、シリアルだったか忘れたが、そういう
通信インターフェースを経由して、MSXに送った。その時、ハンドシェークという考え方をして
MZ側が私、MSX側がFという役割分担でプログラムを作って通信させたと思う。

 簡単に言うと、自分と相手がいて、相手がデータを受け取る準備ができているか確認する。
相手がデータを受け取る準備ができていたら、データを送る。相手はそのデータの処理が
終わるまで、受け取る準備ができていないという信号を出す。たとえばディスクへの書込は
通信に比べたら、時間がかかるわけだ。書込が終わったら、準備できた、次のデータをくれ、
という仕組み。

 今のプリンタはUSBになってしまったが、昔のセントロニクス方式と言っていた頃は、
「ストローブ」と「データ」と「ビジー」信号のやりとりだった。プリンタがビジーかどうかチェックし、
ビジーでなければデータをセットして、ストローブパルスを送る。するとプリンタはデータを受け
取る。処理が済むまで、あるいはプリンタ側のバッファが一杯ならビジーとなる。この繰り返しで
データを送って印刷させていた。

 たぶん最初はパラレルでやったと思う。MZ用とMSX用の8255インターフェースボードを、
自作し、お互いに線でつないだ。2mぐらいのばしたと思うが、まともに通信できなかったと
思う。最初はハンドシェークという考え方をよく理解していなくて、自分と相手を同時に考えると
頭が混乱してきた。Fとやりとりをしながら整理したと思うが・・・結局、シリアルのほうが汎用性
があると考えて、MZとMSXと、そしてポケコンPC-E200との間でやりとりをするようになった
のではなかったかと思う。

 けっこう覚えているものだが、私は高校時代から研究記録と称して、集めた資料やメモを
全てファイルに保存していて現在も持っている。その古いファイルをめくっていたら、上記の
転送をやっていた時のメモを見つけた。


●学校を卒業した後

 卒業の前年に、MSX turbo R ( FS-A1ST ) を購入した。これで卒業研究のプログラム開発を
したが、使ったアセンブラはCP/Mから持ってきたものではなく、アスキーから買ったものだったと
思う。MSX-DOS2 TOOLSのスクリーンエディタとアセンブラを使っていたのではなかったか。

 (念のため調べたら) MSX-DOS2 TOOLS を買う前に、「 MSX-DOSスーパーハンドブック 」
(アスキー)に載っていた、アセンブラASM.COM/テキストエディタPED.COM/デバッガ
BUG.COMを入力して、使っていたようだ。

 学校を卒業してから実家に戻り、就職して数ヶ月後に、 PC-9801UV11 を入手した。
そしてMS-DOSの世界に入って、色々あって現在に至る。その間、MZ-2000は押入に
しまい込んでいた。親から「捨てろ」と言われながらも保管し続け、勝手に捨てられない
ように
、2004年頃、現在住んでいるところに持ってきた。そして再びいじり始めた。


■移植(2004〜2005年頃)

 実際に作業していたのは2004年秋ぐらいからだったと思う。

 当時勤めていた会社の仕事を、毎日夜遅くまでやりながらも、帰宅してから自分の趣味を
楽しむパワーがあった。
 まあ自宅から近かったし、出勤時間も遅くて良かったので。いや、遅くても良かったけど、
結局、来客や電話対応、自分がいないと色んな案件が進まないので、朝一番に出て、
いつも最後に帰っていたが・・・。

 そんな生活だったが、時間外の仕事にも取り組んでいた。製造の人がPICの書込時間の
遅さに困っていたので、パソコンを使わなくて済む高速書込機を作ってやろうと思い、
英文のデータシートをコツコツ翻訳するところから、基板、プログラム、テストまでこなして
完成させたりしていた。

 現在(2010年)では、とてもそんな時間はない!悲しいヨ!!
 (ホームページの更新も、時間が無くて全然できない・・・)


●コンピュータに最初のプログラムを入れるということ

 コンピュータはなぜ起動するか。最初にどうやってプログラムを入れるか。地下鉄をどうやって
地下に入れるかというと、ちゃんと出し入れする場所があるわけで、プログラムの場合も方法は
ある。

 要するに、プログラムをメモリに入れて、CPUをその番地から動かせればいいのだが、それには
ROMを使ったりするのが一般的だ。現在のパソコンも最初はROMからBIOSを起動している。
そしてハードディスクからWindowsを読み込んでいる。

 一例として、昔のコンピュータ CDC6600 の Dead Start Panel を紹介しよう。 ここを参照
トグルスイッチが並んでいて、ヨコ1列が1ワード(12ビット)である。タテ方向がメモリの番地の
並びだ。つまり、ROM(リードオンリーメモリー)を可視化したと思えばよい。故障時の診断用に
簡単なプログラムを入れることにも活用されていたのではないかと想像する。

 ここにマシン語で直接、「入力」する。スイッチのON/OFFはそのまま2進数の1/0に対応
する。おそらく想像だが、紙テープか何か、外部記憶装置からプログラムを読み込むための
簡単なプログラムをここに「記憶」したのだ。外部記憶装置からメモリにプログラムを読み込めば、
あとはそれを起動すればいい。

 私がかつて使用した NEC の NEAC3200 は、やはり、イニシャルプログラムということで
フロントパネルのボタンをボチボチと押しながら、10ワード前後のプログラムを入力した。
コアメモリなので、一度入力すれば、だいたい覚えている。電源を切っても消えない。「だいたい」
というのは、たまに消えることがあったのである。暴走が原因か、古い機械だったからか、
今さら分からないが、消えたら入力するだけのことである。何度もやっていたから、いつの間
にか覚えてしまった。 (詳細は0007を参照)

 どの外部記憶装置から読み込むかを番号で指定する。紙テープリーダーなら何番と決まって
いた。最初に打ち込んだイニシャルプログラムの最後には、外部記憶装置から読み込む
プログラムの先頭番地へのジャンプ命令が書いてあった。読み込みが終わったらその番地から
実行せよということだ。そうすると読み込んだプログラムが実行される。


 私は別のWindowsパソコンで作成したプログラムをアセンブルしてMZに転送したが、昔、
マイコン1台しかなかった頃の先人たちは、フロントパネルのスイッチから1バイトずつ入力
したのだろうかと思う。

 そうやってOS自体をRAM上に作り上げていって、FDDの制御を追加してようやく、フロッピー
に保存できるようになったのだろうか。そうして、どんどん便利になるように考えて、プログラムを
作っていったに違いない。

 自分自身も同じような事をした。自作マイコン1号機を作った時に、プリンタインタフェースの
回路だけ先に作っておいた。ほかのプログラムも少しずつテンキーから打ち込んで、最後に
プリンタの制御と、ダンプ出力のルーチンを作成して、それまでに作ったプログラムのダンプ
リストをプリントアウトすることでようやく「保存」することができた。暴走や停電が怖かった。


●2DDのフロッピー

 久しぶりにMZ-2000をいじる気になったのは、古いフロッピーにカビがはえているのを
目の当たりにして、これはバックアップしておかねば取り返しがつかなくなる・・・という妙な
危機感におそわれたからである(笑)。

 そして、3.5インチのFDDをつなぎ込む方法がわかったので、この際、3.5インチのフロッピーに
全部バックアップしようと思いついたのである。

 2DDのフロッピーを手に入れる最後のチャンスのような気がしたので、店頭に置いてあった
やつをゴッソリ全部買ってきた。



 左後方に見えるのはMZ-2000用のFDDで、 MZ-1F07 である。
 右後方に見えるのはMZ-2000である。


●3.5インチFDDの増設

 これは3.5インチFDDと、電源、そして接続ケーブルである。
 MZ-1F07のケーブルとインターフェース基板との間に割り込むように
接続し、3.5インチFDDへの分岐接続をしている。



 配線が乱れているが、とにかく動かせという勢いで一気に作った。


●FDDの中をのぞく

 3.5インチFDDの動作確認の際、Hu-BASICからフォーマットをかけて、ヘッドの移動音が
何回コツコツ鳴るか数えてみた。また、FDDのフタを開けて、中のヘッドを観察した。
すると34回鳴ったので、35トラックであることが分かった。つまり、3.5インチフロッピーの
半分しか使っていない。


●FDDインターフェース基板

 これは、FDD MZ-1F07 用のインターフェース基板である。
 (写真では、下にユニバーサル基板を敷いている)



 MZ-2000用のBIOSを書くには、こいつの中身を知っておく必要があった。そこで、
全てのパターンをたどり、回路図を書き起こし、I/Oのアドレスとビットの割付、機能を
明らかにした。
 IPLのソースをたどりながら、それらの資料と照らし合わせて、細かい機能の理解を深めた。

 この基板は MZ-1E05 ではないかと思ったが、基板にそのような型番の印刷は無い。
ネット上に載っているMZ-1E05の写真とも異なっている。ROMのソケットとか、ICの並びが
少し違う。SHARPとは書いてあるが・・・。
 なぜか、IC15という印刷が重複している。( 74LS175 と SN74145N )

 近年、ネットで検索したら、MZ-1E05のサービスマニュアル(英語版)があった。
但し、回路図は最低限の部分しか載っていなかった。やはり自分で回路図を起こしておいて
良かった。でもVFO( HA16632 )の資料や波形が載っていたのは、資料がきわめて少なかった
だけに、参考になった。


●フロッピーディスクコントローラに関する参考資料

 MB8877(8876)のデータシートは勿論読むとして、技術雑誌の解説なども参考にしました。
 参考にした資料の一覧は下記の通り。

 ・「最新フロッピ・ディスク・システムの研究」 インターフェース 1983年5月 P.150〜257

 ・「68000システムの製作全科(下)」 千葉憲昭著 技術評論社 P.146〜179

 ・「作りながら学ぶマイコン設計トレーニング」 神崎康宏著 CQ出版社 P.221〜238

 ・「MZ-2861」 I/O 198?年6月号 P.172〜207  ※たぶん1987年
  新機種の紹介と回路図などの技術的な記事、MB8876周辺の回路図がある。

 ・「マイコン周辺LSI活用手引き書 第9回 FDC MB88311Aの使い方<1>」
  トランジスタ技術 1987年8月 P.419〜430
  MB8877の改良版で、参考にはなるかも。

 ・「MSXテクニカルガイドブック ディスク編」 ココ
  アスキャットのホームページ内にあります。

 ・トランジスタ技術SPECIALにも何冊か参考になるのがあったはずだが、
  部屋のどこに埋もれているのやら。
  そのものズバリ、「フロッピーディスクの・・・」のようなタイトルがあったはず。


●Hu-BASICのフロッピーを調べる

 フロッピーからの起動の仕組みを確かめる為、Hu-BASICのフロッピーをセクターダンプ
して、中身を調べた。

レコード番号, アドレス(HEX), 内容
0, 00000, ブート情報
1〜2, 00100, ローダー
3〜13, 00300, 全FFh
14, 00E00, 不明
15, 00F00, オール0
16〜21, 01000, FAT 先頭に01h, IPLPROの反転データ有
22〜31, 01600, 全FFh
32〜33, 02000, BASICプログラム Startup.Bas
34〜47, 02200, 全FFh
48〜211, 03000, Hu-BASIC C3 E9 00 ...
(以下略)

 01h, IPLPROというのは、MZ-2000のIPLソースを見ると、起動に必要なキーワードである
ことが分かる。

 とりあえず、フロッピーからの起動は最後に取り組む事にした。


●シリアルインターフェース

 キーボードからの文字入力と、画面への表示は、ある程度の規模のプログラムを作らなければ
ならない。それらを後回しにして、移植作業を優先して進めるにはどのようにしたらよいか考えた
結果、シリアル通信で、1文字単位の送受信ができるようにした。

 CP/Mは、最初、テレタイプから操作するように作られていたと思う。1文字単位のコンソール
入出力が、それだろう。CP/MのBIOSの中には、紙テープの入出力も生き残っている。もっとも、
実際のパソコンで紙テープを装備していたのは少なかったので、これはRS-232C送受信用に
流用されたりしていた。

 さて、キー入力や、画面制御のプログラムを作って試すには、その結果を見る手段が必要である。
シリアル通信で最低限のやりとりができるようにしておけば、いろんなテストを行うのが楽になる。

 古典的なデバッグ手段だが、約20年前、自分がマイコン業界に入った時に先輩たちが工夫
していたのがこの方法だ。とにかくモニタ(※)さえ動けば、ICEなしで、プログラムの開発が進められる。
そういえば、かつて持っていたSunのワークステーションでも、シリアルポートだけつないで
操作をする方法があったような気がする。

 ※モニタ・・・現在でいう画面のことではなくて、簡単なOSのようなもので、メモリの読み書き、
        プログラムのトレース、実行などができる最低限の環境。

 次の写真は、自作のシリアルインターフェースである。



 8251とRS232Cレベルコンバータ、アドレスデコーダを含んだ回路を、以前作っておいたので
これを、プリンタインターフェース基板につなぎこんだ。なんでプリンタインターフェース基板に
つなぎ込んだかというと、これにつなぐのが手っ取り早かったから。(でも、この基板は事前に
パターンをたどって回路図を書き起こすぐらいの努力はしていた)

 Windowsのパソコン上でアセンブルしたプログラムを、MZ-2000に持ってくるためにも、このような
通信手段があったほうが有利である。これが近道だった。

 MZ側でシリアル通信を受信するプログラムを作り、WindowsパソコンのターミナルからHEX
ファイルを転送すると、MZのメモリにダウンロードされるようにした。これで、プログラムを修正、
アセンブルしてから実際に試す事ができるようになった。


●動くようになるまで

 ここまで述べてきたようなハード・ソフト両面の準備が整って、初めて、移植ができるように
なった。

 主にBIOSをMZ-2000に合わせて修正/作成する作業をした。I/Oポートのアドレスを
合わせたり、全面的に細かく見直した。
 X1用のCP/Mは、独自の拡張(RAMディスクなど)が組み込まれていたので、とりあえず
それらは取り除いて、シンプルに、見通しをよくした。

 これで動くはずと思ったら、MZに転送して、MZのモニタから(Hu-BASICのMONから)実行
した。

 最初から動いたわけではない。全く何にも反応がなく暴走したり、何がいけないのか、
何度も何度も見直して修正を繰り返した。

 途中でようやくCP/Mの起動メッセージが出るようになったが、なかなかフロッピーの
アクセスまでは行かなかった。

 でも、意外にアッサリと、フロッピーは動き出した。BIOSさえ正しければ、ちゃんと
CP/Mは動くのである。(修正するところはBIOSしかないから、当たり前だが)

 ただ、リブートしたときに暴走するという現象があり、しらみつぶしに原因を探し回って
苦労したが、分かってみれば単純なことだった。リブートした時に読み込むセクタの番号が
違っただけなんだが・・・。X1用CP/MとFM-7用CP/Mのディスクを入れ替えてみた時に
ちゃんと動いたので、分かったんじゃなかったか。どうだったか忘れた。プログラムの先頭から
少しずつ追っていって、ようやく分かったんじゃなかったか。

 この部分だな・・・ (赤い字で示す)

;------------------------------------------------------------------------------
;WBOOTS
; BDOSとCCPをロードする
; 成功はA=0, エラーはA=1
; 開始セクタ・トラックは、X1用CP/Mの場合トラック0,セクタ2 ←原因
; FM-7用CP/Mはトラック0,セクタ4 (レコード2)
;------------------------------------------------------------------------------
WBOOTS:
  CALL  CHKSAV
  OR   A
  RET  NZ

  LD   DE,0 ;トラック
  LD   (TRKOLD),DE

  LD  A,4 ;セクタ
  LD  (SECOLD),A


 セクタ2と4の違い。違うセクタを読み込んで実行するから、暴走するのは当然。

 それにしても、
 Windowsパソコンのターミナルから、CP/Mを使うのは奇妙な感じがした。


●Windowsパソコンからの操作

 次の画面は、Windowsノートパソコンのターミナル画面。

 昔、スイッチがショボいのを修理したエプ損Endeavorね。

 WindowsのパソコンでCP/Mの画面を見るのは奇妙な感じもするが、ちゃんと動いて
いるのは気持ち良いものである。(ここまで相当な手間がかかったのだ)。

 ディレクトリを表示しているのは FM-7 用のCP/Mで、FMCPM565.SYSというのが
あるでしょう。これもちゃんと本物のフロッピーを所有している。以前は実機とFDDも所有していたが
捨ててしまった。もったいなかった。

 本物のFM-7用CP/M

 FM-7の場合、オプションのZ80カードを差してCP/Mを動かしていた。つまり、本体の6809と
やりとりをしながら画面表示などをしていたわけで、Z80側としては直接ハードウェアに触れる部分が
ないと思われ、かえってFM-7用のCP/Mのほうが、移植がしやすいような感じがしていた。
最終的にはX1用のCP/Mから移植したわけだが・・・。結局、画面やFDDの制御、キー入力は
自分で作るしかなかった。

 余談だが、私が持っていたFM-7はZ80カードのZ80がなぜか死んでいた。なんで動かない?と
思って調べたら、そういうことだった。Z80を交換したら正常に動くようになったっけ。

 FDD制御は、X1がMB8877、MZはMB8876で、これらの違いはデータバスが正論理か負論理か
だけである。そこでFDD制御に関しては、X1のものを修正して持ってきた。

 こんなふうに、CPLを追加すればいい。CPLはAレジの論理反転。

 (CPLを入れないで最初からAレジに反転データを書けばと言われるかもしれないが、
 MB8877のデータシートを参照するので、データシートの表の通りに1,0を書いたほうが
 分かりやすい為。そして、実行時間が厳しくないので良いだろう。)

    LD  A,0A5H
    CPL      ;8876
    OUT (FDDR),A

 これだけで済むなら簡単なのだが、自分としては、全ての内容を把握しておく必要があった。
1行ずつ読んで、MB8876のマニュアルと照合しながら何の操作をしているか理解し、コメントを
ソースに書き加えるという作業をした。

 次の写真は、MZ-2000のオーナーズマニュアルに載っているIPLソースリストで、フロッピー
からの起動部分である。これを1行ずつ読みながら理解し、コメントを書き込んでいった。

 見づらいが・・・。

 (じつは、あとで全部打ち込み直した。コメントをきちんと書き込むためと、自分で改造することも
 視野に入れていた)

 他人の作ったものを持ってくる場合であっても、その内容を理解しておくのは重要である。

 実際、ゴール一歩手前で、どうしても分からない異常が発生し、なかなか原因が分からなかった。
どこに間違いがあるのか必死で探したものだ。

 一方、画面表示とキー入力は、X1とMZでは異なっているから、MZ用を独自に作る必要があっ
た。X1のハードウェアは詳しく知らなかったが、X1用CP/MのBIOSソースを見る限り、キーボードに
ワンチップマイコンを内蔵していて、そこからデータが来るようであった。MZ-2000はI/Oポートから
直接スキャンしている。完全に異なるやり方なのである。

 画面表示に関しては、BIOSにプログラムを追加して、MZ-2000の画面に表示が出るようにした。


●画面に文字を表示する

 次に示すのは、MZ-2000実機の画面である。いまでは珍しいグリーンディスプレイ。いまだ健在。



 こんな表示が出るまでには、それなりにプログラムを書く必要があった。
当たり前といえば当たり前だが・・・。現代ではそんなのを意識することはないので、画面の制御に
ついて細かく考えていくと興味深いかもしれない。

 画面表示には、ハードとソフトの境界線がある。表示(映像信号を作り出すこと)に関しては、ハードが
自動的にやってくれる。

 画面に文字を表示するには、基本的に、テキストVRAMに文字コードを書き込めばいい。
あとはハードウェアが、VRAMから文字コードを読み出し、CGROM(キャラクタジェネレータROM)から
フォントを取り出し、画面の走査線に従って映像出力するのを勝手にやってくれる。

 但し、注意しなければならないのは、VRAMにアクセスするプログラムはVRAMエリアを避けて
配置されなければならないということ。Z80のメモリ空間を4分割して、そのうちのRAMブロック3
をVRAMと切り替える方式だから、もし、RAMブロック3にVRAMアクセスのプログラムがあったら、
切り替え後に、VRAM上のデータをプログラムとして実行しようとするから暴走する。
 たとえれば、足場に載って作業していたら、いきなり足場が消えたような感じだ。
 VRAM上に、メモリ切り替えを元に戻すプログラムが書いてあれば戻れるだろうが、画面に
ゴミが出るからナンセンスだ。

 従って、BIOSのVRAMアクセス関係のルーチンは、VRAMアクセスとの干渉を避ける為、
アドレスE000h以降に配置するようにした。

 自分で新たに作った画面関係のルーチンは次の通り。
  STCRTC 画面モード80桁設定
  CTRLL 画面クリア
  CONOUT キャラクタディスプレイへの表示
  CONTRL, CTRLSB コントロールコードの処理
  CLEFT 左移動
  CHOME 画面ホーム位置
  CUP 上移動
  CRIGHT 右移動
  CDOWN 下移動
  CTRLG ベルを鳴らす
  SCROLL 画面1行スクロールアップ
  CURADR Y座標からVRAMアドレスを求める。
  CTRLM 改行
  CHRPUTV VRAMの指定アドレスにキャラクタを書き込む。
  CHRGETV VRAMの指定アドレスからキャラクタを読み出す。
  CURPUT カーソル表示
        (カーソルを表示する前に、表示位置にあった文字を保存)
  CURERA カーソル消去
        (カーソル表示時に保存した文字を書き戻す)


 ところで、なんでカーソルの表示/消去が必要かというと、カーソルを移動するためだ。
ゲームのキャラクタ移動でも基本は同じで、これからキャラクタを表示する位置の背景を保存
してから、その位置にキャラクタを描く。キャラクタを動かしたら、前の場所に、保存しておいた
背景を書き戻す。

 それらの操作をしなかったら、カーソルを移動するたびにカーソルの■で画面が埋まって
しまったりする。いつも、カーソルだけが単独で動いているように見えるけど、そうではなくて
ちゃんと手順を踏んで処理をしている。

 ついでに、カーソルの座標(X、Y)とVRAMアドレスの関係だが、以前は座標をX、Yで管理
して、VRAMアクセスの時だけアドレスに変換していた。しかしよく考えると、アドレスを直接
計算したほうがシンプルになる。

 ヨコ80文字としたら、アドレスに80を足せば、1行下の位置にカーソルが移動する。言うまでも
なく、80を引けば1行上の位置にカーソルが移動する。カーソルが行頭にある時、アドレスを
-1すれば1行上の右端に来る。

 もし画面の最も上の行の左端にあるとき、さらに-1しようとしても受け付けない。逆に、画面の
最も下の行の右端にある時、さらに+1したら1行スクロールアップしてカーソルは最も下の行の
左端に移動すれば良い。スクロールアップは、2行目の先頭の文字を1行目の先頭に持ってくる
ように、80バイトずつずらしてやれば良い。最も下の行は空白で埋める(埋めないと、直前の表示
が残ってしまう)。スクロールアップは、Z80のブロック転送命令で簡単にできる。

 このようにして条件判断とそれに対応する処理を追加した。



●フロッピーからの直接起動

 実は、これはまだできていない。(2010年現在も)

 現状、どのようにしてCP/Mを起動しているかというと、CP/MをHu-BASICのバイナリ
ファイルとして保存してある。
 一旦、BASICを起動してから、CP/MをBLOADする。それを実行することで、CP/Mを起動
している。フロッピーから直接起動しないだけのことで、CP/Mとしては普通に使える。
メモリ上、BASICは上書きされてしまうが、いったんCP/Mが起動すればもう関係ない。

 フロッピーからの起動のカラクリがはっきり分かれば、すぐにでも、フロッピーから
直接起動できるように作ることが出来る。

 あるいは拡張スロットにROMを入れて、そこからCP/Mを起動する方法もあると思う。
ROMは速いだろうけど、フロッピーからの起動だってWindowsの起動に比べたら、はるかに
速いんだけどね。(同じ土俵で比べるのはどうかと思うけど)


戻る