■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■ ■ ■ C言語風 PIC16C6x/C7x/C84用クロス・アセンブラ お試し版 (1997年6月C版) ■ ■ 幾島康夫 ■ ■ ■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■ 1997年6月B版の修正(バグ除去)版です ■ このプログラムはまだ全ての機能をチェックしていないため、「お試し版」 としています。 ■ プログラムの全ソースは、ある程度バグが取れた段階で公開することとしま したので、今回配布したファイルには含まれていません。 (もし、ソースがご入用ならば、配布しますのでご連絡下さい) ■ なお、1996年8月版の機能については、ほぼチェックを終了しています。 ■ 1996年8月版用のソースは一部を変更することにより、アセンブル可能です。 変更が必要な事項については、下記(■改良点)を参照下さい。 ■ アセンブラ・ソースの書き方については、SAMPLE.ASM も参考にして下さい。 ■ 1996年8月版の README.DOC も参考にして下さい ■ 配布ファイル 1) CPICASM.EXE ;クロス・アセンブラ本体 2) PIC16C84.DEF ;PIC16C84 用INCLUDEファイル 注)従来と定義の方法が変わりましたので、この定義ファイ をお使い下さい。 3) PIC16C64.DEF ;PIC16C64 用INCLUDEファイル 注)SAMPLE.ASM で使用します 4) SAMPLE.ASM ;サンプル・ソース 5) README.DOC ;このファイル ■ 1997年6月B版からの変更点 1) バグ除去 #def name *+ #char name #int name 等で、 #AUTO_MAX_ADDRESS 0x2F に設定したアドレスまで自動割り当て出ませんでした。 ■ 改良点(1996年8月版からの) (*が付くものは今回の修正で改良したもの) 1) 2Byte変数(#int)及び定数のサポート #int name ;変数 name を2Byte変数として定義 ;アドレスは自動割付により行われます ;name の下位8bitを参照する場合は、 ;(low)name または (lo)name ;name の上位8bitを参照する場合は、 ;(high)name または (hi)name ;として下さい #def name lit ;従来は #def で指定できる数値は8bit(0xFF)まででした ;が、今度から16bit(0xFFFF)まで指定できます ;数値の下位8bitを参照する場合は、 ;(low)lit または (lo)lit ;(high)lit または (hi)lit ;として下さい 2) #char のサポート #char name ;#def name *+ と等価 3) 数値表現の統一 従来は、#MAXROMSIZE等では、10進法で指定するようにしていましたが、今回の 改良で、全ての数値表現を統一しました。 16進数 ; 0123 何も修飾されていない数字は16進数となります 0x0123 先頭に '0x' が付加されたものは16進数と解釈 0123h 終わりに 'h' が付加されたものは16進数と解釈 10進数 ; .123 先頭に '.' が付加されたものは10進数と解釈 2進数 ; 1111000 8文字以上、16文字以下の '0' と '1' からなる数値 は2進数と解釈 0b11110000 先頭に '0b' が付加された、10文字以上、18文字以下 の数値は2進数と解釈 11110000b 終わりに 'b' が付加された、9文字以上、17文字以下 の数値は2進数と解釈 ASCII文字 ; 'A' ''内のASCII文字を数値化 制御文字 ; '\n' 注) 従来は #MAXROMSIZE 等では数値を全て10進数としていたので、 旧バージョンのソースを変更して下さい 4) コメント指定の厳密化及び追加 ●コメントの階層化 %% このように行頭の '%%' で囲まれた範囲は、コメントになります 注) '%%'の階層化はできません コメント行を含む複数ソース行 %% ●行中コメントの厳密化 従来も行中の ';'以後はコメント扱いでしたが、チェックが厳密ではなく ':'等を使用してもエラーとならない場合がありましたが、チェックが厳し くなったため、必ず ';' を使用下さい。 5) while 文の追加 while (条件式) { コード } が使えるようになりました。条件式に付いては下記参照 6) do 文の追加 do { コード } while (条件式) が使えるようになりました。条件式に付いては下記参照 7) 条件式の仕様追加 従来は、 if (bit条件式) ;例 if (status.zero == #0) if ((マクロ式) 条件) ; if ((W += 1) == #0) のようにbit条件式かマクロ式の結果をstatusレジスタのbitで比較する ことしか行えませんでしたが、下記の仕様が追加されました。 ● 変数間及び変数と数値の比較 例 if (name >= #lit) if (name1 != name1) 変数には #bitdef,#def,#int,#charで定義されたものが使える ● 二つの条件式を記述できる 例 if ((name > #lit) && (name1 == name2)) 条件の結合は、and('&&')、or('||')に限られます ● #lit に定義値の使用 従来は条件式には '#0' 等のように数値を直接使用しなければ なりませんでしたが、 #def OFF_CODE 1 if ( porta.0 == #OFF_CODE ) のように#defで定義されたものを使えるようになりました 8) #bitdefの省略 従来は #def porta 05h #bitdef porta.0 porta 0 : #bitdef porta.7 porta 7 と定義しないと、porta.0 〜 porta,7 が bit定義として認識されま せんでしたが、 #def porta 05h とするだけで、porta.0 〜 porta.7 をbit定義と認識します。 ただし、 #bitdef porta.7 tmr0 0 のよに #bitdef で定義済みのものについては、定義を優先します 9) bitの代入 従来は、 #0 -> porta.0 のように記述していましたが,これに加えて porta.0 = #0 porta.0 = #OFF_CODE ; #OFF_CODE -> porta.0 も可 porta.0 = porta.1 9) #dat の仕様拡張 従来の指定方法の他に #dat name "abcdef\n" #dat name 01h 02h 03h 04h 05h のように、文字列を一括して指定することができるようになりました name には格納されるアドレスが入ります アドレスは文字数だけインクリメントされます。 アドレスの初期値は、 #dorg lit で指定します。従来の #dat adr lit ではアドレスのインクリメント は行われないので注意が必要です 10) #WAR_LEVEL lit の追加 アセンブル中に発生する警告メッセージやパス情報等の表示を 制御します #WAR_LEVEL 0 ;エラーメッセージ以外は表示されません (標準設定) #WAR_LEVEL 1 ;いろいろな情報を表示します 11) 単項演算・二項演算 #int属性の演算が追加されました。 属性の異なるもの同士の演算には注意が必要です。 12) アセンブル可能なソース・ファイルの大きさ バッファ・サイズが従来より少なくなっていますので、注意して 下さい 13) #print の追加 #print "sample text.\n" ;""内の文字を表示します(2バイト ;文字は不可) #print name ;定義値の属性及び数値を表示 #print lbl_name ;ラベルが定義されたアドレスを表示 14) ローカル・ラベルの仕様変更 従来は、 #lbl 0 goto 0b のように、同一アドレスは指定できませんでしたが、 指定できるようにしました 15) ラベル定義方法の追加 lbl_name: のように末尾に ':' を付加すると #lbl lbl_name と等価になるようにしました 16) conitnue文の追加 while文、do文の先頭にジャンプします。 例 do { コード if ( a == #0 ) continue } while ( b == #0) 17) break文の追加 while文、do文の外にでます。(if文は無視されます) 例 while ( a == b) { コード break; } 18) 最適化 従来はマクロ展開時にのみ最適化を行っていましたが、 今回はコード・レベルで最適化しています。 よって、展開されるコードは若干ことなることが あるかもしれません。 19) 特殊な展開 下記a)〜c)は decfsz/incfsz を使って展開する特例です a) do { code } while ( -- name != #0 ) : ++ name != #0 でも可 b) if ( -- name == #0 ) ; ++ name == #0 でも可 c) while ( -- name == #0 ) ; 〃 これ以外、例えば if ( ++ name != #0 ) のようなコードは展開できません。 また、 if ((-- name) == #0) は -- name if (status.zero == #1) に展開されます。 20) check sum 機能の追加 Microchp 社の PIC16F8X EEPROM Memory Programming Specification に記載されている Check sum 機能が付きました(PIC16F84のみ、他のPICのcheck sum については未調査なの でしばらくお待ち下さい) check sum を出力する場合は、ソース・ファイルに #CHECK_SUM 1 の行をつけ加えて下さい。check sum はアセンブル・終了後に画面に表示され ます。 #CHECK_SUM 0 で無効(デフォルト設定) 21) obj ファイルにおいてコンフィグレーション領域(0x2000-0x2007番地)を最後 に出力するようにしました。 なお、従来通りの出力とする場合には、ソース・ファイルに #CONFIG_END 1 の行をつけ加えて下さい。 21) ASCII コード 0x80-0xFF の範囲が扱えるようにしました。 これにより、 W = #'ア' のようにカタカナも扱えるようになります。 ■ 使用方法 1) cpicasm source source : ソース・ファイル名(拡張子の制限はありません) この場合は、source で指定したファイル名+'obj'拡張子 として、カレント・ディレクトリにオブジェクト・ファイルが作成されます 例) cpicasm filename.asm filename.obj が作成される なお、エラー等が発生した場合には、作成されません 2) cpicasm source option > output source : ソース・ファイル名(拡張子の制限はありません) option :下記の文字列を指定可能です pass1_out ; pass 1 の結果を標準出力へ : (1〜11までのパスがあります) pass11_out ; pass 11 〃 org_list ; 最適化前のコードを標準出力へ opt_list ; 最適化後の 〃 obj_list ; オブジェク・コードを付加して リストを標準出力へ non ; オブジェクト・コードを標準出力へ 注)展開コードが #MAXROMSIZE を超えた場合は、 obj_list は作成されませんので、この時は、 opt_list を指定下さい 注)上記optionを指定するとobjコードは 出力されないので注意して下さい output : エラーメッセージ等以外は全て(OBJコードも) 標準出力に出力しますので、objコードをファイル に格納する場合は、 cpicasm source > source.obj のように出力ファイルを指定下さい なお、参照する環境変数はありません ■ 動作環境 今回の動作確認は, PC-9821Ld(DOS 6.2) のみですが、1997年4月版は PC-9801RA(DOS 5.0), PC-9821Ld(DOS 6.2) COMPAQ DESKPRO 2000(Windows NT4.0 のコマンド・プロンプト) で行いました。 互換機のDOS環境やWindows 3.1/95 のDOS窓でも作動すると思います 動作させるためには、ある程度のメモリが必要です。 WINDOWS の DOS窓 で使用する場合は注意して下さい。 ■ その他 本プログラムはフリーソフトウエアでが、お試し版なので転載はご遠慮 下さい。 Cソースは Turbo C++ Version 1.01 でコンパイルしました。