PC-6001mkII/6601 CP/M導入メモ・その3
導入メモその1とその2に続き、今度はSR専用版のCP/M BIOSを書いてみました。mkII/6601版をちょっと変えただけのものではあるのですが、せっかくなので公開します。
(2013.11.18追記:代替ROMファイルが破損していたため、正常なものに差し替えました)
PC-6601SRでCP/M。文字サイズを変えられるようにした
目次
基本的な機能は拙作のPC-6001mkII/6601版BIOSと同じですが、以下のような違いがあります。
- 57K CP/M
ユーザエリアが広くなりました。C7FFhまでがTPAです。
- 1DD用
mkII/66版も1DDにコンバート可能ですが、160KBしか使用できませんでした。SR専用版では1DDの320KBをフルに使えます。ディスクのブロックサイズは2KBで、かつて工学社より販売されていたSR用CP/Mディスクと恐らく互換性があるはずです。動作確認はPC-6601SRで行いましたが、たぶんPC-6001mkIISR+PC-6031SRでも動くのではないかと思います。mkIISR+SD6031では起動確認できました。
- 文字サイズ変更可能
width.comというトランジェントコマンドで、スクリーンサイズ (文字の大きさ) を変更できます。横幅は80か40、行数は25か20です。width 40 25とかwidth 80 20などと入力してください。起動時は80x25です。mkII/66用スクリーン1版のwidth.comと同じ名前ですが別物なので注意してください。
- RAMディスク機能搭載
ROM/RAMカートリッジの拡張RAM領域をRAMディスクとして使えるようにしてみました。ドライブEにアサインされます。PC-6006及びPC-6007SRを使ってテストしましたが、たぶんPC-6006SRでも大丈夫でしょう。ディレクトリ領域として1KB使うため、データ記憶領域の大きさは15KBもしくは63KBになります (自動判定)。電源オフによりデータは消えるので注意してください。
リセット時にはRAMの内容が保持されるようなので、起動時にディレクトリ領域の先頭バイトを確認し、適正な値 (00h〜0FhもしくはE5h)ならばリセット後と見なし、ファイルシステムの初期化を行わないようにしています。そのため、他の用途で拡張RAM領域を使用した直後、電源を切らずにCP/Mのディスクを入れ、リセットボタンを押して起動すると、誤動作する可能性があります。そういう場合は一旦電源スイッチを切るようにしてください。ちなみに、PC-6007SRでは電源オン直後はFFhと00hが64バイトずつ並ぶようです。PC-6006では一定しませんでしたが、それに近い値になろうとしている感じでした。
- 制御コード一部見直し
ベル(07h)を追加し、1Ch/1Dhによるカーソル左右移動は削除しました。かわりに、カーソルキー入力を08h/0Ah/0Bh/0Ch(^H^J^K^L)に変換するようにしてあります。また、HOME/CLRの入力も有効にしました。SOROC IQ120やADM-3Aという端末と概ね互換になっているはずです。
- カーソル常時表示
mkII/66版では、CONOUTというBIOSルーチンが呼ばれてキー入力待ちになった時のみカーソルを表示させていたのですが、SR版では常時表示するようにしました。そうでないとまともに遊べないゲームがあったので……。鬱陶しい場合は、F1キーを押すことで表示のON/OFFができます。
- 配布されているソースから、CP/Mのシステムイメージを作成します。手順は導入メモその1にある「CP/Mのアセンブル」の項目を見てください。ただし、CPM22.Z80の14行目の変更は、「MEM EQU 57」とします。
- 拙作のSR用BIOS(2013.11.18版)をダウンロードして展開します。
- 展開ディレクトリにcpm.binを置き、同梱のcpmdisk-sr.exeを実行します (Windowsの場合)。Windows以外の場合は、srcディレクトリにあるソースをコンパイルして使ってください。
- cpm.d88という348848バイトのファイルができます。
- NDitt等でディスクに書き込めば実機でCP/Mが起動します。
- 同梱のcpmadd-1dd.exeを使うと、ディスクイメージにファイルを追加することができます。コマンドプロンプト上で、
cpmadd-1dd input.d88 input1.bin [input2.bin ...] output.d88
のようにして使います。Windows以外の場合は、src/cpmadd-1dd.cをコンパイルして使ってください。
※指定した出力ファイルが既に存在している場合、問答無用で上書きするので注意してください。(出力ファイルの指定を忘れると、最後の入力ファイルが破壊されます!)
メモリマップは以下の通りです。SRはVRAMのアドレスを16通りに設定できるのが特徴で、4通りであるmkII/6601に比べると自由度が高く、その分ユーザエリアを広く取ることができました。大体のCP/Mアプリケーションには足りるのではないかと思います。ディスクアクセスのみROM内ルーチンを使用しているので、そのためのワークエリア (ED56h〜ED6Ch) を避けるように配置しました。
表3:SR版メモリマップ (57K CP/M)
アドレス | 内容
|
---|
0000h〜 | CP/Mワークエリア
|
0100h〜 | TPA (ユーザエリア)
|
C800h〜 | CCP (CP/M シェル部分)
|
D006h〜 | BDOS (CP/M OS部分)
|
DE00h〜 | BIOS
|
E500h〜 | ディスクリード用バッファ
|
E900h〜 | ディスクライト用バッファ
|
ED00h〜 | ROM内ディスクルーチン用ワークエリア
|
ED80h〜 | BDOS用ワークエリア
|
EF00h〜 | 割り込みテーブル、BIOS一時スタック
|
F000h〜 | VRAM
|
FFA0h〜 | 割り込みルーチン一時スタック
|
6601用と同じく、SR用の代替ROMファイルを同梱してみました。本来のROMとある程度の互換性があり、エミュレータでsystemrom1.68及びsystemrom2.68の代用品として使えます。とは言っても、拙作のSR用CP/M BIOSが動くための最低限の機能のみの実装です。
- 1DD、6601SRの内蔵ドライブからの起動用です。1Dや外付けドライブには対応していません。
- ブートルーチンについては、ROMを焼いたり交換したりする技術が無いため、実機での確認は行っていません。実機では動かない可能性が高そうな気がします。
- ディスクルーチンについては、入力パラメータの与え方やワークエリアのアドレスが違う以外は、66用代替ROMファイルとほぼ同じです。
- PC6001VW ver 307a2、iP6 Plus Rel.4.7でCP/Mの起動を確認しました。
実装されているサブルーチンは以下の2個です。
- N66SR-BASICの0000h (systemrom1.68の8000h): ディスクからのブート
- I/Oポート設定、仮の割り込みルーチン設定、画面設定、ディスクドライブの接続確認を行い、ドライブAの先頭セクタをC000h〜C0FFhに読み込んでから、C003hにジャンプします。
- 本来のROM内ルーチンでは、ディスクの先頭データ3文字が「IPL」「SYS」「RXR」のどれなのかによって処理が変わるのですが、その辺は実装していません。無条件で「IPL」の場合と似たような処理、即ち1DDとみなしてC003hの実行を行います。
- また、本来のROM内ルーチンではもっと色々な処理を行っていると思います。
- systemrom2.68の6FFDh: ディスクリード/ライト/チェック
- 標準物理フォーマットの1DDディスクに対し、セクタ単位でのアクセスを行います。
- 6601SRの内蔵ドライブのみの対応です。外付けドライブは読み書きできません。
- 入力:A=セクタ数、B=トラック、C=開始セクタ、DE=データアドレス、(ED66h)=ドライブ(0か1)、(ED67h)=エラーカウント初期値
- 出力:DE=DE+A*256(リード/ライトが成功した時)、エラー時CY=1
- 機能選択:書き込み(CY=1)、読み込み(CY=0、Z=0)、チェック(CY=0、Z=1)
- ED56h〜ED6Chをワークエリアとして使います。本来のROM内ルーチンで使われるのと同じ領域ですが、使い方は異なります。
- トラックをまたぐアクセスはできません。引き続きセクタ17をアクセスしに行くので、たぶんエラーになります。
SR用CP/Mは、かつて工学社より正式に販売されていたことがあります。自分は残念ながら所有していないのですが、雑誌などから抜粋した情報を参考のため書き留めておきます。
I/Oの1987年5月号162〜163ページに「PC-6601SRに5インチFDD[PC-803S1]をつなぐ」という記事があり、この中でSR用CP/Mの販売が告知されています。残念ながらリストの掲載はありませんでした。構成は「56K CP/M V2.2システムディスク+標準ユーティリティ+フルスクリーン・エディタFED66」となっています。CP/M用のアセンブラやCコンパイラも同時購入でき、また料金追加により5インチ2Dへのコンバートも可能でした。
販売については、通販ページのエキスパートサービスコーナーにこの後しばらく記載があります。付属マニュアルはエディタのものだけで、CP/M関係は無し。エキスパートサービスは、開発環境やツールのリスト打ち込みの手間を省くのが主旨のコーナーのようで、マニュアルは基本的に付かないものだったようです。なので、パッケージや一般流通についても無かったのではないかという気がします。
またこれより約2年前、I/Oの1985年8月号にて、第3回I/Oプログラムコンテストの入賞者が発表されており、「PC-6601SR用54K CP/M」が審査員奨励賞を受賞しています。これをそのまま販売したにしては間が空きすぎているのですが、わざわざ移植し直すのも手間でしょうし、関係があるのか無いのかよくわかりません。コンテストの方が54K CP/Mと書かれているのに対し、販売されたものは56K CP/Mとあるので、別物の可能性が高いのではと思いますが、誤植という可能性もあるかもしれません。
1988年に工学社より発売された「CP/M80の世界」(高山信毅)という本には、66SR用のCP/Mを使用した操作や活用の実例が載っています。恐らく工学社版のSR用CP/Mを使用していると思われるのですが、なぜか明言はされていません。I/Oにプログラムリストが掲載されたPC-6001mkII用CP/Mについての言及はあるのですが。この本のプログラムから推測するに、SR用CP/M BIOSは、画面表示などにROM BIOSやE600h-EFFFhのワークエリアを利用して動くように書かれているようです。
なんか書くことが少なかったのでおまけです。CP/Mとは関係のない話ですが。
初代プレイステーションの小型化版であるPS one用の液晶モニタSCPH-130は、15kHzのアナログRGBを表示可能であることが知られています(ビデオ入力も可能)。そこで、昔西田ラヂオさんのところで購入したRGBコンバータでP6のデジタルRGB出力をアナログRGBに変換し、変換ケーブルを作って接続してみました。
解像度があまり高くないのでハッキリクッキリとは行きませんが、まあそれなりには使えます。SRにはビデオ出力が無いので、いざという時の代替モニタとしてはありかもしれません。
トップ > 雑多なもの > PC-6001mkII/6601 CP/M導入メモ・その3