#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 |
参考書