AKI-H8のCクロスコンパイラ環境でのプログラミング
自分でスタートアップおよび割り込みベクタテーブルを管理する中級者向け
簡単コマンドh8ccBasic.cmd利用版

Copyright(C)15Dec2003
Copyright(C)29Aug2002
coskx TNCT


1.はじめに
この文書は,Windows2000パソコンにAKI-H8のC言語クロスコンパイル環境での,コンパイル作業のための方法を記述しています。C言語クロスコンパイラ環境で,C言語によるH8プログラミングを学ぼうとする方が,自分でリンカスクリプト(リンカサブコマンド),スタートアップルーチンおよび割り込みベクタテーブルを管理し,プログラミングを行ない,AKI-H8でプログラムが動作するまでを解説します。C言語のプログラミングについては別の文書で学んでください。
なお割り込みベクタテーブルの管理はアセンブリ言語ファイルで行ない,割り込みルーチンはpragma命令でC言語で書くことにします。
秋月から購入したCコンパイラ環境では出来ませんが,VER2の環境では割り込みベクタテーブルの管理はCのソースファイルでできるようになっていますが,本解説では触れません。

ファイルプログラムのダウンロード

DownLoad

本文書で記述してある作業の特徴
Cプログラムソースファイルが出来上がったら,Cプログラムソースファイルと必要なら割り込みベクトルテーブルファイル(アセンブリ言語)をまとめてドラッグアンドドロップを1回行なうだけです。他に何もすることはありません。簡単コマンドを用いるので,作業が効率的です。

前提
(1)秋月から購入したCコンパイラ関係ファイルおよびインクルードファイル,ライブラリファイルはすべて「C:\Program Files\h8\C」に入っているものとします。
(2)転送ソフト「n-h8w.exe」を利用します。これも「C:\Program Files\h8\C」に入っているものとします。

h8w.exeはシェアウェアですが10kバイトまではライセンスキー不要で書き込める転送ソフトです。
h8w.exeは,ライセンス登録作業を行なうと,標準でn-h8w.exeに名前が変わり,10kバイトの制限が外れます。この文書では名前が変わった場合の記述をしておりますが,ライセンス取得前の「h8w.exe」でも作業することが出来ます。その場合はh8cc.cmd中の次の個所を変更してください。
変更前 rem フラッシュメモリ書き込みに使用するプログラムを指定します。
 set downloader=n-h8w.exe
変更後 rem フラッシュメモリ書き込みに使用するプログラムを指定します。
 set downloader=h8w.exe
なお,この書き込みソフトは(本校)情報工学科の前任助教授の前田先生が作成したものです。前田先生には大変お世話になっております。前田先生は別の名前をつけて使うように勧めていますが,作者に敬意をはらいまして,あえて標準のままにしておきした。
「h8w.exe」の取得はhttp://www.vector.co.jp/soft/win95/prog/se232247.htmlになります。

注意
この文書で扱っているh8cc.cmdはWindows2000,WindowsXP,WindowsVista,Windows7で使用可能です。
残念ながらWindows95/98では動作しません。

2.プログラムの作成から実行まで
シングルボードマイコンAKI-H8内で動作するプログラムはパソコン上で開発され、シングルボードマイコンAKI-H8にフラッシュメモリ書き込みされます。パソコンで開発されるソースプログラムはC言語で記述され、クロスコンパイラにより、オブジェクトプログラムに変換され、最後はダウンロード形式(XXXX.mot)になります。
シングルボードマイコンAKI-H8を動作させるまでの大きな流れは以下のようになります。
(1)パソコン上で作業用のフォルダの用意(スタートアップルーチン,リンカスクリプトを含む)
(2)パソコン上でCソースプログラムの作成
(3)必要なら割り込みベクタテーブルのアセンブラファイルの作成
(4) パソコン上でダウンロード形式ファイルの作成(クロスコンパイル、コード変換)
(5)パソコン上のライターソフトによる,ダウンロード形式ファイルのAKI-H8への書き込み操作
これら四つの作業によりシングルボードマイコン内で動作させることが出来ます。

