2010年4月アーカイブ




ルーターテーブル続き。もう一方のフェンス用スロットも仕上げて、これを使っ
てフライスに固定し、フェイスプレートの部分を切削。ここも懐の関係で一回
で切削できないので、半分づつ前面、後面をクランプし直してになる。精度の
高い固定が求められるのでとても大変。あと次から防毒マスクして作業しよう。
WD-40を切削油に吹いてるのだけど、これ吸いながら作業するのよくない。



なんとかここまで来た。これはうちのフライスの限界に挑むような工作だった な。まだもう一本治具固定用のアリ溝を掘る予定。今、工具を発注していると ころ。

ルータを固定してみる。ルータの固定穴85mm四方と思ったらもうちょっと小さ かった。ルーズホールを大きくしてなんとか対処。直結なのでルータの装着は 結構面倒。動かしてみると非常に安定感ある。鳴るかなと不安だったけれど、 鳴りもなし。天板t10.0でよかったかな。

これはトリマの装着。トリマは以前アタッチメントプレートを作って55mm四方 でいいことを確認してたのでぴったし。

正三角形の位置にプレート高さ合わせようのイモビスを装着。プレートは試し に塩ビt5.0にしてみた。ちょっと柔いかな。最低でもアクリルくらいの硬度は 欲しいかも。塩ビだとプレートを一本のボルトで固定では反ってしまって、手 前側にもう一本欲しい。
ルータ固定穴を座具る時に座具りビットが淵に押し当たってしまい、表面が盛 りあがってしまった...。ダイヤモンドヤスリでなんとかリカバリ。

はやる気持ちを押さえ切れずに、ちょっとだけ切削してみた。いいね。これは 工作の幅が拡がる。


ルーターテーブル続き。青ニス塗ってケガキ。これだけ大きいと不思議な感覚
になる。



ルーターあるいはトリマーは天板直結。コレットの穴だけφ40で。まずはφ5.9で 円周上を穴開け。

ボール盤ではリーチが足りなくなりフライスで。かなり密に穴開けたので後は タガネではつって...しかしまったくビクともしない。

しかたなくプレスで強引に打ち抜きました。t15.0は強敵過ぎる。

ボーリングヘッドでじわじわと所定のサイズまで。

フェイスプレートをそれぞれの目的で交換できるように5mmちょっと100x100mm で掘ります。荒掘りしたところで、フライステーブルと共にクランプ締めした くらいではエンドミルの捻り力に対応できないことがわかり(ドリリングやボー リングのように真上からの力しかかからないのなら余裕だったのだけど)、スラ イドフェンスのスリットを先に掘ることに。このスリットを利用してチャック しようという戦略。

30個もφ10で穴開けるのは一苦労。とはいえいきなりエンドミルで掘るより効 率がいい。そこで突然、弟がやってきて、A2024の切り板から部品を削り出して 欲しいというので、一作業。サーキュラーテーブルのホールドが弱くて外形が 偏心してしまった。ちょっとだけでも肉抜きすると映えるよね。

そしてまたルーターテーブルに。φ10のエンドミルで幅12mmのスリットを仕上げ。 今日は片方だけ。疲れた。

サス付きの自転車のリジッド化に使われる部品らしい。




ルーターテーブル続き。天板の加工。フライスの加工領域を越えて作業するの
で工夫を。まずはストレートエッジを平行になるようにクランプで固定。これ
を基準にしてちょっとづつクランプをし直して切削。



まずは10φの二枚刃で切り込み3mmで。結構辛い。無難にMDFにしておけばよかっ たかな...とも。ハンドル廻すだけで筋肉痛になりそう。

計4回のクランプが必要。

そしてもう一回戻ってφ12の4枚刃ラフィングで切り込み5mmで。これは楽。本 来10φラフィング、12φ二枚刃の方がいいのだけど、手持ちの工具の関係で。 もう一本はいきなりφ12で切り込み5mm一発でいけそう。
作業に夢中になっていて、筑波の予約忘れた...ショック。今週末のMCは練習な しでぶっつけだ...。それと正直、一度S枠走れてしまうと、A枠走る気しないん だよね...。

H8SX続きスレッドの実装。今回は例外フレーム(例外時にストアすべきCPU状 態)と、スイッチフレーム(明示的にスレッドスイッチをする時にストアすべき CPU状態)を別に実装してみることにした。具体的には呼出し元退避のER0-ER3を とっておくかおかないかの差。スレッドスイッチをする時には呼出し元退避は 既に呼出し元のスタックに入っているので、例外フレームとして全部退避する とちょっと無駄になる。
こんな感じで設定。例外フレームでレジスタの順番が3,2,1,0,6,5,4になって いるのはスイッチフレームとの関係と、ldm.l,rte/lで多重レジスタロードを 効率よく使えるように。
struct exception_frame;

struct reg
{
  struct exception_frame *ef;
//今迄の他のポートではここに直接、例外フレームが入っていたのが、
//それへのポインタになった。これはldm.l,rte/l命令を効率よく使うため。
};

// Stack frame when exception is occured.
// 割り込みモード2の例外突入時のスタックフレーム
struct exception_stack_frame
{
  uint8_t exr;		/* 0x1e/0x0e EXR */
  uint8_t reserved;	/* 0x1f/0x0f reserved */
  uint32_t ccr_pc;	/* 0x20/0x10 CCR, 0x23 PC(24bit) */
} __attribute__((packed));

// Frame must be reserved in exception
struct exception_frame
{
//このフラグはスイッチフレームと例外フレームを別にしたので、レジスタ復帰の際に
//どちらのフレームかを判別するためにつけたソフトウェア的なもの。
  uint8_t flags;// frame type (switch/exception)
//スタックは2byteアラインなのでパディング
  uint8_t pad;	// for stack alignment
  uint32_t er3;	/* 0x02 caller saved */
  uint32_t er2;	/* 0x06 caller saved */
  uint32_t er1;	/* 0x0a caller saved */
  uint32_t er0;	/* 0x0e caller saved */
  uint32_t er6;	/* 0x12 callee saved */
  uint32_t er5;	/* 0x16 callee saved */
  uint32_t er4;	/* 0x1a callee saved */
  struct exception_stack_frame stack_frame;
} __attribute__((packed));

// Frame must be reserved in explicit thread switch.
struct switch_frame
{
//スイッチフレームは呼出し元退避がないだけ。サブルーチンコールと例外で
//スタック構造が違うのはソフトウェア的に変換。
  uint8_t flags;// frame type (switch/exception)
  uint8_t pad;	// for stack alignment
  uint32_t er6;	/* 0x02 callee saved */
  uint32_t er5;	/* 0x06 callee saved */
  uint32_t er4;	/* 0x0a callee saved */
  struct exception_stack_frame stack_frame;
} __attribute__((packed));


スレッドスイッチは第一引数(ER0)に継続があるので、それをそのまま渡すよう
に。継続を共なってブロックする時はスタックを放棄できるスレッド。それは、
ここでスタックを外して、次に走る時には新しくスタックを拾ってきてこの継
続から再開する。

	.h8300sx
	.section .text
	.align 2
	/* void do_thread_switch (continuation_t) */
	/* Assume already interrupt disabled */
	/* Called from thread context */
	.global	_do_thread_switch
_do_thread_switch:
//サブルーチンコールのスタック構造を例外時の構造に変換
	stc.b	exr, r2h	// Get current EXR
	mov.w	r2,  @-sp	// Store EXR
//呼出し先退避だけ退避。
	stm.l	er4-er6, @-sp	// Store caller saved registers.
//ここでフレーム種別の領域(switch_frame.flags)を設定
	subs	#2, sp		// Software flags region.
	bclr	#0, @sp		// clear exception frame bit
//current_threadのTCBのstruct regにこのフレームポインタを設定。
	mov.l	@_current_thread, er4
	mov.l	sp, @(0, er4)	// Store current frame to TLS
	// Reschedule.
	jsr	_thread_context_switch
	// Run next thread.
//ここでcurrent_threadのTCBは変更されたかもしれないのでポインタを読み直す。
	mov.l	@_current_thread, er4
//このTCBのフレームポインタを設定
	mov.l	@(0, er4), sp
//フレームがスイッチフレームならER4-ER6だけ復帰し、例外フレームなら全復帰
	btst	#0, @sp	// If switch frame, Z = 1
	adds	#2, sp
	beq	1f	// If exception frame, restore er0-er3
	// Restore registers.
	ldm.l	@sp+, er0-er3
1:	rte/l	er4-er6

終了時にスレッドのスケジューリングをする割り込みの入口は
// 例外フレームの配置に合わせてこの順番で退避
	stm.l	er4-er6, @-sp
	stm.l	er0-er3, @-sp
// 多重割り込みの判定のために、割り込まれた時点での割り込みレベルを
// 呼出し先退避のer4にとっておく
	mov.b	@(0x1c, sp), r4l	// old EXR


終了時にスレッドのスケジューリングをする割り込みの出口は

//r4lには割り込まれた時点のEXRが入っているので、優先度を抽出。
	and.b	#7, r4l		// extract EXR.I[0-2] 0: Z=1, 1-7:Z=0
//多重割り込みなら、レジスタを復帰してそのままリターン
	bne	1f		// if (Z == 0(interrupt nested)) goto 1
	// Prepare exception frame.
//そうでないならここでスレッドスイッチできるように例外フレームを構築
	subs	#2, sp
//例外フレームであることを示すためにexception_frame.flagsをセット。
	bset	#0, @sp		// Set exception frame bit
//割り込まれたスレッドのTCBにこの状態を登録。
	mov.l	@_current_thread, er1
	mov.l	sp, @(0, er1)	// Store current frame to TLS
//割り込みハンドラでは継続はない。
	mov.l	#0, er0	// no continuation.
//以下はdo_thread_switchと同じ。
	jsr	_thread_context_switch

	mov.l	@_current_thread, er1	// Load new thread control block.
	mov.l	@(0, er1), sp	// Set new exception/switch frame.

	btst	#0, @sp		// Check frame type.
	adds	#2, sp
	beq	2f	// If switch frame, don't restore er0-er3
1:	ldm.l	@sp+, er0-er3
2:	rte/l	er4-er6


mon> l
~>Local file name? a.mot
2632 lines transferred in 11 seconds 
!
Read 59127 byte. success
Start address: 0xff3d40
stack_start: 0xffc000
RAM data: 0xff723c-0xff727c 64byte
bss: 0xff7280-0xff85dc 4956byte
VBR: 0xff2000 (0xff2000)
MCU mode: 6
DTC: short-address mode
Internal RAM: enabled
External bus: enabled
Instruction fetch: 32bit
MAC instruction: non-saturation mode
Interrput Control mode: 2
PA7 clock output: On
Input clock: 12000000Hz, MDCLK=0
System clock: x4 (48000000Hz)
Peripheral clock: x2 (24000000Hz)
External clock: x4 (48000000Hz)
thread_stack_setup: ff777c-ff7380 (400)
thread_stack_setup: ff7b7c-ff7780 (400)
thread_stack_setup: ff7f7c-ff7b80 (400)
thread_stack_setup: ff837c-ff7f80 (400)
CONTINUATION=0
thread_create_no_stack: [2]:uart recv pc=7 (no stack)
thread_start: [2]
thread_create_no_stack: [3]:uart send pc=7 (no stack)
thread_start: [3]
intc_priority: fffd56(4) 7->7
OHAYO Apr 28 2010 21:58:30 arg=1badface
peripheral_power: fffdcc (4096) ->1
intc_priority: fffd62(8) 7->7
peripheral_power: fffdc8 (256) ->1
intc_priority: fffd4e(12) 7->5
user> 
user> 
user> help
---Monitor---
W ringbuffer
        lock : 
        event: 3(uart send) 
U ringbuffer
        lock : 
        event: 
---Ready Queue---
<0>: 
<1>: 
<2>: 
<3>: 1 
---Thread Status---
id   pri(used/total)
[3] W 0 (no stack) uart send
[2] W 0 (no stack) uart recv
[1] R 3 (300/1020) root
---Stack Status---
  bottom   top     (used/total)
0 ff777c-ff7380 (4/1024) 
1 ff7b7c-ff7780 (4/1024) 
2 ff7f7c-ff7b80 (180/1024) 
3 ff837c-ff7f80 (304/1024) 
avaliable command: help reset timer interrupt test 
user> timer
old=0 new=0
timer 1
user> TMR0:EXR=5 old EXR=0
TMR0:EXR=5 old EXR=0
TMR0:EXR=5 old EXR=0
TMR0:EXR=5 old EXR=0
TMR0:EXR=5 old EXR=0
TMR0:EXR=5 old EXR=0
TMR0:EXR=5 old EXR=0
tTMR0:EXR=5 old EXR=0
eTMR0:EXR=5 old EXR=0
sTMR0:EXR=5 old EXR=0
tTMR0:EXR=5 old EXR=0

0:test
timer 0
user> 



ルーターテーブル続き。薄め(15mm)の押し具も作りました。面出しはフェイス
カッターの方がちょっとかっこいいかも。座具りで一箇所失敗。実用上はまっ
たく問題ないけれど。



H8SX続き。サブルーチンコールのスタックフレームを例外のスタックフレーム に変換するテスト。
	.global	_do_thread_switch_test
_do_thread_switch_test:
//デバッグのためにリターンアドレスを引数としてとっておきます。
	mov.l	@sp, er1	// Return address.
//現在の割り込み状態を取得。予約領域を考慮して16bitの上位8bitに。
	stc.b	exr, r2h	// Get current EXR
//これを16bitでスタックに積んで、例外時のスタックフレームと互換の形に。
	mov.w	r2,  @-sp	// Store EXR
//呼出し元退避のレジスタは既にスタックに積まれているのでスキップのみ
	sub	#16, sp		// Skip ER0-ER3 (callee saved)
//呼出し先退避のレジスタを退避。
	stm.l	er4-er6, @-sp	// Store caller saved registers.
//このフレームをスレッドとして登録
	mov.l	sp, @_current_thread	// Store current frame to TLS
//確認のためのテストルーチンを呼びだし
	mov.l	sp, er2
	jsr	_thread_context_switch_test
	mov.l	@_current_thread, sp
//例外フレームとしてリターン。
	// Restore all.
	ldm.l	@sp+, er4-er6
	rte/l	er0-er3



