[H8-ML(302)] Re: 続 SRAM
From: KenjiNishimura <k_nishimura@xxxxxxxxxxxxxxx>
Date: 1999年09月13日(月)13時38分36秒
// レスを本人に直接送ってしまいましたので、MLに再送します

非常に久しぶりに書き込みます、西村@中央大学です
レスしますが、間違いがあるかもしれませんので各自の判断で読んでください。

> 私は秋月のCで書いているんですがつまり、スタートアップルーチン(アセンブラで
> かいてリンクするやつ)の内容を変えてあげればいいのですか?
> その場合は上に書いてあるのをどこに加えればよろしいのでしょうか?
> んー本当に基本的なことばっかり先ほどから質問しているような気がする・・・・

 その基本的なことが書かれている資料が無いので(実はCコンパイラの使いや
すいマニュアルとかあるのでしょうか)、わからないですよね。
私も当初はさっぱりでした。最近よく相談されるので、この辺の事をまとめてホー
ムページを作りたいかなと思ってます(いつになるやら・・・)。

> ちなみに私の場合以下のようなものを使っています。
> ;
> 	.cpu 300ha:20
> 	.import _main
> ;
> ramend:	.equ	h'fff10	 ;RAM END FFF0F+1
> ;
> 	.section reset0,data,locate=h'0
> 	.data.l	init
> ;
> 	.org	h'100
> 	init:		mov.l	#ramend,er7
> ;
> 	jmp	@_main
> ;
> 	.end

この例だとわかりづらいので、少し書き換えます。

  ;----- ここから
  	.cpu 300ha:20
  	.import _main
  
  ramend:  .equ    h'fff10 ;RAM END FFF0F+1
  ;
V♪	.section    V , data , locate=h'0
V♪	.data.l     init
V♪;
P♪	.section   P , code , locate=h'100
P♪init:       mov.l    #ramend , er7
P♪;
P♪
P♪	MOV.L	#STARTOF	D , ER0	; ROM DATA
P♪	MOV.L	#STARTOF	R , ER1	; RAM DATA
P♪	MOV.L	#SIZEOF		D , ER2	; データ数
P♪
P♪LOOP:
P♪	MOV.B	@ER0 , R3L
P♪	MOV.B	R3L   , @ER1
P♪	ADD.L	#1 , ER0
P♪	ADD.L	#1 , ER1
P♪	DEC.L	#1 , ER2
P♪	BNE		LOOP
P♪
P♪jmp         @_main
P♪; 以下追加
C♪	.section C , data
C♪	:
C♪	;Cで言うところのconst型の変数のデータが入る
C♪	;const c = 10; の c という変数
C♪	;
D♪	.section D , data
D♪	;
D♪	;int i = 1 という際の1という初期値が入る
D♪	;
R♪	.section R , data
R♪	;
R♪	;int i = 1 という際のiという変数のためのエリア
R♪	;上記Dと非常に深い関係
R♪	;
B♪	.section B , data
B♪	;
B♪	;int i という際のiという変数が入る
B♪	;
  .end
;----- ここまで

さらに、リンク時に以下のようなコマンドを実行していると思うのですが
  l38h -subcommand=filename.sub
このfilename.subというファイルの中に以下の行を作成します

ROM (D,R)
START V(0),P,C,D(0200),R,B(0FF100)

この
ROM(D,R)
に関してはおまじないだと思ってもいいと思います。説明しづらいので今回はしませんが、必要だと思う人はいってください。下手ながらも説明をしたいと思います。
で、次の
START V(0),P,C,D(200),R,B(0FF100)
がかなりくせ者なのですが、順にいくと
V(0)
セクションV(Vectorの略のつもり)をアドレス0番地から書き始めるという意味です。
P,C,D(200)
これはセクションPをアドレス200番地から書き込み、
セクションPが終わった次のアドレスからセクションCを書き込む
セクションCが終わったら次のアドレスからセクションDを書き込む
という意味です。
セクションPのサイズが100byteならセクションCは300番地から始まります
(10進数と16進数が混じっている気がするけど、各自適切に読み替えてください)
以上がROMに書き込まれるデータです。

次に
R,B(0FF100)
は上記と同様セクションRBをFF100番地から書き込むということです。
(先頭が’F(アルファベット)’で始まるのでFF100ではなく0FF100となる。
また、RAM上の話なので、書き込むというより、割り当てるの方が適切かな?)

つまり、エリア1に増設したRAMに変数を割り当てたいときは
R,B(20000)
とすれば良いはずです。

先のスタートアップルーチンのサンプルの♪の前のアルファベットはその行がセクションのなにに割り当てられているかを示しています。

秋月のリンカでできるかわからないのですが、同じfilename.subというファイルの中に以下の行を作成することで、main.mapというファイルが出力されるのでそのファイルをテキストエディタで開くと、各セクションの割り振りなどが非常にわかりやすくなったのがみれます。
PRINT main


長くなって疲れたので、ここまでにします。


♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪
    中央大学理工学部精密機械工学科3年 
          西村賢治        
     k_nishimura@xxxxxxxxxxxxxxx    
♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪

スレッド概略
[表示中](起点)


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]