diff --git a/lib/CPUs/MIPS/bsp/examples/libsys.c b/lib/CPUs/MIPS/bsp/examples/libsys.c index abc4849..abba09f 100644 --- a/lib/CPUs/MIPS/bsp/examples/libsys.c +++ b/lib/CPUs/MIPS/bsp/examples/libsys.c @@ -10,6 +10,14 @@ // --------------------------------------------------------------------------------- // Types // --------------------------------------------------------------------------------- +void libsys_init(void) +{ + // Initalize debugger + dbg_init(); + + // Do some initializations here + +} UINT32 GetPort(int file) { @@ -69,19 +77,19 @@ typedef struct _scon_if_out_t // --------------------------------------------------------------------------------- static uart_if_t uart_if[2] = { - {(UINT32*)sys_uart0_stat, (UINT32*)sys_uart0_data, (UINT32*)sys_uart0_baud}, - {(UINT32*)sys_uart1_stat, (UINT32*)sys_uart1_data, (UINT32*)sys_uart1_baud} + {(UINT32*)SYS_UART0_STAT, (UINT32*)SYS_UART0_DATA, (UINT32*)SYS_UART0_BAUD}, + {(UINT32*)SYS_UART1_STAT, (UINT32*)SYS_UART1_DATA, (UINT32*)SYS_UART1_BAUD} }; static ps2_if_t ps2_if[2] = { - {(UINT32*)sys_ps2_0_stat, (UINT32*)sys_ps2_0_data}, - {(UINT32*)sys_ps2_1_stat, (UINT32*)sys_ps2_1_data} + {(UINT32*)SYS_PS2_0_STAT, (UINT32*)SYS_PS2_0_DATA}, + {(UINT32*)SYS_PS2_1_STAT, (UINT32*)SYS_PS2_1_DATA} }; static vga_if_t vga_if = { - (UINT32*)sys_vga_ctrl, (UINT32*)sys_vga_ascii, (UINT32*)sys_vga_posx, (UINT32*)sys_vga_posy + (UINT32*)SYS_VGA_CTRL, (UINT32*)SYS_VGA_ASCII, (UINT32*)SYS_VGA_POSX, (UINT32*)SYS_VGA_POSY }; static con_if_in_t con_if_in[4] = @@ -249,67 +257,73 @@ void DCACHE_invalidate_at(UINT32* pPtr) //keymap for the AT keyboard SG layout typedef struct { - char scancode; - char unshifted; - char shifted; + UINT8 scancode; + UINT8 unshifted; + UINT8 shifted; + UINT8 altered; } libsys_key_entry_t; #define SHIFTED (1<<0) #define ALTERED (1<<1) #define CONTROLLED (1<<2) -static const libsys_key_entry_t __keymap[] = +static const libsys_key_entry_t __keymap_german[] = { - {0x1c, 'a', 'A'}, - {0x32, 'b', 'B'}, - {0x21, 'c', 'C'}, - {0x23, 'd', 'D'}, - {0x24, 'e', 'E'}, - {0x2b, 'f', 'F'}, - {0x34, 'g', 'G'}, - {0x33, 'h', 'H'}, - {0x43, 'i', 'I'}, - {0x3b, 'j', 'J'}, - {0x42, 'k', 'K'}, - {0x4b, 'l', 'L'}, - {0x3a, 'm', 'M'}, - {0x31, 'n', 'N'}, - {0x44, 'o', 'O'}, - {0x4d, 'p', 'P'}, - {0x15, 'q', 'Q'}, - {0x2d, 'r', 'R'}, - {0x1b, 's', 'S'}, - {0x2c, 't', 'T'}, - {0x3c, 'u', 'U'}, - {0x2a, 'v', 'V'}, - {0x1d, 'w', 'W'}, - {0x22, 'x', 'X'}, - {0x1a, 'y', 'Y'}, - {0x35, 'z', 'Z'}, - {0x16, '1', '+'}, - {0x1e, '2', '"'}, - {0x26, '3', '*'}, - {0x25, '4', 'ç'}, - {0x2e, '5', '%'}, - {0x36, '6', '&'}, - {0x3d, '7', '/'}, - {0x3e, '8', '('}, - {0x46, '9', ')'}, - {0x45, '0', '='}, - {0x29, ' ', ' '}, - {0x41, ',', ';'}, - {0x49, '.', ':'}, - {0x4a, '-', '_'}, - {0x76, '\x1b', '\x1b'}, //ESC - {0x5a, '\n', '\n'}, //RETURN - {0x0d, '\t', '\t'}, //TAB - {0x66, '\b', '\b'}, //BS + {0x1c, 'a', 'A', 'a'}, + {0x32, 'b', 'B', 'b'}, + {0x21, 'c', 'C', 'c'}, + {0x23, 'd', 'D', 'd'}, + {0x24, 'e', 'E', '€'}, + {0x2b, 'f', 'F', 'f'}, + {0x34, 'g', 'G', 'g'}, + {0x33, 'h', 'H', 'h'}, + {0x43, 'i', 'I', 'i'}, + {0x3b, 'j', 'J', 'j'}, + {0x42, 'k', 'K', 'k'}, + {0x4b, 'l', 'L', 'l'}, + {0x3a, 'm', 'M', 'µ'}, + {0x31, 'n', 'N', 'n'}, + {0x44, 'o', 'O', 'o'}, + {0x4d, 'p', 'P', 'p'}, + {0x15, 'q', 'Q', '@'}, + {0x2d, 'r', 'R', 'r'}, + {0x1b, 's', 'S', 's'}, + {0x2c, 't', 'T', 't'}, + {0x3c, 'u', 'U', 'u'}, + {0x2a, 'v', 'V', 'v'}, + {0x1d, 'w', 'W', 'w'}, + {0x22, 'x', 'X', 'x'}, + {0x1a, 'y', 'Y', 'y'}, + {0x35, 'z', 'Z', 'z'}, + {0x16, '1', '!', '1'}, + {0x1e, '2', '"', '2'}, + {0x26, '3', '§', '3'}, + {0x25, '4', '$', '4'}, + {0x2e, '5', '%', '5'}, + {0x36, '6', '&', '6'}, + {0x3d, '7', '/', '{'}, + {0x3e, '8', '(', '['}, + {0x46, '9', ')', ']'}, + {0x45, '0', '=', '}'}, + {0x4e, 'ß', '?', '\\'}, + {0x29, ' ', ' ', ' '}, + {0x41, ',', ';', ','}, + {0x49, '.', ':', '.'}, + {0x4a, '-', '_', '-'}, + {0x52, 'ä', 'Ä', 'ä'}, + {0x4c, 'ö', 'Ö', 'ö'}, + {0x54, 'ü', 'Ü', 'ü'}, + {0x5a, '\n', '\n', '\n'}, //RETURN + {0x5b, '+', '*', '~'}, + {0x5d, '#', '\'', '#'}, + {0x0e, '^', '°', '^'}, + {0x61, '<', '>', '|'}, {0} //sentinel }; static char __findkey(char scancode, int mode) { - const libsys_key_entry_t *p = __keymap; + const libsys_key_entry_t *p = __keymap_german; while (p->scancode) { if (p->scancode == scancode) @@ -319,6 +333,7 @@ static char __findkey(char scancode, int mode) case SHIFTED: return p->shifted; case ALTERED: + return p->altered; case ALTERED|SHIFTED: default: return p->unshifted; @@ -358,15 +373,15 @@ UINT32 PS2_readchar(ps2_if_t *pIF) if (!pIF) return -1; - while (!(sys_ps2_bit_rx_avail & *pIF->pCTRL)); + while (!(SYS_PS2_BIT_RX_AVAIL & *pIF->pCTRL)); return (*pIF->pDATA & 0xFF); } -int con_readchar(ps2_if_t *pIF) +UINT32 con_readchar(ps2_if_t *pIF) { - int c; + UINT8 c; static char mode = 0; static char nextrelease = 0; static char extended = 0; @@ -428,7 +443,7 @@ int con_readchar(ps2_if_t *pIF) if (char_valid) { -// printf("c = %c (%d), flags = 0x%08X, mode = 0x%08X\n", c, c, flags, mode); + // fprintf(stderr, "c = %c (%d), flags = 0x%08X, mode = 0x%08X\n", c, c, flags, mode); return c; } @@ -446,7 +461,7 @@ int UART_readchar(uart_if_t *pIF) if (!pIF) return -1; - if (sys_uart_bit_rx_avail & *pIF->pCTRL) + if (SYS_UART_BIT_RX_AVAIL & *pIF->pCTRL) return (*pIF->pDATA & 0xFF); return -1; @@ -457,18 +472,92 @@ void UART_writechar(uart_if_t *pIF, char c) if (!pIF) return; - while((sys_uart_bit_tx_halffull & *pIF->pCTRL) != 0); + while((SYS_UART_BIT_TX_HALFFULL & *pIF->pCTRL) != 0); *pIF->pDATA = (UINT32)c; } void cg_writechar(vga_if_t *pIF, char c) { + UINT32 code; + if (!pIF) return; - while (!(*pIF->pCTRL & sys_vga_bit_cgrdy)); - *pIF->pDATA = (UINT32)c; + // Output translation + switch(c) + { + case 'Ä': + code = 196; + break; + + case 'ä': + code = 228; + break; + + case 'Ö': + code = 214; + break; + + case 'ö': + code = 246; + break; + + case 'Ü': + code = 220; + break; + + case 'ü': + code = 252; + break; + + case '&': + code = 230; + break; + + case '§': + code = 167; + break; + + case 'ß': + code = 223; + break; + + case '°': + code = 176; + break; + + case 'µ': + code = 181; + break; + + default: + code = (UINT32)c; + break; + } + + while (!(*pIF->pCTRL & SYS_VGA_BIT_CGRDY)); + *pIF->pDATA = code; +} + +void cg_set_csr_x(vga_if_t *pIF, UINT32 coord) +{ + if (!pIF) + return; + + // Set cursor + while (!(*pIF->pCTRL & SYS_VGA_BIT_CGRDY)); + *pIF->pCSRX = coord; +} + +void cg_set_csr_y(vga_if_t *pIF, UINT32 coord) +{ + if (!pIF) + return; + + // Set cursor + while (!(*pIF->pCTRL & SYS_VGA_BIT_CGRDY)); + *pIF->pCSRY = coord; } void cg_clr_line(vga_if_t *pIF) @@ -476,8 +565,8 @@ void cg_clr_line(vga_if_t *pIF) if (!pIF) return; - while (!(*pIF->pCTRL & sys_vga_bit_cgrdy)); - *pIF->pCTRL |= sys_vga_bit_clrline; + while (!(*pIF->pCTRL & SYS_VGA_BIT_CGRDY)); + *pIF->pCTRL |= SYS_VGA_BIT_CLRLINE; } void cg_clr_screen(vga_if_t *pIF) @@ -486,23 +575,38 @@ void cg_clr_screen(vga_if_t *pIF) if (!pIF) return; - while (!(*pIF->pCTRL & sys_vga_bit_cgrdy)); - *pIF->pCTRL |= sys_vga_bit_clrscr; + while (!(*pIF->pCTRL & SYS_VGA_BIT_CGRDY)); + *pIF->pCTRL |= SYS_VGA_BIT_CLRSCR; // Cursor home - while (!(*pIF->pCTRL & sys_vga_bit_cgrdy)); + while (!(*pIF->pCTRL & SYS_VGA_BIT_CGRDY)); *pIF->pCSRX = 0; - while (!(*pIF->pCTRL & sys_vga_bit_cgrdy)); + while (!(*pIF->pCTRL & SYS_VGA_BIT_CGRDY)); *pIF->pCSRY = 0; } -void clr_screen(void) +void Screen_clr(void) { cg_clr_screen(&vga_if); } +void Screen_line_clr(void) +{ + cg_clr_line(&vga_if); +} + +void Screen_csr_set_x(UINT32 coord) +{ + cg_set_csr_x(&vga_if, coord); +} + +void Screen_csr_set_y(UINT32 coord) +{ + cg_set_csr_y(&vga_if, coord); +} + // --------------------------------------------------------------------------------- char readchar(UINT32 port) { @@ -572,15 +676,9 @@ void _putchar(UINT32 port, char c) cg_writechar((vga_if_t*)pIF->pIF, c); if (c == 0x0A) { + cg_clr_line((vga_if_t*)pIF->pIF); cg_writechar((vga_if_t*)pIF->pIF, 0x0D); - cg_clr_line((vga_if_t*)pIF->pIF); } - if (c == 0x0D) - { - cg_writechar((vga_if_t*)pIF->pIF, 0x0A); - cg_clr_line((vga_if_t*)pIF->pIF); - } - break; default: @@ -618,8 +716,8 @@ void sleep(unsigned ms) int getrusage(int who, struct rusage *usage) { - volatile long *pReg_usec = (long*)sys_timer_usec; - volatile long *pReg_sec = (long*)sys_timer_sec; + volatile long *pReg_usec = (long*)SYS_TIMER_USEC; + volatile long *pReg_sec = (long*)SYS_TIMER_SEC; // who: RUSAGE_SELF or RUSAGE_CHILDREN usage->ru_utime.tv_usec = *pReg_usec; @@ -630,8 +728,8 @@ int getrusage(int who, struct rusage *usage) clock_t times(struct tms *buffer) { - volatile long *pReg_usec = (long*)sys_timer_usec; - volatile long *pReg_sec = (long*)sys_timer_sec; + volatile long *pReg_usec = (long*)SYS_TIMER_USEC; + volatile long *pReg_sec = (long*)SYS_TIMER_SEC; long sec; long usec; @@ -651,8 +749,8 @@ clock_t times(struct tms *buffer) int gettimeofday(struct timeval *tp, void *tzp) { - volatile long *pReg_usec = (long*)sys_timer_usec; - volatile long *pReg_sec = (long*)sys_timer_sec; + volatile long *pReg_usec = (long*)SYS_TIMER_USEC; + volatile long *pReg_sec = (long*)SYS_TIMER_SEC; if (tp) { @@ -665,8 +763,8 @@ int gettimeofday(struct timeval *tp, void *tzp) int settimeofday(const struct timeval *tp, const struct timezone *tzp) { - volatile long *pReg_usec = (long*)sys_timer_usec; - volatile long *pReg_sec = (long*)sys_timer_sec; + volatile long *pReg_usec = (long*)SYS_TIMER_USEC; + volatile long *pReg_sec = (long*)SYS_TIMER_SEC; div_t res; res = div(tp->tv_usec, 1E6); @@ -746,10 +844,9 @@ int read(int file, char *ptr, int len) while (i < len) { c = readchar(port); + _putchar(port, c); if ((c == 0x0D) || (c == 0x0A)) { - writechar(port, 0x0D); - writechar(port, 0x0A); if (i==0) continue; @@ -759,7 +856,6 @@ int read(int file, char *ptr, int len) else { ptr[i++] = c; - writechar(port, c); } } return i;