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が動いた。
外部との通信あってこそ、移植ができた。
本体を後ろから見た時に拡張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のフロッピーを捨ててしまったために、はるかに遠い回り道への旅が始まったのである。
それを自分は気づかずに、どこかの段階で捨ててしまったようだ。
もともとは大阪の町工場で使われていた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のマニュアルを見ながら理解しコメントを書き加えていった。
結局あとでうまく動かない時に、細かく見直す必要があったから、そのようにしておいて正解だった。
調べる都度、データシートを開いて見るよりも、最初からソースにレジスタのビットの割り付けとか機能をコメントとして書いておくと便利。
ただ、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のマニュアルを見ながら理解しコメントを書き加えていった。
結局あとでうまく動かない時に、細かく見直す必要があったから、そのようにしておいて正解だった。
調べる都度、データシートを開いて見るよりも、最初からソースにレジスタのビットの割り付けとか機能をコメントとして書いておくと便利。
CP/M移植(1)
2024.02.15
2004年頃にMZ-2000へのCP/M移植をした話は、すでに自分のサイトで書いた。ちょっと久しぶりに思い出してみる。
最初に取り組んだのは高校生の頃で、昭和の末期だった。
図書館から借りてきた本によると、CP/Mは移植できるようだ。その程度の知識からのスタートだった。
ちょうど親戚からもらったMZ-2000が有り、64KB RAM空間だからCP/Mを動かすのにはちょうど良い。
そして当時は、開発ツールがないからハンドアセンブルしかなかった。Z80の命令表を下敷きに入れて持ち歩き、それを見ながらニーモニックをマシン語へ変換していく。
良く出てくる命令は、前に使った部分から書き写せば良いし、やっているうちに覚えてしまい、今でも覚えている。
ある番地から別の番地へのブロック転送は、21 00 00 11 00 80 01 00 20 ED B0 C9 とか。
こんな事に脳の記憶容量を浪費しているなんて。
ハンドアセンブルから脱却しないと、ある程度の規模のプログラムを作るのは非常に効率が悪い。とにかく開発ツールが欲しかった。CP/M上でM80を動かしたかった。
CP/Mはどこから持ってくるかと考えて、いけない事だがPC-8001用とX1用をどこからか入手した。
これを元にして、基本的にはBIOSをMZ-2000用に作れば良い。フロッピーからロードする手段は、また別に必要になる。
PC-8001用やX1用のフロッピーは、MZ-2000で直接読み出す事はできない。直接、というのはたとえばBASICでFILESとやればファイル名のリストが出てきてLOADできるとか、そんなレベルの話。こんなふうに簡単にはできないということ。
とりあえずセクターダンプでは中身をのぞくことができた。但し、FDCの違いによってバスの論理が逆転しているから(MZ-2000はMB8876、他の機種はMB8877など)、論理反転して読み込んでみた。
何番のセクターからどこまでがどのファイルか、なんてのは当時わからなかったから、とにかくひとつずつ読み込んでみて、たぶんここからここまでかな、この分があのファイルじゃないだろうか、と推測していた。
ダンプしていくとテキストファイルだと文字が見えてきて、どうやらこれはBIOSのソースだなと把握することができた。
こうして抽出したテキストをファイル化して、ソースを別のPC上に再現したのは2004年の話。
高校生の当時は、紙にプリントして、うーんと考えるばかり。どこをどう直したら良いんだ?しかもハンドアセンブルで全体を・・・? まだまだ実力が足りなかった。
2004年に取り組んだ時には、別のPC上でソースをアセンブルできる環境があったから、とにかく仕事が進んだ。
ん? 開発環境があるなら今更MZに移植しなくても? (まあ、いいじゃないですか)
最初は1文字入力と出力をシリアル通信に割り当てて、WindowsのPCから通信してCP/Mを動かしていた。そのうちにMZの画面に文字表示できるように作っていったっけ。キーボード入力は作るのが面倒くさくて結局作ってない。
フロッピーから直接CP/M本体を読み込んでブートする方法は最初自分でできなかったから、考えたのはBASICからBLOADすることだった。
とにかくBASIC上で、RAMの空いたところにCP/Mのファイルを読み込んでいき、そこで修正をかけたものをBSAVEして保存すれば!
ちょうど良いことにCP/Mの存在するアドレスとBASICのワークエリアとは干渉しない。
一部だぶったっけ。もう忘れたが、とにかく最初BASICが起動し、それからCP/MをBLOADして、CP/Mへジャンプしたら後はCP/Mだけが動く世界。
最初に取り組んだのは高校生の頃で、昭和の末期だった。
図書館から借りてきた本によると、CP/Mは移植できるようだ。その程度の知識からのスタートだった。
ちょうど親戚からもらったMZ-2000が有り、64KB RAM空間だからCP/Mを動かすのにはちょうど良い。
そして当時は、開発ツールがないからハンドアセンブルしかなかった。Z80の命令表を下敷きに入れて持ち歩き、それを見ながらニーモニックをマシン語へ変換していく。
良く出てくる命令は、前に使った部分から書き写せば良いし、やっているうちに覚えてしまい、今でも覚えている。
ある番地から別の番地へのブロック転送は、21 00 00 11 00 80 01 00 20 ED B0 C9 とか。
こんな事に脳の記憶容量を浪費しているなんて。
ハンドアセンブルから脱却しないと、ある程度の規模のプログラムを作るのは非常に効率が悪い。とにかく開発ツールが欲しかった。CP/M上でM80を動かしたかった。
CP/Mはどこから持ってくるかと考えて、いけない事だがPC-8001用とX1用をどこからか入手した。
これを元にして、基本的にはBIOSをMZ-2000用に作れば良い。フロッピーからロードする手段は、また別に必要になる。
PC-8001用やX1用のフロッピーは、MZ-2000で直接読み出す事はできない。直接、というのはたとえばBASICでFILESとやればファイル名のリストが出てきてLOADできるとか、そんなレベルの話。こんなふうに簡単にはできないということ。
とりあえずセクターダンプでは中身をのぞくことができた。但し、FDCの違いによってバスの論理が逆転しているから(MZ-2000はMB8876、他の機種はMB8877など)、論理反転して読み込んでみた。
何番のセクターからどこまでがどのファイルか、なんてのは当時わからなかったから、とにかくひとつずつ読み込んでみて、たぶんここからここまでかな、この分があのファイルじゃないだろうか、と推測していた。
ダンプしていくとテキストファイルだと文字が見えてきて、どうやらこれはBIOSのソースだなと把握することができた。
こうして抽出したテキストをファイル化して、ソースを別のPC上に再現したのは2004年の話。
高校生の当時は、紙にプリントして、うーんと考えるばかり。どこをどう直したら良いんだ?しかもハンドアセンブルで全体を・・・? まだまだ実力が足りなかった。
2004年に取り組んだ時には、別のPC上でソースをアセンブルできる環境があったから、とにかく仕事が進んだ。
ん? 開発環境があるなら今更MZに移植しなくても? (まあ、いいじゃないですか)
最初は1文字入力と出力をシリアル通信に割り当てて、WindowsのPCから通信してCP/Mを動かしていた。そのうちにMZの画面に文字表示できるように作っていったっけ。キーボード入力は作るのが面倒くさくて結局作ってない。
フロッピーから直接CP/M本体を読み込んでブートする方法は最初自分でできなかったから、考えたのはBASICからBLOADすることだった。
とにかくBASIC上で、RAMの空いたところにCP/Mのファイルを読み込んでいき、そこで修正をかけたものをBSAVEして保存すれば!
ちょうど良いことにCP/Mの存在するアドレスとBASICのワークエリアとは干渉しない。
一部だぶったっけ。もう忘れたが、とにかく最初BASICが起動し、それからCP/MをBLOADして、CP/Mへジャンプしたら後はCP/Mだけが動く世界。
非常用電源
2024.02.12
ポータブル電源は、まだ手が出ません。何と言っても安全性が気になります。リチウムイオン電池の発火事故が怖くて。
それに電池の特性では長期保存時に半分程度の充電にしておかなければなりません。満充電だと寿命が縮みます。その管理も厄介です。
使いたい時に容量半分だとどうなのかと思うし・・・
そこで個人的には鉛バッテリーなのかな、やっぱり、と考えています。

