目次

HitechC利用

 手元にはHitechCがあります。



 ROMに入れるファームウエアを作成することを前提に
 作られているので、コンパイルオプションが多い他
 メモリの使い方を確定していないと、なかなか思う
 ようなコードにならないです。

 コンパイル、リンクのときに、指定内容を
 理解しておけば、いかようにでもROM、RAM
 の配置をかえられるので、自分の手持ちで
 最強の開発環境です。

 HitechCの場合、正統派のセグメント割当てを
 するので、メモリ上のプログラム構成を理解
 しなければなりません。

 メモリ構成は、次のようになっています。



 psectは、プログラムセクションと呼ぶセグメントで
 Cのソースコードから、プログラム部分だけを集めて
 text、data、bssに分けてROM、RAMに展開します。

 となっています。

 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関数に制御を
 渡します。これが基本。

 スタートアップルーチンのサンプルを見ると、以下の
 ことを読み取れます。

 HitechCでの関数は、アセンブリ言語にどう変換
 されるのかを、マニュアルで調べました。

 Cはスタックを利用して、関数にパラメータを
 わたします。Cの元々の仕様では、フレーム
 ポインタを利用し、パラメータを渡すと規定
 があります。

 フレームポインタを持たないCPUでは、スタックを
 利用して、パラメータを関数に渡します。

 Z80は、フレームポインタを持たないので、スタック
 を利用して、パラメータを関数に渡します。

 スタックは、メモリという観点で見ればよいので
 その中に、データを入出力するカラクリを考えて
 おきます。

 C言語の関数は、値を返すか返さないのどちらかに
 なっています。値を返す場合、1個と限定されて
 いるので、どのレジスタに入れられてくるのかを
 調べると、HLレジスタペアになっていました。

 関数でどういう処理をしているのかをアセンブリ言語で
 吐き出させてみました。

(under construction)

目次

inserted by FC2 system