目次
前
次
HitechC利用
手元にはHitechCがあります。
ROMに入れるファームウエアを作成することを前提に
作られているので、コンパイルオプションが多い他
メモリの使い方を確定していないと、なかなか思う
ようなコードにならないです。
コンパイル、リンクのときに、指定内容を
理解しておけば、いかようにでもROM、RAM
の配置をかえられるので、自分の手持ちで
最強の開発環境です。
HitechCの場合、正統派のセグメント割当てを
するので、メモリ上のプログラム構成を理解
しなければなりません。
メモリ構成は、次のようになっています。
psectは、プログラムセクションと呼ぶセグメントで
Cのソースコードから、プログラム部分だけを集めて
text、data、bssに分けてROM、RAMに展開します。
- text プログラム
- data 初期化を受けるデータ
- bss 初期化を受けないデータ
となっています。
HitechCに関わるセグメントは、コード、データ領域
を表すブロックです。80x86で利用される最大64kバイト
のメモリブロックではありません。
ヒープ領域、スタック領域などを考えてプログラム
するとよいのですが、Z80程度では、アセンブリ言語
とのインタフェースを意識して使いこなすのが得策
です。
ROMに入れるファームウエアなので、スタートアップ
ルーチンを見ていきます。マニュアルにあるサンプル
を見てみます。
; Run-time startoff for ROM
psect text,pure
psect data
psect bss
RAMSIZE equ 2048
global _main,start,__Hbss,__Lbss
psect text
start:
ld sp,__Lbss+RAMSIZE ; set stack pointer
ld de,__Lbss ; start bss block area
or a ; clear carry flag
ld hl,__Hbss
sbc hl,de ; get size
ld c,l
ld b,h
dec bc
ld l,e
ld h,d
inc de
ld (hl),0
ldir ; clear memory
call _main
jp start
スタートアップルーチンの役割は、スタックポインタを
設定し、他に必要な処理をして、Cのmain関数に制御を
渡します。これが基本。
スタートアップルーチンのサンプルを見ると、以下の
ことを読み取れます。
- psectは、3つのセグメントtext、data、bssに集められる
- bssは、初期化なしなので、最初にゼロクリアする
- bssの容量は、指定して決められる
- ラベルにアンダスコアをひとつ付けると、Cのソースコードで使われる
- ラベルにアンダスコアを2つ付けると、Cの内部で利用する
- globalをつけると、他のソースコードから参照できる
- bssの16ビットアドレスは、最終_Hbss、開始_Lbssの2つのラベルで指定可能
- Z80のアセンブリ言語命令ldirを使える
HitechCでの関数は、アセンブリ言語にどう変換
されるのかを、マニュアルで調べました。
Cはスタックを利用して、関数にパラメータを
わたします。Cの元々の仕様では、フレーム
ポインタを利用し、パラメータを渡すと規定
があります。
フレームポインタを持たないCPUでは、スタックを
利用して、パラメータを関数に渡します。
Z80は、フレームポインタを持たないので、スタック
を利用して、パラメータを関数に渡します。
スタックは、メモリという観点で見ればよいので
その中に、データを入出力するカラクリを考えて
おきます。
C言語の関数は、値を返すか返さないのどちらかに
なっています。値を返す場合、1個と限定されて
いるので、どのレジスタに入れられてくるのかを
調べると、HLレジスタペアになっていました。
関数でどういう処理をしているのかをアセンブリ言語で
吐き出させてみました。
(under construction)
目次
前
次