(写真は一例)
カーバッテリー同様に、常時満充電を維持することが基本になっています。
UPSも未だに鉛バッテリーが良く使われています。
浮動充電(常時弱い電流で補充電)を行っていれば、いざという時に満充電で使えます。
欠点は重いことです。なにしろ鉛ですから・・・
これと安価なインバータを組み合わせる。さすがに冷蔵庫まで動かそうとは思いませんが、身の回りの照明とか通信手段に利用できれば。
そしてUSB機器の充電ができるようにすることです。
それに電池の特性では長期保存時に半分程度の充電にしておかなければなりません。満充電だと寿命が縮みます。その管理も厄介です。
使いたい時に容量半分だとどうなのかと思うし・・・
そこで個人的には鉛バッテリーなのかな、やっぱり、と考えています。

(写真は一例)
カーバッテリー同様に、常時満充電を維持することが基本になっています。
UPSも未だに鉛バッテリーが良く使われています。
浮動充電(常時弱い電流で補充電)を行っていれば、いざという時に満充電で使えます。
欠点は重いことです。なにしろ鉛ですから・・・
これと安価なインバータを組み合わせる。さすがに冷蔵庫まで動かそうとは思いませんが、身の回りの照明とか通信手段に利用できれば。
そしてUSB機器の充電ができるようにすることです。