xref: /csrg-svn/sys/i386/stand/cga.c (revision 63368)
141071Swilliam /*-
2*63368Sbostic  * Copyright (c) 1990, 1993
3*63368Sbostic  *	The Regents of the University of California.  All rights reserved.
441071Swilliam  *
541071Swilliam  * This code is derived from software contributed to Berkeley by
641071Swilliam  * William Jolitz.
741071Swilliam  *
848814Swilliam  * %sccs.include.redist.c%
941071Swilliam  *
10*63368Sbostic  *	@(#)cga.c	8.1 (Berkeley) 06/11/93
1141071Swilliam  */
1241071Swilliam 
1356514Sbostic #include <sys/param.h>
1441071Swilliam 
1541071Swilliam #define	COL		80
1641071Swilliam #define	ROW		25
1741071Swilliam #define	CHR		2
1848815Swilliam #define MONO_BASE	0x3B4
1948815Swilliam #define MONO_BUF	0xB0000
2048815Swilliam #define CGA_BASE	0x3D4
2148815Swilliam #define CGA_BUF		0xB8000
2241071Swilliam 
2348815Swilliam static u_char	att = 0x7 ;
2448815Swilliam u_char *Crtat = (u_char *)CGA_BUF;
2541071Swilliam 
2648815Swilliam static unsigned int addr_6845 = CGA_BASE;
cursor(pos)2748815Swilliam cursor(pos)
2848815Swilliam int pos;
2948815Swilliam {
3048815Swilliam 	outb(addr_6845,14);
3148815Swilliam 	outb(addr_6845+1,pos >> 8);
3248815Swilliam 	outb(addr_6845,15);
3348815Swilliam 	outb(addr_6845+1,pos&0xff);
3448815Swilliam }
3541071Swilliam 
sput(c)3648815Swilliam sput(c)
3748815Swilliam u_char c;
3848815Swilliam {
3948815Swilliam 
4048815Swilliam 	static u_char *crtat = 0;
4148815Swilliam 	unsigned cursorat; u_short was;
4248815Swilliam 	u_char *cp;
4348815Swilliam 
4441071Swilliam 	if (crtat == 0) {
4548815Swilliam 
4648815Swilliam 		/* XXX probe to find if a color or monochrome display */
4748815Swilliam 		was = *(u_short *)Crtat;
4848815Swilliam 		*(u_short *)Crtat = 0xA55A;
4948815Swilliam 		if (*(u_short *)Crtat != 0xA55A) {
5048815Swilliam 			Crtat = (u_char *) MONO_BUF;
5148815Swilliam 			addr_6845 = MONO_BASE;
5248815Swilliam 		}
5348815Swilliam 		*(u_short *)Crtat = was;
5448815Swilliam 
5548815Swilliam 		/* Extract cursor location */
5648815Swilliam 		outb(addr_6845,14);
5748815Swilliam 		cursorat = inb(addr_6845+1)<<8 ;
5848815Swilliam 		outb(addr_6845,15);
5948815Swilliam 		cursorat |= inb(addr_6845+1);
6048815Swilliam 
6148815Swilliam 		if(cursorat <= COL*ROW) {
6248815Swilliam 			crtat = Crtat + cursorat*CHR;
6348815Swilliam 			att = crtat[1];	/* use current attribute present */
6448815Swilliam 		} else	crtat = Crtat;
6548815Swilliam 
6648815Swilliam 		/* clean display */
6748815Swilliam 		for (cp = crtat; cp < Crtat+ROW*COL*CHR; cp += 2) {
6848815Swilliam 			cp[0] = ' ';
6948815Swilliam 			cp[1] = att;
7048815Swilliam 		}
7141071Swilliam 	}
7241071Swilliam 
7348815Swilliam 	switch (c) {
7448815Swilliam 
7541071Swilliam 	case '\t':
7648815Swilliam 		do
7748815Swilliam 			sput(' ');
7848815Swilliam 		while ((int)crtat % (8*CHR));
7941071Swilliam 		break;
8041071Swilliam 
8141071Swilliam 	case '\010':
8248815Swilliam 		crtat -= CHR;
8341071Swilliam 		break;
8441071Swilliam 
8541071Swilliam 	case '\r':
8648815Swilliam 		crtat -= (crtat - Crtat) % (COL*CHR);
8741071Swilliam 		break;
8841071Swilliam 
8941071Swilliam 	case '\n':
9048815Swilliam 		crtat += COL*CHR ;
9141071Swilliam 		break;
9241071Swilliam 
9341071Swilliam 	default:
9448815Swilliam 		crtat[0] = c;
9548815Swilliam 		crtat[1] = att;
9648815Swilliam 		crtat += CHR;
9741071Swilliam 		break ;
9841071Swilliam 	}
9948815Swilliam 
10048815Swilliam #ifndef SMALL
10148815Swilliam 	/* implement a scroll */
10248815Swilliam 	if (crtat >= Crtat+COL*ROW*CHR) {
10348815Swilliam 		/* move text up */
10448815Swilliam 		bcopy(Crtat+COL*CHR, Crtat, COL*(ROW-1)*CHR);
10548815Swilliam 
10648815Swilliam 		/* clear line */
10748815Swilliam 		for (cp = Crtat+ COL*(ROW-1)*CHR;
10848815Swilliam 			cp < Crtat + COL*ROW*CHR ; cp += 2)
10948815Swilliam 			cp[0] = ' ';
11048815Swilliam 
11148815Swilliam 		crtat -= COL*CHR ;
11248815Swilliam 	}
11348815Swilliam #endif
11448815Swilliam 
11548815Swilliam 	cursor((crtat-Crtat)/CHR);
11641071Swilliam }
117