/* GXEmul Utilities Packages */ #define PUTCHAR_ADDRESS ((signed int)0xb0000000) #define HALT_ADDRESS ((signed int)0xb0000010) const char dec_digits[] = "0123456789"; const char hex_digits[] = "0123456789abcdef"; void printchar(char ch) { *((volatile unsigned char *) PUTCHAR_ADDRESS) = ch; } void halt(void) { *((volatile unsigned char *) HALT_ADDRESS) = 0; } void printstr(char * s){ while(*s) printchar(*s++); } void print_uint(unsigned int v){ char s[15]; unsigned int i = 0, j; if(!v) { s[0] = dec_digits[0]; return; } for(j = v; j != 0; i++, j /= 10); s[i] = '\0'; for(j = 0; v != 0; j++, v /= 10) s[i - 1 - j] = dec_digits[v % 10]; printstr((char *)&s); } void print_int(int v){ char s[15]; unsigned int i = 0, j; if(!v) { s[0] = dec_digits[0]; return; } if(v < 0) { v = -v; s[i++] = '-'; } for(j = v; j != 0; i++, j /= 10); s[i] = '\0'; for(j = 0; v != 0; j++, v /= 10) s[i - 1 - j] = dec_digits[v % 10]; printstr((char *)&s); } void print_hex(unsigned int p) { char s[15]; unsigned int j, v = (unsigned int)p; s[0] = '0'; s[1] = 'x'; for(j = 0; j < sizeof(void *) * 2; j++, v >>= 4) s[2 + sizeof(void *) * 2 - 1 - j] = hex_digits[v & 0xf]; s[10] = '\0'; printstr((char *)&s); } void print_register(const unsigned int number){ unsigned int value; switch(number){ case 0: asm("move %0, $0 #R0":"=r"(value):); break; case 1: asm(".set noat; move %0, $1 ; .set at":"=r"(value):); break; case 2: asm("move %0, $2 #R0":"=r"(value):); break; case 3: asm("move %0, $3 #R0":"=r"(value):); break; case 4: asm("move %0, $4 #R0":"=r"(value):); break; case 5: asm("move %0, $5 #R0":"=r"(value):); break; case 6: asm("move %0, $6 #R0":"=r"(value):); break; case 7: asm("move %0, $7 #R0":"=r"(value):); break; case 8: asm("move %0, $8 #R0":"=r"(value):); break; case 9: asm("move %0, $9 #R0":"=r"(value):); break; case 10: asm("move %0, $10 #R0":"=r"(value):); break; case 11: asm("move %0, $11 #R0":"=r"(value):); break; case 12: asm("move %0, $12 #R0":"=r"(value):); break; case 13: asm("move %0, $13 #R0":"=r"(value):); break; case 14: asm("move %0, $14 #R0":"=r"(value):); break; case 15: asm("move %0, $15 #R0":"=r"(value):); break; case 16: asm("move %0, $16 #R0":"=r"(value):); break; case 17: asm("move %0, $17 #R0":"=r"(value):); break; case 18: asm("move %0, $18 #R0":"=r"(value):); break; case 19: asm("move %0, $19 #R0":"=r"(value):); break; case 20: asm("move %0, $20 #R0":"=r"(value):); break; case 21: asm("move %0, $21 #R0":"=r"(value):); break; case 22: asm("move %0, $22 #R0":"=r"(value):); break; case 23: asm("move %0, $23 #R0":"=r"(value):); break; case 24: asm("move %0, $24 #R0":"=r"(value):); break; case 25: asm("move %0, $25 #R0":"=r"(value):); break; case 26: asm("move %0, $26 #R0":"=r"(value):); break; case 27: asm("move %0, $27 #R0":"=r"(value):); break; case 28: asm("move %0, $28 #R0":"=r"(value):); break; case 29: asm("move %0, $29 #R0":"=r"(value):); break; case 30: asm("move %0, $30 #R0":"=r"(value):); break; case 31: asm("move %0, $31 #R0":"=r"(value):); break; } printchar('R'); print_int(number); printchar('='); print_hex(value); printstr(" \n"); }