レトロマイコン86ボードの構想(その15)DDT86でパッチ [8086]
CP/M-86の頃にはパソコンがグラフィック表示対応もして来たり、CP/M-86自体もパーソナルCP/Mとして機種毎に販売されたこと等もあり、TeraTerm接続環境でうまく動かないソフトが結構あります。
今回はgulperというパックマンライクのゲームにDDT86でパッチをあてて動かしてみたのでメモとして書いておきます。
最初にダウンロードしたままの状態で起動すると
Pascalのソースも添付されていたので確認してみると
GULPERのソース(抜粋)
機種依存のキャラクタコードの設定は一カ所で行っています。また、ソース内の先頭で設定しているので探し易そうです。
今回は次のようにキャラクタコードを変更することにしました。
DDT86でパッチを当てる場合、ddt86 gulper.cmdで読込んでパッチを当ててもwコマンドでセーブできないのでrコマンドで読込んでパッチ適用後にwコマンドでセーブしています。
最初に0080hから逆アセンブルしているのはヘッダ分を飛ばしてコードの先頭から見るためです。
コードの先頭でスタートアップ処理にジャンプし、スタートアップ処理の直後に上述のキャラクタコード設定処理がありました。
DDT86でのパッチ操作
パッチ適用により、下記の画面のように標準のアスキーコードを使った画面にすることができました。
★2019/10/14 追記
twitterに動画付きでコメントをポストしました。
https://twitter.com/wcinp/status/1183623815596634112
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今回はgulperというパックマンライクのゲームにDDT86でパッチをあてて動かしてみたのでメモとして書いておきます。
最初にダウンロードしたままの状態で起動すると
GULPER実行画面(対処前) |
|
Pascalのソースも添付されていたので確認してみると
|
機種依存のキャラクタコードの設定は一カ所で行っています。また、ソース内の先頭で設定しているので探し易そうです。
今回は次のようにキャラクタコードを変更することにしました。
- 02 -> 4f O
- EA -> 23 #
- 01 -> 40 @
- DB -> 48 H
- B0 -> 5a Z
- 03 -> 56 V
- 04 -> 2A *
DDT86でパッチを当てる場合、ddt86 gulper.cmdで読込んでパッチを当ててもwコマンドでセーブできないのでrコマンドで読込んでパッチ適用後にwコマンドでセーブしています。
最初に0080hから逆アセンブルしているのはヘッダ分を飛ばしてコードの先頭から見るためです。
コードの先頭でスタートアップ処理にジャンプし、スタートアップ処理の直後に上述のキャラクタコード設定処理がありました。
|
パッチ適用により、下記の画面のように標準のアスキーコードを使った画面にすることができました。
GULPER実行画面(対処後) |
|
★2019/10/14 追記
twitterに動画付きでコメントをポストしました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコン86ボードの構想(その14)untarの製作 [8086]
今日(2019/10/12 土曜日)の夕方から明日にかけて関東を直撃するおそれがある過去最強クラスとも言われている台風19号のため、JRは全面運休を予定していて、昨日夕方に近くのスーパーマーケットに行ったらレジが長蛇の行列でパンやカップ麺類が殆ど無い状態でした。
危険なので緊急以外の外出をしないように政府見解もでているので今日はパソコンの前に座っています(いつものことだけどw)
「レトロマイコン86ボードの構想(その11)xmodemの移植」の記事で書いたように自作のV20ボードで動くCP/M-86上でxmodemが動くようになり、パソコンとのファイル送受信が簡単にできるようになりました。
kuninetさんが書かれた「KZ80シリーズ、SBC8080 8085でCP M」の最後の方で拙作のxmodemを紹介して頂いていて、ここでは同時にCP/M-80用のunzipも紹介されています。パソコン側のGUI操作で複数ファイルのアーカイブを作り、xmodemでCP/Mへ転送する環境は確かに便利です。
そこでCP/M-86用のunzipを探してみましたが見つかりませんでした・・・
パソコンで使用している圧縮/解凍ソフトである7-zipの圧縮ファイル作成時の設定ウィンドを見ていたらなんとtarに対応していました^^
★追記 2020/12/23
Windows10自体もtarに対応していました。
そこでCP/M-86用のtarファイルを解凍するuntarを作ってみました。
tarは古くからあるツールで、tarファイルの構造は単純なので解凍ツールの作成は割合簡単です。
tarファイルのフォーマットについてはネット上に豊富に情報があり「tar の構造」等を参考にさせて頂きました。
制作したuntarの操作ログのサンプルを貼っておきます。
untar操作ログ
コンパイル時のログも貼っておきます。"-a"オプションで自動的にリンクまで行うようにしています。
最後に、今回作成したuntarプログラムは下記のリンクからダウンロードできます。
※商用目的以外であれば自由に使用可能
UNTAR_CPM86_V005.zip
・2021/01/04 Ver 0.05
Win10のtarコマンド等のヘッダ内サイズデータのデリミタが20Hの場合に対応
・2019/10/24 Ver0.04
ファイルエンドの処理を修正
・2019/10/18 Ver0.03a
Aztec C 8086 Ver3.20d でコンパイル(File size was turned to 10KB from 30KB)
・2019/10/16 Ver0.03
ファイルリスト表示を高速化
・2019/10/13 Ver0.02
"/l"オプションを廃止し、リスト表示をディフォルトとした
・2019/10/12 Ver0.01a
ファイルサイズが128の倍数の場合の処理を改善
[TOP] [ 前へ ] 連載記事 [ 次へ ]
危険なので緊急以外の外出をしないように政府見解もでているので今日はパソコンの前に座っています(いつものことだけどw)
「レトロマイコン86ボードの構想(その11)xmodemの移植」の記事で書いたように自作のV20ボードで動くCP/M-86上でxmodemが動くようになり、パソコンとのファイル送受信が簡単にできるようになりました。
kuninetさんが書かれた「KZ80シリーズ、SBC8080 8085でCP M」の最後の方で拙作のxmodemを紹介して頂いていて、ここでは同時にCP/M-80用のunzipも紹介されています。パソコン側のGUI操作で複数ファイルのアーカイブを作り、xmodemでCP/Mへ転送する環境は確かに便利です。
そこでCP/M-86用のunzipを探してみましたが見つかりませんでした・・・
パソコンで使用している圧縮/解凍ソフトである7-zipの圧縮ファイル作成時の設定ウィンドを見ていたらなんとtarに対応していました^^
7-zipの圧縮ファイル作成時の設定ウィンド |
|
★追記 2020/12/23
Windows10自体もtarに対応していました。
コマンドラインでtarコマンド |
|
そこでCP/M-86用のtarファイルを解凍するuntarを作ってみました。
tarは古くからあるツールで、tarファイルの構造は単純なので解凍ツールの作成は割合簡単です。
tarファイルのフォーマットについてはネット上に豊富に情報があり「tar の構造」等を参考にさせて頂きました。
制作したuntarの操作ログのサンプルを貼っておきます。
|
コンパイル時のログも貼っておきます。"-a"オプションで自動的にリンクまで行うようにしています。
B>drc -a untar -------------------------------------------------- Digital Research C 04/17/84 Version 1.11 Serial No. 3073-0000-001282 All Rights Reserved Copyright (c) 1983,1984 Digital Research, Inc. -------------------------------------------------- Digital Research C Version 1.11 -- Preprocessor Digital Research C Version 1.11 -- Code Gen untar.c: code: 1541 static: 235 extern: 694 -------------------------------------------------- LINK-86 Linkage Editor 19 March 1984 Version 1.4 Serial No. 3073-0000-001282 All Rights Reserved Copyright (C) 1982-1984 Digital Research, Inc. -------------------------------------------------- CODE 06186 DATA 011A1 USE FACTOR: 18% B> |
最後に、今回作成したuntarプログラムは下記のリンクからダウンロードできます。
※商用目的以外であれば自由に使用可能
・2021/01/04 Ver 0.05
Win10のtarコマンド等のヘッダ内サイズデータのデリミタが20Hの場合に対応
・2019/10/24 Ver0.04
ファイルエンドの処理を修正
・2019/10/18 Ver0.03a
Aztec C 8086 Ver3.20d でコンパイル(File size was turned to 10KB from 30KB)
・2019/10/16 Ver0.03
ファイルリスト表示を高速化
・2019/10/13 Ver0.02
"/l"オプションを廃止し、リスト表示をディフォルトとした
・2019/10/12 Ver0.01a
ファイルサイズが128の倍数の場合の処理を改善
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコン86ボードの構想(その13)自作スクリーンエディタ [8086]
前回の記事で書いたようにCP/M-86でWordStarが動くようになりました。
しかし、WordStarは起動の度にファイル内容の表示領域を広げるために操作が必要だったり、ディフォルトでページ境界線が表示されていたり、更には当時の基本的なエスケープシーケンスのみで制御していることもあり動作が重いです・・・
そこで「3チップ構成68Kマイコンの構想(その14)スクリーンエディタの開発」の記事で書いた自作のsked(Simple Kitten EDitor)をDRC(デジタルリサーチ社製C言語)環境を使ってCP/M-86に移植してみました。
skedのコマンド体系はWordStarライクの2ストロークにしているので私にとっては使い勝手がいいです。
実装機能は必要最小限(エディタの追加機能を考え出したら切りがない)ですがオンメモリ処理でBIOSを直にコール(BDOS経由でのBIOSコール機能しか提供していないCP/M-86ではあまり例がないと思う)しているのでWordStarと比較し動作がかなり速いです。
DRC(Ver 1.11)への移植作業について気が付いたこと等をメモしておきます。
★2019/09/30 追記
twitterにWordStarとの比較動画をアップしました。
★2019/10/13 追記
自作スクリーンエディタsked(CP/M-86版)は下記のリンクからダウンロードできます。(商用目的以外であれば自由に使用可能)
SKED_CPM86_V001f.zip
[TOP] [ 前へ ] 連載記事 [ 次へ ]
しかし、WordStarは起動の度にファイル内容の表示領域を広げるために操作が必要だったり、ディフォルトでページ境界線が表示されていたり、更には当時の基本的なエスケープシーケンスのみで制御していることもあり動作が重いです・・・
そこで「3チップ構成68Kマイコンの構想(その14)スクリーンエディタの開発」の記事で書いた自作のsked(Simple Kitten EDitor)をDRC(デジタルリサーチ社製C言語)環境を使ってCP/M-86に移植してみました。
skedのコマンド体系はWordStarライクの2ストロークにしているので私にとっては使い勝手がいいです。
help表示状態の画面 |
|
実装機能は必要最小限(エディタの追加機能を考え出したら切りがない)ですがオンメモリ処理でBIOSを直にコール(BDOS経由でのBIOSコール機能しか提供していないCP/M-86ではあまり例がないと思う)しているのでWordStarと比較し動作がかなり速いです。
DRC(Ver 1.11)への移植作業について気が付いたこと等をメモしておきます。
- SIZE_T/size_tの定義
SIZE_Tの定義がDOS.Hのみにあり、今回はDOS.Hは使わないので自分でunsigned intとして定義しています。
- SIZE_T(unsigned int)の演算
SIZE_Tでキャストした0x8000の2除算が0xc000になってしまう。除算式に含まれる全ての数値をSIZE_Tでキャストしても変化ありませんでした。
- unsigned charが使えない
DRCのコンパイラが対応していないためunsigned charでエラーになります。
- 実行ファイルのサイズが大きい
"Hello!"表示のプログラムのサイズが28KBでAztecCの6KBと比較してかなり大きい。
- コンパイル時間
結構時間が掛かります。体感ではAztecCの5倍程度かかります。
但し、AztecCは大きめのソースをコンパイルしたところ、私の環境ではコンパイラがうまく動かなかったので今回はDRCを使っています。
★2019/10/24 追記 {
Pic24V20をプリント基板化したことで安定化できました。AztecCも問題なく動いています。AztecCの方がコンパイル&リンクの速度も速く、C言語自体もDRCより使い易いです。何より実行ファイルのサイズが小さい(というかDRCが大きすぎ)。
DRCはおそらくデジタルリサーチ社初のCコンパイラでこなれていない部分がある印象です。
}
- マニュアルの情報は多い
マニュアルの内容は充実しています。インラインアセンブル機能は無いようですがrasm86(リロケータブルアセンブラ)の処理と割合簡単にリンクできます。
- デバッガ
DRCには関係ないですがCP/M-86用のシンボリックディバッガを探したけれどまだ見つけられていないのでシンボルをマニュアルで参照する必要があり不便です。
★2019/10/01 追記 {
シンボリックディバッガ(SID86)はここからダウンロードできました。
}
★2019/09/30 追記
twitterにWordStarとの比較動画をアップしました。
V20(8088互換)とPIC24構成のボード上のCP/M-86に自作のスクリーンエディタskedをデジタルリサーチ社製C環境を使って移植した
— skyriver (@wcinp) September 30, 2019
単機能だけどオンメモリ処理でBIOSを直コールなので速い^^
WordStarとの比較動画です。#CPM86 #Pic24V20 #WordStar #skedhttps://t.co/IaNxDeQEXk pic.twitter.com/7Y3mYILXjn
★2019/10/13 追記
自作スクリーンエディタsked(CP/M-86版)は下記のリンクからダウンロードできます。(商用目的以外であれば自由に使用可能)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコン86ボードの構想(その12)CP/M-86でWordStar [8086]
前回の記事で書いたようにCP/M-86で自作のxmodemが動くようになったので、次にエディタが欲しいところです。
そこでまずはメジャーなWordStarを動かしてみました。
「レトロマイコンZ80ボードの構想(その15)エスケープシーケンスの実験」の記事で書いたようにCP/M-80ではPIC24側で当時のエスケープシーケンスをANSIエスケープコードに変換してWordStarを動かしていて、この変換処理は今回のCP/M-86でも入れているのですが、CP/M-86のWordStarはうまく動きませんでした。
TeraTermのログ機能を使ってCP/M-86版WordStarが使用しているエスケープシーケンスを確認し、次のエスケープシーケンスの変換処理を追加することで無事動くようになりました。
ネット情報ではTEDも人気が高かったようですが、起動するとトラップが発生し、動作しませんでした。
ソース付きだったので初期化部分の処理を見てみたら int 10h を使用していた・・・
WordStarの画面キャプチャを以下に貼っておきます。
「レトロマイコンZ80ボードの構想(その15)エスケープシーケンスの実験」の記事に貼ってあるCP/M-80のWordStarの画面と同じですね。
起動直後に表示される今で言うスプラッシュウィンド相当の画面です。
メニュー画面です。'F'コマンドでファイル一覧表示をON後の画面です。
ファイル編集画面です。
^JHコマンドでヘルプレベルを1にしてファイル内容の表示領域を広げています。
スクリーンエディタ操作のバイナリエディタであるFileViewも動かしてみたので画面を貼っておきます。
★2019/10/09 追記
WordStarのインストーラー(winstall.cmd)でターミナルタイプを「DEC VT-100」に設定したらなんなく動いた^^
ディフォルト設定のエスケープシーケンスに対応しなくてもよかったかも(でも対応した方が動くソフトが増えるのでいいと思う)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
そこでまずはメジャーなWordStarを動かしてみました。
「レトロマイコンZ80ボードの構想(その15)エスケープシーケンスの実験」の記事で書いたようにCP/M-80ではPIC24側で当時のエスケープシーケンスをANSIエスケープコードに変換してWordStarを動かしていて、この変換処理は今回のCP/M-86でも入れているのですが、CP/M-86のWordStarはうまく動きませんでした。
TeraTermのログ機能を使ってCP/M-86版WordStarが使用しているエスケープシーケンスを確認し、次のエスケープシーケンスの変換処理を追加することで無事動くようになりました。
- ESC 'E'
画面消去
- ESC 'Y' (y+' ') (x+' ')
カーソル移動。()は1キャラクタコードで移動先カーソル位置(x,y)にスペースコードを加算したキャラクタコード。
- ESC 'b' 0x0e
強調文字属性に変更。今回はTeraTermで太文字黄色になるようにしました。
- ESC 'b' 0x03
強調文字属性の解除
ネット情報ではTEDも人気が高かったようですが、起動するとトラップが発生し、動作しませんでした。
ソース付きだったので初期化部分の処理を見てみたら int 10h を使用していた・・・
; ; We start by initializing the display, then allocate memory for the ; file and paste segments. Parse the command line for a filename , if ; one was input, read in the file. Finally set the INT 23 and 24 vectors. cseg start: mov cl,9 mov dx,offset cls int 224 push ds xor ax,ax mov ds,ax mov ah,12h mov bl,10h int 10h cmp bl,10h je not_ega |
WordStarの画面キャプチャを以下に貼っておきます。
「レトロマイコンZ80ボードの構想(その15)エスケープシーケンスの実験」の記事に貼ってあるCP/M-80のWordStarの画面と同じですね。
起動直後に表示される今で言うスプラッシュウィンド相当の画面です。
CP/M-86版WordStarの起動画面 |
|
メニュー画面です。'F'コマンドでファイル一覧表示をON後の画面です。
CP/M-86版WordStarのメニュー画面 |
|
ファイル編集画面です。
CP/M-86版WordStarの編集画面1 |
|
^JHコマンドでヘルプレベルを1にしてファイル内容の表示領域を広げています。
CP/M-86版WordStarの編集画面2 |
|
スクリーンエディタ操作のバイナリエディタであるFileViewも動かしてみたので画面を貼っておきます。
FileView画面 |
|
★2019/10/09 追記
WordStarのインストーラー(winstall.cmd)でターミナルタイプを「DEC VT-100」に設定したらなんなく動いた^^
ディフォルト設定のエスケープシーケンスに対応しなくてもよかったかも(でも対応した方が動くソフトが増えるのでいいと思う)
Opening screen of WordStar | Menu screnn of WordStar |
|
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコン86ボードの構想(その11)xmodemの移植 [8086]
CP/M-86の環境を整えるためにCP/M-80とCP/M-68Kで自作したxmodemをCP/M-86へ移植しました。
移植するまではパソコンでソース編集し、pipでpip xmodem.c=con:のコマンドでCP/M-86へ転送していて、TeraTermで1キャラクタ毎に10msのウェイトを入れているので転送に時間が掛かります。
コンパイラ環境が整ったので最初にxmodemの移植したいと思い、自作したソースなので簡単にいくだろうと思っていましたが、少し手こずりました・・
CP/M-86本体はTinyモデル(コードセグメントとデータセグメントが共通)なのでBIOSの各機能が RET命令でリターンするため別セグメントで動作するアプリケーションから直にコールする方法がありません。
DRC(デジタルリサーチ社製C言語)環境で調べてみるとBIOSコールはbios.hの中で次のように宣言されています。
BDOS経由では遅くなりそうだと予感しながら移植してみたところ、xmodemが動作しません・・・
コンソール送信データはPIC側の処理で当時のエスケープシーケンスをANSIのエスケープコードに変換しているのでバイナリデータの透過性を保証するために/pオプションでPUNCH/READERデバイス(コンソールと同じシリアル通信を使いますがコード変換処理無し)を指定できるようにしています。
READERではBIOSの仕様上、受信データの有無を確認できないのですが、受信データが無い場合には0xffffを返すようにBIOSを拡張実装しています。
しかし、上記の__BDOS処理部分でリターン値の上位バイトをマスクする実装になっているのでREADERの受信データ有無チェック機能が動作しません。
次のログがDDT86で確認した__BDOS部分のコードです("***"部分は追加コメント)。
"SUB AH,AH"部分をNOP(90H)に変更するパッチ当てて確認したところ、READERのデータ有無確認の機能は動作したのでハイバイトをマスクする前に保存している0x0FB4(シンボルファイルでは__cpmrvとなっている)を使い、xmodemのCソース内で__cpmrvを参照するようにして対処しました。
この対処でCP/M-86からファイル送信はできるようになりましたが、ファイル受信でエラーが発生します。
ロジアナで受信処理時の状況を確認した波形サンプルが下記で受信処理が間に合わず取りこぼしている状況でした。
シリアルの通信速度は38400bpsなので1バイト当たり0.26ms(=1000/38400*10)ですが、受信データのポーリング周期が0.34ms程度になってしまっています。
READY信号が一瞬 lowになっている部分がV20からPICへサービス要求している部分でBUSREQ信号がhighの部分はPIC側が処理している部分です。
上述したようにBDOS経由では遅そうなのでBIOSを直にコールすべく、BIOSの先頭の"JMP INIT"部分に一時的に4バイトのfar CALLされるコード(RETFで終わる)を書込みBIOSの機能をコールし、コール後元に戻すようにしました。
DRCのオブジェクトとリンクするためにリロケータブルアセンブラのRASM86を使い、セグメント名やCの引数の渡し方等を確認し、ソース作成したところ、最初はリンクできなかったのですが、RASM内のラベルは大文字変換されるようなので大文字に変更したらほぼ一発で動作しました^^
★2019/11/01 追記 {
最初に使ったBDOS経由でのBIOSコールはBDOSコールファクションNo.50の「DIRECT BIOS CALL」というBDOSコールですが逆アセンブルしてみると判るとおりBIOSに辿り着くまで多くのステップ数のマシン語を実行しています。
}
RASM86のサンプルソースはネット上で中々見つからなかったので、他の人の参考になるかも(ならないかも)と思いソースを貼っておきます。
BIOSコール用の橋渡し処理(アセンブラ)
安全を見て多くのレジスタを保存していますがそれでもBDOS経由よりはかなり早くなり、ファイル受信処理も問題なく動作するようになりました^^
受信データのポーリング周期は0.34msから0.23msに高速化され連続的なデータ受信時にも取りこぼしが発生しなくなりました。
メモとして、xmodemのコンパイル&リンク時の操作ログを貼っておきます。
最後に、今回作成したCP/M-86用のxmodemプログラムは下記のリンクからダウンロード可能です(商用目的以外であれば自由に使用可能)
XMODEM_CPM86_001a.zip
・2019/10/23 Ver0.01a
コンパイラをDRCからAztec Cに変更(サイズ:30KB->10KB)
・2019/10/09 Ver0.01
日付表示の誤記修正
★2019/11/05 追記
Aztec CでのBIOS直コール部のアセンブルリストを貼っておきます。
BIOSコール用の橋渡し処理(アセンブラ)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
移植するまではパソコンでソース編集し、pipでpip xmodem.c=con:のコマンドでCP/M-86へ転送していて、TeraTermで1キャラクタ毎に10msのウェイトを入れているので転送に時間が掛かります。
コンパイラ環境が整ったので最初にxmodemの移植したいと思い、自作したソースなので簡単にいくだろうと思っていましたが、少し手こずりました・・
CP/M-86本体はTinyモデル(コードセグメントとデータセグメントが共通)なのでBIOSの各機能が RET命令でリターンするため別セグメントで動作するアプリケーションから直にコールする方法がありません。
DRC(デジタルリサーチ社製C言語)環境で調べてみるとBIOSコールはbios.hの中で次のように宣言されています。
/**************************************************************************** BIOS86.H - compatibilty header for CP/M-86 & the IBM-PC family (C)1999 Ken Mauro, All Rights Reserved. Free for non-commercial use. ****************************************************************************/ /* CP/M & IBMPC bios related stuff */ struct{ char fn; char cl,ch; char dl, dh; } pblk; bios(p) unsigned int *p; { return __BDOS(50,&pblk); } |
BDOS経由では遅くなりそうだと予感しながら移植してみたところ、xmodemが動作しません・・・
コンソール送信データはPIC側の処理で当時のエスケープシーケンスをANSIのエスケープコードに変換しているのでバイナリデータの透過性を保証するために/pオプションでPUNCH/READERデバイス(コンソールと同じシリアル通信を使いますがコード変換処理無し)を指定できるようにしています。
READERではBIOSの仕様上、受信データの有無を確認できないのですが、受信データが無い場合には0xffffを返すようにBIOSを拡張実装しています。
しかし、上記の__BDOS処理部分でリターン値の上位バイトをマスクする実装になっているのでREADERの受信データ有無チェック機能が動作しません。
次のログがDDT86で確認した__BDOS部分のコードです("***"部分は追加コメント)。
F>a:ddt86 xmodem.cmd DDT86 1.2 START END CS 662D:0000 662D:638F DS 6C66:0000 6C66:FFFF -l0d5 *** シンボルファイルから確認した__BDOSのアドレス 662D:00D5 PUSH BP 662D:00D6 MOV BP,SP 662D:00D8 PUSH DI 662D:00D9 PUSH SI 662D:00DA MOV DX,06[BP] 662D:00DD MOV CL,04[BP] 662D:00E0 PUSH ES 662D:00E1 INT E0 662D:00E3 POP ES 662D:00E4 MOV [0FB4],AX *** 0FB4 __cpmrv 662D:00E7 MOV [0FDE],CX 662D:00EB SUB AH,AH *** change 90H x 2 -l 662D:00ED POP SI 662D:00EE POP DI 662D:00EF POP BP 662D:00F0 RET 662D:00F1 MOV CL,0C 662D:00F3 PUSH ES 662D:00F4 INT E0 662D:00F6 POP ES 662D:00F7 CMP AH,11 662D:00FA JNZ 0100 662D:00FC INC BYTE [0050] 662D:0100 MOV AL,[0050] -^C F> |
"SUB AH,AH"部分をNOP(90H)に変更するパッチ当てて確認したところ、READERのデータ有無確認の機能は動作したのでハイバイトをマスクする前に保存している0x0FB4(シンボルファイルでは__cpmrvとなっている)を使い、xmodemのCソース内で__cpmrvを参照するようにして対処しました。
この対処でCP/M-86からファイル送信はできるようになりましたが、ファイル受信でエラーが発生します。
ロジアナで受信処理時の状況を確認した波形サンプルが下記で受信処理が間に合わず取りこぼしている状況でした。
シリアルの通信速度は38400bpsなので1バイト当たり0.26ms(=1000/38400*10)ですが、受信データのポーリング周期が0.34ms程度になってしまっています。
xmodemでのファイル受信時のロジアナ波形例(NGケース) |
|
READY信号が一瞬 lowになっている部分がV20からPICへサービス要求している部分でBUSREQ信号がhighの部分はPIC側が処理している部分です。
上述したようにBDOS経由では遅そうなのでBIOSを直にコールすべく、BIOSの先頭の"JMP INIT"部分に一時的に4バイトのfar CALLされるコード(RETFで終わる)を書込みBIOSの機能をコールし、コール後元に戻すようにしました。
DRCのオブジェクトとリンクするためにリロケータブルアセンブラのRASM86を使い、セグメント名やCの引数の渡し方等を確認し、ソース作成したところ、最初はリンクできなかったのですが、RASM内のラベルは大文字変換されるようなので大文字に変更したらほぼ一発で動作しました^^
★2019/11/01 追記 {
最初に使ったBDOS経由でのBIOSコールはBDOSコールファクションNo.50の「DIRECT BIOS CALL」というBDOSコールですが逆アセンブルしてみると判るとおりBIOSに辿り着くまで多くのステップ数のマシン語を実行しています。
}
RASM86のサンプルソースはネット上で中々見つからなかったので、他の人の参考になるかも(ならないかも)と思いソースを貼っておきます。
|
安全を見て多くのレジスタを保存していますがそれでもBDOS経由よりはかなり早くなり、ファイル受信処理も問題なく動作するようになりました^^
xmodemでのファイル受信時のロジアナ波形例(改善後) |
|
受信データのポーリング周期は0.34msから0.23msに高速化され連続的なデータ受信時にも取りこぼしが発生しなくなりました。
メモとして、xmodemのコンパイル&リンク時の操作ログを貼っておきます。
B>rasm86 callbios -------------------------------------------------- RASM-86 Relocating Assembler Version 1.2 Serial No. 3073-0000-001282 All Rights Reserved Copyright (C) 1982,1983 Digital Research, Inc. -------------------------------------------------- END OF PASS 1 END OF PASS 2 CODE 00048 END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 0% B>drc f:xmodem -------------------------------------------------- Digital Research C 04/17/84 Version 1.11 Serial No. 3073-0000-001282 All Rights Reserved Copyright (c) 1983,1984 Digital Research, Inc. -------------------------------------------------- Digital Research C Version 1.11 -- Preprocessor Digital Research C Version 1.11 -- Code Gen f:xmodem.c: code: 1894 static: 320 extern: 335 B>link86 f:xmodem=xmodem,callbios -------------------------------------------------- LINK-86 Linkage Editor 19 March 1984 Version 1.4 Serial No. 3073-0000-001282 All Rights Reserved Copyright (C) 1982-1984 Digital Research, Inc. -------------------------------------------------- CODE 06366 DATA 01093 USE FACTOR: 19% B>a:stat f:xmodem.* Drive F: User : 0 Recs Bytes FCBs Attributes Name 58 8k 1 Dir RW F:XMODEM .C 234 30k 2 Dir RW F:XMODEM .CMD 6 2k 1 Dir RW F:XMODEM .SYM ---------------------------------------------- Total: 40k 4 F: RW, Free Space: 1,866k B>f: F>xmodem usage : xmodem [/s /r /p] FileName /s : send[default] /r : receive /p : use PUN/RDR device Ver0.01 2019/10/23 by skyriver F>xmodem xmodem.cmd /s /p xmodem.cmd (PUN/RDR) sent 234 block(s). F> |
最後に、今回作成したCP/M-86用のxmodemプログラムは下記のリンクからダウンロード可能です(商用目的以外であれば自由に使用可能)
・2019/10/23 Ver0.01a
コンパイラをDRCからAztec Cに変更(サイズ:30KB->10KB)
・2019/10/09 Ver0.01
日付表示の誤記修正
★2019/11/05 追記
Aztec CでのBIOS直コール部のアセンブルリストを貼っておきます。
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]