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

Re: シグマリオン



井上@ASAHI-NET です。

シグマリオンのコンソールのスクロールについてですが、メールのアーカイブ
とソースをながめてみました。現状では、

    コンソールの文字描画に関しては rasops そのままで、MQ-200 のアクセレ
    レーションは全く使ってない (Xhpc, MGL2 も?)。

ということなんですね。ためしに MediaQ のデータシートから、とりあえず、
bitblit() と erase() をでっちあげると、cat termcap ベンチで 25秒程度には
なりました(fontサイズ 6x10)。

# mgterm では 6分30秒程度。
## wscons はさらに遅かったと思います。
### ちなみに NetBSD/i386 (VGA text 画面) では 4 秒程度。

御参考までに、patch を添付します。引数の座標の単位を勝手に、ドット単位
にしてるので、hpcfb.c のほうの bitblit、 eraseの呼出の方も変更しないと
使えません。私は hpcfb.c (というか wsdisplay)を使ってなかったりするの
で、そっちの patchはありません。

また、このままでは描画結果がちょっと変なので実用には command FIFO のあ
ふれ処理とか描画待ち処理とかを真面目にやる必要がありそうです。

# ここら辺、BIOS がある PC/AT は楽だなあ。
---
井上義也

--- mq200.c.org	Tue Oct 17 08:53:40 2000
+++ /tmp/mq200.c	Sat Nov 25 02:10:09 2000
@@ -1,5 +1,5 @@
 /*	$NetBSD: mq200.c,v 1.1.2.1 2000/08/06 03:56:41 takemura Exp $	*/
-
+/* exprimental !!! (modified by Y. INOUE) */
 /*-
  * Copyright (c) 2000 Takemura Shin
  * All rights reserved.
@@ -71,11 +71,14 @@
 static int	mq200_ioctl __P((void *, u_long, caddr_t, int, struct proc *));
 static paddr_t	mq200_mmap __P((void *, off_t offset, int));
 
+static void	mq200_bitblit __P((void *, int, int, int, int, int, int));
+static void	mq200_erase __P((void *, int, int, int, int, int));
+
 /*
  * static variables
  */
 struct hpcfb_accessops mq200_ha = {
-	mq200_ioctl, mq200_mmap
+	mq200_ioctl, mq200_mmap, NULL, mq200_bitblit, mq200_erase
 };
 
 int
@@ -438,3 +441,76 @@
 
 	return mips_btop(sc->sc_baseaddr + offset);
 }
+
+#define _mask(i, x) (i & ((1<<(x)) - 1))
+#define  FBitBLT (2 << 8)
+
+static void
+mq200_erase(ctx, x, y, h, w, at)
+void *ctx;
+int x, y, h, w, at;
+{
+	struct mq200_softc *sc = ctx;
+	u_int32_t ge0, ge1, ge2, status;
+
+	ge1 = _mask(w, 12);
+	ge1 |= _mask(h, 27 - 15) << 16;
+	ge2 = _mask(x, 12);
+	ge2 |= _mask(y, 27 - 15) << 16;
+        ge0 = (1 << 15) | (1 << 23) | FBitBLT;
+
+	status = bus_space_read_4(sc->sc_iot, sc->sc_ioh, MQ200_CC + 1*4);
+	if (status <= 8) {
+		printf("mq200: fifo status %x\n", status & ((1 << 5) - 1));
+	}
+	bus_space_write_4(sc->sc_iot, sc->sc_ioh, MQ200_GE + 1*4, ge1);
+	bus_space_write_4(sc->sc_iot, sc->sc_ioh, MQ200_GE + 2*4, ge2);
+	bus_space_write_4(sc->sc_iot, sc->sc_ioh, MQ200_GE + 0*4, ge0);
+}
+
+static void
+mq200_bitblit(ctx, sx, sy, dx, dy, h, w)
+void *ctx;
+int sx, sy, dx, dy, h, w;
+{
+	struct mq200_softc *sc = ctx;
+	int xdir, ydir;
+	u_int32_t ge0, ge1, ge2, ge3, status;
+
+	if (sx >= dx)
+		xdir = 0;
+	else {
+		xdir = 1;
+		sx += w - 1;
+		dx += w - 1;
+	}
+	if (sy >= dy)
+		ydir = 0;
+	else {
+		ydir = 1;
+		sy += h - 1;
+		dy += h - 1;
+	}
+
+	ge3 = _mask(sx, 12);
+	ge3 |= _mask(sy,27 - 15) << 16;
+	ge1 = _mask(w, 12);
+	ge1 |= _mask(h, 27 - 15) << 16;
+	ge2 = _mask(dx, 12);
+	ge2 |= _mask(dy, 27 - 15) << 16;
+	ge0 = 0xcc;
+	ge0 |= xdir << 11;
+	ge0 |= ydir << 12;
+	ge0 |= FBitBLT;
+
+	status = bus_space_read_4(sc->sc_iot, sc->sc_ioh, MQ200_CC + 1*4);
+	if (status <= 8) {
+		printf("mq200: fifo status %x\n", status & ((1 << 5) - 1));
+	}
+
+	bus_space_write_4(sc->sc_iot, sc->sc_ioh, MQ200_GE + 3*4, ge3);
+	bus_space_write_4(sc->sc_iot, sc->sc_ioh, MQ200_GE + 1*4, ge1);
+	bus_space_write_4(sc->sc_iot, sc->sc_ioh, MQ200_GE + 2*4, ge2);
+	bus_space_write_4(sc->sc_iot, sc->sc_ioh, MQ200_GE + 0*4, ge0);
+}
+