[comp.os.minix] MINI-X Patch #2

dbell@pdact.pd.necisa.oz.au (David I. Bell) (04/29/91)

The following is a patch to ega.x and graph_ega.c for mini-X to support VGAs.
This should help those of you who have been complaining about the graphics
not working right.  Apply ega.x.cdiff to ega.x, but simply replace
graph_ega.c.  (Once again cdiff failed to produce a working patch file, so
the complete source for graph_ega.c is provided.)

I had been under the (mistaken) impression that VGA boards were simply
extensions of EGA boards, and that setting registers to EGA values would
work on the VGA.  This is not true, some of the registers are incompatible.
So I bought a Tseng Labs VGA board, and got the graphics to work for VGAs.

The resolution when using VGAs is 640x480, which is the highest standard
resolution.  To go higher than this depends on which VGA board you have.

-dbell-


#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  ega.x.cdiff graph_ega.c
# Wrapped by dbell@elm on Mon Apr 29 11:03:08 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'ega.x.cdiff' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ega.x.cdiff'\"
else
echo shar: Extracting \"'ega.x.cdiff'\" \(957 characters\)
sed "s/^X//" >'ega.x.cdiff' <<'END_OF_FILE'
X*** ../old/kernel/ega.x	Sat Apr 20 15:18:45 1991
X--- ega.x	Mon Apr 29 09:00:57 1991
X***************
X*** 13,20 ****
X  #include "protect.h"
X  
X  
X! #define	PIXCOLS		640		/* number of pixels across */
X! #define	PIXROWS		350		/* number of pixels down */
X  #define	PIXBYTES	80		/* number of bytes across */
X  #define	CHARROWS	14		/* number of pixels in char heights */
X  #define	CHARCOLS	8		/* number of pixels in char widths */
X--- 13,32 ----
X  #include "protect.h"
X  
X  
X! /* Make this 1 for VGA boards, or 0 for EGA boards.
X!  * This is also defined in graph_ega.c.
X!  */
X! #define	VGA	1
X! 
X! 
X! #if	VGA
X! #define	PIXROWS		480		/* number of pixels down */
X! #else
X! #define	PIXROWS		350		/* number of pixels down */
X! #endif
X! 
X! 
X! #define	PIXCOLS		640		/* number of pixels across */
X  #define	PIXBYTES	80		/* number of bytes across */
X  #define	CHARROWS	14		/* number of pixels in char heights */
X  #define	CHARCOLS	8		/* number of pixels in char widths */
END_OF_FILE
if test 957 -ne `wc -c <'ega.x.cdiff'`; then
    echo shar: \"'ega.x.cdiff'\" unpacked with wrong size!
