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