diff options
Diffstat (limited to 'memtestEDK/Memtest/SingleComponents/screen_buffer.c')
-rw-r--r-- | memtestEDK/Memtest/SingleComponents/screen_buffer.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/memtestEDK/Memtest/SingleComponents/screen_buffer.c b/memtestEDK/Memtest/SingleComponents/screen_buffer.c new file mode 100644 index 0000000..2a8e77d --- /dev/null +++ b/memtestEDK/Memtest/SingleComponents/screen_buffer.c @@ -0,0 +1,133 @@ +/* screen_buffer.c - MemTest-86 Version 3.3 + * + * Released under version 2 of the Gnu Public License. + * By Jani Averbach, Jaa@iki.fi, 2001 + */ + +// #include "test.h" +#include "screen_buffer.h" +#include "lib.c" + + +#include <Library/UefiLib.h> + +#define SCREEN_X 80 +#define SCREEN_Y 25 +#define Y_SIZE SCREEN_Y +/* + * X-size should by one of by screen size, + * so that there is room for ending '\0' + */ +#define X_SIZE SCREEN_X+1 + +static char screen_buf[Y_SIZE][X_SIZE]; + +#ifdef SCRN_DEBUG + +char *padding = "12345678901234567890123456789012345678901234567890123456789012345678901234567890"; + +#define CHECK_BOUNDS(y,x) do {if (y < 0 || Y_SIZE <= y || x < 0 || X_SIZE <= x) print_error("out of index");}while(0) + +#else /* ! SCRN_DEBUG */ + +#define CHECK_BOUNDS(y,x) + +#endif /* SCRN_DEBUG */ + +char +get_scrn_buf(const int y, + const int x) +{ + CHECK_BOUNDS(y,x); + return screen_buf[y][x]; +} + + +void +set_scrn_buf(const int y, + const int x, + const char val) +{ + CHECK_BOUNDS(y,x); + screen_buf[y][x] = val; +} + +void clear_screen_buf() +{ + int y, x; + + for (y=0; y < SCREEN_Y; ++y){ + for (x=0; x < SCREEN_X; ++x){ + CHECK_BOUNDS(y,x); + screen_buf[y][x] = ' '; + } + CHECK_BOUNDS(y,SCREEN_X); + screen_buf[y][SCREEN_X] = '\0'; + } +} + +void tty_print_region(const int pi_top, + const int pi_left, + const int pi_bottom, + const int pi_right) +{ + Print(L"Start tty_print_region\n"); + int y; + char tmp; + + for (y=pi_top; y < pi_bottom; ++y){ + CHECK_BOUNDS(y, pi_right); + + tmp = screen_buf[y][pi_right]; + screen_buf[y][pi_right] = '\0'; + + CHECK_BOUNDS(y, pi_left); + ttyprint(y, pi_left, &(screen_buf[y][pi_left])); + + screen_buf[y][pi_right] = tmp; + } + Print(L"end tty_print_region\n"); +} + +void tty_print_line( + int y, int x, const char *text) +{ + for(; *text && (x < SCREEN_X); x++, text++) { + if (*text != screen_buf[y][x]) { + break; + } + } + /* If there is nothing to do return */ + if (*text == '\0') { + return; + } + // ttyprint(y, x, text); + for(; *text && (x < SCREEN_X); x++, text++) { + screen_buf[y][x] = *text; + } +} + + +void tty_print_screen(void) +{ +#ifdef SCRN_DEBUG + int i; + + for (i=0; i < SCREEN_Y; ++i) + // ttyprint(i,0, padding); +#endif /* SCRN_DEBUG */ + + // tty_print_region(0, 0, SCREEN_Y, SCREEN_X); +} + +void print_error(char *pstr) +{ + +#ifdef SCRN_DEBUG + // ttyprint(0,0, padding); +#endif /* SCRN_DEBUG */ + + // ttyprint(0,35, pstr); + + while(1); +} |