~>Local file name? a.mot
1400 lines transferred in 6 seconds 
!
Read 31401 byte. success
Start address: 0xff39f4stack_start: 0xffc000
RAM data: 0xff4b1c-0xff4bfc 224byte
bss: 0xff4bfc-0xff4ce4 232byte
VBR: 0xff2000 (0xff2000)
MCU mode: 6
DTC: short-address mode
Internal RAM: enabled
External bus: enabled
Instruction fetch: 32bit
MAC instruction: non-saturation mode
Interrput Control mode: 2
PA7 clock output: On
Input clock: 12000000Hz, MDCLK=0
System clock: x4 (48000000Hz)
Peripheral clock: x2 (24000000Hz)
External clock: x4 (48000000Hz)
OHAYO Apr 27 2010 23:08:44
peripheral_power: fffdcc (4096) ->1
intc_priority: fffd62(8) 7->4
peripheral_power: fffdc8 (256) ->1
intc_priority: fffd4e(12) 7->5
user> 
user> test OhAyO
0:test
1:OhAyO
timer 0
arg=OhAyO PC=ff3982 SP=ffbf72
er0:397600ff
er1:4c2800ff
er2:200ff
er3:4c300000
er4:ff4c28
er5:2
er6:ff4c30

exr=78
ccr=0
pc=ff3982
sp=ffbf72 oldpri=0
arg=OhAyO PC=ff3982 SP=ffbf72
er0:397600ff
er1:4c2800ff
er2:200ff
er3:4c300000
er4:ff4c28
er5:2
er6:ff4c30

exr=78
ccr=0
pc=ff3982
sp=ffbf72 oldpri=0
arg=OhAyO PC=ff3982 SP=ffbf72
er0:397600ff
er1:4c2800ff
er2:200ff
er3:4c300000
er4:ff4c28
er5:2



ルーターテーブル続き。まずは348x600のt15.0 A5052板が届いた。でかい。こ
れをこのフライス盤で切削するのでコラム位置の関係で限界がある。それも設
計に含めないといけない。ちょっとハードル上げ過ぎた気も...。



H8SX続き。スレッドの実装の準備。マイOSでは今回初の多重割り込みの実装に なる。多重割り込みになるとスタックの消費も多くなるので、割り込みスタッ クを別に設定できないかと考えていたのだけど、割り込みベクタに制御が渡っ た時点でそれより上の割り込みが可能な時点で難しい。ベクタの先頭で EXR.I[0:2]を割り込み不可にして、自分の割り込みレベルはソフト的に用意し たテーブルから読み出せば可能かもしれない。
そこまでやることはないと思ったので割り込みスタック別はなし。となるとア プリケーションのそれぞれのスレッドが多重割り込みまで考慮した分のスタッ クを用意しないといけない。(このオーバーヘッドが結構辛い)
SHみたいに例外の大元で切れて、そのままベクタに来てくれると自由度が高い のだけど...。
ということで今回の方針は、割り込みスタックは割り込まれたスレッドのもの。 優先度0(最低)から割り込まれたら終了時にスレッドのスケジューリング。それ 以外であれば割り込まれた場所にリターン。ということにしました。
多重割り込みでスレッド切り替えに入ってしまうと、その割り込まれた割り込 みハンドラの残りの作業がいつになるかわらからなくなってしまうので。
フレームの設計としてはH8SXの
	stm.l	er0-er3, @-sp
	stm.l	er4-er7, @-sp
この二命令で全レジスタを退避できるのを活用したい。stm.lはsp(er7)だけなので スタックに退避しないといけない。H8では
	mov.l	er0,	@-er7
#ifdef __NORMAL_MODE__
	mov.w	@_current_thread, r0
#else
	mov.l	@_current_thread, er0
#endif
	mov.l	er1,	@(0x04, er0)
	mov.l	er2,	@(0x08, er0)
	mov.l	er3,	@(0x0c, er0)
	mov.l	er4,	@(0x10, er0)
	mov.l	er5,	@(0x14, er0)
	mov.l	er6,	@(0x18, er0)
	mov.l	@er7+,	er1
	mov.l	er1,	@(0x00, er0) ; er0
	mov.l	er7,	@(0x1c, er0) ; er7
のようにスレッド局所記憶の下に設定したフレームに退避していた。これは今 回難しい(ベクタに来た時点でそれ以上の優先度の割り込みが入るので、きわど い領域を守りようがない)。スレッド局所記憶にはフレーム全体ではなく、フレー ムのポインタだけを登録する方針に変更。こうするとフレームのアドレスが固 定でなくなるので、きついデバッグの時に、ちょっと辛い。SH3/4みたいに例外 の首で締めてベクタにくるようになっていれば、その間にいくらでも、お膳立 てできるのだけれど...。
こんな感じでいこうと思います。
	.h8300sx
	.section .text
これは仮のcurrent_thread. 今回はポインタだけとっておけばいいので4byte
	.data
	.align 2
	.global _current_thread
_current_thread:
	.long	0

	.align 2
	.global	_tmr7
_tmr7:
	stm.l	er0-er3, @-sp
	stm.l	er4-er7, @-sp

	mov.b	@(0x20, sp), r4l	// old EXR
スタックフレームに退避されたEXRから割り込まれる前の優先度をcallee savedの
r4に退避。

	mov.l	sp, er0		// arg0
	mov.b	r4l, r1l	// arg1
	stc.b	exr, r2l	// arg2
	and.b	#7, r2l
	jsr	_c_tmr7
なんらかの割り込みルーチン。

	and.b	#7, r4l		// extract EXR.I[0-2] 0: Z=1, 1-7:Z=0
	bne	1f		// if (Z == 0(interrupt nested)) goto 1
割り込まれたのが割り込みルーチン(EXR > 0)ならコンテキストスイッチせずに
そのままリターン
	mov.l	sp, @_current_thread	// store frame to TLS
割り込まれたのが割り込みルーチンでなければ、ここでスレッドスイッチをする
可能性があるので、このフレームをスレッド局所記憶に登録。

	mov.b	r4l, r0l	// arg0
	jsr	_c_switch
ここで_current_threadが変更されるかも。

	mov.l	@_current_thread, sp
新しいスレッドのフレームに交換。

1:
	ldm.l	@sp+, er4-er7
	rte/l	er0-er3
模擬テスト
ystem clock: x4 (48000000Hz)
Peripheral clock: x2 (24000000Hz)
External clock: x4 (48000000Hz)
OHAYO Apr 26 2010 22:22:18
peripheral_power: fffdcc (4096) ->1
intc_priority: fffd62(8) 7->4
peripheral_power: fffdc8 (256) ->1
intc_priority: fffd4e(12) 7->5
user> 
user> timer
old=0 new=0
timer 0
user> TMR0:EXR=5 old EXR=0
!SWITCH! opri=0
TMR7:EXR=4 old EXR=0
[NESTED]TMR0:EXR=5 old EXR=4
[NESTED]TMR0:EXR=5 old EXR=4
[NESTED]TMR0:EXR=5 old EXR=4
!SWITCH! opri=0
TMR0:EXR=5 old EXR=0
!SWITCH! opri=0
TMR7:EXR=4 old EXR=0
[NESTED]TMR0:EXR=5 old EXR=4
[NESTED]TMR0:EXR=5 old EXR=4
[NESTED]TMR0:EXR=5 old EXR=4
!SWITCH! opri=0
TMR0:EXR=5 old EXR=0
!SWITCH! opri=0
TMR7:EXR=4 old EXR=0
[NESTED]TMR0:EXR=5 old EXR=4
[NESTED]TMR0:EXR=5 old EXR=4
[NESTED]TMR0:EXR=5 old EXR=4
!SWITCH! opri=0
TMR0:EXR=5 old EXR=0
!SWITCH! opri=0
TMR7:EXR=4 old EXR=0
[NESTED]TMR0:EXR=5 old EXR=4
[NESTED]TMR0:EXR=5 old EXR=4
[NESTED]TMR0:EXR=5 old EXR=4



転がってた単管をバンドソーで切断、旋盤で端面出して、おおよそ45度でバン
ドソーで切断、フライスで傾斜台に載せてきっちり面だし。これに合わせて現
物でt1.0の鉄板にケガいて、まずボルト穴開けて、糸ノコ盤で切り出し。そし
て溶接。前回のクランクケースの補修で絶望感を味わったけれど、やっぱり鉄
だと気持ちよく作業できる。最初溶棒さしてたけれど、いらなさそうなので後
半はナメ付けに。



これはルーターテーブルの集塵ポート。こんな感じでフェンスにつけるつもり。 思いつきで作ったのでいろいろと失敗。上側のボルト穴、ボルトどころかナッ トも入らないし。フランジ小さ過ぎないか? まぁこのくらいなら確実に作れる ことはわかったので具合が悪ければ作り直そう。

肩ならしに、これまた転がってた2017のt15.0板からフェンスにつける押し具の パーツを作ってみた。8mmの止め穴開けるのにいきなり8mmエンドミルをそのま ま沈めちゃだめだ。四枚刃を使ったのも失敗。四枚刃だとケガキ線に合わせて 芯出しするのが楽だったので...。センタリング用の工具も作っておくべきか。

十数年前、バンクセンサーの材料に使ってたマナ板の残りがあったので、これから削りだして取りつけ。

無理してφ8の穴、底付きにしたけれど、別にそんなことする必要なかった な...M8にしてダブルナットで固定にしてもよかったかも。



マルノコ新調しました。普通のタイプではなく内装直角マルノコ、マキタ
5210Lにした。いつも直角だけが必要だし、切断するものの厚さを考えると切り
込み深さ46mmで十分なので。そして取り回しの良さげなところに魅かれた。実
際使ってみるとどんなもんかな。



ずっとルータテーブルの設計。ほぼイメージはできあがった。テーブル下面か らフェンスを移動させようとすると、ルーターを避けるてブリッジせざるを得 なく、そこで迷った。平行四辺形に歪むのが困るのでここはなんらかの一枚板 (素材はこれから検討)にすることに。
機械部品はもうMonotaROに発注してあるので、部品が届いたらもう一度検討。



意味不物体、ペン置きにしてみることに。



んー使ってみると無理に傾斜台使って斜めにすることなかった。ずり落ちてし まう。

延々とルータテーブルの設計。終わらない。これは機械設計の習作でもあるの でじっくり。機械+モータ+PWM+プログラム→CNCという計画の一部。




昨日設計した釣り棚を作るにあたってまずはトリマ/ルータテーブルを作ること
にした。まずはテーブルソーのレール部分に釣りかける部品の設計。大したこ
とない部品なのだけど、棒材か切り出すのがいいのか平板から切り出すのかい
いのか、実際に買えるサイズ、値段、いろいろと迷って時間がかかってしまっ
た。



H8SX続き。多重割り込みの動作の確認。
割り込み優先度の異なるタイマを設定。

#define	TIMER_CH_LO	TMR_CH7
#define	TIMER_CH_HI	TMR_CH0

  tmr_init (TIMER_CH_LO, INTPRI_4);
  tmr_init (TIMER_CH_HI, INTPRI_5);

uint32_t
timer (int32_t argc __attribute__((unused)),
       const char *argv[] __attribute__((unused)))
{
//割り込み優先度は3 (4以上が割り込み可能)
  uint8_t os = intr_priority (3);
  iprintf ("old=%d new=%d\n", os, intr_status ());

  struct tmr_config tmr;
  tmr.TCORA = 0xff;
  tmr.TCORB = 0;
  tmr.TCCR = TMR_ICKS_div8192_RE;
  tmr.TCR = TMR_CKS_INTCLK_1024_8192 | TCR_CMIEA | TCR_CCLR_CMP_A;

  tmr_start (TIMER_CH_LO, &tmr);
  tmr_start (TIMER_CH_HI, &tmr);

  printf ("timer %d\n", TMR_GET_CNT (0));

  return 0;
}

void
tmr7 ()
{
  addr_t sp;
  uint32_t i;

  __asm volatile ("mov sp, %0" : "=r"(sp));
  sp += 4 * 4; // ER0-ER3
  struct stack_frame *sf = (struct stack_frame *)sp;
  iprintf ("TMR[7] old pri=%d ccr=%x pc=%x\n", sf->exr & 0x7, (sf->ccr_pc >> 24) & 0xff, sf->ccr_pc & 0xffffff);

//割り込み優先度の低いTMRチャネル7ではビジーループを入れてここでチャネル0の
//割り込みを期待。
  for (i = 0; i < 0xfffff; i++)
    *TMR (7, TCNT);

  *TMR (7, TCSR) &= ~TCSR_CMFA;
  *TMR (7, TCSR); // dummy read.
  *TMR (7, TCNT) = 0;
}

結果。OK。

Read 28701 byte. success
Start address: 0xff37e0stack_start: 0xffc000
RAM data: 0xff47fc-0xff483c 64byte
bss: 0xff483c-0xff4924 232byte
VBR: 0xff2000 (0xff2000)
MCU mode: 6
DTC: short-address mode
Internal RAM: enabled
External bus: enabled
Instruction fetch: 32bit
MAC instruction: non-saturation mode
Interrput Control mode: 2
PA7 clock output: On
Input clock: 12000000Hz, MDCLK=0
System clock: x4 (48000000Hz)
Peripheral clock: x2 (24000000Hz)
External clock: x4 (48000000Hz)
OHAYO Apr 22 2010 21:46:26
peripheral_power: fffdcc (4096) ->1
intc_priority: fffd62(8) 7->4
peripheral_power: fffdc8 (256) ->1
intc_priority: fffd4e(12) 7->5
user> 
user> timer
old=0 new=3
timer 0
user> TMR[0] old pri=3 ccr=8 pc=ff2670
TMR[7] old pri=3 ccr=8 pc=ff2670	-> sci4_getc
TMR[0] old pri=4 ccr=80 pc=ff3434	-> tmr7
TMR[0] old pri=4 ccr=80 pc=ff3434	-> tmr7
TMR[0] old pri=4 ccr=a9 pc=ff343a	-> tmr7
TMR[0] old pri=3 ccr=0 pc=ff2674	-> sci4_getc
TMR[7] old pri=3 ccr=8 pc=ff2670	-> sci4_getc
TMR[0] old pri=4 ccr=80 pc=ff3434	-> tmr7
TMR[0] old pri=4 ccr=a9 pc=ff3430
TMR[0] old pri=4 ccr=80 pc=ff3434
TMR[0] old pri=3 ccr=0 pc=ff2674
TMR[7] old pri=3 ccr=8 pc=ff2670
TMR[0] old pri=4 ccr=a9 pc=ff3430
TMR[0] old pri=4 ccr=a9 pc=ff3430
TMR[0] old pri=4 ccr=a9 pc=ff3430
TMR[0] old pri=3 ccr=8 pc=ff2670
TMR[7] old pri=3 ccr=8 pc=ff2670
TMR[0] old pri=4 ccr=80 pc=ff3434
TMR[0] old pri=4 ccr=80 pc=ff3434
TMR[0] old pri=4 ccr=a9 pc=ff343a
TMR[0] old pri=4 ccr=80 pc=ff3434
TMR[0] old pri=3 ccr=8 pc=ff2670
TMR[7] old pri=3 ccr=4 pc=ff266c
TMR[0] old pri=4 ccr=80 pc=ff3434
TMR[0] old pri=4 ccr=a9 pc=ff3430



