xref: /csrg-svn/sys/i386/stand/cga.c (revision 48815)
141071Swilliam /*-
241071Swilliam  * Copyright (c) 1990 The Regents of the University of California.
341071Swilliam  * 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*48815Swilliam  *	@(#)cga.c	7.3 (Berkeley) 04/28/91
1141071Swilliam  */
1241071Swilliam 
13*48815Swilliam #include "param.h"
1441071Swilliam 
1541071Swilliam #define	COL		80
1641071Swilliam #define	ROW		25
1741071Swilliam #define	CHR		2
18*48815Swilliam #define MONO_BASE	0x3B4
19*48815Swilliam #define MONO_BUF	0xB0000
20*48815Swilliam #define CGA_BASE	0x3D4
21*48815Swilliam #define CGA_BUF		0xB8000
2241071Swilliam 
23*48815Swilliam static u_char	att = 0x7 ;
24*48815Swilliam u_char *Crtat = (u_char *)CGA_BUF;
2541071Swilliam 
26*48815Swilliam static unsigned int addr_6845 = CGA_BASE;
27*48815Swilliam cursor(pos)
28*48815Swilliam int pos;
29*48815Swilliam {
30*48815Swilliam 	outb(addr_6845,14);
31*48815Swilliam 	outb(addr_6845+1,pos >> 8);
32*48815Swilliam 	outb(addr_6845,15);
33*48815Swilliam 	outb(addr_6845+1,pos&0xff);
34*48815Swilliam }
3541071Swilliam 
36*48815Swilliam sput(c)
37*48815Swilliam u_char c;
38*48815Swilliam {
39*48815Swilliam 
40*48815Swilliam 	static u_char *crtat = 0;
41*48815Swilliam 	unsigned cursorat; u_short was;
42*48815Swilliam 	u_char *cp;
43*48815Swilliam 
4441071Swilliam 	if (crtat == 0) {
45*48815Swilliam 
46*48815Swilliam 		/* XXX probe to find if a color or monochrome display */
47*48815Swilliam 		was = *(u_short *)Crtat;
48*48815Swilliam 		*(u_short *)Crtat = 0xA55A;
49*48815Swilliam 		if (*(u_short *)Crtat != 0xA55A) {
50*48815Swilliam 			Crtat = (u_char *) MONO_BUF;
51*48815Swilliam 			addr_6845 = MONO_BASE;
52*48815Swilliam 		}
53*48815Swilliam 		*(u_short *)Crtat = was;
54*48815Swilliam 
55*48815Swilliam 		/* Extract cursor location */
56*48815Swilliam 		outb(addr_6845,14);
57*48815Swilliam 		cursorat = inb(addr_6845+1)<<8 ;
58*48815Swilliam 		outb(addr_6845,15);
59*48815Swilliam 		cursorat |= inb(addr_6845+1);
60*48815Swilliam 
61*48815Swilliam 		if(cursorat <= COL*ROW) {
62*48815Swilliam 			crtat = Crtat + cursorat*CHR;
63*48815Swilliam 			att = crtat[1];	/* use current attribute present */
64*48815Swilliam 		} else	crtat = Crtat;
65*48815Swilliam 
66*48815Swilliam 		/* clean display */
67*48815Swilliam 		for (cp = crtat; cp < Crtat+ROW*COL*CHR; cp += 2) {
68*48815Swilliam 			cp[0] = ' ';
69*48815Swilliam 			cp[1] = att;
70*48815Swilliam 		}
7141071Swilliam 	}
7241071Swilliam 
73*48815Swilliam 	switch (c) {
74*48815Swilliam 
7541071Swilliam 	case '\t':
76*48815Swilliam 		do
77*48815Swilliam 			sput(' ');
78*48815Swilliam 		while ((int)crtat % (8*CHR));
7941071Swilliam 		break;
8041071Swilliam 
8141071Swilliam 	case '\010':
82*48815Swilliam 		crtat -= CHR;
8341071Swilliam 		break;
8441071Swilliam 
8541071Swilliam 	case '\r':
86*48815Swilliam 		crtat -= (crtat - Crtat) % (COL*CHR);
8741071Swilliam 		break;
8841071Swilliam 
8941071Swilliam 	case '\n':
90*48815Swilliam 		crtat += COL*CHR ;
9141071Swilliam 		break;
9241071Swilliam 
9341071Swilliam 	default:
94*48815Swilliam 		crtat[0] = c;
95*48815Swilliam 		crtat[1] = att;
96*48815Swilliam 		crtat += CHR;
9741071Swilliam 		break ;
9841071Swilliam 	}
99*48815Swilliam 
100*48815Swilliam #ifndef SMALL
101*48815Swilliam 	/* implement a scroll */
102*48815Swilliam 	if (crtat >= Crtat+COL*ROW*CHR) {
103*48815Swilliam 		/* move text up */
104*48815Swilliam 		bcopy(Crtat+COL*CHR, Crtat, COL*(ROW-1)*CHR);
105*48815Swilliam 
106*48815Swilliam 		/* clear line */
107*48815Swilliam 		for (cp = Crtat+ COL*(ROW-1)*CHR;
108*48815Swilliam 			cp < Crtat + COL*ROW*CHR ; cp += 2)
109*48815Swilliam 			cp[0] = ' ';
110*48815Swilliam 
111*48815Swilliam 		crtat -= COL*CHR ;
112*48815Swilliam 	}
113*48815Swilliam #endif
114*48815Swilliam 
115*48815Swilliam 	cursor((crtat-Crtat)/CHR);
11641071Swilliam }
117