平成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を実装して動作させる準備を行います。