2008年10月アーカイブ




なかなか本調子になりません。熱っぽい。来週の今頃までには完調になってく
れよ...


DRO計画、ノギスと増幅装置を電池で動かしていたのをなんとかすることにしま した。三端子レギュレータLM317Tで1.6Vと4V(or 3.3V)を作ります。R1の120Ω はLM317Tの指定値。入力が6.2Vなので-3Vの3.2V程度までしか作れないのだけど、 4.5Vくらいまでならなんとかなりそう。確認にオシロで覗いてみてもそうおか しくない感じ。
ノギス用の1.6VはR1=120Ω、R2=33Ωで決定として、LM339の電源をどうするか。 今は4.5Vかけている。あらためて、動作中の信号を見てみると0V-4.5Vで出てい る。しかしH8のPort8の#0-#2はVcc*0.7が入力限界なので3.5V程度しかかけちゃ いけない。
以前、実験した時に3.3Vでチャタっていたので高めに設定していたのだけど、 今の状態で実験しなおしてみたら3.3Vで問題なく動く。前はなんか他の 失敗してたか。

電源と増幅装置をブレッドボードからユニバーサル基盤に移しました。うまく パーツを置くのは大変ね〜。とりあえず思いつくままに置いていってるので最 後のあたりは、うわぁ...という状況に。




また体調を崩してしまった。まだ風邪が直ってなかったのかな。秋ヶ瀬行くな
んて状況ではなかった。せっかく良く晴れてるのに。


ちょっと回路を読んでみました。間違えてるかも。まずはH8/3052のデータシー トからFWEとRESにどういう条件になって欲しいのかを調べてみます。これは18 章のロムの章にありました。
  • FWEへのHighレベル印加はVcc確定後
  • ブートモードではFWEの印加/解除はRES入力がLow期間中に行なう。
  • FWEをHighレベルにしてから少なくとも200ns待ってからRESをHighレベルにする。
