レトロマイコンZ80ボードの構想(その14)CP/MでのWM動作実験 [Z80]
前回の記事「レトロマイコンZ80ボードの構想(その13)」で書いたように CP/M が起動できた(まだまだ細かい調整は必要ですが)ので懐かしいソフトを動かしたりして遊んでいましたが、エディタが無いと何かと不便なのでWordMasterを動かしてみることにしました。
「CP/M Text Editors and Word Processors」からダウンロードできるので簡単に動かせるだろうと思っていましたが意外と難関でした・・・^^;
ネット上ではエミュレータで動かしている例はありましたが、リアルのCP/MでTeraTerm等を接続してWordMasterを動かしている例は見つからなかった(みんなどうしてるんだろう?)
ダウンロードしたWordMasterファイルには画面制御のエスケープシーケンスをカスタマイズできるようにアセンブラのサンプルソースが付いています。
昔、画面表示部分を作ったこともあったので思い出しましたが、当時のエスケープシーケンスは移動先のカーソル位置を表現するのにスペースコード(20H)に位置情報を足したコードで表現していて、カスタマイズ用のサンプルソースも同様でした。
しかし TeraTerm のVT100モード等ではANSIのエスケープコードが採用されていてカーソル位置情報を10進文字で表現する必要があります。
(ANSIエスケープコードは碧色工房さんのウェブサイト等を参照させていただきました)
WordMasterに添付されているカスタマイズ用のソースはWordMasterの画面制御部を置き換えるパッチ形式になっていて使用できる領域が小さくて通常の10進変換はとても入れ込めそうにありません・・・
小さな領域にマシン語コードを埋め込む・・これぞマイコンの醍醐味なのでチャレンジしてみました ^^
最大の問題はバイナリから十進数への変換です。当然除算処理が必要になってきますが、今回の用途に限って言えば10進2桁までの数字を対象としていいのでこの条件で簡略化した除算処理が下のリストです。
A-regで渡されたデータを処理し、E-reg に10の桁、A-reg に1の桁が入ります(やっていることは筆算の計算と同様)
エミュレータではなく、(ワザワザ)実機CP/M上のZSIDで動作確認しています ^^
Binary to Decimal Transfer(Z80 Assembler)
WordMaster内の1文字出力処理である OUTCHR のアドレスを確認したら相対ジャンプ到達範囲内だったので関数末尾の OUTCHRコールは相対ジャンプ化しました。
ESC+'[' の出力をサブルーチン化する等して細切れの使用可能領域に断片的にコードを埋め込み、とうとう完成と思ったところ、ESC+'[2J'での画面クリアではカーソルがホームに戻らないので画面が乱れることが判明・・・orz
もうこれ以上の処理は入らないと諦めかけたましたが、メモリダンプを見たところ、パッチ領域の直前がメッセージのアスキーデータ領域であることに気づき、メッセージの最後の部分の領域を若干拝借してコードを埋め込みました。 ^^;;
hexファイルのパッチ適用操作は下記の操作ログを参照してください。(シリアルNoをつぶして悪さしているみたいだけどそうじゃないよ)
WordMasterへのパッチ適用作業工程
WordMasterのカーソルが最上位行での上スクロール時の再描画ぶりを久々に見れて懐かしい・・^^
無事WordMasterが動作したことを記念してキャプチャを貼っておきます。
また、カスタマイズしたパッチソース(macro-80用)とヘキサファイルは下記からダウンロードしてください。
スクリーンの行数を24から32に変更しています(32行の画面じゃないと上スクロール時に画面が乱れます)
※2018/03/18 コメントに書いたように単純ループ式に変更しました。
WordMaster ANSI用パッチ
★追記 2020/12/04
24行モードに変更するパッチ適用方法(下記)を追記しました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
「CP/M Text Editors and Word Processors」からダウンロードできるので簡単に動かせるだろうと思っていましたが意外と難関でした・・・^^;
ネット上ではエミュレータで動かしている例はありましたが、リアルのCP/MでTeraTerm等を接続してWordMasterを動かしている例は見つからなかった(みんなどうしてるんだろう?)
ダウンロードしたWordMasterファイルには画面制御のエスケープシーケンスをカスタマイズできるようにアセンブラのサンプルソースが付いています。
昔、画面表示部分を作ったこともあったので思い出しましたが、当時のエスケープシーケンスは移動先のカーソル位置を表現するのにスペースコード(20H)に位置情報を足したコードで表現していて、カスタマイズ用のサンプルソースも同様でした。
しかし TeraTerm のVT100モード等ではANSIのエスケープコードが採用されていてカーソル位置情報を10進文字で表現する必要があります。
(ANSIエスケープコードは碧色工房さんのウェブサイト等を参照させていただきました)
WordMasterに添付されているカスタマイズ用のソースはWordMasterの画面制御部を置き換えるパッチ形式になっていて使用できる領域が小さくて通常の10進変換はとても入れ込めそうにありません・・・
小さな領域にマシン語コードを埋め込む・・これぞマイコンの醍醐味なのでチャレンジしてみました ^^
最大の問題はバイナリから十進数への変換です。当然除算処理が必要になってきますが、今回の用途に限って言えば10進2桁までの数字を対象としていいのでこの条件で簡略化した除算処理が下のリストです。
A-regで渡されたデータを処理し、E-reg に10の桁、A-reg に1の桁が入ります(やっていることは筆算の計算と同様)
エミュレータではなく、(ワザワザ)実機CP/M上のZSIDで動作確認しています ^^
|
WordMaster内の1文字出力処理である OUTCHR のアドレスを確認したら相対ジャンプ到達範囲内だったので関数末尾の OUTCHRコールは相対ジャンプ化しました。
ESC+'[' の出力をサブルーチン化する等して細切れの使用可能領域に断片的にコードを埋め込み、とうとう完成と思ったところ、ESC+'[2J'での画面クリアではカーソルがホームに戻らないので画面が乱れることが判明・・・orz
もうこれ以上の処理は入らないと諦めかけたましたが、メモリダンプを見たところ、パッチ領域の直前がメッセージのアスキーデータ領域であることに気づき、メッセージの最後の部分の領域を若干拝借してコードを埋め込みました。 ^^;;
hexファイルのパッチ適用操作は下記の操作ログを参照してください。(シリアルNoをつぶして悪さしているみたいだけどそうじゃないよ)
|
WordMasterのカーソルが最上位行での上スクロール時の再描画ぶりを久々に見れて懐かしい・・^^
無事WordMasterが動作したことを記念してキャプチャを貼っておきます。
また、カスタマイズしたパッチソース(macro-80用)とヘキサファイルは下記からダウンロードしてください。
スクリーンの行数を24から32に変更しています(32行の画面じゃないと上スクロール時に画面が乱れます)
※2018/03/18 コメントに書いたように単純ループ式に変更しました。
WordMaster画面 |
|
★追記 2020/12/04
24行モードに変更するパッチ適用方法(下記)を追記しました。
24行モードに変更するパッチ適用方法 |
---|
b>a:ddt wmm.com DDT VERS 2.2 NEXT PC 2700 0100 -s1b9 01B9 20 18 01BA 50 . -g0 b>save 38 wmm.com |
[TOP] [ 前へ ] 連載記事 [ 次へ ]
2018-03-17 17:51
nice!(0)
コメント(10)
記事をアップ後の散歩中に気が付いたけど・・
10進変換は10を何回引けるかの単純ループの方が短くなりそうですね
by skyriver (2018-03-17 19:43)
> 10進変換は10を何回引けるかの単純ループの方が短くなりそうですね
こんな感じですかね。
CnvCal:
LD DE, 0AFFH
CnvC1:
INC E
SUB D
JR NC, CnvC1
ADD D
by 名無し (2018-03-17 22:29)
訂正:
ADD D
↓
ADD A,D
by 名無し (2018-03-17 22:31)
そんな感じだと思います。
by skyriver (2018-03-18 01:59)
WordMasterは今となっては実用面では見劣りしますねぇ(世界で最初のスクリーンエディタは viかwmのどちらからしい)
wsがいいのだけれどwinstしてもうまく動かない・・・
下記のURLで説明されている ZDE はインストール&コンフィグも簡単だし、wsライクなので使い易いよ ^^
http://techtinkering.com/2008/10/21/installing-zde-1-6-a-programmers-editor-for-cpm/
by skyriver (2018-03-18 16:59)
コンソール接続のシリアルでCP/MとWin間でバイナリファイルの送受信ができる xmodem というのを見つけた。ファイルのやり取りがSDカード経由じゃなくなりメチャ便利^^
ソースの先頭にある程度の説明が書いてあります。
CP/M側で受信する場合は
xmodem FileName /R /X0
で起動してTeraTermでxmodem送信すればいい。
固定的なオプションは XMODEM.CFG に書いておける。
/X0がないとRDR:から読もうとするみたい( ソース見て分かった)
https://groups.google.com/forum/#!topic/comp.os.cpm/1EdJzNh1ekM
by skyriver (2018-03-18 22:31)
XMODEMは引数無しの起動でオプションスイッチの説明が表示されました。
毎回 /X0 指定しなくていいようにdefaultをcon:に変更して使ってます。
パソコン通信時代にファイル転送用によく使われたXMODEMプロトコルはブロック長が基本128bytesでファイル長の情報を渡さず、最後のブロックの余りをEOF(1AH)でパディングする等、まさにCP/Mのファイルシステムを意識した(ような)プロトコルですね。
by skyriver (2018-03-19 21:37)
上のコメントで書いたアセンブラソースのXMODEMは私の環境では大きめ(20KB程度以上)のアップロードが出来なかったので、CP/M-80用のXMODEMアプリをHITECH-Cでスクラッチで作ってみました。
3チップ構成Pic24CPMマイコン(その5)XMODEMでファイル送受信
https://piclabo.blog.so-net.ne.jp/2018-06-17
by skyriver (2018-07-31 21:21)
CP/M-68K用のxmodemアプリを作成し、下記で記事で公開しました。
https://piclabo.blog.so-net.ne.jp/CPM-68K_XMODEM
また、CP/M-68K用の使い易いエディタが見つからなかったのでコマンド体系を WordStar ライクにしたスクリーンエディタsked(Simple Kitten EDitor)を開発し、下記の記事で公開しました。
https://piclabo.blog.so-net.ne.jp/CPM68K_SKED
by skyriver (2018-12-23 15:43)
CP/M-68K用に開発したWordStarコマンドライクなスクリーンエディタ(sked)をHI-TECH C環境を使ってCP/M-80に移植し、公開しました。
https://piclabo.blog.so-net.ne.jp/sked80
by skyriver (2019-03-18 00:47)