summaryrefslogtreecommitdiff
path: root/kernel/old/cio.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/old/cio.c')
-rw-r--r--kernel/old/cio.c810
1 files changed, 289 insertions, 521 deletions
diff --git a/kernel/old/cio.c b/kernel/old/cio.c
index deb6b76..cfff543 100644
--- a/kernel/old/cio.c
+++ b/kernel/old/cio.c
@@ -30,18 +30,18 @@
/*
** Bit masks for the lower five and eight bits of a value
*/
-#define BMASK5 0x1f
-#define BMASK8 0xff
+#define BMASK5 0x1f
+#define BMASK8 0xff
/*
** Video parameters
*/
-#define SCREEN_MIN_X 0
-#define SCREEN_MIN_Y 0
-#define SCREEN_X_SIZE 80
-#define SCREEN_Y_SIZE 25
-#define SCREEN_MAX_X (SCREEN_X_SIZE - 1)
-#define SCREEN_MAX_Y (SCREEN_Y_SIZE - 1)
+#define SCREEN_MIN_X 0
+#define SCREEN_MIN_Y 0
+#define SCREEN_X_SIZE 80
+#define SCREEN_Y_SIZE 25
+#define SCREEN_MAX_X ( SCREEN_X_SIZE - 1 )
+#define SCREEN_MAX_Y ( SCREEN_Y_SIZE - 1 )
/*
** Video state
@@ -55,56 +55,56 @@ static unsigned int max_x, max_y;
// pointer to input notification function
static void (*notify)(int);
-#ifdef SA_DEBUG
+#ifdef SA_DEBUG
#include <stdio.h>
-#define cio_putchar putchar
-#define cio_puts(x) fputs(x, stdout)
+#define cio_putchar putchar
+#define cio_puts(x) fputs( x, stdout )
#endif
+
/*
** VGA definitions.
*/
// calculate the memory address of a specific character position
// within VGA memory
-#define VIDEO_ADDR(x, y) \
- (unsigned short *)((VID_BASE_ADDR + 2 * ((y) * SCREEN_X_SIZE + (x))) | \
- 0x80000000)
+#define VIDEO_ADDR(x,y) ( unsigned short * ) \
+ ( VID_BASE_ADDR + 2 * ( (y) * SCREEN_X_SIZE + (x) ) )
// port addresses
-#define VGA_CTRL_IX_ADDR 0x3d4
-#define VGA_CTRL_CUR_HIGH 0x0e // cursor location, high byte
-#define VGA_CTRL_CUR_LOW 0x0f // cursor location, low byte
-#define VGA_CTRL_IX_DATA 0x3d5
+#define VGA_CTRL_IX_ADDR 0x3d4
+# define VGA_CTRL_CUR_HIGH 0x0e // cursor location, high byte
+# define VGA_CTRL_CUR_LOW 0x0f // cursor location, low byte
+#define VGA_CTRL_IX_DATA 0x3d5
// attribute bits
-#define VGA_ATT_BBI 0x80 // blink, or background intensity
-#define VGA_ATT_BGC 0x70 // background color
-#define VGA_ATT_FICS 0x80 // foreground intensity or char font select
-#define VGA_ATT_FGC 0x70 // foreground color
+#define VGA_ATT_BBI 0x80 // blink, or background intensity
+#define VGA_ATT_BGC 0x70 // background color
+#define VGA_ATT_FICS 0x80 // foreground intensity or char font select
+#define VGA_ATT_FGC 0x70 // foreground color
// color selections
-#define VGA_BG_BLACK 0x0000 // background colors
-#define VGA_BG_BLUE 0x1000
-#define VGA_BG_GREEN 0x2000
-#define VGA_BG_CYAN 0x3000
-#define VGA_BG_RED 0x4000
-#define VGA_BG_MAGENTA 0x5000
-#define VGA_BG_BROWN 0x6000
-#define VGA_BG_WHITE 0x7000
+#define VGA_BG_BLACK 0x0000 // background colors
+#define VGA_BG_BLUE 0x1000
+#define VGA_BG_GREEN 0x2000
+#define VGA_BG_CYAN 0x3000
+#define VGA_BG_RED 0x4000
+#define VGA_BG_MAGENTA 0x5000
+#define VGA_BG_BROWN 0x6000
+#define VGA_BG_WHITE 0x7000
-#define VGA_FG_BLACK 0x0000 // foreground colors
-#define VGA_FG_BLUE 0x0100
-#define VGA_FG_GREEN 0x0200
-#define VGA_FG_CYAN 0x0300
-#define VGA_FG_RED 0x0400
-#define VGA_FG_MAGENTA 0x0500
-#define VGA_FG_BROWN 0x0600
-#define VGA_FG_WHITE 0x0700
+#define VGA_FG_BLACK 0x0000 // foreground colors
+#define VGA_FG_BLUE 0x0100
+#define VGA_FG_GREEN 0x0200
+#define VGA_FG_CYAN 0x0300
+#define VGA_FG_RED 0x0400
+#define VGA_FG_MAGENTA 0x0500
+#define VGA_FG_BROWN 0x0600
+#define VGA_FG_WHITE 0x0700
// color combinations
-#define VGA_WHITE_ON_BLACK (VGA_FG_WHITE | VGA_BG_BLACK)
-#define VGA_BLACK_ON_WHITE (VGA_FG_BLACK | VGA_BG_WHITE)
+#define VGA_WHITE_ON_BLACK (VGA_FG_WHITE | VGA_BG_BLACK)
+#define VGA_BLACK_ON_WHITE (VGA_FG_BLACK | VGA_BG_WHITE)
/*
** Internal support routines.
@@ -113,40 +113,38 @@ static void (*notify)(int);
/*
** setcursor: set the cursor location (screen coordinates)
*/
-static void setcursor(void)
-{
+static void setcursor( void ) {
unsigned addr;
unsigned int y = curr_y;
- if (y > scroll_max_y) {
+ if( y > scroll_max_y ) {
y = scroll_max_y;
}
- addr = (unsigned)(y * SCREEN_X_SIZE + curr_x);
+ addr = (unsigned)( y * SCREEN_X_SIZE + curr_x );
- outb(VGA_CTRL_IX_ADDR, VGA_CTRL_CUR_HIGH);
- outb(VGA_CTRL_IX_DATA, (addr >> 8) & BMASK8);
- outb(VGA_CTRL_IX_ADDR, VGA_CTRL_CUR_LOW);
- outb(VGA_CTRL_IX_DATA, addr & BMASK8);
+ outb( VGA_CTRL_IX_ADDR, VGA_CTRL_CUR_HIGH );
+ outb( VGA_CTRL_IX_DATA, ( addr >> 8 ) & BMASK8 );
+ outb( VGA_CTRL_IX_ADDR, VGA_CTRL_CUR_LOW );
+ outb( VGA_CTRL_IX_DATA, addr & BMASK8 );
}
/*
** putchar_at: physical output to the video memory
*/
-static void putchar_at(unsigned int x, unsigned int y, unsigned int c)
-{
+static void putchar_at( unsigned int x, unsigned int y, unsigned int c ) {
/*
** If x or y is too big or small, don't do any output.
*/
- if (x <= max_x && y <= max_y) {
- unsigned short *addr = VIDEO_ADDR(x, y);
+ if( x <= max_x && y <= max_y ) {
+ unsigned short *addr = VIDEO_ADDR( x, y );
/*
** The character may have attributes associated with it; if
** so, use those, otherwise use white on black.
*/
- c &= 0xffff; // keep only the lower bytes
- if (c > BMASK8) {
+ c &= 0xffff; // keep only the lower bytes
+ if( c > BMASK8 ) {
*addr = (unsigned short)c;
} else {
*addr = (unsigned short)c | VGA_WHITE_ON_BLACK;
@@ -161,13 +159,12 @@ static void putchar_at(unsigned int x, unsigned int y, unsigned int c)
/*
** Set the scrolling region
*/
-void cio_setscroll(unsigned int s_min_x, unsigned int s_min_y,
- unsigned int s_max_x, unsigned int s_max_y)
-{
- scroll_min_x = bound(min_x, s_min_x, max_x);
- scroll_min_y = bound(min_y, s_min_y, max_y);
- scroll_max_x = bound(scroll_min_x, s_max_x, max_x);
- scroll_max_y = bound(scroll_min_y, s_max_y, max_y);
+void cio_setscroll( unsigned int s_min_x, unsigned int s_min_y,
+ unsigned int s_max_x, unsigned int s_max_y ) {
+ scroll_min_x = bound( min_x, s_min_x, max_x );
+ scroll_min_y = bound( min_y, s_min_y, max_y );
+ scroll_max_x = bound( scroll_min_x, s_max_x, max_x );
+ scroll_max_y = bound( scroll_min_y, s_max_y, max_y );
curr_x = scroll_min_x;
curr_y = scroll_min_y;
setcursor();
@@ -176,19 +173,17 @@ void cio_setscroll(unsigned int s_min_x, unsigned int s_min_y,
/*
** Cursor movement in the scroll region
*/
-void cio_moveto(unsigned int x, unsigned int y)
-{
- curr_x = bound(scroll_min_x, x + scroll_min_x, scroll_max_x);
- curr_y = bound(scroll_min_y, y + scroll_min_y, scroll_max_y);
+void cio_moveto( unsigned int x, unsigned int y ) {
+ curr_x = bound( scroll_min_x, x + scroll_min_x, scroll_max_x );
+ curr_y = bound( scroll_min_y, y + scroll_min_y, scroll_max_y );
setcursor();
}
/*
** The putchar family
*/
-void cio_putchar_at(unsigned int x, unsigned int y, unsigned int c)
-{
- if ((c & 0x7f) == '\n') {
+void cio_putchar_at( unsigned int x, unsigned int y, unsigned int c ) {
+ if( ( c & 0x7f ) == '\n' ) {
unsigned int limit;
/*
@@ -196,41 +191,43 @@ void cio_putchar_at(unsigned int x, unsigned int y, unsigned int c)
** leave it. If we're not in the scroll region, don't
** let this loop enter it.
*/
- if (x > scroll_max_x) {
+ if( x > scroll_max_x ) {
limit = max_x;
- } else if (x >= scroll_min_x) {
+ }
+ else if( x >= scroll_min_x ) {
limit = scroll_max_x;
- } else {
+ }
+ else {
limit = scroll_min_x - 1;
}
- while (x <= limit) {
- putchar_at(x, y, ' ');
+ while( x <= limit ) {
+ putchar_at( x, y, ' ' );
x += 1;
}
- } else {
- putchar_at(x, y, c);
+ }
+ else {
+ putchar_at( x, y, c );
}
}
#ifndef SA_DEBUG
-void cio_putchar(unsigned int c)
-{
+void cio_putchar( unsigned int c ) {
/*
** If we're off the bottom of the screen, scroll the window.
*/
- if (curr_y > scroll_max_y) {
- cio_scroll(curr_y - scroll_max_y);
+ if( curr_y > scroll_max_y ) {
+ cio_scroll( curr_y - scroll_max_y );
curr_y = scroll_max_y;
}
- switch (c & BMASK8) {
+ switch( c & BMASK8 ) {
case '\n':
/*
** Erase to the end of the line, then move to new line
** (actual scroll is delayed until next output appears).
*/
- while (curr_x <= scroll_max_x) {
- putchar_at(curr_x, curr_y, ' ');
+ while( curr_x <= scroll_max_x ) {
+ putchar_at( curr_x, curr_y, ' ' );
curr_x += 1;
}
curr_x = scroll_min_x;
@@ -242,9 +239,9 @@ void cio_putchar(unsigned int c)
break;
default:
- putchar_at(curr_x, curr_y, c);
+ putchar_at( curr_x, curr_y, c );
curr_x += 1;
- if (curr_x > scroll_max_x) {
+ if( curr_x > scroll_max_x ) {
curr_x = scroll_min_x;
curr_y += 1;
}
@@ -257,23 +254,21 @@ void cio_putchar(unsigned int c)
/*
** The puts family
*/
-void cio_puts_at(unsigned int x, unsigned int y, const char *str)
-{
+void cio_puts_at( unsigned int x, unsigned int y, const char *str ) {
unsigned int ch;
- while ((ch = *str++) != '\0' && x <= max_x) {
- cio_putchar_at(x, y, ch);
+ while( (ch = *str++) != '\0' && x <= max_x ) {
+ cio_putchar_at( x, y, ch );
x += 1;
}
}
#ifndef SA_DEBUG
-void cio_puts(const char *str)
-{
+void cio_puts( const char *str ) {
unsigned int ch;
- while ((ch = *str++) != '\0') {
- cio_putchar(ch);
+ while( (ch = *str++) != '\0' ) {
+ cio_putchar( ch );
}
}
#endif
@@ -281,41 +276,38 @@ void cio_puts(const char *str)
/*
** Write a "sized" buffer (like cio_puts(), but no NUL)
*/
-void cio_write(const char *buf, int length)
-{
- for (int i = 0; i < length; ++i) {
- cio_putchar(buf[i]);
+void cio_write( const char *buf, int length ) {
+ for( int i = 0; i < length; ++i ) {
+ cio_putchar( buf[i] );
}
}
-void cio_clearscroll(void)
-{
+void cio_clearscroll( void ) {
unsigned int nchars = scroll_max_x - scroll_min_x + 1;
unsigned int l;
unsigned int c;
- for (l = scroll_min_y; l <= scroll_max_y; l += 1) {
- unsigned short *to = VIDEO_ADDR(scroll_min_x, l);
+ for( l = scroll_min_y; l <= scroll_max_y; l += 1 ) {
+ unsigned short *to = VIDEO_ADDR( scroll_min_x, l );
- for (c = 0; c < nchars; c += 1) {
+ for( c = 0; c < nchars; c += 1 ) {
*to++ = ' ' | 0x0700;
}
}
}
-void cio_clearscreen(void)
-{
- unsigned short *to = VIDEO_ADDR(min_x, min_y);
- unsigned int nchars = (max_y - min_y + 1) * (max_x - min_x + 1);
+void cio_clearscreen( void ) {
+ unsigned short *to = VIDEO_ADDR( min_x, min_y );
+ unsigned int nchars = ( max_y - min_y + 1 ) * ( max_x - min_x + 1 );
- while (nchars > 0) {
+ while( nchars > 0 ) {
*to++ = ' ' | 0x0700;
nchars -= 1;
}
}
-void cio_scroll(unsigned int lines)
-{
+
+void cio_scroll( unsigned int lines ) {
unsigned short *from;
unsigned short *to;
int nchars = scroll_max_x - scroll_min_x + 1;
@@ -324,7 +316,7 @@ void cio_scroll(unsigned int lines)
/*
** If # of lines is the whole scrolling region or more, just clear.
*/
- if (lines > scroll_max_y - scroll_min_y) {
+ if( lines > scroll_max_y - scroll_min_y ) {
cio_clearscroll();
curr_x = scroll_min_x;
curr_y = scroll_min_y;
@@ -335,84 +327,85 @@ void cio_scroll(unsigned int lines)
/*
** Must copy it line by line.
*/
- for (line = scroll_min_y; line <= scroll_max_y - lines; line += 1) {
- from = VIDEO_ADDR(scroll_min_x, line + lines);
- to = VIDEO_ADDR(scroll_min_x, line);
- for (c = 0; c < nchars; c += 1) {
+ for( line = scroll_min_y; line <= scroll_max_y - lines; line += 1 ) {
+ from = VIDEO_ADDR( scroll_min_x, line + lines );
+ to = VIDEO_ADDR( scroll_min_x, line );
+ for( c = 0; c < nchars; c += 1 ) {
*to++ = *from++;
}
}
- for (; line <= scroll_max_y; line += 1) {
- to = VIDEO_ADDR(scroll_min_x, line);
- for (c = 0; c < nchars; c += 1) {
+ for( ; line <= scroll_max_y; line += 1 ) {
+ to = VIDEO_ADDR( scroll_min_x, line );
+ for( c = 0; c < nchars; c += 1 ) {
*to++ = ' ' | 0x0700;
}
}
}
-static int mypad(int x, int y, int extra, int padchar)
-{
- while (extra > 0) {
- if (x != -1 || y != -1) {
- cio_putchar_at(x, y, padchar);
+static int mypad( int x, int y, int extra, int padchar ) {
+ while( extra > 0 ) {
+ if( x != -1 || y != -1 ) {
+ cio_putchar_at( x, y, padchar );
x += 1;
- } else {
- cio_putchar(padchar);
+ }
+ else {
+ cio_putchar( padchar );
}
extra -= 1;
}
return x;
}
-static int mypadstr(int x, int y, char *str, int len, int width, int leftadjust,
- int padchar)
-{
+static int mypadstr( int x, int y, char *str, int len, int width,
+ int leftadjust, int padchar ) {
int extra;
- if (len < 0) {
- len = strlen(str);
+ if( len < 0 ) {
+ len = strlen( str );
}
extra = width - len;
- if (extra > 0 && !leftadjust) {
- x = mypad(x, y, extra, padchar);
+ if( extra > 0 && !leftadjust ) {
+ x = mypad( x, y, extra, padchar );
}
- if (x != -1 || y != -1) {
- cio_puts_at(x, y, str);
+ if( x != -1 || y != -1 ) {
+ cio_puts_at( x, y, str );
x += len;
- } else {
- cio_puts(str);
}
- if (extra > 0 && leftadjust) {
- x = mypad(x, y, extra, padchar);
+ else {
+ cio_puts( str );
+ }
+ if( extra > 0 && leftadjust ) {
+ x = mypad( x, y, extra, padchar );
}
return x;
}
-static void do_printf(int x, int y, char **f)
-{
+static void do_printf( int x, int y, char **f ) {
char *fmt = *f;
- int *ap;
- char buf[12];
+ int *ap;
+ char buf[ 12 ];
char ch;
char *str;
- int leftadjust;
- int width;
- int len;
- int padchar;
+ int leftadjust;
+ int width;
+ int len;
+ int padchar;
/*
** Get characters from the format string and process them
*/
- ap = (int *)(f + 1);
+ ap = (int *)( f + 1 );
+
+ while( (ch = *fmt++) != '\0' ) {
- while ((ch = *fmt++) != '\0') {
/*
** Is it the start of a format code?
*/
- if (ch == '%') {
+ if( ch == '%' ) {
+
/*
** Yes, get the padding and width options (if there).
** Alignment must come at the beginning, then fill,
@@ -425,17 +418,17 @@ static void do_printf(int x, int y, char **f)
ch = *fmt++;
- if (ch == '-') {
+ if( ch == '-' ) {
leftadjust = 1;
ch = *fmt++;
}
- if (ch == '0') {
+ if( ch == '0' ) {
padchar = '0';
ch = *fmt++;
}
- while (ch >= '0' && ch <= '9') {
+ while( ch >= '0' && ch <= '9' ) {
width *= 10;
width += ch - '0';
ch = *fmt++;
@@ -444,52 +437,55 @@ static void do_printf(int x, int y, char **f)
/*
** What data type do we have?
*/
- switch (ch) {
+ switch( ch ) {
+
case 'c':
// ch = *( (int *)ap )++;
ch = *ap++;
- buf[0] = ch;
- buf[1] = '\0';
- x = mypadstr(x, y, buf, 1, width, leftadjust, padchar);
+ buf[ 0 ] = ch;
+ buf[ 1 ] = '\0';
+ x = mypadstr( x, y, buf, 1, width, leftadjust, padchar );
break;
case 'd':
// len = cvtdec( buf, *( (int *)ap )++ );
- len = cvtdec(buf, *ap++);
- x = mypadstr(x, y, buf, len, width, leftadjust, padchar);
+ len = cvtdec( buf, *ap++ );
+ x = mypadstr( x, y, buf, len, width, leftadjust, padchar );
break;
case 's':
// str = *( (char **)ap )++;
- str = (char *)(*ap++);
- x = mypadstr(x, y, str, -1, width, leftadjust, padchar);
+ str = (char *) (*ap++);
+ x = mypadstr( x, y, str, -1, width, leftadjust, padchar );
break;
case 'x':
// len = cvthex( buf, *( (int *)ap )++ );
- len = cvthex(buf, *ap++);
- x = mypadstr(x, y, buf, len, width, leftadjust, padchar);
+ len = cvthex( buf, *ap++ );
+ x = mypadstr( x, y, buf, len, width, leftadjust, padchar );
break;
case 'o':
// len = cvtoct( buf, *( (int *)ap )++ );
- len = cvtoct(buf, *ap++);
- x = mypadstr(x, y, buf, len, width, leftadjust, padchar);
+ len = cvtoct( buf, *ap++ );
+ x = mypadstr( x, y, buf, len, width, leftadjust, padchar );
break;
case 'u':
- len = cvtuns(buf, *ap++);
- x = mypadstr(x, y, buf, len, width, leftadjust, padchar);
+ len = cvtuns( buf, *ap++ );
+ x = mypadstr( x, y, buf, len, width, leftadjust, padchar );
break;
+
}
} else {
+
/*
** No - just print it normally.
*/
- if (x != -1 || y != -1) {
- cio_putchar_at(x, y, ch);
- switch (ch) {
+ if( x != -1 || y != -1 ) {
+ cio_putchar_at( x, y, ch );
+ switch( ch ) {
case '\n':
y += 1;
/* FALL THRU */
@@ -501,352 +497,129 @@ static void do_printf(int x, int y, char **f)
default:
x += 1;
}
- } else {
- cio_putchar(ch);
+ }
+ else {
+ cio_putchar( ch );
}
}
}
}
-void cio_printf_at(unsigned int x, unsigned int y, char *fmt, ...)
-{
- do_printf(x, y, &fmt);
+void cio_printf_at( unsigned int x, unsigned int y, char *fmt, ... ) {
+ do_printf( x, y, &fmt );
}
-void cio_printf(char *fmt, ...)
-{
- do_printf(-1, -1, &fmt);
+void cio_printf( char *fmt, ... ) {
+ do_printf( -1, -1, &fmt );
}
/*
** These are the "standard" IBM AT "Set 1" keycodes.
*/
-static unsigned char scan_code[2][128] = { { // unshifted characters
- /* 00-07 */ '\377',
- '\033',
- '1',
- '2',
- '3',
- '4',
- '5',
- '6',
- /* 08-0f */ '7',
- '8',
- '9',
- '0',
- '-',
- '=',
- '\b',
- '\t',
- /* 10-17 */ 'q',
- 'w',
- 'e',
- 'r',
- 't',
- 'y',
- 'u',
- 'i',
- /* 18-1f */ 'o',
- 'p',
- '[',
- ']',
- '\n',
- '\377',
- 'a',
- 's',
- /* 20-27 */ 'd',
- 'f',
- 'g',
- 'h',
- 'j',
- 'k',
- 'l',
- ';',
- /* 28-2f */ '\'',
- '`',
- '\377',
- '\\',
- 'z',
- 'x',
- 'c',
- 'v',
- /* 30-37 */ 'b',
- 'n',
- 'm',
- ',',
- '.',
- '/',
- '\377',
- '*',
- /* 38-3f */ '\377',
- ' ',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 40-47 */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '7',
- /* 48-4f */ '8',
- '9',
- '-',
- '4',
- '5',
- '6',
- '+',
- '1',
- /* 50-57 */ '2',
- '3',
- '0',
- '.',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 58-5f */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 60-67 */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 68-6f */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 70-77 */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 78-7f */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377' },
+static unsigned char scan_code[ 2 ][ 128 ] = {
+ { // unshifted characters
+/* 00-07 */ '\377', '\033', '1', '2', '3', '4', '5', '6',
+/* 08-0f */ '7', '8', '9', '0', '-', '=', '\b', '\t',
+/* 10-17 */ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
+/* 18-1f */ 'o', 'p', '[', ']', '\n', '\377', 'a', 's',
+/* 20-27 */ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
+/* 28-2f */ '\'', '`', '\377', '\\', 'z', 'x', 'c', 'v',
+/* 30-37 */ 'b', 'n', 'm', ',', '.', '/', '\377', '*',
+/* 38-3f */ '\377', ' ', '\377', '\377', '\377', '\377', '\377', '\377',
+/* 40-47 */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '7',
+/* 48-4f */ '8', '9', '-', '4', '5', '6', '+', '1',
+/* 50-57 */ '2', '3', '0', '.', '\377', '\377', '\377', '\377',
+/* 58-5f */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '\377',
+/* 60-67 */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '\377',
+/* 68-6f */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '\377',
+/* 70-77 */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '\377',
+/* 78-7f */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '\377'
+ },
- { // shifted characters
- /* 00-07 */ '\377',
- '\033',
- '!',
- '@',
- '#',
- '$',
- '%',
- '^',
- /* 08-0f */ '&',
- '*',
- '(',
- ')',
- '_',
- '+',
- '\b',
- '\t',
- /* 10-17 */ 'Q',
- 'W',
- 'E',
- 'R',
- 'T',
- 'Y',
- 'U',
- 'I',
- /* 18-1f */ 'O',
- 'P',
- '{',
- '}',
- '\n',
- '\377',
- 'A',
- 'S',
- /* 20-27 */ 'D',
- 'F',
- 'G',
- 'H',
- 'J',
- 'K',
- 'L',
- ':',
- /* 28-2f */ '"',
- '~',
- '\377',
- '|',
- 'Z',
- 'X',
- 'C',
- 'V',
- /* 30-37 */ 'B',
- 'N',
- 'M',
- '<',
- '>',
- '?',
- '\377',
- '*',
- /* 38-3f */ '\377',
- ' ',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 40-47 */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '7',
- /* 48-4f */ '8',
- '9',
- '-',
- '4',
- '5',
- '6',
- '+',
- '1',
- /* 50-57 */ '2',
- '3',
- '0',
- '.',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 58-5f */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 60-67 */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 68-6f */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 70-77 */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- /* 78-7f */ '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377',
- '\377' } };
+ { // shifted characters
+/* 00-07 */ '\377', '\033', '!', '@', '#', '$', '%', '^',
+/* 08-0f */ '&', '*', '(', ')', '_', '+', '\b', '\t',
+/* 10-17 */ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
+/* 18-1f */ 'O', 'P', '{', '}', '\n', '\377', 'A', 'S',
+/* 20-27 */ 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
+/* 28-2f */ '"', '~', '\377', '|', 'Z', 'X', 'C', 'V',
+/* 30-37 */ 'B', 'N', 'M', '<', '>', '?', '\377', '*',
+/* 38-3f */ '\377', ' ', '\377', '\377', '\377', '\377', '\377', '\377',
+/* 40-47 */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '7',
+/* 48-4f */ '8', '9', '-', '4', '5', '6', '+', '1',
+/* 50-57 */ '2', '3', '0', '.', '\377', '\377', '\377', '\377',
+/* 58-5f */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '\377',
+/* 60-67 */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '\377',
+/* 68-6f */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '\377',
+/* 70-77 */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '\377',
+/* 78-7f */ '\377', '\377', '\377', '\377', '\377', '\377', '\377', '\377'
+ }
+};
/*
** Scan code masks
*/
// 'release' bit
-#define REL_BIT 0x80
-#define CODE_BITS 0x7f
+#define REL_BIT 0x80
+#define CODE_BITS 0x7f
-#define IS_PRESS(c) (((c) & REL_BIT) == 0)
-#define IS_RELEASE(c) (((c) & REL_BIT) != 0)
+#define IS_PRESS(c) (((c) & REL_BIT) == 0)
+#define IS_RELEASE(c) (((c) & REL_BIT) != 0)
/*
** Scan codes for some special characters
*/
// escape code - followed by another code byte
-#define SCAN_ESC 0xe0
+#define SCAN_ESC 0xe0
// shift keys: press, release
-#define L_SHIFT_DN 0x2a
-#define R_SHIFT_DN 0x36
-#define L_SHIFT_UP 0xaa
-#define R_SHIFT_UP 0xb6
+#define L_SHIFT_DN 0x2a
+#define R_SHIFT_DN 0x36
+#define L_SHIFT_UP 0xaa
+#define R_SHIFT_UP 0xb6
// control keys
-#define L_CTRL_DN 0x1d
-#define L_CTRL_UP 0x9d
+#define L_CTRL_DN 0x1d
+#define L_CTRL_UP 0x9d
/*
** I/O communication constants
*/
-#define KBD_DATA 0x60
-#define KBD_STATUS 0x64
-#define READY 0x1
+#define KBD_DATA 0x60
+#define KBD_STATUS 0x64
+#define READY 0x1
/*
** Circular buffer for input characters. Characters are inserted at
** next_space, and are removed at next_char. Buffer is empty if
** these are equal.
*/
-#define C_BUFSIZE 200
+#define C_BUFSIZE 200
-static char input_buffer[C_BUFSIZE];
+static char input_buffer[ C_BUFSIZE ];
static volatile char *next_char = input_buffer;
static volatile char *next_space = input_buffer;
-static volatile char *increment(volatile char *pointer)
-{
- if (++pointer >= input_buffer + C_BUFSIZE) {
+static volatile char *increment( volatile char *pointer ) {
+ if( ++pointer >= input_buffer + C_BUFSIZE ) {
pointer = input_buffer;
}
return pointer;
}
-static int input_scan_code(int code)
-{
- static int shift = 0;
- static int ctrl_mask = BMASK8;
+static int input_scan_code( int code ) {
+ static int shift = 0;
+ static int ctrl_mask = BMASK8;
int rval = -1;
/*
** Do the shift processing
*/
code &= BMASK8;
- switch (code) {
+ switch( code ) {
case L_SHIFT_DN:
case R_SHIFT_DN:
shift = 1;
@@ -870,76 +643,74 @@ static int input_scan_code(int code)
** Process ordinary characters only on the press (to handle
** autorepeat). Ignore undefined scan codes.
*/
- if (IS_PRESS(code)) {
- code = scan_code[shift][(int)code];
- if (code != '\377') {
- volatile char *next = increment(next_space);
+ if( IS_PRESS(code) ) {
+ code = scan_code[ shift ][ (int)code ];
+ if( code != '\377' ) {
+ volatile char *next = increment( next_space );
/*
** Store character only if there's room
*/
rval = code & ctrl_mask;
- if (next != next_char) {
+ if( next != next_char ) {
*next_space = code & ctrl_mask;
next_space = next;
}
}
}
}
- return (rval);
+ return( rval );
}
-static void keyboard_isr(int vector, int code)
-{
- int data = inb(KBD_DATA);
- int val = input_scan_code(data);
+static void keyboard_isr( int vector, int code ) {
+
+ int data = inb( KBD_DATA );
+ int val = input_scan_code( data );
// if there is a notification function, call it
- if (val != -1 && notify)
- notify(val);
+ if( val != -1 && notify )
+ notify( val );
- outb(PIC1_CMD, PIC_EOI);
+ outb( PIC1_CMD, PIC_EOI );
}
-int cio_getchar(void)
-{
- char c;
+int cio_getchar( void ) {
+ char c;
int interrupts_enabled = r_eflags() & EFL_IF;
- while (next_char == next_space) {
- if (!interrupts_enabled) {
+ while( next_char == next_space ) {
+ if( !interrupts_enabled ) {
/*
** Must read the next keystroke ourselves.
*/
- while ((inb(KBD_STATUS) & READY) == 0) {
+ while( ( inb( KBD_STATUS ) & READY ) == 0 ) {
;
}
- (void)input_scan_code(inb(KBD_DATA));
+ (void) input_scan_code( inb( KBD_DATA ) );
}
}
c = *next_char & BMASK8;
- next_char = increment(next_char);
- if (c != EOT) {
- cio_putchar(c);
+ next_char = increment( next_char );
+ if( c != EOT ) {
+ cio_putchar( c );
}
return c;
}
-int cio_gets(char *buffer, unsigned int size)
-{
- char ch;
+int cio_gets( char *buffer, unsigned int size ) {
+ char ch;
int count = 0;
- while (size > 1) {
+ while( size > 1 ) {
ch = cio_getchar();
- if (ch == EOT) {
+ if( ch == EOT ) {
break;
}
*buffer++ = ch;
count += 1;
size -= 1;
- if (ch == '\n') {
+ if( ch == '\n' ) {
break;
}
}
@@ -947,11 +718,10 @@ int cio_gets(char *buffer, unsigned int size)
return count;
}
-int cio_input_queue(void)
-{
+int cio_input_queue( void ) {
int n_chars = next_space - next_char;
- if (n_chars < 0) {
+ if( n_chars < 0 ) {
n_chars += C_BUFSIZE;
}
return n_chars;
@@ -960,15 +730,14 @@ int cio_input_queue(void)
/*
** Initialization routines
*/
-void cio_init(void (*fcn)(int))
-{
+void cio_init( void (*fcn)(int) ) {
/*
** Screen dimensions
*/
- min_x = SCREEN_MIN_X;
- min_y = SCREEN_MIN_Y;
- max_x = SCREEN_MAX_X;
- max_y = SCREEN_MAX_Y;
+ min_x = SCREEN_MIN_X;
+ min_y = SCREEN_MIN_Y;
+ max_x = SCREEN_MAX_X;
+ max_y = SCREEN_MAX_Y;
/*
** Scrolling region
@@ -993,35 +762,34 @@ void cio_init(void (*fcn)(int))
/*
** Set up the interrupt handler for the keyboard
*/
- install_isr(VEC_KBD, keyboard_isr);
+ install_isr( VEC_KBD, keyboard_isr );
}
#ifdef SA_DEBUG
-int main()
-{
- cio_printf("%d\n", 123);
- cio_printf("%d\n", -123);
- cio_printf("%d\n", 0x7fffffff);
- cio_printf("%d\n", 0x80000001);
- cio_printf("%d\n", 0x80000000);
- cio_printf("x%14dy\n", 0x80000000);
- cio_printf("x%-14dy\n", 0x80000000);
- cio_printf("x%014dy\n", 0x80000000);
- cio_printf("x%-014dy\n", 0x80000000);
- cio_printf("%s\n", "xyz");
- cio_printf("|%10s|\n", "xyz");
- cio_printf("|%-10s|\n", "xyz");
- cio_printf("%c\n", 'x');
- cio_printf("|%4c|\n", 'y');
- cio_printf("|%-4c|\n", 'y');
- cio_printf("|%04c|\n", 'y');
- cio_printf("|%-04c|\n", 'y');
- cio_printf("|%3d|\n", 5);
- cio_printf("|%3d|\n", 54321);
- cio_printf("%x\n", 0x123abc);
- cio_printf("|%04x|\n", 20);
- cio_printf("|%012x|\n", 0xfedcba98);
- cio_printf("|%-012x|\n", 0x76543210);
+int main() {
+ cio_printf( "%d\n", 123 );
+ cio_printf( "%d\n", -123 );
+ cio_printf( "%d\n", 0x7fffffff );
+ cio_printf( "%d\n", 0x80000001 );
+ cio_printf( "%d\n", 0x80000000 );
+ cio_printf( "x%14dy\n", 0x80000000 );
+ cio_printf( "x%-14dy\n", 0x80000000 );
+ cio_printf( "x%014dy\n", 0x80000000 );
+ cio_printf( "x%-014dy\n", 0x80000000 );
+ cio_printf( "%s\n", "xyz" );
+ cio_printf( "|%10s|\n", "xyz" );
+ cio_printf( "|%-10s|\n", "xyz" );
+ cio_printf( "%c\n", 'x' );
+ cio_printf( "|%4c|\n", 'y' );
+ cio_printf( "|%-4c|\n", 'y' );
+ cio_printf( "|%04c|\n", 'y' );
+ cio_printf( "|%-04c|\n", 'y' );
+ cio_printf( "|%3d|\n", 5 );
+ cio_printf( "|%3d|\n", 54321 );
+ cio_printf( "%x\n", 0x123abc );
+ cio_printf( "|%04x|\n", 20 );
+ cio_printf( "|%012x|\n", 0xfedcba98 );
+ cio_printf( "|%-012x|\n", 0x76543210 );
}
int curr_x, curr_y, max_x, max_y;