[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 対策でいれた
んだったと思いますが、これはこれで不便なので、本当に必要だったか
どうかもう一度検証したいと思っています。
そのときはよろしく > もってるひと。