debug.c

来自「ADS下的bios工程」· C语言 代码 · 共 286 行

C
286
字号
#include <bios/stdio.h>#include <bios/nand.h>void debug(unsigned char *);static int get_hex(void);static int atoh(int, char *);static int get_int(void);static int atod(int, char *);static int power(int, int);void Dump_page(int, int);void Dump_block(int);void Dump(char *);extern void ser_init(void);extern void ser_write(const char *);extern int  ser_read(char *, int);extern int  ser_stat(void);extern void ser_init(void);char    page_buf[512];extern unsigned char Spare[16];void debug(unsigned char *Addr){    char ch = 0;    Dump(Addr);    while (ch != ESC) {        printf("\n===========================================\n");        printf("=   1. Next Memory Address View![Any Key] =\n");        printf("=   2. New Address Input![N]              =\n");        printf("===========================================\n");        ch = getc();        switch (ch) {            case 'N' :            case 'n' :                printf("Input Address(Hex value) : 0x");                Addr = (unsigned char *)get_hex();                Dump(Addr);                break ;            case ESC :                break ;            default :                Addr+=0x100;                Dump(Addr);                break ;        }    }}void debug_nand(int block, int page){    char ch = 0;    if (page < 0)        Dump_block(block);    else        Dump_page(block, page);    while (ch != ESC) {        printf("\n===========================================\n");        printf("=   1. Next %s View![Any Key]          =\n",               page < 0 ? "block": "page ");        printf("=   2. New %s Input![N]                =\n",               page < 0 ? "block":"page ");        printf("===========================================\n");        ch = getc();        switch (ch) {            case 'N':             case 'n':                printf("Input block(Decimal value) : ");                block = get_int();                if (page >= 0) {                    printf("Input page(Decimal value) : ");                    page = get_int();                }                if (page<0)                    Dump_block(block);                else                    Dump_page(block, page);                break ;            case ESC:                 break ;            default :                if (page < 0) {                    block ++;                    Dump_block(block);                }                 else {                    if (page == 31) {                         block ++;                         page = 0;                     }                    else                         page ++;                    Dump_page(block, page);                }                break ;        }    }}static int get_hex(void){    int    i;    char    ch, buffer[8];    while ((ch = getc()) == ' ' || ch == '\t' || ch == '\n' || ch == '\r')        ;    for (i = 0; ch != '\r' && ch != '\n' && i < 8; ) {        buffer[i] = ch;        if (ch == 0x8) {            if (i > 0) {                 putc(ch); putc(' '); putc(ch); i--;             }        }         else {             i ++; putc(ch);         }        ch = getc();    }    buffer[i] = 0x0;    putc('\n');    return  atoh(i - 1, buffer);}static int atoh(int digit, char *buffer){    int     i, temp;    for (i = 0, temp = 0; i < 8 && (buffer[i] != 0x0); i++) {        if (buffer[i] <= 0x39 && buffer[i] >= 0x30)            temp += (int)(buffer[i] - 0x30) * power(16, digit - i);        else if (buffer[i] <= 0x46 && buffer[i] >= 0x41)            temp += (int)(buffer[i] - 0x41 + 10) * power(16, digit - i);        else if (buffer[i] <= 0x66 && buffer[i] >= 0x61)            temp += (int)(buffer[i] - 0x61 + 10) * power(16, digit - i);    }    return  temp;}static int power(int base, int expon){    int    i, sum;    for (i = 0, sum = 1; i < expon; i ++)        sum *= base;    return  sum;}static int get_int(void){    int    i;    char    ch, buffer[8];    while ((ch = getc()) == ' ' || ch == '\t' || ch == '\n' || ch == '\r')        ;    for (i = 0; ch != '\r' && ch != '\n' && i < 8; ) {        buffer[i] = ch;        if (ch == 0x8) {            if (i > 0) {                 putc(ch); putc(' '); putc(ch); i --;             }        }         else {             i ++; putc(ch);         }        ch = getc();    }    buffer[i] = 0x0;    putc('\n');    return  atod(i - 1, buffer);}static int atod(int digit, char *buffer){    int    i, temp;    for (i = 0, temp = 0; i < 8 && (buffer[i] != 0x0); i ++) {        if (buffer[i] <= 0x39 && buffer[i] >= 0x30)            temp += (int)(buffer[i] - 0x30)*power(10,digit-i);        else            printf("Input Error\n");    }    return  temp;}void Dump(char *Addr){    int    i, j;    for (i = 0; i < 0x100; i += 0x10) {        printf("\n%08x:%08x   ", (int)Addr + i, (int)Addr + i + 0xf);        for (j = 0; j < 8; j ++)            printf("%02x ", *(Addr + i + j));        printf(" -  ");        for ( ; j < 16; j ++)            printf("%02x ", *(Addr + i + j));    }    printf("\n");}void Dump_block(int block){    int    i, j;    printf("\n< block : %d >", block);    for (i = 0; i < 32; i ++) {        nand_flash_control(nand_read, block, i, page_buf, 512);        printf("\n%02d page  ", i);        for (j = 0; j < 0x8; j ++)             printf("%02x", *(page_buf + j));        printf("..... ");        for (j = 0; j < 0x8; j ++)             printf("%02x", *(page_buf + 256 + j));        printf("..... ");        for (j = 0; j < 16; j ++)              printf("%02x", Spare[j]);    }    printf("\n");}void Dump_page(int block, int page){    int    i, j;    nand_flash_control(nand_read, block, page, page_buf, 512);    printf("\n< block : %d, page : %d >", block, page);    for (i = 0; i < 512; i += 0x20) {        printf("\n%04x:%04x ", i, i + 0x1f);        for (j = 0; j < 0x20; j ++) {            if (!(j % 4))                printf(" ");            printf("%02x", *(page_buf + i + j));        }    }    printf("\nSpare      ");    for (i = 0; i < 16; i ++) {        printf("%02x ", Spare[i]);    }    printf("\n");}void debug_init(void){    ser_init();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?