SSブログ
English Version

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()処理の逆アセンブル
-l._Send _Send: 00007326 link A6,#$FFF2 0000732A move.l #$AEBC,(A7) 00007330 move.l $B358,-(A7) ._FileNam 00007336 jsr $7ABA ._fopenb 0000733C addq.l #$4,A7 0000733E ext.l D0     D0が0000B04A -> FFFFB04A に符号拡張されてしまう 00007340 move.l D0,$B34A ._Fp 00007346 bne $7352 00007348 move.l #$AEBE,(A7) 0000734E bsr $7164 ._ErrExit 00007352 move.w #$C,$FFFA(A6)


 少し手間取りましたが、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アプリのコンパイル方法と使用例
N>xm68 /r xm68.c xm68.c Overwrite(Y/N) ?y received 55 block(s). N>c xm68 N>CP68 -I O: XM68.C XM68.I N>C068 XM68.I XM68.1 XM68.2 XM68.3 -F N>ERA XM68.I N>C168 XM68.1 XM68.2 XM68.S N>ERA XM68.1 N>ERA XM68.2 N>AS68 -L -U -S 0: XM68.S N>ERA XM68.S N>clink xm68 bdos N>LO68 -R -U_NOFLOAT -O XM68.68K 0:S.O XM68.O BDOS.O .O .O .O .O .O .O .O 0:CLIB N>ren xm68.rel=xm68.68k N>reloc xm68.rel xm68.68k N>stat xm68.* DRIVE N: USER : 0 RECS BYTES FCBS ATTRIBUTES NAME 134 18K 2 DIR RW N:XM68 .68K 55 8K 1 DIR RW N:XM68 .C 60 8K 1 DIR RW N:XM68 .O 283 36K 3 DIR RW N:XM68 .REL ---------------------------------------------- TOTAL: 70K 7 N: RW, FREE SPACE: 1,110K N>xm68 /s xm68.68k xm68.68k sent 134 block(s). N>xm68 usage : xm68 [/s /r /p] FileName /s : send[default] /r : receive /p : use PUN/RDR device Ver0.01c 2018/09/28 by skyriver N>


 上のログの末尾にあるヘルプメッセージからも判るように今回も '/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からダウンロード可能です。営利目的以外であれば自由に使って構いません。


★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] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(2) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 2

skyriver

CP/Mファイルに標準で入っている sendc68 コマンドの活用事例について追記しました。
by skyriver (2018-09-30 00:25) 

skyriver

自作したxmodemのアプリでファイル受信時にファイルサイズが32KB以上の場合リトライする問題の対処版にアップデートしました。
by skyriver (2018-10-21 09:19) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。