最終更新日: 2001/10/08
1986年ごろから、PC-8801で動くCP/MやTurbo Pascal 3.0Aで遊んでました。
大学の講義で、Pascalを勉強することになったのがそのきっかけです。
また、その講義を担当されていた先生から、
「ソフトウェア作法」という本を教えてもらい、
ずぶずぶとハマってしまったころでもあります。
あげくのはてに、CP/MとTurbo Pascalの組み合わせで、リダイレクトや
パイプライン処理ができるようなライブラリまで作ってしまいました。
と、それはさておき…
そのころ、友人が使っていたシャープのX1 turboでは、 CP/Mで日本語が扱えた (日本語の表示ができた&&単漢字変換で日本語入力ができた) のですが、わたしの使っていたPC-8801のCP/M、PS88-104-2Wでは、 そのようなことができませんでした。
そこで、BIOSのコンソール出力ルーチンをフックして、 漢字ROMからひっぱってきた文字フォントを使って グラフィックスVRAMに文字を描画するようにしてみました。
ずいぶん前に作ったので、記憶が…(苦笑) なんですが、 画面制御エスケープシーケンスも使えるようにしてて、 Turbo Pascalのスクリーンエディタや、 WordMasterなんかも動きました。
PC-8801は、4MHzのZ80AコンパチCPUで動いていました。 まぁ出た当初からもそんなに速いマシンではありませんでしたが、 グラフィックスVRAMに文字を描画させると、 ますますその遅さを実感することができました。
クロックアップなども行ってみましたが、 長時間動作させると不安定なので、すぐにヤメました(苦笑)。
そこで、できるだけ画面表示が速くなるように、 画面がちらつくかわりに描画が速くなるモードを利用する といった工夫もこらしてみました。 手前ミソですが、当時発売されていたワープロソフトなどと比べても いい勝負ぐらいの処理速度を確保したつもりです。 また、画面表示において、一番重かったのはスクロール処理なので、 ジャンプスクロールとか、スクロールしないモードなども サポートして、一人悦に入ってました(苦笑)。
さすがに、かな漢字変換までは作ることができませんでした。
PC-8801のメモリマップはこんなのでした(…だったと思います(^^;)。
Main RAM ROM0 ROM1 0000 +-----------+ +-----------+ +-----------+ | | | | | | | | | N88-BASIC | | N-BASIC | | | | | +-----------+ | | | | | monitors | 8000 +-----------+ +-----------+ +-----------+ |Text Window| 8400 +-----------+ | | | | GVRAM0 GVRAM1 GVRAM2 C000 +-----------+ +-----------+ +-----------+ +-----------+ | | | | | | | | | | | | | | | | FFFF +-----------+ +-----------+ +-----------+ +-----------+CP/Mは、メインメモリ (Main RAM) で動いて、 先頭にCP/Mのワークエリア、 後ろの方にCP/MのOSそのものと 機種に依存したBIOSが配置されます。 メモリマップは、PS88-104-2Wのデフォルト (56k CP/M) では以下のようになります。
0000 +---------+ |work area| 0100 +---------+ | | | | |free area| | (TPA) | | | C400 +---------+ | CCP | CC00 +---------+ | BDOS | DA00 +---------+ | BIOS | F300 +---------+ |BIOS WORK| FFFF +---------+CCP (Console Command Processor) は、 ユーザが入力したコマンドを解釈する部分で、 BDOS (Basic Disk Operationg System) は CP/M のメイン部分になります。 BIOS (Basic Input Output System) は、 機種依存のディスクI/OやコンソールI/Oなどの ハードウェアに直結したデバイスドライバです。 BIOS WORKはテキストVRAMや割り込みベクタなどが配置されています。
free area (TPA; Transient Program Area) は、 アプリケーションで自由に使える領域です。 エディタやコンパイラなどのアプリケーションは、 この領域にロードされて実行されます。 (実際には、CCPの領域までをオーバレイして使えます。)
PS88-104-2Wでは、movcpm5コマンドをつかって、 BIOS (およびCCPやBDOS) の開始アドレスを変更する (要するに上のメモリマップで「free area」を小さくする) ことができます。 たとえば、52k CP/Mでは、以下のようになります。
0000 +---------+ |work area| 0100 +---------+ | | |free area| | | B400 +---------+ | CCP | BC00 +---------+ | BDOS | CA00 +---------+ | BIOS | E300 +---------+ | (*1) | F300 +---------+ |BIOS WORK| FFFF +---------+このうち、 (*1) の領域は、BIOSを拡張するための領域になります。 installコマンドを使って、ドライバルーチンを この領域にロードすると、 オプションの8インチフロッピードライブや ハードディスクが使えるようになります。 また、それらのドライバルーチンを使わなければ、単なる空き領域になります。
CP/Mで、日本語を表示するためのルーチンの置き場所は、 必然的にこの領域になります。 ですが、ここに置くと、日本語を表示するために使うグラフィックスVRAMとアドレスが カチ合ってしまいます。 そのままでは、ここに置いたルーチンからは、VRAMにアクセスできません。 そこで、PC-8801のテキストウィンドウ機能を使ってこの問題を解決しました。 テキストウィンドウは、メインメモリの8000〜83FFの領域に、 任意のメインメモリのうちの1kバイトをハードウェアでマッピングする機能です。 つまり、 日本語を表示するときに、グラッフィクスVRAMにアクセスしたいときだけ、 BIOSの一部を 8000〜83FF にマッピングするという手段をとりました。
normal VRAM access 0000 +---------+ +---------+ |work area| |work area| 0100 +---------+ +---------+ | | | | |free area| |free area| | | | | 8000 | | +---------+ | | | part of | | | |japanized| | | | BIOS | 8400 | | +---------+ | | | | | | |free area| | | | | B400 +---------+ +---------+ | CCP | | CCP | BC00 +---------+ +---------+ C000 | BDOS | +---------+ CA00 +---------+ | | | BIOS | | | E300 +---------+ | | |unused(?)| | | E600 +---------+ | GVRAM | |japanized| | | | BIOS | | | F000 +---------+ | | |unused(?)| | | F300 +---------+ | | |BIOS WORK| | | FFFF +---------+ +---------+この仕組みをつかって、 CP/Mで日本語表示をできるようにしました。 ハードウェアを骨までしゃぶるようなプログラムっちゅうか(笑)。