#define EXTIO_SCAN_ASCII (*(volatile unsigned int *)0x0310) #define EXTIO_SCAN_REQ (*(volatile unsigned int *)0x030c) #define EXTIO_SCAN_STROKE (*(volatile unsigned int *)0x0308) #define SCAN_STRORING (unsigned int)0xffffffff #define EXTIO_PRINT_STROKE (*(volatile unsigned int *) 0x0300) #define EXTIO_PRINT_ASCII (*(volatile unsigned int *) 0x0304) void my_print(); void my_scan(); main() { unsigned int string1[32]; unsigned int string2[32]; string1[0] = 'H'; string1[1] = 'E'; string1[2] = 'L'; string1[3] = 'L'; string1[4] = 'O'; string1[5] = '!'; string1[6] = '!'; string1[7] = '\n'; string1[8] = '\0'; my_print(string1); while (1) { string1[0] = 'S'; string1[1] = 'T'; string1[2] = 'R'; string1[3] = 'I'; string1[4] = 'N'; string1[5] = 'G'; string1[6] = '='; string1[7] = '\0'; my_print(string1); my_scan(string2); string1[0] = 'E'; string1[1] = 'C'; string1[2] = 'H'; string1[3] = 'O'; string1[4] = ' '; string1[5] = '\0'; my_print(string1); my_print(string2); string1[0] = '\n'; string1[1] = '\0'; my_print(string1); } } void my_scan(str) unsigned int *str; { EXTIO_SCAN_STROKE = (unsigned int)0x00000000; EXTIO_SCAN_REQ = (unsigned int)0x00000001; EXTIO_SCAN_STROKE = (unsigned int)0x00000001; EXTIO_SCAN_STROKE = (unsigned int)0x00000000; EXTIO_SCAN_STROKE = (unsigned int)0x00000001; while (EXTIO_SCAN_ASCII == SCAN_STRORING) { EXTIO_SCAN_STROKE = (unsigned int)0x00000000; EXTIO_SCAN_STROKE = (unsigned int)0x00000001; } while ((*str = EXTIO_SCAN_ASCII) != (unsigned int)0x3e) { // 0x3e=RETURN if ((*str >= 1) && (*str <= 26)) { *str = 'A' + *str - 1; } else if ((*str >= 48) && (*str <= 57)) { *str = '0' + *str - 48; } else { if (*str == 0) { *str = '@'; } else if (*str == 27) { *str = '['; } else if (*str == 29) { *str = ']'; } else if ((*str >= 32) && (*str <= 47)) { *str = ' ' + *str - 32; } else if (*str == 58) { *str = '?'; } else if (*str == 59) { *str = '='; } else if (*str == 60) { *str = ';'; } else if (*str == 61) { *str = ':'; } else if (*str == 62) { *str = '\n'; } else { *str = '@'; } } EXTIO_SCAN_STROKE = (unsigned int)0x00000000; EXTIO_SCAN_STROKE = (unsigned int)0x00000001; str++; } *str = '\0'; EXTIO_SCAN_STROKE = (unsigned int)0x00000000; EXTIO_SCAN_REQ = (unsigned int)0x00000000; EXTIO_SCAN_STROKE = (unsigned int)0x00000001; EXTIO_SCAN_STROKE = (unsigned int)0x00000000; } 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 if (*str == '\n') { EXTIO_PRINT_ASCII = (unsigned int)62; } else { EXTIO_PRINT_ASCII = (unsigned int)0x00000000; } } EXTIO_PRINT_STROKE = (unsigned int)0x00000001; str++; } } |
cross_compile.sh my_scan.c |
bin2v my_scan.bin |
<省略> case (word_addr) <省略> 10'h00b: data = 32'h03a0f021; // 0040002c: ADDU, REG[30]<=REG[29]+REG[0]; ここが PC=0x002c の命令 <省略> 10'h01f: data = 32'h0c100136; // 0040007c: JAL, PC<=0x00100136*4(=0x004004d8); REG[31]<=PC+4 <省略> 10'h136: data = 32'h27bdfff8; // 004004d8: ADDIU, REG[29]<=REG[29]+65528(=0x0000fff8); 10'h137: data = 32'hafbe0000; // 004004dc: SW, RAM[REG[29]+0]<=REG[30]; 10'h138: data = 32'h03a0f021; // 004004e0: ADDU, REG[30]<=REG[29]+REG[0]; 10'h139: data = 32'hafc40008; // 004004e4: SW, RAM[REG[30]+8]<=REG[4]; 10'h13a: data = 32'h081001f8; // 004004e8: J, PC<=0x001001f8*4(=0x004007e0); <省略> 10'h1f8: data = 32'h8fc20008; // 004007e0: LW, REG[2]<=RAM[REG[30]+8]; 10'h1f9: data = 32'h00000000; // 004007e4: SLL, REG[0]<=REG[0]<<0; 10'h1fa: data = 32'h8c420000; // 004007e8: LW, REG[2]<=RAM[REG[2]+0]; 10'h1fb: data = 32'h00000000; // 004007ec: SLL, REG[0]<=REG[0]<<0; 10'h1fc: data = 32'h1440ff3f; // 004007f0: BNE, PC<=(REG[2] != REG[0])?PC+4+65343*4:PC+4; 10'h1fd: data = 32'h00000000; // 004007f4: SLL, REG[0]<=REG[0]<<0; 10'h1fe: data = 32'h03c0e821; // 004007f8: ADDU, REG[29]<=REG[30]+REG[0]; 10'h1ff: data = 32'h8fbe0000; // 004007fc: LW, REG[30]<=RAM[REG[29]+0]; 10'h200: data = 32'h27bd0008; // 00400800: ADDIU, REG[29]<=REG[29]+8(=0x00000008); 10'h201: data = 32'h03e00008; // 00400804: JR, PC<=REG[31]; ここが 命令メモリ 0x201 の命令 <省略> endcase <省略> |
quartus_sh --flow compile DE2_115_Default |
参考書