廃材処理運動。これで何十年も死蔵されていた廃材がほぼなくなる。これはラ
ワン材です(一本、椹)。製材してみたところ27x24の角材に。



ここから設計してこんな感じの釣り棚にしようかと。棚板はこれもまた端材の 桧の集成材を。これは習作として敢えてちょっと今迄、難しそうで敬遠してた 構造、仕口に。

H8SX続き。割り込み時のスタックフレームついて確認します。今回割り込みモード2を 使うことにしたので割り込み時にはスタックに
高位アドレス
-------------

--
    PC
--

-------------
    CCR
-------------
  reserved
-------------
    EXR       <- SP
-------------
低位アドレス
のように積まれる。
テストルーチンでは、EXRの優先度を3にし、このTMRの優先度は4(3以下でブロッ ク)に設定した。
uint32_t
timer (int32_t argc __attribute__((unused)),
      const char *argv[] __attribute__((unused)))
{
  uint8_t os = intr_priority (3);
  iprintf ("old=%d new=%d\n", os, intr_status ());

  struct tmr_config tmr;
  tmr.TCORA = 0xff;
  tmr.TCORB = 0;
  tmr.TCCR = TMR_ICKS_div8192_RE;
  tmr.TCR = TMR_CKS_INTCLK_1024_8192 | TCR_CMIEA | TCR_CCLR_CMP_A;

  tmr_start (TIMER_CH_A, &tmr);

  printf ("timer %d\n", TMR_GET_CNT (0));

  return 0;
}
スタックフレームを上記の構造の通りに設定し、
struct stack_frame
{
  uint8_t exr;
  uint8_t reserved;
  uint32_t ccr_pc;
} __attribute__((__packed__));
そのフレームを表示するように。そのフレームからさらに退避するレジスタが あるのでその分の巻戻しをディスアセンブルしながら手作業で調整。
void
tmr7 ()
{
  static int i;
  addr_t sp;

  __asm volatile ("mov sp, %0" : "=r"(sp));//現在のスタックポインタを取得

  sp += 4 * 5; // ER0-ER4 割り込み時のスタックポインタまで巻戻し。
  struct stack_frame *sf = (struct stack_frame *)sp;
  iprintf ("ohayo7 %d EXR=%x CCR_PC=%x\n", i++, sf->exr, sf->ccr_pc);
  iprintf ("old pri=%d ccr=%x pc=%x\n", sf->exr & 0x7, (sf->ccr_pc >> 24) & 0xff,
	   sf->ccr_pc & 0xffffff);


  *TMR (7, TCSR) &= ~TCSR_CMFA;
  *TMR (7, TCSR); // dummy read.
  *TMR (7, TCNT) = 0;
}
想定通りの結果を確認。
Start address: 0xff37f4stack_start: 0xffc000
RAM data: 0xff4810-0xff4850 64byte
bss: 0xff4850-0xff4940 240byte
VBR: 0xff2000 (0xff2000)
MCU mode: 6
DTC: short-address mode
Internal RAM: enabled
External bus: enabled
Instruction fetch: 32bit
MAC instruction: non-saturation mode
Interrput Control mode: 2
PA7 clock output: On
Input clock: 12000000Hz, MDCLK=0
System clock: x4 (48000000Hz)
Peripheral clock: x2 (24000000Hz)
External clock: x4 (48000000Hz)
OHAYO Apr 21 2010 22:21:57
peripheral_power: fffdcc (4096) ->1
intc_priority: fffd62(8) 7->4
user> 
user> timer
old=0 new=3
timer 0
user> ohayo7 0 EXR=7b CCR_PC=ff2674
old pri=3 ccr=0 pc=ff2674
ohayo7 1 EXR=7b CCR_PC=ff2674
old pri=3 ccr=0 pc=ff2674
ohayo7 2 EXR=7b CCR_PC=ff2674
old pri=3 ccr=0 pc=ff2674
ohayo7 3 EXR=7b CCR_PC=4ff266c
old pri=3 ccr=4 pc=ff266c
ohayo7 4 EXR=7b CCR_PC=8ff2670
old pri=3 ccr=8 pc=ff2670
ohayo7 5 EXR=7b CCR_PC=8ff266e
old pri=3 ccr=8 pc=ff266e
ohayo7 6 EXR=7b CCR_PC=ff2674
old pri=3 ccr=0 pc=ff2674
tohayo7 7 EXR=7b CCR_PC=ff2674
old pri=3 ccr=0 pc=ff2674
esohayo7 8 EXR=7b CCR_PC=8ff2670



H8SX続き。割り込みまわりの優先度をきちんとまとめます。昨日のを書き換え
るとこんな感じのインターフェースにした。

uint32_t
timer (int32_t argc __attribute__((unused)),
      const char *argv[] __attribute__((unused)))
{

  peripheral_power (PWR_TMR_6_7, TRUE);
  intc_priority (INTPRI_TMR_4_5_6_7, INTPRI_2);

  *TMR (7, TCNT) = 0;
  *TMR (7, TCORA) = 0xff;
  *TMR (7, TCCR) = TMR_ICKS_div8192_RE;
  *TMR (7, TCR) = TMR_CKS_INTCLK_1024_8192 | TCR_CMIEA | TCR_CCLR_CMP_A;

  printf ("timer %d\n", *TMR (7, TCNT));

  return 0;
}
モジュールの電源はTMRユニット3(チャネル6,7)ごとの設定。割り込みの優先度 はTMRユニット2,3まとめての設定。割り込みベクタはチャネル4,5,6,7それぞれ 別々。
一番下の層ではハードウェア1:1の写像で実装するのがいい。ソフトウェア的に どうこうはその上の層。下手にソフトウェア的にいじってしまうとNetBSD/sh3 の下のような失敗をしてしまう。SH7709AとSH7750のなんとなく似てる部分を抽 出したために、その後の拡張性にとても問題が出てしまった。
今回はこんな感じで、プライオリティ設定レジスタ24bit + デバイスごとのシ フト(5bit)をパックして宣言した。テーブルにするとメモリを圧迫するのでこ ういう形式に。
// Interrupt Priprity Register A-R
// Priority 0(lowest)-7(highest)

#define	IPRA_ADDR	0xfffd40
#define	IPRB_ADDR	0xfffd42
#define	IPRC_ADDR	0xfffd44
// IPRD...H8SX/1655M only
#define	IPRE_ADDR	0xfffd48
#define	IPRF_ADDR	0xfffd4a
#define	IPRG_ADDR	0xfffd4c
#define	IPRH_ADDR	0xfffd4e
#define	IPRI_ADDR	0xfffd50
#define	IPRJ_ADDR	0xfffd52
#define	IPRK_ADDR	0xfffd54
#define	IPRL_ADDR	0xfffd56
#define	IPRM_ADDR	0xfffd58
#define	IPRN_ADDR	0xfffd5a
#define	IPRO_ADDR	0xfffd5c
//
#define	IPRQ_ADDR	0xfffd60
#define	IPRR_ADDR	0xfffd62

#define	IPR_MASK	0x7	//0: lowest, 7:highest priority.

__BEGIN_DECLS
#define	IPRADDR_MASK	0xffffff
#define	IPRSHIFT_MASK	0x1f
#define	IPRSHIFT_SHIFT	24

#define	IPR_ADDR(x)	((volatile uint16_t *)((x) & IPRADDR_MASK))
#define	IPR_SHIFT(x)	(((x) >> IPRSHIFT_SHIFT) & IPRSHIFT_MASK)

enum interrupt_priority
{
  INTPRI_0,	// Lowest
  INTPRI_1,
  INTPRI_2,
  INTPRI_3,
  INTPRI_4,
  INTPRI_5,
  INTPRI_6,
  INTPRI_7,	// Highest
};

enum interrupt_priority_module
{
#define	_(a, s)	IPR ## a ## _ADDR | (s << IPRSHIFT_SHIFT)
  // External pin
  INTPRI_IRQ0 = _(A, 12),
  INTPRI_IRQ1 = _(A, 8),
  INTPRI_IRQ2 = _(A, 4),
  INTPRI_IRQ3 = _(A, 0),
  INTPRI_IRQ4 = _(B, 12),
  INTPRI_IRQ5 = _(B, 8),
  INTPRI_IRQ6 = _(B, 4),
  INTPRI_IRQ7 = _(B, 0),
  INTPRI_IRQ8 = _(C, 12),
  INTPRI_IRQ9 = _(C, 8),
  INTPRI_IRQ10 = _(C, 4),
  INTPRI_IRQ11 = _(C, 0),
  // WDT
  INTPRI_WOVI = _(E, 8),
  // A/D Converter
  INTPRI_ADI0 = _(F, 8),
  // 16bit Timer Pulse Unit
  INTPRI_TPU0 = _(F, 4),
  INTPRI_TPU1 = _(F, 0),
  INTPRI_TPU2 = _(G, 12),
  INTPRI_TPU3 = _(G, 8),
  INTPRI_TPU4 = _(G, 4),
  INTPRI_TPU5 = _(G, 0),
  // 8bit Timer
  INTPRI_TMR0 = _(H, 12),
  INTPRI_TMR1 = _(H, 8),
  INTPRI_TMR2 = _(H, 4),
  INTPRI_TMR3 = _(H, 0),
  // DMA
  INTPRI_DMAC_DMTEND0 = _(I, 12),
  INTPRI_DMAC_DMTEND1 = _(I, 8),
  INTPRI_DMAC_DMTEND2 = _(I, 4),
  INTPRI_DMAC_DMTEND3 = _(I, 0),
  INTPRI_EXDMAC_EXDMTEND0 = _(J, 12),
  INTPRI_EXDMAC_EXDMTEND1 = _(J, 8),
  INTPRI_EXDMAC_EXDMTEND2 = _(J, 4),
  INTPRI_EXDMAC_EXDMTEND3 = _(J, 0),
  INTPRI_DMAC_DMEEND0_3 = _(K, 12),
  INTPRI_EXDMAC_EXDMEEND0_3 = _(K, 8),
  INTPRI_SCI0 = _(K, 4),
  INTPRI_SCI1 = _(K, 0),
  INTPRI_SCI2 = _(L, 12),
  INTPRI_SCI4 = _(L, 4),
  INTPRI_TPU6_TGI = _(L, 0),
  INTPRI_TPU6_TCI = _(M, 12),
  INTPRI_TPU7_TGI_AB = _(M, 8),
  INTPRI_TPU7_TGIV_TCIU = _(M, 4),
  INTPRI_TPU8_TGI_AB = _(M, 0),
  INTPRI_TPU8_TGIV_TCIU = _(N, 12),
  INTPRI_TPU9_TGI = _(N, 8),
  INTPRI_TPU9_TCI = _(N, 4),
  INTPRI_TPU10_TGI_AB = _(N, 0),
  INTPRI_TPU10_TGIV_TCIU = _(O, 12),
  INTPRI_TPU11_TGI_AB = _(O, 8),
  INTPRI_TPU11_TGIV_TCIU = _(O, 4),
  INTPRI_IIC2_0_1 = _(Q, 4),
  INTPRI_SCI5 = _(Q, 0),
  INTPRI_SCI6 = _(R, 12),
  INTPRI_TMR_4_5_6_7 = _(R, 8),
  INTPRI_USB = _(R, 4),
  INTPRI_ADC1_USBresume = _(R, 0),
#undef _
};

enum interrupt_priority intc_priority (enum interrupt_priority_module,
				       enum interrupt_priority);



enum interrupt_priority
intc_priority (enum interrupt_priority_module module,
	       enum interrupt_priority priority)
{
  volatile uint16_t *p = IPR_ADDR (module);
  int shift = IPR_SHIFT (module);

  cpu_status_t s = intr_suspend ();
  uint16_t r = *p;
  enum interrupt_priority opri = (r >> shift) & IPR_MASK;
  r &= ~(IPR_MASK << shift);
  r |= priority << shift;
  *p = r;
  intr_resume (s);
  printf ("%s: %A(%d) %d->%d\n", __FUNCTION__, p, shift, opri, priority);

  return opri;
}



H8SX続き。割り込みまわり。割り込みモード2(EXRで8段階の割り込みレベルの設定)を
使うことにします。
void
intc_init ()
{
  uint8_t r = *INTCR;

  // Interrupt cControl mode 2. (use EXR register)
  r &= ~(INTCR_MODE_MASK << INTCR_MODE_SHIFT);
  r |= INTCR_MODE_EXR;

  *INTCR = r;
}
割り込みベクタはLDSCRIPTにユーザ定義のinterruptsセクションを追加し、
MEMORY {
	start_vector	: o = 0xff2000, l = 0x4		/* unused */
	exceptions	: o = 0xff2010, l = 0x8		/* invalid inst, trace */
	interrupts	: o = 0xff201c, l = 0x3e4	/* -0xff2400 */
	ram		: o = 0xff2400, l = 0x9c00	/* -0xffc000 */
}

