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)2748815Swilliamcursor(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)3648815Swilliamsput(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