mchip-cdc
mcc18 PIC18F2550 PIC18F4550 HIDmon-2550 HIDmon-14K50 sdcc
USB-CDCシリアル変換ファームウェアの改良†
- mcc18のインストール方法についてはこちらを参照してください。
- mcc18にあるmchip-cdc14k2のアーカイブを少し変更して、18F2550/18F4550にも対応させてみました。
ダウンロード
ついでに、Linux環境でビルド出来るようにもしてあります。
- ただし、ビルドするためにはwine(とmcc18)を入れる必要があります。
# apt-get install wine
- 動作確認はubuntu-9.10を使用しました。
- mcc18はwindowsにインストールしたものからコピーする必要があります。
逆アセンブルリストを見やすくしてみました。
$ make dumplst
すると、cdc-18F2550.src という逆アセンブルリストが作れます。
Todo:
- 割り込み受信したい。
- ボーレート上げたい。
- Cソース中にアセンブラを書くには?
- 割り込み処理をアセンブラで書くには?
Cソース中にアセンブラを書くには?†
答え:
_asm と _endasm でアセンブラ記述を挟む。
1行に書いてもいいし、
_asm アセンブラ記述 ・・・ _endasm
としても良い。
- _endasm の後ろにセミコロン不要。
- アセンブラ記述にも行末セミコロン不要。
- 引数無しのvoidな関数内にいきなり _asm と書き始めるもOK。
- C言語的にはプロローグコード、エピローグコードは無いので気にしなくて良い。
- return 命令はC言語側が挿入するので _endasmの手前のreturn は不要。
書き方の見本は?†
- mcc18をインストールしたディレクトリにある。
C:/mcc18/src/traditional/*/*.c
ここは見ておけ。†
- asmでのマクロの書き方。
C:\mcc18\src\traditional\stdclib\p18macro.inc
- strcpyのソース。
C:\mcc18\src\traditional\stdclib\strcpy.asm
- mcc18の引数渡しは、FSR1を引数スタックポインタとして使用する。
- つまり、引数リストを後ろから順にFSR1にpushして、関数をcallする。
- char引数はshortに引き伸ばさずに、byte単位でスタックに積む。
- すなわち関数を呼ぶ度にchar引数の符号拡張を入れなくて済む。
- 関数内で使用する(破壊する)レジスタの退避もFSR1をスタックにして使う。
- なので、関数内で引数を取り出したい場合のFSR1相対オフセット値は、退避サイズを加算して決めている。
- FSR1のpopは呼び出し側の責任。
- 戻り値はPRODL,PRODH(乗算結果レジスタ)に返すようになっている。(WREGは使わない)
- アセンブラ記述内から引数を取得するマクロはこんな感じ。
Stk1CpyToReg macro Offset,Reg <=== 1byte取得。 Stk2CpyToReg macro Offset,Reg <=== 2byte取得。
- Offsetが[SP+Offset]のFSR1相対オフセット。
- Regは取り出した引数を保存するメモリー領域。
- このマクロはFSR1を変化させない。
- PLUSW1という[FSR1+WREG]のメモリーをフェッチしてくれるという変な(?)窓から、取り出し先[Reg]に
- movff命令で転送を掛けている。
- 実際のところ、関数の中身を全部 _asm 〜 _endasmで記述するのであれば、
- 引数はスタックに積むよりも呼び出される側の関数に属するarg変数のようなものを固定的に用意したほうが少し効率が良い。
- FSR1は、破壊すると困るレジスタをpush,popするだけに使用する。
8080や6800の時代に逆戻りだな。
ワークエリアに A, B,C, D,E, H,L とかを定義しておいたらまるで8080だ。
- そんな感じで使えば、8080程度のコーディングは可能だ。
- FSRは12bitしかないので、値を保持するレジスタとして使う場合は注意する必要がある。