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 オンボード 杉本 秀夫