SECTIONS {
	 _stack_start = 0xffc000;

	 .start_vector :
	 {
	 	 _VBR = .;
	 	 *(.vector)
	 } > start_vector

	 .exceptions :
	 {
		*(.exceptions)
	 } > exceptions

	 .interrupts :
	 {
		*(.interrupts)
	 } > interrupts
...
void null_handler (void) __attribute__ ((interrupt_handler)); // place holder.

void nmi (void) __attribute__ ((weak, alias ("null_handler")));
void trapa0 (void) __attribute__ ((weak, alias ("null_handler")));
void trapa1 (void) __attribute__ ((weak, alias ("null_handler")));
void trapa2 (void) __attribute__ ((weak, alias ("null_handler")));
void trapa3 (void) __attribute__ ((weak, alias ("null_handler")));

void tmr0_cmia (void) __attribute__ ((weak, alias ("null_handler")));
void tmr0_cmib (void) __attribute__ ((weak, alias ("null_handler")));
void tmr0_ovf (void) __attribute__ ((weak, alias ("null_handler")));
void tmr1_cmia (void) __attribute__ ((weak, alias ("null_handler")));
void tmr1_cmib (void) __attribute__ ((weak, alias ("null_handler")));
void tmr1_ovf (void) __attribute__ ((weak, alias ("null_handler")));
void tmr2_cmia (void) __attribute__ ((weak, alias ("null_handler")));
void tmr2_cmib (void) __attribute__ ((weak, alias ("null_handler")));
void tmr2_ovf (void) __attribute__ ((weak, alias ("null_handler")));
void tmr3_cmia (void) __attribute__ ((weak, alias ("null_handler")));
void tmr3_cmib (void) __attribute__ ((weak, alias ("null_handler")));
void tmr3_ovf (void) __attribute__ ((weak, alias ("null_handler")));
void tmr4 (void) __attribute__ ((weak, alias ("null_handler")));
void tmr5 (void) __attribute__ ((weak, alias ("null_handler")));
void tmr6 (void) __attribute__ ((weak, alias ("null_handler")));
void tmr7 (void) __attribute__ ((weak, alias ("null_handler")));

#define	INTERRUPT_BASE	7

const interrupt_handler_t vector_table[]
__attribute__ ((section (".interrupts"))) =
{
  nmi,		/*  7 0x1c NMI */
  trapa0,	/*  8 0x20 TRAPA#0 */
  trapa1,	/*  9 0x24 TRAPA#1 */
  trapa2,	/* 10 0x28 TRAPA#2 */
  trapa3,	/* 11 0x2c TRAPA#3 */

  /* 80-255 internal interrupts. */
  [116 - INTERRUPT_BASE] = tmr1_cmia,
  [117 - INTERRUPT_BASE] = tmr1_cmib,
  [118 - INTERRUPT_BASE] = tmr1_ovf,
  [119 - INTERRUPT_BASE] = tmr1_cmia,
  [120 - INTERRUPT_BASE] = tmr1_cmib,
  [121 - INTERRUPT_BASE] = tmr1_ovf,
  [122 - INTERRUPT_BASE] = tmr2_cmia,
  [123 - INTERRUPT_BASE] = tmr2_cmib,
  [124 - INTERRUPT_BASE] = tmr2_ovf,
  [125 - INTERRUPT_BASE] = tmr3_cmia,
  [126 - INTERRUPT_BASE] = tmr3_cmib,
  [127 - INTERRUPT_BASE] = tmr3_ovf,


  [228 - INTERRUPT_BASE] = tmr4,
  [229 - INTERRUPT_BASE] = tmr5,
  [230 - INTERRUPT_BASE] = tmr6,
  [231 - INTERRUPT_BASE] = tmr7,

};

void
null_handler ()
{
}
のように設定。なにも定義しなければnull_handlerが登録され、定義されてい ればそれがベクタとして登録されます。例外と割り込みの境界は変更するかも。 狭義にはCPU実行時に内部から来るのが例外、外部から来るのが割り込みなのだ けど、ベクタの番号の割当て上、きちっとは分けれなかったりもするので微妙。
H8SX/1655では16bitのタイマパルスユニットが6ユニット12チャネルと8bitタイ マが4ユニット8チャネルある。このタイマの多さはとてもうれしい。カーネル では8bitタイマを使います。ユニット内の2チャネルを合わせて16bitとするの もあり。これらの8bitタイマはどれも同じというわけではない。
Unit			0	0	1	1	2	2	3	3
Channel			0	1	2	3	4	5	6	7
---------------------------------------------------------------------------------
 internal clock		x	x	x	x	x	x	x	x
---------------------------------------------------------------------------------
 external clock		x	x	-	-	x	x	x	x
---------------------------------------------------------------------------------
 compare match intr.	x	x	x	x	*1	*1	*1     *1
---------------------------------------------------------------------------------
 overflow intr.		x	x	x	x	-	-	-	-
---------------------------------------------------------------------------------
 SCI5,6 clock out.	-	-	x	x	-	-	-	-
---------------------------------------------------------------------------------
 DTC kick		x	x	x	x	-	-	-	-
---------------------------------------------------------------------------------
 ADC kick		x	-	?	-	x	-	?	-
このように機能がそれぞれ微妙に違う。データシートの記述にも不備がある (ADCとの連携)。カーネル内では一番低機能なユニット3(チャネル6,7)を使用す ることにした。
uint32_t
timer (int32_t argc __attribute__((unused)),
      const char *argv[] __attribute__((unused)))
{
//H8SX/1655ではメモリアクセス周り以外の周辺デバイスは全てオフになっているので
//まず電源を入れる。
  peripheral_power (PWR_TMR_6_7, TRUE);

//割り込みレベルを設定。
#define	IPRR	((volatile uint16_t *)0xfffd62)
  *IPRR = (7 << 8);

  *TMR (7, TCNT) = 0;
//ユニット3,4(チャネル4,5,6,7)ではオーバーフローの割り込みはないので
//コンペアマッチで割り込みを出し、そのマッチでTCNTをクリアさせます。
  *TMR (7, TCORA) = 0xff;
  *TMR (7, TCCR) = TMR_ICKS_div1024_RE;
  *TMR (7, TCR) = TMR_CKS_INTCLK_1024_8192 | TCR_CMIEA | TCR_CCLR_CMP_A;

  printf ("timer %d\n", *TMR (7, TCNT));

  return 0;
}

//とりあえずgcc拡張で割り込みハンドラを宣言。
void tmr7 (void) __attribute__ ((interrupt_handler));

void
tmr7 ()
{
  static int i;

//TCNTは自動的にクリアされるので割り込みフラグのみクリア
  *TMR (7, TCSR) &= ~TCSR_CMFA;
//このダミーリードはデータシート参照。
  *TMR (7, TCSR); // dummy read.

  iprintf ("ohayo %d\n", i++);
}
gcc拡張の割り込みハンドラ宣言で割り込みルーチンになっていることを確認 (gcc-4.3.2)。OK。
 __attribute__ ((interrupt_handler))あり

00ff3036 <_tmr7>:
  ff3036:	01 30 6d f0 	stm.l	er0-er3,@-sp
  ff303a:	6a f0 00 ff 	mov.b	#0x0,@0xffea59:32
  ff303e:	ea 59 
  ff3040:	7a 03 00 ff 	mov.l	#0xffea53,er3
  ff3044:	ea 53 
  ff3046:	68 3a       	mov.b	@er3,r2l
  ff3048:	ea bf       	and.b	#0xbf,r2l
  ff304a:	68 ba       	mov.b	r2l,@er3
  ff304c:	68 3b       	mov.b	@er3,r3l
  ff304e:	01 00 6b 23 	mov.l	@0xff4000:32,er3
  ff3052:	00 ff 40 00 
  ff3056:	0f b2       	mov.l	er3,er2
  ff3058:	0a 9a       	add.l	#0x1,er2
  ff305a:	01 00 6b a2 	mov.l	er2,@0xff4000:32
  ff305e:	00 ff 40 00 
  ff3062:	01 00 6d f3 	mov.l	er3,@-er7
  ff3066:	7a 74 00 ff 	mov.l	#0xff3c6c,@-er7
  ff306a:	3c 6c b7 00 
  ff306e:	1a 91       	sub.l	er1,er1
  ff3070:	01 00 6b 20 	mov.l	@0xff3fa4:32,er0
  ff3074:	00 ff 3f a4 
  ff3078:	5e ff 24 c4 	jsr	@0xff24c4:24
  ff307c:	7a 1f 00 08 	add.l	#0x8,er7
  ff3080:	56 33       	rte/l	er0-er3

 __attribute__ ((interrupt_handler))なし

00ff3036 <_tmr7>:
  ff3036:	6a f0 00 ff 	mov.b	#0x0,@0xffea59:32
  ff303a:	ea 59 
  ff303c:	7a 03 00 ff 	mov.l	#0xffea53,er3
  ff3040:	ea 53 
  ff3042:	68 3a       	mov.b	@er3,r2l
  ff3044:	ea bf       	and.b	#0xbf,r2l
  ff3046:	68 ba       	mov.b	r2l,@er3
  ff3048:	68 3b       	mov.b	@er3,r3l
  ff304a:	01 00 6b 23 	mov.l	@0xff3ffc:32,er3
  ff304e:	00 ff 3f fc 
  ff3052:	0f b2       	mov.l	er3,er2
  ff3054:	0a 9a       	add.l	#0x1,er2
  ff3056:	01 00 6b a2 	mov.l	er2,@0xff3ffc:32
  ff305a:	00 ff 3f fc 
  ff305e:	01 00 6d f3 	mov.l	er3,@-er7
  ff3062:	7a 74 00 ff 	mov.l	#0xff3c68,@-er7
  ff3066:	3c 68 b7 00 
  ff306a:	1a 91       	sub.l	er1,er1
  ff306c:	01 00 6b 20 	mov.l	@0xff3fa0:32,er0
  ff3070:	00 ff 3f a0 
  ff3074:	5e ff 24 c4 	jsr	@0xff24c4:24
  ff3078:	7a 1f 00 08 	add.l	#0x8,er7
  ff307c:	54 70       	rts	
もう一つの小物箱にもオスモ塗ってみた。色合いがいい。しかしこの山桜の幹 の部分はほとんど捨てられてしまったのだ...TT




今日は特に目的もなく気まぐれ木工。これは去年切り倒されてしまった小屋の
脇の山桜。小屋との情景が気にいってたのに。おまけに切り刻んで捨てようと
してたので、とっておいたもの。

まずはスライド丸ノコで切ってみる。びっくりする程、緻密だ。

バンドソーで縦に挽こうとしたところ硬過ぎて、刃まかせに切るしかなくなってしまい斜めになってしまった。

ベルトサンダーで面だし。

これだけ堅ければ、フライス加工できるかも..。と試してみると、十分いける。 回転数もアルミのセッティングのまま。フィニッシュだけ回転あげるともっと いいだろう。クランプしてもだんだん歪んで押さえが弱くなってしまうのでま めに増し締めが必要。

小物入れにしようかな。とスチールウールで樹皮を磨き。

机の上に置いてみると、場末の土産屋に並んでる工芸品臭さに耐えられなくな り、もう一度フライスに。

さらに意味不な物体に。

久々に木工旋盤をひっぱりだしてきて、これもまた山桜を製材してみた。

なんに使うかは未定。中ぐりしたいのだけど設備がない。金工旋盤にのせる手 もあるけどチャッキングが難しい。

さて、半分に割ったもう一方側を。自然の姿を活かすというのはよっぽどセン スがない限り難しいことがわかったので、基本は幾何学的に。

ちょっとだけ自然のまま。これはいいんでない? 広葉樹のカッチリ感はいい。 SPFじゃ逆立ちしてもこうはいかない。そろそろ広葉樹デビューしたくなってき た。
桜をフライス加工するの、かなり楽しいです。左手で掃除機をエンドミルにあ てて右手でハンドル廻せば大鋸屑の飛散はほとんどなし。

意味不物体、表面の皮を削って、オスモを塗ってみた。広葉樹とオイル仕上げ は合うね。なるほど。とても納得した。




朝起きると!!! 苗が心配。ナスはまだ双葉なので夜は部屋の中に入れておいた
のだけど、トマトとトウモロコシが...。



昨日、昼前に本田谷田部に注文したSPF材が朝一で届いた。速い! 早めに荒木取 りしておきます。そしてこの段階でさらに設計変更。1600mmも一本でとるのは 難しいだろう。

ちょっと信じられない量の部材。手前の54本ある。構造的にはこの横桟はなく てもよくて、デザイン的に入れたかったものなのだけど、これは...。1600mm一 本はどうか、ということで3本に分割したらこの爆発だ。ゆっくりやりましょう。

失敗覚悟の挑戦で、天板1700mmを厚さ16mmで接いでみた。できる限りねじれて いない板を選んで、製材。やはりどうしても反りはあるので、端に捨てのビス ケットを入れておけばよかったかな。
接ぎ面はいつもはルーターで処理しているところを手押しカンナだけにしてみ た。これも精度が出なくてよくない。最低でも一ヶ月はこの状態にしておかな いと確実にはがれそう。一ヶ月もクランプしておくとむしろボンドの接合面の 方が強いくらいになる。
どうもビスケットジョインタの保持が甘くて目違いがひどいようだ。地べたで 作業だからな...。とはいえ据え置きの作業台など置ける場所もなく。テーブル ソーの上にかぶせる台を作っておくか。




整理棚続き。なんとか設計できた。いつも通りqcad2で。イメージが頭に残って
るうちに手描きで3D見取図に。工程を想定しながら描いてみて「これ、ちょっ
ときついだろ...」と、またCADに戻ったり。



H8SX続き。H8SXは最近のデバイスらしくモジュールの電源はデフォルトで入っ ていないので、電源周りを書いて、次はタイマ。いい加減タイマデバイスを書 くの厭きた。つまらないし。とはいえ書かずには先に進まないデバイスだ。
厭きたといえば、FF11がPS2だけだった頃、変換が弱かった。アッシュクラブは 圧縮ラブ。粘菌なんて変換できず、年金。要塞に入ってすぐの階段で、あの頃 は骨をやってた頃だ。稼ぎもよくなく、じめっとした感じで無言で狩りが進ん でいたところで、プラーが突然「てか、このPT秋田w」LS誤爆だ。PTは凍りつく。 ここですかさずプラーは「秋田出身の人いる?」、おぉなかなかうまい切り返し とも思いつつ、みんなわかってる。そこで終了。ジュノに帰った。


手押しカンナ(JT-160)の替え刃をオフコーポレーションから通販して、交換し
ました。外してみると完全に刃が丸まっていた。



jun@&ふかうみさんにジャンクを引きとってもらいました。ありがとうござい ました。捨ててしまうには心残りなのでよかった。


整理棚続き。この27箱を収めなければ。



まずは設計開始。思いつくままに設計すると「...それどうやって加工するの?」 ということになってしまう。そこでまた設計変更でなかなか進まない。これは 結構な大作になりそうだ。



H8SX続き。割り込みまわり。H8ファミリでは割り込みのモードが四種類ある。
モード0はH8/300のモードで(例えばH8/3664,3694)、CCRのIビットだけで全ての
割り込みを許可/保留にするもの。モード1はH8/300Hで追加されたモードで、
CCRのUIビットで二段階の優先度をつけれるようにしたもの。このUIビットは設
定でユーザ定義のビットとすることもできて、マイOSではH8/3052ではユーザ定
義のビットとしてデバッグに使っている。モード2はH8S以降にできたモードで
CCRの他にEXRレジスタが追加され、そこで3bitで優先度を設定できる。このモー
ドではCCRのIビットは無効。モード3では、モード2に加えてCCRのIビットも有
効。

H8SX/1655ではモード0とモード2が使える。モード0で十分だとは思うけれど、 モード2でいくことにした。
モード2の場合、割り込みが入るとハードウェアで割り込みレベルを自動的に、 その割り込みレベル以下を保留にしてくれる。ちなみにこの動作はSH4Aでも設 定すれば可能。割り込みベクタに突入したところで高優先度の割り込みは入る 状態なので、多重割り込みを検出するのにスタックに積まれたEXRの値を調べな いといけない。多重割り込みであれば終了時にコンテキストスイッチしないよ うにするために。
#define	BYTE_ORDER		BIG_ENDIAN
#define	H8_INTR_CONTROL_MODE	2

__BEGIN_DECLS
void intr_enable (void);
void intr_disable (void);
cpu_status_t intr_suspend (void);// return old value
cpu_status_t intr_resume (cpu_status_t);// return current value
// Optional
cpu_status_t intr_status (void);// return current value
#if H8_INTR_CONTROL_MODE != 0
cpu_status_t intr_priority (cpu_status_t);// return old value
#endif

__END_DECLS

#if H8_INTR_CONTROL_MODE == 0 || H8_INTR_CONTROL_MODE == 1 || \
  H8_INTR_CONTROL_MODE == 3
// Wait 2 state for the new value becomes valid.
// nopが二つ続くのはandc.b,orc.bの設定が有効になるのが2ステート後だから。
// ハードウェア的に割り込みが有効になるのは3ステート後。
#define	intr_enable()	__asm volatile ("andc.b	#0x7f, ccr\nnop\nnop")
#define	intr_disable()	__asm volatile ("orc.b	#0x80, ccr\nnop\nnop")
#elif H8_INTR_CONTROL_MODE == 2
#define	intr_enable()	__asm volatile ("andc.b	#0xf8, exr\nnop\nnop")
#define	intr_disable()	__asm volatile ("orc.b	#0x07, exr\nnop\nnop")
#else
#error "specify interrupt control mode."
#endif


// Interrupt control mode 2.
	.h8300sx
	.section .text

	.global _intr_status
_intr_status:
	/*
	uint8_t
	intr_status ()
	{
	  return *exr & 0x7;
	}
	*/
	stc.b	exr, r0l
	and.b	#0x7, r0l
	rts

	.global _intr_suspend
_intr_suspend:
	/*
	uint8_t
	intr_suspend ()
	{
	  r0 = *exr & 0x7;
	  *exr |= 0x7;
	  return r0;
	}
	*/
	stc.b	exr, r0l
	orc	#0x7, exr
	and.b	#0x7, r0l
	rts

	.global _intr_resume
_intr_resume:
	/*
	uint8_t
	intr_resume (uint8_t r0)
	{
	   r1 = *exr & 0xf8;
	   r0 |= r1;
	   *exr = r0;
	   return r0 & 0x7;
	}
	*/
	stc.b	exr, r1l
	and.b	#0xf8, r1l
	or.b	r1l, r0l
	ldc.b	r0l, exr
	and.b	#0x7, r0l
	rts

	.global _intr_priority
_intr_priority:
	/*
	uint8_t
	intr_priority (uint8_t r0)
	{
	  r2 = r0;
	  r1 = *exr;
	  r0 = r1 & 0x7;
	  r1 &= 0xf8;
	  r1 |= r2;
	  *exr = r1;
	  return r0;
	}
	*/
	mov.b	r0l, r2l
	stc.b	exr, r1l
	mov.b	r1l, r0l
	and.b	#0x7, r0l
	and.b	#0xf8,r1l
	or.b	r2l, r1l
	ldc.b	r1l, exr
	rts
これでテスト。
uint32_t
interrupt (int32_t argc __attribute__((unused)),
      const char *argv[] __attribute__((unused)))
{
  cpu_status_t s0, s1;

  intr_disable ();
  printf ("%d = 7 disabled\n", intr_status ());
  intr_enable ();
  printf ("%d = 0 enabled\n", intr_status ());
  s0 = intr_suspend ();
  printf ("%d = 0 %d = 7 suspended\n", s0, intr_status ());
  s1 = intr_suspend ();
  printf ("%d = 7 %d = 7 \tsuspended\n", s1, intr_status ());
  s1 = intr_resume (s1);
  printf ("%d = 7 %d = 7 \tresumed\n", s1, intr_status ());
  s0 = intr_resume (s0);
  printf ("%d = 0 %d = 0 resumed\n", s0, intr_status ());

  intr_priority (2);
  printf ("%d = 2 priority\n", intr_status ());

  s0 = intr_priority (4);
  printf ("%d = 2 %d = 4 \tpriority\n", s0, intr_status ());
  s1 = intr_priority (3);
  printf ("%d = 4 %d = 3 \t\tpriority\n", s1, intr_status ());
  s1 = intr_resume (s1);
  printf ("%d = 4 %d = 4 \t\tpriority\n", s1, intr_status ());
  s0 = intr_resume (s0);
  printf ("%d = 2 %d = 2 \tpriority\n", s0, intr_status ());

  intr_disable ();
  printf ("%d = 7 disabled\n", intr_status ());

  return 0;
}

H8SX/1655 Simple Monitor Build Apr 13 2010 20:15:53
mon> l
~>Local file name? a.mot
842 lines transferred in 3 seconds 
!
Read 18838 byte. success
Start address: 0xff3224stack_start: 0xffc000
RAM data: 0xff3dd8-0xff3e0c 52byte
bss: 0xff3e0c-0xff3eb8 172byte
VBR: 0xff2000 (0xff2000)
MCU mode: 6
DTC: short-address mode
Internal RAM: enabled
External bus: enabled
Instruction fetch: 32bit
MAC instruction: non-saturation mode
PA7 clock output: On
Input clock: 12000000Hz, MDCLK=0
System clock: x4 (48000000Hz)
Peripheral clock: x2 (24000000Hz)
External clock: x4 (48000000Hz)
OHAYO Apr 13 2010 21:33:53
user> 
user> interrupt
7 = 7 disabled
0 = 0 enabled
0 = 0 7 = 7 suspended
7 = 7 7 = 7     suspended
7 = 7 7 = 7     resumed
0 = 0 0 = 0 resumed
2 = 2 priority
2 = 2 4 = 4     priority
4 = 4 3 = 3             priority
4 = 4 4 = 4             priority
2 = 2 2 = 2     priority
7 = 7 disabled
user> 

OKかな。


H8SX続き。今迄はブート状態デフォルトの外部クロック(このボードの場合
12MHz)がそのままCPUクロックと周辺デバイスクロックになっていた。
H8SX/1655の場合、CPUクロックは8〜50MHz、周辺デバイスクロックは8〜35MHz
なので、それぞれ48MHz、24MHzに設定することにします。

この設定が変更されるとSCI4のBRR(Bit Rate Register)の設定も変更することに なるのだけれど、これが微妙だ。Pck 24MHzだと
    BRR     bps           誤差         動作
-------------------------------------------
     77:     9600->77.125 (0.16%)	OK
     19:    38400->18.531 (-2.34%)	OK
     12:    57600->12.021 (0.16%)	OK
     6:    115200->5.510  (-6.99%)	NG
     2:    230400->2.255  (8.51%)	NG
となって57600bpsが限界。H8/3052のPck25MHzだと
 80:     9600->80.380 (0.47%)
 19:    38400->19.345 (1.73%)
 13:    57600->12.563 (-3.12%)
  6:   115200->5.782 (-3.12%)
  2:   230400->2.391 (13.03%)
で、ベストではないけれど、115200bpsで実用になったのに。
LPC2388のシリアルだと設定パラメタは多くて(4つ)その選定はとても面倒なか わりに
// { 0, 78, 1 | (2 << 4), 0 }; // PCLK 18.0000MHz 9615bps error 0.16%
// { 0, 39, 1 | (2 << 4), 0 }; // PCLK 18.0000MHz 19231bps error 0.16%
// { 0, 19, 7 | (13 << 4), 0 }; // PCLK 18.0000MHz 38487bps error 0.23%
// { 0, 13, 1 | (2 << 4), 0 }; // PCLK 18.0000MHz 57692bps error 0.16%
// { 0, 6, 5 | (8 << 4), 0 }; // PCLK 18.0000MHz 115385bps error 0.16%
// { 0, 3, 5 | (8 << 4), 0 }; // PCLK 18.0000MHz 230769bps error 0.16%
このくらいの精度でビットレートを設定できる。しかし例えばH8SX/1655でPck 18MHzだと設定パラメタは二つ(CKSとBRR)で、
 58:     9600->57.594 (-0.69%)
 14:    38400->13.648 (-2.34%)
  9:    57600->8.766 (-2.34%)
  4:   115200->3.883 (-2.34%)
  2:   230400->1.441 (-18.62%)
この選択しかない。せめてCKSの設定をもうちょっと高ビットレートの 領域にふってくれればいいのに。
とりあえず、ロムモニタを今迄の38400bpsから57600bpsに変更。RAMは40KBしか ないので、実のところビットレートはそんなにやきもきする問題じゃない。
stack_start: 0xffc000
ROM data: 0x1a70-0x1ab4
RAM data: 0xffbc00-0xffbc44 68byte
bss: 0xffbc44-0xffbcfc 184byte
VBR: 0x0 (0x0)
MCU mode: 6
DTC: short-address mode
Internal RAM: enabled
External bus: enabled
Instruction fetch: 32bit
MAC instruction: non-saturation mode
PA7 clock output: On
System clock: x4
Peripheral clock: x2
External clock: x4
H8SX/1655 Simple Monitor Build Apr 12 2010 21:05:26
mon> l
~>Local file name? a.mot
688 lines transferred in 3 seconds 
!
Read 15381 byte. success
Start address: 0xff2ffastack_start: 0xffc000
RAM data: 0xff3918-0xff3940 40byte
bss: 0xff3940-0xff39d0 144byte
VBR: 0xff2000 (0xff2000)
MCU mode: 6
DTC: short-address mode
Internal RAM: enabled
External bus: enabled
Instruction fetch: 32bit
MAC instruction: non-saturation mode
PA7 clock output: On
System clock: x4
Peripheral clock: x2
External clock: x4
OHAYO Apr 12 2010 19:42:44
user> 
user> 



机続き。#600で水砥ぎします。本当は#400からやった方がいい。塗膜を残しな
がらどこまで気合いで削れるかが勝負なのだけど、いつも日和ってしまう。地
肌まで出ると泣けるし。ベッタリ吹いたけれども、下地がそんなに平滑じゃな
いので地肌が出てしまう可能性が高いんだ。

天板はラビングコンパウンドをポリッシャーでバフり。フレームは手でシコシ コ磨き。

最終工程は引出しの組み付け。慎重にレールを取り付け。箱の横幅が拡過ぎて この段階から箱を手押しカンナにかけて調整することに...。以前使ったレール とちょっと仕様が違っていて4mmほど拡かった。

完成。が、天板をM8のボルトで取りつける際、ボルトを下に落としてしまい、 貫に凹み傷がついてしまった...。ショック過ぎる。塗装で表面硬度を上げたと いっても所詮はSPF。すぐ凹んでしまう。
この机、3つ作って、一作目はニス仕上げ、二作目はオイル仕上げ、この三作目 は二液アクリルポリウレタン。うーん、見た目もこれが一番いいな。パリッと してる。

この机は姪にあげる予定。



机続き。三回目の塗装。#400で削ってプレソルベントで削り屑を掃除してマル
チトップクリアーQ 1:10タイプを、主剤150gで。塗装はこれで終了。



トマトがちょっと本葉が見えてきたのでポット上げ。やっぱり発芽時に被せて いた新聞紙をとり忘れてモヤシ状態にしたのがダメージきついような気がする。 ナスはまだ双葉だけの状態なのでそのまま。

キャベツ残り3株。真中のはなかなか中が詰まってきた。横のは周りの葉っぱばっ かり育ってしまって。

H8SX続き。putc,getcができれば後はMIルーチンにつなげてsrecをRAMに載せる ローダまで。これでやっとフラッシュの書き込み回数制限を気にせずにプログ ラムが組める。今日はブート状態の状況を確認。H8/300では割り込みベクタが 固定だったので、RAMにロードしたプログラムのためにリダイレクトするのに結 構手間がかかったけれど、H8SXではVBR(Vector Base Register)で任意の場所に 設定できるので、とても楽だ。ldscriptで
OUTPUT_FORMAT ("elf32-h8300")
OUTPUT_ARCH (h8300:h8300sx)

/* For program loaded by monitor.  */

MEMORY {
	start_vector	: o = 0xff2000, l = 0x4		/* unused */
	intvecs		: o = 0xff2004, l = 0x3fc	/* -0xff2400 */
	ram		: o = 0xff2400, l = 0x9c00	/* -0xffc000 */
}

SECTIONS {
	 _stack_start = 0xffc000;

	 .start_vector :
	 {
	 	 _VBR = .;
	 	 *(.vector)
	 } > start_vector

	 .intvecs :
	 {
		*(.intvecs)
	 } > intvecs

	 .text :
	 {
	 	 *(.text*)
		 *(.rodata*)
		 . = ALIGN (4);
	 } > ram

	 .data :
	 {
	 	 _data_start = .;
	 	 *(.data*)
		 _data_end = .;
	 } > ram

	 .bss :
	 {
	         _bss_start = .;
	      	 *(.bss*)
	 } > ram
	_bss_end = .;

	/DISCARD/ : { *(.*debug*) }
	/DISCARD/ : { *(.comment) }
}
のようにVBRにフックをかけておいて(leading underscore)
  extern char VBR[];
  __asm volatile ("ldc.l %0, vbr" :: "r"(VBR));
これで済む。
ROM data: 0x1560-0x15a4
RAM data: 0xffbc00-0xffbc44 68byte
bss: 0xffbc44-0xffbcf8 180byte
H8SX/1655 Simple Monitor Build Apr 10 2010 07:44:27
mon> l
~>Local file name? a.mot
664 lines transferred in 4 seconds 
!
Read 14841 byte. success
Start address: 0xff2fe8
stack_start: 0xffc000
RAM data: 0xff3858-0xff3880 40byte
bss: 0xff3880-0xff390c 140byte
VBR: 0xff2000 (0xff2000)
MCU mode: 6
DTC: short-address mode
Internal RAM: enabled
External bus: enabled
Instruction fetch: 32bit
MAC instruction: non-saturation mode
PA7 clock output: On
System clock: x1
Peripheral clock: x1
External clock: x1
OHAYO Apr 10 2010 21:46:41
user> 
user> test o ha yo
0:test
1:o
2:ha
3:yo
user> 



CR85整備。シリンダヘッド、定盤に合わせてみたところちょっとまた内側が浮
きあがっていた。ヘッドは結構歪むもんなんだな。



ピストン、シリンダともにまぁOK。ちょっと傷ついたけれど。ここ最近、シリ ンダのメッキ弱いよ。

ヘッドが歪むなら...と昔のシリンダをひっぱりだして軽く定盤にあててみたところ、多少排気側が凹んでいるものの、そう問題ないことがわかった。

H8SX続き。サバイバルキットはできたのでマイOS化。シェルプロンプトあたり のデバイス選択に何度やっても自分でハマっている。ターゲットのRAM容量から あまり富豪的に解決することもできないので難しい。あ と、__attribute__((noreturn))の関数でリターンすると本当にぶっ壊れるのね。 LINT程度だと思ってたよ。



あの日、朝、券売で20年振りに見かけたんだ。特スポのシステムが変わって混 乱し殺気だっていたし、はやく券買ってマシンのセットアップしたい気持ちも あって、後で探しにいって驚かそうかと思っていた。A1走行後、救急車の音が してた。パドックに探しにプラプラいこうかとすると救護室のドアが全開だっ たのはそうだったんだろう。死ぬとわかってたなら、あの時声かけたのに。一 期一会といってもな...。話したかった。冥福を祈る。


机続き。まずはプレソルベントで掃除。エアブローしても結構な粉塵が表面に
残ってる。ロックエースのマルチトップクリアーQ 10:1型を主剤150g、トータ
ル180g程度で、ガン吹き。枠組み部分なんかはほとんどミストになってしまう
ので効率悪い。2回ほど吹いて使い切り。これは目止めくらい。



H8SX続き。SCI4で通信します。H8SXは最近のチップだけあって省電力設計がしっ かりしてる。日立のシリアルといえばSCI。このSCIはH8/3052に近い。同じじゃ ないけど。SCIと名前がついていてもそれはハードの基本構造だけ同じというだ けなので毎回きっちり調べないといけない。周辺デバイスは融通無碍なんだよね。
putc/getcまでできれば、後はお気楽だ(LEDに較べれば)。
#include <types.h>

#define	PM3_DDR	((volatile uint8_t *)0xffee50)
#define	PM3_DR	((volatile uint8_t *)0xffee51)

// ビット構成はH8/3052と同じ。
#define	_SCI4_BASE	0xfffe90
/* Serial Mode Register R/W */
#define	_SCI_SMR	0
#define	SMR_CM		0x80	/* Communication Mode (1:clock)*/
#define	SMR_CHR		0x40	/* Character Length (0:8bit) */
#define	SMR_PE		0x20	/* Parity Enable */
#define	SMR_PM		0x10	/* Parity Mode (0:even) */
#define	SMR_STOP	0x08	/* Stop bit length (0: 1stopbit) */
#define	SMR_MP		0x04	/* Multi Processor mode */
#define	SMR_CKS1	0x02	/* ClocK Select 1 */
#define	SMR_CKS0	0x01	/* ClocK Select 0 */
/* Bit Rate Register */
#define	_SCI_BRR	1
/* Serial Control Register R/W */
#define	_SCI_SCR	2
#define	SCR_TIE		0x80	/* Transmit Interrupt Enable */
#define	SCR_RIE		0x40	/* Receive Interrupt Enable */
#define	SCR_TE		0x20	/* Transmit Enable */
#define	SCR_RE		0x10	/* Receive Enable */
#define	SCR_MPIE	0x08	/* Multi Processor Interrupt Enable */
#define	SCR_TEIE	0x04	/* Transmit End Interrupt Enable */
#define	SCR_CKE1	0x02	/* ClocK Enable 1 */
#define	SCR_CKE0	0x01	/* ClocK Enable 0 */
/* Transmit Data Register R/W */
#define	_SCI_TDR	3
/* Serial Status Register R/(W) */
#define	_SCI_SSR	4
#define	SSR_TDRE	0x80	/* Transmit Data Register Empty (0 write only)*/
#define	SSR_RDRF	0x40	/* Receive Data Register Full (0 write only)*/
#define	SSR_ORER	0x20	/* OverRun ERror (0 write only)*/
#define	SSR_FER		0x10	/* Framing ERror (0 write only)*/
#define	SSR_PER		0x08	/* Parity ERror (0 write only)*/
#define	SSR_TEND	0x04	/* Transmit END (read only)*/
#define	SSR_MPB		0x02	/* MultiProcessor Bit (read only)*/
#define	SSR_MPBT	0x01	/* MultiProcessor Bit Transfer */

#define	SSR_ERR_BITS	(SSR_ORER | SSR_FER | SSR_PER)
/* Receive Data Register */
#define	_SCI_RDR	5

//これはH8/3052にはなくH8SX/1655の設定。
/* Smart Card Mode Register */
#define	_SCI_SCMR	6
#define	SCMR_SDIR	0x08
#define	SCMR_SINV	0x04
#define	SCMR_SMIF	0x01	/* SMart card InterFace Select */

#define	SCI(n, r)	((volatile uint8_t *)_SCI ## n ## _BASE + _SCI_ ## r)


// このレジスタを設定しないと周辺モジュールのポートが入力設定にならない
/* Input buffer Control Register  1:Enable, 0:Disable */
#define	P6_ICR		((volatile uint8_t *)0xfffb95)

// 省電力用のモジュールの有効化の設定。
/* Module SToP Control Register B */
#define	MSTPCRB		((volatile uint16_t *)0xfffdca)


void sci4_init (void);
int8_t sci4_getc (void);
void sci4_putc (int8_t);

void
machine_startup ()
{
  int8_t c;

  *PM3_DDR |= 8;
  *PM3_DR &= ~8;	// LED on.

  sci4_init ();
  sci4_putc ('o');
  sci4_putc ('h');
  sci4_putc ('a');
  sci4_putc ('y');
  sci4_putc ('o');
  sci4_putc ('\r');
  sci4_putc ('\n');
  while ((c = sci4_getc ()))
    sci4_putc (c);

  // Error. SCI4の受信でエラーがあればここに来ます。
  *PM3_DR |= 8;		// LED off.
    ;
  /*NOTREACHED*/
}

void
sci4_init ()
{
  // Start SCI4 module. SCI4はデフォルトでは無効化されているので有効にします。
  *MSTPCRB &= ~(1 << 12);

  //まず受信/送信を無効にします
  // Disable transmit/receive.
  *SCI (4, SCR) &= ~(SCR_TE | SCR_RE);

  //周辺デバイスとしてポートを入力に使うので入力バッファの設定をします。
  // Setup Input buffer. Use internal clock.
  *P6_ICR &= ~1;	//P60: SCI4 TxD
  *P6_ICR |= 2;		//P61: SCI4 RxD

  //このモジュールの基本クロックを設定します。
  // Clock select
  *SCI (4, SCR) &= ~(SCR_CKE0 | SCR_CKE1); // Peripheral clock / 1

  //シリアル通信のプロトコルを設定。ここでは調歩同期8bit Non Parity 1 Stop bit.
  // Tx/Rx Format.
  *SCI (4, SCMR) = 0;	// Clocked synchronous mode.
  *SCI (4, SMR)	= 0;	// 8N1

  //ビットレートを決めるには周辺クロックがいくつかを決めないといけない。
  //この基板の場合入力クロックは12MHzでMD_CLK=0。
  //SCKCRデフォルトの場合CPUクロックは1/1で12MHz,周辺クロックも1/1で12MHz
  // Bit rate.
  // Input Clock: 12MHz
  // CPU clock: 12MHz
  // Peripheral clock 12MHz
  // 12.* 1000000/(64/2 *38400) -1 = 8.77
  *SCI (4, BRR) = 9;	//38400bps

  // Wait at least 1bit interval.
  volatile int i;
  for (i = 0; i < 0xffff; i++)
    ;

  // Enable transmit/receive.
  *SCI (4, SCR) |= (SCR_TE | SCR_RE);
}

int8_t
sci4_getc ()
{
  uint8_t c;

  while (((c = *SCI (4, SSR)) & (SSR_RDRF | SSR_ERR_BITS)) == 0)
    ;
  if (c & SSR_ERR_BITS)
    {
      *SCI (4, SSR) &= ~(SSR_RDRF | SSR_ERR_BITS);
      return 0;
    }

  c = *SCI (4, RDR);
  *SCI (4, SSR) &= ~SSR_RDRF;

  return c;
}

void
sci4_putc (int8_t c)
{

  while ((*SCI (4, SSR) & SSR_TDRE) == 0)
    ;
  *SCI (4, TDR) = c;
  *SCI (4, SSR) &= ~SSR_TDRE;

  // Wait transfer complete. これは今回の例ではなくてもい。
  while ((*SCI (4, SSR) & SSR_TEND))
    ;
}

-*- mode: compilation; default-directory: "~/os/w/h8sx/board/test3/" -*-
Compilation started at Thu Apr  8 20:57:58

gmake romwrite
/usr/home/uch/os/w/tools/bin/h8300-elf-gcc -msx -fomit-frame-pointer -Wall -Werror -I../../../include -O2 -mint32 -Wp,-MD,.deps/start.P -c -o start.o start.c
/usr/home/uch/os/w/tools/bin/h8300-elf-ld -T ldscript -o test.elf  entry.o start.o
/usr/home/uch/os/w/tools/bin/h8300-elf-objdump -x test.elf

test.elf:     file format elf32-h8300
test.elf
architecture: h8300sx, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00000100

Program Header:
    LOAD off    0x00000074 vaddr 0x00000000 paddr 0x00000000 align 2**0
         filesz 0x00000004 memsz 0x00000004 flags r--
    LOAD off    0x00000078 vaddr 0x00000100 paddr 0x00000100 align 2**0
         filesz 0x000002a0 memsz 0x000002a0 flags r-x

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000002a0  00000100  00000100  00000078  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .start_vector 00000004  00000000  00000000  00000074  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .comment      00000012  00000000  00000000  00000318  2**0
                  CONTENTS, READONLY
SYMBOL TABLE:
00000100 l    d  .text	00000000 .text
00000000 l    d  .start_vector	00000000 .start_vector
00000000 l    d  .comment	00000000 .comment
00000106 l       .text	00000000 .L11
00000000 l    df *ABS*	00000000 start.c
00000184 l       .text	00000000 .L2
00000172 l       .text	00000000 .L5
000001b6 l       .text	00000000 .L9
000001d4 l       .text	00000000 .L10
000001de l       .text	00000000 .L36
000001fc l       .text	00000000 .L12
00000206 l       .text	00000000 .L35
00000224 l       .text	00000000 .L14
0000022e l       .text	00000000 .L34
0000024c l       .text	00000000 .L16
00000256 l       .text	00000000 .L33
00000274 l       .text	00000000 .L18
0000027e l       .text	00000000 .L32
0000029a l       .text	00000000 .L20
000002a4 l       .text	00000000 .L31
000002c0 l       .text	00000000 .L22
000002f2 l       .text	00000000 .L54
000002cc l       .text	00000000 .L30
000002e8 l       .text	00000000 .L25
00000314 l       .text	00000000 .L26
0000032c l       .text	00000000 .L27
0000033c l       .text	00000000 .L56
00000360 l       .text	00000000 .L57
00000378 l       .text	00000000 .L62
00000394 l       .text	00000000 .L63
00000196 g       .text	000001a6 _machine_startup
00000378 g       .text	00000028 _sci4_putc
0000033c g       .text	0000003c _sci4_getc
00ffc000 g       *ABS*	00000000 _stack_start
00000100 g       .text	00000000 start
0000010c g       .text	0000008a _sci4_init


/usr/home/uch/os/w/tools/bin/h8300-elf-objdump -D test.elf

test.elf:     file format elf32-h8300

Disassembly of section .text:

00000100 <start>:
 100:	7a 07 00 ff 	mov.l	#0xffc000,er7
 104:	c0 00 

00000106 <.L11>:
 106:	5a 00 01 96 	jmp	@0x196:24
 10a:	40 fa       	bra	.-6 (0x106)

0000010c <_sci4_init>:
 10c:	1a cf       	sub.l	#0x4,er7
 10e:	6b 22 00 ff 	mov.w	@0xfffdca:32,r2
 112:	fd ca 
 114:	e2 ef       	and.b	#0xef,r2h
 116:	6b a2 00 ff 	mov.w	r2,@0xfffdca:32
 11a:	fd ca 
 11c:	6a 2a 00 ff 	mov.b	@0xfffe92:32,r2l
 120:	fe 92 
 122:	ea cf       	and.b	#0xcf,r2l
 124:	6a aa 00 ff 	mov.b	r2l,@0xfffe92:32
 128:	fe 92 
 12a:	6a 2a 00 ff 	mov.b	@0xfffb95:32,r2l
 12e:	fb 95 
 130:	ea fe       	and.b	#0xfe,r2l
 132:	6a aa 00 ff 	mov.b	r2l,@0xfffb95:32
 136:	fb 95 
 138:	6a 2a 00 ff 	mov.b	@0xfffb95:32,r2l
 13c:	fb 95 
 13e:	ca 02       	or.b	#0x2,r2l
 140:	6a aa 00 ff 	mov.b	r2l,@0xfffb95:32
 144:	fb 95 
 146:	6a 2a 00 ff 	mov.b	@0xfffe92:32,r2l
 14a:	fe 92 
 14c:	ea fc       	and.b	#0xfc,r2l
 14e:	6a aa 00 ff 	mov.b	r2l,@0xfffe92:32
 152:	fe 92 
 154:	6a f0 00 ff 	mov.b	#0x0,@0xfffe96:32
 158:	fe 96 
 15a:	6a f0 00 ff 	mov.b	#0x0,@0xfffe90:32
 15e:	fe 90 
 160:	6a f9 00 ff 	mov.b	#0x9,@0xfffe91:32
 164:	fe 91 
 166:	01 0d 07 00 	mov.l	#0x0,@er7
 16a:	01 0e 07 20 	cmp.l	#0xfffe,@er7
 16e:	ff fe 
 170:	4e 12       	bgt	.+18 (0x184)

00000172 <.L5>:
 172:	01 00 69 72 	mov.l	@er7,er2
 176:	0a 9a       	add.l	#0x1,er2
 178:	01 00 69 f2 	mov.l	er2,@er7
 17c:	01 0e 07 20 	cmp.l	#0xfffe,@er7
 180:	ff fe 
 182:	4f ee       	ble	.-18 (0x172)

00000184 <.L2>:
 184:	6a 2a 00 ff 	mov.b	@0xfffe92:32,r2l
 188:	fe 92 
 18a:	ca 30       	or.b	#0x30,r2l
 18c:	6a aa 00 ff 	mov.b	r2l,@0xfffe92:32
 190:	fe 92 
 192:	0a cf       	add.l	#0x4,er7
 194:	54 70       	rts	

00000196 <_machine_startup>:
 196:	6a 2a 00 ff 	mov.b	@0xffee50:32,r2l
 19a:	ee 50 
 19c:	ca 08       	or.b	#0x8,r2l
 19e:	6a aa 00 ff 	mov.b	r2l,@0xffee50:32
 1a2:	ee 50 
 1a4:	6a 2a 00 ff 	mov.b	@0xffee51:32,r2l
 1a8:	ee 51 
 1aa:	ea f7       	and.b	#0xf7,r2l
 1ac:	6a aa 00 ff 	mov.b	r2l,@0xffee51:32
 1b0:	ee 51 
 1b2:	5e 00 01 0c 	jsr	@0x10c:24

000001b6 <.L9>:
 1b6:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 1ba:	fe 94 
 1bc:	4c f8       	bge	.-8 (0x1b6)
 1be:	01 7d 48 6f 	mov.b	#0x6f,@0xfffe93:32
 1c2:	00 ff fe 93 
 1c6:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 1ca:	fe 94 
 1cc:	ea 7f       	and.b	#0x7f,r2l
 1ce:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 1d2:	fe 94 

000001d4 <.L10>:
 1d4:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 1d8:	fe 94 
 1da:	ea 04       	and.b	#0x4,r2l
 1dc:	46 f6       	bne	.-10 (0x1d4)

000001de <.L36>:
 1de:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 1e2:	fe 94 
 1e4:	4c f8       	bge	.-8 (0x1de)
 1e6:	01 7d 48 68 	mov.b	#0x68,@0xfffe93:32
 1ea:	00 ff fe 93 
 1ee:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 1f2:	fe 94 
 1f4:	ea 7f       	and.b	#0x7f,r2l
 1f6:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 1fa:	fe 94 

000001fc <.L12>:
 1fc:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 200:	fe 94 
 202:	ea 04       	and.b	#0x4,r2l
 204:	46 f6       	bne	.-10 (0x1fc)

00000206 <.L35>:
 206:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 20a:	fe 94 
 20c:	4c f8       	bge	.-8 (0x206)
 20e:	01 7d 48 61 	mov.b	#0x61,@0xfffe93:32
 212:	00 ff fe 93 
 216:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 21a:	fe 94 
 21c:	ea 7f       	and.b	#0x7f,r2l
 21e:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 222:	fe 94 

00000224 <.L14>:
 224:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 228:	fe 94 
 22a:	ea 04       	and.b	#0x4,r2l
 22c:	46 f6       	bne	.-10 (0x224)

0000022e <.L34>:
 22e:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 232:	fe 94 
 234:	4c f8       	bge	.-8 (0x22e)
 236:	01 7d 48 79 	mov.b	#0x79,@0xfffe93:32
 23a:	00 ff fe 93 
 23e:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 242:	fe 94 
 244:	ea 7f       	and.b	#0x7f,r2l
 246:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 24a:	fe 94 

0000024c <.L16>:
 24c:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 250:	fe 94 
 252:	ea 04       	and.b	#0x4,r2l
 254:	46 f6       	bne	.-10 (0x24c)

00000256 <.L33>:
 256:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 25a:	fe 94 
 25c:	4c f8       	bge	.-8 (0x256)
 25e:	01 7d 48 6f 	mov.b	#0x6f,@0xfffe93:32
 262:	00 ff fe 93 
 266:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 26a:	fe 94 
 26c:	ea 7f       	and.b	#0x7f,r2l
 26e:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 272:	fe 94 

00000274 <.L18>:
 274:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 278:	fe 94 
 27a:	ea 04       	and.b	#0x4,r2l
 27c:	46 f6       	bne	.-10 (0x274)

0000027e <.L32>:
 27e:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 282:	fe 94 
 284:	4c f8       	bge	.-8 (0x27e)
 286:	6a fd 00 ff 	mov.b	#0xd,@0xfffe93:32
 28a:	fe 93 
 28c:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 290:	fe 94 
 292:	ea 7f       	and.b	#0x7f,r2l
 294:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 298:	fe 94 

0000029a <.L20>:
 29a:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 29e:	fe 94 
 2a0:	ea 04       	and.b	#0x4,r2l
 2a2:	46 f6       	bne	.-10 (0x29a)

000002a4 <.L31>:
 2a4:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 2a8:	fe 94 
 2aa:	4c f8       	bge	.-8 (0x2a4)
 2ac:	6a fa 00 ff 	mov.b	#0xa,@0xfffe93:32
 2b0:	fe 93 
 2b2:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 2b6:	fe 94 
 2b8:	ea 7f       	and.b	#0x7f,r2l
 2ba:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 2be:	fe 94 

000002c0 <.L22>:
 2c0:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 2c4:	fe 94 
 2c6:	ea 04       	and.b	#0x4,r2l
 2c8:	46 f6       	bne	.-10 (0x2c0)
 2ca:	40 26       	bra	.+38 (0x2f2)

000002cc <.L30>:
 2cc:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 2d0:	fe 94 
 2d2:	4c f8       	bge	.-8 (0x2cc)
 2d4:	6a ab 00 ff 	mov.b	r3l,@0xfffe93:32
 2d8:	fe 93 
 2da:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 2de:	fe 94 
 2e0:	ea 7f       	and.b	#0x7f,r2l
 2e2:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 2e6:	fe 94 

000002e8 <.L25>:
 2e8:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 2ec:	fe 94 
 2ee:	ea 04       	and.b	#0x4,r2l
 2f0:	46 f6       	bne	.-10 (0x2e8)

000002f2 <.L54>:
 2f2:	6a 2b 00 ff 	mov.b	@0xfffe94:32,r3l
 2f6:	fe 94 
 2f8:	17 63       	extu.l	#2,er3
 2fa:	0f b2       	mov.l	er3,er2
 2fc:	ea 78       	and.b	#0x78,r2l
 2fe:	47 f2       	beq	.-14 (0x2f2)
 300:	eb 38       	and.b	#0x38,r3l
 302:	47 10       	beq	.+16 (0x314)
 304:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 308:	fe 94 
 30a:	ea 87       	and.b	#0x87,r2l
 30c:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 310:	fe 94 
 312:	40 18       	bra	.+24 (0x32c)

00000314 <.L26>:
 314:	6a 2b 00 ff 	mov.b	@0xfffe95:32,r3l
 318:	fe 95 
 31a:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 31e:	fe 94 
 320:	ea bf       	and.b	#0xbf,r2l
 322:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 326:	fe 94 
 328:	0c bb       	mov.b	r3l,r3l
 32a:	46 a0       	bne	.-96 (0x2cc)

0000032c <.L27>:
 32c:	6a 2a 00 ff 	mov.b	@0xffee51:32,r2l
 330:	ee 51 
 332:	ca 08       	or.b	#0x8,r2l
 334:	6a aa 00 ff 	mov.b	r2l,@0xffee51:32
 338:	ee 51 
 33a:	54 70       	rts	

0000033c <_sci4_getc>:
 33c:	6a 2b 00 ff 	mov.b	@0xfffe94:32,r3l
 340:	fe 94 
 342:	17 63       	extu.l	#2,er3
 344:	0f b2       	mov.l	er3,er2
 346:	ea 78       	and.b	#0x78,r2l
 348:	47 f2       	beq	.-14 (0x33c)
 34a:	eb 38       	and.b	#0x38,r3l
 34c:	47 12       	beq	.+18 (0x360)
 34e:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 352:	fe 94 
 354:	ea 87       	and.b	#0x87,r2l
 356:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 35a:	fe 94 
 35c:	f8 00       	mov.b	#0x0,r0l
 35e:	54 70       	rts	

00000360 <.L57>:
 360:	6a 2b 00 ff 	mov.b	@0xfffe95:32,r3l
 364:	fe 95 
 366:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 36a:	fe 94 
 36c:	ea bf       	and.b	#0xbf,r2l
 36e:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 372:	fe 94 
 374:	0c b8       	mov.b	r3l,r0l
 376:	54 70       	rts	

00000378 <_sci4_putc>:
 378:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 37c:	fe 94 
 37e:	4c f8       	bge	.-8 (0x378)
 380:	6a a8 00 ff 	mov.b	r0l,@0xfffe93:32
 384:	fe 93 
 386:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 38a:	fe 94 
 38c:	ea 7f       	and.b	#0x7f,r2l
 38e:	6a aa 00 ff 	mov.b	r2l,@0xfffe94:32
 392:	fe 94 

00000394 <.L63>:
 394:	6a 2a 00 ff 	mov.b	@0xfffe94:32,r2l
 398:	fe 94 
 39a:	ea 04       	and.b	#0x4,r2l
 39c:	46 f6       	bne	.-10 (0x394)
 39e:	54 70       	rts	
Disassembly of section .start_vector:

00000000 <.start_vector>:
   0:	00 00       	nop	
   2:	01 00       	.word	H'1,H'0
Disassembly of section .comment:

00000000 <.comment>:
   0:	00 47       	.word	H'0,H'47
   2:	43 43       	.word	H'43,H'43
   4:	3a 20       	mov.b	r2l,@0x20:8
   6:	28 47       	mov.b	@0x47:8,r0l
   8:	4e 55       	.word	H'4e,H'55
   a:	29 20       	mov.b	@0x20:8,r1l
   c:	34 2e       	mov.b	r4h,@0x2e:8
   e:	33 2e       	mov.b	r3h,@0x2e:8
  10:	32 00       	mov.b	r2h,@0x0:8
/usr/home/uch/os/w/tools/bin/h8300-elf-objcopy -Osrec  test.elf test.mot
../../h8sxwrite/h8sxwrite -f 12 -d 0 -m 0 test.mot
Output Device [ugen0]
H8SX Input Clock [12MHz]
MDCLK = 0
Send file [test.mot]: 1908 byte
vendor: 045b product: 0025
Flash memory size = 0x524288 byte
1905 byte. start addr=100
write 927/524288 byte
Success.

Compilation finished at Thu Apr  8 20:58:01


エコーバックを確認。

$ tip hmon38400
connected
ohayo
awefjaijjfejjoijoijawefa;woeifja;woeifja;owiejf;oaiwejf;oaiwejf;oaiwejf;oaiwejf;oaiwejf;oaiwejfo;aiwjefo;iawejf;ija;oiwejf;oiajwef;oia;oieaioj;fwe;oijfajio;we;iojaioj;dahojaoijeofiajweoifj




BS走行会で筑波に行ってきました。どんよりと曇。そして寒い。なんかボーッ
とする。ここ最近抗ヒスタミン剤を飲みだしたのだけど、やっぱりこれだめか
な。デルモベートが処方されなくなってしまい(ちょっと弱いアンデベート)仕
方なく...。デルモベートが必要だということを示すには結構な時間がかかるの
で憂鬱だ。


一本目は8:00。寒い。最終コーナーは、開けながら倒しこんでそこからコーナー リングという感じだったのを、ギリギリまでアウトで待ってスパッと入るよう にしてみた。うーん、こうするとフロントがバタついてしまう。
ロガーのノイズ入りも大きい。勝手にロガーのスタート,ストップがされてしま う。ノイズを拾ったのか、スイッチ自体が振動でへたったのか。ここはソフト 側でチャタリング処理入れておいた方がよさそう。
クラッチ側カバーの補修は、ばっちりOK。
二本目は10:00。寒い。どうもうまく走れない。ハッと気付くとコーナー中間で とてつもなくスピードが落ちている。二本目はロガーもバグってしまいタイム もわからず。原因はロガーのオンオフがチャタったからかな。ロガーのロガー が欲しい。

スピードメータへのノイズの入り方もひどくなってきた。やっぱりリアタイヤ から信号とってくるのは距離が長すぎてノイズのアンテナになってるのかも。
なんにしろ、とにかく走りがパッとしない。全て控え目な走りである。 ソロリと進入しじっくりコーナリングしてソーッと脱出みたいな。んー。
7:50 曇 123m 15.5℃ 80.4% 1008.2hPa
3枚53℃
9:50 曇 58m 14.4℃ 60.8% 1008.8hPa
4枚58℃
H8SX続き。Cを使えるようにします。最低スタックポインタさえ設定しておけば いい。データセクションは初期化済みデータを設定しないように書けば、とり あえずなんとかなる。データのROMからRAMへの転送でバグったりすると面倒な ので最初はこの方針がいい。h8300-elf-gccの場合、intのデフォルトは 16bit。-mint32オプションで32bitにすることができる。H8SXはバス幅が32bit になったので-mint32を使うことにしました。 エントリではLDスクリプトにハードコードした_stack_start(0xffc000,RAMのてっ ぺん)をスタックに割り当ててCのルーチンにジャンプします。
	.h8300sx
	.section .start_vector, "a"
	.long	start

	.section .text
	.globl start
start:
	mov	#_stack_start, sp
1:	jmp	@_machine_startup
	bra	1b
	/* NOTREACHED */
ここで無邪気にint iとして0x20000を代入しているのは-mint32オプションでコ ンパイルするから。intが16bitのままだと、このwhile(1){...}の中がダミールー プになってしまう(ディレイのループがなくなるはいいとして、レジスタのアク セスまで抜けてしまうのはコンパイラの問題)。ちょっとはまった。
#include <types.h>

#define	PM3_DDR	((volatile uint8_t *)0xffee50)
#define	PM3_DR	((volatile uint8_t *)0xffee51)

void
machine_startup ()
{
  int i;

  *PM3_DDR |= 8;
  *PM3_DR &= ~8;

  while (/*CONSTCOND*/1)
    {
      for (i = 0; i < 0x20000; i++)
	;
      *PM3_DR ^= 8;
    }
  /*NOTREACHED*/
}
ディスアセンブルしたコードを見ると、コンパイラ、遅延分岐スロット使って るんだよね。ちょっと感動した(そこまで整備されていたことに)。SH2Aでは 32bit命令を導入して20bitの即値がロードできたり。なんでもありだ。
-*- mode: compilation; default-directory: "~/os/w/h8sx/board/test2/" -*-
Compilation started at Wed Apr  7 21:51:10

gmake romwrite
/usr/home/uch/os/w/tools/bin/h8300-elf-gcc -msx -fomit-frame-pointer -Wall -Werror -I../../../include -O1 -mint32 -Wp,-MD,.deps/start.P -c -o start.o start.c
/usr/home/uch/os/w/tools/bin/h8300-elf-ld -T ldscript -o test.elf  entry.o start.o
/usr/home/uch/os/w/tools/bin/h8300-elf-objdump -x test.elf

test.elf:     file format elf32-h8300
test.elf
architecture: h8300sx, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00000100

Program Header:
    LOAD off    0x00000074 vaddr 0x00000000 paddr 0x00000000 align 2**0
         filesz 0x00000004 memsz 0x00000004 flags r--
    LOAD off    0x00000078 vaddr 0x00000100 paddr 0x00000100 align 2**0
         filesz 0x0000003c memsz 0x0000003c flags r-x

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000003c  00000100  00000100  00000078  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .start_vector 00000004  00000000  00000000  00000074  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .comment      00000012  00000000  00000000  000000b4  2**0
                  CONTENTS, READONLY
SYMBOL TABLE:
00000100 l    d  .text	00000000 .text
00000000 l    d  .start_vector	00000000 .start_vector
00000000 l    d  .comment	00000000 .comment
00000106 l       .text	00000000 .L11
00000000 l    df *ABS*	00000000 start.c
00000128 l       .text	00000000 .L5
00000126 l       .text	00000000 .L3
0000010c g       .text	0000002e _machine_startup
00ffc000 g       *ABS*	00000000 _stack_start
00000100 g       .text	00000000 start


/usr/home/uch/os/w/tools/bin/h8300-elf-objdump -D test.elf

test.elf:     file format elf32-h8300

Disassembly of section .text:

00000100 <start>:
 100:	7a 07 00 ff 	mov.l	#0xffc000,er7
 104:	c0 00 

00000106 <.L11>:
 106:	5a 00 01 0c 	jmp	@0x10c:24
 10a:	40 fa       	bra	.-6 (0x106)

0000010c <_machine_startup>:
 10c:	7a 03 00 ff 	mov.l	#0xffee50,er3
 110:	ee 50 
 112:	68 3a       	mov.b	@er3,r2l
 114:	ca 08       	or.b	#0x8,r2l
 116:	68 ba       	mov.b	r2l,@er3
 118:	fb 51       	mov.b	#0x51,r3l
 11a:	68 3a       	mov.b	@er3,r2l
 11c:	ea f7       	and.b	#0xf7,r2l
 11e:	68 ba       	mov.b	r2l,@er3
 120:	1a a2       	sub.l	er2,er2
 122:	40 05       	bra/s	.+4 (0x128)
 124:	1a 80       	sub.l	er0,er0

00000126 <.L3>:
 126:	0a 9a       	add.l	#0x1,er2

00000128 <.L5>:
 128:	7a 22 00 01 	cmp.l	#0x1ffff,er2
 12c:	ff ff 
 12e:	4f f6       	ble	.-10 (0x126)
 130:	68 3a       	mov.b	@er3,r2l
 132:	da 08       	xor.b	#0x8,r2l
 134:	68 ba       	mov.b	r2l,@er3
 136:	40 f1       	bra/s	.-16 (0x128)
 138:	0f 82       	mov.l	er0,er2
	...
Disassembly of section .start_vector:

00000000 <.start_vector>:
   0:	00 00       	nop	
   2:	01 00       	.word	H'1,H'0
Disassembly of section .comment:

00000000 <.comment>:
   0:	00 47       	.word	H'0,H'47
   2:	43 43       	.word	H'43,H'43
   4:	3a 20       	mov.b	r2l,@0x20:8
   6:	28 47       	mov.b	@0x47:8,r0l
   8:	4e 55       	.word	H'4e,H'55
   a:	29 20       	mov.b	@0x20:8,r1l
   c:	34 2e       	mov.b	r4h,@0x2e:8
   e:	33 2e       	mov.b	r3h,@0x2e:8
  10:	32 00       	mov.b	r2h,@0x0:8
/usr/home/uch/os/w/tools/bin/h8300-elf-objcopy -Osrec  test.elf test.mot


菜園状況。モヤシ状態だったトマトはなんとかリカバリしてるのか、してない
のか。2,3株でも残れば後はわき芽を差してやれば増殖できるのであまり気にし
てない。



トウモロコシも発芽。そろそろ二次隊を蒔かないと。

キャベツも、しかしてまだ収穫には早かったのかも。徐々に結球度が高くなっ てきたような。これは様子見に放置してみよう。

ひそかに去年の秋からイタリアンパセリを育てています。これ、種からの成長 が非常に遅いので難しい。パセリなんて育ててもあまり...。

机続き。木工部屋を徹底拭き掃除して塗装部屋に。二液アクリルポリウレタン をガン吹きします。よほど木の肌触りにこだわりがない限り、このフィニッシュ が実用性としては最高。

ショップラインを天井に取り付けたので塗装物の空中固定も楽になった。

テーブルソーには覆いをかけて、引出しの前面パネルには塗装しやすいように 取手をとりつけ。



トリマのジグを作ります。100x100x5のA5052から。



200x100x5のA5052から。

こうしてトリマに装着。マキタ3707Fは55mm四方のM4の穴でいい。

これで飛びでたホゾを面一に削ります。実際のとこ面一までやると周りまで削っ てしまうので紙三枚ほどオフセットして。

ほんのちょっとの段差をカンナでガッと削って#400で平面出し

H8SX続き。フラッシュロムに書き込む手段までできた。まずはldscriptを書いて メモリイメージを。start_vectorの位置に書き込まれたアドレスからスタートする。
OUTPUT_FORMAT ("elf32-h8300")
OUTPUT_ARCH (h8300:h8300sx) /*ここでH8SXを宣言*/

MEMORY {
	start_vector	: o = 0x000000, l = 0x4
	rom		: o = 0x000100, l = 0x7ff00	/* 512KB */
}

SECTIONS {
	 .start_vector :
	 {
	 	 *(.vector)
	 } > start_vector

	 .text :
	 {
		*(.text*)
		*(.rodata*)
		 . = ALIGN (4);
	 } > rom
}
Makefileはh8300-elf-gcc -msxの-msxオプションでH8SXを指定する。
SHELL	= /bin/sh
GNUARCH	= h8300-elf

PREFIX	= ${TOOLDIR}/bin/${GNUARCH}

AS	= ${PREFIX}-gcc
CPP	= ${PREFIX}-cpp
CC	= ${PREFIX}-gcc
C++	= ${PREFIX}-g++
LD	= ${PREFIX}-ld
OBJCOPY	= ${PREFIX}-objcopy
OBJDUMP	= ${PREFIX}-objdump
NM	= ${PREFIX}-nm
AR	= ${PREFIX}-ar
RANLIB	= ${PREFIX}-ranlib

CFLAGS = -msx -fomit-frame-pointer -Wall -Werror
ASFLAGS = -msx -Wall -Werror

DEPEND_DIR	=	.deps
DEPEND_UPDATE	=	-Wp,-MD,$(DEPEND_DIR)/$(*F).P

.c.o:
	${CC} ${CFLAGS} ${DEPEND_UPDATE} -c -o $@ $<
.S.o:
	${AS} ${INCLUDES} ${ASFLAGS} ${DEPEND_UPDATE} -c -o $@ $<

OBJS	= entry.o
PROG	= test.elf
PROGBASENAME = ${basename ${PROG}}

all:	${PROG}

clean:
	rm -f ${OBJS} ${PROGBASENAME}.*
	rm -rf ${DEPEND_DIR}

romwrite:
	../../h8sxwrite/h8sxwrite -f 12 -d 0 -m 0 a.mot

${PROG}:	${OBJS}
	${LD} -T ../../ldscripts/1655.rom -o ${PROG}  ${OBJS}
	${OBJDUMP} -x ${PROG}
	${OBJDUMP} -D ${PROG}
	${OBJCOPY} -Osrec ${PROGBASENAME}.elf $@
	cp $@ a.mot

DEPS_MAGIC := ${shell mkdir ${DEPEND_DIR} > /dev/null 2>&1 || :}
-include ${DEPEND_DIR}/*.P
テストコードはLEDを点滅。PM3にLEDが接続されていて、ポートをLにすると LEDが点灯する。
// Simple entry routine.
	.h8300sx	/* H8SXを宣言 */
	.section .start_vector, "a"	/*ユーザ定義のセクションの場合必要*/
	.long	start

// LED connected to PM3. blink it.
	.section .text
	.globl start
start:
	bset	#3,	@0xee50:16	/* PM_DDR */
	bclr	#3,	@0xee51:16	/* PM_DR */
1:	mov.l	#0x200000, er0
2:	dec.l	#1, 	er0
	bne	2b
	bnot	#3,	@0xee51:16
	bra	1b
	/* NOTREACHED */
0xffff**のレジスタであれば@0x**:8でアクセスできる。この場合そこから外れ ているので@0x****:16で0xffee50をアクセスしている。ちなみにH8SXの場合 SBR相対が使えるのでそれで:8も可能。これはMIPSのGP相対をもってきた。この 規模であればGP相対はいい選択だ。とにかくH8SXはおいしいとこどりだ。
ユーザ定義のセクションの場合は.sectionのオプションが重要。"a"を指定すれば
Idx Name          Size      VMA       LMA       File off  Algn
  1 .start_vector 00000004  00000000  00000000  00000074  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
となり、ここにある値がロードされるけれど、"a"がなければ
  1 .start_vector 00000004  00000000  00000000  00000074  2**0
                  CONTENTS, READONLY
となりロードされない。
gmake all
/usr/home/uch/os/w/tools/bin/h8300-elf-gcc  -msx -Wall -Werror -Wp,-MD,.deps/entry.P -c -o entry.o entry.S
/usr/home/uch/os/w/tools/bin/h8300-elf-ld -T ../../ldscripts/1655.rom -o test.elf  entry.o
/usr/home/uch/os/w/tools/bin/h8300-elf-objdump -x test.elf

test.elf:     file format elf32-h8300
test.elf
architecture: h8300sx, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00000100

Program Header:
    LOAD off    0x00000074 vaddr 0x00000000 paddr 0x00000000 align 2**0
         filesz 0x00000004 memsz 0x00000004 flags r--
    LOAD off    0x00000078 vaddr 0x00000100 paddr 0x00000100 align 2**0
         filesz 0x00000020 memsz 0x00000020 flags r-x

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000020  00000100  00000100  00000078  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .start_vector 00000004  00000000  00000000  00000074  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
SYMBOL TABLE:
00000100 l    d  .text	00000000 .text
00000000 l    d  .start_vector	00000000 .start_vector
00000112 l       .text	00000000 .L21
0000010c l       .text	00000000 .L11
00ffc000 g       *ABS*	00000000 _stack_start
00000100 g       .text	00000000 start


/usr/home/uch/os/w/tools/bin/h8300-elf-objdump -D test.elf

test.elf:     file format elf32-h8300

Disassembly of section .text:

00000100 <start>:
 100:	6a 18 ee 50 	bset	#0x3,@0xee50:16
 104:	70 30 
 106:	6a 18 ee 51 	bclr	#0x3,@0xee51:16
 10a:	72 30 

0000010c <.L11>:
 10c:	7a 00 00 20 	mov.l	#0x200000,er0
 110:	00 00 

00000112 <.L21>:
 112:	1b 70       	dec.l	#1,er0
 114:	46 fc       	bne	.-4 (0x112)
 116:	6a 18 ee 51 	bnot	#0x3,@0xee51:16
 11a:	71 30 
 11c:	40 ee       	bra	.-18 (0x10c)
	...
Disassembly of section .start_vector:

00000000 <.start_vector>:
   0:	00 00       	nop	
   2:	01 00       	.word	H'1,H'0
/usr/home/uch/os/w/tools/bin/h8300-elf-objcopy -Osrec test.elf test.elf
cp test.elf a.mot

Compilation finished at Mon Apr  5 22:59:55
これでLEDが点滅するのを確認。



机続き。荒木取りしてあった部材から引出し作り。この手の箱はもうルーチン
ワーク。後はひたすら#400でペーパーがけ。下地が全てだからね。





CR85整備。E/G組み立て。もっと溶接盛っておけばよかったな。溶接中にケース
に熱が入ってウォーターポンプのベアリングが落ちてしまったので、ついでに
新品交換。



ヘッドはデトネ跡を軽く#600で研磨。

このくらいにしておけば次のデトネも観測できるかな。デトカンはつけてない からね。

そこそこの整備が終わったところで倉庫の掃除。物があふれてきた。NFのフレー ムの山。うち全部で6フレームある。89-93までコンプのはず。89と90の間で結 構作りが変更されてる。そうそう、この手前のフレームについてるスイングアー ムを、開いてしまったスイングアームと交換しようと思ってそのままだ。

Apeも改造しきって熱が覚めてしまった。結局レースは日光で一回のみ。モテギ はこいつでしか走ったことないんだ。DE耐に出たいと思っていた頃もありまし た。NFベースの創作12インチマシンは頓挫したままだ。そういえば公道も走ってない。前に走ったのは090509だ。ナンバー返却するかな。

まずはシリアルケーブルやモニタケーブル、PCIカードを40lくらい処分。ドリ キャスとPDAも処分します。知人で欲しい人がいればあげます。ブロードバンド アダプタなんて合計8個もある。本体は4個しかないのに。たぶんメッセサンオー で叩き売りしてた時にうっかり買っちゃったんだ。ドリキャスは素直でいいアー キテクチャだったんだけどな〜。

Pen Centra 130, Telios AJ-3, PERSONA HPW-650PA, Jornada 820, Compaq C-2010は廃棄猶予にしておこうか。

Zaurus, Telios AJ-1, Telios VJ-1C, Compaq C-810, Mobilon HC4500, Sigmarion, Mobile Gear II MC-R300, Jornada 548, PERSONA HPW-50PAD, Cassiopeia A-51, Cassiopeia A-55V、GP32これらは廃棄決定。

桜が満開。

ピークボルテージアダプタ買った。これで電気系のメンテも計測ベースにでき る。今迄はなんとなく迷ったら交換だったからね。しかし10000円弱した...そ んな高いとは思わなかった。

久々にH8SX続き。SCI4の先にADM3202ANをつけてシリアルコンソールを出せるよ うにしました。ついでにリセットボタンも。






ケースの修正。この惨状。まずは下に見えている鉄板に押しつけて溶接してい
た。最初20Aでやっていてどうも埒があかないので最終的に50Aくらいで溶接し
ていた。最後、鉄板との隅になる部分をちょこっと溶接入れようと思って鉄板
から外して溶接したらステー部分が溶け落ちた。下の鉄板で余分な熱を逃して
いるのも重要だったんだ。

ここで作戦変更して思いっきり溶棒つっこんで形作ってここから削り出すこと にした。

慎重に手で金ヤスリを当ててそこそこの平面にして、#120の金剛砂で定盤で平 面だし。ケース側に光明丹塗って組みつけて穴開け位置の割出し。

フライスで2mm→4mm→6.1mmで慎重に穴開け。

キャップボルトが入るようにエンドミルで切削すると穴が空いた。あぁ、裏か らも肉付けしておけばよかった...。この開きかたからしてカバーの歪みも気に なる。ケース当たり面は合わせれてたとしてもウォーターポンプの軸はずれる。

これはデブコンで埋めた。

余ったデブコンで汚ない溶接跡の上にパテ盛り。

溶接する部材の熱容量の違いに悩まされることが多いけれど、これ放熱材をあ てることでかなり緩和できることに気付いた。そうすることが難しい状況も多 いけれど...
本当アルミの溶接は難しい。


CR整備。問題の場所はここ。ケースの作成にも問題があって、うっかり削り過
ぎて穴が空いてしまい、裏からデブコンで塞いである状態なんだ。

まずはこの折れたパーツをそのまま溶接してみる。それでだめなら前端部分削 り落として、パーツ削り出してそれを溶接しよう。

ピストン状況。ピストン、シリンダともに問題なし。このシリンダの内側Oリン グ溝は1.70mm、このチビリなら1.75mmまでいってもいいかも。

ヘッド。いつも通りかなと思いきや

ちょいデトネ気味か?セット的には今迄ならまったく問題ないので、これは新シ リンダが良く吸ってるのでは?期待が持てる。

昨日のロガーデータを見てみるとひどいへっぽこぶりだ。1コーナー、2ヘアの 遅さがひどい。7フラに較べると6km/h以上遅いよ。とはいえ、きっちりデータ がとれていてよかった。結構プログラム変えたんだ。