So-net無料ブログ作成
English Version

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 を使ってみて感じたことは
  • 構造体/共用体に対応
     CP/MのCコンパイラの中では未対応なものが多いですが HI-TECH C では普通に使えます。今回も2バイト変数をバイトに分割する部分でstructとunionを使いました。
  • ループ処理内での"break"に未対応
     for文等のループ内でループから抜け出すための"break"が使えない^^;。switch文では当然"break"が使えます。
     "break"は自作のpicle言語でも最初は未対応でしたが、使い勝手が悪いので途中で追加しています("continue"は未対応ですがなくてもあまり困らない)。
  • 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言語ソースと実行ファイルは下記からダウンロード可能です。商用利用以外であれば自由に使用可能です。


★追記 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] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(1) 
共通テーマ:趣味・カルチャー

3チップ構成Pic24CPMマイコン(その4)ZSIDで小文字のシンボルを使う方法その2 [Z80]

 「3チップ構成Pic24CPMマイコン(その3)ZSIDで小文字のシンボルを使う方法」の記事でCP/M上でHI-TECH Cを使い ZSID でシンボリックデバッグする上で ZSID がコマンド内の小文字のシンボルを解釈できないという問題があることを書きました。
 その解決方法として ZSID 内部のコマンド入力部の大文字変換する処理を無効にするパッチを提案しました。

 しかし、前回の記事の最後に書いたようにコマンドを小文字で入力するとエラーになるという制限がありました。その他にもヘキサ入力時も大文字にする必要がある等、色々使い勝手がよくないのでもう少しきちんと対処することにしました。

 結果から先に書くと下記のパッチ(2ヶ所の書換え)でコマンド入力のシンボル部のみ大文字変換しないようにすることに成功しました (^^)/


ZSIDへの小文字シンボル対応パッチ適用手順
a>ddt zsid.com DDT VERS 2.2 NEXT PC 2900 0100 -s1b6f 1B6F CD 1B70 90 9c 1B71 18 . -s1b9a 1B9A CD 1B9B 90 9c 1B9C 18 . -g0 a>save 40 zsidd.com a>b: b>a:zsidd hello.com hello.sym ZSID VERS 1.4 SYMBOLS NEXT PC END 1100 0100 C72E #l._main _main: 013D CALL 0EAA .ncsv 0140 NOP 0141 NOP 0142 LD HL,0EBF 0145 PUSH HL 0146 CALL 0151 ._printf 0149 LD HL,0002 014C ADD HL,SP 014D LD SP,HL 014E JP 0EA2 .cret _printf: 0151 CALL 0E96 .csv #g0 b>



 それでは解析過程の概要を簡単に記録しておきます。

  1. ZSIDの自己コード移動処理
     ZSIDはCP/M上で動作する実行ファイルをディバッグするので初期化処理で自身のコードをメモリの最後の方に移動しています。
     今回使用したCP/Mのメモリサイズは64KBですが、この場合、ZSID自身の0200H以降をA800Hへコピーしていました。
     なので0200H以降のコードについてはディスアセンブルでのアドレスに+A600H(=A800H-0200H)加えたものが実行アドレスになります。
     また、「CALL」や「JP」などのニーモニック内のアドレスから0200H引いたアドレスがディスアセンブルリスト上のコードアドレスとなり、少々ヤヤコシイ状態になりますw
     この辺りは ZSID で ZSID 自身をステップ動作等させて確かめましたw

ZSIDのコード移動処理
0155 210002 LD HL,T0200 0158 78 A0158: LD A,B 0159 B1 OR C 015A CA6501 JP Z,A0165 015D 0B DEC BC 015E 7E LD A,(HL) 015F 12 A015F: LD (DE),A 0160 13 INC DE 0161 23 INC HL 0162 C35801 JP A0158



  1. コマンド入力処理
     下記がコマンド入力内容を大文字変換しているところで1A90Hがコマンド入力文字を1文字取得する処理のエントリです。
     前回の記事では「AND 05FH」部分の05FHを0FFHに変更することで大文字変変換を無効にしました。
     先頭の"CALL A189C"は直下の1A9Cをコールしています(0200H分のオフセットが付くので)
     このことからA189Cをコールすれば大文字変換無しのコマンド1文字入力に使えそうです。

ZSIDのコマンド入力処理
1A90 CD9C18 CALL A189C 1A93 FE7F CP 07FH 1A95 C8 A1A95: RET Z 1A96 FE61 CP 061H 1A98 D8 A1A98: RET C 1A99 E65F AND 05FH 1A9B C9 RET ; 1A9C E5 PUSH HL 1A9D 216D21 A1A9D: LD HL,D216D 1AA0 7E LD A,(HL) 1AA1 B7 OR A 1AA2 3E0D LD A,00DH 1AA4 CAB018 JP Z,A18B0 1AA7 35 DEC (HL) 1AA8 2A6A21 LD HL,(D216A) 1AAB 7E A1AAB: LD A,(HL) 1AAC 23 INC HL 1AAD 226A21 LD (D216A),HL 1AB0 E1 POP HL 1AB1 C9 RET



  1. シンボル処理
     次にシンボル処理の箇所はシンボル入力時に使う'.'(02EH)記号のコンペア命令を目印に探したところ下記の部分を見つけました。
     すぐ下にシンボル表現で使用するもう一つの記号'@'(040H)の比較部分もあるのでシンボル処理である可能大です。
     試しに'.'を'''に変更するパッチを入れたところ、'''でシンボル参照できたのでシンボル処理であることが確定です。

