#define UARTADDRESS (unsigned int *)0xf0000100 #define REFFREQ 50000000 volatile unsigned int* _uartaddr = UARTADDRESS; volatile unsigned int _uartstate; /* 地址 0 -- 读接收数据 1 -- 写发送数据 2 -- 得到状态 [0] -- send buffer ready [10:1] -- send buffer used [16] -- recv buffer ready [26:17] -- recv buffer used */ int _canputchar() { _uartstate = _uartaddr[2]; return ((_uartstate & 1) == 0); } int _haschar() { _uartstate = _uartaddr[2]; return ((_uartstate & 0x10000) == 0); } int _putchar(int ch) { _uartstate = _uartaddr[2]; if ((_uartstate & 1) == 0) { _uartaddr[1] = ch; return 0; } return -1; } int _getchar() { _uartstate = _uartaddr[2]; if ((_uartstate & 0x10000) == 0) { return _uartaddr[0]; } return -1; } int _puts(char* s) { while (*s) { while (_putchar(*s) == -1) ; s++; } return 0; } int _gets(char* s, int buflen) { int ind, ch; ind = 0; if (buflen <= 1) return 0; do { ch = _getchar(); if (ch != -1) { s[ind++] = ch; while(_putchar(ch) == -1) /* 回显 */ ; if (ind >= buflen - 1) break; if (ch == '\n' || ch == '\r') break; } } while (1); s[ind] = 0; return ind; } int _d2s(char* buf, int num) { int i; int len; int sign; len = 0; sign = 0; if (num < 0) { num = -num; sign = 0; } while (num > 0) { buf[len++] = (num % 10) + '0'; num /= 10; } if (sign) buf[len++] = '-'; for (i = 0; i < len / 2; i++) { int di = len - 1 - i; char temp; temp = buf[i]; buf[i] = buf[di]; buf[di] = temp; } buf[len] = 0; return len; } int _h2s(char* buf, unsigned int num, int fixlen, char lead) { int i; int len; len = 0; while (num > 0) { int n = num & 0xf; if (n < 10) buf[len] = n + '0'; else buf[len] = n + 'a' - 10; num >>= 4; len++; } while (len < fixlen) { buf[len++] = lead; } for (i = 0; i < len / 2; i++) { int di = len - 1 - i; char temp; temp = buf[i]; buf[i] = buf[di]; buf[di] = temp; } buf[len] = 0; return len; } int _s2d(char* buf, char** next) { int state; int ret; int sign; state = 0; ret = 0; sign = 1; while (*buf) { int ch; ch = *buf; if (ch >= '0' && ch <= '9') { ret = ret * 10 + ch - '0'; state = 1; } else { if (state == 0) { if (ch == '-') { sign = -1; state = 1; } } else { break; } } buf++; } ret *= sign; if (next != 0) { *next = buf; } return ret; } int _s2h(char* buf, char** next) { int state; int ret; state = 0; ret = 0; while (*buf) { int ch; ch = *buf; if (ch >= '0' && ch <= '9') { state = 1; ret = (ret << 4) + ch - '0'; } else if (ch >= 'a' && ch <= 'f') { state = 1; ret = (ret << 4) + ch - 'a' + 10; } else if (ch >= 'A' && ch <= 'F') { state = 1; ret = (ret << 4) + ch - 'A' + 10; } else { if (state == 0) state = 1; else break; } buf++; } if (next != 0) { *next = buf; } return ret; } int _strlen(char* s) { char* ss; ss = s; while (*s) s++; return s - ss; } int _strcpy(char* s, const char* t) { char* ss = s; while (*t) *s++ = *t++; *s = 0; return s - ss; } int _strcat(char* s, const char* t) { char* ss = s; while (*s) s++; while (*t) *s++ = *t++; *s = 0; return s - ss; } int _strcmp(char* s, const char* t) { while (*s && *t) { if (*s++ != *t++) return 1; } return 0; } int _strncmp(char* s, const char* t, int n) { int count; count = 0; while (*s && *t) { if (*s++ != *t++) return 1; count++; if (count >= n) return 0; } return 0; } int _buadrateset(int baud) { _uartaddr[4] = REFFREQ / baud; return 0; } unsigned int displayaddr = 0; void dispmem() { int i, j, len; unsigned int startaddr = displayaddr & 0xfffffff0; char buf[256]; for (j = 0; j < 16; j++) { _h2s(buf, startaddr, 8, '0'); len = _strcat(buf, " "); for (i = 0; i < 16; i++) { unsigned char* disp = (unsigned char*)startaddr; if (startaddr + i < displayaddr) { len = _strcat(buf, " "); } else { char temp[8]; _h2s(temp, disp[i], 2, '0'); _strcat(temp, " "); len = _strcat(buf, temp); } if (i == 7) _strcat(buf, "- "); } _strcat(buf, " |"); for (i = 0; i < 16; i++) { unsigned char* disp = (unsigned char*)startaddr; char temp[2]; if (disp[i] > 0x20 && disp[i] < 0x7f) { temp[0] = disp[i]; } else { temp[0] = '.'; } temp[1] = 0; _strcat(buf, temp); } _strcat(buf, "|\n"); _puts(buf); startaddr += 16; if ( (startaddr & 0xff) == 0) break; } _puts("\n"); displayaddr = startaddr; } int main(int argc, char* argv[]) { _buadrateset(115200); _puts("Hello, World\n"); do { char buf[256]; _puts(">>"); _gets(buf, 255); _puts(":"); _puts(buf); if (_strncmp(buf, "help ", 4) == 0) { _puts(" d -- display memory \n"); _puts(" b -- set baudrate \n"); } else if (_strncmp(buf, "b", 1) == 0) { int baud = _s2d(buf+2, 0); if (baud > 0) { _buadrateset(baud); } } else if (_strncmp(buf, "d", 1) == 0) { int addr = _s2h(buf + 2, 0); if (addr > 0) { displayaddr = addr; } dispmem(); } } while (1); return 1; }