3チップ構成Pic24CPMマイコン(その5)XMODEMでファイル送受信 [Z80]
「レトロマイコンZ80ボードの構想(その14)CP/MでのWM動作実験」の記事のコメントに書いたようにCP/Mが動作するワンボードマイコンPic24CPMとPCとのファイルのやり取りはSDカード経由では面倒なのでコンソール接続のシリアル通信を利用して XMODEM プロトコルで行うのが便利です。
上記のコメントにも書いたようにCP/M用の XMODEM 処理のソース(アセンブリ言語)を見つけて使ってみましたが、ある程度サイズの大きな(20KBくらい以上)ファイルをパソコンへ送信する際、私の環境では送信処理がすぐに完了してしまい、うまく動きませんでした(PCからの受信は問題なく動く)
入手したアセンブリソースを解析して動かしてみるのも面白そうですが、今回は「3チップ構成Pic24CPMマイコン(その4)ZSIDで小文字のシンボルを使う方法その2」の記事に書いたように HI-TECH C でコンパイル時に生成される 小文字を含むシンボル情報を ZSID で使えるようにする ZSID 用のパッチも作ったので HI-TECH C を使ってスクラッチで CP/M 用の XMODEM アプリを作ってみました。パソコン側は TeraTerm の XMODEM 機能を利用します。
XMODEMのプロトコル自体は ここ に書いてあるようにシンプルなもので実装するのは簡単そうです。
今回、HI-TECH C を使ってみて感じたことは
以前、LSI-C80の使っていたこともありますが、関数をリカーシブ対応にしない場合には関数内変数を極力レジスタに割り振るという素晴らしいコードを吐き出していました(でもコンパイル速度はかなり遅い)
今回の XMODEM の初期バージョンではブロック送信でデータ間に隙間が空いてしまうので(シリアル通信速度は38400bps)1文字入出力処理を軽量なBIOS/BDOSコールにしたり、CRC計算をアセンブリ言語での埋め込みにし、隙間なく通信できるようになりました。
下記は今回開発した XMODEM のソースをパソコン側から受信し、HI-TECH C でコンパイル後、実行ファイルをパソコンへ送信している操作ログです。
Pic24CPMで使う場合は、OPEスイッチ操作により、エスケープシーケンスOFFの状態で使用してください(ONだとコンソール出力データが変換されるため)
尚、今回開発した CP/M-80用の xmodem のC言語ソースと実行ファイルは下記からダウンロード可能です。商用利用以外であれば自由に使用可能です。
★追記 2018/06/25
xmodemでの転送とWordStarを一緒に使う場合等にエスケープシーケンスのON/OFF設定の変更が面倒なので xmodem 起動時の /p オプションで PUN/RDRディバイス指定可能にしました。(上記の画面キャプチャもアップデートしました)
PIC24CPMでは /p 指定した場合でもコンソール用のシリアル通信を使いますが、PUNではエスケープシーケンスの変換処理がないので通信データの透過性が保証されます。
また、RDRではBIOSコールの仕様上、データ有無のステータス確認ができないため、データがない場合にはゼロフラグをONにしてリターンするように拡張しています(普及率は不明ですがネット上に同様に拡張実装している例があったので採用)。
★追記 2018/06/28
ネット上で昔の雑誌のスキャンデータがアップされているところを見つけ、1991年10月号の「MSX FUN」(表紙には「今月からディスクが付録!」と書いてある)があったので見ていたら「パソ通天国」というコーナーがあってそこに XMODEM についての解説?があった。残念ながらASCIIは一冊も無かった・・
[TOP] [ 前へ ] 連載記事 [ 次へ ]
上記のコメントにも書いたようにCP/M用の XMODEM 処理のソース(アセンブリ言語)を見つけて使ってみましたが、ある程度サイズの大きな(20KBくらい以上)ファイルをパソコンへ送信する際、私の環境では送信処理がすぐに完了してしまい、うまく動きませんでした(PCからの受信は問題なく動く)
入手したアセンブリソースを解析して動かしてみるのも面白そうですが、今回は「3チップ構成Pic24CPMマイコン(その4)ZSIDで小文字のシンボルを使う方法その2」の記事に書いたように HI-TECH C でコンパイル時に生成される 小文字を含むシンボル情報を ZSID で使えるようにする ZSID 用のパッチも作ったので HI-TECH C を使ってスクラッチで CP/M 用の XMODEM アプリを作ってみました。パソコン側は TeraTerm の XMODEM 機能を利用します。
XMODEMのプロトコル自体は ここ に書いてあるようにシンプルなもので実装するのは簡単そうです。
今回、HI-TECH C を使ってみて感じたことは
- 構造体/共用体に対応
CP/MのCコンパイラの中では未対応なものが多いですが HI-TECH C では普通に使えます。今回も2バイト変数をバイトに分割する部分でstructとunionを使いました。
ループ処理内での"break"に未対応
for文等のループ内でループから抜け出すための"break"が使えない^^;。switch文では当然"break"が使えます。
"break"は自作のpicle言語でも最初は未対応でしたが、使い勝手が悪いので途中で追加しています("continue"は未対応ですがなくてもあまり困らない)。
★変更 2023/07/24
break は普通に使えますね(何を勘違いしていたんだろうか?)
- ANSI準拠
CP/M-80用のCコンパイラでは珍しく、ANSI対応していて使い易い。従ってK&Rの構文へのトランスレータも必要ありません。
★2018/06/26 追記
学生のころから「リッチー&カーニハン」と覚えていたのでR&Kと書いたけどK&Rが正解みたいなので修正しました^^;
- コンパイル速度
小さなソースでも1分弱程度時間が掛かります。私の環境では今回作成した xmodem.cをコンパイルするのに57秒掛かりました。BDS C のコンパイル速度がうらやましいw。
因みにpicleコンパイラのコンパイル速度はメチャ速です。 - ライブラリ
まだ、ほんの一部しか使っていませんが、toupper()が予期せぬ動作でしたw
CTYPE.H(23): #define toupper(c) ((c)-'a'+'A') - コンパイル後のマシン語
関数への引数はレジスタ渡しではなくIXレジスタ経由でのアクセスになるので関数中にアセンブリ言語を埋め込む際にアクセスし辛いです。グローバル変数を使った方が実行速度は速そうです。
以前、LSI-C80の使っていたこともありますが、関数をリカーシブ対応にしない場合には関数内変数を極力レジスタに割り振るという素晴らしいコードを吐き出していました(でもコンパイル速度はかなり遅い)
今回の XMODEM の初期バージョンではブロック送信でデータ間に隙間が空いてしまうので(シリアル通信速度は38400bps)1文字入出力処理を軽量なBIOS/BDOSコールにしたり、CRC計算をアセンブリ言語での埋め込みにし、隙間なく通信できるようになりました。
下記は今回開発した XMODEM のソースをパソコン側から受信し、HI-TECH C でコンパイル後、実行ファイルをパソコンへ送信している操作ログです。
Pic24CPMで使う場合は、OPEスイッチ操作により、エスケープシーケンスOFFの状態で使用してください(ONだとコンソール出力データが変換されるため)
XMODEMアプリ使用例 |
|
尚、今回開発した CP/M-80用の xmodem のC言語ソースと実行ファイルは下記からダウンロード可能です。商用利用以外であれば自由に使用可能です。
- XmodemCpm80_20230504_v002.zip
★変更 Ver0.02 2023/05/04 receive時にTeraTerm対応 {
xmodem で PC からファイルを受信する際、TeraTerm 側の file ⇒ Transfer ⇒ XMODEM ⇒ Send.. の操作でファイルを選択するのに時間が掛かって CP/M 側から NAK の再送があった場合、TeraTerm 側は NAK を2個まで記憶しており Block1 送信後、直ぐに Block1 を再送します。CP/M側は最初の Block1 に ACK 応答しても直ぐに Block1 が再送されてくるので NAK を送信し、ループ動作になってしまいます(最近 20MHz 動作の自作CP/M ボードを弄りこの問題が発生し易くなった)。
この問題に対して Block1 の再送に対しては応答を返さないことで対応しました。但し、受信が割込み処理では無く、取りこぼしてしまう場合は動作が異なることも予想されるので旧バージョンもダウンロードできるようにしておきます。
下図は CP/M 側から NAK が4回送信された後に TeraTerm 側がファイル送信を開始した場合の対処後のロジアナ波形例です。
TeraTerm での複数の NAK 受信後のファイル送信開始例
下図は上図の2回目のBlock1(SOH 以降)送信開始部分を拡大した図
Block 1 再送開始部分の拡大図
- xmodem_20180625_v001c.zip(旧バージョン)
★変更 2018/06/25 Ver0.01c PUN/RDRに対応
- UntarCpm80_v006.zip
★追記 2023/07/24
Ver 0.06 /f オプションでの対象ファイル指定機能を追加
★追記 2021/01/04
Ver0.05 Win10のtarコマンド等に対応(ヘッダ内サイズデータのデリミタが20Hの場合に対応)
★追記 2020/11/17
CP/M-80用のuntarです。複数ファイルをtarで固めCP/Mへ転送後、解凍すると作業効率が向上します。使い方は下のヘルプ表示を参照してください。
e>untar usage : untar [/e] FileName /e : extract all files Ver 0.04 2019/10/24 by skyriver
★追記 2018/06/25
xmodemでの転送とWordStarを一緒に使う場合等にエスケープシーケンスのON/OFF設定の変更が面倒なので xmodem 起動時の /p オプションで PUN/RDRディバイス指定可能にしました。(上記の画面キャプチャもアップデートしました)
PIC24CPMでは /p 指定した場合でもコンソール用のシリアル通信を使いますが、PUNではエスケープシーケンスの変換処理がないので通信データの透過性が保証されます。
また、RDRではBIOSコールの仕様上、データ有無のステータス確認ができないため、データがない場合にはゼロフラグをONにしてリターンするように拡張しています(普及率は不明ですがネット上に同様に拡張実装している例があったので採用)。
★追記 2018/06/28
ネット上で昔の雑誌のスキャンデータがアップされているところを見つけ、1991年10月号の「MSX FUN」(表紙には「今月からディスクが付録!」と書いてある)があったので見ていたら「パソ通天国」というコーナーがあってそこに XMODEM についての解説?があった。残念ながらASCIIは一冊も無かった・・
[TOP] [ 前へ ] 連載記事 [ 次へ ]