1 1.7 christos /* $NetBSD: video.c,v 1.7 2005/12/11 12:17:04 christos Exp $ */ 2 1.1 sakamoto 3 1.1 sakamoto /*- 4 1.1 sakamoto * Copyright (C) 1995-1997 Gary Thomas (gdt (at) linuxppc.org) 5 1.1 sakamoto * All rights reserved. 6 1.1 sakamoto * 7 1.1 sakamoto * Redistribution and use in source and binary forms, with or without 8 1.1 sakamoto * modification, are permitted provided that the following conditions 9 1.1 sakamoto * are met: 10 1.1 sakamoto * 1. Redistributions of source code must retain the above copyright 11 1.1 sakamoto * notice, this list of conditions and the following disclaimer. 12 1.1 sakamoto * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 sakamoto * notice, this list of conditions and the following disclaimer in the 14 1.1 sakamoto * documentation and/or other materials provided with the distribution. 15 1.1 sakamoto * 3. All advertising materials mentioning features or use of this software 16 1.1 sakamoto * must display the following acknowledgement: 17 1.1 sakamoto * This product includes software developed by Gary Thomas. 18 1.1 sakamoto * 4. The name of the author may not be used to endorse or promote products 19 1.1 sakamoto * derived from this software without specific prior written permission. 20 1.1 sakamoto * 21 1.1 sakamoto * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 1.1 sakamoto * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 1.1 sakamoto * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 1.1 sakamoto * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 1.1 sakamoto * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 1.1 sakamoto * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 1.1 sakamoto * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 1.1 sakamoto * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 1.1 sakamoto * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 1.1 sakamoto * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 1.1 sakamoto */ 32 1.1 sakamoto 33 1.1 sakamoto #ifdef CONS_BE 34 1.6 junyoung #include <lib/libsa/stand.h> 35 1.4 sakamoto #include "boot.h" 36 1.1 sakamoto #include "iso_font.h" 37 1.1 sakamoto 38 1.1 sakamoto #define FONT_WIDTH 8 39 1.1 sakamoto #define FONT_HEIGHT 16 40 1.1 sakamoto #define VRAM_WIDTH 640 41 1.1 sakamoto #define VRAM_HEIGHT 480 42 1.1 sakamoto #define VRAM_SIZE (VRAM_WIDTH * VRAM_HEIGHT) 43 1.1 sakamoto #define ROW (VRAM_WIDTH / FONT_WIDTH) 44 1.1 sakamoto #define COL (VRAM_HEIGHT / FONT_HEIGHT) 45 1.1 sakamoto 46 1.4 sakamoto u_char *VramBase; 47 1.4 sakamoto u_char save_cursor[FONT_WIDTH]; 48 1.1 sakamoto 49 1.1 sakamoto /* 50 1.1 sakamoto * The current state of virtual displays 51 1.1 sakamoto */ 52 1.1 sakamoto struct screen { 53 1.1 sakamoto enum state { 54 1.1 sakamoto NORMAL, /* no pending escape */ 55 1.1 sakamoto ESC, /* saw ESC */ 56 1.1 sakamoto EBRAC, /* saw ESC[ */ 57 1.1 sakamoto EBRACEQ /* saw ESC[= */ 58 1.1 sakamoto } state; /* command parser state */ 59 1.1 sakamoto int cx; /* the first escape seq argument */ 60 1.1 sakamoto int cy; /* the second escap seq argument */ 61 1.1 sakamoto int *accp; /* pointer to the current processed argument */ 62 1.1 sakamoto int row; 63 1.1 sakamoto int col; 64 1.4 sakamoto u_char fgcolor; 65 1.4 sakamoto u_char bgcolor; 66 1.1 sakamoto } screen; 67 1.1 sakamoto 68 1.1 sakamoto 69 1.1 sakamoto void 70 1.5 junyoung video_init(u_char *buffer) 71 1.1 sakamoto { 72 1.1 sakamoto struct screen *d = &screen; 73 1.1 sakamoto 74 1.1 sakamoto VramBase = buffer; 75 1.2 sakamoto d->fgcolor = 0x1f; /* WHITE */ 76 1.2 sakamoto d->bgcolor = 0x00; /* BLACK */ 77 1.1 sakamoto d->row = 0; 78 1.1 sakamoto d->col = 0; 79 1.1 sakamoto d->state = NORMAL; 80 1.1 sakamoto memset(VramBase, d->bgcolor, VRAM_SIZE); 81 1.1 sakamoto memset(save_cursor, d->bgcolor, FONT_WIDTH); 82 1.1 sakamoto } 83 1.1 sakamoto 84 1.1 sakamoto static void 85 1.5 junyoung wrtchar(u_char c, struct screen *d) 86 1.1 sakamoto { 87 1.4 sakamoto u_char *p = VramBase + 88 1.1 sakamoto (d->col * VRAM_WIDTH * FONT_HEIGHT) + (d->row * FONT_WIDTH); 89 1.1 sakamoto int fontbase = c * 16; 90 1.1 sakamoto int x, y; 91 1.1 sakamoto 92 1.1 sakamoto for (y = 0; y < FONT_HEIGHT; y++) { 93 1.1 sakamoto for (x = 0; x < FONT_WIDTH; x++) { 94 1.1 sakamoto if ((font[fontbase + y] >> (FONT_WIDTH - x)) & 1) 95 1.1 sakamoto *(p + x + (y * VRAM_WIDTH)) = d->fgcolor; 96 1.1 sakamoto else 97 1.1 sakamoto *(p + x + (y * VRAM_WIDTH)) = d->bgcolor; 98 1.1 sakamoto } 99 1.1 sakamoto } 100 1.1 sakamoto d->row++; 101 1.1 sakamoto } 102 1.1 sakamoto 103 1.1 sakamoto static void 104 1.5 junyoung cursor(struct screen *d, int flag) 105 1.1 sakamoto { 106 1.1 sakamoto int x; 107 1.1 sakamoto int y = FONT_HEIGHT - 1; 108 1.1 sakamoto 109 1.4 sakamoto u_char *p = VramBase + 110 1.1 sakamoto (d->col * VRAM_WIDTH * FONT_HEIGHT) + (d->row * FONT_WIDTH); 111 1.1 sakamoto for (x = 0; x < FONT_WIDTH - 1; x++) { 112 1.1 sakamoto if (flag) { 113 1.1 sakamoto save_cursor[x] = *(p + x + (y * VRAM_WIDTH)); 114 1.1 sakamoto *(p + x + (y * VRAM_WIDTH)) = d->fgcolor; 115 1.1 sakamoto } else { 116 1.1 sakamoto *(p + x + (y * VRAM_WIDTH)) = save_cursor[x]; 117 1.1 sakamoto } 118 1.1 sakamoto } 119 1.1 sakamoto } 120 1.1 sakamoto 121 1.1 sakamoto /* 122 1.1 sakamoto * vga_putc (nee sput) has support for emulation of the 'ibmpc' termcap entry. 123 1.1 sakamoto * This is a bare-bones implementation of a bare-bones entry 124 1.1 sakamoto * One modification: Change li#24 to li#25 to reflect 25 lines 125 1.1 sakamoto * "ca" is the color/attributes value (left-shifted by 8) 126 1.1 sakamoto * or 0 if the current regular color for that screen is to be used. 127 1.1 sakamoto */ 128 1.5 junyoung void 129 1.5 junyoung video_putc(int c) 130 1.1 sakamoto { 131 1.1 sakamoto struct screen *d = &screen; 132 1.1 sakamoto 133 1.1 sakamoto cursor(d, 0); 134 1.1 sakamoto 135 1.1 sakamoto switch (d->state) { 136 1.1 sakamoto case NORMAL: 137 1.1 sakamoto switch (c) { 138 1.1 sakamoto case 0x0: /* Ignore pad characters */ 139 1.1 sakamoto return; 140 1.1 sakamoto 141 1.1 sakamoto case 0x1B: 142 1.1 sakamoto d->state = ESC; 143 1.1 sakamoto break; 144 1.1 sakamoto 145 1.1 sakamoto case '\t': 146 1.1 sakamoto do { 147 1.1 sakamoto wrtchar(' ', d); 148 1.1 sakamoto } while (d->row % 8); 149 1.1 sakamoto break; 150 1.1 sakamoto 151 1.1 sakamoto case '\b': /* non-destructive backspace */ 152 1.1 sakamoto d->row--; 153 1.1 sakamoto if (d->row < 0) { 154 1.1 sakamoto if (d->col > 0) { 155 1.1 sakamoto d->col--; 156 1.1 sakamoto d->row += ROW; /* prev column */ 157 1.1 sakamoto } else { 158 1.1 sakamoto d->row = 0; 159 1.1 sakamoto } 160 1.1 sakamoto } 161 1.1 sakamoto break; 162 1.1 sakamoto 163 1.1 sakamoto case '\n': 164 1.1 sakamoto d->col++; 165 1.5 junyoung /* FALLTHROUGH */ 166 1.1 sakamoto case '\r': 167 1.1 sakamoto d->row = 0; 168 1.1 sakamoto break; 169 1.1 sakamoto 170 1.1 sakamoto case '\007': 171 1.1 sakamoto break; 172 1.1 sakamoto 173 1.1 sakamoto default: 174 1.1 sakamoto wrtchar(c, d); 175 1.1 sakamoto if (d->row >= ROW) { 176 1.1 sakamoto d->row = 0; 177 1.1 sakamoto d->col++; 178 1.1 sakamoto } 179 1.1 sakamoto break; 180 1.1 sakamoto } 181 1.4 sakamoto break; 182 1.4 sakamoto 183 1.4 sakamoto case ESC: 184 1.4 sakamoto case EBRAC: 185 1.4 sakamoto case EBRACEQ: 186 1.1 sakamoto break; 187 1.1 sakamoto } 188 1.1 sakamoto if (d->col >= COL) { /* scroll check */ 189 1.1 sakamoto memcpy(VramBase, VramBase + VRAM_WIDTH * FONT_HEIGHT, 190 1.1 sakamoto VRAM_SIZE - VRAM_WIDTH * FONT_WIDTH); 191 1.1 sakamoto memset(VramBase + VRAM_SIZE - VRAM_WIDTH * FONT_HEIGHT, 192 1.1 sakamoto d->bgcolor, VRAM_WIDTH * FONT_HEIGHT); 193 1.1 sakamoto d->col = COL - 1; 194 1.5 junyoung } 195 1.1 sakamoto cursor(d, 1); 196 1.1 sakamoto } 197 1.1 sakamoto #endif 198