summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/pc386/console/vgainit.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/i386/pc386/console/vgainit.c')
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/vgainit.c766
1 files changed, 766 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/console/vgainit.c b/c/src/lib/libbsp/i386/pc386/console/vgainit.c
new file mode 100644
index 0000000000..c91421f807
--- /dev/null
+++ b/c/src/lib/libbsp/i386/pc386/console/vgainit.c
@@ -0,0 +1,766 @@
+/*
+ * Copyright (c) 1999 Greg Haerr <greg@censoft.com>
+ * Copyright (c) 1991 David I. Bell
+ * Permission is granted to use, distribute, or modify this source,
+ * provided that this copyright notice remains intact.
+ *
+ * Alternate EGA/VGA Screen Driver Init, direct hw programming
+ */
+#include <i386_io.h>
+
+#ifdef __rtems__
+#define ROMFONT 0 /* =0 no bios rom fonts available*/
+#else
+#define ROMFONT 1 /* =1 uses PC rom fonts */
+#endif
+
+/* defines are defined in device.h of the MicroWindows package */
+#define MODE_SET 0 /* draw pixels as given (default) */
+#define MODE_XOR 1 /* draw pixels using XOR */
+#define MODE_OR 2 /* draw pixels using OR (notimp)*/
+#define MODE_AND 3 /* draw pixels using AND (notimp)*/
+#define MODE_MAX 3
+typedef int MODE; /* drawing mode*/
+
+
+/* Define one and only one of the following to be nonzero*/
+#define VGA_ET4000 0 /* TSENG LABS ET4000 chip 800x600*/
+#define VGA_STANDARD 1 /* standard VGA 640x480*/
+#define EGA_STANDARD 0 /* standard EGA 640x350*/
+
+#define DONE 0
+#define IN 1
+#define OUT 2
+
+#define RAM_SCAN_LINES 32 /* number of scan lines in fonts in RAM */
+#define FONT_CHARS 256 /* number of characters in font tables */
+#define CHAR_WIDTH 8 /* number of pixels for character width */
+
+#define PALREG 0x3c0
+#define SEQREG 0x3c4
+#define SEQVAL 0x3c5
+#define GRREG 0x3ce
+#define GRVAL 0x3cf
+#define ATTRREG 0x3da
+#define CRTCREG 0x3d4
+#define CRTCVAL 0x3d5
+
+#define GENREG1 0x3c2
+#define GENREG2 0x3cc
+#define GENREG3 0x3ca
+
+#define DATA_ROTATE 3 /* register number for data rotate */
+
+typedef struct {
+ int action;
+ int port1;
+ int data1;
+ int port2;
+ int data2;
+} REGIO;
+
+/* extern data*/
+#if ROMFONT
+extern FARADDR rom_char_addr; /* address of ROM font*/
+extern int ROM_CHAR_HEIGHT; /* ROM character height*/
+#endif
+
+/* local data*/
+extern REGIO graphics_on[];
+extern REGIO graph_off[];
+
+/* entry points*/
+void ega_hwinit(void);
+void ega_hwterm(void);
+
+/* local routines*/
+static void writeregs(REGIO *rp);
+static void out_word(unsigned int p,unsigned int d);
+static void setmode(MODE mode);
+
+void
+ega_hwinit(void)
+{
+ writeregs(graphics_on);
+}
+
+void
+ega_hwterm(void)
+{
+ setmode(MODE_SET);
+
+ /* Copy character table from ROM back into bit plane 2 before turning
+ * off graphics.
+ */
+ out_word(SEQREG, 0x0100); /* syn reset */
+ out_word(SEQREG, 0x0402); /* cpu writes only to map 2 */
+ out_word(SEQREG, 0x0704); /* sequential addressing */
+ out_word(SEQREG, 0x0300); /* clear synchronous reset */
+
+ out_word(GRREG, 0x0204); /* select map 2 for CPU reads */
+ out_word(GRREG, 0x0005); /* disable odd-even addressing */
+
+#if ROMFONT
+ {
+ FARADDR srcoffset;
+ FARADDR destoffset;
+ int data;
+ int ch;
+ int row;
+
+ srcoffset = rom_char_addr;
+ destoffset = EGA_BASE;
+ for (ch = 0; ch < FONT_CHARS; ch++) {
+ for(row = 0; row < ROM_CHAR_HEIGHT; row++) {
+ data = GETBYTE_FP(srcoffset++);
+ PUTBYTE_FP(destoffset++, data);
+ }
+ destoffset += (RAM_SCAN_LINES - ROM_CHAR_HEIGHT);
+ }
+ }
+#endif
+
+ /* Finally set the registers back for text mode. */
+ writeregs(graph_off);
+}
+
+/* Set the graphics registers as indicated by the given table */
+static void
+writeregs(REGIO *rp)
+{
+ for (; rp->action != DONE; rp++) {
+ switch (rp->action) {
+ case IN:
+ inp(rp->port1);
+ break;
+ case OUT:
+ outp(rp->port1, rp->data1);
+ if (rp->port2)
+ outp(rp->port2, rp->data2);
+ break;
+ }
+ }
+}
+
+/* Output a word to an I/O port. */
+static void
+out_word(unsigned int p,unsigned int d)
+{
+ outp(p, d & 0xff);
+ outp(p + 1, (d >> 8) & 0xff);
+}
+
+
+/* Values for the data rotate register to implement drawing modes. */
+static unsigned char mode_table[MODE_MAX + 1] = {
+ 0x00, 0x18, 0x10, 0x08
+};
+
+/* Set the drawing mode.
+ * This is either SET, OR, AND, or XOR.
+ */
+static void
+setmode(MODE mode)
+{
+ if (mode > MODE_MAX)
+ return;
+ outp(GRREG, DATA_ROTATE);
+ outp(GRVAL, mode_table[mode]);
+}
+
+
+#if VGA_ET4000
+
+/* VGA 800x600 16-color graphics (BIOS mode 0x29).
+ */
+static REGIO graphics_on[] = {
+ /* Reset attr F/F */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Disable palette */
+ OUT, PALREG, 0, 0, 0,
+
+ /* Reset sequencer regs */
+ OUT, SEQREG, 0, SEQVAL, 0,
+ OUT, SEQREG, 1, SEQVAL, 1,
+ OUT, SEQREG, 2, SEQVAL, 0x0f,
+ OUT, SEQREG, 3, SEQVAL, 0,
+ OUT, SEQREG, 4, SEQVAL, 6,
+
+ /* Misc out reg */
+ OUT, GENREG1, 0xe3, 0, 0,
+
+ /* Sequencer enable */
+ OUT, SEQREG, 0, SEQVAL, 0x03,
+
+ /* Unprotect crtc regs 0-7 */
+ OUT, CRTCREG, 0x11, CRTCVAL, 0,
+
+ /* Crtc */
+ OUT, CRTCREG, 0, CRTCVAL, 0x7a,
+ OUT, CRTCREG, 1, CRTCVAL, 0x63,
+ OUT, CRTCREG, 2, CRTCVAL, 0x64,
+ OUT, CRTCREG, 3, CRTCVAL, 0x1d,
+ OUT, CRTCREG, 4, CRTCVAL, 0x68,
+ OUT, CRTCREG, 5, CRTCVAL, 0x9a,
+ OUT, CRTCREG, 6, CRTCVAL, 0x78,
+ OUT, CRTCREG, 7, CRTCVAL, 0xf0,
+ OUT, CRTCREG, 8, CRTCVAL, 0x00,
+ OUT, CRTCREG, 9, CRTCVAL, 0x60,
+ OUT, CRTCREG, 10, CRTCVAL, 0x00,
+ OUT, CRTCREG, 11, CRTCVAL, 0x00,
+ OUT, CRTCREG, 12, CRTCVAL, 0x00,
+ OUT, CRTCREG, 13, CRTCVAL, 0x00,
+ OUT, CRTCREG, 14, CRTCVAL, 0x00,
+ OUT, CRTCREG, 15, CRTCVAL, 0x00,
+ OUT, CRTCREG, 16, CRTCVAL, 0x5c,
+ OUT, CRTCREG, 17, CRTCVAL, 0x8e,
+ OUT, CRTCREG, 18, CRTCVAL, 0x57,
+ OUT, CRTCREG, 19, CRTCVAL, 0x32,
+ OUT, CRTCREG, 20, CRTCVAL, 0x00,
+ OUT, CRTCREG, 21, CRTCVAL, 0x5b,
+ OUT, CRTCREG, 22, CRTCVAL, 0x75,
+ OUT, CRTCREG, 23, CRTCVAL, 0xc3,
+ OUT, CRTCREG, 24, CRTCVAL, 0xff,
+
+ /* Graphics controller */
+ OUT, GENREG2, 0x00, 0, 0,
+ OUT, GENREG3, 0x01, 0, 0,
+ OUT, GRREG, 0, GRVAL, 0x00,
+ OUT, GRREG, 1, GRVAL, 0x00,
+ OUT, GRREG, 2, GRVAL, 0x00,
+ OUT, GRREG, 3, GRVAL, 0x00,
+ OUT, GRREG, 4, GRVAL, 0x00,
+ OUT, GRREG, 5, GRVAL, 0x00,
+ OUT, GRREG, 6, GRVAL, 0x05,
+ OUT, GRREG, 7, GRVAL, 0x0f,
+ OUT, GRREG, 8, GRVAL, 0xff,
+
+ /* Reset attribute flip/flop */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Palette */
+ OUT, PALREG, 0, PALREG, 0x00,
+ OUT, PALREG, 1, PALREG, 0x01,
+ OUT, PALREG, 2, PALREG, 0x02,
+ OUT, PALREG, 3, PALREG, 0x03,
+ OUT, PALREG, 4, PALREG, 0x04,
+ OUT, PALREG, 5, PALREG, 0x05,
+ OUT, PALREG, 6, PALREG, 0x06,
+ OUT, PALREG, 7, PALREG, 0x07,
+ OUT, PALREG, 8, PALREG, 0x38,
+ OUT, PALREG, 9, PALREG, 0x39,
+ OUT, PALREG, 10, PALREG, 0x3a,
+ OUT, PALREG, 11, PALREG, 0x3b,
+ OUT, PALREG, 12, PALREG, 0x3c,
+ OUT, PALREG, 13, PALREG, 0x3d,
+ OUT, PALREG, 14, PALREG, 0x3e,
+ OUT, PALREG, 15, PALREG, 0x3f,
+ OUT, PALREG, 16, PALREG, 0x01,
+ OUT, PALREG, 17, PALREG, 0x00,
+ OUT, PALREG, 18, PALREG, 0x0f,
+ OUT, PALREG, 19, PALREG, 0x00,
+
+ /* Enable palette */
+ OUT, PALREG, 0x20, 0, 0,
+
+ /* End of table */
+ DONE, 0, 0, 0, 0
+};
+
+
+/* VGA 80x25 text (BIOS mode 3).
+ */
+static REGIO graph_off[] = {
+ /* Reset attr F/F */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Disable palette */
+ OUT, PALREG, 0, 0, 0,
+
+ /* Reset sequencer regs */
+ OUT, SEQREG, 0, SEQVAL, 1,
+ OUT, SEQREG, 1, SEQVAL, 1,
+ OUT, SEQREG, 2, SEQVAL, 3,
+ OUT, SEQREG, 3, SEQVAL, 0,
+ OUT, SEQREG, 4, SEQVAL, 2,
+
+ /* Misc out reg */
+ OUT, GENREG1, 0x63, 0, 0,
+
+ /* Sequencer enable */
+ OUT, SEQREG, 0, SEQVAL, 3,
+
+ /* Unprotect crtc regs 0-7 */
+ OUT, CRTCREG, 0x11, CRTCVAL, 0,
+
+ /* Crtc */
+ OUT, CRTCREG, 0, CRTCVAL, 0x5f, /* horiz total */
+ OUT, CRTCREG, 1, CRTCVAL, 0x4f, /* horiz end */
+ OUT, CRTCREG, 2, CRTCVAL, 0x50, /* horiz blank */
+ OUT, CRTCREG, 3, CRTCVAL, 0x82, /* end blank */
+ OUT, CRTCREG, 4, CRTCVAL, 0x55, /* horiz retrace */
+ OUT, CRTCREG, 5, CRTCVAL, 0x81, /* end retrace */
+ OUT, CRTCREG, 6, CRTCVAL, 0xbf, /* vert total */
+ OUT, CRTCREG, 7, CRTCVAL, 0x1f, /* overflows */
+ OUT, CRTCREG, 8, CRTCVAL, 0x00, /* row scan */
+ OUT, CRTCREG, 9, CRTCVAL, 0x4f, /* max scan line */
+ OUT, CRTCREG, 10, CRTCVAL, 0x00, /* cursor start */
+ OUT, CRTCREG, 11, CRTCVAL, 0x0f, /* cursor end */
+ OUT, CRTCREG, 12, CRTCVAL, 0x0e, /* start high addr */
+ OUT, CRTCREG, 13, CRTCVAL, 0xb0, /* low addr */
+ OUT, CRTCREG, 14, CRTCVAL, 0x16, /* cursor high */
+ OUT, CRTCREG, 15, CRTCVAL, 0x30, /* cursor low */
+ OUT, CRTCREG, 16, CRTCVAL, 0x9c, /* vert retrace */
+ OUT, CRTCREG, 17, CRTCVAL, 0x8e, /* retrace end */
+ OUT, CRTCREG, 18, CRTCVAL, 0x8f, /* vert end */
+ OUT, CRTCREG, 19, CRTCVAL, 0x28, /* offset */
+ OUT, CRTCREG, 20, CRTCVAL, 0x1f, /* underline */
+ OUT, CRTCREG, 21, CRTCVAL, 0x96, /* vert blank */
+ OUT, CRTCREG, 22, CRTCVAL, 0xb9, /* end blank */
+ OUT, CRTCREG, 23, CRTCVAL, 0xa3, /* crt mode */
+ OUT, CRTCREG, 24, CRTCVAL, 0xff, /* line compare */
+
+ /* Graphics controller */
+ OUT, GENREG2, 0x00, 0, 0,
+ OUT, GENREG3, 0x01, 0, 0,
+ OUT, GRREG, 0, GRVAL, 0x00,
+ OUT, GRREG, 1, GRVAL, 0x00,
+ OUT, GRREG, 2, GRVAL, 0x00,
+ OUT, GRREG, 3, GRVAL, 0x00,
+ OUT, GRREG, 4, GRVAL, 0x00,
+ OUT, GRREG, 5, GRVAL, 0x10,
+ OUT, GRREG, 6, GRVAL, 0x0e,
+ OUT, GRREG, 7, GRVAL, 0x00,
+ OUT, GRREG, 8, GRVAL, 0xff,
+
+ /* Reset attribute flip/flop */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Palette */
+ OUT, PALREG, 0, PALREG, 0x00,
+ OUT, PALREG, 1, PALREG, 0x01,
+ OUT, PALREG, 2, PALREG, 0x02,
+ OUT, PALREG, 3, PALREG, 0x03,
+ OUT, PALREG, 4, PALREG, 0x04,
+ OUT, PALREG, 5, PALREG, 0x05,
+ OUT, PALREG, 6, PALREG, 0x06,
+ OUT, PALREG, 7, PALREG, 0x07,
+ OUT, PALREG, 8, PALREG, 0x10,
+ OUT, PALREG, 9, PALREG, 0x11,
+ OUT, PALREG, 10, PALREG, 0x12,
+ OUT, PALREG, 11, PALREG, 0x13,
+ OUT, PALREG, 12, PALREG, 0x14,
+ OUT, PALREG, 13, PALREG, 0x15,
+ OUT, PALREG, 14, PALREG, 0x16,
+ OUT, PALREG, 15, PALREG, 0x17,
+ OUT, PALREG, 16, PALREG, 0x08,
+ OUT, PALREG, 17, PALREG, 0x00,
+ OUT, PALREG, 18, PALREG, 0x0f,
+ OUT, PALREG, 19, PALREG, 0x00,
+
+ /* Enable palette */
+ OUT, PALREG, 0x20, 0, 0,
+
+ /* End of table */
+ DONE, 0, 0, 0, 0
+};
+
+#endif
+
+
+#if VGA_STANDARD
+
+/* VGA 640x480 16-color graphics (BIOS mode 0x12).
+ */
+static REGIO graphics_on[] = {
+ /* Reset attr F/F */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Disable palette */
+ OUT, PALREG, 0, 0, 0,
+
+ /* Reset sequencer regs */
+ OUT, SEQREG, 0, SEQVAL, 0,
+ OUT, SEQREG, 1, SEQVAL, 1,
+ OUT, SEQREG, 2, SEQVAL, 0x0f,
+ OUT, SEQREG, 3, SEQVAL, 0,
+ OUT, SEQREG, 4, SEQVAL, 6,
+
+ /* Misc out reg */
+ OUT, GENREG1, 0xe3, 0, 0,
+
+ /* Sequencer enable */
+ OUT, SEQREG, 0, SEQVAL, 0x03,
+
+ /* Unprotect crtc regs 0-7 */
+ OUT, CRTCREG, 0x11, CRTCVAL, 0,
+
+ /* Crtc */
+ OUT, CRTCREG, 0, CRTCVAL, 0x5f,
+ OUT, CRTCREG, 1, CRTCVAL, 0x4f,
+ OUT, CRTCREG, 2, CRTCVAL, 0x50,
+ OUT, CRTCREG, 3, CRTCVAL, 0x82,
+ OUT, CRTCREG, 4, CRTCVAL, 0x54,
+ OUT, CRTCREG, 5, CRTCVAL, 0x80,
+ OUT, CRTCREG, 6, CRTCVAL, 0x0b,
+ OUT, CRTCREG, 7, CRTCVAL, 0x3e,
+ OUT, CRTCREG, 8, CRTCVAL, 0x00,
+ OUT, CRTCREG, 9, CRTCVAL, 0x40,
+ OUT, CRTCREG, 10, CRTCVAL, 0x00,
+ OUT, CRTCREG, 11, CRTCVAL, 0x00,
+ OUT, CRTCREG, 12, CRTCVAL, 0x00,
+ OUT, CRTCREG, 13, CRTCVAL, 0x00,
+ OUT, CRTCREG, 14, CRTCVAL, 0x00,
+ OUT, CRTCREG, 15, CRTCVAL, 0x59,
+ OUT, CRTCREG, 16, CRTCVAL, 0xea,
+ OUT, CRTCREG, 17, CRTCVAL, 0x8c,
+ OUT, CRTCREG, 18, CRTCVAL, 0xdf,
+ OUT, CRTCREG, 19, CRTCVAL, 0x28,
+ OUT, CRTCREG, 20, CRTCVAL, 0x00,
+ OUT, CRTCREG, 21, CRTCVAL, 0xe7,
+ OUT, CRTCREG, 22, CRTCVAL, 0x04,
+ OUT, CRTCREG, 23, CRTCVAL, 0xe3,
+ OUT, CRTCREG, 24, CRTCVAL, 0xff,
+
+ /* Graphics controller */
+ OUT, GENREG2, 0x00, 0, 0,
+ OUT, GENREG3, 0x01, 0, 0,
+ OUT, GRREG, 0, GRVAL, 0x00,
+ OUT, GRREG, 1, GRVAL, 0x00,
+ OUT, GRREG, 2, GRVAL, 0x00,
+ OUT, GRREG, 3, GRVAL, 0x00,
+ OUT, GRREG, 4, GRVAL, 0x00,
+ OUT, GRREG, 5, GRVAL, 0x00,
+ OUT, GRREG, 6, GRVAL, 0x05,
+ OUT, GRREG, 7, GRVAL, 0x0f,
+ OUT, GRREG, 8, GRVAL, 0xff,
+
+ /* Reset attribute flip/flop */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Palette */
+ OUT, PALREG, 0, PALREG, 0x00,
+ OUT, PALREG, 1, PALREG, 0x01,
+ OUT, PALREG, 2, PALREG, 0x02,
+ OUT, PALREG, 3, PALREG, 0x03,
+ OUT, PALREG, 4, PALREG, 0x04,
+ OUT, PALREG, 5, PALREG, 0x05,
+ OUT, PALREG, 6, PALREG, 0x06,
+ OUT, PALREG, 7, PALREG, 0x07,
+ OUT, PALREG, 8, PALREG, 0x38,
+ OUT, PALREG, 9, PALREG, 0x39,
+ OUT, PALREG, 10, PALREG, 0x3a,
+ OUT, PALREG, 11, PALREG, 0x3b,
+ OUT, PALREG, 12, PALREG, 0x3c,
+ OUT, PALREG, 13, PALREG, 0x3d,
+ OUT, PALREG, 14, PALREG, 0x3e,
+ OUT, PALREG, 15, PALREG, 0x3f,
+ OUT, PALREG, 16, PALREG, 0x01,
+ OUT, PALREG, 17, PALREG, 0x00,
+ OUT, PALREG, 18, PALREG, 0x0f,
+ OUT, PALREG, 19, PALREG, 0x00,
+
+ /* Enable palette */
+ OUT, PALREG, 0x20, 0, 0,
+
+ /* End of table */
+ DONE, 0, 0, 0, 0
+};
+
+
+/* VGA 80x25 text (BIOS mode 3).
+ */
+static REGIO graph_off[] = {
+ /* Reset attr F/F */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Disable palette */
+ OUT, PALREG, 0, 0, 0,
+
+ /* Reset sequencer regs */
+ OUT, SEQREG, 0, SEQVAL, 1,
+ OUT, SEQREG, 1, SEQVAL, 1,
+ OUT, SEQREG, 2, SEQVAL, 3,
+ OUT, SEQREG, 3, SEQVAL, 0,
+ OUT, SEQREG, 4, SEQVAL, 2,
+
+ /* Misc out reg */
+ OUT, GENREG1, 0x63, 0, 0,
+
+ /* Sequencer enable */
+ OUT, SEQREG, 0, SEQVAL, 3,
+
+ /* Unprotect crtc regs 0-7 */
+ OUT, CRTCREG, 0x11, CRTCVAL, 0,
+
+ /* Crtc */
+ OUT, CRTCREG, 0, CRTCVAL, 0x5f, /* horiz total */
+ OUT, CRTCREG, 1, CRTCVAL, 0x4f, /* horiz end */
+ OUT, CRTCREG, 2, CRTCVAL, 0x50, /* horiz blank */
+ OUT, CRTCREG, 3, CRTCVAL, 0x82, /* end blank */
+ OUT, CRTCREG, 4, CRTCVAL, 0x55, /* horiz retrace */
+ OUT, CRTCREG, 5, CRTCVAL, 0x81, /* end retrace */
+ OUT, CRTCREG, 6, CRTCVAL, 0xbf, /* vert total */
+ OUT, CRTCREG, 7, CRTCVAL, 0x1f, /* overflows */
+ OUT, CRTCREG, 8, CRTCVAL, 0x00, /* row scan */
+ OUT, CRTCREG, 9, CRTCVAL, 0x4f, /* max scan line */
+ OUT, CRTCREG, 10, CRTCVAL, 0x00, /* cursor start */
+ OUT, CRTCREG, 11, CRTCVAL, 0x0f, /* cursor end */
+ OUT, CRTCREG, 12, CRTCVAL, 0x0e, /* start high addr */
+ OUT, CRTCREG, 13, CRTCVAL, 0xb0, /* low addr */
+ OUT, CRTCREG, 14, CRTCVAL, 0x16, /* cursor high */
+ OUT, CRTCREG, 15, CRTCVAL, 0x30, /* cursor low */
+ OUT, CRTCREG, 16, CRTCVAL, 0x9c, /* vert retrace */
+ OUT, CRTCREG, 17, CRTCVAL, 0x8e, /* retrace end */
+ OUT, CRTCREG, 18, CRTCVAL, 0x8f, /* vert end */
+ OUT, CRTCREG, 19, CRTCVAL, 0x28, /* offset */
+ OUT, CRTCREG, 20, CRTCVAL, 0x1f, /* underline */
+ OUT, CRTCREG, 21, CRTCVAL, 0x96, /* vert blank */
+ OUT, CRTCREG, 22, CRTCVAL, 0xb9, /* end blank */
+ OUT, CRTCREG, 23, CRTCVAL, 0xa3, /* crt mode */
+ OUT, CRTCREG, 24, CRTCVAL, 0xff, /* line compare */
+
+ /* Graphics controller */
+ OUT, GENREG2, 0x00, 0, 0,
+ OUT, GENREG3, 0x01, 0, 0,
+ OUT, GRREG, 0, GRVAL, 0x00,
+ OUT, GRREG, 1, GRVAL, 0x00,
+ OUT, GRREG, 2, GRVAL, 0x00,
+ OUT, GRREG, 3, GRVAL, 0x00,
+ OUT, GRREG, 4, GRVAL, 0x00,
+ OUT, GRREG, 5, GRVAL, 0x10,
+ OUT, GRREG, 6, GRVAL, 0x0e,
+ OUT, GRREG, 7, GRVAL, 0x00,
+ OUT, GRREG, 8, GRVAL, 0xff,
+
+ /* Reset attribute flip/flop */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Palette */
+ OUT, PALREG, 0, PALREG, 0x00,
+ OUT, PALREG, 1, PALREG, 0x01,
+ OUT, PALREG, 2, PALREG, 0x02,
+ OUT, PALREG, 3, PALREG, 0x03,
+ OUT, PALREG, 4, PALREG, 0x04,
+ OUT, PALREG, 5, PALREG, 0x05,
+ OUT, PALREG, 6, PALREG, 0x06,
+ OUT, PALREG, 7, PALREG, 0x07,
+ OUT, PALREG, 8, PALREG, 0x10,
+ OUT, PALREG, 9, PALREG, 0x11,
+ OUT, PALREG, 10, PALREG, 0x12,
+ OUT, PALREG, 11, PALREG, 0x13,
+ OUT, PALREG, 12, PALREG, 0x14,
+ OUT, PALREG, 13, PALREG, 0x15,
+ OUT, PALREG, 14, PALREG, 0x16,
+ OUT, PALREG, 15, PALREG, 0x17,
+ OUT, PALREG, 16, PALREG, 0x08,
+ OUT, PALREG, 17, PALREG, 0x00,
+ OUT, PALREG, 18, PALREG, 0x0f,
+ OUT, PALREG, 19, PALREG, 0x00,
+
+ /* Enable palette */
+ OUT, PALREG, 0x20, 0, 0,
+
+ /* End of table */
+ DONE, 0, 0, 0, 0
+};
+
+#endif
+
+
+#if EGA_STANDARD
+
+/* EGA 640x350 16-color graphics (BIOS mode 0x10).
+ */
+static REGIO graphics_on[] = {
+ /* Reset attr F/F */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Disable palette */
+ OUT, PALREG, 0, 0, 0,
+
+ /* Reset sequencer regs */
+ OUT, SEQREG, 0, SEQVAL, 0,
+ OUT, SEQREG, 1, SEQVAL, 1,
+ OUT, SEQREG, 2, SEQVAL, 0x0f,
+ OUT, SEQREG, 3, SEQVAL, 0,
+ OUT, SEQREG, 4, SEQVAL, 6,
+
+ /* Misc out reg */
+ OUT, GENREG1, 0xa7, 0, 0,
+
+ /* Sequencer enable */
+ OUT, SEQREG, 0, SEQVAL, 0x03,
+
+ /* Unprotect crtc regs 0-7 */
+ OUT, CRTCREG, 0x11, CRTCVAL, 0,
+
+ /* Crtc */
+ OUT, CRTCREG, 0, CRTCVAL, 0x5b,
+ OUT, CRTCREG, 1, CRTCVAL, 0x4f,
+ OUT, CRTCREG, 2, CRTCVAL, 0x53,
+ OUT, CRTCREG, 3, CRTCVAL, 0x37,
+ OUT, CRTCREG, 4, CRTCVAL, 0x52,
+ OUT, CRTCREG, 5, CRTCVAL, 0x00,
+ OUT, CRTCREG, 6, CRTCVAL, 0x6c,
+ OUT, CRTCREG, 7, CRTCVAL, 0x1f,
+ OUT, CRTCREG, 8, CRTCVAL, 0x00,
+ OUT, CRTCREG, 9, CRTCVAL, 0x00,
+ OUT, CRTCREG, 10, CRTCVAL, 0x00,
+ OUT, CRTCREG, 11, CRTCVAL, 0x00,
+ OUT, CRTCREG, 12, CRTCVAL, 0x00,
+ OUT, CRTCREG, 13, CRTCVAL, 0x00,
+ OUT, CRTCREG, 14, CRTCVAL, 0x00,
+ OUT, CRTCREG, 15, CRTCVAL, 0x00,
+ OUT, CRTCREG, 16, CRTCVAL, 0x5e,
+ OUT, CRTCREG, 17, CRTCVAL, 0x2b,
+ OUT, CRTCREG, 18, CRTCVAL, 0x5d,
+ OUT, CRTCREG, 19, CRTCVAL, 0x28,
+ OUT, CRTCREG, 20, CRTCVAL, 0x0f,
+ OUT, CRTCREG, 21, CRTCVAL, 0x5f,
+ OUT, CRTCREG, 22, CRTCVAL, 0x0a,
+ OUT, CRTCREG, 23, CRTCVAL, 0xe3,
+ OUT, CRTCREG, 24, CRTCVAL, 0xff,
+
+ /* Graphics controller */
+ OUT, GENREG2, 0x00, 0, 0,
+ OUT, GENREG3, 0x01, 0, 0,
+ OUT, GRREG, 0, GRVAL, 0x00,
+ OUT, GRREG, 1, GRVAL, 0x00,
+ OUT, GRREG, 2, GRVAL, 0x00,
+ OUT, GRREG, 3, GRVAL, 0x00,
+ OUT, GRREG, 4, GRVAL, 0x00,
+ OUT, GRREG, 5, GRVAL, 0x00,
+ OUT, GRREG, 6, GRVAL, 0x05,
+ OUT, GRREG, 7, GRVAL, 0x0f,
+ OUT, GRREG, 8, GRVAL, 0xff,
+
+ /* Reset attribute flip/flop */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Palette */
+ OUT, PALREG, 0, PALREG, 0x00,
+ OUT, PALREG, 1, PALREG, 0x01,
+ OUT, PALREG, 2, PALREG, 0x02,
+ OUT, PALREG, 3, PALREG, 0x03,
+ OUT, PALREG, 4, PALREG, 0x04,
+ OUT, PALREG, 5, PALREG, 0x05,
+ OUT, PALREG, 6, PALREG, 0x06,
+ OUT, PALREG, 7, PALREG, 0x07,
+ OUT, PALREG, 8, PALREG, 0x38,
+ OUT, PALREG, 9, PALREG, 0x39,
+ OUT, PALREG, 10, PALREG, 0x3a,
+ OUT, PALREG, 11, PALREG, 0x3b,
+ OUT, PALREG, 12, PALREG, 0x3c,
+ OUT, PALREG, 13, PALREG, 0x3d,
+ OUT, PALREG, 14, PALREG, 0x3e,
+ OUT, PALREG, 15, PALREG, 0x3f,
+ OUT, PALREG, 16, PALREG, 0x01,
+ OUT, PALREG, 17, PALREG, 0x00,
+ OUT, PALREG, 18, PALREG, 0x0f,
+ OUT, PALREG, 19, PALREG, 0x00,
+
+ /* Enable palette */
+ OUT, PALREG, 0x20, 0, 0,
+
+ /* End of table */
+ DONE, 0, 0, 0, 0
+};
+
+
+/* EGA 80x25 text (BIOS mode 3).
+ */
+static REGIO graph_off[] = {
+ /* Reset attr F/F */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Disable palette */
+ OUT, PALREG, 0, 0, 0,
+
+ /* Reset sequencer regs */
+ OUT, SEQREG, 0, SEQVAL, 1,
+ OUT, SEQREG, 1, SEQVAL, 1,
+ OUT, SEQREG, 2, SEQVAL, 3,
+ OUT, SEQREG, 3, SEQVAL, 0,
+ OUT, SEQREG, 4, SEQVAL, 3,
+
+ /* Misc out reg */
+ OUT, GENREG1, 0xa7, 0, 0,
+
+ /* Sequencer enable */
+ OUT, SEQREG, 0, SEQVAL, 3,
+
+ /* Crtc */
+ OUT, CRTCREG, 0, CRTCVAL, 0x5b, /* horiz total */
+ OUT, CRTCREG, 1, CRTCVAL, 0x4f, /* horiz end */
+ OUT, CRTCREG, 2, CRTCVAL, 0x53, /* horiz blank */
+ OUT, CRTCREG, 3, CRTCVAL, 0x37, /* end blank */
+ OUT, CRTCREG, 4, CRTCVAL, 0x51, /* horiz retrace */
+ OUT, CRTCREG, 5, CRTCVAL, 0x5b, /* end retrace */
+ OUT, CRTCREG, 6, CRTCVAL, 0x6c, /* vert total */
+ OUT, CRTCREG, 7, CRTCVAL, 0x1f, /* overflows */
+ OUT, CRTCREG, 8, CRTCVAL, 0x00, /* row scan */
+ OUT, CRTCREG, 9, CRTCVAL, 0x0d, /* max scan line */
+ OUT, CRTCREG, 10, CRTCVAL, 0x00, /* cursor start */
+ OUT, CRTCREG, 11, CRTCVAL, 0x0f, /* cursor end */
+ OUT, CRTCREG, 12, CRTCVAL, 0x00, /* start high addr */
+ OUT, CRTCREG, 13, CRTCVAL, 0x00, /* low addr */
+ OUT, CRTCREG, 14, CRTCVAL, 0x00, /* cursor high */
+ OUT, CRTCREG, 15, CRTCVAL, 0x00, /* cursor low */
+ OUT, CRTCREG, 16, CRTCVAL, 0x5e, /* vert retrace */
+ OUT, CRTCREG, 17, CRTCVAL, 0x2b, /* retrace end */
+ OUT, CRTCREG, 18, CRTCVAL, 0x5d, /* vert end */
+ OUT, CRTCREG, 19, CRTCVAL, 0x28, /* offset */
+ OUT, CRTCREG, 20, CRTCVAL, 0x0f, /* underline */
+ OUT, CRTCREG, 21, CRTCVAL, 0x5e, /* vert blank */
+ OUT, CRTCREG, 22, CRTCVAL, 0x0a, /* end blank */
+ OUT, CRTCREG, 23, CRTCVAL, 0xa3, /* crt mode */
+ OUT, CRTCREG, 24, CRTCVAL, 0xff, /* line compare */
+
+ /* Graphics controller */
+ OUT, GENREG2, 0x00, 0, 0,
+ OUT, GENREG3, 0x01, 0, 0,
+ OUT, GRREG, 0, GRVAL, 0x00,
+ OUT, GRREG, 1, GRVAL, 0x00,
+ OUT, GRREG, 2, GRVAL, 0x00,
+ OUT, GRREG, 3, GRVAL, 0x00,
+ OUT, GRREG, 4, GRVAL, 0x00,
+ OUT, GRREG, 5, GRVAL, 0x10,
+ OUT, GRREG, 6, GRVAL, 0x0e,
+ OUT, GRREG, 7, GRVAL, 0x00,
+ OUT, GRREG, 8, GRVAL, 0xff,
+
+ /* Reset attribute flip/flop */
+ IN, ATTRREG, 0, 0, 0,
+
+ /* Palette */
+ OUT, PALREG, 0, PALREG, 0x00,
+ OUT, PALREG, 1, PALREG, 0x01,
+ OUT, PALREG, 2, PALREG, 0x02,
+ OUT, PALREG, 3, PALREG, 0x03,
+ OUT, PALREG, 4, PALREG, 0x04,
+ OUT, PALREG, 5, PALREG, 0x05,
+ OUT, PALREG, 6, PALREG, 0x14,
+ OUT, PALREG, 7, PALREG, 0x07,
+ OUT, PALREG, 8, PALREG, 0x38,
+ OUT, PALREG, 9, PALREG, 0x39,
+ OUT, PALREG, 10, PALREG, 0x3a,
+ OUT, PALREG, 11, PALREG, 0x3b,
+ OUT, PALREG, 12, PALREG, 0x3c,
+ OUT, PALREG, 13, PALREG, 0x3d,
+ OUT, PALREG, 14, PALREG, 0x3e,
+ OUT, PALREG, 15, PALREG, 0x3f,
+ OUT, PALREG, 16, PALREG, 0x08,
+ OUT, PALREG, 17, PALREG, 0x00,
+ OUT, PALREG, 18, PALREG, 0x0f,
+ OUT, PALREG, 19, PALREG, 0x00,
+
+ /* Enable palette */
+ OUT, PALREG, 0x20, 0, 0,
+
+ /* End of table */
+ DONE, 0, 0, 0, 0
+};
+
+#endif