aboutsummaryrefslogtreecommitdiff
path: root/platform/pc/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/pc/console.c')
-rw-r--r--platform/pc/console.c315
1 files changed, 0 insertions, 315 deletions
diff --git a/platform/pc/console.c b/platform/pc/console.c
deleted file mode 100644
index cfc4a774..00000000
--- a/platform/pc/console.c
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Copyright (c) 2009 Corey Tabaka
- * Copyright (c) 2016 Travis Geiselbrecht
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-#include <arch/x86.h>
-#include <platform/pc.h>
-#include <platform/console.h>
-#include <string.h>
-#include <lib/io.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-
-/* memory mapped framebuffer */
-#define FB (0xB8000U + KERNEL_ASPACE_BASE)
-
-/* CGA values */
-#define CURSOR_START 0x0A
-#define CURSOR_END 0x0B
-#define VIDEO_ADDRESS_MSB 0x0C
-#define VIDEO_ADDRESS_LSB 0x0D
-#define CURSOR_POS_MSB 0x0E
-#define CURSOR_POS_LSB 0x0F
-
-/* curr settings */
-static unsigned char curr_x;
-static unsigned char curr_y;
-static unsigned char curr_start;
-static unsigned char curr_end;
-static unsigned char curr_attr = 0x7;
-
-/* video page buffer */
-#define VPAGE_SIZE 2048
-#define PAGE_MAX 8
-
-static int active_page = 0;
-static int visual_page = 0;
-
-static int curs_x[PAGE_MAX];
-static int curs_y[PAGE_MAX];
-
-static struct {
- int x1, y1, x2, y2;
-} view_window = {
- 0, 0, 79, 24
-};
-
-void platform_init_console(void)
-{
- curr_save();
- window(0, 0, 79, 24);
- clear();
- place(0, 0);
-}
-
-void set_visual_page(int page)
-{
- unsigned short page_offset = page*VPAGE_SIZE;
- visual_page = page;
-
- outp(CGA_INDEX_REG, VIDEO_ADDRESS_LSB);
- outp(CGA_DATA_REG, page_offset & 0xFF);
- outp(CGA_INDEX_REG, VIDEO_ADDRESS_MSB);
- outp(CGA_DATA_REG, (page_offset >> 8) & 0xFF);
-}
-
-void set_active_page(int page)
-{
- curs_x[active_page] = curr_x;
- curs_y[active_page] = curr_y;
- curr_x = curs_x[page];
- curr_y = curs_y[page];
- active_page = page;
-}
-
-int get_visual_page(void)
-{
- return visual_page;
-}
-
-int get_active_page(void)
-{
- return active_page;
-}
-
-void place(int x,int y)
-{
- unsigned short cursor_word = x + y*80 + active_page*VPAGE_SIZE;
-
- /*
- * program CGA using index reg, then data reg
- */
- outp(CGA_INDEX_REG, CURSOR_POS_LSB);
- outp(CGA_DATA_REG, cursor_word & 0xFF);
- outp(CGA_INDEX_REG, CURSOR_POS_MSB);
- outp(CGA_DATA_REG, (cursor_word >> 8) & 0xFF);
-
- curr_x = x;
- curr_y = y;
-}
-
-void cursor(int start,int end)
-{
- outp(CGA_INDEX_REG, CURSOR_START);
- outp(CGA_DATA_REG, start);
- outp(CGA_INDEX_REG, CURSOR_END);
- outp(CGA_DATA_REG, end);
-}
-
-void curr_save(void)
-{
-#if 0
- /* grab some info from the bios data area (these should be defined in memmap.h */
- curr_attr = *((unsigned char *)FB + 159);
- curr_x = *((unsigned char *)0x00450);
- curr_y = *((unsigned char *)0x00451);
- curr_end = *((unsigned char *)0x00460);
- curr_start = *((unsigned char *)0x00461);
-#endif
- active_page = visual_page = 0;
-}
-
-void curr_restore(void)
-{
-#if 0
- *((unsigned char *)0x00450) = curr_x;
- *((unsigned char *)0x00451) = curr_y;
-#endif
-
- place(curr_x, curr_y);
- cursor(curr_start, curr_end);
-}
-
-void window(int x1, int y1, int x2, int y2)
-{
- view_window.x1 = x1;
- view_window.y1 = y1;
- view_window.x2 = x2;
- view_window.y2 = y2;
-
- //place(x1, y1);
-}
-
-void _clear(char c,char attr,int x1,int y1,int x2,int y2)
-{
- register int i,j;
- unsigned short w = attr;
-
- w <<= 8;
- w |= c;
- for (i = x1; i <= x2; i++) {
- for (j = y1; j <= y2; j++) {
- *((unsigned short *)(uintptr_t)(FB + 2*i+160*j + 2 * active_page * VPAGE_SIZE)) = w;
- }
- }
-
- place(x1,y1);
- curr_y = y1;
- curr_x = x1;
-}
-
-void clear()
-{
- _clear(' ', curr_attr, view_window.x1, view_window.y1, view_window.x2,
- view_window.y2);
-}
-
-void _scroll(char attr, int x1, int y1, int x2, int y2)
-{
- register int x,y;
- unsigned short xattr = attr << 8,w;
- unsigned char *v = (unsigned char *)(uintptr_t)(FB + active_page*(2*VPAGE_SIZE));
-
- for (y = y1+1; y <= y2; y++) {
- for (x = x1; x <= x2; x++) {
- w = *((unsigned short *) (v + 2*(y*80+x)));
- *((unsigned short *)(v + 2*((y-1)*80+x))) = w;
- }
- }
-
- for (x = x1; x <= x2; x++) {
- *((unsigned short *)(v + 2*((y-1)*80+x))) = xattr;
- }
-}
-
-void scroll(void)
-{
- _scroll(curr_attr, view_window.x1, view_window.y1, view_window.x2,
- view_window.y2);
-}
-
-void cputc(char c)
-{
- static unsigned short scan_x, x, y;
- unsigned char *v = (unsigned char *)(uintptr_t)(FB + active_page*(2*VPAGE_SIZE));
- x = curr_x;
- y = curr_y;
-
- switch (c) {
- case '\t':
- x += 8;
- if (x >= view_window.x2+1) {
- x = view_window.x1;
- if (y == view_window.y2) {
- scroll();
- } else {
- y++;
- }
- } else {
- scan_x = 0;
-
- while ((scan_x+8) < x) {
- scan_x += 8;
- }
-
- x = scan_x;
- }
- break;
-
- case '\r':
- x = view_window.x1;
- break;
-
- case '\n':
- if (y == view_window.y2) {
- scroll();
- } else {
- y++;
- }
- break;
-
- case '\b':
- x--;
- *(v + 2*(x + y*80)) = ' ';
- break;
-
- default:
- *(v + 2*(x + y*80)) = c;
- x++;
-
- if (x >= view_window.x2+1) {
- x = view_window.x1;
- if (y == view_window.y2) {
- scroll();
- } else {
- y++;
- }
- }
- }
-
- place(x, y);
-}
-
-void cputs(char *s)
-{
- char c;
- while (*s != '\0') {
- c = *s++;
- cputc(c);
- }
-}
-
-void puts_xy(int x,int y,char attr,char *s)
-{
- unsigned char *v = (unsigned char *)(uintptr_t)(FB + (80*y+x)*2 + active_page*(2*VPAGE_SIZE));
- while (*s != 0) {
- *v = *s;
- s++;
- v++;
- *v = attr;
- v++;
- }
-}
-
-void putc_xy(int x, int y, char attr, char c)
-{
- unsigned char *v = (unsigned char *)(uintptr_t)(FB + (80*y+x)*2 + active_page*(2*VPAGE_SIZE));
- *v = c;
- v++;
- *v = attr;
-}
-
-int printf_xy(int x, int y, char attr, char *fmt, ...)
-{
- char cbuf[200];
- va_list parms;
- int result;
-
- va_start(parms, fmt);
- result = vsprintf(cbuf, fmt, parms);
- va_end(parms);
-
- puts_xy(x, y, attr, cbuf);
-
- return result;
-}