ファイルIOで作りました。
offset.h を生成するプログラムです。動けばいいので可読性もへったくれもありません。読みにくいのはご勘弁を。
JSP 1.4の移植のための文書であるdoc/config.txtには
GNU開発環境以外を用いる場合など,この仕組みでオフセットファイルを生成できない時には,offset.h をターゲット依存部で用意し,Makefile.config で OMIT_MAKEOFFSET をヌルストリング以外に定義する.
と書いてありますが、内容がどのようであるべきかは書いていません。それはoffset.hを見ればわかるのですが、リファレンスであるm68kのそれを見るにはm68kの開発環境をセットアップしなければなりません。理不尽さを感じつつ他のアーキテクチャーを参照して作りました*1。
#include#include "jsp_kernel.h" #include "task.h" struct task_control_block tcb; int offset; int main(void) { FILE * f; int * a; f = fopen ( "offset.h", "w"); offset = (unsigned int)&tcb.tskctxb.sp - (unsigned int)&tcb; fprintf( f, "#define TCB_sp %d\n", offset ); offset = (unsigned int)&tcb.tskctxb.pc - (unsigned int)&tcb; fprintf( f, "#define TCB_pc %d\n", offset ); offset = (unsigned int)&tcb.tinib - (unsigned int)&tcb + sizeof( tcb.tinib ); fprintf( f, "#define TCB_enatex %d\n", offset ); offset = (unsigned int)&tcb.texptn - (unsigned int)&tcb; fprintf( f, "#define TCB_texptn %d\n", offset ); a = (void *) &tcb.tinib + sizeof( tdb.tinib ); *a = 0; tcb.enatex = 1; fprintf ( f, "#define TCB_enatex_mask 0x%x\n", *a ); fclose( f ); }
VisualDSP++にはファイルIOがあるので便利です。出力は次のようになります
#define TCB_sp 24 #define TCB_pc 28 #define TCB_enatex 12 #define TCB_texptn 16 #define TCB_enatex_mask 0x40000