3. サンプルプログラム
サンプルプログラムを2例提供します。1つは割り込みを用いない例LedDemo0で,もう1つは割り込み(タイマ割り込み)を用いた例TimerIntDemo0です。2つの例で用いているスタートアップルーチンStartupBasic.srcは同じものです。TimerIntDemo0では割り込みベクタテーブルIntTbl.srcを使用しています。

フォルダ LedDemo0

フォルダ TimerIntDemo0


3.1 割り込みを用いない例 LedDemo0
(1)このサンプルプログラムの特徴
AKI-H8のマザーボード上のLEDが点滅します。

(2)このフォルダの内容
h8-01.h           サービス関数類
h8ccBasic.cmd     コンパイル&ゴーコマンド
StartupBasic.src  スタートアップルーチン(割り込み関係はサポートしていない)
h8_3048.sub       リンカスクリプト(リンカサブコマンド)
LedDemo0.c        サンプルプログラムのCソース
to_H8.ht          ハイパーターミナルの設定データ(ダブルクリックすると立ち上が
                  る)このサンプルプログラムでは使用しない
readme.txt        説明ファイル

(3)LedDemo0.c

リスト プログラムソースファイルLedDemo0.c

/**********************************************************
msecwait関数で1秒ごとのLEDのON-OFFを行う
**********************************************************/
#include "h8-01.h"

void msecwait(int msec)
{
    int i,j;
    for (i=0;i<msec;i++) {
        for (j=0;j<1588;j++); /*1588は実測によって求めた値*/
    }
}

main()
{
    initLed();  /*LED初期化*/
    while(1) {
        turnOnLed(0); /*LED0のON*/
        turnOffLed(1); /*LED1のOFF*/
        msecwait(1000);
        turnOnLed(1); /*LED0のOFF*/
        turnOffLed(0); /*LED1のON*/
        msecwait(1000);
    }
}

(4)使い方
 1)H8ボードのフラッシュメモリを書き込み可能な状態にしておく
 2)TimerIntDemo0.cのアイコンをh8ccBasic.cmdにドロップする

(5)コンパイル時の様子

LedDemo0.cをドロップした時

****  h8ccBasic.cmd  ****
Assemble, Compile, link and convert command for H8 C-programing ver1.01
Copyright(c) 30Aug2002 coskx
LedDemo0.c :

H8/300H C COMPILER(Evaluation software) Ver.1.0
H8/300H ASSEMBLER (Evaluation software) Ver.1.0
  *****TOTAL ERRORS       0
  *****TOTAL WARNINGS     0
H8/300H LINKAGE EDITOR (Evaluation software) Ver.1.0

: ROM (D,X)
: START P,C,D(100),X,B(0FEF10)
: EXIT

LINKAGE EDITOR COMPLETED
H8/300H OBJECT CONVERTER (Evaluation software) Ver.1.0

OBJECT CONVERTER COMPLETED
sending write-program..... erasing...
writing 'LedDemo0.mot'
I##################################################
3.5 KB written
Pushing any key leads the exit.

3.2 割り込み(タイマ割り込み)を用いた例 TimerIntDemo0
(1)このサンプルプログラムの特徴
AKI-H8のマザーボード上のLEDが点滅します。
 
(2)このフォルダの内容
h8-01.h           サービス関数類
h8ccBasic.cmd     コンパイル&ゴーコマンド
StartupBasic.src  スタートアップルーチン(割り込み関係はサポートしていない)
h8_3048.sub       リンカスクリプト(リンカサブコマンド)
IntTbl.src        割り込みベクタテーブルのソース
TimerIntDemo0.c   サンプルプログラムのCソース
to_H8.ht          ハイパーターミナルの設定データ(ダブルクリックすると立ち上がる)
                  このサンプルプログラムでは使用しない