ZSIDのシンボル処理
1BD3 EB EX DE,HL 1BD4 210000 LD HL,00000H 1BD7 FE2E CP 02EH ;シンボル記号'.' 1BD9 CA6E19 JP Z,A196E 1BDC FE40 CP 040H ;シンボル記号'@' 1BDE C2EB19 JP NZ,A19EB 1BE1 CD6E19 CALL A196E 1BE4 E5 PUSH HL 1BE5 EB EX DE,HL 1BE6 5E LD E,(HL) 1BE7 23 INC HL 1BE8 56 LD D,(HL) 1BE9 E1 POP HL 1BEA C9 RET



  1. パッチ適用箇所
     上記の'.'と'@'の場合にコールされている1B6EH(0200Hオフセットが掛かる)がコマンド内のシンボル文字列を実際の値に変換する処理ということになります。
     コマンド文字入力(1890Hをコール)は2ヶ所あり、これを189CHの大文字変換無しの処理をコールするように変更すればシンボル処理だけ大文字変換が掛からず、小文字のシンボルも使えるということになります。

ZSIDのコマンド内のシンボル文字列処理
1B6E D5 PUSH DE 1B6F CD9018 CALL A1890 ;change to 189CH 1B72 2AB221 LD HL,(D21B2) 1B75 F5 PUSH AF 1B76 4E LD C,(HL) 1B77 79 LD A,C 1B78 FE10 CP 010H 1B7A D25D18 JP NC,A185D 1B7D F1 A1B7D: POP AF 1B7E EB EX DE,HL 1B7F D5 PUSH DE 1B80 F5 PUSH AF 1B81 2A6A21 LD HL,(D216A) 1B84 E5 PUSH HL 1B85 2A6C21 LD HL,(D216C) 1B88 E5 PUSH HL 1B89 EB EX DE,HL 1B8A 0C INC C 1B8B CD4519 A1B8B: CALL A1945 1B8E CAA019 JP Z,A19A0 1B91 0D A1B91: DEC C 1B92 CABA19 JP Z,A19BA 1B95 2B DEC HL 1B96 BE CP (HL) 1B97 C2BA19 JP NZ,A19BA 1B9A CD9018 CALL A1890 ;change to 189CH 1B9D C38B19 JP A198B



