2011-01-16 04:01:19 +03:00
|
|
|
#include <system.h>
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Text pointer, background, foreground
|
|
|
|
*/
|
|
|
|
unsigned short * textmemptr;
|
|
|
|
int attrib = 0x0F;
|
|
|
|
int csr_x = 0, csr_y = 0;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* scroll
|
|
|
|
* Scroll the screen
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
scroll() {
|
|
|
|
unsigned blank, temp;
|
|
|
|
blank = 0x20 | (attrib << 8);
|
|
|
|
if (csr_y >= 25) {
|
|
|
|
/*
|
|
|
|
* Move the current text chunk that makes up the screen
|
|
|
|
* back in the buffer by one line.
|
|
|
|
*/
|
|
|
|
temp = csr_y - 25 + 1;
|
|
|
|
memcpy(textmemptr, textmemptr + temp * 80, (25 - temp) * 80 * 2);
|
|
|
|
/*
|
|
|
|
* Set the chunk of memory that occupies
|
|
|
|
* the last line of text to the blank character
|
|
|
|
*/
|
|
|
|
memsetw(textmemptr + (25 - temp) * 80, blank, 80);
|
|
|
|
csr_y = 25 - 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* move_csr
|
|
|
|
* Update the hardware cursor
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
move_csr() {
|
|
|
|
unsigned temp;
|
|
|
|
temp = csr_y * 80 + csr_x;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write stuff out.
|
|
|
|
*/
|
|
|
|
outportb(0x3D4, 14);
|
|
|
|
outportb(0x3D5, temp >> 8);
|
|
|
|
outportb(0x3D4, 15);
|
|
|
|
outportb(0x3D5, temp);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* cls
|
|
|
|
* Clear the screen
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
cls() {
|
|
|
|
unsigned blank;
|
|
|
|
int i;
|
|
|
|
blank = 0x20 | (attrib << 8);
|
|
|
|
for (i = 0; i < 25; ++i) {
|
|
|
|
memsetw(textmemptr + i * 80, blank, 80);
|
|
|
|
}
|
|
|
|
csr_x = 0;
|
|
|
|
csr_y = 0;
|
|
|
|
move_csr();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* putch
|
|
|
|
* Puts a character to the screen
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
putch(
|
|
|
|
unsigned char c
|
|
|
|
) {
|
|
|
|
unsigned short *where;
|
|
|
|
unsigned att = attrib << 8;
|
|
|
|
if (c == 0x08) {
|
|
|
|
/* Backspace */
|
|
|
|
if (csr_x != 0) csr_x--;
|
|
|
|
} else if (c == 0x09) {
|
|
|
|
/* Tab */
|
|
|
|
csr_x = (csr_x + 8) & ~(8 - 1);
|
|
|
|
} else if (c == '\r') {
|
|
|
|
/* Carriage return */
|
|
|
|
csr_x = 0;
|
|
|
|
} else if (c == '\n') {
|
|
|
|
/* New line */
|
|
|
|
csr_x = 0;
|
|
|
|
csr_y++;
|
|
|
|
} else if (c >= ' ') {
|
|
|
|
where = textmemptr + (csr_y * 80 + csr_x);
|
|
|
|
*where = c | att;
|
|
|
|
csr_x++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (csr_x >= 80) {
|
|
|
|
csr_x = 0;
|
|
|
|
csr_y++;
|
|
|
|
}
|
|
|
|
scroll();
|
|
|
|
move_csr();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* puts
|
|
|
|
* Put string to screen
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
puts(
|
2011-01-16 19:56:44 +03:00
|
|
|
char * text
|
2011-01-16 04:01:19 +03:00
|
|
|
){
|
|
|
|
int i;
|
|
|
|
int len = strlen(text);
|
|
|
|
for (i = 0; i < len; ++i) {
|
|
|
|
putch(text[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* settextcolor
|
|
|
|
* Sets the foreground and background color
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
settextcolor(
|
|
|
|
unsigned char forecolor,
|
|
|
|
unsigned char backcolor
|
|
|
|
) {
|
|
|
|
attrib = (backcolor << 4) | (forecolor & 0x0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* init_video
|
|
|
|
* Initialize the VGA driver.
|
|
|
|
*/
|
|
|
|
void init_video() {
|
|
|
|
textmemptr = (unsigned short *)0xB8000;
|
|
|
|
cls();
|
|
|
|
}
|