ROM化のお手本が有ればなんて事
ないのですが、全く初めてのトライと
なると大変ですね。 HEW環境も
HEW無しで、メイクファイルを自分で
構築出来ればブラックボックス無しで
使えますが、HEWの説明だと決して
解り易くはないし、HEWの仕様が、
バージョンアップでがらりと変化して
過去の資産を失いもしました。
基礎をしっかり理解したいとの考えは
正しいと思います。
もしかROMデバッガーを導入可能な
らKMCのパートナーを薦めます。
モニターやJTAGデバッガーだと
H8,SH2、3ではSCU1がダイナミ
ックなデバッグに使えなくなり、まどろ
っこしい事になり、マクロな開発マイン
ドをスポイルする危険が増します。
基本は、自前でアセンブラー、コンパ
イラー、リンカーを制御してプログラム
を構築する技を学ぶ事だと思います。
リセット&割り込みベクター部分、ブー
ト部分、メイン部分の3種類のルーチン
を構想できて、それぞれのロケイトすべ
きセクションが意識できれば組めます。
オイラは日立C、GCCで H8、SH2〜
3を組んでいますが、リンカースクリプト
などかなり書式が異なり(KMCのEXE
GCCとも違う)まごつきますから、務め
てお手本の入手をはかりましょう。
ルネサスH8C V4 版で、一寸お見せしますと
;--------------------------------------------------
; defsect.src H8S assembler source 041130 OB henry
.SECTION P,CODE,ALIGN=2
.SECTION D,DATA,ALIGN=2
.SECTION R,DATA,ALIGN=2
.SECTION B,DATA,ALIGN=2
.SECTION C,DATA,ALIGN=2
; .SECTION BX,DATA,ALIGN=2
__D_ROM .DATA.L (STARTOF D) ; TOP ADDRESS OF D-SECTION
__R_BGN .DATA.L (STARTOF R) ; TOP ADDRESS OF R-SECTION
__R_END .DATA.L (STARTOF R)+(SIZEOF R) ; END ADDRESS OF R-SECTION
__B_BGN .DATA.L (STARTOF B) ; TOP ADDRESS OF B-SECTION
__B_END .DATA.L (STARTOF B)+(SIZEOF B) ; END ADDRESS OF B-SECTION
;---------------------------------------------------------------------------
;
.EXPORT __D_ROM
.EXPORT __R_BGN
.EXPORT __R_END
.EXPORT __B_BGN
.EXPORT __B_END
;----------------------------
; symbol import
;----------------------------
.import _boot,_imia1
.import _scu1_re,_scu1_ri,_scu1_ti,_scu1_te
.import _netc_int
;----------------------------
; vector define 2004/12/02 OB Henry.
;----------------------------
.section vect,data,locate=0
; Vector Symbol Factor Number
.data.l reset ;Rese 0 Reset
.data.l _dumm ;- 1
.data.l _dumm ;- 2
.data.l _dumm ;- 3
.data.l _dumm ;- 4
.data.l _dumm ;- 5
.data.l _dumm ;- 6
.data.l _dumm ;NMI 7 Non-Maskable Interrupt request
.data.l _dumm ;- 8
.data.l _dumm ;- 9
.data.l _dumm ; 10
.data.l _dumm ;- 11
.data.l _dumm ;- 12
.data.l _dumm ;- 13
.data.l _dumm ;- 14
.data.l _dumm ;- 15
.data.l _dumm ;IRQ0 16
途中省略
;----------------------------
; jamp to main program
;----------------------------
.section P,code
_dumm: nop
rte
nop
reset:
mov.l #h'FFBFF0,sp
mov.b #h'08,r1l ; CLK OUT,SET STC1,0 make PLL NEW
mov.b r1l,@h'ff3b ; SCKCR
mov.b #h'02,r1l ; SYS CLK=CLK
mov.b r1l,@h'ff45 ; PLLCR
mov.b #h'E1,r1l ; /CS4,/CS3,/CS2,/CS1:16,/CS0:8
mov.b r1l,@h'fec0 ; ABWCR
mov.b #h'FF,r1l ;
mov.b r1l,@h'fe29 ; PADDR
mov.b #h'FF,r1l ;
mov.b r1l,@h'fe2a ; PBDDR
mov.b #h'FF,r1l ;
mov.b r1l,@h'fe2b ; PCDDR
mov.b #h'0d,r1l ; ?cs3,/Cs2,-,/CS0
mov.b r1l,@h'fe2f ; PGDDR
mov.b #h'09,r1l ;
mov.b r1l,@h'ff74 ; PHDDR
jmp @_boot
.END
// BOOT.C ------------------------------------------------------
//#include "netc.h"
//#include "unix_t.h"
//#include "kbd.h"
void initTPU1(void) ; // 1ms Timer For TCP/IP Operations.
void main(void) ; // main loop
#pragma stacksize 0xfffe // SET SP STACK + stacksize(32KB)
//#pragma stacksize 0x4000 // SET SP STACK + stacksize(16KB)
#pragma entry boot // stack ER7 is set automatically.
boot() // Entry Function --- set SP.
{ int a,b,c;
unsigned int *s,*d,*l;
SCKCR.BYTE=0x08; // No CLK OUT,SET STC1,0 make PLL NEW
// SYS CLK=CLK
PLLCR.BYTE=0x02; // CLK X4
// SYSCR.BIT.EXPE=1;
// SYSCR.BIT.RAME=1;
BSC.ABWCR.BYTE=0x01; // CS4:16 bus width
// CS3:16
// CS2:16
// CS1:16
// CS0:16
BSC.ASTCR.BYTE=0x1d; // CS4: 3 States CS - wait
// CS3: 3 States
// CS2: 3 States
// CS1: 2 States
// CS0: 3 States
BSC.WCR.BIT.W7=0x0; // No Wait
BSC.WCR.BIT.W6=0x0; //
BSC.WCR.BIT.W5=0x0; //
BSC.WCR.BIT.W4=0x3; // Wait 1
BSC.WCR.BIT.W3=0x1; //
BSC.WCR.BIT.W2=0x1; //
BSC.WCR.BIT.W1=0x0; //
BSC.WCR.BIT.W0=0x1; //
BSC.RDNCR.BYTE=0x10; // CS4 RD Hold 1/2 Clk.
BSC.CSACR.WORD=0x00; // No Th,Tt Cycles.
// BSC.BROMCR.BYTE=0x00; // No BUrst Rom.
BSC.BCR.BIT.WAITE=1; // Enable WAIT.
// BSC.DMACR.WORD=0c0000;
// BSC.DRACCR.WORD=0c0000;
// BSC.REFCR.WORD=0c0000;
// BSC.RTCNT.WORD=0c0000;
// BSC.RTCOR.WORD=0c0000;
BSC.PFCR0.BYTE=0x1F; // /CS0,/CS1,/CS2,/CS3,/CS4
BSC.PFCR1.BYTE=0x1F; // -,-,-A20,A19,A18,A17,A16
BSC.PFCR2.BYTE=0x0C; // /AS,/LWR,P35
P1.DDR=0xff; // P1 FPGA
P2.DDR=0xff; // P2 PO
P3.DDR=0x33; // P3 IIC,IIC,RxD1,RxD0,TxD1,TxD0
P5.DDR=0x01; // P5 -,-,RxD2,TxD2
// MSTCRH.BIT.PSTOP=1; // STOP Clock OUT
P6.DDR=0x15; // P65i,P64o,P63i,P62o,P61i,P60o
P8.DDR=0x02; // P8 P85i,P84i,RxD3,/IRQ2,TxD3,P80i
// P9.DDR=0x00; // P9 P97-P90
PA.DDR=0x1F; // PA /IRQ7,/IRQ6,/IPQ5,A20-A16
PB.DDR=0xFF; // PB A15-A8
PC.DDR=0xff; // PC A7-A0
// PD.DDR=0xFF; // PD D15-D8
// PE.DDR=0xFF; // PE D7-D0
PF.DDR=0xF8; // PF CLKOUT,/AS,/RD,/HWR,/LWR,-,-,/WAIT
PG.DDR=0x0F; // PG PG6i,PG5i,PG4i/CS3,/CS2,/CS1,/CS0
PH.DDR=0x01; // PH PH3i,PH2i,PH1i,/CS4
// --------------------------------------------------------------------
P2.DR.BYTE=0xfe;
d=__sectop("R"); // R - Data Section on RAM
s=__sectop("D"); // D - Data Section on ROM
l=__secend("D"); //
while(s < l) // Copy DATA into Sram Area
{ *d++=*s++; //
}
P2.DR.BYTE=0xfd;
d=__sectop("B"); // B- BSS Section
l=__secend("B"); //
while(d < l) // Clesr BSS DATA as 0x00
{ *d++=0; //
} //
P2.DR.BYTE=0xfB;
// INTC.INTCR.BYTE=0; // 0;Mode-0,2:Mode-2
set_imask_ccr(0) ; // Clear interrupt mask
P2.DR.BYTE=0xF7;
initTPU1() ; // Initalize ITU ch1 - Blink
P2.DR.BYTE=0xef;
main( );
以下略
; ROM.SUB------------------------------------------
INPUT defsect
INPUT boot
INPUT scu1
INPUT printf
INPUT kbd
INPUT netc
INPUT 93c46_n
INPUT main
INPUT tcpio
LIB OBNETH8s.LIB
LIB h8s.lib
OUTPUT 2XXXUR
FORM=S
;ENTRY _boot
ROM =D=R
START= P,C,D/1000
START= R,B/400000
START= S/418000
SHOW=symbol
LIST 2XXXUR
EXIT
オンボード 杉本 秀夫