回路図で左下のR2(4.7k)とC3(0.1u)、R5(4.7kとC8(10u)の時定数はそれぞれ.47msec, 47msecとなるので、先に上のインバータに通電して、端子15がLow、トランジスタの ベースに電流が流れてFWEに印加。しばらくしてC8が充電し終わると下の二つの インバーターが直列でRESがHighになってリセット終了。??
  • 3048の二電源の場合FWEじゃなくMD2とVppに12V印加だったのでトランジスタが 要るのかもしれないけれど、3052なら5Vでプルアップするだけいいんじゃ?
  • R4の役割がわからない。トランジスタに行く電流量を減らしてFWEをオフに するのかと思いきや、データシートでもそういう挙動を期待していないし、基盤に テスタあててもそういう挙動じゃない。
まぁ、わからないところはおいおい。
ノギスの1.5Vの信号レベルを5Vにするのを、今はLM339で逆相コンパレータでやっ ているのだけど、汎用ICでできないかと調べていたところ、一気に1.5Vから5V というのはないっぽい。信号レベル的に1.5V->3.3V->5Vのようだ。
ただ上げるだけなら、オープンドレイン+プルアップ、あるいはトランジスタで やるのが定番っぽい。オープンドレインICは
03 4回路入り2入力NANDゲート
05 6回路入りインバータ
07 6回路入りバッファ


チェーンメンテ。パットの中に混合油に沈めて歯ブラシでジャブジャブ洗って
エアブローまでは今迄通り、最近はその後、天日に一時間ほど晒しておく。す
るとチェーンが全体的にあたたまるので、ここでチェーンオイルを塗布。そし
てまた一時間程天日に晒す。すると粘度の高いチェーンオイルもいい感じに溶
けて浸みこむので、ここでウエスでゴシゴシオイルを落とします。



NSR50積み込んだ。明日、起きてみて乗り気だったらちょこっと秋ヶ瀬行ってき ます。秋ヶ瀬行くとなると朝でも7時過ぎに家を出ることになるので、渋滞が憂 鬱なんだよね...。

AKI-H8/3052Fマザーボードは3048用のボードをパターンカットしたりジャンパの 位置を変更する必要がある。それは一体どういうことなのか確認してみた。

3042の回路図の上に書いたXのところを切断している。3048の場合、S7のスイッチでMD2とFWEをONにしていたのを、MD2はフリーにして、FWEだけS7でONになるように している。1番PINの切断は3048は12V印加のところを5Vにするため。
残りの回路がまったく読めません...。もうちょっと勉強してみます。

口直しというか、DEATHROWのSATAN'S GIFTを買ってきた。これは新作ではなく 85年のアルバムのリマスター版。こういう強引さとか滅茶苦茶さが欲しい。ニ ヤけちゃうくらい滅茶苦茶。多少リズムが合わないくらいがザワザワして気持 ちがいい。



筑波選手権が終わってなんとなくシーズンオフ気分は昨日までだ。次の岡山ま
で二週間を切ってしまった。

ピストン状況。よく焼けてる。ちょい濃い目にMJ165まで上げておいてよかった。

シリンダ状況。これは去年のメインシリンダー。さすがにくたびれてきたかな。 新シリンダを投入するか、それとも今年のメインシリンダーにしていくか。 どうしようかな。



なんとサイレンサーステー、折れてタイヤに接触してました。ちょっと急角度に 曲げ過ぎたか。

久々にメタリカの新作買いました。メタリカはブラックアルバムで失望して、 最近は買ってなかったのだけれど、今回のはいいと噂を聞いて。確かにいい。 こんな曲もまだできるんだと驚いた。ただちょっと堅実で音が上品過ぎるか な...。大御所だしそこは仕方ないか。



家庭菜園のニンジン、よく育っているのだけど、隣にもよく育っているのがあ
るので(育ってないところはどれも育ってない。土の関係なのだろうか)、泣く
泣く間引きした一本。まだまだ小さいけれどかなりニンジンっぽくなってきて
ます。洗って食べてみました。こんなに小さくてもニンジンの風味がする。



ノギスを使ってフライス用のDROをAKI-H8/3052ボードで作ってみる計画の続きです。
ノギスのデータラインもLM339Nで増幅させて、PortAの0に接続しました。Port Aもシュミット入力。
まずはポーリングでデータをとってみました。クロックの立ち下がりでデータ を読みます。
void
test ()
{
  int read_data, clock_cnt, bank, phase_start;
  int i, k;
  uint32_t data[2];
  int d0, d1;

  SCI_PRINTF("polling mode\n");
#define	CLOCK 0x1
#define	DATA 0x1
  P8->DDR = 0;
  PA->DDR = 0;
  // Digital caliper clock signal
  //         (A)BC C    C C  D C C    C E (F)
  //
  // ---------___|_|_...|_|____|_|_...|____--------
  //

  read_data = 0, bank = 0, clock_cnt = 0;
  phase_start = 0;

  while (/*CONSTCOND*/1)
    {
      /* Wait for falling edge (2 pattern) */
      //      C      C     //             (A)
      //      v            //   v
      //     +--+   +--+   or -------------+
      //     |  |   |  |   //              |
      //_____|  |___|  |___//              |____
      //
      for (i = 0; (P8->DR & CLOCK); i++) /* HIGH */
	;
      /* Now falling edge */
      //      C      C     //             (A)
      //        v          //              v
      //     +--+   +--+   or -------------+
      //     |  |   |  |   //              |
      //_____|  |___|  |___//              |____
      //
      if (read_data)
	{
	  if (PA->DR & DATA)
	    data[bank] |= (1 << clock_cnt);
	  clock_cnt++;
	}
      phase_start = i > 0x2000;	// (A) new phase

      /* Wait for rising edge (3 pattern) */
      //      C      C     //         D             //         E  (F)          //         (A)  B
      //          v        //     v                 //       v                 //            v
      //     +--+   +--+   or -+             +--+   or  +--+       +---------- or ---------+        +--+
      //     |  |   |  |   //  |             |  |   //  |  |       |           //          |        |  |
      //_____|  |___|  |___//  |_____________|  |_  // _|  |_______|           //          |________|  |__
      //
      for (k = 0; !(P8->DR & CLOCK); k++) /* LOW  */
	;
      /* Now rising edge */
      //      C      C     //         D             //         E  (F)          //         (A)  B
      //            v      //                v      //             v           //                   v
      //     +--+   +--+   or -+             +--+   or  +--+       +---------- or ---------+        +--+
      //     |  |   |  |   //  |             |  |   //  |  |       |           //          |        |  |
      //_____|  |___|  |___//  |_____________|  |_  // _|  |_______|           //          |________|  |__
      //
      if (k < 50)
	continue; // clock signal pattern.

      if (read_data) // D region(k = 212) or E region(k = 131).
	{
	  if (bank == 0) // (D-region)
	    bank = 1, data[bank] = 0, clock_cnt = 0;
	  else // (E-region)
	    {
	      read_data = 0;
	      d0 = data[0];
	      d1 = data[1];
	      if (d0 & (1 << 23))
		d0 |= 0xff000000;
	      if (d1 & (1 << 23))
		d1 |= 0xff000000;
	      SCI_PRINTF ("%d %d %d %d\n",d0 + d1,  d0 >> 3, d1 >> 3, clock_cnt);
	    }
	}
      if (phase_start) // B-region(k = 98).
	{
	  read_data = 1;
	  bank = 0, data[bank] = 0, clock_cnt = 0;
	}
    }
}

結果
-6617 -3173 2345 24
-6617 -3711 2883 24
-6617 -3731 2903 24
-6617 -3730 2902 24
-6617 -3731 2903 24
-6617 -3730 2902 24
-6617 -3731 2903 24
-6617 -3731 2903 24
-6617 -3731 2903 24
-6617 -3731 2903 24
-6617 -3731 2903 24
-6617 -3730 2902 24
-29840 -3730 -1 24←ここでノギスのzero reset.
-29840 -3730 -1 24
-29840 -3730 -1 24
-29840 -3730 -1 24
-29840 -3730 -1 24
-29840 -3730 -1 24
-29840 -3730 -1 24
-29840 -3730 -1 24
-29840 -3761 30 24
-29840 -4239 509 24
-29840 -4533 802 24

100mmで10078
50mmで5038
リニアにずれる。

d1はノギス値*8
d0+d1が固定になるようにd0は選ばれる。ゼロリセットでd0の値は変わらない。
なんとか読めた!一軸ならこれでもいいのだけれど、XYZ三軸とりこみたいので 割りこみドリブンにしてみます。
H8のタイマユニット(ITU)を使っていろいろ測ってみます。これはSH3のとは まったく違って、パルス出力のための仕組みが入っていたりしてH8らしいデバ イスだ。
ITU0のTSRはread modify writeじゃないと挙動が不安定になるのにちょっとは まった。(全部クリアだから..といきなり0を書きこんで失敗)
#pragma interrupt
void
itu0_a ()
{
  t0 = ITU0->TCNT;
  ITU0->TSR &= ~ITU0_TSR_IMFA;	// clear flag.
}
このt0によって、GRAとコンペアマッチしてからどのくらいの時間で割り込み 処理を開始できるか測ってみたところ、モニタ上で9.6us、ロム上でも3.2us かかっていた。しかしこのコードは-Oでオプティマイズをかけていても
000fe566 <_itu0_a>:
   fe586:	01 00 6d f2 	01 00 6d f2       mov.l	er2,@-er7
   fe58a:	01 00 6d f3 	01 00 6d f3       mov.l	er3,@-er7
   fe58e:	2a 68       	2a 68             mov.b	@0x68:8,r2l
   fe590:	0d a3       	0d a3             mov.w	e2,r3
   fe592:	0c b3       	0c b3             mov.b	r3l,r3h
   fe594:	0c 2b       	0c 2b             mov.b	r2h,r3l
   fe596:	0c a2       	0c a2             mov.b	r2l,r2h
   fe598:	18 aa       	18 aa             sub.b	r2l,r2l
   fe59a:	0d 3a       	0d 3a             mov.w	r3,e2
   fe59c:	7a 62 00 00 	7a 62 00 00 ff 00 and.l	#0xff00,er2
   fe5a0:	ff 00 
   fe5a2:	2b 69       	2b 69             mov.b	@0x69:8,r3l
   fe5a4:	14 ba       	14 ba             or.b	r3l,r2l
   fe5a6:	6b a2 00 0f 	6b a2 00 0f e6 48 mov.w	r2,@0xfe648:32
   fe5aa:	e6 48 
   fe5ac:	7f 67 72 00 	7f 67 72 00       bclr	#0x0,@0x67:8
   fe5b0:	01 00 6d 73 	01 00 6d 73       mov.l	@er7+,er3
   fe5b4:	01 00 6d 72 	01 00 6d 72       mov.l	@er7+,er2
   fe5b8:	56 70       	56 70             rte	
こんなコードを吐かれてしまう。アセンブラで書き直し。 bset, bclr, bnot, bst, bist命令はバイト単位でread modify writeする 命令なので、ITU0->TSRのフラグクリアはこれだけでいい。
	.global _itu0_a
_itu0_a:
	mov.l er0, @-er7
	mov.w @0xff68:16, r0
	mov.w r0, @_t0
	bclr  #0x0, @0x67:8
	mov.l @er7+, er0
	rte
これにすると1.28us縮まる。なのでロム上で1.92us。データシートによると割 り込み応答時間 19〜41 実行中の命令が終了するまでの待ちに依存。なので (.76us〜1.64us)で割り込み処理に入るということなのでまぁそんなとこかな。 なんにしろ、1クロック13usのノギスの信号毎に割り込み入れるのはちょっと無 理。一軸でもギリギリなのに三軸にしたらまったく時間的余裕がない。
ということで、ノギスデータ読みこみの後半24clockだけポーリングして読むこ とにしました。
信号の最初の立ち下がりをIRQ0で受けてタイマーを起動。タイマーのコンペア の二つは読み出すべきデータの直前(A)と、その後(B)に設定。データ前のタイ マA割りこみで最初の立ち下がりを検出するためにIRQ0をオン。IRQの最初の立 ち下がりでIRQ0の割りこみをオフにして、そのまま割りこみハンドラの中で24 クロック、ポーリングでデータ読みこみ。読み込み終わって十分たった所でタ イマBの割りこみが入るのでここでまたIRQ0をオンにして次のデータ信号のトリ ガを待つ。

              24clock                  24clock
----+      +-+ +-+    +-+           +-+ +-+   +-+       +-------〜330ms---
    |      | | | |    | |           | | | |   | |       |          ↑
    |      | | | |    | |           | | | |   | |       |   [TimerB割り込み]
    +-52us-+ +-+ +....+ +---112us---+ +-+ +...+ +--70us-+   IRQ0割り込みON
    |                       ↑       ↑                     タイマOFF
   ↓                 [TimerA割り込み]|                            |
 [IRQ0割り込み]        IRQ0割り込みON |                            |
  IRQ0割り込みOFF            |    [IRQ0割り込み]                   |
  タイマを起動               |    IRQ割り込みOFF                   |
     +-----------------------+  24clockポーリングでデータ読みこみ  |
     |                                                             |
     +-------------------------------------------------------------+
という方針でこれ。GRAの1200(384us)とGRBの4000(1280us)はちょうどいいとこ を狙って設定。クロックの最初のトリガでデータを読みこむのはタイミング的 にどうしても辛いので、スキップしてclock_cntは1から。データの下3bitは 0.001mm以下のところになるので問題ない。最終的に捨ててしまうし。このあた りの設定は泥くさいけれど、仕方ない。モニタからロムに持っていったところ で多少パラメータの修正もいるかも。
int data_phase, clock_cnt;
int dro0;

void
test ()
{
  SCI_PRINTF("interrupt mode\n");
  // DRO0 clock signal connected to Port 8:0
  P8->DDR = 0;
  // DRO0 data signal connected to Port A:0
  PA->DDR = 0;

  // External interrupt setting.
  *ISCR |= 0x1;		// Falling edge.
  *IER |= IER_IRQ0E;	// interrupt enable.

  // DRO0 Timer
  ITU->TSTR &= ~ITU_TSTR_STR0;	// timer 0 stop
  // Internal clocl/8, Don't clear TCNT.
  ITU0->TCR = ITU0_TCR_ICLK8;
  ITU0->TIOR = 0; // compare match. don't output.
  ITU0->TIER = 0; // disable interrupt here.
  ITU0->TCNT = 0;
  ITU0->GRA = 1200;
  ITU0->GRB = 4000;
  ITU->TSTR |= ITU_TSTR_STR0;	// timer 0 start

  data_phase = 0;
  clock_cnt = 0;
  intr_enable ();

  while (/*CONSTCOND*/1)
    asm volatile ("sleep");
}

#pragma interrupt 
void
irq0 ()
{
  // Disable IRQ0 interrupt.
  *IER &= ~IER_IRQ0E;
  if (data_phase)
    {
      // Data sampling. skip 1st bit.
      for (clock_cnt = 1, dro0 =0; clock_cnt < 24; clock_cnt++)
	{
	  while (!(P8->DR & 0x1)) /* LOW  */
	    ;
	  /* Wait for falling edge */
	  while (P8->DR & 0x1) /* HIGH  */
	    ;
	  if (PA->DR & 0x1)
	    dro0 |= 1 << clock_cnt;
	  /* Wait for rising edge */
	}
    }
  else
    {
      data_phase = 1;
      // TSR must be read modify write.
      ITU0->TSR &= ~(ITU0_TSR_IMFA | ITU0_TSR_IMFB | ITU0_TSR_OVF);
      ITU0->TCNT = 0;
      // Enable ITU0
      ITU0->TIER = ITU0_TIER_IMIEA | ITU0_TIER_IMIEB;
      // Timer 0 start.
      ITU->TSTR |= ITU_TSTR_STR0;
    }
}

#pragma interrupt
void
itu0_a ()
{

  // Enable IRQ0 for sampling data.
  *ISR &= ~IER_IRQ0E;
  *IER |= IER_IRQ0E;

  ITU0->TSR &= ~ITU0_TSR_IMFA;	// clear flag.
}

#pragma interrupt 
void
itu0_b ()
{

  ITU0->TIER =0;	// Disable ITU0 interrupt until next irq0()
  ITU0->TSR &= ~ITU0_TSR_IMFB;	// clear flag.
  ITU->TSTR &= ~ITU_TSTR_STR0;	// timer 0 stop

  if (dro0 & (1 << 23))
    dro0 |= 0xff000000;
  SCI_PRINTF ("%d %d\n", dro0 >> 3, clock_cnt);

  // Enable IRQ0
  *IER |= IER_IRQ0E;
  data_phase = 0;
}
なんとかものになりそうな気がしてきた!


風邪をひいてしまいました。レースの合間のちょうどいい時期にかかってくれた。

DRO計画を進めます。久々に秋葉に行っていろいろ買ってきました。基盤の後に 飛び出た足を切断するのにいいニッパや、極細のワイヤーストリッパとか。ブ レットボードというものの存在も知ったので買ってきました。0.1uFのコンデン サとか、LM339、SipexのRS232Cトランシーバーとか。僕はヒロセで買えるもの はヒロセで、次に千石、いかなくちゃいけないのであれば秋月。混んでるのが 苦手で。筑波でもいつも1ヘア裏なのもそのあたりの理由なのだ。

H8/3052のポート8につないだボタンのプルアップする電圧を変えてみて様子を 調べてみたところ、3.3Vまで下げるとチャタる。1.5Vまで下げると完全に挙動 がおかしくなる。4.5Vあれば大丈夫。3052のデータシートの電気特性によると
シュミットトリガP8(0-2)入力電圧 : Max Vcc*0.7 入力容量15pF
これは5V CMOS(VIH3.5-VOH4.44)なのかな。(この基盤はVcc 6Vかけている)

LM339を買ってきたのはこれは単電源で動くコンパレータということで、これで ノギスの信号1.5V(これは1.8VCMOS?)をひっぱりあげようという目論見だったの だったのだけれども、「信号のレベル変換」でいろいろググって見ると普通は 74VHC125のようなロジックICを使うようだ。
調べてみるとLM339は速度1us程度(この速度が何を意味しているのかは?)でロジッ クICに較べると遅いということだけれど、使えるっぽい。ノギスのクロック は13us(77KHz)程度なのでこれで。
ブレットボードで逆相コンパレータで組んでみました。最初は足位置を表裏間 違えて組んでしまい、よくわからない挙動にあたふた。ふと、ICを触ってみる とカンカンに熱くなっていておかしいことに気付いた...。ICを取りかえてこん どこそ...と試すも全然だめ。正相にしても逆相にしても、オシロスコープで見 ると逆相の数mVの信号が出てくるだけなのだ。ググってみるとプルアップしな いとだめみたい。5kΩでプルアップしてみると、やっと信号がでました!!
にてもブレットボードは便利ね〜。これを今迄知らなかったのが悔やまれる。

さて、この信号をAKI-H8/3052ボードにつなげます。GNDを合わせてPORT8の#0に 増幅した信号をつなげるだけ。信号のレベルが、M/Bの電源を入れるとグッと上 がるのが不安だけれど...。このシステムはM/Bの電源と別に電池を使っていて 1.5Vでノギスを動かして、3V上乗せでオペアンプを動かして4.5V逆相の信号に して(立ち下がりが欲しいので)、GNDをM/Bにつないでいる状態。

ノギスのクロック信号をつなげてまずはポーリングで信号状態の様子を見るこ とに。
  P8->DDR = 0;
  static int d[100], e[100];
  int i, j, k;
   for (j = 0; j < 100; j++)
    {
      for (i = 0; (P8->DR & 0x1);)
	i++;
      for (k = 0; !(P8->DR & 0x1);)
	k++;
      d[j] = i;
      e[j] = k;
    }

  for (j = 0; j < 100; j++)
    {
      SCI_PRINTF ("%d, %d %d\n", j, d[j], e[j]);
    }
  while (1)
    asm volatile ("sleep");
結果は
44, 7 13
45, 7 12
46, 8 12
47, 7 12
48, 8 145
49, 613698 98
50, 7 13
51, 7 12
52, 8 12
53, 7 13
54, 7 12
55, 8 12
56, 7 13
57, 7 12
58, 8 12
59, 7 13
60, 7 12
61, 8 12
62, 7 13
63, 7 12
64, 8 12
65, 7 13
66, 7 12
67, 8 12
68, 7 13
69, 7 12
70, 7 13
71, 7 12
72, 8 12
73, 7 213
74, 7 13
75, 7 12
76, 8 12
77, 7 13
78, 7 12
79, 8 12
80, 7 13
81, 7 12
82, 8 12
83, 7 13
84, 7 12
85, 8 12
86, 7 13
87, 7 12
88, 8 12
89, 7 13
90, 7 12
91, 8 12
92, 7 13
93, 7 12
94, 7 13
95, 7 12
96, 8 12
97, 7 143
98, 613700 99
99, 7 12
おお! クロックきっちり拾えてるじゃない。一歩前進した。次はこれに合わせ てデータ信号を拾えるかだ。




ひき続きAKI-H8 3052ボード。LCD部分を秋月のサンプルから書き起こした。で
もちょっと気にくわない。このSC1602というLCDモジュールはコントローラに日
立のHD44780を使っているのでルネサスからデータシートを落としてきて納得い
くコードに。gdb-6.8にルネサスのモニタ用に、かなりてきとうなスタブをつけ
てgdb上からロード、実行できるようにもしてみたのだけど...、ちょっと待っ
た。そんなことをやるのが目的じゃない。あくまで端子の外に出るのが目的だ。
秋月のmbtestと同じ動きをして、さらにシリアルコンソールにも出力す
るプログラム。これ以上は凝らないように。

まずはリセットボタンを追加してみました。リセット回路はCPUボード上にある ので、RST端子とGNDの間にボタンを追加するだけ。これがあるといつでもモニ タに戻れるので便利。最初に作っておけばよかった。
次は外部入力ボタンを。ポート8の#2にボタンを追加。ポート8は0-3がIRQ0-3に なるので割りこみのテストにもなるかなと。#0-#2がシュミットトリガ入力。

よくわからないけれど、プルダウン、プルアップをしておかないといけないら しいので、なんとなく...。H8マイコン入門の作例を参考に抵抗は10KΩ、コン デンサはガラクタの中から拾ってきたもので容量は不明(作例では0.1μF)。こ のあたりのチョイスをどうしたらいいのかがまったくわからないんだよね。 これはプルダウンしてるはず。

プログラムからボタンの入力を拾えました。よかった〜。最悪ぶっ壊すと、ま たこのキット組み直しかよと思うとかなりドキドキした。



待ってました!すまぐるta-1さんの最終戦の写真です。いつもありがとうござい
ます。



なかなかオーソドックスに綺麗なフォームだ。そしてまた純白のカウルがグレー の路面によく映える。(自画自賛モード)

















こうして見ると滅茶苦茶楽しそうだよね。楽しいことは楽しいんだけど、この あたりは焦りまくりで。むしろ胃が痛いくらい。
RTミズシマさんの集計によるとランキング23位らしい。まぁそんなとこか〜。 23は懐かしい。90HSP選手権、NB125の時のゼッケンだ。縁起が悪いな。



H8の続きです。デバイスの初期化をするにはまずはdelayを作らないとならない。 きちんとサイクルをとるためにアセンブラで書くのだけれど、そうすると h8300-hms-gccのコーリングコンベンションを調べなければ。
ググってみるとH8/300 Application Binary Interface for GCC に説明がある。gcc-3.1/gcc/config/h8300/h8300.hあたりから読んでもわかるはずだけど、こっちの方がいい。
r0-r3がcaller saved
r4,r5,r6(fp),r7(sp)がcallee saved

引数は可変長引数でなければ、3つまでr0-r2でレジスタ渡し。その後はスタック。
8byteまでの返り値はr0,r1で。

MSB1st。スタックは降りてくる。
秋月のCコンパイラはr0,r1だけがcaller savedなのでそのオブジェクトをgccの とリンクすることはできない。
フレームポインタはいらないのでこれからは-fomit-frame-pointerでコンパイ ルすることにします。
	.globl _delay
_delay:	/* one loop 24cycle: 25Mhz-> .96us */
a:	sub.l	#1, er0  /* 6 */
	nop /* 2 */
	nop /* 2 */
	nop /* 2 */
	nop /* 2 */
	nop /* 2 */
	nop /* 2 */
	nop /* 2 */
	bne	a	 /* 4 */
	rts
を追加。微妙に割り切れないのだけど、マイクロ秒レベルならいいでしょう。 一秒タイマーにしてLEDを点滅させると結構ずれる。
SCIを見てみると、これはSH3のSCIとまったく同じだね。カカっとprintfデバッ グできるところまで(といっても%s,%x,%dだけ)実装しました。varargを使う時 はstdarg.h じゃないとだめ。varargs.hは整合性がとれていない。
AKI/H8-3052 M/Bのタクトスイッチ、DIPスイッチ、LCDも動くようにしました。 かなり外堀が埋まってきた。


gccのh8300-hmsのアーキテクチャには3種類ある。
h8300  H8/300
h8300h H8/300H
h8300s H8S
H8/3052はH8/300Hシリーズなのでh8300h。
h8300-hms-gcc特有のオプションは
----------------------------------------------------------------------
$ h8300-hms-gcc --target-help

Target specific options:
  -malign-300               Use H8/300 alignment rules
  -mno-h                    Do not generate H8/300H code
  -mh                       Generate H8/300H code
  -mrelax                   Enable linker relaxing
  -mslowbyte                Consider access to byte sized memory slow
  -mno-quickcall            Do not use registers for argument passing
  -mquickcall               Use registers for argument passing
  -mint32                   Make integers 32 bits wide
  -mno-s2600                Do not generate H8/S2600 code
  -ms2600                   Generate H8/S2600 code
  -mno-s                    Do not generate H8/S code
  -ms                       Generate H8/S code

There are undocumented target specific options as well.
  no emulation specific options.
$ 
----------------------------------------------------------------------
なので、-mh(必須) -mint32(うっかり間違いもなく楽そう。intが16bitは絶対 はまるはず)。
次はldscript。/usr/pkg/libexec/cross-h8300-hms/h8300-hms/lib/ldscripts/にサンプルがある。
モニタ上のメモリマップに合わせて作成。ALIGN(4)は余計かも。レジスタを 32bitで使えるし、こうしておきたい気持ちなのだけど、実際どうなのかは?? .bssの中で_bss_startを設定しているのは、ROM版の時にはデータセクションと BSSセクションが連続しないため。PROVIDEしたシンボルはスタートアップの時 のBSSクリアのために使う。このアーキテクチャはCのシンボルにアンダースコ アがいる。
----------------------------------------------------------------------
OUTPUT_FORMAT("coff-h8300")
OUTPUT_ARCH(h8300h)

MEMORY {
       vectors	: o = 0xfdf10, l = 0x100
       ram	: o = 0xfe200, l = 0x1d00
}

SECTIONS {
	 PROVIDE (stack_top = 0xfff00);
	 .vectors :
	 {
		*(.vectors)
	 } > vectors

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

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

	 .bss :
	 {
	         PROVIDE (_bss_start = .);
	      	 *(.bss)
	 } > ram
	 PROVIDE (_bss_end = .);
}
----------------------------------------------------------------------
テストプログラムはLEDを点灯するだけのもの。
----------------------------------------------------------------------
#include <sys/types.h>

void
machine_startup ()
{

  *(u_char *)0xffffffc8 = 0xff; /* set port 5 for output */

  while (/*CONSTCOND*/1)
    *(u_char *)0xffffffca = 1; /*  LED connected to port 5 on */
  /* NOTREACHED */
}
----------------------------------------------------------------------

/usr/pkg/bin/h8300-hms-gcc -mh -mint32  -c start.c
/usr/pkg/bin/h8300-hms-ld -T ldscript.ram -o test start.o
/usr/pkg/bin/h8300-hms-objcopy -Osrec test test.srec
こんな感じで。

----------------------------------------------------------------------
 H8/3052 Advanced Mode Monitor Ver. 3.0A
 Copyright (C) 2003 Renesas Technology Corp.

: l
~>Local file name? test.srec
8 lines transferred in 0 seconds 
!
  Top Address=FE200
  End Address=FE217
: r
  PC=0FE200  CCR=80:I.......  SP=000FFF00
  ER0=00000000  ER1=00000000  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF00
: g
----------------------------------------------------------------------
OK。PCはモニタがスタートアドレスに設定してくれる。ベクタ領域のロードが あってもPCはちゃんとテキストの先頭に設定します。
ROM化のテスト。ROM用のldscriptを作成。リセットされると0x0のリセットベクター に書かれているアドレスにジャンプするので、それ用に設定する必要がある。 スタックポインタも自前で設定しないといけないので、設定用のアセンブラソー スを追加。
----------------------------------------------------------------------
OUTPUT_FORMAT("coff-h8300")
OUTPUT_ARCH(h8300h)

MEMORY {
       vectors	: o = 0x00000, l = 0x100
       ram	: o = 0xfdf10, l = 0x2000
       rom	: o = 0x00100, l = 0x7ff00
}

SECTIONS {
	 PROVIDE (stack_top = 0xfff00);
	 .vectors :
	 {
		*(.vectors)
	 } > vectors

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

	 .data :
	 {
	 	 *(.data)
		 . = ALIGN(4);
	 } > rom

	 .bss :
	 {
	         PROVIDE (_bss_start = .);
	      	 *(.bss)
	 }  > ram
	 PROVIDE (_bss_end = .);
}
----------------------------------------------------------------------
スタートアップ用。h8300-hms-asには設定するオプションはなし。マシンは .h8300hで設定してあるので。
----------------------------------------------------------------------
	.h8300h
	.section .vectors
L.start: .long start

	.section .text
	.globl	start
start:
	mov.l	#stack_top, er7
loop:	jmp	@_machine_startup
	jmp	@loop
	/* NOTREACHED */
----------------------------------------------------------------------
これでRAM上での開発と、ROM化への道筋がついた! 後はもうちょっとサバイバルキットを作っておくだけだ。



机の天板の仕上げをしました。#400で水研ぎして、ポリッシャーを使ってラビ
ングコンパウンド→中細で磨きあげ。後は中性洗剤でじゃぶじゃぶ洗って終了。
このあたりは僕定番のカウル塗装仕上げの木工版。



AKI-H8/3052Fの方はルネサスのモニタを入れたとこまでだった。今日はモニタ からプログラムをロードして実行するとこまでやりました。
まずはモニタがどう実行されているか。このボードはモード7で動いている。
H8/3052
ROM 512KByte
RAM 8KByte
----------------------------------------------------------------------
モード7                   MONITORの設定
+---------0x00000         VECTOR(0)
|vector(0x00-0xf3)
|---------0x000ff         ROM(100)
|
ROM                       --------最大 0x5d00
|
|
|
+---------0x7ffff






+---------0xfdf10         USER(0FDF10)ユーザプログラムの仮想ベクタ領域
|                         ----vector end (0xfe00f)
|                         RAM(0FE010) モニタが使用するRAM領域
RAM                       ----モニタ最大 0xfe18c
|                         ----ユーザプログラムのスタート 0xfe200
|                                7424Byte
+---------0xfff0f         STACK(0FFF00)ユーザプログラムの初期SP値


+---------0xfff1c
|I/O                      SCI(0FFFB8)
+---------0xfffff
----------------------------------------------------------------------
モード7は1Mバイトモード。
モードはMDCR(0xffff1)で確認できる

モニタ上のユーザプログラムを配置する領域は0xfe010-0xfdfff
モニタのリソースは
ROM 2-23KByte
RAM 130-380Byte

RAM(0FE000)では内部割りこみのベクタテーブルと衝突する。0FE010にすべき。

このメモリマップに合うようにサンプルのMBTEST.SRCの.SECTIONをRAM用に書き かえ。a38h.exeでアセンブルしてobjdumpで確認。
$ h8300-hms-objdump -x mbtest2.MOT

mbtest2.MOT:     file format srec
mbtest2.MOT
architecture: UNKNOWN!, flags 0x00000000:

start address 0x000fe200

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .sec1         00000004  000fdf10  000fdf10  00000022  2**0
                  CONTENTS, ALLOC, LOAD
  1 .sec2         00000280  000fe200  000fe200  00000038  2**0
                  CONTENTS, ALLOC, LOAD
  2 .sec3         00000020  000ff200  000ff200  00000784  2**0
                  CONTENTS, ALLOC, LOAD
h8300-hms-objdump: mbtest2.MOT: no symbols
$ 
これをモニタからロードしようとすると
: l
~>Local file name? mbtest2.MOT
94 lines transferred in 0 seconds 
!
  ********  Check Sum Error  ********  
: 
失敗。ググってみると秋月のオブジェクトコンバーターはチェックサムが2の補 数なのに対してルネサスのモニタは1の補数のチェックサムしか受けいれないら しい。
h8300-hms-objcopy mbtest2.MOT c.mot で変換してみると
: l
~>Local file name? c.mot
90 lines transferred in 0 seconds 
!
  Top Address=FDF10
  End Address=FF21F
: g


成功! 次はプログラムの開発環境整備だ。



筑波選手権最終戦。昨日の二本目がとても調子がよかったので、朝から気合い
と期待にみなぎっている。

予選は開始5分前にウォーマー外し。ウォーマー外し+装備で2分、暖機上に行って 軽くE/Gかけて、コースインゲートでちょうど5分。
昨日のイメージ通りに走りはじめる。しかし、8前しかでない。なぜだ。なぜな んだ。昨日はソロでも7前で周回できたのに...。誰か先生がやってこないかなと タイムアタックしながら待つも、結局誰も来なかった。 1'07.879で予選21位です。
ちょっとじたばたしはじめる。プラグ9番は低い気がする..と10番へ。リアサスの 残ストも10mm残ってるのでプリロードを133mm→135mmに。(昨日も10mmだけれど。 STDのショーワだと6mmくらいまで沈ませた方がいいので)
さて決勝。この前の岡山ではウォーミングアップラップで気迫負けして、テン ション下がってしまったというのもあって、今日はちょっと気合いで。テンションもウォーミングアップ。
スタートは普通。1ヘアまでに例によって抜かれてしまう。もっとガツガツいけ ればいいのだけれど。まぁそういう性分じゃないので仕方ない。
とはいえレースは序盤が全てだ。ちょっと無理目でも抜きにいきます。3周目く らいで場が落ちついた。ここでP-LAPの電源を入れる。うっかりP-LAPのスター トを忘れていたのだ。自分では結構いい感じに攻めていたので、7秒は出てるだ ろうと思ったら...8ケツしか出てないよ!
大崎さんのグループ追いたいけど、ちょっと距離がある。持ちタイムに不利あ るのに辛いな...。毎周離されてしまう。後を振り返ると結構アドバンテージ稼 いだ。向こうも調子悪いみたいね...と思いつつレコードラインで周回。しかし。 8前までしか出ない。昨日の二本目は幻だったんだろうか...。それに曲がらな いし。イニシャル抜いたの失敗だったかな。プラグの10番は正解かな。
毎周ドキドキしながらバックストレッチで後を振り返ることしばらく。1ヘアで 黄旗、CX立ちあがりでも黄旗、「うんわー」と思いながら走っていたら、2ヘアで 振り返ると、真後まで追いつかれてしまった。やばい!!コントロールラインで は0.1秒差でした。ラストラップで助かった〜。上位陣のDNS、フライングペナ ルティー、転倒によりおこぼれの15位。

レース後、タイヤ引きとりサービスに持っていってもらおうと思って電話をし てみると、もう筑波から引きあげて帰る途中だという...。20本近く持ってき たのに...。
お疲れだけどホームジョイ本田で2x4材を買って帰宅。
今日も昨日と同じように中野長者橋から渋滞(西新宿Jct.まで15分の表示)だっ たので、試しに降りてみた。西新宿Jct.の下まで行くのに10分程度。ベストルー トでいっても家まで30分かかった(幡ヶ谷で工事渋滞はあったけれど)。降りて も乗っても大して変わらない。


筑波選手権は終了したけれど、まだ岡山とMCFAJの最終戦と、2戦残ってます。 テンションを上げる方法を見つけたい。



筑波選手権最終戦、特別スポーツ走行に行ってきました。なんか久々の筑波だ。


一本目、E/Gは走ってる。ストレートはどのマシンにも遜色ない感じ。しかしタ イムは出ず。8.9まで。前回は特走けって整備してたので久々のスタート練習。 これが楽しみ。ゼロヨンやってるような気になってくるのだ。クラッチは気に なるけれど、4回全部やってしまった。一回目、蹴った足が滑ってヨロけてしま い、恥ずかしかった...。
その後、トラックに乗ってコースに出てインストラクターがアドバイスしてく れるというのがあったので参加。最終コーナーのところで宇井選手の「小排気 量も、ブレーキするとこまで開ければいいです」に、ハッとした。そうだよな。 突っこみ過ぎたらちょっとブレーキあててやればいいんだ。
二本目、前半はいつも通り8秒に入れるのがやっと。中盤、速い選手に抜かれて、 いつもならば、「うぅぅ速いなぁ」となるとこなのだけど、なんか「あれ? イ ンフィールドなら結構ついていけるかも!?」と調子に乗りはじめて、7.0まで出 た。正月以来の久々に明るい展開だ。まったくクリップつけなくてもいいから 突っこむ、開ける前からパーシャルで。最終コーナーは、今迄「白いスポンジ のとこまで」という目印だったけれど、ここは走りに開度を合わせた方がコー ナーに集中できるっぽい。倒し込み終了まで開けていける。

リングを新品にして、ギヤオイルを交換。D'sで明日用のプラグを買って帰宅。 9.5が欲しかったのだけど、なかったので9番。(今日は10番)

中野長者橋から渋滞だとそこから35分。
明日は気合いだ。



菜園状況です。ちょっとづつ間引きしています。ニンジンが一本、葉が食べら
れてしまっていた。なんだろう。もう蝶や蛾のシーズンは過ぎたはずなのに。

長ネギ

ニンジン。初心者には葉を食べられることのない根物が安牌かも。

AKI-H8/3052Fにルネサスのモニターを入れました。
http://www.mech.tohoku-gakuin.ac.jp/rde/contents/tech/h8/h8_3052.html を参考にしました。
使ったのは
http://japan.renesas.com/
半導体セミナー
→サンプルプログラム
→H8/300Hシリーズ H8/300H Tinyシリーズ
HEW3,HEW4(C/C++ Compiler Ver. 6.0)対応版 H8/300H用 モニタプログラム
これ用に参考URLのを修正した akih8mon.bat(3052仕様)(3052,57600bps仕様)を300h/sourceの下に置いて コンパイル(ログ) 後は/etc/remoteに
hmon:dv=/dev/dty00:br#57600:pa=none:dc:
すれば
$ tip hmon
connected


 H8/3052 Advanced Mode Monitor Ver. 3.0A
 Copyright (C) 2003 Renesas Technology Corp.

: ?
 Monitor Vector 00000 - 000FF
 Monitor ROM    00100 - 059EB
 Monitor RAM    FE000 - FE0D3
 User    Vector FDF10 - FE00F

 .  : Changes contents of H8/300H registers.
 A  : Assembles source sentences from the keyboard.
 B  : Sets or displays or clear breakpoint(s).
 D  : Displays memory contents.
 DA : Disassembles memory contents.
 F  : Fills specified memory range with data.
 G  : Executes real-time emulation.
 H8 : Displays contents of H8/3052 peripheral registers.
 L  : Loads user program into memory from host system.
 M  : Changes memory contents.
 R  : Displays contents of H8/300H registers.
 S  : Executes single emulation(s) and displays instruction and registers.
: r
  PC=000000  CCR=80:I.......  SP=000FFF00
  ER0=00000000  ER1=00000000  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF00
: h8 sci0
 <REG>  <ADDR> <CODE>   < 7      6      5      4      3      2      1      0 >
 SMR     FFB0 00000000   C/A    CHR     PE    O/E    STOP    MP    CKS1   CKS0 
 BRR     FFB1 FF
 SCR     FFB2 00000000   TIE    RIE     TE     RE    MPIE   TEIE   CKE1   CKE0 
 TDR     FFB3 FF
 SSR     FFB4 10000100   TDRE   RDRF   ORER   FER    PER    TEND   MPB    MPBT 
 RDR     FFB5 00
 SCMR    FFB6 ....00.0                               SDIR   SINV          SMIF 
: 
おぉ、これはいいね。



ここ2日程PowerEdge T105をデスクトップに使ってみたところ、とにかく静粛な
のがいい。びっくりする程バカでかいCPUクーラーと100mm大径クーラーのおか
げかな。これデスクトップにしようということで、USBカードリーダーをつけて
カメラの画像をとってこようとすると...

umass0: BBB bulk-out clear stall failed, STALLED
だめだ。デスクトップの方はカードリーダーは使えるけれど、USB入りカーネルだと ディスクI/Oが繁雑になるとすぐ落ちるし。


pkgsrc/cross/h8300-hms-gccは
--- ./gcc-3.1/gcc/cp/decl.c.orig	2002-05-04 03:55:23.000000000 +0900
+++ ./gcc-3.1/gcc/cp/decl.c	2008-10-15 14:50:12.000000000 +0900
@@ -454,9 +454,9 @@
 /* The binding level currently in effect.  */
 
 #define current_binding_level			\
-  (cfun && cp_function_chain->bindings		\
-   ? cp_function_chain->bindings		\
-   : scope_chain->bindings)
+  (*(cfun && cp_function_chain->bindings		\
+   ? &cp_function_chain->bindings		\
+     : &scope_chain->bindings))
 
 /* The binding level of the current class, if any.  */
 
--- ./gcc-3.1/include/obstack.h.orig	2001-03-15 04:44:38.000000000 +0900
+++ ./gcc-3.1/include/obstack.h	2008-10-14 15:42:08.000000000 +0900
@@ -423,7 +423,8 @@
 ({ struct obstack *__o = (OBSTACK);					\
    if (__o->next_free + sizeof (void *) > __o->chunk_limit)		\
      _obstack_newchunk (__o, sizeof (void *));				\
-   *((void **)__o->next_free)++ = ((void *)datum);			\
+   *((void **)__o->next_free) = ((void *)datum);                       \
+   __o->next_free += sizeof(void *);                                   \
    (void) 0; })
 
 # define obstack_int_grow(OBSTACK,datum)				\

でコンパイル終了。gdbは素のgdb-6.8を--target=h8300-hmsでコンパイルしただけ。

このプロジェクトは今年の正月にアラレ組み治具を作ったとこに始まっている。
治具をフライスで作る。
↓
DROでやれたらいいよね
↓
とりあえず安い中国製ノギス買ってみた。
↓
Cassiopeia E-55につなげてみる(失敗。 ノギスの信号のレベル変換をスピーカー
アンプにやらせたのも今思えば無茶だったか。こういう信号はフルスイングで
きるOPアンプじゃないとだめみたい)
↓
マイコンでやろう! と決めた。
↓
PIC? H8? AVR? この手のDROを自作してる人はPICを使っているけれど...
↓
CPU的にH8が素直そうなのでH8に決定!
↓
まずは練習だな...←やっと今ここ。
まだまだ先は長いけれど、こういうモチベーションを機に電気苦手を克服した いというのが目的でもあり。



AKI-H8/3052F、なんとか動きました。まずは取説通りにWindows上でコンパイルして転送。



実はここに来るまですんなりとはいかなかった。電源を入れてみるとLCDはこの 状態(リセットがかかっていない状態)。LEDの方はプログラム通り動いている。

基盤をじっくり見直して、マニュアルも読み直してみても問題ない...。どうも LCDが不安定なようだ。ときたまちゃんと動くのだけどスイッチをON/OFFして表 示を更新すると文字化けしてしまう。ここまで来ればいい方で、大体は上の写 真の状態。

このプログラム、MBTEST.SRCについてググってみると、3048用のそのままのよ うなので3048の16MHzから3052の25MHz用にウェイト用のスピンループの回数を 調整してやるも、変わらず。
LCDアダプタのM/B側のハンダがちょっと汚なかった(導通はあるけど、一部パター ンが見えてるような状態。)ので、ハンダゴテをあてなおしてみたところ!(この写 真は直した後)、安定動作しました。結構厳しいのね...。ナメてましたよ。

開発環境をNetBSDからにしようととりあえずpkgsrc/cross/h8300-hms-*を入れ てみようとしたところ、コンパイル失敗。これ だtoolchain/32595: gcc/read-rtl.c: invalid lvalue in increment (gcc 4) 。 ここはこれで通 りすごしたけれど、まだ他にもこの類の修正が必要だ。ターゲットは違えど連 日gccにやられるとは。



どうも最近、スジがついたり鼻落ちする自動カンナの刃をひっくり返して新し
い刃に。主にSPFを削っていたのでヤニがすごい。



ついでに横のカバーを外しました。カバーの内側にたまった大鋸屑の掃除が大 変なので。変速機構も壊れてしまったので直そうかと思ったけど、今回はパス。 ざっと眺めてみて、ちょっと気合いかな...という感じがした.
変速機構、ほとんど使ってなかったし。マキタにしておけばよかったなと今は 思っている。

この前買っておいておいたAKI-H8/3052ボードを組みたてました。ピンヘッダの ハンダ付けは疲れた。110ピンあるんだもの。全部で5時間くらいかかった。ちゃ んと動くといいけど...。電子工作は失敗経験しかない。不安だ。




ここずっと毎日削ってはニス塗りを繰り返していた、机の天板。かなりピカピ
カに。もうちょっと鏡面目指して続けます。



PowerEdge T105に試しにXサーバ入れてみたとこ、僕なら(文字が読めて、緑が 緑に見れればいいいいよレベル)十分使えるレベルのビデオカードだった。 (ML115はさすがに無理だと思ったけれど)、騒音レベルもかなり低いし、これならデスクトップ用に もう一台注文しておいてもよかったかも。
xorg-server-1.4.2になってxorgcfgがなくなってしまった。かなり便利だったの に。meta-pkgsから入れただけだとfont-sony-miscが入らないので8x16がない。ちょっとはまった。
amd64だと自前の日記ツールからxmlrpcを介してMovabletypeにコミットするプ ログラムが動かない。昨日は仕方なくi386からコミットしたのだけど、ちょこっ と様子を見てみることに。
デバッガで追うとva_argsで死んでいる...。半日かけてデバッグしてみたとこ ろ va_list pointers, bad(?) gcc codeのスレ だった。結局この仕様のままなんだ! 驚いたよ。
動かない理由はこれ。
#include <stdio.h>
#include <stdarg.h>

/*

i386 cc
1:ohayo
2:desu
3:yo
4:desu

amd64 cc
1:ohayo
2:(文字化け)
3:(文字化け)
Segmentation fault (core dumped)

 */
void foo (char *, ...);
void bar (va_list *);

void
bar (va_list *p)
{
  printf ("2:%s\n", va_arg(*p, char *));
  printf ("3:%s\n", va_arg(*p, char *));
}

void
b (va_list p)
{
  bar (&p);
}

void
foo(char *fmt, ...)
{
  va_list ap;

  va_start(ap, fmt);
  printf ("1:%s\n", va_arg(ap, char *));
  b (ap);
  printf ("4:%s\n", va_arg(ap, char *));
  va_end (ap);
}

int
main ()
{
  foo ("ss", "ohayo", "desu", "yo", "!");

  return 0;
}
amd64とi386でva_listの定義が違っていてどうにもならない。amd64上でc++な らコンパイルが通らないからわかるのだけど、ccだとコンパイルは通って動か ないのでいやらしい。これを下のようにva_listを値で渡しているところをポイ ンタにしてva_copyして下に渡さないと(ポインタ渡しのところはそのまま) i386と同じ挙動にならない。vprintfの挙動もi386はインクリメントしないのに amd64だとインクリメントするので挙動を合わせるためにva_argにしてあります。
#include <stdio.h>
#include <stdarg.h>

/*
i386 cc
1:ohayo
2:desu
3:yo
4:desu

amd64 cc
1:ohayo
2:desu
3:yo
4:desu


 */
void foo (char *, ...);
void bar (va_list *);

void
bar (va_list *p)
{
  printf ("2:%s\n", va_arg(*p, char *));
  printf ("3:%s\n", va_arg(*p, char *));
}

void
b (va_list *p)
{
  va_list q;
  va_copy (q, *p);
  bar (&q);
}

void
foo(char *fmt, ...)
{
  va_list ap;

  va_start(ap, fmt);
  printf ("1:%s\n", va_arg(ap, char *));
  b (&ap);
  printf ("4:%s\n", va_arg(ap, char *));
  va_end (ap);
}

int
main ()
{
  foo ("ss", "ohayo", "desu", "yo", "!");

  return 0;
}

xmlrpc-cの該当部分を延々と書き換えてなんとか動くようになったかも。しか しこんなきっついのがあってよくもまぁamd64使えてるなと驚いた。それと xmlrpc-cなんて誰も使ってなさそうということも...^^。
diff -ur xmlrpc-c-1.09.00.orig/include/xmlrpc-c/base.h xmlrpc-c-1.09.00/include/xmlrpc-c/base.h
--- xmlrpc-c-1.09.00.orig/include/xmlrpc-c/base.h	2006-12-24 06:45:21.000000000 +0900
+++ xmlrpc-c-1.09.00/include/xmlrpc-c/base.h	2008-10-12 21:16:45.000000000 +0900
@@ -417,7 +417,7 @@
 void
 xmlrpc_build_value_va(xmlrpc_env *    const env,
                       const char *    const format,
-                      va_list               args,
+                      va_list               *args,
                       xmlrpc_value ** const valPP,
                       const char **   const tailP);
 
@@ -431,7 +431,7 @@
 xmlrpc_decompose_value_va(xmlrpc_env *   const envP,
                           xmlrpc_value * const value,
                           const char *   const format,
-                          va_list              args);
+                          va_list              *args);
 
 /* xmlrpc_parse_value... is the same as xmlrpc_decompose_value... except
    that it doesn't do proper memory management -- it returns xmlrpc_value's
@@ -451,7 +451,7 @@
 xmlrpc_parse_value_va(xmlrpc_env *   const envP,
                       xmlrpc_value * const value,
                       const char *   const format,
-                      va_list              args);
+                      va_list              *args);
 
 /*=========================================================================
 **  Encoding XML
diff -ur xmlrpc-c-1.09.00.orig/include/xmlrpc-c/string_int.h xmlrpc-c-1.09.00/include/xmlrpc-c/string_int.h
--- xmlrpc-c-1.09.00.orig/include/xmlrpc-c/string_int.h	2006-09-25 05:00:00.000000000 +0900
+++ xmlrpc-c-1.09.00/include/xmlrpc-c/string_int.h	2008-10-12 21:18:24.000000000 +0900
@@ -17,7 +17,7 @@
 void
 xmlrpc_vasprintf(const char ** const retvalP,
                  const char *  const fmt,
-                 va_list             varargs);
+                 va_list             *varargs);
 
 void GNU_PRINTF_ATTR(2,3)
 xmlrpc_asprintf(const char ** const retvalP, const char * const fmt, ...);
diff -ur xmlrpc-c-1.09.00.orig/include/xmlrpc-c/util.h xmlrpc-c-1.09.00/include/xmlrpc-c/util.h
--- xmlrpc-c-1.09.00.orig/include/xmlrpc-c/util.h	2006-12-24 06:45:21.000000000 +0900
+++ xmlrpc-c-1.09.00/include/xmlrpc-c/util.h	2008-10-12 21:21:39.000000000 +0900
@@ -140,7 +140,7 @@
 xmlrpc_set_fault_formatted_v(xmlrpc_env * const envP,
                              int          const code,
                              const char * const format,
-                             va_list      const args);
+                             va_list      const *__args);
 
 /* The same as the above, but using a printf-style format string. */
 void 
