|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1990 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * William Jolitz. ! 7: * ! 8: * Redistribution and use in source and binary forms, with or without ! 9: * modification, are permitted provided that the following conditions ! 10: * are met: ! 11: * 1. Redistributions of source code must retain the above copyright ! 12: * notice, this list of conditions and the following disclaimer. ! 13: * 2. Redistributions in binary form must reproduce the above copyright ! 14: * notice, this list of conditions and the following disclaimer in the ! 15: * documentation and/or other materials provided with the distribution. ! 16: * 3. All advertising materials mentioning features or use of this software ! 17: * must display the following acknowledgement: ! 18: * This product includes software developed by the University of ! 19: * California, Berkeley and its contributors. ! 20: * 4. Neither the name of the University nor the names of its contributors ! 21: * may be used to endorse or promote products derived from this software ! 22: * without specific prior written permission. ! 23: * ! 24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 34: * SUCH DAMAGE. ! 35: * ! 36: * @(#)cga.c 5.3 (Berkeley) 4/28/91 ! 37: */ ! 38: ! 39: #include "param.h" ! 40: ! 41: #define COL 80 ! 42: #define ROW 25 ! 43: #define CHR 2 ! 44: #define MONO_BASE 0x3B4 ! 45: #define MONO_BUF 0xB0000 ! 46: #define CGA_BASE 0x3D4 ! 47: #define CGA_BUF 0xB8000 ! 48: ! 49: static u_char att = 0x7 ; ! 50: u_char *Crtat = (u_char *)CGA_BUF; ! 51: ! 52: static unsigned int addr_6845 = CGA_BASE; ! 53: cursor(pos) ! 54: int pos; ! 55: { ! 56: outb(addr_6845,14); ! 57: outb(addr_6845+1,pos >> 8); ! 58: outb(addr_6845,15); ! 59: outb(addr_6845+1,pos&0xff); ! 60: } ! 61: ! 62: sput(c) ! 63: u_char c; ! 64: { ! 65: ! 66: static u_char *crtat = 0; ! 67: unsigned cursorat; u_short was; ! 68: u_char *cp; ! 69: ! 70: if (crtat == 0) { ! 71: ! 72: /* XXX probe to find if a color or monochrome display */ ! 73: was = *(u_short *)Crtat; ! 74: *(u_short *)Crtat = 0xA55A; ! 75: if (*(u_short *)Crtat != 0xA55A) { ! 76: Crtat = (u_char *) MONO_BUF; ! 77: addr_6845 = MONO_BASE; ! 78: } ! 79: *(u_short *)Crtat = was; ! 80: ! 81: /* Extract cursor location */ ! 82: outb(addr_6845,14); ! 83: cursorat = inb(addr_6845+1)<<8 ; ! 84: outb(addr_6845,15); ! 85: cursorat |= inb(addr_6845+1); ! 86: ! 87: if(cursorat <= COL*ROW) { ! 88: crtat = Crtat + cursorat*CHR; ! 89: att = crtat[1]; /* use current attribute present */ ! 90: } else crtat = Crtat; ! 91: ! 92: /* clean display */ ! 93: for (cp = crtat; cp < Crtat+ROW*COL*CHR; cp += 2) { ! 94: cp[0] = ' '; ! 95: cp[1] = att; ! 96: } ! 97: } ! 98: ! 99: switch (c) { ! 100: ! 101: case '\t': ! 102: do ! 103: sput(' '); ! 104: while ((int)crtat % (8*CHR)); ! 105: break; ! 106: ! 107: case '\010': ! 108: crtat -= CHR; ! 109: break; ! 110: ! 111: case '\r': ! 112: crtat -= (crtat - Crtat) % (COL*CHR); ! 113: break; ! 114: ! 115: case '\n': ! 116: crtat += COL*CHR ; ! 117: break; ! 118: ! 119: default: ! 120: crtat[0] = c; ! 121: crtat[1] = att; ! 122: crtat += CHR; ! 123: break ; ! 124: } ! 125: ! 126: #ifndef SMALL ! 127: /* implement a scroll */ ! 128: if (crtat >= Crtat+COL*ROW*CHR) { ! 129: /* move text up */ ! 130: bcopy(Crtat+COL*CHR, Crtat, COL*(ROW-1)*CHR); ! 131: ! 132: /* clear line */ ! 133: for (cp = Crtat+ COL*(ROW-1)*CHR; ! 134: cp < Crtat + COL*ROW*CHR ; cp += 2) ! 135: cp[0] = ' '; ! 136: ! 137: crtat -= COL*CHR ; ! 138: } ! 139: #endif ! 140: ! 141: cursor((crtat-Crtat)/CHR); ! 142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.