The CCP Auto-Load Feature2018年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

右端がRTC-7301DG.(まだまだ空き地がある)

TRN-8は今日も快調に動いている。こうなると欲が出てくるものだ。

ソフトウェア入手は、インターネットから適当に入手できる。けれどハードウェアは、 そうはいかない。自分で工作しなければいけない。

以前からTRN-8に時計をつけたかった。 いわゆるReal Time Clock、RTCである。タイマー割り込みを使ってソフトウェア的に作ることもできるが、 RTCチップで実現した。チップはセイコーエプソンのRTC-7301 DGである。秋月電子で購入できる。 何の変哲も無い回路である。アドレスデコーダーはGALを使って楽をした。またLDCキャラクターディスプレー のインターフェイスも作り込んである。

ソフトウェアは、

を準備した。

今回の制作では、とんだ失敗をしてしまった。有休品再利用を考えRTC用のソケットに板バネのICソケットを 使用した。再利用品である。ここでしくじった。ソケットのコンタクトが変形していて正しく 接触していなかった。これがよく分からず。オシロスコープまで持ち出した。オシロスコープは強い味方であるが、今回は、 目の方が有効であった。丹念に目視すると、接触端子が変形しているのを確認できた。やられた。 丸ピンソケットと交換し、シグナルがICのピンまで来ていることをオシロスコープで確認できた。前述のプリグラムで、 動作を確認できた。

時計が付いたら是非やってみたいことがある。ファイルにタイムスタンプをつけたい。 タイムスタンプをサポートしているCP/M互換(上位コンパチ)DOSを動かしてみたい。実は、もう目星をつけている物がある。 これは、後日。