3チップ構成68Kマイコンの構想(その10)XMODEMアプリの作成 [68K]
前回の「3チップ構成68Kマイコンの構想(その9)メモリ拡張」で書いたように自作68Kボードのメモリを512KBに拡張できたので、CP/M-68Kの一般的アプリが動く環境になりました。CP/M-68K用として公開されているソフトがCP/M-80程に豊富なわけではありませんが探せば色々見つかります。
ネットからダウンロードしたファイルを試してみたりする際にSDカードとのファイルのやり取りが手軽にできる環境がないと不便です。
ネット上でCP/M-68K用のkermitを見つけましたが、kermitのクライアントのようでパソコンとファイルの送受信をするためにはパソコン側にkermitのホストを立ち上げる必要があります。しかし、CP/M用のコンソールとしてTeraTermを使っているので切替えの手間が必要になります。
そこで「3チップ構成Pic24CPMマイコン(その5)XMODEMでファイル送受信」の記事で書いた自作のCP/M-80用のxmodemアプリをCP/M-68K用に移植しました。
CP/M-80で使った HI-TECH C コンパイラはプロトタイプ宣言やunionなどにも対応していて使い易かったのですが、CP/M-68KのC言語コンパイラはK&Rの構文なので結構使いづらい・・・
標準的なヘッダファイルもあまりないのでハマった点としてファイルオープン時のリターン値である stream address が符号拡張されて実装メモリ(MC68008のメモリ空間である1MBの前半部分)以外になり、(自作の68Kボードでは)実行が停止してしまう問題が発生しました。
対策としては fopenbを使用する前に FILE *fopenb(); のように簡易的なプロトタイプ宣言をする必要があります。()内の引数は型宣言付きで記述するとエラーになりますが型宣言無しで記述するとエラーは発生しません。しかし、コンパイラは無視するので引数の数チェックを期待してもコンパイラはチェックしませんでした。(意味を示す判り易い表現で引数を書いておいた方がbetterだとは思います)
68Kではアセンブラでアドレス用のレジスタ(A0~A7)の下位ワード(16bit)を設定した時等も上位ワードに符号拡張されるので注意が必要です。
DDTでのSend()処理の逆アセンブル
少し手間取りましたが、CP/M-68K用のxmodemアプリが完成し、ファイルのやり取りがメチャ楽になりました^^
xmodemができるまでは、pip xm16.c=con: のようにpipコマンドを使って TeraTerm のファイル送信機能(バイナリモードをON)を使っていましたが、シリアル通信速度が38400bpsではたまに取りこぼしが発生するので1キャラクタ毎に1msのウェイトを設定していて、転送に時間が掛かっていました。
(今回のMC68008は8MHz動作ですが、16MHzのZ80で動くPic24CPMではウェイト無しにTeraTermからの送信ができていた)
今回作成した CP/M-68K用の xmodemアプリのコンパイルと使用例のログを以下に貼っておきます。
冒頭で書いたように CP/M-68K のアプリはネットを探してもそれ程豊富ではない状況なので、今時 CP/M-68Kの新アプリを公開するサイトは希少だと思います。
まぁアクセス数の少ない極東のこのブログで公開しても見つける人の方が希少かもしれません・・w
xmodemアプリのコンパイル方法と使用例
上のログの末尾にあるヘルプメッセージからも判るように今回も '/p' オプションでBIOSに実装している puncher とreader を使った通信に対応しました。
reader からの受信ではBIOSの仕様上、受信データの有無を確認するためのステータス取得ができないので、受信データがない場合にはリターン値を 0xffff にするような拡張を行っています。
★2018/09/30 追記 {
CP/M-68Kのマニュアル上はpucher/readerではなく、Auxiliary Output/Input(汎用入出力)と記載されています。
}
下のキャプチャはCP/M-68Kからのファイル送信中のロジアナ波形で、下図からは判りませんが拡大して見るとシリアル通信(38400bps)もキャラクタ間に隙間なく送信できています。
尚、今回開発したxmodemのソースと実行ファイルは下記のURLからダウンロード可能です。営利目的以外であれば自由に使って構いません。
★2018/09/30 追記
今回作成したxmodemアプリでCP/Mとパソコン間でのバイナリも含めたファイルの送受信が手軽にできるようになったので「3チップ構成68Kマイコンの構想(その7)CP/Mのリロケート」の記事で書いたdump表示をTeraTermからコピペし、dump2binでバイナリ化後、Sレコード変換しなくても、CP/M上のsendc68コマンドでCP/M上のファイルをSレコード化してからxmodemでパソコンに持ってこれるようになりました。
例えば sendc68 - cpm0400.sys >cpm0400.sr でCP/M本体をSレコードしてからxmodemでパソコンに持ってくれば、万が一、CP/Mが立ち上がらない状況になった場合にも、パソコン側からSレコードローダーで68K内メモリにダウンロードすることで最初のころに行っていたようなSレコードダウンロード方式によるCP/Mの起動が可能となります。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
ネットからダウンロードしたファイルを試してみたりする際にSDカードとのファイルのやり取りが手軽にできる環境がないと不便です。
ネット上でCP/M-68K用のkermitを見つけましたが、kermitのクライアントのようでパソコンとファイルの送受信をするためにはパソコン側にkermitのホストを立ち上げる必要があります。しかし、CP/M用のコンソールとしてTeraTermを使っているので切替えの手間が必要になります。
そこで「3チップ構成Pic24CPMマイコン(その5)XMODEMでファイル送受信」の記事で書いた自作のCP/M-80用のxmodemアプリをCP/M-68K用に移植しました。
CP/M-80で使った HI-TECH C コンパイラはプロトタイプ宣言やunionなどにも対応していて使い易かったのですが、CP/M-68KのC言語コンパイラはK&Rの構文なので結構使いづらい・・・
標準的なヘッダファイルもあまりないのでハマった点としてファイルオープン時のリターン値である stream address が符号拡張されて実装メモリ(MC68008のメモリ空間である1MBの前半部分)以外になり、(自作の68Kボードでは)実行が停止してしまう問題が発生しました。
対策としては fopenbを使用する前に FILE *fopenb(); のように簡易的なプロトタイプ宣言をする必要があります。()内の引数は型宣言付きで記述するとエラーになりますが型宣言無しで記述するとエラーは発生しません。しかし、コンパイラは無視するので引数の数チェックを期待してもコンパイラはチェックしませんでした。(意味を示す判り易い表現で引数を書いておいた方がbetterだとは思います)
68Kではアセンブラでアドレス用のレジスタ(A0~A7)の下位ワード(16bit)を設定した時等も上位ワードに符号拡張されるので注意が必要です。
|
少し手間取りましたが、CP/M-68K用のxmodemアプリが完成し、ファイルのやり取りがメチャ楽になりました^^
xmodemができるまでは、pip xm16.c=con: のようにpipコマンドを使って TeraTerm のファイル送信機能(バイナリモードをON)を使っていましたが、シリアル通信速度が38400bpsではたまに取りこぼしが発生するので1キャラクタ毎に1msのウェイトを設定していて、転送に時間が掛かっていました。
(今回のMC68008は8MHz動作ですが、16MHzのZ80で動くPic24CPMではウェイト無しにTeraTermからの送信ができていた)
今回作成した CP/M-68K用の xmodemアプリのコンパイルと使用例のログを以下に貼っておきます。
冒頭で書いたように CP/M-68K のアプリはネットを探してもそれ程豊富ではない状況なので、今時 CP/M-68Kの新アプリを公開するサイトは希少だと思います。
まぁアクセス数の少ない極東のこのブログで公開しても見つける人の方が希少かもしれません・・w
|
上のログの末尾にあるヘルプメッセージからも判るように今回も '/p' オプションでBIOSに実装している puncher とreader を使った通信に対応しました。
reader からの受信ではBIOSの仕様上、受信データの有無を確認するためのステータス取得ができないので、受信データがない場合にはリターン値を 0xffff にするような拡張を行っています。
★2018/09/30 追記 {
CP/M-68Kのマニュアル上はpucher/readerではなく、Auxiliary Output/Input(汎用入出力)と記載されています。
}
下のキャプチャはCP/M-68Kからのファイル送信中のロジアナ波形で、下図からは判りませんが拡大して見るとシリアル通信(38400bps)もキャラクタ間に隙間なく送信できています。
CP/M-68K側からxmodemでファイル送信中の波形例 |
|
尚、今回開発したxmodemのソースと実行ファイルは下記のURLからダウンロード可能です。営利目的以外であれば自由に使って構いません。
- xmodem68k_20181021_001d.zip
★2018/10/21 追記 受信時に32KB以上の場合、リトライする問題を対処
★2018/09/30 追記
今回作成したxmodemアプリでCP/Mとパソコン間でのバイナリも含めたファイルの送受信が手軽にできるようになったので「3チップ構成68Kマイコンの構想(その7)CP/Mのリロケート」の記事で書いたdump表示をTeraTermからコピペし、dump2binでバイナリ化後、Sレコード変換しなくても、CP/M上のsendc68コマンドでCP/M上のファイルをSレコード化してからxmodemでパソコンに持ってこれるようになりました。
例えば sendc68 - cpm0400.sys >cpm0400.sr でCP/M本体をSレコードしてからxmodemでパソコンに持ってくれば、万が一、CP/Mが立ち上がらない状況になった場合にも、パソコン側からSレコードローダーで68K内メモリにダウンロードすることで最初のころに行っていたようなSレコードダウンロード方式によるCP/Mの起動が可能となります。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
CP/Mファイルに標準で入っている sendc68 コマンドの活用事例について追記しました。
by skyriver (2018-09-30 00:25)
自作したxmodemのアプリでファイル受信時にファイルサイズが32KB以上の場合リトライする問題の対処版にアップデートしました。
by skyriver (2018-10-21 09:19)