スパイス  組み込み制御装置の受注製作

モニタプログラムを移植する
平成26年4月 3日

新規プロジェクトの作成
 プロジェクトの設定方法が分かった所で、動作検証用のプロジェクトをゼロから新規に作成します。既にGAIOフレームワークで既存のプロジェクトを開いている状態なら、まずそのプロジェクトを閉じます。"ファイル"メニューから"プロジェクトの新規作成"を選択します(他のプロジェクトが開いたままだと選択できません)。ファイルの保存場所やプロジェクト名の入力後、先のプロジェクトに関する設定ウインドウが開きますので、必要な設定を行います。
 ioというプロジェクトを新規作成し、io.cをプロジェクトに追加した時のリンクパラメータファイル(.xls)の中味は下記になりました。
 io.xlsのテキスト
/Name=IO
/Module=io.xao
 リンクパラメータファイルにはROM化のための多くの情報を設定する必要がありますが、プロジェクトで管理してくれるのは、プロジェクトへのファイルの追加・削除とプロジェクト名のみのようです。それ以外の項目は人手で保守する必要があるので、先に必要なファイルを追加して、その後必要な項目の追加を行います。
 まず、必要なファイルを追加します。プロジェクトにスタートアップルーチン(CRT)start.xasを追加します。ファイルの中味は下記です。このファイル内容はコンパイラのヘルプとサンプルプログラムを参考に最低限の機能のみを実装したものです。このリストの内容を説明するためにはアセンブラやリンカの知識が必要になるのと、別に書く予定のCコンパイラの移植に深く関係していますので、そちらで書くようにします。今はこれで正しいと仮定してください。この文書を書いている段階では動作の検証を始めていないので間違っている可能性は比較的高いのですが。
また、動作検証用にIOアドレス0番地へのリード関数inp()もリストの最後に追加してあります。オシロスコープを使って/IO_RQ信号が連続的に出力されていれば、コンパイル・ROM化・基板の基本動作の全てが正しいことになります。
 
  EXTNAL  _DATA_SIZE  ; 初期値のあるデータのサイズ
   EXTNAL  _DATA_TOP   ; 初期値のあるデータのアドレス(RAM)上
   EXTNAL  _BSS_SIZE   ; 初期値のないデータのサイズ
   EXTNAL  _BSS_TOP    ; 初期値のないデータのアドレス(RAM)上
   EXTNAL  _main
   global  _inp
;
;-------------------------------+
;   Stack   (RAM)       +
;-------------------------------+
_STACK  sect    stak
   ds  100h
_STACK_END:
;-------------------------------+
;   init section    (ROM)   +
;-------------------------------+
_INIT_DATA  SECT    COMM    ; 初期値のあるデータの配置されたセクション(ROM)上
;-------------------------------+
;   Control data    (RAM)   +
;-------------------------------+
D_DATA  sect    comm
   global  _errno
   _errno  dw  0   ;for math lib
;
;----------------------------------------------------------------
;   Interrupt table
;----------------------------------------------------------------
INIT        SECT    CODE,ORG=0
       JP  START
C_START     SECT    CODE,ORG=100H
START:
       ld  HL,_STACK_END       ;Set Stack Pointer
       ld  SP,HL
;
; 初期値のあるデータをROMからRAMへ転送する
;
       LD  HL, _INIT_DATA
       LD  DE, _DATA_TOP
       LD  BC, _DATA_SIZE
       LDIR
;
; 初期値のないRAMエリアを0クリアする
;
       LD  IX, _BSS_TOP
       LD  HL, _BSS_SIZE
       LD  DE,1
CP_BSS1:        
       SBC HL,DE
       JP  C,CP_BSS2
       LD  (IX),0  
       INC IX
       JP  CP_BSS1
CP_BSS2:
;
; main 関数を呼び出す
;
       CALL    _main
       JR  START
   
       HALT
;
_inp:
       ld bc,0
       in a,(c)
       ld c,a
       ret
       END START
 次にリンクパラメータファイルio.xlsを変更します。変更後のリストは下記になります。
;-------------------------------+
;   RAM Area        |
;-------------------------------+
/ADDR=8000
/SECT=D_*|COMM      (data   =_DATA)
/SECT=B_*|COMM      (bss    =_BSS)
/SECT=_STACK
;-------------------------------+
;   ROM Area        |
;-------------------------------+
/ADDR=0
/SECT=C_*|CODE
/SECT=I_*
;-------------------------------+
;   init data section   +
;-------------------------------+
/init_section = _INIT_DATA  (_DATA)
;-------------------------------+
;   linkage module      |
;-------------------------------+
/Name=IO
/Module=START.xao
/Module=io.xao
/slib=C:\PROGRA~1\AKIZ80\lib\z80\cs\csze1

ここで、/slibのパスはコンパイラをインストールしたディレクトリによって変更が必要です。相対パスでの指定は出来ないようです。csze1というライブラリは必ずリンクが必要なようです。
 以上でプログラムの設定は終わりです。統合開発環境のコンパイルボタンを押せば、画面下部にSuccessと表示されます。

出力内容の確認
 コンパイルされた内容が本当に欲しい内容になっているかを順に確認していきます。最初はマップファイルIO.mapを開いてメモリ空間上の配置が正しいかを確認します。この確認内容もある程度アセンブラやリンカの知識が必要になります。意味が分からないなら読み飛ばしてください。
 ・アドレス0番地にJP START(3バイト)が配置されている。
 ・STARTが指定アドレス(0x100)に配置されている。
 ・D_DATA(変数名errorno)はRAMアドレス0x8000以降に配置されている。
 ・スタックもRAMアドレスに配置されている
メモリ空間上での配置は問題ないようなので、次はハードウェアにROMを実装して動作させる準備を行います。

 ページ先頭へ 前へ 次へ ページ末尾へ