isaki68k / nono-issue

1 stars 0 forks source link

UniOS-MachでSIO: CR0未実装コマンド6が出るようだ #65

Closed isaki68k closed 3 years ago

isaki68k commented 3 years ago

https://twitter.com/ao_kenji/status/1408782477611528206

NBUG例会(兼 OSC Online/Hokkaidoのセミナ)で話題になった、UniOS-Machがエミュレータで動くのか? について。 とりあえずUniOS-MachのvmunixをOpenBSD/luna88k HDDイメージの / に置いてトライ。 (a) 実機PROMイメージで実行 → 画像のところで止まる。UniOS-MachのHDDイメージがあればさらに進む?

コマンド6は Error Reset らしい。今まで誰も遭遇しなかったので作っていない。

tsutsui commented 3 years ago

NetBSD/luna68k でも luna68k/dev/lunaws.cwssoftint() に雑に debug printf を入れて遅くした状態でキーボード連打すると

という動作になります。

    rr = getsiocsr(sio);
    if ((rr & RR_RXRDY) != 0) {
        do {
            code = sio->sio_data;
            if (rr & (RR_FRAMING | RR_OVERRUN | RR_PARITY)) {
                sio->sio_cmd = WR0_ERRRST;
                continue;
            }
            sc->sc_rxq[sc->sc_rxqtail] = code;
            sc->sc_rxqtail = OMKBD_NEXTRXQ(sc->sc_rxqtail);
        } while (((rr = getsiocsr(sio)) & RR_RXRDY) != 0);
        softint_schedule(sc->sc_si);
    }

Error Reset でどのビットがクリアされるのかちゃんとマニュアルを読んでませんが コマンド6として ResetChannel() と同様に以下みたいにすると一応復帰します。

     case 6:    // Error Reset
        // SR1 は b4-7 が '0'
        putlog(1, "CR0%s: Error Reset", chan->name);
        chan->sr1 &= ~(SIO::SR1_ENDOFFRAME | SIO::SR1_CRCERROR |
                       SIO::SR1_RXOVERRUN | SIO::SR1_PARITYERROR);
        break;
isaki68k commented 3 years ago

ありがとうございます。 昨日の夜中にマニュアルに記述を見付けてまったく同じコードを書いていました。この4ビットをクリアするで合ってるっぽいです。

5610afb4 (2021-09-16)でビットのクリアは実装。

isaki68k commented 3 years ago

0.2.3で直ってるはず。