xref: /csrg-svn/sys/i386/stand/cga.c (revision 41071)
1*41071Swilliam /*-
2*41071Swilliam  * Copyright (c) 1990 The Regents of the University of California.
3*41071Swilliam  * All rights reserved.
4*41071Swilliam  *
5*41071Swilliam  * This code is derived from software contributed to Berkeley by
6*41071Swilliam  * William Jolitz.
7*41071Swilliam  *
8*41071Swilliam  * %sccs.include.noredist.c%
9*41071Swilliam  *
10*41071Swilliam  *	@(#)cga.c	7.1 (Berkeley) 04/24/90
11*41071Swilliam  */
12*41071Swilliam 
13*41071Swilliam typedef unsigned short u_short;
14*41071Swilliam typedef unsigned char u_char;
15*41071Swilliam 
16*41071Swilliam #define	CRT_TXTADDR	((u_short *)0xb8000)
17*41071Swilliam #define	COL		80
18*41071Swilliam #define	ROW		25
19*41071Swilliam #define	CHR		2
20*41071Swilliam 
21*41071Swilliam u_short	*crtat;
22*41071Swilliam u_char	color = 0xe ;
23*41071Swilliam int row;
24*41071Swilliam 
25*41071Swilliam sput(c) u_char c; {
26*41071Swilliam 
27*41071Swilliam 	if (crtat == 0) {
28*41071Swilliam 		crtat = CRT_TXTADDR; bzero (crtat,COL*ROW*CHR);
29*41071Swilliam 	}
30*41071Swilliam 	if (crtat >= (CRT_TXTADDR+COL*ROW*CHR)) {
31*41071Swilliam 		crtat = CRT_TXTADDR+COL*(ROW-1); row = 0;
32*41071Swilliam 	}
33*41071Swilliam 	switch(c) {
34*41071Swilliam 
35*41071Swilliam 	case '\t':
36*41071Swilliam 		do {
37*41071Swilliam 			*crtat++ = (color<<8)| ' '; row++ ;
38*41071Swilliam 		} while (row %8);
39*41071Swilliam 		break;
40*41071Swilliam 
41*41071Swilliam 	case '\010':
42*41071Swilliam 		crtat--; row--;
43*41071Swilliam 		break;
44*41071Swilliam 
45*41071Swilliam 	case '\r':
46*41071Swilliam 		bzero (crtat,(COL-row)*CHR) ; crtat -= row ; row = 0;
47*41071Swilliam 		break;
48*41071Swilliam 
49*41071Swilliam 	case '\n':
50*41071Swilliam 		if (crtat >= CRT_TXTADDR+COL*(ROW-1)) { /* scroll */
51*41071Swilliam 			bcopy(CRT_TXTADDR+COL, CRT_TXTADDR,COL*(ROW-1)*CHR);
52*41071Swilliam 			bzero (CRT_TXTADDR+COL*(ROW-1),COL*CHR) ;
53*41071Swilliam 			crtat -= COL ;
54*41071Swilliam 		}
55*41071Swilliam 		crtat += COL ;
56*41071Swilliam 		break;
57*41071Swilliam 
58*41071Swilliam 	default:
59*41071Swilliam 		*crtat++ = (color<<8)| c; row++ ;
60*41071Swilliam 		break ;
61*41071Swilliam 	}
62*41071Swilliam }
63