Import backup from 2004-08-15

This commit is contained in:
josh committed 2017-07-25 22:23:48 -04:00
1 parent b9c77827bd
commit 8a8f56decb
16 files changed
+539 -251

No files matched your search

-207
View File
@@ -1,207 +0,0 @@
// console.c
// Author: Josh Holtrop
// Date: 08/02/04
// Modified: 08/03/04
#include "char/console.h"
#include "hos_defines.h"
#include "fs/devices.h"
#include "mm/vmm.h"
#include "lang/asmfuncs.h"
console_t *consoles[256];
int activeConsole;
void console_put_char(minor_t id, int c);
void console_write_cursor(minor_t id, u16_t position);
void console_refresh();
// initialization routine for consoles module
int console_init(u32_t num, int width, int height)
{
activeConsole = 0;
dev_driver_t *console_driver = New(dev_driver_t);
console_driver->char_write = console_char_write;
devices_register_major('c', MAJOR_CONSOLE, console_driver);
kfree(console_driver);
for (; num > 1; num--)
{
if (( consoles[num] = New(console_t) ))
{
if (( consoles[num]->buffer = kmalloc(width * height) ))
{
consoles[num]->width = width;
consoles[num]->height = height;
consoles[num]->attribute = consoles[num]->foreground = 0x07;
memsetw(consoles[num]->buffer, 0x0720, width * height);
}
else
{
kfree(consoles[num]);
return -2;
}
}
else
return -1;
}
return 0;
}
int console_activate(int num)
{
if (consoles[num])
{
activeConsole = num;
memcpyw((void*)CONSOLE_MEMORY, consoles[num]->buffer, consoles[num]->width * consoles[num]->height);
writeCursorPosition(consoles[num]->cursorPosition);
}
return -1;
}
int console_char_write(minor_t id, u64_t position, int c)
{
if (!consoles[id])
return -1;
int cursorY = consoles[id]->cursorPosition / consoles[id]->width;
int cursorX = consoles[id]->cursorPosition % consoles[id]->width;
switch (consoles[id]->escapeLevel)
{
case 2:
if (c >= '0' && c <= '9') // c is part of an escape value
{
consoles[id]->escapeValue[consoles[id]->escapePosition] *= 10;
consoles[id]->escapeValue[consoles[id]->escapePosition] += c - '0';
return 0;
}
else if (c == ';')
{
if (consoles[id]->escapePosition < 7)
consoles[id]->escapePosition++;
return 0;
}
switch (c)
{
case 'A': // move cursor up n rows
cursorY -= consoles[id]->escapeValue[0];
if (cursorY < 0)
cursorY = 0;
console_write_cursor(id, cursorY * consoles[id]->width + cursorX);
break;
case 'B': // move cursor down n rows
cursorY += consoles[id]->escapeValue[0];
if (cursorY >= consoles[id]->height)
cursorY = consoles[id]->height - 1;
console_write_cursor(id, cursorY * consoles[id]->width + cursorX);
break;
case 'C': // move cursor right n columns
cursorX -= consoles[id]->escapeValue[0];
if (cursorX < 0)
cursorX = 0;
console_write_cursor(id, cursorY * consoles[id]->width + cursorX);
break;
case 'D': // move cursor left n columns
cursorX += consoles[id]->escapeValue[0];
if (cursorX >= consoles[id]->width)
cursorX = consoles[id]->width - 1;
console_write_cursor(id, cursorY * consoles[id]->width + cursorX);
break;
case 'H':
case 'f': // move cursor to position (x,y) upper left is (1,1)
cursorX = consoles[id]->escapeValue[0] - 1;
cursorY = consoles[id]->escapeValue[1] - 1;
if (cursorY < 0)
cursorY = 0;
if (cursorY >= consoles[id]->height)
cursorY = consoles[id]->height - 1;
if (cursorX < 0)
cursorX = 0;
if (cursorX >= consoles[id]->width)
cursorX = consoles[id]->width - 1;
console_write_cursor(id, 0);
break;
case 'J': // clear screen, home cursor
memsetw(consoles[id]->buffer, 0x0720, consoles[id]->width * consoles[id]->height);
console_refresh();
console_write_cursor(id, 0);
break;
case 'K': // erase line from cursor position (including char. under cursor) to end of line
memsetw(consoles[id]->buffer + consoles[id]->cursorPosition, 0x0720, consoles[id]->width - cursorX);
console_refresh();
break;
case 's': // push cursor position on an internal stack
if (consoles[id]->cursorStackPosition < 16)
consoles[id]->cursorStack[consoles[id]->cursorStackPosition++] = consoles[id]->cursorPosition;
break;
case 'u': // pop cursor position from stack
if (consoles[id]->cursorStackPosition > 0)
consoles[id]->cursorPosition = consoles[id]->cursorStack[--consoles[id]->cursorStackPosition];
break;
case 'm': // set text attributes
for (; consoles[id]->escapePosition >= 0; consoles[id]->escapePosition--)
{
switch (consoles[id]->escapeValue[consoles[id]->escapePosition])
{
case 0:
consoles[id]->attribute = 0x07;
break;
case 1:
consoles[id]->attribute |= 0x08;
break;
case 5:
consoles[id]->attribute |= 0x80;
case 7:
case 30:
}
}
break;
}
memsetd(consoles[id]->escapeValue, 0, 8);
consoles[id]->escapePosition = 0;
consoles[id]->escapeLevel = 0;
return 0;
case 1:
if (c == '[')
consoles[id]->escapeLevel = 2;
break;
consoles[id]->escapeLevel = 0;
return 0; // invalid escape sequence
default:
if (c == '\e')
{
consoles[id]->escapeLevel = 1;
return 0;
}
console_put_char(id, c);
}
return 0;
}
void console_put_char(minor_t id, int c)
{
}
void console_write_cursor(minor_t id, u16_t position)
{
consoles[id]->cursorPosition = position;
if (activeConsole == id)
writeCursorPosition(position);
}
void console_refresh()
{
if (activeConsole > 0)
{
memcpyw((void*)CONSOLE_MEMORY, consoles[activeConsole]->buffer, consoles[activeConsole]->width * consoles[activeConsole]->height);
writeCursorPosition(consoles[activeConsole]->cursorPosition);
}
}
+25 -5
View File
@@ -1,15 +1,35 @@
// parallel.c
// Author: Josh Holtrop
// Date: 08/02/04
// Modified: 08/16/04
#include "hos_defines.h"
#include "functions.h"
#include "parallel.h"
#include "char/parallel.h"
#include "fs/devices.h"
#include "mm/vmm.h"
void outparb(int c)
// initialization routine for vconsoles module
int parallel_init(major_t major)
{
outportb(0x37a, 0xc);
outportb(0x378, c);
outportb(0x37a, 0x1);
dev_driver_t *parallel_driver;
if (( parallel_driver = New(dev_driver_t) ))
{
parallel_driver->char_write = parallel_char_write;
devices_register_major('c', major, parallel_driver);
return 0;
}
return -1;
}
int parallel_char_write(minor_t minor, int c)
{
if (minor == 0)
{
outportb(0x37a, 0xc);
outportb(0x378, c);
outportb(0x37a, 0x1);
}
return 0;
}
+3 -1
View File
@@ -6,8 +6,10 @@
#define __HOS_PARALLEL__ __HOS_PARALLEL__
#include "hos_defines.h"
#include "fs/devices.h"
void outparb(int c);
int parallel_init(major_t major);
int parallel_char_write(minor_t minor, int c);
#endif
+293
View File
@@ -0,0 +1,293 @@
// vconsole.c
// Author: Josh Holtrop
// Date: 08/02/04
// Modified: 08/07/04
#include "char/vconsole.h"
#include "hos_defines.h"
#include "fs/devices.h"
#include "mm/vmm.h"
#include "lang/asmfuncs.h"
#include "console.h"
vconsole_t *vconsoles[VCONSOLE_MAX]; // pointer to virtual console structs
extern int activeConsole; // console subsystem active virtual console number
void vconsole_put_char(minor_t id, int c);
void vconsole_update_cursor(minor_t id, u16_t position);
void vconsole_update_attribute(minor_t id);
void vconsole_refresh(minor_t id);
// initialization routine for vconsoles module
int vconsole_init(major_t major)
{
dev_driver_t *vconsole_driver;
if (( vconsole_driver = New(dev_driver_t) ))
{
vconsole_driver->char_write = vconsole_char_write;
devices_register_major('c', major, vconsole_driver);
return 0;
}
return -1;
}
// routine to create a new virtual console object
minor_t vconsole_new(int width, int height)
{
int i;
for (i = 1; i < VCONSOLE_MAX; i++)
{
if ( (!vconsoles[i]) && ( vconsoles[i] = kcalloc(1, sizeof(vconsole_t)))) //New(vconsole_t) ) )
{
if (( vconsoles[i]->buffer = kmalloc(width * height * 2) ))
{
vconsoles[i]->width = width;
vconsoles[i]->height = height;
vconsoles[i]->attribute = vconsoles[i]->foreground = 0x07;
memsetw(vconsoles[i]->buffer, 0x0720, width * height);
// register the device as /dev/console%d
return i;
}
else
{
kfree(vconsoles[i]);
return 0;
}
}
}
return 0;
}
// called by console subsystem to draw a virtual console to the screen
int vconsole_draw(minor_t id)
{
if (vconsoles[id])
return console_draw(id, vconsoles[id]->cursorPosition, vconsoles[id]->buffer);
return -1;
}
// called by character device driver when a character is written to device w/ minor #id
int vconsole_char_write(minor_t id, int c)
{
if (!vconsoles[id])
return -1;
int cursorY = vconsoles[id]->cursorPosition / vconsoles[id]->width;
int cursorX = vconsoles[id]->cursorPosition % vconsoles[id]->width;
switch (vconsoles[id]->escapeLevel)
{
case 2:
if (c >= '0' && c <= '9') // c is part of an escape value
{
vconsoles[id]->escapeValue[vconsoles[id]->escapePosition] *= 10;
vconsoles[id]->escapeValue[vconsoles[id]->escapePosition] += c - '0';
return 0;
}
else if (c == ';')
{
if (vconsoles[id]->escapePosition < 7)
vconsoles[id]->escapePosition++;
return 0;
}
switch (c)
{
case 'A': // move cursor up n rows
cursorY -= vconsoles[id]->escapeValue[0];
if (cursorY < 0)
cursorY = 0;
vconsole_update_cursor(id, cursorY * vconsoles[id]->width +
cursorX);
break;
case 'B': // move cursor down n rows
cursorY += vconsoles[id]->escapeValue[0];
if (cursorY >= vconsoles[id]->height)
cursorY = vconsoles[id]->height - 1;
vconsole_update_cursor(id, cursorY * vconsoles[id]->width +
cursorX);
break;
case 'C': // move cursor right n columns
cursorX -= vconsoles[id]->escapeValue[0];
if (cursorX < 0)
cursorX = 0;
vconsole_update_cursor(id, cursorY * vconsoles[id]->width +
cursorX);
break;
case 'D': // move cursor left n columns
cursorX += vconsoles[id]->escapeValue[0];
if (cursorX >= vconsoles[id]->width)
cursorX = vconsoles[id]->width - 1;
vconsole_update_cursor(id, cursorY * vconsoles[id]->width +
cursorX);
break;
case 'H':
case 'f': // move cursor to position (x,y) upper left is (1,1)
cursorX = vconsoles[id]->escapeValue[0] - 1;
cursorY = vconsoles[id]->escapeValue[1] - 1;
if (cursorY < 0)
cursorY = 0;
if (cursorY >= vconsoles[id]->height)
cursorY = vconsoles[id]->height - 1;
if (cursorX < 0)
cursorX = 0;
if (cursorX >= vconsoles[id]->width)
cursorX = vconsoles[id]->width - 1;
vconsole_update_cursor(id, 0);
break;
case 'J': // clear screen, home cursor
memsetw(vconsoles[id]->buffer, 0x0720, vconsoles[id]->width * vconsoles[id]->height);
vconsole_draw(id);
vconsole_update_cursor(id, 0);
break;
case 'K': // erase line from cursor position (including char. under cursor) to end of line
memsetw(vconsoles[id]->buffer +
vconsoles[id]->cursorPosition, 0x0720, vconsoles[id]->width - cursorX);
vconsole_draw(id);
break;
case 's': // push cursor position on an internal stack
if (vconsoles[id]->cursorStackPosition < 16)
vconsoles[id]->cursorStack[vconsoles[id]->cursorStackPosition++] = vconsoles[id]->cursorPosition;
break;
case 'u': // pop cursor position from stack
if (vconsoles[id]->cursorStackPosition > 0)
{
vconsole_update_cursor(id, vconsoles[id]->cursorStack[--vconsoles[id]->cursorStackPosition]);
}
break;
case 'm': // set text attributes
for (; vconsoles[id]->escapePosition; vconsoles[id]->escapePosition--)
{
switch (vconsoles[id]->escapeValue[vconsoles[id]->escapePosition])
{
case 0:
vconsoles[id]->foreground = 0x07;
vconsoles[id]->background = 0x00;
vconsoles[id]->concealed = 0;
vconsoles[id]->reverse = 0;
vconsoles[id]->blink = 0;
vconsoles[id]->bold = 0;
vconsole_update_attribute(id);
break;
case 1:
vconsoles[id]->bold = 1;
vconsole_update_attribute(id);
break;
case 5:
vconsoles[id]->blink = 1;
vconsole_update_attribute(id);
break;
case 7:
vconsoles[id]->reverse = 1;
vconsole_update_attribute(id);
break;
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
vconsoles[id]->foreground = vconsoles[id]->escapeValue[vconsoles[id]->escapePosition] - 30;
vconsole_update_attribute(id);
break;
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
vconsoles[id]->background = vconsoles[id]->escapeValue[vconsoles[id]->escapePosition] - 30;
vconsole_update_attribute(id);
break;
}
}
break;
}
memsetd(vconsoles[id]->escapeValue, 0, 8);
vconsoles[id]->escapePosition = 0;
vconsoles[id]->escapeLevel = 0;
return 0;
case 1:
if (c == '[')
vconsoles[id]->escapeLevel = 2;
break;
vconsoles[id]->escapeLevel = 0;
return 0; // invalid escape sequence
default:
if (c == '\e')
{
vconsoles[id]->escapeLevel = 1;
return 0;
}
vconsole_put_char(id, c);
}
return 0;
}
// write the character to the virtual console
void vconsole_put_char(minor_t id, int c)
{
if (!vconsoles[id]->concealed)
{
switch (c)
{
case '\t':
if (vconsoles[id]->cursorPosition % 8)
vconsoles[id]->cursorPosition += (8 - (vconsoles[id]->cursorPosition % 8));
else
vconsoles[id]->cursorPosition += 8;
if (id == activeConsole)
console_update_cursor(id, vconsoles[id]->cursorPosition);
break;
case '\n':
if (vconsoles[id]->cursorPosition % (vconsoles[id]->width))
vconsoles[id]->cursorPosition += (vconsoles[id]->width - (vconsoles[id]->cursorPosition % vconsoles[id]->width));
else
vconsoles[id]->cursorPosition += vconsoles[id]->width;
if (id == activeConsole)
console_update_cursor(id, vconsoles[id]->cursorPosition);
break;
default:
vconsoles[id]->buffer[vconsoles[id]->cursorPosition << 1] = c | (vconsoles[id]->attribute << 8);
if (id == activeConsole)
console_put_char(id, c | (vconsoles[id]->attribute << 8), vconsoles[id]->cursorPosition);
vconsoles[id]->cursorPosition++;
if (id == activeConsole)
console_update_cursor(id, vconsoles[id]->cursorPosition);
}
}
}
void vconsole_update_cursor(minor_t id, u16_t position)
{
vconsoles[id]->cursorPosition = position;
if (activeConsole == id)
console_update_cursor(id, position);
}
void vconsole_update_attribute(minor_t id)
{
if (vconsoles[id]->reverse)
{
vconsoles[id]->attribute =
vconsoles[id]->blink << 7 |
vconsoles[id]->foreground << 4 |
vconsoles[id]->bold << 3 |
vconsoles[id]->background;
}
else
{
vconsoles[id]->attribute =
vconsoles[id]->blink << 7 |
vconsoles[id]->background << 4 |
vconsoles[id]->bold << 3 |
vconsoles[id]->foreground;
}
}
@@ -1,22 +1,25 @@
// console.h
// vconsole.h
// Author: Josh Holtrop
// Date: 08/02/04
// Modified: 08/03/04
// Modified: 08/07/04
#ifndef __HOS_CONSOLE__
#define __HOS_CONSOLE__ __HOS_CONSOLE__
#ifndef __HOS_VCONSOLE__
#define __HOS_VCONSOLE__ __HOS_VCONSOLE__
#include "hos_defines.h"
#include "fs/devices.h"
#define VCONSOLE_MAX 16
typedef struct
{
u16_t *buffer;
u32_t escapeValue[8];
u16_t cursorPosition;
u16_t width;
u16_t height;
u16_t *buffer;
u16_t cursorStack[16];
u8_t attribute;
u8_t foreground;
u8_t background;
@@ -24,14 +27,16 @@ typedef struct
u8_t reverse;
u8_t blink;
u8_t concealed;
u8_t cursorStackPosition;
char escapeLevel;
char escapePosition;
} console_t;
int console_init(u32_t num, int width, int height);
int console_activate(int num);
int console_char_write(minor_t id, u64_t position, int c);
u8_t cursorStackPosition;
u8_t escapeLevel;
u8_t escapePosition;
} vconsole_t;
int vconsole_init(major_t major);
minor_t vconsole_new(int width, int height);
int vconsole_draw(minor_t id);
int vconsole_char_write(minor_t id, int c);
#endif