fi
# end of 'ega.x.cdiff'
fi
if test -f 'graph_ega.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'graph_ega.c'\"
else
echo shar: Extracting \"'graph_ega.c'\" \(20154 characters\)
sed "s/^X//" >'graph_ega.c' <<'END_OF_FILE'
X/* Copyright (c) 1991 David I. Bell
X * Permission is granted to use, distribute, or modify this source,
X * provided that this copyright notice remains intact.
X *
X * Low level graphics mode for ega and vga.
X * Since these are "device level" routines, there is no need to check
X * clipping since the higher level routines should have already done this.
X * However, checking for values outside the screen memory is reasonable
X * for safety.
X */
X
X#include "kernel.h"
X#include "protect.h"
X#include "graph_dev.h"
X
X
X/* Make this 1 for VGA boards, or 0 for EGA boards.
X * This is also defined in ega.x.
X */
X#define	VGA	1
X
X
X#if	VGA
X#define	ROWS	480		/* rows */
X#else
X#define	ROWS	350		/* rows */
X#endif
X
X#define	COLS	640		/* columns */
X#define	COLORS	16		/* number of colors */
X#define	BLACK	0		/* black */
X#define	WHITE	15		/* white */
X
X#define	DONE	0
X#define	IN	1
X#define	OUT	2
X
X#define	ROM_SCAN_LINES	14	/* number of scan lines in fonts in ROM */
X#define	RAM_SCAN_LINES	32	/* number of scan lines in fonts in RAM */
X#define	FONT_CHARS	256	/* number of characters in font tables */
X#define	CHAR_WIDTH	8	/* number of pixels for character width */
X#define	EGA_BASE	0xa0000	/* location of enhanced display memory */
X
X
X
X#define	PALREG	0x3c0
X#define	SEQREG	0x3c4
X#define	SEQVAL	0x3c5
X#define	GRREG	0x3ce
X#define	GRVAL	0x3cf
X#define	ATTRREG	0x3da
X#define	CRTCREG	0x3d4
X#define	CRTCVAL	0x3d5
X
X#define	GENREG1	0x3c2
X#define	GENREG2	0x3cc
X#define	GENREG3	0x3ca
X
X#define	DATA_ROTATE	3	/* register number for data rotate */
X
X
XFORWARD int ega_init();
XFORWARD void ega_term();
XFORWARD void ega_setmode();
XFORWARD void ega_drawrow();
XFORWARD void ega_drawcol();
XFORWARD void ega_drawtext();
XFORWARD void ega_sizetext();
XFORWARD void ega_getscreeninfo();
XFORWARD void ega_getfontinfo();
X
Xextern void ega_drawpoint();
Xextern void ega_drawline();
Xextern void ega_setgraphics();
Xextern void ega_getcharbits();
Xextern GR_COLOR ega_readpoint();
X
X
XGR_DEV gr_dev = {
X  ega_init, ega_term, ega_setmode, ega_drawpoint, ega_drawline,
X  ega_drawrow, ega_drawcol, gen_fillrect, gen_drawellipse,
X  gen_fillellipse, ega_drawtext, ega_sizetext, gen_drawarea8,
X  gen_drawbitmap, ega_readpoint, gen_setcursor, gen_movecursor,
X  gen_checkcursor, gen_fixcursor, gen_copyarea, ega_getcharbits,
X  ega_getscreeninfo, ega_getfontinfo, ROWS, COLS, COLORS, BLACK, WHITE
X};
X
Xtypedef struct {
X  int action;
X  int port1;
X  int data1;
X  int port2;
X  int data2;
X} REGIO;
X
X
X#if	VGA
X
X/* VGA 640x480 16-color graphics (BIOS mode 0x12).
X */
XPRIVATE REGIO graphics_on[] = {
X  /* Reset attr F/F */
X  IN, ATTRREG, 0, 0, 0,
X
X  /* Disable palette */
X  OUT, PALREG, 0, 0, 0,
X
X  /* Reset sequencer regs */
X  OUT, SEQREG, 0, SEQVAL, 0,
X  OUT, SEQREG, 1, SEQVAL, 1,
X  OUT, SEQREG, 2, SEQVAL, 0x0f,
X  OUT, SEQREG, 3, SEQVAL, 0,
X  OUT, SEQREG, 4, SEQVAL, 6,
X
X  /* Misc out reg */
X  OUT, GENREG1, 0xe3, 0, 0,
X
X  /* Sequencer enable */
X  OUT, SEQREG, 0, SEQVAL, 0x03,
X
X  /* Unprotect crtc regs 0-7 */
X  OUT, CRTCREG, 0x11, CRTCVAL, 0,
X
X  /* Crtc */
X  OUT, CRTCREG, 0, CRTCVAL, 0x5f,
X  OUT, CRTCREG, 1, CRTCVAL, 0x4f,
X  OUT, CRTCREG, 2, CRTCVAL, 0x50,
X  OUT, CRTCREG, 3, CRTCVAL, 0x82,
X  OUT, CRTCREG, 4, CRTCVAL, 0x54,
X  OUT, CRTCREG, 5, CRTCVAL, 0x80,
X  OUT, CRTCREG, 6, CRTCVAL, 0x0b,
X  OUT, CRTCREG, 7, CRTCVAL, 0x3e,
X  OUT, CRTCREG, 8, CRTCVAL, 0x00,
X  OUT, CRTCREG, 9, CRTCVAL, 0x40,
X  OUT, CRTCREG, 10, CRTCVAL, 0x00,
X  OUT, CRTCREG, 11, CRTCVAL, 0x00,
X  OUT, CRTCREG, 12, CRTCVAL, 0x00,
X  OUT, CRTCREG, 13, CRTCVAL, 0x00,
X  OUT, CRTCREG, 14, CRTCVAL, 0x00,
X  OUT, CRTCREG, 15, CRTCVAL, 0x59,
X  OUT, CRTCREG, 16, CRTCVAL, 0xea,
X  OUT, CRTCREG, 17, CRTCVAL, 0x8c,
X  OUT, CRTCREG, 18, CRTCVAL, 0xdf,
X  OUT, CRTCREG, 19, CRTCVAL, 0x28,
X  OUT, CRTCREG, 20, CRTCVAL, 0x00,
X  OUT, CRTCREG, 21, CRTCVAL, 0xe7,
X  OUT, CRTCREG, 22, CRTCVAL, 0x04,
X  OUT, CRTCREG, 23, CRTCVAL, 0xe3,
X  OUT, CRTCREG, 24, CRTCVAL, 0xff,
X
X  /* Graphics controller */
X  OUT, GENREG2, 0x00, 0, 0,
X  OUT, GENREG3, 0x01, 0, 0,
X  OUT, GRREG, 0, GRVAL, 0x00,
X  OUT, GRREG, 1, GRVAL, 0x00,
X  OUT, GRREG, 2, GRVAL, 0x00,
X  OUT, GRREG, 3, GRVAL, 0x00,
X  OUT, GRREG, 4, GRVAL, 0x00,
X  OUT, GRREG, 5, GRVAL, 0x00,
X  OUT, GRREG, 6, GRVAL, 0x05,
X  OUT, GRREG, 7, GRVAL, 0x0f,
X  OUT, GRREG, 8, GRVAL, 0xff,
X
X  /* Reset attribute flip/flop */
X  IN, ATTRREG, 0, 0, 0,
X
X  /* Palette */
X  OUT, PALREG, 0, PALREG, 0x00,
X  OUT, PALREG, 1, PALREG, 0x01,
X  OUT, PALREG, 2, PALREG, 0x02,
X  OUT, PALREG, 3, PALREG, 0x03,
X  OUT, PALREG, 4, PALREG, 0x04,
X  OUT, PALREG, 5, PALREG, 0x05,
X  OUT, PALREG, 6, PALREG, 0x14,
X  OUT, PALREG, 7, PALREG, 0x07,
X  OUT, PALREG, 8, PALREG, 0x38,
X  OUT, PALREG, 9, PALREG, 0x39,
X  OUT, PALREG, 10, PALREG, 0x3a,
X  OUT, PALREG, 11, PALREG, 0x3b,
X  OUT, PALREG, 12, PALREG, 0x3c,
X  OUT, PALREG, 13, PALREG, 0x3d,
X  OUT, PALREG, 14, PALREG, 0x3e,
X  OUT, PALREG, 15, PALREG, 0x3f,
X  OUT, PALREG, 16, PALREG, 0x01,
X  OUT, PALREG, 17, PALREG, 0x00,
X  OUT, PALREG, 18, PALREG, 0x0f,
X  OUT, PALREG, 19, PALREG, 0x00,
X
X  /* Enable palette */
X  OUT, PALREG, 0x20, 0, 0,
X
X  /* End of table */
X  DONE, 0, 0, 0, 0
X};
X
X
X/* VGA 80x25 text (BIOS mode 3).
X */
XPRIVATE REGIO graph_off[] = {
X  /* Reset attr F/F */
X  IN, ATTRREG, 0, 0, 0,
X
X  /* Disable palette */
X  OUT, PALREG, 0, 0, 0,
X
X  /* Reset sequencer regs */
X  OUT, SEQREG, 0, SEQVAL, 1,
X  OUT, SEQREG, 1, SEQVAL, 1,
X  OUT, SEQREG, 2, SEQVAL, 3,
X  OUT, SEQREG, 3, SEQVAL, 0,
X  OUT, SEQREG, 4, SEQVAL, 2,
X
X  /* Misc out reg */
X  OUT, GENREG1, 0x63, 0, 0,
X
X  /* Sequencer enable */
X  OUT, SEQREG, 0, SEQVAL, 3,
X
X  /* Unprotect crtc regs 0-7 */
X  OUT, CRTCREG, 0x11, CRTCVAL, 0,
X
X  /* Crtc */
X  OUT, CRTCREG, 0, CRTCVAL, 0x5f,	/* horiz total */
X  OUT, CRTCREG, 1, CRTCVAL, 0x4f,	/* horiz end */
X  OUT, CRTCREG, 2, CRTCVAL, 0x50,	/* horiz blank */
X  OUT, CRTCREG, 3, CRTCVAL, 0x82,	/* end blank */
X  OUT, CRTCREG, 4, CRTCVAL, 0x55,	/* horiz retrace */
X  OUT, CRTCREG, 5, CRTCVAL, 0x81,	/* end retrace */
X  OUT, CRTCREG, 6, CRTCVAL, 0xbf,	/* vert total */
X  OUT, CRTCREG, 7, CRTCVAL, 0x1f,	/* overflows */
X  OUT, CRTCREG, 8, CRTCVAL, 0x00,	/* row scan */
X  OUT, CRTCREG, 9, CRTCVAL, 0x4f,	/* max scan line */
X  OUT, CRTCREG, 10, CRTCVAL, 0x00,	/* cursor start */
X  OUT, CRTCREG, 11, CRTCVAL, 0x0f,	/* cursor end */
X  OUT, CRTCREG, 12, CRTCVAL, 0x0e,	/* start high addr */
X  OUT, CRTCREG, 13, CRTCVAL, 0xb0,	/* low addr */
X  OUT, CRTCREG, 14, CRTCVAL, 0x16,	/* cursor high */
X  OUT, CRTCREG, 15, CRTCVAL, 0x30,	/* cursor low */
X  OUT, CRTCREG, 16, CRTCVAL, 0x9c,	/* vert retrace */
X  OUT, CRTCREG, 17, CRTCVAL, 0x8e,	/* retrace end */
X  OUT, CRTCREG, 18, CRTCVAL, 0x8f,	/* vert end */
X  OUT, CRTCREG, 19, CRTCVAL, 0x28,	/* offset */
X  OUT, CRTCREG, 20, CRTCVAL, 0x1f,	/* underline */
X  OUT, CRTCREG, 21, CRTCVAL, 0x96,	/* vert blank */
X  OUT, CRTCREG, 22, CRTCVAL, 0xb9,	/* end blank */
X  OUT, CRTCREG, 23, CRTCVAL, 0xa3,	/* crt mode */
X  OUT, CRTCREG, 24, CRTCVAL, 0xff,	/* line compare */
X
X  /* Graphics controller */
X  OUT, GENREG2, 0x00, 0, 0,
X  OUT, GENREG3, 0x01, 0, 0,
X  OUT, GRREG, 0, GRVAL, 0x00,
X  OUT, GRREG, 1, GRVAL, 0x00,
X  OUT, GRREG, 2, GRVAL, 0x00,
X  OUT, GRREG, 3, GRVAL, 0x00,
X  OUT, GRREG, 4, GRVAL, 0x00,
X  OUT, GRREG, 5, GRVAL, 0x10,
X  OUT, GRREG, 6, GRVAL, 0x0e,
X  OUT, GRREG, 7, GRVAL, 0x00,
X  OUT, GRREG, 8, GRVAL, 0xff,
X
X  /* Reset attribute flip/flop */
X  IN, ATTRREG, 0, 0, 0,
X
X  /* Palette */
X  OUT, PALREG, 0, PALREG, 0x00,
X  OUT, PALREG, 1, PALREG, 0x01,
X  OUT, PALREG, 2, PALREG, 0x02,
X  OUT, PALREG, 3, PALREG, 0x03,
X  OUT, PALREG, 4, PALREG, 0x04,
X  OUT, PALREG, 5, PALREG, 0x05,
X  OUT, PALREG, 6, PALREG, 0x06,
X  OUT, PALREG, 7, PALREG, 0x07,
X  OUT, PALREG, 8, PALREG, 0x10,
X  OUT, PALREG, 9, PALREG, 0x11,
X  OUT, PALREG, 10, PALREG, 0x12,
X  OUT, PALREG, 11, PALREG, 0x13,
X  OUT, PALREG, 12, PALREG, 0x14,
X  OUT, PALREG, 13, PALREG, 0x15,
X  OUT, PALREG, 14, PALREG, 0x16,
X  OUT, PALREG, 15, PALREG, 0x17,
X  OUT, PALREG, 16, PALREG, 0x08,
X  OUT, PALREG, 17, PALREG, 0x00,
X  OUT, PALREG, 18, PALREG, 0x0f,
X  OUT, PALREG, 19, PALREG, 0x00,
X
X  /* Enable palette */
X  OUT, PALREG, 0x20, 0, 0,
X
X  /* End of table */
X  DONE, 0, 0, 0, 0
X};
X
X#else
X
X/* EGA 640x350 16-color graphics (BIOS mode 0x10).
X */
XPRIVATE REGIO graphics_on[] = {
X  /* Reset attr F/F */
X  IN, ATTRREG, 0, 0, 0,
X
X  /* Disable palette */
X  OUT, PALREG, 0, 0, 0,
X
X  /* Reset sequencer regs */
X  OUT, SEQREG, 0, SEQVAL, 0,
X  OUT, SEQREG, 1, SEQVAL, 1,
X  OUT, SEQREG, 2, SEQVAL, 0x0f,
X  OUT, SEQREG, 3, SEQVAL, 0,
X  OUT, SEQREG, 4, SEQVAL, 6,
X
X  /* Misc out reg */
X  OUT, GENREG1, 0xa7, 0, 0,
X
X  /* Sequencer enable */
X  OUT, SEQREG, 0, SEQVAL, 0x03,
X
X  /* Unprotect crtc regs 0-7 */
X  OUT, CRTCREG, 0x11, CRTCVAL, 0,
X
X  /* Crtc */
X  OUT, CRTCREG, 0, CRTCVAL, 0x5b,
X  OUT, CRTCREG, 1, CRTCVAL, 0x4f,
X  OUT, CRTCREG, 2, CRTCVAL, 0x53,
X  OUT, CRTCREG, 3, CRTCVAL, 0x37,
X  OUT, CRTCREG, 4, CRTCVAL, 0x52,
X  OUT, CRTCREG, 5, CRTCVAL, 0x00,
X  OUT, CRTCREG, 6, CRTCVAL, 0x6c,
X  OUT, CRTCREG, 7, CRTCVAL, 0x1f,
X  OUT, CRTCREG, 8, CRTCVAL, 0x00,
X  OUT, CRTCREG, 9, CRTCVAL, 0x00,
X  OUT, CRTCREG, 10, CRTCVAL, 0x00,
X  OUT, CRTCREG, 11, CRTCVAL, 0x00,
X  OUT, CRTCREG, 12, CRTCVAL, 0x00,
X  OUT, CRTCREG, 13, CRTCVAL, 0x00,
X  OUT, CRTCREG, 14, CRTCVAL, 0x00,
X  OUT, CRTCREG, 15, CRTCVAL, 0x00,
X  OUT, CRTCREG, 16, CRTCVAL, 0x5e,
X  OUT, CRTCREG, 17, CRTCVAL, 0x2b,
X  OUT, CRTCREG, 18, CRTCVAL, 0x5d,
X  OUT, CRTCREG, 19, CRTCVAL, 0x28,
X  OUT, CRTCREG, 20, CRTCVAL, 0x0f,
X  OUT, CRTCREG, 21, CRTCVAL, 0x5f,
X  OUT, CRTCREG, 22, CRTCVAL, 0x0a,
X  OUT, CRTCREG, 23, CRTCVAL, 0xe3,
X  OUT, CRTCREG, 24, CRTCVAL, 0xff,
X
X  /* Graphics controller */
X  OUT, GENREG2, 0x00, 0, 0,
X  OUT, GENREG3, 0x01, 0, 0,
X  OUT, GRREG, 0, GRVAL, 0x00,
X  OUT, GRREG, 1, GRVAL, 0x00,
X  OUT, GRREG, 2, GRVAL, 0x00,
X  OUT, GRREG, 3, GRVAL, 0x00,
X  OUT, GRREG, 4, GRVAL, 0x00,
X  OUT, GRREG, 5, GRVAL, 0x00,
X  OUT, GRREG, 6, GRVAL, 0x05,
X  OUT, GRREG, 7, GRVAL, 0x0f,
X  OUT, GRREG, 8, GRVAL, 0xff,
X
X  /* Reset attribute flip/flop */
X  IN, ATTRREG, 0, 0, 0,
X
X  /* Palette */
X  OUT, PALREG, 0, PALREG, 0x00,
X  OUT, PALREG, 1, PALREG, 0x01,
X  OUT, PALREG, 2, PALREG, 0x02,
X  OUT, PALREG, 3, PALREG, 0x03,
X  OUT, PALREG, 4, PALREG, 0x04,
X  OUT, PALREG, 5, PALREG, 0x05,
X  OUT, PALREG, 6, PALREG, 0x06,
X  OUT, PALREG, 7, PALREG, 0x07,
X  OUT, PALREG, 8, PALREG, 0x38,
X  OUT, PALREG, 9, PALREG, 0x39,
X  OUT, PALREG, 10, PALREG, 0x3a,
X  OUT, PALREG, 11, PALREG, 0x3b,
X  OUT, PALREG, 12, PALREG, 0x3c,
X  OUT, PALREG, 13, PALREG, 0x3d,
X  OUT, PALREG, 14, PALREG, 0x3e,
X  OUT, PALREG, 15, PALREG, 0x3f,
X  OUT, PALREG, 16, PALREG, 0x01,
X  OUT, PALREG, 17, PALREG, 0x00,
X  OUT, PALREG, 18, PALREG, 0x0f,
X  OUT, PALREG, 19, PALREG, 0x00,
X
X  /* Enable palette */
X  OUT, PALREG, 0x20, 0, 0,
X
X  /* End of table */
X  DONE, 0, 0, 0, 0
X};
X
X
X/* EGA 80x25 text (BIOS mode 3).
X */
XPRIVATE REGIO graph_off[] = {
X  /* Reset attr F/F */
X  IN, ATTRREG, 0, 0, 0,
X
X  /* Disable palette */
X  OUT, PALREG, 0, 0, 0,
X
X  /* Reset sequencer regs */
X  OUT, SEQREG, 0, SEQVAL, 1,
X  OUT, SEQREG, 1, SEQVAL, 1,
X  OUT, SEQREG, 2, SEQVAL, 3,
X  OUT, SEQREG, 3, SEQVAL, 0,
X  OUT, SEQREG, 4, SEQVAL, 3,
X
X  /* Misc out reg */
X  OUT, GENREG1, 0xa7, 0, 0,
X
X  /* Sequencer enable */
X  OUT, SEQREG, 0, SEQVAL, 3,
X
X  /* Crtc */
X  OUT, CRTCREG, 0, CRTCVAL, 0x5b,	/* horiz total */
X  OUT, CRTCREG, 1, CRTCVAL, 0x4f,	/* horiz end */
X  OUT, CRTCREG, 2, CRTCVAL, 0x53,	/* horiz blank */
X  OUT, CRTCREG, 3, CRTCVAL, 0x37,	/* end blank */
X  OUT, CRTCREG, 4, CRTCVAL, 0x51,	/* horiz retrace */
X  OUT, CRTCREG, 5, CRTCVAL, 0x5b,	/* end retrace */
X  OUT, CRTCREG, 6, CRTCVAL, 0x6c,	/* vert total */
X  OUT, CRTCREG, 7, CRTCVAL, 0x1f,	/* overflows */
X  OUT, CRTCREG, 8, CRTCVAL, 0x00,	/* row scan */
X  OUT, CRTCREG, 9, CRTCVAL, 0x0d,	/* max scan line */
X  OUT, CRTCREG, 10, CRTCVAL, 0x00,	/* cursor start */
X  OUT, CRTCREG, 11, CRTCVAL, 0x0f,	/* cursor end */
X  OUT, CRTCREG, 12, CRTCVAL, 0x00,	/* start high addr */
X  OUT, CRTCREG, 13, CRTCVAL, 0x00,	/* low addr */
X  OUT, CRTCREG, 14, CRTCVAL, 0x00,	/* cursor high */
X  OUT, CRTCREG, 15, CRTCVAL, 0x00,	/* cursor low */
X  OUT, CRTCREG, 16, CRTCVAL, 0x5e,	/* vert retrace */
X  OUT, CRTCREG, 17, CRTCVAL, 0x2b,	/* retrace end */
X  OUT, CRTCREG, 18, CRTCVAL, 0x5d,	/* vert end */
X  OUT, CRTCREG, 19, CRTCVAL, 0x28,	/* offset */
X  OUT, CRTCREG, 20, CRTCVAL, 0x0f,	/* underline */
X  OUT, CRTCREG, 21, CRTCVAL, 0x5e,	/* vert blank */
X  OUT, CRTCREG, 22, CRTCVAL, 0x0a,	/* end blank */
X  OUT, CRTCREG, 23, CRTCVAL, 0xa3,	/* crt mode */
X  OUT, CRTCREG, 24, CRTCVAL, 0xff,	/* line compare */
X
X  /* Graphics controller */
X  OUT, GENREG2, 0x00, 0, 0,
X  OUT, GENREG3, 0x01, 0, 0,
X  OUT, GRREG, 0, GRVAL, 0x00,
X  OUT, GRREG, 1, GRVAL, 0x00,
X  OUT, GRREG, 2, GRVAL, 0x00,
X  OUT, GRREG, 3, GRVAL, 0x00,
X  OUT, GRREG, 4, GRVAL, 0x00,
X  OUT, GRREG, 5, GRVAL, 0x10,
X  OUT, GRREG, 6, GRVAL, 0x0e,
X  OUT, GRREG, 7, GRVAL, 0x00,
X  OUT, GRREG, 8, GRVAL, 0xff,
X
X  /* Reset attribute flip/flop */
X  IN, ATTRREG, 0, 0, 0,
X
X  /* Palette */
X  OUT, PALREG, 0, PALREG, 0x00,
X  OUT, PALREG, 1, PALREG, 0x01,
X  OUT, PALREG, 2, PALREG, 0x02,
X  OUT, PALREG, 3, PALREG, 0x03,
X  OUT, PALREG, 4, PALREG, 0x04,
X  OUT, PALREG, 5, PALREG, 0x05,
X  OUT, PALREG, 6, PALREG, 0x14,
X  OUT, PALREG, 7, PALREG, 0x07,
X  OUT, PALREG, 8, PALREG, 0x38,
X  OUT, PALREG, 9, PALREG, 0x39,
X  OUT, PALREG, 10, PALREG, 0x3a,
X  OUT, PALREG, 11, PALREG, 0x3b,
X  OUT, PALREG, 12, PALREG, 0x3c,
X  OUT, PALREG, 13, PALREG, 0x3d,
X  OUT, PALREG, 14, PALREG, 0x3e,
X  OUT, PALREG, 15, PALREG, 0x3f,
X  OUT, PALREG, 16, PALREG, 0x08,
X  OUT, PALREG, 17, PALREG, 0x00,
X  OUT, PALREG, 18, PALREG, 0x0f,
X  OUT, PALREG, 19, PALREG, 0x00,
X
X  /* Enable palette */
X  OUT, PALREG, 0x20, 0, 0,
X
X  /* End of table */
X  DONE, 0, 0, 0, 0
X};
X
X#endif
X
X
X/* Values for the data rotate register to implement drawing modes. */
XPRIVATE unsigned char mode_table[GR_MAX_MODE + 1] = {
X  0x00, 0x18, 0x10, 0x08
X};
X
X
X/*===========================================================================*
X *				writeregs				     *
X *===========================================================================*/
XPRIVATE void writeregs(rp)
Xregister REGIO *rp;
X{
X/* Set the graphics registers as indicated by the given table */
X  for (; rp->action != DONE; rp++) {
X	switch (rp->action) {
X	    case IN:	in_byte(rp->port1);	break;
X	    case OUT:
X		out_byte(rp->port1, rp->data1);
X		if (rp->port2) out_byte(rp->port2, rp->data2);
X		break;
X	}
X  }
X}
X
X
X/*===========================================================================*
X *				out_word				     *
X *===========================================================================*/
XPRIVATE void out_word(p, d)
Xunsigned int p;
Xunsigned int d;
X{
X/* Output a word to an I/O port. */
X  out_byte(p, d & 0xff);
X  out_byte(p + 1, (d >> 8) & 0xff);
X}
X
X
X/*===========================================================================*
X *				ega_init				     *
X *===========================================================================*/
XPRIVATE int ega_init(rows, cols, colors)
XGR_SIZE rows;
XGR_SIZE cols;
Xlong colors;
X{
X/* Setup for drawing to the ega.
X * Returns nonzero if the parameters are illegal.
X */
X  if ((rows && (rows != ROWS)) || (cols && (cols != COLS))
X      || (colors && (colors != COLORS)))
X	return -1;
X  writeregs(graphics_on);
X  for (rows = 0; rows < ROWS; rows++) ega_drawrow(0, COLS - 1, rows, BLACK);
X  return 0;
X}
X
X
X/*===========================================================================*
X *				ega_term				     *
X *===========================================================================*/
XPRIVATE void ega_term()
X{
X/* Terminate graphics mode for the EGA.
X * This resets back to normal text mode.
X */
X  long srcoffset;
X  long destoffset;
X  int data;
X  int ch;
X  int row;
X
X  ega_setmode(GR_MODE_SET);
X  for (row = 0; row < ROWS; row++) ega_drawrow(0, COLS - 1, row, BLACK);
X
X  /* Copy character table from ROM back into bit plane 2 before turning
X   * off graphics.
X   */
X  out_word(SEQREG, 0x0100);	/* syn reset */
X  out_word(SEQREG, 0x0402);	/* cpu writes only to map 2 */
X  out_word(SEQREG, 0x0704);	/* sequential addressing */
X  out_word(SEQREG, 0x0300);	/* clear synchronous reset */
X
X  out_word(GRREG, 0x0204);	/* select map 2 for CPU reads */
X  out_word(GRREG, 0x0005);	/* disable odd-even addressing */
X
X  srcoffset = rom_char_addr;
X  destoffset = EGA_BASE;
X  for (ch = 0; ch < FONT_CHARS; ch++) {
X	for (row = 0; row < ROM_SCAN_LINES; row++) {
X		data = get_byte(FLAT_DS_SELECTOR, srcoffset++);
X		put_byte(FLAT_DS_SELECTOR, destoffset++, data);
X	}
X	destoffset += (RAM_SCAN_LINES - ROM_SCAN_LINES);
X  }
X
X  /* Finally set the registers back for text mode. */
X  writeregs(graph_off);
X}
X
X
X/*===========================================================================*
X *				ega_setmode				     *
X *===========================================================================*/
XPRIVATE void ega_setmode(mode)
XGR_MODE mode;			/* drawing mode */
X{
X/* Set the drawing mode.
X * This is either SET, OR, AND, or XOR.
X */
X  if (mode > GR_MAX_MODE) return;
X  out_byte(GRREG, DATA_ROTATE);
X  out_byte(GRVAL, mode_table[mode]);
X}
X
X
X/*===========================================================================*
X *				ega_drawrow				     *
X *===========================================================================*/
XPRIVATE void ega_drawrow(x1, x2, y, color)
XGR_COORD x1;
XGR_COORD x2;
XGR_COORD y;
XGR_COLOR color;
X{
X  ega_drawline(x1, y, x2, y, color);
X}
X
X
X/*===========================================================================*
X *				ega_drawcol				     *
X *===========================================================================*/
XPRIVATE void ega_drawcol(x, y1, y2, color)
XGR_COORD x;
XGR_COORD y1;
XGR_COORD y2;
XGR_COLOR color;
X{
X  ega_drawline(x, y1, x, y2, color);
X}
X
X
X/*===========================================================================*
X *				ega_drawtext				     *
X *===========================================================================*/
XPRIVATE void ega_drawtext(x, y, str, cc, fg)
XGR_COORD x, y;			/* bottom left location */
XGR_CHAR *str;			/* character string */
XGR_SIZE cc;			/* length of string */
XGR_COLOR fg;			/* foreground color */
X{
X  GR_SIZE width;		/* width of character */
X  GR_SIZE height;		/* height of character */
X  GR_BITMAP bitmap[ROM_SCAN_LINES];	/* bitmap for character */
X
X  y -= (ROM_SCAN_LINES - 1);
X  while (cc-- > 0) {
X	ega_getcharbits(*str++, bitmap, &width, &height);
X	gen_drawbitmap(x, y, width, height, bitmap, fg);
X	x += width;
X  }
X}
X
X
X/*===========================================================================*
X *				ega_sizetext				     *
X *===========================================================================*/
XPRIVATE void ega_sizetext(buf, cc, retx, rety)
XGR_CHAR *buf;
XGR_SIZE cc;
XGR_SIZE *retx;
XGR_SIZE *rety;
X{
X  *retx = CHAR_WIDTH * cc;
X  *rety = ROM_SCAN_LINES;
X}
X
X
X/*===========================================================================*
X *				ega_getscreeninfo			     *
X *===========================================================================*/
XPRIVATE void ega_getscreeninfo(ip)
XGR_SCREEN_INFO *ip;		/* where to return result */
X{
X/* Return the screen configuration information for the ega. */
X  ip->rows = gr_dev.rows;
X  ip->cols = gr_dev.cols;
X#if VGA
X  ip->xdpcm = 27;		/* assumes screen width of 24 cm */
X  ip->ydpcm = 27;		/* assumes screen height of 18 cm */
X#else
X  ip->xdpcm = 27;		/* assumes screen width of 24 cm */
X  ip->ydpcm = 19;		/* assumes screen height of 18 cm */
X#endif
X  ip->maxcolor = gr_dev.colors - 1;
X  ip->black = gr_dev.black;
X  ip->white = gr_dev.white;
X  ip->fonts = 1;		/* only 1 builtin font */
X}
X
X
X/*===========================================================================*
X *				ega_getfontinfo				     *
X *===========================================================================*/
XPRIVATE void ega_getfontinfo(font, fip)
XGR_FONT font;			/* font number */
XGR_FONT_INFO *fip;		/* where to return result */
X{
X/* Return the font information about a font in the ega.
X * Currently we only support one font.
X */
X  int i;
X
X  fip->font = font;
X  if (font != 0) {
X	fip->height = 1;
X	fip->maxwidth = 1;
X	fip->baseline = 0;
X	fip->fixed = GR_TRUE;
X	for (i = 0; i < 256; i++) fip->widths[i] = 1;
X  }
X  fip->height = ROM_SCAN_LINES;
X  fip->maxwidth = CHAR_WIDTH;
X  fip->baseline = 3;
X  fip->fixed = GR_TRUE;
X  for (i = 0; i < 256; i++) fip->widths[i] = CHAR_WIDTH;
X}
X
X/* END CODE */
END_OF_FILE
if test 20154 -ne `wc -c <'graph_ega.c'`; then
    echo shar: \"'graph_ega.c'\" unpacked with wrong size!
fi
# end of 'graph_ega.c'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0