|
|
1.1 ! root 1: /* netboot ! 2: * ! 3: * cga.c,v ! 4: * Revision 1.1 1993/07/08 16:03:54 brezak ! 5: * Diskless boot prom code from Jim McKim ([email protected]) ! 6: * ! 7: * Revision 1.1.1.1 1993/05/28 11:41:06 mckim ! 8: * Initial version. ! 9: * ! 10: * ! 11: * source in this file came from ! 12: * the original 386BSD boot block. ! 13: * ! 14: * Copyright (c) 1990 The Regents of the University of California. ! 15: * All rights reserved. ! 16: * ! 17: * This code is derived from software contributed to Berkeley by ! 18: * William Jolitz. ! 19: * ! 20: * Redistribution and use in source and binary forms, with or without ! 21: * modification, are permitted provided that the following conditions ! 22: * are met: ! 23: * 1. Redistributions of source code must retain the above copyright ! 24: * notice, this list of conditions and the following disclaimer. ! 25: * 2. Redistributions in binary form must reproduce the above copyright ! 26: * notice, this list of conditions and the following disclaimer in the ! 27: * documentation and/or other materials provided with the distribution. ! 28: * 3. All advertising materials mentioning features or use of this software ! 29: * must display the following acknowledgement: ! 30: * This product includes software developed by the University of ! 31: * California, Berkeley and its contributors. ! 32: * 4. Neither the name of the University nor the names of its contributors ! 33: * may be used to endorse or promote products derived from this software ! 34: * without specific prior written permission. ! 35: * ! 36: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 37: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 38: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 39: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 40: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 41: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 42: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 43: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 44: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 45: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 46: * SUCH DAMAGE. ! 47: * ! 48: * @(#)cga.c 5.3 (Berkeley) 4/28/91 ! 49: */ ! 50: ! 51: #include "proto.h" ! 52: ! 53: #define COL 80 ! 54: #define ROW 25 ! 55: #define CHR 2 ! 56: #define MONO_BASE 0x3B4 ! 57: #define MONO_BUF 0xB0000 ! 58: #define CGA_BASE 0x3D4 ! 59: #define CGA_BUF 0xB8000 ! 60: ! 61: static u_char att = 0x7 ; ! 62: u_char *Crtat = (u_char *)CGA_BUF; ! 63: ! 64: static unsigned int addr_6845 = CGA_BASE; ! 65: ! 66: static void cursor(int pos) { ! 67: outb(addr_6845, 14); ! 68: outb(addr_6845+1, pos >> 8); ! 69: outb(addr_6845, 15); ! 70: outb(addr_6845+1, pos&0xff); ! 71: } ! 72: ! 73: void ! 74: putc(int c) { ! 75: #ifdef USE_BIOS ! 76: asm(" ! 77: movb %0, %%cl ! 78: call _prot_to_real ! 79: .byte 0x66 ! 80: mov $0x1, %%ebx ! 81: movb $0xe, %%ah ! 82: movb %%cl, %%al ! 83: sti ! 84: int $0x10 ! 85: cli ! 86: .byte 0x66 ! 87: call _real_to_prot ! 88: " : : "g" (ch)); ! 89: #else ! 90: static u_char *crtat = 0; ! 91: unsigned cursorat; u_short was; ! 92: u_char *cp; ! 93: ! 94: if (crtat == 0) { ! 95: ! 96: /* XXX probe to find if a color or monochrome display */ ! 97: was = *(u_short *)Crtat; ! 98: *(u_short *)Crtat = 0xA55A; ! 99: if (*(u_short *)Crtat != 0xA55A) { ! 100: Crtat = (u_char *) MONO_BUF; ! 101: addr_6845 = MONO_BASE; ! 102: } ! 103: *(u_short *)Crtat = was; ! 104: ! 105: /* Extract cursor location */ ! 106: outb(addr_6845,14); ! 107: cursorat = inb(addr_6845+1)<<8 ; ! 108: outb(addr_6845,15); ! 109: cursorat |= inb(addr_6845+1); ! 110: ! 111: if(cursorat <= COL*ROW) { ! 112: crtat = Crtat + cursorat*CHR; ! 113: /* att = crtat[1]; */ /* use current attribute present */ ! 114: } else crtat = Crtat; ! 115: ! 116: /* clean display */ ! 117: for (cp = crtat; cp < Crtat+ROW*COL*CHR; cp += 2) { ! 118: cp[0] = ' '; ! 119: cp[1] = att; ! 120: } ! 121: } ! 122: ! 123: switch (c) { ! 124: ! 125: case '\t': ! 126: do ! 127: putc(' '); ! 128: while ((int)crtat % (8*CHR)); ! 129: break; ! 130: ! 131: case '\010': ! 132: crtat -= CHR; ! 133: break; ! 134: ! 135: case '\r': ! 136: crtat -= (crtat - Crtat) % (COL*CHR); ! 137: break; ! 138: ! 139: case '\n': ! 140: crtat += COL*CHR ; ! 141: break; ! 142: ! 143: default: ! 144: crtat[0] = c; ! 145: crtat[1] = att; ! 146: crtat += CHR; ! 147: break ; ! 148: } ! 149: ! 150: /* implement a scroll */ ! 151: if (crtat >= Crtat+COL*ROW*CHR) { ! 152: /* move text up */ ! 153: bcopy((char *)(Crtat+COL*CHR), (char *)Crtat, COL*(ROW-1)*CHR); ! 154: ! 155: /* clear line */ ! 156: for (cp = Crtat+ COL*(ROW-1)*CHR; ! 157: cp < Crtat + COL*ROW*CHR ; cp += 2) ! 158: cp[0] = ' '; ! 159: ! 160: crtat -= COL*CHR ; ! 161: } ! 162: cursor((crtat-Crtat)/CHR); ! 163: #endif ! 164: } ! 165: ! 166: void ! 167: putchar(int c) ! 168: { ! 169: if (c == '\n') ! 170: putc('\r'); ! 171: putc(c); ! 172: } ! 173: ! 174: /* printf - only handles %d as decimal, %c as char, %s as string */ ! 175: ! 176: void ! 177: printf(format,data) ! 178: const char *format; ! 179: int data; ! 180: { ! 181: int *dataptr = &data; ! 182: char c; ! 183: while ((c = *format++)) { ! 184: if (c != '%') ! 185: putchar(c); ! 186: else { ! 187: switch (c = *format++) { ! 188: case 'd': { ! 189: int num = *dataptr++; ! 190: char buf[10], *ptr = buf; ! 191: if (num<0) { ! 192: num = -num; ! 193: putchar('-'); ! 194: } ! 195: do ! 196: *ptr++ = '0'+num%10; ! 197: while ((num /= 10)); ! 198: do ! 199: putchar(*--ptr); ! 200: while (ptr != buf); ! 201: break; ! 202: } ! 203: case 'x': { ! 204: int num = *dataptr++, dig; ! 205: char buf[8], *ptr = buf; ! 206: do ! 207: *ptr++ = (dig=(num&0xf)) > 9? ! 208: 'a' + dig - 10 : ! 209: '0' + dig; ! 210: while ((num >>= 4)); ! 211: do ! 212: putchar(*--ptr); ! 213: while (ptr != buf); ! 214: break; ! 215: } ! 216: case 'c': putchar((*dataptr++)&0xff); break; ! 217: case 's': { ! 218: char *ptr = (char *)*dataptr++; ! 219: while ((c = *ptr++)) ! 220: putchar(c); ! 221: break; ! 222: } ! 223: } ! 224: } ! 225: } ! 226: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.