The CCP Auto-Load Feature ― 2018年10月04日 15:40
TRN-8は、ROM上にCCP/BDOS、CBIOS、ROMBIOSを持っているので、 ディスケット上にシステムを書き込んでいなくとも、リブートできる。(ドライブAに、 フォーマット済みのディスケットを入れておかねばならないが)
だが、ディスクからシステムを読み込む方が、融通が聞くことがある。
さて、Digital Research Source Code にCP/Mのパッチを集めたパッケージ"PATCHES"がある。 これをダウンロードして眺めていると、"The CCP Auto-Load Feature(CPM22APN.01)"というのがあった。 内容は、CCPがロードされるごとに特定のプログラムを動かすという物だ。これはCCPの一部にパッチをあてることで実現している。
これを実現するのは、現状のTRN-8ではROMを書き換えが必要である。が、TRN-8は、ジャンパーを1本飛ばすことで、CCP/BDOSをシステムディスクから読み込むようにできる。今回の実験には、この方が都合がよい。
ところが、システムディスクはどうやって作るかは、TRN-8の製作記事中では言及されていない。 手元にある村瀬康治氏の「実習CP/M」を参照し、システムディスクを作成した。
手順としては
1. MOVCPMで、63K CP/Mのイメージを作成する。
2. DDTで、CP/MのイメージとCBIOSを結合する。
3. 次いで、パッチをあてる。
4. SYSGENで、システムイメージをシステムディスクに書き込む。
となる。ワークディスクを用意して早速やってみる。
a>dir A: MOVCPM COM : DDT COM : CBIOS HEX : SYSGEN COM A: STAT COM a>movcpm 63 * CONSTRUCTING 63k CP/M vers 2.2 READY FOR "SYSGEN" OR "SAVE 34 CPM63.COM" <==== メモリー上にシステムが展開された。 63K CP/M VER 2.2 (BIOS VER 3.1) (C) 1988.12.1. K.YOSHIDA a>save 34 cpm63.com <==== 展開されたシステムをファイルに落とす。 a>dir A: MOVCPM COM : DDT COM : CBIOS HEX : SYSGEN COM A: CPM63 COM : STAT COM a>ddt cpm63.com <==== システムイメージをロードする。 DDT VERS 2.2 このうち必要なの0980Hから1F80Hである。 NEXT PC 2300 0100 -icbios.hex -r2980 <==== CBIOS.HEXをオフセット2980Hをつけて読み込む。 NEXT PC 実際には、1F80Hから配置される。 2300 F600 63K CP/M VER 2.2 (BIOS VER 3.1) (C) 1988.12.1. K.YOSHIDA a>sysgen <==== メモリー上のシステムイメージをディスクに書き込む。 SYSGEN VER 2.0 FOR TRN-8 (C) 1988.12.1. K.YOSHIDA SOURCE DRIVE NAME (OR RETURN TO SKIP) DESTINATION DRIVE NAME (OR RETURN TO REBOOT)a <== ドライブAのディスクに書き込む。 DESTINATION ON A, THEN TYPE RETURN FUNCTION COMPLETE DESTINATION DRIVE NAME (OR RETURN TO REBOOT) 63K CP/M VER 2.2 (BIOS VER 3.1) (C) 1988.12.1. K.YOSHIDA a>
ここで、いったん電源を落としディスクからシステムを読み込むようにジャンパーを設定する。 再起動すると、
63K CP/M VER 2.2 (BIOS VER 3.1) (C) 1988.12.1. K.YOSHIDA A>dir A: MOVCPM COM : DDT COM : CBIOS HEX : SYSGEN COM A: CPM63 COM : STAT COM A>ddt cpm63.comお気づきであろうか。コマンドプロンプトが、小文字から大文字に変わった。 システムディスクをAドライブにセットしておかないと、システムはハングアップする。 うまくいっているようだ。
さて、"CCP Auto-Load Feature"の実験である。この機能は、コマンドをCCPに引き渡すバッファーに あらかじめコマンドを書き込んでおくことで実現している。システムがロードされる都度、コマンドが 実行される。サンプルは"dir"コマンドを実行するという物。先に作成したシステムディスクを 使用して、設定をする。
A>dir A: MOVCPM COM : DDT COM : CBIOS HEX : SYSGEN COM A: CPM63 COM : STAT COM A>ddt cpm63.com DDT VERS 2.2 NEXT PC 2300 0100 -icbios.com <==== おっと、間違えた。 -icbios.hex <==== 正しく入力し直し。 -r2980 NEXT PC 2300 F600
セットするのは、
0987Hにはコマンド文字の長さ
0988Hからはコマンド文字列を書き込み、最後に00Hを書き込む
である。
-d980 9af 0980 C3 5C E3 C3 58 E3 7F 00 20 20 20 20 20 20 20 20 .\..X... 0990 20 20 20 20 20 20 20 20 43 4F 50 59 52 49 47 48 COPYRIGH 09A0 54 20 28 43 29 20 31 39 37 39 2C 20 44 49 47 49 T (C) 1979, DIGI -s987 0987 00 3 <==== コマンド文字列の長さは、3バイト。 0988 20 44 <==== "D" 0989 20 49 <==== "I" 098A 20 52 <==== "R" 098B 20 0 <==== 00Hでターミネートする。 098C 20 . -g0 63K CP/M VER 2.2 (BIOS VER 3.1) (C) 1988.12.1. K.YOSHIDA A>sysgen SYSGEN VER 2.0 FOR TRN-8 (C) 1988.12.1. K.YOSHIDA SOURCE DRIVE NAME (OR RETURN TO SKIP) DESTINATION DRIVE NAME (OR RETURN TO REBOOT)a DESTINATION ON A, THEN TYPE RETURN FUNCTION COMPLETE DESTINATION DRIVE NAME (OR RETURN TO REBOOT) 63K CP/M VER 2.2 (BIOS VER 3.1) (C) 1988.12.1. K.YOSHIDA A: MOVCPM COM : DDT COM : CBIOS HEX : SYSGEN COM <==== DIRコマンドが A: CPM63 COM : STAT COM 実行された。 A>^C 63K CP/M VER 2.2 (BIOS VER 3.1) (C) 1988.12.1. K.YOSHIDA A: MOVCPM COM : DDT COM : CBIOS HEX : SYSGEN COM A: CPM63 COM : STAT COM A>b: <==== ドライブを変えて B>^C <==== リブートすると。 63K CP/M VER 2.2 (BIOS VER 3.1) (C) 1988.12.1. K.YOSHIDA B: ARGLIST COM : COMP COM : FUTY COM : XSUB COM <==== ドライブBの B: ASM COM : DDT COM : LOAD COM : PIP COM ディレクトリーが B: XFORMAT MAC : XMODEM COM : PEP COM : DELETE COM 表示される。 B: UNCR COM : SUB2COM COM : USQ COM : DELBR COM B: LHRD COM : ARK COM : LHVW COM : UNZIP COM B: CRUNCH20 COM : TYPELZ20 COM : UNCR20 COM : UNARC COM B: UNARCA COM : XFORMAT COM : SUBMIT COM : ED COM B: M80 COM : L80 COM : MAKESYM COM : 8080 MAC B: Z80ASM DOC : FORMAT COM : README LNK : TRN-8 MAC B: ARKZS COM : COMPARE LIB : ZSIDP COM : 64180 MAC B: FUTY Z80 : SLR180 COM : 180FIG COM : Z80ASM COM B: SLRNK1 COM : SLRIB COM : FUTY REL : ZSID COM B: FUTY LST : CONFIG COM : MDUMP COM : FDUMP COM B: TYPEX COM : XDIR COM : SID COM : HIST UTL B: TRACE UTL : STAT COM : TEST COM : ECHO COM B: LC COM : AUTOEXEC SUB : AUTOEXEC BAK
リブートするごとに、"DIR"コマンドが実行される事が確認できた。
WordMaster 動かしてみた ― 2018年10月20日 21:24
まずはじめに、皆様にごめんなさいを言わねばならない。それは、前に公開した STRLIB.RELのESCAPEモジュールにバグがありました。ごめんなさい。サンプルで作ったプログラムでは、 何事もないように動いてしまいうまい具合にできたと思っていました。 修正版と差し替えました。これです STRLIB.ZIP。
さて、本題。TRN-8のプログラムはCP/M付属のEDで書いてきた。そんなに長いプログラムを書くことがなかったし、 必要最低限の機能が備わっているので特段の不自由を感じてはいなかったが、でも、やはり楽をしたい。
CP/Mには非常に多くのテキストエディターが存在するが、その中でもWordMasterが一番人気ではないだろうか。 現代はよくした物で過去の遺産を引き継いで保管してくださる方々が沢山いる。CP/M関連では The *HUMONGOUS* CP/M Software Archivesからたどると、歴史的遺産が手に入る。WordMasterは、 そこからThe Retrocomputing Archiveをたどって、 CP/M Text Editors and Word Processorsページで入手した。
入手したパッケージには、インストーラーとかコンフィグレーターが無く、その代わりアセンブラーで書かれた5本の サンプルコードが付属していた。これを手本に自分の環境"ANSIターミナル"に合わせてカスタマイズ(改造)し、パッチを当てれば、 WordMasterが動作するだろうと至極楽観的な考えで作業を始めた。 なお、入手したパッケージに含まれるファイルは以下の通り。
- BEE.ASM -- BEEHIVE 150 (CROMEMCO 3100)用にカスタマイズされたファイル(これをカスタマイズした)
- H89.ASM -- HEATH H89 または H19 TERMINAL用にカスタマイズされたファイル
- HAZ.ASM -- HAZELTINE 1500用にカスタマイズされたファイル
- LSI.ASM -- ADM3-A、SOROC-IQ/120 と IMSAI VIO用にカスタマイズされたファイル
- SOL.ASM -- PTCO-SOL用にカスタマイズされたファイル
- WM.COM --- WordMaster本体
- WM.HLP --- ヘルプファイル
- WMH89.COM -- たぶんH89.ASMでカスタマイズされたWordMaster
- WM-SOROC9.COM -- たぶんSOL.ASMでカスタマイズされたWordMaster
パッチの当て方の予想は、
1:パッチ用のASMファイルを作りASMでアセンブルして、HEXファイルを作る。
2:DDTでWordMasterを読み込む。
3:アセンブル済みのパッチを上書きする。
4:メモリー上にできあがったWordMasterをSAVEでファイルに落とす。
と見当をつけた。
まずは、パッチファイルの確認。全てのパッチファイルには本体からコールされたり、変数領域として 参照されるところがある。これらのアドレスは固定である。パッチを作成する上で埋め込むことのできる コードの領域が制限される。ひとまず、全てのパッチファイルをアセンブルしてみた。 案の定、それらのアドレスが出てきた。
1:画面コントロール用ロジックが、2つ。これをカスタマイズする。
2:動作環境のパラメーターを入れておく変数領域。コメントをよく読んで、設定値を入れる。
画面コントロール用ロジックは、画面消去ロジックとカーソル位置コントロール ロジックである。適当に拡張用のメモリースペースがあり楽ちんと考えていたが、はまってしまった。
画面クリアロジックは、2Byte余り。とりあえずNOPでつぶす。
カーソル位置ロジックは一時変数領域も含めて48Byteオーバー。スペア用の領域を使い切っても、 33Byteオーバーしてしまう。
最初のパッチ:ANSI0000.ASM)
パッチ第二弾:ANSI0001.ASM)
どうした物かとソースファイルを眺めてたら、下記のようなコメントを発見。
; **** MODIFYABLE CONSTANTS ***** ;PBEGMEM POINTS TO BEGINNING OF MEMORY TO USE ;FOR EDIT BUFFER AND SCRATCHPAD. IF SPACE IS NEEDED ;FOR PATCHES, PUT THEM WHERE THIS POINTS AND ;INCREASE THIS POINTER. REMEMBER TO USE A LARGE ;ENOUGH "SAVE" COMMAND!編集用バッファ領域をちょこっともらって解決できそう。やってみる。テスト版パッチファイルは ANSI0002.ASM。
作業手順は以下の通り。想定の範囲内であった。
C>A:DDT DDT VERS 2.2 -IWM.COM -R NEXT PC 2700 0100 -IANSI0002.HEX -R NEXT PC 29EE 0000 -G0 63K CP/M VER 2.2 (BIOS VER 3.1) (C) 1988.12.1. K.YOSHIDA C>SAVE 41 WMANSI.COM C>DIR WMANSI.COM C: WMANSI COM C>
動作確認。先頭の写真の通りWordMasterが動いた。実はまだ動作がおかしい。最下段の行の表示が、 うまくスクロールしてくれない。これはパッチファイル中、画面行数の設定値を調整し解決した。
パッチファイルの最終版は ANSI.ASM。 ご興味がありましたらご参照ください。
これで、CP/Mの開発環境が10年ぐらい進歩したと思う。
TRN-8にReal Time Clock(RTC)を ― 2018年10月29日 09:53
TRN-8は今日も快調に動いている。こうなると欲が出てくるものだ。
ソフトウェア入手は、インターネットから適当に入手できる。けれどハードウェアは、 そうはいかない。自分で工作しなければいけない。
以前からTRN-8に時計をつけたかった。 いわゆるReal Time Clock、RTCである。タイマー割り込みを使ってソフトウェア的に作ることもできるが、 RTCチップで実現した。チップはセイコーエプソンのRTC-7301 DGである。秋月電子で購入できる。 何の変哲も無い回路である。アドレスデコーダーはGALを使って楽をした。またLDCキャラクターディスプレー のインターフェイスも作り込んである。
ソフトウェアは、
を準備した。今回の制作では、とんだ失敗をしてしまった。有休品再利用を考えRTC用のソケットに板バネのICソケットを 使用した。再利用品である。ここでしくじった。ソケットのコンタクトが変形していて正しく 接触していなかった。これがよく分からず。オシロスコープまで持ち出した。オシロスコープは強い味方であるが、今回は、 目の方が有効であった。丹念に目視すると、接触端子が変形しているのを確認できた。やられた。 丸ピンソケットと交換し、シグナルがICのピンまで来ていることをオシロスコープで確認できた。前述のプリグラムで、 動作を確認できた。
時計が付いたら是非やってみたいことがある。ファイルにタイムスタンプをつけたい。 タイムスタンプをサポートしているCP/M互換(上位コンパチ)DOSを動かしてみたい。実は、もう目星をつけている物がある。 これは、後日。
最近のコメント