| /* 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" |
| |
| #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) |
| { |
| 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; |
| } |
| } |
| |
| 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); |
| } |