ソフトの開発は、自分用のライブラリやヘッダを作っておけば、ルーチンの使いまわしも
楽になりますし、マニュアルを引く手間も減り、バグも減り納期短縮に繋がります。
以下のようにプログラムとは別に、よく使うものを lib3052というフォルダに分け使い回します。
組み込みだとポート割りがその都度変わるため、EEPROM処理とかはライブラリ化できません。
ポート割り当てファイルを別個に作り、ライブラリを再コンパイルするのが効率よさそうです。
<program> <lib3052> 3052h.h ------- ヘッダファイル(C 言語用) 3052h.inc ----- ヘッダファイル(アセンブラ用) ad.inc -------- A/D コンバータの I/O 定義ファイル(アセンブラ用) da.inc -------- D/A コンバータの I/O 定義ファイル(アセンブラ用) itu.inc ------- ITU の I/O 定義ファイル(アセンブラ用) port.inc ------ ポートの I/O 定義ファイル(アセンブラ用) sci.inc ------- シリアルポートの I/O 定義ファイル(アセンブラ用) sprintf.c ----- 軽量 sprint 関数(C 言語用) system.inc ---- システムの I/O 定義ファイル(アセンブラ用) typedef.h ----- 型定義(C 言語用) wait.asm ------ ウェイト処理(C 言語、アセンブラ共用) : <プログラム 1> <プログラム 2> :
実際にはもっとたくさんのファイルが、ライブラリフォルダに入っています。
色々なCPU、MPUを使っているとintが何バイトだとか、charのデフォルトは符号あり?なし?が
判らなくなります。また、Yellow SoftのCコンパイラにはBOOLがないので、VC で作った関数の
移植性も悪いです。
C言語もアセンブラも使うことがあるので、BYTE、WORD、DWORDも定義します。
//***************************************************************************** // H8 3052 型定義 // (C)YdlProg //***************************************************************************** #ifndef __TYPEDEF_H #define __TYPEDEF_H //============================================================================= // 型定義 //============================================================================= typedef unsigned char Uint8 ; // 符号なし 1 バイト整数 typedef signed char Sint8 ; // 符号つき 1 バイト整数 typedef unsigned short Uint16 ; // 符号なし 2 バイト整数 typedef signed short Sint16 ; // 符号つき 2 バイト整数 typedef unsigned long Uint32 ; // 符号なし 4 バイト整数 typedef signed long Sint32 ; // 符号つき 4 バイト整数 typedef unsigned char BYTE ; // 符号なし 1 バイト整数 typedef unsigned short WORD ; // 符号なし 2 バイト整数 typedef unsigned long DWORD ; // 符号なし 4 バイト整数 typedef signed short BOOL ; // BOOL #define TRUE 1 #define FALSE 0 #endif
I/Oアドレスは覚えられないし、直接書くと後でわからなくなるので、ヘッダファイルで定義します。
コメントもきちんと書いておけば、マニュアルを見る回数も減ります。
私自体はH8のC言語で、I/Oアクセスする気にならないので、アセンブラ用のヘッダファイルしか
作っていません。
;****************************************************************************** ; H8 3052 ポート ; (C)YdlProg ;****************************************************************************** IFNDEF __PORT_H DEFINE __PORT_H ;------------------------------------------------------------------------------ ; ポート 1 P10/ A0 ; P11/ A1 ; P12/ A2 ; P13/ A3 ; P14/ A4 ; P15/ A5 ; P16/ A6 ; P17/ A7 ;------------------------------------------------------------------------------ P1DR EQU H'FFFFC0 ; データディレクションレジスタ(W) ; b7-b0 0:入力 ; 1:出力 P1 EQU H'FFFFC2 ; データレジスタ(R/W) ;------------------------------------------------------------------------------ ; ポート 2 P20/ A8 ; P21/ A9 ; P22/A10 ; P23/A11 ; P24/A12 ; P25/A13 ; P26/A14 ; P27/A15 ;------------------------------------------------------------------------------ P2DR EQU H'FFFFC1 ; データディレクションレジスタ(W) ; b7-b0 0:入力 ; 1:出力 P2 EQU H'FFFFC3 ; データレジスタ(R/W) P2PCR EQU H'FFFFD8 ; 入力プルアップ MOS コントロールレジスタ(R/W) ;------------------------------------------------------------------------------ ; ポート 3 P30/ D8 ; P31/ D9 ; P32/D10 ; P33/D11 ; P34/D12 ; P35/D13 ; P36/D14 ; P37/D15 ;------------------------------------------------------------------------------ P3DR EQU H'FFFFC4 ; データディレクションレジスタ(W) ; b7-b0 0:入力 ; 1:出力 P3 EQU H'FFFFC6 ; データレジスタ(R/W) ;------------------------------------------------------------------------------ ; ポート 4 P40/ D0 ; P41/ D1 ; P42/ D2 ; P43/ D3 ; P44/ D4 ; P45/ D5 ; P46/ D6 ; P47/ D7 ;------------------------------------------------------------------------------ P4DR EQU H'FFFFC5 ; データディレクションレジスタ(W) ; b7-b0 0:入力 ; 1:出力 P4 EQU H'FFFFC7 ; データレジスタ(R/W) P4PCR EQU H'FFFFDA ; 入力プルアップ MOS コントロールレジスタ(R/W) ;------------------------------------------------------------------------------ ; ポート 5 P50/A16 ; P51/A17 ; P52/A18 ; P53/A19 ;------------------------------------------------------------------------------ P5DR EQU H'FFFFC8 ; データディレクションレジスタ(W) ; b3-b0 0:入力 ; 1:出力 P5 EQU H'FFFFCA ; データレジスタ(R/W) P5PCR EQU H'FFFFDB ; 入力プルアップ MOS コントロールレジスタ(R/W) ;------------------------------------------------------------------------------ ; ポート 6 P60/WAIT ; P61/BREQ ; P62/BACK ; P63/AS ; P64/RD ; P65/HWR ; P66/LWR ;------------------------------------------------------------------------------ P6DR EQU H'FFFFC9 ; データディレクションレジスタ(W) ; b6-b0 0:入力 ; 1:出力 P6 EQU H'FFFFCB ; データレジスタ(R/W) ;------------------------------------------------------------------------------ ; ポート 7 P70/AN0 ; P71/AN1 ; P72/AN2 ; P73/AN3 ; P74/AN4 ; P75/AN5 ; P76/DA0 ; P77/DA1 ;------------------------------------------------------------------------------ P7 EQU H'FFFFCE ; データレジスタ(R) ;------------------------------------------------------------------------------ ; ポート 8 P80/RFSH/IRQ0 ; P81/CS3/IRQ1 ; P82/CS2/IRQ2 ; P83/CS1/IRQ3 ; P84/CS0 ;------------------------------------------------------------------------------ P8DR EQU H'FFFFCD ; データディレクションレジスタ(W) ; b4-b0 0:入力 ; 1:出力 P8 EQU H'FFFFCF ; データレジスタ(R/W) ;------------------------------------------------------------------------------ ; ポート 9 P90/TxD0 ; P91/TxD1 ; P92/RxD0 ; P93/RxD1 ; P94/SCK0/IRQ4 ; P95/SCK1/IRQ5 ;------------------------------------------------------------------------------ P9DR EQU H'FFFFD0 ; データディレクションレジスタ(W) ; b5-b0 0:入力 ; 1:出力 P9 EQU H'FFFFD2 ; データレジスタ(R/W) ;------------------------------------------------------------------------------ ; ポート A PA0/TP0/TEND0/TCLKA ; PA1/TP1/TEND1/TCLKB ; PA2/TP2/TIOCA0/TCLKC ; PA3/TP3/TIOCB0/TCLKD ; PA4/TP4/TIOCA1/A23/CS6 ; PA5/TP5/TIOCB1/A22/CS5 ; PA6/TP6/TIOCA2/A21/CS4 ; PA7/TP7/TIOCB2/A20 ;------------------------------------------------------------------------------ PADR EQU H'FFFFD1 ; データディレクションレジスタ(W) ; b7-b0 0:入力 ; 1:出力 PA EQU H'FFFFD3 ; データレジスタ(R/W) ;------------------------------------------------------------------------------ ; ポート B PB0/ TP8/TIOCA3 ; PB1/ TP9/TIOCB3 ; PB2/TP10/TIOCA4 ; PB3/TP11/TIOCB4 ; PB4/TP12/TOCXA4 ; PB5/TP13/TOCXB4 ; PB6/TP14/DREQ0/CS7 ; PB7/TP15/DREQ1/ADTRG ;------------------------------------------------------------------------------ PBDR EQU H'FFFFD4 ; データディレクションレジスタ(W) ; b7-b0 0:入力 ; 1:出力 PB EQU H'FFFFD6 ; データレジスタ(R/W) ENDIF