#include "common.h"
|
#include "common.h"
|
#include "support.h"
|
#include "support.h"
|
#include "screen.h"
|
#include "screen.h"
|
|
|
#if CRT_ENABLED
|
#if CRT_ENABLED
|
unsigned long fg_color = COLOR_WHITE;
|
unsigned long fg_color = COLOR_WHITE;
|
unsigned long bg_color = COLOR_BLACK;
|
unsigned long bg_color = COLOR_BLACK;
|
int cx = 0;
|
int cx = 0;
|
int cy = 0;
|
int cy = 0;
|
|
|
extern unsigned char font[256][12];
|
extern unsigned char font[256][12];
|
static char screen[CHARSY][CHARSX];
|
static char screen[CHARSY][CHARSX];
|
|
|
void put_char_xy (int x, int y, char c) {
|
void put_char_xy(int x, int y, char c)
|
|
{
|
int i, j;
|
int i, j;
|
screen[y][x] = c;
|
screen[y][x] = c;
|
x *= CHAR_WIDTH;
|
x *= CHAR_WIDTH;
|
y *= CHAR_HEIGHT;
|
y *= CHAR_HEIGHT;
|
for (i = 0; i < CHAR_HEIGHT; i++) {
|
for (i = 0; i < CHAR_HEIGHT; i++) {
|
int t = font[(unsigned char)c][i];
|
int t = font[(unsigned char)c][i];
|
for (j = 0; j < CHAR_WIDTH; j++) {
|
for (j = 0; j < CHAR_WIDTH; j++) {
|
PUT_PIXEL(x + j, y + i, (t & 1) ? fg_color : bg_color);
|
PUT_PIXEL(x + j, y + i, (t & 1) ? fg_color : bg_color);
|
t >>= 1;
|
t >>= 1;
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
static void scroll (void) {
|
static void scroll(void)
|
|
{
|
int x,y;
|
int x,y;
|
#if 1
|
#if 1
|
for (y = 1; y < CHARSY; y++)
|
for (y = 1; y < CHARSY; y++)
|
for (x = 0; x < CHARSX; x++)
|
for (x = 0; x < CHARSX; x++)
|
put_char_xy (x, y-1, screen[y][x]);
|
put_char_xy(x, y - 1, screen[y][x]);
|
#else
|
#else
|
memcpy ( (unsigned char *)FB_BASE_ADDR, ((unsigned char *)FB_BASE_ADDR) + RESX * CHAR_HEIGHT, (RESY - CHAR_HEIGHT) * RESX);
|
memcpy((unsigned char *)FB_BASE_ADDR,
|
|
((unsigned char *)FB_BASE_ADDR) + RESX * CHAR_HEIGHT,
|
|
(RESY - CHAR_HEIGHT) * RESX);
|
memcpy (&screen[0][0], &screen[1][0], (CHARSY - 1) * CHARSX);
|
memcpy (&screen[0][0], &screen[1][0], (CHARSY - 1) * CHARSX);
|
#endif
|
#endif
|
for (x = 0; x < CHARSX; x++)
|
for (x = 0; x < CHARSX; x++)
|
put_char_xy (x, CHARSY-1, ' ');
|
put_char_xy(x, CHARSY - 1, ' ');
|
cy--;
|
cy--;
|
}
|
}
|
|
|
void screen_putc (char c) {
|
void screen_putc(char c)
|
|
{
|
int t;
|
int t;
|
switch (c) {
|
switch (c) {
|
case '\n':
|
case '\n':
|
cy++;
|
cy++;
|
cx = 0;
|
cx = 0;
|
if (cy >= CHARSY)
|
if (cy >= CHARSY)
|
scroll();
|
scroll();
|
break;
|
break;
|
case '\r':
|
case '\r':
|
cx = 0;
|
cx = 0;
|
break;
|
break;
|
case '\t':
|
case '\t':
|
for (t = 0; t < 8 - (cx & 7); t++)
|
for (t = 0; t < 8 - (cx & 7); t++)
|
screen_putc (' ');
|
screen_putc(' ');
|
break;
|
break;
|
case '\b':
|
case '\b':
|
if (cx > 0) cx--;
|
if (cx > 0)
|
|
cx--;
|
put_char_xy(cx, cy, ' ');
|
put_char_xy(cx, cy, ' ');
|
break;
|
break;
|
default:
|
default:
|
put_char_xy(cx, cy, c);
|
put_char_xy(cx, cy, c);
|
cx++;
|
cx++;
|
if(cx >= CHARSX) screen_putc ('\n');
|
if (cx >= CHARSX)
|
|
screen_putc('\n');
|
break;
|
break;
|
}
|
}
|
}
|
}
|
|
|
void screen_clear () {
|
void screen_clear()
|
|
{
|
memset ((unsigned char *)FB_BASE_ADDR, bg_color, RESX * RESY);
|
memset ((unsigned char *)FB_BASE_ADDR, bg_color, RESX * RESY);
|
memset (&screen[0][0], ' ', CHARSX * CHARSY);
|
memset(&screen[0][0], ' ', CHARSX * CHARSY);
|
cx = cy = 0;
|
cx = cy = 0;
|
}
|
}
|
|
|
void screen_puts (char *s) {
|
void screen_puts(char *s)
|
|
{
|
while (*s) {
|
while (*s) {
|
screen_putc (*s);
|
screen_putc(*s);
|
s++;
|
s++;
|
}
|
}
|
}
|
}
|
|
|
void screen_init () {
|
void screen_init()
|
|
{
|
screen_clear ();
|
screen_clear ();
|
SET_PALLETE(COLOR_BLACK, 0, 0, 0);
|
SET_PALLETE(COLOR_BLACK, 0, 0, 0);
|
SET_PALLETE(COLOR_WHITE, 127, 127, 127);
|
SET_PALLETE(COLOR_WHITE, 127, 127, 127);
|
|
|
/* Set screen offset */
|
/* Set screen offset */
|
*((unsigned long *)CRT_BUFFER_REG) = FB_BASE_ADDR;
|
*((unsigned long *)CRT_BUFFER_REG) = FB_BASE_ADDR;
|
|
|
/* Turn screen on */
|
/* Turn screen on */
|
*((unsigned long *)CRT_REG) = 0x00000001;
|
*((unsigned long *)CRT_REG) = 0x00000001;
|
}
|
}
|
|
|
#endif /* CRT_ENABLED */
|
#endif /* CRT_ENABLED */
|
|
|