readme.txt        説明ファイル

 
(3)使い方
 1)H8ボードのフラッシュメモリを書き込み可能な状態にしておく
 2)TimerIntDemo0.c,IntTbl.srcの2つのアイコンを同時にh8ccBasic.cmdにドロップする

(4)コンパイル時の様子

TimerIntDemo0.c,IntTbl.srcをまとめてドロップした時

****  h8ccBasic.cmd  ****
Assemble, Compile, link and convert command for H8 C-programing ver1.01
Copyright(c) 30Aug2002 coskx
TimerIntDemo0.c :

H8/300H C COMPILER(Evaluation software) Ver.1.0
StartupBasic.src :
H8/300H ASSEMBLER (Evaluation software) Ver.1.0
  *****TOTAL ERRORS       0
  *****TOTAL WARNINGS     0
IntTbl.src :
H8/300H ASSEMBLER (Evaluation software) Ver.1.0
  *****TOTAL ERRORS       0
  *****TOTAL WARNINGS     0
H8/300H LINKAGE EDITOR (Evaluation software) Ver.1.0

: ROM (D,X)
: START P,C,D(100),X,B(0FEF10)
: EXIT

LINKAGE EDITOR COMPLETED
H8/300H OBJECT CONVERTER (Evaluation software) Ver.1.0

OBJECT CONVERTER COMPLETED
sending write-program..... erasing...
writing 'TimerIntDemo0.mot'
I##################################################
3.5 KB written
Pushing any key leads the exit.


4.割り込みの記述方法
タイマ割り込みの割り込みベクタを記述するには,次の2点に気をつけます。
(1)割り込み関数についてはこれは割り込み関数だとコンパイラに教える必要があり,これはpragma擬似命令を使います。割り込み関数の最後ではハードウェアに対するフラグクリアも忘れてはいけません。
 

リスト プログラムソースファイル"TimerIntDemo0.c"

/**********************************************************
時間割り込みによってLEDのON-OFFを行う
**********************************************************/
#include "h8-01.h"

main()
{
    initLed();
    initTimer01Int(500); /*時間割り込み500msec ch0,ch1使用*/
    E_INT();        /*CPU割り込み許可*/
    startTimer01();  /*時間割り込みタイマスタートch0,ch1*/
    while(1);       /*なにもしないループ*/
}

#pragma interrupt(timer1INT)/*この名前の関数は割り込みルーチン仕様である*/
                            /*プログラム中から呼び出してはならない*/
void timer1INT() /*割り込みルーチンの名前はIntTbl.srcで定義されている*/
{
    static int tick=0;
    if (tick==1) {
        turnOnLed(0);
        turnOffLed(1);
    } else {
        turnOffLed(0);
        turnOnLed(1);
    }
    tick=1-tick;
    ITU1.TSR.BIT.IMFA=0; /*Clear IMFA*/
}


(2)アセンブリソース中の割り込みベクタテーブルに割り込み関数名(関数の先頭アドレス)を教えます。
Cプログラム中での名前「timer1INT」はアセンブリソース中では「_timer1INT」になり,この関数名は外部から与えられることを「.IMPORT timer1INT」のように書きます。
またタイマ割り込みベクタはマニュアルのITU1タイマ割り込みIMIA1よりH'70(0x70)であることから記述できます。(H8-3048マニュアル割り込み例外処理ベクタテーブル)

リスト プログラムソースファイル"IntTbl.src"

;************************************************************************
;interrupt vector table    IntTbl.src    Copyright (C) 2002 coskx
; 28 Aug 2002
; 割り込みを使用する場合はここに割り込みベクトルを記述すること
;************************************************************************
    .CPU 300HA
    .IMPORT _timer1INT
   
    .SECTION A,DATA,LOCATE=H'000000

    .ORG    H'000070  ;IMIA1
    .DATA.L _timer1INT
    .END

