HC908が販売されていた当時はCodeWarriorなどの製品のコンパイラーが使われていました。SDCCも2.0くらいで、現在のものとずいぶん仕様が違いました。
タイマー割り込みでLチカするコードを現在のSDCC 4で書いてみます。
timer.c
/* HC908JB8 sample code with sdcc 4 */
#include <mc68hc908jb8.h>
void overflow_inth(void) __interrupt 6
{
PTD ^= 0x01;
TRST = 1;
TOF = 0;
}
void main() {
CONFIG = 0x01; // Disable COP
DDRD |= 0x01;
PTD = 1;
TSTOP = 1;
TRST = 1;
TMODH = 0xff;
TMODL = 0xff;
PS2 = 1; /* Internal Bus Clock devide 16 */
TOF = 0;
TOIE = 1; /* Interrupt Enable */
__asm cli __endasm;
TSTOP = 0; /* start timer */
for (;;) ;
}
% sdcc -mhc08 --stack-loc 0x013F --code-loc 0xDC00 timer.c
焼いてみます。
$ ./bl08 -c /dev/cu.usbserial-DA00WSMM -b 9600 -r 10 -t jb8 -x 12 -g reset timer.s19
bl08 - MC68HC908 Bootloader - version 1.0.0.0
Reading S-records
Line ignored: S9030000FC
S-record data address 00FFF2 size 000002
S-record data address 00FFFE size 000002
S-record data address 00DC00 size 00005E
Mass erase
Program FFF2 - FFF3
Program FFFE - FFFF
Program DC00 - DC3F ....
Program DC40 - DC5D .
Execute code from DC00
FFF2がオーバフロー割り込みアドレスになります。
__interrupt 0はリセットベクターに予約されていて__interrupt 1がFFFCで__interrupt 2がFFFAになります。
下のプロジェクトはCodeWarriorとSDCC 2で作られていたようです。無理やりSDCC 4でビルドしてみましたが、動きませんでした。SDCC 4はSDCC 2よりもCodeWarriorに近いかもです。
SDCCでは当初レジスタの定義がなかったのか、defineで定義するのが一般的でした。ところがSDCCのヘッダーにレジスタが入り、同じ名前でビットフィールドで定義されてます。このためコンパイルは通るけど、まったく違う処理になってしまいます。