CP/M移植(4)
2024.02.16
MZ-2000へのCP/M移植で重要な役割を果たしたのは8251ボード(自作)だ。
外部との通信あってこそ、移植ができた。

本体を後ろから見た時に拡張BOXの左側、上から2段目にプリンタI/Fのスロットがある。
そのプリンタI/F基板から配線を引き出し、自作のボードをくっつけた。

WindowsのPCでBIOSをアセンブルし、そのHEXをRS-232C経由でMZへ送る。

MZ側ではBASICでHEXの受信プログラムを作った。BIOSが実際にロードされる番地へ、受信したデータを書き込んでいく。

当然BASICは遅いからとりこぼさないように、送り出し側のPCでは十分にウェイトを入れた。とにかく確実性を重視した。

遅いのは見ているから遅く感じるのであって、ほかの用事でもやっていればいつの間にか終わっているものである。

とにかくMZのRAM上におさまれば、しめたもの。これをBSAVEでフロッピーに保存する。CP/Mを構成する他のファイルも同じようにした。

RAMに必要な物を全部ロードした状態で、BIOSの先頭番地へジャンプすれば、これでCP/Mが起動するわけである。
但し、ジャンプする前にフロッピーをCP/M用に(忘れずに)入れ替えておく必要がある。

この時点でのBIOSは、1文字入力、1文字出力を8251にしてある。RS-232Cで操作するようになっている。
MZには画面もキーボードもあるが、これらを一切使わずに、つまりワンボードマイコンとあまり変わらない状態で使っていたわけだ。
WindowsのPCのTeraTerm画面にCP/Mの表示、なんとも奇妙な感じだったが、とにかく動き始めた。
DIRなど実行するとフロッピーにアクセスし、確かにCP/Mが動いた。
CP/M移植(3)
2024.02.16
親戚からもらったMZ-2000にCP/Mを移植しようとしたわけだが、じつは使用していたフロッピー一式の中に添付してくれていたらしい。
それを自分は気づかずに、どこかの段階で捨ててしまったようだ。

もともとは大阪の町工場で使われていたMZ、当時PC98互換機と入れ替わりになって不要となり、よかったらあげるよというのでもらった物。
その、くださった方から「CP/Mのディスクもあったでしょう」と後で言われた。(えっ、そうだったのか)

添付されていたフロッピーは、タバコのヤニと手垢にまみれて汚れがひどく、傷の入った物も多く、読み込ませてみるとエラーが出たりしてダメな物があった。

そして当時の自分の無知、シャープBASICとHu-BASICでお互いのディスクを読ませる事はできないという事を最初は知らず、
たとえばシャープBASICを動かしている状態で、Hu-BASICのディスクを読ませてみて、あれっ、エラーか、じゃあダメだなと(誤った)判断をしてしまった。

結局これらは全部ダメみたいだな、捨てるしかないな、というのでゴミと一緒に燃やしてしまったのである。(当時は自宅でゴミを燃やすのは普通で、いまのように禁止されていなかった)

そんなわけで、間違ってCP/Mのフロッピーを捨ててしまったために、はるかに遠い回り道への旅が始まったのである。
CP/M移植(2)
2024.02.16
とにかくBIOSのソースが曲がりなりにも参照できたのは助かった。これを元にして、修正を加えていった。
ただ、2004年の段階でバイナリから逆アセンブルしてソースを再現することもしていた。なぜかというと、移植後にうまく動かない事があり、疑義が生じたので他機種のBIOSの中身を確認してみたかったから。
結局それは読み込むセクター番号が間違っていただけで(わかるまでにはずいぶん回り道をしたが)、修正したら直った。

MZ-2000の場合、テキストVRAMがD000H~DFFFHになる。画面アクセス時、メインRAMの一部を切り換えてVRAMにしてからアクセスする。
従って、そのアドレス範囲にそのプログラムが存在すれば当然暴走してしまう。
そのため画面表示ルーチンをBIOSの終わりの方に置き、アセンブル後にこれらのルーチンがE000H以降に配置されているか、LSTファイルを確認していた。

画面関係のBIOSはMZ-2000用として全部自作した。
基本的にVRAMへの切り換えと、指定したアドレスへの書込だけだから難しくない。
・画面モードの切り換え(80x25)
・画面クリア
・1文字表示
・コントロールコードの処理(それぞれのコードに対する処理も)
・アドレスの計算(表示位置とVRAMアドレス)
・画面スクロールアップ
・Y座標からVRAMアドレスを求める
・カーソル表示
 (カーソルを表示する前に、表示位置にあった文字を保存しておく。カーソル移動した時に、元そこにあった文字を書き戻す)


FDDの読み書きルーチンは、印象としては難しく感じるが、すでに原型があったので意外とラクだった。
ただ、X1用なのでMB8877、MZ-2000はMB8876という違いがあり、データバスの論理が反転している。そこで、FDCとのI/O命令のところにCPLを追加していった。
当然I/Oアドレスも実機に合わせて変更した。
単純な書き換えだけではなく、それぞれが何の動作をしているか、FDCのマニュアルを見ながら理解しコメントを書き加えていった。
結局あとでうまく動かない時に、細かく見直す必要があったから、そのようにしておいて正解だった。

調べる都度、データシートを開いて見るよりも、最初からソースにレジスタのビットの割り付けとか機能をコメントとして書いておくと便利。

- CafeLog -