aboutsummaryrefslogtreecommitdiff
path: root/sdk-modifications/libsrc/console/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'sdk-modifications/libsrc/console/console.c')
-rw-r--r--sdk-modifications/libsrc/console/console.c484
1 files changed, 484 insertions, 0 deletions
diff --git a/sdk-modifications/libsrc/console/console.c b/sdk-modifications/libsrc/console/console.c
new file mode 100644
index 0000000..f455ac5
--- /dev/null
+++ b/sdk-modifications/libsrc/console/console.c
@@ -0,0 +1,484 @@
+//console.c
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "ds2io.h"
+#include "memory.h"
+#include "font_dot.h"
+
+#define STRING_SIZE 2048
+
+#define CONSOLE_WIDTH 32
+#define CONSOLE_HEIGHT 24
+#define TAB_SIZE 3
+
+static void ConsoleView(void);
+static void ConsoleDrawfontall(void);
+
+static int console_init_done = 0;
+static unsigned short f_color;
+static unsigned short b_color;
+static enum SCREEN_ID console_id;
+
+static int print_row;
+static int print_col;
+static int print_row_saved;
+static int print_col_saved;
+
+static unsigned char* console_buf;
+static unsigned int console_buf_size;
+static unsigned char* console_buf_front;
+static unsigned char* console_buf_end;
+static unsigned char* console_print_header;
+static unsigned short* console_screen;
+static unsigned char* print_header_saved;
+
+static void ConsoleFlush(void)
+{
+ unsigned short* screen_addr;
+ enum SCREEN_ID id;
+
+ if(console_id & UP_MASK) {
+ screen_addr = up_screen_addr;
+ id = UP_SCREEN;
+ }
+ else {
+ screen_addr = down_screen_addr;
+ id = DOWN_SCREEN;
+ }
+
+ memcpy((void*)screen_addr, (void*)console_screen, SCREEN_WIDTH*SCREEN_HEIGHT*2);
+ ds2_flipScreen(id, 1);
+}
+
+static void ConsoleClearscreen(void)
+{
+ unsigned short *scr;
+ unsigned int i;
+
+ scr = console_screen;
+ i = 0;
+ while(i < SCREEN_WIDTH*SCREEN_HEIGHT)
+ scr[i++] = b_color;
+}
+
+static void ConsoleMovewin(int dir, int sw_screen)
+{
+ unsigned char *pt;
+
+ if(dir || sw_screen)
+ ConsoleClearscreen();
+
+ //switch to another screen to dispaly text
+ if(sw_screen)
+ {
+ ConsoleFlush();
+ //now up screen
+ if(console_id & UP_MASK) {
+ console_screen = down_screen_addr;
+ console_id = DOWN_SCREEN;
+ }
+ //switch to up screen
+ else
+ {
+ console_screen = up_screen_addr;
+ console_id = UP_SCREEN;
+ }
+ }
+
+ pt = console_print_header + dir*CONSOLE_WIDTH;
+
+ //screen scroll down
+ if(dir > 0)
+ {
+ if(console_buf_end > console_print_header) {
+ if(pt > console_buf_end)
+ pt = console_buf_end;
+ console_print_header = pt;
+ }
+ else if(console_buf_end < console_print_header) {
+ if((pt - console_buf) >= console_buf_size) {
+ pt -= console_buf_size;
+ if(pt > console_buf_end)
+ pt = console_buf_end;
+ }
+ console_print_header = pt;
+ }
+ }
+ //screen scroll up
+ else if(dir < 0)
+ {
+ if(console_buf_front > console_print_header) {
+ if(pt < console_buf) {
+ pt += console_buf_size;
+ if(pt < console_buf_front)
+ pt = console_buf_front;
+ }
+ console_print_header = pt;
+ }
+ else if(console_buf_front < console_print_header) {
+ if(pt < console_buf_front)
+ pt = console_buf_front;
+ console_print_header = pt;
+ }
+ }
+
+ if(dir || sw_screen)
+ {
+ print_row_saved = 0; //redraw entire screen
+ print_col_saved = 0;
+
+ ConsoleDrawfontall();
+ ConsoleFlush();
+ }
+}
+
+void ConsoleClr(int mode)
+{
+ unsigned char *pt, *pt_end;
+ unsigned int i;
+
+ //Clear current screen buffer
+ if(0 == mode)
+ {
+ if(print_col > 0) {
+ console_buf_end += CONSOLE_WIDTH;
+ if((console_buf_end - console_buf) >= console_buf_size)
+ console_buf_end -= console_buf_size;
+ }
+
+ console_print_header = console_buf_end;
+ print_row = 0;
+ print_col = 0;
+ print_row_saved = 0;
+ print_col_saved = 0;
+ }
+ //Clear all
+ else if(1 == mode)
+ {
+ console_buf_front = console_buf;
+ console_buf_end = console_buf;
+ console_print_header = console_buf;
+ print_row = 0;
+ print_col = 0;
+ print_row_saved = 0;
+ print_col_saved = 0;
+
+ pt = console_buf;
+ pt_end = console_buf + console_buf_size;
+ while(pt < pt_end)
+ {
+ pt[0] = '\0';
+ pt += CONSOLE_WIDTH;
+ }
+ }
+
+ ConsoleClearscreen();
+ ConsoleFlush();
+}
+
+//Draw part of the screen
+static void ConsoleDrawfont(void)
+{
+ unsigned char *pt, *dot_map;
+ unsigned char ch, dot;
+ unsigned short *dst, *pt_r;
+ unsigned int row, col;
+ unsigned int x, j, k;
+
+ pt_r = console_screen;
+ row = print_row_saved;
+ col = print_col_saved;
+ x = col*8;
+
+ pt = console_print_header + row * CONSOLE_WIDTH;
+
+ while(row != print_row || col != print_col)
+ {
+ ch = pt[col++] & 0x7F;
+ //'\n'
+ if('\n' == ch || '\0' == ch || col > CONSOLE_WIDTH) {
+ pt += CONSOLE_WIDTH;
+ if((pt - console_buf) >= console_buf_size) pt -= console_buf_size;
+ col = 0;
+ row += 1;
+ x = 0;
+ }
+ //character not '\n' nor '\0'
+ else {
+ dot_map = (unsigned char*)font_map[ch];
+
+ for(j= 0; j < 8; j++)
+ {
+ dot = *dot_map++;
+ dst = pt_r + (row*8+j)*SCREEN_WIDTH + x;
+ for(k = 0; k < 8; k++)
+ *dst++ = (dot & (0x80>>k)) ? f_color : b_color;
+ }
+ x += 8;
+ }
+ }
+}
+
+//Redraw the hole screen
+static void ConsoleDrawfontall(void)
+{
+ unsigned char *pt, *end_pt, *dot_map;
+ unsigned int i, j, k;
+ unsigned char ch, dot;
+ unsigned short *dst, *pt_r;
+ unsigned int x, y;
+
+ //Clear screen to b_color
+ pt_r = console_screen;
+ i = 0;
+ while(i < SCREEN_WIDTH*SCREEN_HEIGHT)
+ pt_r[i++] = b_color;
+
+ pt = console_print_header;
+ end_pt = console_buf_end;
+ x = 0;
+ y = 0;
+ i = 0;
+ while(pt != end_pt)
+ {
+ ch = pt[i++] & 0x7F;
+ //'\n'
+ if('\n' == ch || '\0' == ch || i > CONSOLE_WIDTH) {
+ pt += CONSOLE_WIDTH;
+ if((pt - console_buf) >= console_buf_size) pt -= console_buf_size;
+ i = 0;
+ x = 0;
+ y += 1;
+ if(y >= CONSOLE_HEIGHT) break;
+ }
+ //character not '\n' nor '\0'
+ else {
+ dot_map = (unsigned char*)font_map[ch];
+
+ for(j= 0; j < 8; j++)
+ {
+ dot = *dot_map++;
+ dst = pt_r + (y*8+j)*SCREEN_WIDTH + x;
+ for(k = 0; k < 8; k++)
+ *dst++ = (dot & (0x80>>k)) ? f_color : b_color;
+ }
+ x += 8;
+ }
+ }
+}
+
+static void ConsoleNewline(void)
+{
+ print_row += 1;
+ if(print_row >= CONSOLE_HEIGHT)
+ {
+ print_row -= 1;
+ console_print_header += CONSOLE_WIDTH;
+ if((console_print_header - console_buf) >= console_buf_size)
+ console_print_header = console_buf;
+
+ print_row_saved = 0;
+ print_col_saved = 0;
+
+ ConsoleClearscreen();
+ }
+
+ console_buf_end += CONSOLE_WIDTH;
+ if((console_buf_end - console_buf) >= console_buf_size)
+ console_buf_end = console_buf;
+
+ //scrollback
+ if(console_buf_end == console_buf_front)
+ {
+ console_buf_front += CONSOLE_WIDTH;
+ if((console_buf_front - console_buf) >= console_buf_size)
+ console_buf_front = console_buf;
+
+ console_buf_end[0] = '\0';
+ }
+}
+
+static void ConsolePrintchar(unsigned char ch)
+{
+ int i;
+
+ if(print_col >= CONSOLE_WIDTH) {
+ print_col = 0;
+ ConsoleNewline();
+ }
+
+ switch(ch) {
+ case 9: //'\t'
+ if((print_col + TAB_SIZE) < CONSOLE_WIDTH)
+ {
+ i = print_col % TAB_SIZE;
+ i = TAB_SIZE - i;
+ while(i--)
+ {
+ console_buf_end[print_col] = ' ';
+ print_col += 1;
+ }
+ }
+ break;
+ case 10: //'\n'
+ case 13: //'\r'
+ console_buf_end[print_col] = '\n';
+ print_col = 0;
+ ConsoleNewline();
+ break;
+ default:
+ console_buf_end[print_col] = ch;
+ if(ch != '\0')
+ print_col += 1;
+ break;
+ }
+}
+
+void ConsolePrintstring(unsigned char* string)
+{
+ unsigned char *pt;
+ unsigned char ch;
+
+ print_row_saved = print_row;
+ print_col_saved = print_col;
+ console_print_header = print_header_saved;
+//cprintf("print_row %d; print_col %d; [%s]\n", print_row, print_col, string);
+ pt = string;
+ do
+ {
+ ch = *pt++;
+ ConsolePrintchar(ch);
+ }
+ while ('\0' != ch);
+
+ print_header_saved = console_print_header;
+
+ ConsoleDrawfont();
+ ConsoleFlush();
+}
+
+//---------------------------------------------------------------------------------
+//parameter:
+// front_color: color of character
+// background_color: background color
+// screen: UP-up screen used as output, DOWN-down screen used as output,
+// using only one screen at a time
+// buf_size: buffer size to hold the output, it's unit is screen
+//---------------------------------------------------------------------------------
+int ConsoleInit(unsigned short front_color, unsigned short background_color, enum SCREEN_ID screen, unsigned int buf_size)
+{
+ unsigned char *pt;
+ unsigned int size;
+ unsigned short **scr_ppt;
+
+ console_init_done = 0;
+ f_color = front_color;
+ b_color = background_color;
+
+
+ //Using only one screen at a time
+ if(screen & UP_MASK)
+ console_id = UP_SCREEN;
+ else
+ console_id = DOWN_SCREEN;
+
+ if(!buf_size) buf_size = 1;
+ size = buf_size *CONSOLE_WIDTH *CONSOLE_HEIGHT;
+
+ pt = (unsigned char*)Drv_alloc(size);
+ if(NULL == pt)
+ return -1; //there is something error
+
+ console_buf = pt;
+ memset(console_buf, 0, size);
+
+ print_row = 0;
+ print_col = 0;
+ print_row_saved = print_row;
+ print_col_saved = print_col;
+ console_buf_size = size;
+ console_buf_front = console_buf;
+ console_buf_end = console_buf;
+ console_print_header = console_buf;
+ print_header_saved = console_print_header;
+
+ console_screen = (unsigned short*)Drv_alloc(SCREEN_WIDTH * SCREEN_HEIGHT*2);
+ if(NULL == console_screen) {
+ Drv_deAlloc((void*)console_buf);
+ return -1;
+ }
+
+ ConsoleClr(1);
+
+ console_init_done = 1;
+
+ regist_escape_key(ConsoleView, (KEY_L | KEY_R | KEY_A | KEY_B | KEY_X));
+ return 0;
+}
+
+void ConsoleView(void)
+{
+ unsigned int key;
+
+cprintf("enter console mode\n");
+
+ do {
+ key = getKey();
+
+ switch(key)
+ {
+ //screen scroll down 1 line
+ case KEY_UP:
+ ConsoleMovewin(-1, 0);
+ break;
+
+ //screen scroll up 1 line
+ case KEY_DOWN:
+ ConsoleMovewin(1, 0);
+ break;
+
+ //screen scroll done (CONSOLE_HEIGHT-1) line
+ case KEY_LEFT:
+ ConsoleMovewin(-(CONSOLE_HEIGHT-1), 0);
+ break;
+
+ //screen scroll up (CONSOLE_HEIGHT-1) line
+ case KEY_RIGHT:
+ ConsoleMovewin(CONSOLE_HEIGHT-1, 0);
+ break;
+
+ //switch screen
+ case KEY_B:
+cprintf("switch to another screen\n");
+ ConsoleMovewin(0, 1);
+ break;
+
+ default: break;
+ }
+
+ mdelay(20);
+ } while(key != KEY_Y);
+
+cprintf("exit console mode\n");
+}
+
+int printf(const char *format, ...)
+{
+ char string[STRING_SIZE];
+ int ret;
+ va_list ap;
+
+ if(!console_init_done)
+ return 0;
+
+ va_start (ap, format);
+ ret = vsnprintf(string, STRING_SIZE, format, ap);
+ va_end (ap);
+
+ ConsolePrintstring(string);
+
+ return ret;
+}
+
+