5.割り込み関数
通常の関数は,関数がプログラム中の他の関数から呼び出されたときに作業を行ないます。これに対して,割り込み関数は何らかの割り込み要因によって呼び出される関数です。
タイマ割り込み関数は,タイマ割り込み初期設定によって設定された時間間隔で起動する割り込み関数です。「4.(1)」のプログラムでは,500msのタイマ割り込み初期設定が行なわれ,CPUの割り込み許可がなされ,タイマがスタートした後,プログラムの流れは
while(1);
となり,何もしない無限ループに突入します。しかし,500ms(0.5秒)ごとにタイマ割り込み関数「timer1INT()」が起動し,LEDのON−OFFが継続して行なわれます。

このからくりをプログラミングするには,タイマ割り込みが発生した時に,どこのアドレスにある関数を実行するのかを示さなければなりません。CPUマニュアルの割り込みベクタ一覧よれば,ITU_CH1を利用したタイマ割り込み(IMIA1)のベクトル番号は28,ベクタアドレスはH'0070となっています。これは,H'0070番地にタイマ割り込み関数のアドレスを書いておけばよいことになります。Cプログラムでは関数の名前は関数の先頭アドレスを示すことになっていますので,ベクタアドレスに,割り込み関数の名前を書けばよいことになります。ただし,ここでの例のようにCプログラム中での名前「timer1INT」はアセンブリソース中では「_」が先頭について「_timer1INT」になります。

課題

ITU2を用いたタイマ割り込みで,LEDをON-OFFするプログラムを作りなさい。

(1)TimerIntDemo0のフォルダをもとにする
(2)「IntTbl.src」を修正
(3)void initTimer2Int(int period) /*period:μs*/
   vooid startTimer2(void)
   を自分のソースファイル中に作る。


参考1 H8ccBasic.cmdの内容

H8ccBasic.cmdの内容を参考リスト1に示します。

参考リスト1 motファイル作成用のコマンドファイル「h8ccBasic.cmd」

@echo off
echo ****  h8ccBasic.cmd  ****
echo Assemble, Compile, link and convert command for H8 C-programing ver1.01
echo Copyright(c) 30Aug2002 coskx
rem Copyright(c) 29Aug2002 coskx TNCT

rem このCMDは割り込みベクタテーブルも自分で作る上級者向けのコンパイルコマンド
rem です。
rem Cソースファイル(〜.c)とともに,割り込みベクタテーブル(〜.src)をドラッ
rem グ&ドロップして使います
rem C,ASMのソースファイルおよびobjファイルは最大で5個までドラッグ&ドロップに
rem 対応しています。
rem 複数ファイルのドロップの場合は次のことに気をつけること
rem 選択されているファイルのうちフォルダ表示で最も上の列(その列に複数のファイ
rem ルがある場合は左端)にあるファイル名でフラッシュメモリ書き込み形式ファイルの名前が決ま
rem る。そのためmain()を持つファイルをその位置(最上列左端)に置くと良い。
rem MOTファイルを直接ドラッグ&ドロップするとすぐフラッシュメモリ書き込みが始まる。

rem *************** カスタマイズ領域 begin *******************
rem コンパイル作業に必要なパスの追加を行います。
 set mypath=c:\Program Files\h8\c
rem H8のライブラリを指定します。
 set h8library=c:\Progra~1\h8\c\c38hab.lib
rem フラッシュメモリ書き込みに使用するプログラムを指定します。
 set downloader=n-h8w.exe
rem フラッシュメモリ書き込み直前にポーズしてそのままダウンロードするかどうか問い合わせします
rem YES:問い合わせる NO:問い合わせない
 set downloadready=NO
rem 正常にアセンブルが終了した場合でもLSTファイルを残す
rem YES:LSTファイルを残する NO:LSTファイルを残さない
 set leaveLST=NO
rem 正常にリンクが終了した場合でもobjファイルを残す
rem YES:OBJファイルを残する NO:OBJファイルを残さない
 set leaveOBJ=NO
rem 正常にリンクが終了した場合でもMAPファイルを残す
rem YES:MAPファイルを残する NO:MAPファイルを残さない
 set leaveMAP=NO
