[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: hang with fMSX



つづきはこっちでやりましょう。

>fMSXのパッケージを作ろうと思って遊んでいるのですが、何回か実
>行するとOS毎止まってしまいます。

color cell の書き換えで Open Firmware を呼んでいるためではないかと
思っています。で、何らかの原因で(i.e. バグ)戻ってこないと。

古めの ATI 限定ですが、これでよくなるかもしれません。
(試していません。コンパイルがとおるかすらも)

*** ofb.c~	Wed Dec 23 04:38:35 1998
--- ofb.c	Wed Jan  6 12:48:25 1999
***************
*** 416,421 ****
--- 416,422 ----
  	int count = cm->count;
  	int i, s;
  	u_char *r, *g, *b;
+ 	paddr_t regaddr;
  
  	if (cm->index >= 256 || cm->count > 256 ||
  	    (cm->index + cm->count) > 256)
***************
*** 443,450 ****
  	asm volatile ("mtdbatl 3,%0; mtdbatu 3,%1"
  		:: "r"(BATL(dc->dc_paddr, BAT_I)), "r"(BATU(dc->dc_paddr)));
  
  	for (i = 0; i < count; i++) {
! 		OF_call_method_1("color!", dc->dc_ih, 4, *r, *g, *b, index);
  		r++, g++, b++, index++;
  	}
  	splx(s);
--- 444,459 ----
  	asm volatile ("mtdbatl 3,%0; mtdbatu 3,%1"
  		:: "r"(BATL(dc->dc_paddr, BAT_I)), "r"(BATU(dc->dc_paddr)));
  
+ #define DAC_W_INDEX	0xc0
+ #define DAC_DATA	0xc1
+ 
+ 	regaddr = dc->dc_paddr - 0x400;
+ 
+ 	out8(regaddr + DAC_W_INDEX, 0);
  	for (i = 0; i < count; i++) {
! 		out8(regaddr + DAC_DATA, *r);
! 		out8(regaddr + DAC_DATA, *g);
! 		out8(regaddr + DAC_DATA, *b);
  		r++, g++, b++, index++;
  	}
  	splx(s);

# あ、machine/pio.h を include する必要があるかも。

これで動かなかったら screen の .properties と、ビデオ信号が出ている
状態での
0 > frame-buffer-adr . 
結果を見せてください。(結果を表示するために最後の "." が必要)

あと本質的ではないけれどループの中で OF_... せずに一度で済ます手も
あります。まあ300倍長生きするだけですね。(でもこれはこれで問題がある)


>Command + Power Keyも効かないのでリセットするしかなくなるの
>ですが、何かいい方法はないでしょうか。

Command + Power って irq20 ですよね。なにかハンドラーを登録して
おかないと無視されますが、どうしておくのがいいでしょう?
cpu_reboot() ってのもあるけどちょっと…。:-)

# 実行中に変数の値を確認したいときによく使います。

どっちにしても、Open Firmware を呼んでる間は割り込みベクターが
rom を指しているので帰ってきません。たしか starmax 対策でいれた
んだったと思いますが、これはこれで不便なので、本当に必要だったか
どうかもう一度検証したいと思っています。

そのときはよろしく > もってるひと。