diff -ur xmlrpc-c-1.09.00.orig/lib/libutil/casprintf.c xmlrpc-c-1.09.00/lib/libutil/casprintf.c
--- xmlrpc-c-1.09.00.orig/lib/libutil/casprintf.c	2006-07-30 06:49:02.000000000 +0900
+++ xmlrpc-c-1.09.00/lib/libutil/casprintf.c	2008-10-12 21:20:25.000000000 +0900
@@ -11,7 +11,9 @@
 static __inline__ void
 simpleVasprintf(char **      const retvalP,
                 const char * const fmt,
-                va_list            varargs) {
+                va_list            *__varargs) {
+  va_list ap;
+  va_copy (ap, *__varargs);
 /*----------------------------------------------------------------------------
    This is a poor man's implementation of vasprintf(), of GNU fame.
 -----------------------------------------------------------------------------*/
@@ -21,12 +23,12 @@
     result = malloc(initialSize);
     if (result != NULL) {
         size_t bytesNeeded;
-        bytesNeeded = vsnprintf(result, initialSize, fmt, varargs);
+        bytesNeeded = vsnprintf(result, initialSize, fmt, ap);
         if (bytesNeeded > initialSize) {
             free(result);
             result = malloc(bytesNeeded);
             if (result != NULL)
-                vsnprintf(result, bytesNeeded, fmt, varargs);
+                vsnprintf(result, bytesNeeded, fmt, ap);
         } else if (bytesNeeded == initialSize) {
             if (result[initialSize-1] != '\0') {
                 /* This is one of those old systems where vsnprintf()
@@ -53,14 +55,15 @@
 void
 xmlrpc_vasprintf(const char ** const retvalP,
                  const char *  const fmt,
-                 va_list             varargs) {
-    
+                 va_list             *__varargs) {
+  va_list ap;
+  va_copy (ap, *__varargs);
     char * string;
 
 #if HAVE_ASPRINTF
-    vasprintf(&string, fmt, varargs);
+    vasprintf(&string, fmt, ap);
 #else
-    simpleVasprintf(&string, fmt, varargs);
+    simpleVasprintf(&string, fmt, &ap);
 #endif
 
     if (string == NULL)
diff -ur xmlrpc-c-1.09.00.orig/lib/libutil/error.c xmlrpc-c-1.09.00/lib/libutil/error.c
--- xmlrpc-c-1.09.00.orig/lib/libutil/error.c	2006-09-04 06:52:31.000000000 +0900
+++ xmlrpc-c-1.09.00/lib/libutil/error.c	2008-10-12 21:23:14.000000000 +0900
@@ -79,11 +79,12 @@
 xmlrpc_set_fault_formatted_v(xmlrpc_env * const envP,
                              int          const code,
                              const char * const format,
-                             va_list      const args) {
-
+                             va_list      const *__args) {
+  va_list ap;
+  va_copy (ap, *__args);
     char buffer[ERROR_BUFFER_SZ];
 
-    vsnprintf(buffer, ERROR_BUFFER_SZ, format, args);
+    vsnprintf(buffer, ERROR_BUFFER_SZ, format, ap);
 
     /* vsnprintf is guaranteed to terminate the buffer, but we're paranoid. */
     buffer[ERROR_BUFFER_SZ - 1] = '\0';
diff -ur xmlrpc-c-1.09.00.orig/src/cpp/client_simple.cpp xmlrpc-c-1.09.00/src/cpp/client_simple.cpp
--- xmlrpc-c-1.09.00.orig/src/cpp/client_simple.cpp	2006-02-05 04:25:18.000000000 +0900
+++ xmlrpc-c-1.09.00/src/cpp/client_simple.cpp	2008-10-12 20:56:36.000000000 +0900
@@ -71,9 +71,11 @@
 void
 makeParamArray(string          const format,
                xmlrpc_value ** const paramArrayPP,
-               va_list               args) {
+               va_list               *__args) {
     
     env_wrap env;
+    va_list ap;
+    va_copy (ap, *__args);
 
     /* The format is a sequence of parameter specifications, such as
        "iiii" for 4 integer parameters.  We add parentheses to make it
@@ -83,7 +85,7 @@
     const char * tail;
 
     xmlrpc_build_value_va(&env.env_c, arrayFormat.c_str(),
-                          args, paramArrayPP, &tail);
+                          &ap, paramArrayPP, &tail);
 
     if (env.env_c.fault_occurred)
         throw(error(env.env_c.fault_string));
@@ -118,7 +120,7 @@
 
     va_list args;
     va_start(args, resultP);
-    makeParamArray(format, ¶mArrayP, args);
+    makeParamArray(format, ¶mArrayP, &args);
     va_end(args);
 
     if (env.env_c.fault_occurred)
diff -ur xmlrpc-c-1.09.00.orig/src/cpp/girerr.cpp xmlrpc-c-1.09.00/src/cpp/girerr.cpp
--- xmlrpc-c-1.09.00.orig/src/cpp/girerr.cpp	2006-03-23 08:44:44.000000000 +0900
+++ xmlrpc-c-1.09.00/src/cpp/girerr.cpp	2008-10-12 21:20:40.000000000 +0900
@@ -14,7 +14,7 @@
     va_start(varargs, format);
 
     const char * value;
-    xmlrpc_vasprintf(&value, format, varargs);
+    xmlrpc_vasprintf(&value, format, &varargs);
     
     string const valueString(value);
 
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_build.c xmlrpc-c-1.09.00/src/xmlrpc_build.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_build.c	2008-10-12 17:54:34.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_build.c	2008-10-12 20:54:59.000000000 +0900
@@ -424,12 +424,14 @@
 void
 xmlrpc_build_value_va(xmlrpc_env *    const envP,
                       const char *    const format,
-                      va_list               args,
+                      va_list               *__args,
                       xmlrpc_value ** const valPP,
                       const char **   const tailP) {
 
     XMLRPC_ASSERT_ENV_OK(envP);
     XMLRPC_ASSERT(format != NULL);
+    va_list ap;
+    va_copy (ap, *__args);
 
     if (strlen(format) == 0)
         xmlrpc_faultf(envP, "Format string is empty.");
@@ -437,7 +439,7 @@
         const char * formatCursor;
 
         formatCursor = &format[0];
-        getValue(envP, &formatCursor, &args, valPP);
+        getValue(envP, &formatCursor, &ap, valPP);
         
         if (!envP->fault_occurred)
             XMLRPC_ASSERT_VALUE_OK(*valPP);
@@ -458,7 +460,7 @@
     const char * suffix;
 
     va_start(args, format);
-    xmlrpc_build_value_va(envP, format, args, &retval, &suffix);
+    xmlrpc_build_value_va(envP, format, &args, &retval, &suffix);
     va_end(args);
 
     if (!envP->fault_occurred) {
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_client.c xmlrpc-c-1.09.00/src/xmlrpc_client.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_client.c	2007-01-01 11:14:06.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_client.c	2008-10-12 21:11:24.000000000 +0900
@@ -633,11 +633,13 @@
                 const char *               const methodName,
                 const char *               const format,
                 xmlrpc_value **            const resultPP,
-                va_list                          args) {
+                va_list                          *__args) {
 
     xmlrpc_value * argP;
     xmlrpc_env argenv;
     const char * suffix;
+    va_list ap;
+    va_copy (ap, *__args);
 
     XMLRPC_ASSERT_ENV_OK(envP);
     XMLRPC_ASSERT_PTR_OK(serverUrl);
@@ -647,7 +649,7 @@
 
     /* Build our argument value. */
     xmlrpc_env_init(&argenv);
-    xmlrpc_build_value_va(&argenv, format, args, &argP, &suffix);
+    xmlrpc_build_value_va(&argenv, format, &ap, &argP, &suffix);
     if (argenv.fault_occurred)
         xmlrpc_env_set_fault_formatted(
             envP, argenv.fault_code, "Invalid RPC arguments.  "
@@ -696,7 +698,7 @@
 
     va_start(args, format);
     clientCall2f_va(envP, clientP, serverUrl,
-                    methodName, format, resultPP, args);
+                    methodName, format, resultPP, &args);
     va_end(args);
 }
 
@@ -969,7 +971,7 @@
 
     /* Build our argument array. */
     va_start(args, format);
-    xmlrpc_build_value_va(envP, format, args, ¶mArrayP, &suffix);
+    xmlrpc_build_value_va(envP, format, &args, ¶mArrayP, &suffix);
     va_end(args);
     if (!envP->fault_occurred) {
         if (*suffix != '\0')
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_client_global.c xmlrpc-c-1.09.00/src/xmlrpc_client_global.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_client_global.c	2006-04-10 23:17:01.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_client_global.c	2008-10-12 21:09:55.000000000 +0900
@@ -127,15 +127,16 @@
               const xmlrpc_server_info * const serverInfoP,
               const char *               const methodName,
               const char *               const format,
-              va_list                          args,
+              va_list                          *__args,
               xmlrpc_value **            const resultPP) {
-
+  va_list ap;
+  va_copy (ap, *__args);
     validateGlobalClientExists(envP);
     if (!envP->fault_occurred) {
         xmlrpc_value * paramArrayP;
         const char * suffix;
         
-        xmlrpc_build_value_va(envP, format, args, ¶mArrayP, &suffix);
+        xmlrpc_build_value_va(envP, format, &ap, ¶mArrayP, &suffix);
         
         if (!envP->fault_occurred) {
             if (*suffix != '\0')
@@ -171,7 +172,7 @@
         va_list args;
         va_start(args, format);
     
-        clientCall_va(envP, serverInfoP, methodName, format, args, &resultP);
+        clientCall_va(envP, serverInfoP, methodName, format, &args, &resultP);
 
         va_end(args);
         xmlrpc_server_info_free(serverInfoP);
@@ -193,7 +194,7 @@
     xmlrpc_value * resultP;
 
     va_start(args, format);
-    clientCall_va(envP, serverP, methodName, format, args, &resultP);
+    clientCall_va(envP, serverP, methodName, format, &args, &resultP);
     va_end(args);
 
     return resultP;
@@ -305,7 +306,7 @@
         va_list args;
     
         va_start(args, format);
-        xmlrpc_build_value_va(&env, format, args, ¶mArrayP, &suffix);
+        xmlrpc_build_value_va(&env, format, &args, ¶mArrayP, &suffix);
         va_end(args);
     
         if (!env.fault_occurred) {
@@ -371,7 +372,7 @@
     xmlrpc_env_init(&env);
 
     va_start(args, format);
-    xmlrpc_build_value_va(&env, format, args, ¶mArrayP, &suffix);
+    xmlrpc_build_value_va(&env, format, &args, ¶mArrayP, &suffix);
     va_end(args);
 
     if (!env.fault_occurred) {
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_decompose.c xmlrpc-c-1.09.00/src/xmlrpc_decompose.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_decompose.c	2006-09-20 16:34:49.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_decompose.c	2008-10-12 21:14:32.000000000 +0900
@@ -1022,14 +1022,15 @@
 static void
 createDecompTree(xmlrpc_env *             const envP,
                  const char *             const format,
-                 va_list                        args,
+                 va_list                        *__args,
                  struct decompTreeNode ** const decompRootPP) {
-
+  va_list ap;
+  va_copy (ap, *__args);
     const char * formatCursor;
     struct decompTreeNode * decompRootP;
 
     formatCursor = &format[0];
-    createDecompTreeNext(envP, &formatCursor, &args, &decompRootP);
+    createDecompTreeNext(envP, &formatCursor, &ap, &decompRootP);
     if (!envP->fault_occurred) {
         if (*formatCursor != '\0')
             xmlrpc_faultf(envP, "format string '%s' has garbage at the end: "
@@ -1051,15 +1052,16 @@
                xmlrpc_value * const valueP,
                bool           const oldstyleMemMgmt,
                const char *   const format,
-               va_list              args) {
-
+               va_list              *__args) {
+  va_list ap;
+  va_copy (ap, *__args);
     struct decompTreeNode * decompRootP;
 
     XMLRPC_ASSERT_ENV_OK(envP);
     XMLRPC_ASSERT_VALUE_OK(valueP);
     XMLRPC_ASSERT(format != NULL);
 
-    createDecompTree(envP, format, args, &decompRootP);
+    createDecompTree(envP, format, &ap, &decompRootP);
 
     if (!envP->fault_occurred) {
         decomposeValueWithTree(envP, valueP, oldstyleMemMgmt, decompRootP);
@@ -1074,11 +1076,12 @@
 xmlrpc_decompose_value_va(xmlrpc_env *   const envP,
                           xmlrpc_value * const valueP,
                           const char *   const format,
-                          va_list              args) {
-
+                          va_list              *__args) {
+  va_list ap;
+  va_copy (ap, *__args);
     bool const oldstyleMemMgtFalse = false;
 
-    decomposeValue(envP, valueP, oldstyleMemMgtFalse, format, args);
+    decomposeValue(envP, valueP, oldstyleMemMgtFalse, format, &ap);
 }
 
 
@@ -1092,7 +1095,7 @@
     va_list args;
 
     va_start(args, format);
-    xmlrpc_decompose_value_va(envP, value, format, args);
+    xmlrpc_decompose_value_va(envP, value, format, &args);
     va_end(args);
 }
 
@@ -1102,11 +1105,12 @@
 xmlrpc_parse_value_va(xmlrpc_env *   const envP,
                       xmlrpc_value * const valueP,
                       const char *   const format,
-                      va_list              args) {
-
+                      va_list              *__args) {
+  va_list ap;
+  va_copy (ap, *__args);
     bool const oldstyleMemMgmtTrue = true;
 
-    decomposeValue(envP, valueP, oldstyleMemMgmtTrue, format, args);
+    decomposeValue(envP, valueP, oldstyleMemMgmtTrue, format, &ap);
 }
 
 
@@ -1120,6 +1124,6 @@
     va_list args;
 
     va_start(args, format);
-    xmlrpc_parse_value_va(envP, value, format, args);
+    xmlrpc_parse_value_va(envP, value, format, &args);
     va_end(args);
 }
Only in xmlrpc-c-1.09.00/src: xmlrpc_decompose.c~
Binary files xmlrpc-c-1.09.00.orig/src/xmlrpc_decompose.o and xmlrpc-c-1.09.00/src/xmlrpc_decompose.o differ
Binary files xmlrpc-c-1.09.00.orig/src/xmlrpc_expat.o and xmlrpc-c-1.09.00/src/xmlrpc_expat.o differ
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_parse.c xmlrpc-c-1.09.00/src/xmlrpc_parse.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_parse.c	2006-09-04 06:52:31.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_parse.c	2008-10-12 21:14:54.000000000 +0900
@@ -76,7 +76,7 @@
 
     va_list args;
     va_start(args, format);
-    xmlrpc_set_fault_formatted_v(envP, XMLRPC_PARSE_ERROR, format, args);
+    xmlrpc_set_fault_formatted_v(envP, XMLRPC_PARSE_ERROR, format, &args);
     va_end(args);
 }
 
 
テストエントリー


ハンズに行って金剛砂を#320,#600,#1000,#2000と買ってきて、定盤を擦り合わ
せ。微妙に真中が凹んでいるので(普通そういうものらしい)、直す方向で研磨
してみるも、あまり思いっきってやれず大して改善されなかった。

作業台の上に乗せました。これだけの平面があるとやっぱりいいわ。とはいえ、 またガレージが狭くなってしまった。

家庭菜園の長ネギの間引きをちょこっと。もうネギっぽい形になっている。収 穫は来年の夏くらい。まだまだ先は長い。

T105にi386をインストールしてみようとするとpci_intr_mapで失敗した。やっぱりamd64にしようということで NetBSD Problem Report #38011 をあててインストール。後はもりもりpkgsrc からインストール。4.99.72なかなか安定してるっぽい。
やはりデスクトップはいつでもふっとばせるくらいじゃないと、ビクビクして いけない。



定盤の擦り合わせをしました。最初はガラス板で金剛砂#120で錆び落とし。錆
びが落ちたとこで手持ちのミニ定盤で擦り合わせ。

というかガラス板でシャカシャカやってたとこ、途中で親父に「そんなんじゃ 平面でない。新品の油砥石でやりな。本当は定盤同士で擦り合わせるんだけど な」と突っ込まれたのだった。ここ最近韓国から帰ってきていたのだ。
親父は機械屋だからね。素人の僕のやる事には敢えて生暖く見守ってるようだ けど、時折どうしても突っこみたくなるようだ...。
この後、金剛砂#120は荒すぎ、せめて#600じゃないと、と言われたのだけど、 平面度が欲しいならまず#120がいいのでは...#120の荒れを#600で削っても...。

裏側の錆も結構出ていたのでワイヤーブラシでそこそこ削り落として、POR-15 でコーティング。

かなりいい感じに。削ってみると前オーナーがどこをメインに使っていたかが わかる。ストレートエッジあててみるとそこだけ凹んでる。

DELLのPowerEdge T105が届いた。送込み15500円のあれだ。
pxeboot_ia32.binからカーネルをロードするのがNFSだったとは思ってなく(今 迄はなんとなくNFSサーバになってたので気がつかなかった。てっきりtftpだと 思っていた。カーネルをroot-pathから読む時点でNFSだろう...JK)、ちょっとは まってしまいました。俺も焼きがまわったな。
DHCPサーバ

host alexandrite {
	hardware ethernet 00:11:43:80:3a:fe;
	fixed-address 192.168.33.2;
	option host-name "alexandrite";
        next-server 192.168.33.26;
	filename "pxeboot_ia32.bin";
	option root-path "/usr/work/obj/amd64/destdir.amd64";
}

ファイルサーバ(192.168.33.26)
tftpdでpxeboot_ia32.binを持っていく。
pxeboot_ia32.binはNFSでカーネルを持っていく。pxebootもbootpなのでここまで
来ればMAC→IPの問題はない。NFSの問題だけ。

Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 4.99.72 (INSTALL) #0: Fri Sep 26 17:09:01 JST 2008
	uch@crescentmoon:/usr/work/obj/amd64/sys/arch/amd64/compile/INSTALL
total memory = 2046 MB
avail memory = 1964 MB
timecounter: Timecounters tick every 10.000 msec
timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100
SMBIOS rev. 2.5 @ 0xf0c50 (48 entries)
Dell Inc. PowerEdge T105  ((none))
mainbus0 (root)
cpu0 at mainbus0 apid 0: AMD 686-class, 2009MHz, id 0x40f33
cpu1 at mainbus0 apid 1: AMD 686-class, 2009MHz, id 0x40f33
ioapic0 at mainbus0 apid 2: pa 0xfec00000, version 11, 24 pins
acpi0 at mainbus0: Intel ACPICA 20080321
acpi0: X/RSDT: OemId <DELL  ,PE_SC3  ,06040000>, AslId <DELL,00000000>
acpi0: SCI interrupting at int 9
acpi0: fixed-feature power button present
timecounter: Timecounter "ACPI-Fast" frequency 3579545 Hz quality 1000
ACPI-Fast 24-bit timer
acpibut0 at acpi0 (PWRB, PNP0C0C): ACPI Power Button
hpet0 at acpi0 (MMTM, PNP0103-0)
hpet0: mem 0xfed00000-0xfed003ff irq 0,8
timecounter: Timecounter "hpet0" frequency 25000000 Hz quality 2000
attimer1 at acpi0 (PIT0, PNP0100): AT Timer
attimer1: io 0x40-0x43 irq 0
pcppi1 at acpi0 (SPK0, PNP0800)
pcppi1: io 0x61
midi0 at pcppi1: PC speaker (CPU-intensive output)
sysbeep0 at pcppi1
COM1 (PNP0501) at acpi0 not configured
attimer1: attached to pcppi1
pci0 at mainbus0 bus 0: configuration mode 1
pci0: i/o space, memory space enabled, rd/line, rd/mult, wr/inv ok
vendor 0x10de product 0x005e (miscellaneous memory, revision 0xa4) at pci0 dev 0 function 0 not configured
pcib0 at pci0 dev 1 function 0
pcib0: vendor 0x10de product 0x0051 (rev. 0xf1)
nfsmbc0 at pci0 dev 1 function 1: vendor 0x10de product 0x0052 (rev. 0xa2)
nfsmb0 at nfsmbc0 SMBus 1
iic0 at nfsmb0: I2C bus
nfsmb1 at nfsmbc0 SMBus 2
iic1 at nfsmb1: I2C bus
ohci0 at pci0 dev 2 function 0: vendor 0x10de product 0x005a (rev. 0xa2)
LUS0: Picked IRQ 20 with weight 0
ohci0: interrupting at ioapic0 pin 20
ohci0: OHCI version 1.0, legacy support
usb0 at ohci0: USB revision 1.0
ehci0 at pci0 dev 2 function 1: vendor 0x10de product 0x005b (rev. 0xa4)
LUS2: Picked IRQ 21 with weight 0
ehci0: interrupting at ioapic0 pin 21
ehci0: EHCI version 1.0
ehci0: companion controller, 4 ports each: ohci0
usb1 at ehci0: USB revision 2.0
viaide0 at pci0 dev 7 function 0
viaide0: NVIDIA nForce4 Serial ATA Controller (rev. 0xf3)
viaide0: bus-master DMA support present
viaide0: couldn't map sata regs
viaide1 at pci0 dev 8 function 0
viaide1: NVIDIA nForce4 Serial ATA Controller (rev. 0xf3)
viaide1: bus-master DMA support present
viaide1: primary channel wired to native-PCI mode
LSI1: Picked IRQ 22 with weight 0
viaide1: using ioapic0 pin 22 for native-PCI interrupt
atabus0 at viaide1 channel 0
viaide1: secondary channel wired to native-PCI mode
atabus1 at viaide1 channel 1
ppb0 at pci0 dev 9 function 0: vendor 0x10de product 0x005c (rev. 0xf2)
pci1 at ppb0 bus 1
pci1: i/o space, memory space enabled
vga0 at pci1 dev 8 function 0: vendor 0x1002 product 0x515e (rev. 0x02)
wsdisplay0 at vga0 kbdmux 1: console (80x25, vt100 emulation)
wsmux1: connecting to wsdisplay0
drm at vga0 not configured
ppb1 at pci0 dev 11 function 0: vendor 0x10de product 0x005d (rev. 0xf3)
pci2 at ppb1 bus 2
pci2: i/o space, memory space enabled, rd/line, wr/inv ok
bge0 at pci2 dev 0 function 0: Broadcom BCM5722 Gigabit Ethernet
LNK2: Picked IRQ 16 with weight 0
bge0: interrupting at ioapic0 pin 16
bge0: ASIC BCM5755 C0 (0xa200), Ethernet address 00:11:43:80:3a:fe
bge0: setting short Tx thresholds
ukphy0 at bge0 phy 1: Generic IEEE 802.3u media interface
ukphy0: OUI 0x000af7, model 0x002d, rev. 0
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-FDX, auto
ppb2 at pci0 dev 12 function 0: vendor 0x10de product 0x005d (rev. 0xf3)
pci3 at ppb2 bus 3
pci3: i/o space, memory space enabled, rd/line, wr/inv ok
ppb3 at pci0 dev 13 function 0: vendor 0x10de product 0x005d (rev. 0xf3)
pci4 at ppb3 bus 4
pci4: i/o space, memory space enabled, rd/line, wr/inv ok
ppb4 at pci0 dev 14 function 0: vendor 0x10de product 0x005d (rev. 0xa3)
pci5 at ppb4 bus 5
pci5: i/o space, memory space enabled, rd/line, wr/inv ok
pchb0 at pci0 dev 24 function 0
pchb0: vendor 0x1022 product 0x1100 (rev. 0x00)
pchb1 at pci0 dev 24 function 1
pchb1: vendor 0x1022 product 0x1101 (rev. 0x00)
pchb2 at pci0 dev 24 function 2
pchb2: vendor 0x1022 product 0x1102 (rev. 0x00)
amdtemp0 at pci0 dev 24 function 3
amdtemp0: AMD CPU Temperature Sensors (K8: core rev JH-F3)
isa0 at pcib0
com0 at isa0 port 0x3f8-0x3ff irq 4: ns16550a, working fifo
pckbc0 at isa0 port 0x60-0x64
pckbd0 at pckbc0 (kbd slot)
pckbc0: using irq 1 for kbd slot
wskbd0 at pckbd0: console keyboard, using wsdisplay0
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
uhub0 at usb0: vendor 0x10de OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 9 ports with 9 removable, self powered
uhub1 at usb1: vendor 0x10de EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
uhub1: 9 ports with 9 removable, self powered
viaide1 port 0: unknown SStatus: 0xffffffff
viaide1 port 1: unknown SStatus: 0xffffffff
Kernelized RAIDframe activated
md0: internal 5000 KB image area
pad0: outputs: 44100Hz, 16-bit, stereo
audio0 at pad0: half duplex
boot device: bge0
root on md0a dumps on md0b
root file system type: ffs
WARNING: clock gained 14 days
WARNING: CHECK AND RESET THE DATE!
warning: no /dev/console
uhub2 at uhub0 port 6: Chicony Generic USB Hub, class 9/0, rev 1.10/1.00, addr 2
uhub2: 3 ports with 2 removable, bus powered
uhidev0 at uhub2 port 1 configuration 1 interface 0
uhidev0: Chicony PFU-65 USB Keyboard, rev 1.10/1.00, addr 3, iclass 3/1
ukbd0 at uhidev0
wskbd1 at ukbd0 mux 1
wskbd1: connecting to wsdisplay0
ディスクが認識されない。この状況はPRで見つけたけど、どうなんだろう...。 とりあえずi386をビルト中。



ヤフオクで落とした600x600の定盤が届いた。15000円で落として送料2000円。
微妙か。しかしこのサイズの定盤が欲しかったのだ。フォークの歪みの測定も
できるし、ケースの合わせ面のラッピングにも使えるし。



今迄の定盤は300x200だった。ケガキくらいにはいいのだけど、クランクの振れ を測定するくらいが精一杯。

岡山6戦のエントリーとMFJのライセンス更新終了。次の岡山は晴れてくれ〜!



今日は筑波の予約をとってあったのですが...朝起きてみたら思いっきり雨なの
でパス。月曜の段階じゃまだ崩れない予報だったのに。


前回予約した時も大雨洪水警報まで出る状況でパスだったんだよね(これはS1が 走行中止になったので1本分で済んだ)。
今年は雨ばっかりだ。
ということで机の天板の作業の続き。カンナの刃を砥ぎ直して目違いを払うの だけど、どうも砥ぎがうまくいかない。二回ほど砥ぎ直してもどうも納得いく 切れ味にならず、そのままやったらやっぱりよろしくなかった。
端を丸ノコで落として、ルーターできっちり仕上げて、トリマーで角を落とし て、オービタルサンダーで仕上げ。最初のニス塗りまで。




家庭菜園のニンジンはまだなんとか育っている様子です。間引きしてみると、
ちょっとニンジンっぽくなってきた。



プレスの先につけるアダプタを作っていました。このくらいちょっちょっとの はずだったのだけど、S45Cは辛かった。ドリルもバイトもチッピングするし、 旋盤は共振するし。鉄はSS400(S25C)あたりが限界だな。
数時間没頭して旋盤の前に立っていたので、削り終わったら気持ちが悪くなっ た。頑張って作った割に使えなさそう。

そうこうしてるとタイヤが届いた。最終戦用のスリックとBT-601SS。前後YCYで。 さっそくタイヤ交換。これで準備完了だ。僕のマシンにしては珍しく色付き。




久々にNSR50の整備。060630の秋ヶ瀬の走行以来乗っていない。秋ヶ瀬もそれ以
来行っていない。うちから秋ヶ瀬までは30kmちょっとと距離的には近いのだけ
ど、2時間はかかる。渋滞の環八を延々とだからね。80kmある筑波の方が時間的
に近いのだ。しかし。C2山の手トンネルが開通した今は結構楽に行けるはず!
10/14でローリー火災の復旧も終了するし。



というのも、マシン(CR85)は復活したけれど乗り手がどうもいけない。リズム 感と気合い感を取り戻したいということで、こいつだ。



机の天板作りの続き。はぎ面の直角はルーターを使って出しました。前のボー
ル盤の時は手押しカンナで作業したのだけれど、今回120cmも面があるのでこの
方法で。長いビットが必要だったので鉄工用のφ12エンドミルをルータービッ
トに代用。端の部分はがたがたになりがち。この部分を落とすことを考えて両
側3cmくらいづづ切り落とした方が無難っぽい。



ビスケットジョイントではぎ合わせ。結構思いっきり目違いが出てしまった。 かなりがっかり。これはかなりカンナをかける必要があるよ。
ガイドに合わせただけでは結構誤差が出てしまうのだろうか。次は、はぐ面に もケガいておいて確認しながら作業してみよう。




治具に乗せて芯出ししてOリング溝の切削。ほとんど手回しで切削。こっちの方
がいい。低回転も自由自在にできるし旋盤のインバーター化もはやくやりたい
のだけど...。



机を作りはじめました。かなり前から材料は用意していたのだけど、なかな かこれも手をつける余裕がなかった。まずは天板を2x8材から切り出し。手押し カンナ(DELTA JT160)が156mm幅なので、この幅に制限されてしまう。もっと大 きいのがよかった。




排気ポートの表面をならしてみました。ここまでやってみると、超硬バーでバ
リとりしたのは良くなかった。結構表面が波打ってしまう。砥石系でじわじわ
やった方がいい。

ポートの縁をゴム砥石でナめて終了。このくらいのメニューなら定番に加えて もいいかな。あまりいじってしまうとシリンダ交換した時の再現性がなくなっ てしまうので敢えて手をかけない方向なのです。排気ポートはあまりいじらな い方が無難というのもあり。
このくらいならパワー落ちることはない安牌でしょう。