rem 正常にフラッシュメモリ書き込みが終了した場合でもMOTファイルを残す
rem YES:MOTファイルを残する NO:MOTファイルを残さない
 set leaveMOT=YES
rem 正常にフラッシュメモリ書き込みが終了した場合はそのまま終了する
rem YES:そのまま終了する NO:そのまま終了せず停止
 set downloadquit=NO
rem *************** カスタマイズ領域  end  *******************

rem ----------------------------------------------------------------------------
rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1

rem コンパイラのパスの設定
path=%path%;%mypath%

rem もしMOTファイルがドラッグ&ドロップされたら,フラッシュメモリ書き込みだけ行なう
if %~x1==.mot goto DOWNLOAD
if %~x1==.MOT goto DOWNLOAD

rem 誤ったファイルがドロップされたか,単なるダブルクリックで起動した場合は何もしない
set nosource=YES
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c set nosource=NO
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src set nosource=NO
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.obj set nosource=NO
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.OBJ set nosource=NO
if nosource==YES goto NO_SOURCE_ERROR

:COMPILE
rem ----------------------------------------------------------------------------
rem コンパイル 〜.objの作成 5個のファイル入力に対応
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.obj
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c echo %%p.c : &&cc38h -include=c:\Progra~1\h8\c %%p
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if not exist %%p.obj goto COMPILE_ERROR

:ASSEMBLE
rem ----------------------------------------------------------------------------
rem アセンブル 〜.objの作成 5個のファイル入力に対応
rem a38h.exeの入力ファイルのパスに全角文字が入っていると動かないことに対応したからくりが作ってある
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src if exist %%p.obj del %%p.obj
subst x: .
x:
a38h StartupBasic.src
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src echo %%p.src : &&a38h %%p
%~d1
subst x: /d
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src if not exist %%p.OBJ goto ASSEMBLE_ERROR
del StartupBasic.LIS
if %leaveLST%==NO for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src if exist %%p.LIS del %%p.LIS

:LINK
rem ----------------------------------------------------------------------------
rem リンク
l38h %~n1 %~n2 %~n3 %~n4 %~n5 StartupBasic -subcommand=h8_3048.sub -LIB=%h8library% -O=%~n1 -P=%~n1 >q9j2h5c4k6b1.txt
if %leaveOBJ%==NO for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.obj
if %leaveOBJ%==NO for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src if exist %%p.OBJ del %%p.OBJ
type q9j2h5c4k6b1.txt
del StartupBasic.OBJ
find "**" q9j2h5c4k6b1.txt >nul
if errorlevel 1 goto CONVERT
del q9j2h5c4k6b1.txt
del %~n1.abs
goto LINK_ERROR

:CONVERT
del q9j2h5c4k6b1.txt
rem ----------------------------------------------------------------------------
rem Sフォーマットに変換 〜.motの作成
c38h %~n1.abs
del %~n1.abs
if %leaveMAP%==NO del %~n1.map

rem motファイルの転送
if %downloadready%==NO goto DOWNLOAD
echo Please set AKI-H8 ready and hit any key / push 'Ctrl+C' if you want
pause >nul
:DOWNLOAD
%downloader% %~n1.mot
if %leaveMOT%==NO del %~n1.mot
if %downloadquit%==YES exit
goto TERMINAL

:NO_SOURCE_ERROR
echo *** error *** Cのソースファイルが指定されていません。
goto TERMINAL

:COMPILE_ERROR
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.obj
echo *** error *** コンパイルエラーがありました。
goto TERMINAL

:ASSEMBLE_ERROR
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.obj
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src if exist %%p.OBJ if exist %%p.LIS del %%p.LIS
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src if exist %%p.OBJ del %%p.OBJ
echo *** error *** アッセンブルエラーがありました。
goto TERMINAL

:LINK_ERROR
echo *** error *** リンクエラーです。
goto TERMINAL


:TERMINAL
echo Pushing any key leads the exit.
pause >nul
exit