[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(1)  コメント(1) 
共通テーマ:趣味・カルチャー

3チップ構成Pic24CPMマイコン(その3)ZSIDで小文字のシンボルを使う方法 [Z80]

 「レトロマイコンZ80ボードの構想(その19)PCB化」の記事の最後の方に書いたようにHI-TECH CはANCI規格にも準拠していてプロトタイプ宣言や構造体も使えCP/M-80上で使用可能なC言語の中では最も使い易いのものの一つではないかと思います。

 また、添付されているREAD.MEを見ると

The HI-TECH Z80 CP/M C compiler V3.09 is provided free of charge for any
use, private or commercial, strictly as-is. No warranty or product
support is offered or implied.

You may use this software for whatever you like, providing you acknowledge
that the copyright to this software remains with HI-TECH Software.


と書かれており、営利的な使用も含めて特に使用制限は無いようです。
 HI-TECH C(V3.09)はマニュアルも含めて ここ からダウンロード可能です(z80v309.exeにコンパイラが入っている)。

 開発元のHI-TECHソフトウェア社は2009年3月にマイクロチップ社に買収され、現在、マイクロチップ社が提供しているPIC用Cコンパイラの開発元でもあります。
 CP/M版HI-TECH Cのマニュアル(Z80DOC.TXT)を見るとZAS(アセンブラ)での数字表現のテンポラリラベルの後にf(forward)またはb(back)を付けて参照できる辺りにもPIC用の開発環境に通じる片鱗を垣間見ることができます。

 HI-TECH Cでコンパイル時に -f オプションを付けることでシンボルファイルも作成できディバッグ時に活用できます。
 また、シンボルは大文字/小文字の区別もありC言語を使う上では助かります。
 しかし、ZSIDにシンボル情報を読込ませることはできましたが、コマンド内でシンボルを参照できませんでした・・・

ZSIDへHI-TECH Cのシンボルファイル読込み
b>type hello.c #include <stdio.h> void main( void ) { printf( "hello !" ); } b>c -fhello.sym hello.c HI-TECH C COMPILER (CP/M-80) V3.09 Copyright (C) 1984-87 HI-TECH SOFTWARE b>dir hello.* B: HELLO C : HELLO COM : HELLO SYM b>a:zsid hello.com hello.sym ZSID VERS 1.4 SYMBOLS NEXT PC END 1100 0100 C72E #l0125 0125 LD HL,0081 0128 PUSH HL 0129 CALL 06C7 .startup 012C POP BC 012D POP BC 012E PUSH HL 012F LD HL,(12F8 .__argc_) 0132 PUSH HL 0133 CALL 013D ._main 0136 PUSH HL 0137 CALL 06B4 ._exit #l._main ? #g0 b>


 上記のようなZSIDでシンボル参照できない問題の解決方法をネットで探しましたがすぐには見つかりませんでした・・・

 リスト表示ではシンボル表記になることからシンボル情報自体はZSIDに読込まれているようです。
 コマンドで入力したシンボル文字列がZSIDの内部処理で大文字変換されるため、内部のシンボル文字列とマッチせず入力したシンボルが参照できないようです。
 (因みにMBASICは小文字も入力可能なので小文字のファイル名も作成でき、逆に小文字のファイル名のファイル削除にも使えます)

 そこで、ZSIDの内部処理でコマンドラインを大文字変換している部分にパッチを当ててみました。
 CP/M-80のコマンドはサイズが小さいので該当の処理を探すのは楽です^^
 ZSIDへのパッチはDDTを使って当てていますw

ZSIDへパッチ適用し小文字のシンボルに対応
a>ddt zsid.com DDT VERS 2.2 NEXT PC 2900 0100 -s1a99 1A99 E6 1A9A 5F ff 1A9B C9 . -g0 a>save 40 zsidd.com a>b: b>a:zsidd hello.com hello.sym ZSID VERS 1.4 SYMBOLS NEXT PC END 1100 0100 C72E #L._main _main: 013D CALL 0EAA .ncsv 0140 NOP 0141 NOP 0142 LD HL,0EBF 0145 PUSH HL 0146 CALL 0151 ._printf 0149 LD HL,0002 014C ADD HL,SP 014D LD SP,HL 014E JP 0EA2 .cret _printf: 0151 CALL 0E96 .csv #G0 b>


 ZSID内でコマンドからもシンボルが使えるようになりました^^
 注意点としてはコマンド自体が小文字だとエラーになるのでコマンドを大文字で入力する必要があります(パッチ適用前は大文字変換されるのでエラーにならなかった)

 上記の制約は発生しますが、シンボルが使えるようになるメリットは私にとっては大きいです^^

[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(1) 
共通テーマ:趣味・カルチャー

3チップ構成Pic24CPMマイコン(その2)ケース作成 [Z80]

 「ニクロム線樹脂板カッター」の記事に書いたように3チップ構成のCP/Mマイコンボードのケースを検討していました。
 普段は3Dプリンタだけでケースを作りますが、趣向を変えて透明樹脂も使おうと思い、百均からスチロール製のディスプレイスタンドを買ってきて平板部分を切出して材料として使いました。

 今回は側面を3Dプリンタで作成し、ボトムパネルとトップパネルは透明なスチロール板を使いました。

 全体の設計を下図に示します。使用しているソフトはDesignSparkMechanicalです。
3D表示のpdfもここからダウンロードできます(ブラウザではセキュリティの関係で表示できなかった^^;)。

ケース外観



 DesignSparkMechanicalで設計した後、DXFファイルで吐き出したデータをEstlcamに取り込んでCNC用のNCファイルを作成しています。
 DXFファイルを吐き出す時は面のエディット状態にして正面を向けた状態でDXFファイルを吐出します(傾けた状態だと傾いてみた時の状態のDXFファイルが出来てしまう)

Estlcamでの編集画面



 下は編集後にEstlcamのプレビュー表示で確認している時の画面です。

Estlcamのプレビュー画面



 今回使用したスチロールは融点がアクリル(160℃※押し出し材よりキャスト材の方が切削し易い)よりも高く240℃なのでCNCで簡単に加工できると思っていましたが切削中に融解して何回かリトライすることになりました。
 対策としては下記のように移動速度を早くすることと切削部にオイルを補給することでなんとか加工できました。ドリルの形状も影響するようで2フルートのΦ1.4mmを使いました。
  • xy軸移動速度:200mm/min
  • z軸移動速度:90mm/min
  • z軸ステップ:0.4mm
  • 切削オイル:エーゼット製「切削」

 CNC加工したトップパネルが下の写真です。
 文字は裏面に0.4mmの深さで刻印していて、Φ1.4mmのドリルではアウトラインの切出しも含めて1時間程度かかりました。しかもかなり音がうるさかった・・

 また、四隅の穴はCNCでは位置の印だけつけて、手作業でドリルで穴を開けています(CNCで穴を開けたいところですが溶けてしまう)
 今回のケース作成で百均で購入したスチロール製のディスプレイスタンドから材料を切出し、CNCで加工すればそれなりのものが作れることが判りました^^

トップパネル


 3Dプリンタで作成した側面部品の精度がイマイチな部分がありますが、完成したケース入りの写真が下の写真です。
 ボタンのプッシュ面はパネル面と同じ高さにして出っ張らないようにしています。

トップ面



 ボトム側から見ると下の写真のようになっています。

ボトム面


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー