SBCZ8002のアプリ開発手順

SBCZ8002のアプリはFedoraCore9とz8kgccのクロス開発環境で能率的に開発することができる。実際、簡易モニタmonz8kが比較的短時間で完成した。その開発工程が頭から消えてしまわないうちに、クロス開発環境の要点をまとめておこうと思う。

1.クロス開発環境の構築
Z8000のクロス開発環境にしたがいクロス開発環境を構築。

2.開発用のディレクトリを作り開発に必要なファイルを保存
データパックのsbcz8002.tar.gzをホームディレクトリに置く。
以降のコマンドを「端末」から入力。

tar zxvf sbcz8002.tar.gz

開発用のディレクトリへ入ってファイルを確認。

cd sbcz8002
ls

●標準アプリと簡易モニタ用アプリ
SBCZ8002のROMに書き込んで実行するアプリを標準アプリと呼ぶ。
簡易モニタでRAMにロードして実行するアプリを簡易モニタ用アプリと呼ぶ。

標準アプリに関係するファイルは次のとおり。
sbcz8002.x-標準アプリのROMイメージを作るリンカースクリプト
splitとsplit.c-ROMイメージを偶数/奇数に振り分けるプログラムとソース
monz8k.*-簡易モニタのソースと開発の過程で生成されたファイル
monz8k_even.binとmonz8k_odd.bin-偶数ROMと奇数ROMのイメージ

簡易モニタ用アプリに関係するファイルは次のとおり。
monapp.x-簡易モニタ用アプリのHEXファイルを作るリンカースクリプト
hello.*-簡易モニタ用アプリのサンプル

標準アプリと簡易モニタ用アプリは開発の手順が少し違う。まず標準アプリの開発手順を述べ、次に簡易モニタ用アプリの開発手順を述べる。

●標準アプリの開発手順
標準アプリはZ8002のリセットによって実行されるためスタートアップルーチン(リセットベクタとスタックポインタの設定)が必要。

3.C言語のソースを記述する
先頭にこんな感じでスタートアップルーチンを記述。

// Start up routine
__asm__ ("sect .text");
__asm__ ("wval 0");
__asm__ ("wval 16384");
__asm__ ("wval 6");
__asm__ ("ld r15,#0");
__asm__ ("jp _main");

ポートの入出力はこんな感じで記述。

// In value from port
unsigned char inb(unsigned int port){
	unsigned char value;

	__asm__ volatile (
	"inb %Q0,@%H1 \n\t"
	: "=r"((unsigned char)value)
	: "r"((unsigned int) port)
	);
	return value;
}

// Out value to port
void outb(unsigned int port, unsigned char value){

	__asm__ volatile (
	"outb @%H0,%Q1 \n\t"
	:
	: "r" ((unsigned int)port), "r"((unsigned char)value)
	);
}

一連の操作をできるだけ簡単に済ませるため、ソースはひとつのファイルにまとめ、標準ライブラリを使わず、参照はすべてこのファイルの中で解決する。

4.ROMイメージの生成
C言語のソースから偶数/奇数ROMのイメージを作る工程は次のとおり。ソースが正しく記述されていれば機械的な操作で済むが、実際は各段階でエラーが発生しがち。

z8k-coff-gcc -Os -nostartfiles -T sbcz8002.x -o monz8k.o monz8k.c
z8k-coff-objcopy -O binary monz8k.o monz8k.b
./split monz8k.b

●簡易モニタ用アプリの開発手順
簡易モニタ用アプリはスタートアップルーチンやポートの入出力などハードウェア寄りの処理がいらない。コードは%8000から配置され、実行開始アドレスも%8000となる。

3.C言語のソースを記述する
簡易モニタ用アプリは簡易モニタの内部関数を呼び出すことができる。内部関数のアドレスは次の操作で表示される。

z8k-coff-nm monz8k.o

内部関数putstrを呼び出してhello, worldを表示する記述例hello.cは次のとおり。

/*	hello world
	SBCZ8002 Rush Monitor application
	Most simple example
*/

// Set address into function pointer
void (*putstr)(unsigned char *) = (void *) 0x0202;

main(){
	// Call function with argument
	putstr("hello, world\15\12");
}

4.HEXファイルの生成
hello.cからhello.hexを作る操作は次のとおり。

z8k-coff-gcc -Os -nostartfiles -T monapp.x -o hello.o hello.c
z8k-coff-objcopy -O ihex hello.o hello.hex

率直なところ、以上の説明があらゆる場合に十分かどうかはわからないし、達人が見たらだっせーことやってるなと感じるかもしれない。だとしても、この手順で今のところ問題が生じていないのは事実。少なくとも簡易モニタを拡張して普通のモニタへ発展させることはできると思う。

カテゴリー: コンパイラ, Z8000 パーマリンク

SBCZ8002のアプリ開発手順 への1件のフィードバック

  1. ピンバック: SBCZ8002_reference | 電脳伝説

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中