補足1 ダウンロード形式ファイル(.MOTファイル)をドラッグ&ドロップすると直ちに転送が始まります
補足2 「〜.c」「〜.src」のみでなく「〜.obj」も同時にドラッグ&ドロップが可能です
補足3 フラッシュメモリ書き込みソフトにライセンス取得前の「h8w.exe」を用いる場合はカスタマイズ領域のダウンローダの設定で変更してください
補足4 ファイル「q9j2h5c4k6b1.sub」「q9j2h5c4k6b1.txt」を一時的に自動生成し,使用後消去します

参考2 「c:\Program Files\h8\c」の内容

秋月で購入したCコンパイラのあるフォルダは「c:\Program Files\h8\c」であり,内容は次のとおりです。フォルダ名,ファイルの配置が異なる場合は「h8ccBasic.cmd」中の必要なところを直してください。

秋月から購入時に導入されたファイル
A38H.EXE      :アセンブラ本体
CC38H.EXE     :Cコンパイラ本体
C38H.EXE      :コンバータ本体
L38H.EXE      :リンカ本体
C38CGNB.EXE   :CC38H.EXEが使用するコプログラム
C38ASMB.EXE   :CC38H.EXEが使用するコプログラム
C38FRNTB.EXE  :CC38H.EXEが使用するコプログラム
C38PEPB.EXE   :CC38H.EXEが使用するコプログラム
C38MIDB.EXE   :CC38H.EXEが使用するコプログラム
3048F.H       :ヘッダーファイル
ASSERT.H      :ヘッダーファイル
CTYPE.H       :ヘッダーファイル
ERRNO.H       :ヘッダーファイル
FLOAT.H       :ヘッダーファイル
SETJMP.H      :ヘッダーファイル
LIMITS.H      :ヘッダーファイル
MATH.H        :ヘッダーファイル
STDLIB.H      :ヘッダーファイル
STRING.H      :ヘッダーファイル
STDDEF.H      :ヘッダーファイル
STDARG.H      :ヘッダーファイル
STDIO.H       :ヘッダーファイル
C38HAB.LIB    :ライブラリ3048Hアドバンスモード用
C38HNB.LIB    :ライブラリ3048Hノーマルモード用

さらに小坂が追加したファイルも加えられています。
n-h8w.exe     :ファイル転送ソフト 前田

研究室では上記すべてが設定済です。

参考3 「StartupBasic.src」のソース

リスト コマンドソース"StartupBasic.src"

;************************************************************************
;startup routine    StartupBasic.src      Copyright (C) 2002 coskx
; 28 Aug 2002
; このスタートアップは割り込み関係をサポートしていません
; 割り込みを使用する場合はIntTbl.srcに割り込みベクトルを記述すること
;************************************************************************
    .CPU 300HA

    .IMPORT _main

    .EXPORT _E_INT,_D_INT
   
    .SECTION A,DATA,LOCATE=H'000000
RSTVEC:
    .DATA.L START           ;リセットベクトル

    .SECTION P,CODE,ALIGN = 2;
START:
    MOV.L #H'FFF10,ER7 ;スタックポインタ設定

    ;move Section D to Section X
    MOV.L @_D_Head,ER0      ;source address to ER0
    MOV.L @_X_Head,ER1      ;destination address to ER1
    MOV.L @_D_Size,ER2      ;size to be copied to ER2
    OR.L ER2,ER2            ;(ER2 or ER2) to ER2
    JMP @LOOP_11
LOOP_1:
    MOV.B @ER0+,R3H         ;source byte to R3H with ER0++
    MOV.B R3H,@ER1          ;R3H to destination
    ADDS #1,ER1             ;increment destination address
    DEC.L #1,ER2            ;ER2--
LOOP_11:
    BNE LOOP_1

    ;fill 0 to Section B
    MOV.L @_B_Head,ER1      ;destination address to ER1
    MOV.L @_B_Size,ER2      ;size to be copied to ER2
    MOV.B #0,R3H            ;0 to R3H
    OR.L ER2,ER2            ;(ER2 or ER2) to ER2
    JMP @LOOP_21
