summaryrefslogtreecommitdiffstats
path: root/sys/modules/splash
diff options
context:
space:
mode:
authornyan <nyan@FreeBSD.org>2000-04-27 13:37:40 +0000
committernyan <nyan@FreeBSD.org>2000-04-27 13:37:40 +0000
commita523934af1fff7e66ab046986e95fa77b3724e7d (patch)
tree3ff1243af1ffe516db41f8da5dafb7074d5e8392 /sys/modules/splash
parent34c45fc8f0c7442b15283c34b1d44b138f5079b7 (diff)
downloadFreeBSD-src-a523934af1fff7e66ab046986e95fa77b3724e7d.zip
FreeBSD-src-a523934af1fff7e66ab046986e95fa77b3724e7d.tar.gz
Added PC-98 supports.
Submitted by: Chiharu Shibata <chi@bd.mbn.or.jp>, Tomokazu HARADA <tkhara@osk4.3web.ne.jp> and yokota
Diffstat (limited to 'sys/modules/splash')
-rw-r--r--sys/modules/splash/bmp/Makefile4
-rw-r--r--sys/modules/splash/bmp/splash_bmp.c41
2 files changed, 45 insertions, 0 deletions
diff --git a/sys/modules/splash/bmp/Makefile b/sys/modules/splash/bmp/Makefile
index af009a2..9c45c39 100644
--- a/sys/modules/splash/bmp/Makefile
+++ b/sys/modules/splash/bmp/Makefile
@@ -5,4 +5,8 @@ SRCS= splash_bmp.c
NOMAN=
+.if ${MACHINE} == "pc98"
+CFLAGS+= -DPC98
+.endif
+
.include <bsd.kmod.mk>
diff --git a/sys/modules/splash/bmp/splash_bmp.c b/sys/modules/splash/bmp/splash_bmp.c
index af495bc..e3db76d 100644
--- a/sys/modules/splash/bmp/splash_bmp.c
+++ b/sys/modules/splash/bmp/splash_bmp.c
@@ -35,9 +35,11 @@
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
+#ifndef PC98
#include <dev/fb/vgareg.h>
#include <isa/isareg.h>
+#endif
#define FADE_TIMEOUT 15 /* sec */
#define FADE_LEVELS 10
@@ -62,6 +64,15 @@ bmp_start(video_adapter_t *adp)
{
/* currently only 256-color modes are supported XXX */
static int modes[] = {
+#ifdef PC98
+ /*
+ * As 640x400 doesn't generally look great,
+ * it's least preferred here.
+ */
+ M_PC98_PEGC640x400,
+ M_PC98_PEGC640x480,
+ M_PC98_EGC640x400,
+#else
M_VESA_CG640x480,
M_VESA_CG800x600,
M_VESA_CG1024x768,
@@ -71,6 +82,7 @@ bmp_start(video_adapter_t *adp)
* it's least preferred here.
*/
M_VGA_CG320,
+#endif
-1,
};
video_info_t info;
@@ -226,6 +238,9 @@ typedef struct
u_char *vidmem; /* video memory allocated for drawing */
video_adapter_t *adp;
int bank;
+#ifdef PC98
+ u_char prev_val;
+#endif
} BMP_INFO;
static BMP_INFO bmp_info;
@@ -257,6 +272,26 @@ bmp_SetPix(BMP_INFO *info, int x, int y, u_char val)
x += (info->swidth - info->width) / 2;
switch(info->sdepth) {
+#ifdef PC98
+ case 4:
+ x += (info->swidth - info->width) / 2;
+ sofs += (x >> 3);
+ bofs = x & 0x7; /* offset within byte */
+
+ outb(0x7c, 0x80 | 0x40); /* GRCG on & RMW mode */
+ if (val != info->prev_val) {
+ outb(0x7e, (val & 1) ? 0xff : 0); /* tile B */
+ outb(0x7e, (val & 2) ? 0xff : 0); /* tile R */
+ outb(0x7e, (val & 4) ? 0xff : 0); /* tile G */
+ outb(0x7e, (val & 8) ? 0xff : 0); /* tile I */
+
+ info->prev_val = val;
+ }
+
+ *(info->vidmem+sofs) = (0x80 >> bofs); /* write new bit */
+ outb(0x7c, 0); /* GRCG off */
+ break;
+#else
case 4:
case 1:
/* EGA/VGA planar modes */
@@ -272,6 +307,7 @@ bmp_SetPix(BMP_INFO *info, int x, int y, u_char val)
outw(GDCIDX, (val << 8) | 0x00); /* set/reset */
*(info->vidmem + sofs) ^= 0xff; /* read-modify-write */
break;
+#endif
case 8:
sofs += x;
@@ -567,10 +603,14 @@ bmp_Draw(video_adapter_t *adp)
/* initialise the info structure for drawing */
bmp_info.index = bmp_info.data;
+#ifdef PC98
+ bmp_info.prev_val = 255;
+#endif
/* set the palette for our image */
(*vidsw[adp->va_index]->load_palette)(adp, (u_char *)&bmp_info.palette);
+#ifndef PC98
/* XXX: this is ugly, but necessary for EGA/VGA 1bpp/4bpp modes */
if ((adp->va_type == KD_EGA) || (adp->va_type == KD_VGA)) {
inb(adp->va_crtc_addr + 6); /* reset flip-flop */
@@ -588,6 +628,7 @@ bmp_Draw(video_adapter_t *adp)
if (bmp_info.sdepth == 1)
outw(TSIDX, 0x0102); /* unmask plane #0 */
}
+#endif
for (line = 0; (line < bmp_info.height) && bmp_info.index; line++) {
bmp_DecodeLine(&bmp_info, line);
OpenPOWER on IntegriCloud