#define EXTIO_PRINT_STROKE (*(volatile unsigned int *) 0x0300) #define EXTIO_PRINT_ASCII (*(volatile unsigned int *) 0x0304) void my_print(); main() { unsigned int string[64]; string[0] = 'H'; string[1] = 'E'; string[2] = 'L'; string[3] = 'L'; string[4] = 'O'; string[5] = '!'; string[6] = '!'; string[7] = '\0'; my_print(string); string[0] = 'B'; string[1] = '\0'; } void my_print(str) unsigned int *str; { while (*str != '\0') { EXTIO_PRINT_STROKE = (unsigned int)0x00000000; if ((*str >= 'A') && (*str <= 'Z')) { EXTIO_PRINT_ASCII = *str - 'A' + 1; } else if ((*str >= 'a') && (*str <= 'z')) { EXTIO_PRINT_ASCII = *str - 'a' + 1; } else if ((*str >= '0') && (*str <= '9')) { EXTIO_PRINT_ASCII = *str - '0' + 48; } else { if (*str == '@') { EXTIO_PRINT_ASCII = (unsigned int)0; } else if (*str == '[') { EXTIO_PRINT_ASCII = (unsigned int)27; } else if (*str == ']') { EXTIO_PRINT_ASCII = (unsigned int)29; } else if ((*str >= ' ') && (*str <= '/')) { EXTIO_PRINT_ASCII = *str - ' ' + 32; } else if (*str == '?') { EXTIO_PRINT_ASCII = (unsigned int)58; } else if (*str == '=') { EXTIO_PRINT_ASCII = (unsigned int)59; } else if (*str == ';') { EXTIO_PRINT_ASCII = (unsigned int)60; } else if (*str == ':') { EXTIO_PRINT_ASCII = (unsigned int)61; } else { EXTIO_PRINT_ASCII = (unsigned int)0x00000000; } } EXTIO_PRINT_STROKE = (unsigned int)0x00000001; str++; } } |
cross_compile.sh my_print.c |
bin2v my_print.bin |
<省略> case (word_addr) <省略> 10'h00b: data = 32'h03a0f021; // 0040002c: ADDU, REG[30]<=REG[29]+REG[0]; ここが PC=0x002c の命令 10'h00c: data = 32'h24020048; // 00400030: ADDIU, REG[2]<=REG[0]+72(=0x00000048); 10'h00d: data = 32'hafc20010; // 00400034: SW, RAM[REG[30]+16]<=REG[2]; 10'h00e: data = 32'h24020045; // 00400038: ADDIU, REG[2]<=REG[0]+69(=0x00000045); 10'h00f: data = 32'hafc20014; // 0040003c: SW, RAM[REG[30]+20]<=REG[2]; 10'h010: data = 32'h2402004c; // 00400040: ADDIU, REG[2]<=REG[0]+76(=0x0000004c); 10'h011: data = 32'hafc20018; // 00400044: SW, RAM[REG[30]+24]<=REG[2]; 10'h012: data = 32'h2402004c; // 00400048: ADDIU, REG[2]<=REG[0]+76(=0x0000004c); 10'h013: data = 32'hafc2001c; // 0040004c: SW, RAM[REG[30]+28]<=REG[2]; 10'h014: data = 32'h2402004f; // 00400050: ADDIU, REG[2]<=REG[0]+79(=0x0000004f); 10'h015: data = 32'hafc20020; // 00400054: SW, RAM[REG[30]+32]<=REG[2]; 10'h016: data = 32'h24020021; // 00400058: ADDIU, REG[2]<=REG[0]+33(=0x00000021); 10'h017: data = 32'hafc20024; // 0040005c: SW, RAM[REG[30]+36]<=REG[2]; 10'h018: data = 32'h24020021; // 00400060: ADDIU, REG[2]<=REG[0]+33(=0x00000021); 10'h019: data = 32'hafc20028; // 00400064: SW, RAM[REG[30]+40]<=REG[2]; 10'h01a: data = 32'hafc0002c; // 00400068: SW, RAM[REG[30]+44]<=REG[0]; 10'h01b: data = 32'h27c20010; // 0040006c: ADDIU, REG[2]<=REG[30]+16(=0x00000010); 10'h01c: data = 32'h00402021; // 00400070: ADDU, REG[4]<=REG[2]+REG[0]; 10'h01d: data = 32'h0c100028; // 00400074: JAL, PC<=0x00100028*4(=0x004000a0); REG[31]<=PC+4 ここが 命令メモリ 0x01d の命令 <省略> endcase <省略> |
quartus_sh --flow compile DE2_115_Default |
参考書