LOOP_2:
    MOV.B R3H,@ER1          ;R3H to destination
    ADDS #1,ER1             ;increment destination address
    DEC.L #1,ER2            ;ER2--
LOOP_21:
    BNE LOOP_2

    JSR @_main        ; Call main()
EternalLoop: BRA EternalLoop ;万が一戻ってきてもOK

    .SECTION P,CODE,ALIGN = 2;
_E_INT: ANDC.B #B'01111111,CCR ;Clear Interrupt mask = Enable Interrupt
    RTS
    .SECTION P,CODE,ALIGN = 2;
_D_INT: ORC.B #B'10000000,CCR ;Set Interrupt mask = Disable Interrupt
    RTS

    .SECTION    D,DATA,ALIGN=2
    .SECTION    X,DATA,ALIGN=2
    .SECTION    B,DATA,ALIGN=2

    .SECTION    C,DATA,ALIGN=2
_D_Head:   .DATA.L     (STARTOF D)     ; D Head Address
_X_Head:   .DATA.L     (STARTOF X)     ; X Head Address
_D_Size:   .DATA.L     (SIZEOF D)      ; D Size
_B_Head:   .DATA.L     (STARTOF B)     ; B Head Address
_B_Size:   .DATA.L     (SIZEOF B)      ; B Size
    .END

参考4 「StartupBasic.src」の利用の利点

(1)初期化されたグローバル変数,および関数内の初期化されたstatic変数はRAM領域で使えるようにします。const修飾子を持つ初期化されたグローバル変数,およびconst修飾子を持つ関数内の初期化されたstatic変数はROM領域に割り当てられるようにします。(「5.変数について補足」参照)
秋月電子通商で販売しているCコンパイラに付属している環境が与えるスタートアップルーチン(resetv.obj)では,このような変数の割り当てができていません。初心者が勉強するには不都合な環境です。初心者が通常のC言語の変数感覚でなにげなく使える環境を与えます。

(2)割り込みに関する記述はないため,必要なら別の割り込みベクタテーブルのアセンブリソースが必要

(3)CPUのコントロールレジスタのCCRでの割り込みマスクビットのセット・リセット関数をCプログラムに提供します。
   E_INT()  割り込み許可
   D_INT()  割り込み禁止

参考5 「h8_3048.sub」の内容

リスト リンカスクリプト(リンカサブコマンド)"h8_3048.sub"

ROM (D,X)
START P,C,D(100),X,B(0FEF10)
EXIT

(1)ROM (D,X)
初期化されたグローバル変数や初期化されたスタティック変数をセクションXに割り当て,それらの変数の初期値をセクションDに書くように指示します。

(2)START P,C,D(100),X,B(0FEF10)
0x00200から始まるROM領域にセクションP,C,Dを連続して割り当て,0x0FEF10から始まるRAM領域にセクションX,Bを連続して割り当てます。

「ROM,RAMの割り付け」
プログラムをROM化する場合は,静的な領域を以下のようにROMとRAMに割り付けます。
(セクションP)→ ROM プログラム格納領域
(セクションC)→ ROM 変化しない定数領域(変化しない文字列も含む)
(セクションB)→ RAM 初期化していないグローバル変数や初期化していないスタティック変数
(セクションD)→ RAM 初期化されたグローバル変数や初期化されたスタティック変数
(セクションX)→ ROM セクションD内の変数の初期値(プログラム起動時にセクションDにコピーされる)

参考6 「h8-01.h」の利用の利点

(1)マザーボード上のスイッチ・LEDの制御関数をインクルードファイルで提供します。

(2)プログラムのフラッシュメモリ書き込みに用いた通信回線とWindowsマシンのハイパーターミナルを用いた表示環境を提供し,printf()に似た整数変数出力ルーチン,整数入力ルーチンをインクルードファイルで提供します。

(3)タイマ割り込み設定ルーチンでサポートします。