// for mips-tetris assume main is at 0x400000
cpu->registers[PC] = 0x400000;
cpu->next_pc = cpu->registers[PC] + 4;
- cpu->registers[R29] = 0x103ffffc;
+ cpu->registers[R29] = 0x103ffffc; // sp -> last word of 4 Mbyte .data section
while (true) {
#if REG_TRACE
#endif
cpu_update(cpu);
+ if (cpu->exception_pending == Syscall) {
+ switch (cpu->registers[R2]) {
+ case 1: /* print char */
+ fputc(cpu->registers[R4], stdout);
+ break;
+ case 4: /* print string */
+ {
+ int c;
+ for (int p = cpu->registers[R4]; (c = read_byte(NULL, p)) != 0; ++p)
+ fputc(c, stdout);
+ }
+ break;
+ case 5: /* integer input */
+ {
+ fflush(stdout);
+
+ char buf[0x100];
+ if (fgets(buf, 0x100, stdin) == NULL) {
+ perror("fgets()");
+ exit(EXIT_FAILURE);
+ }
+ cpu->registers[R10] = atoi(buf);
+ }
+ break;
+ case 10: /* end program */
+ exit(EXIT_SUCCESS);
+ default:
+ fprintf(stderr, "unimplemented syscall %d\n", cpu->registers[R2]);
+ exit(EXIT_FAILURE);
+ }
+ cpu->exception_pending = NoException;
+ cpu->registers[PC] = cpu->next_pc;
+ cpu->next_pc += 4;
+ }
}
#else
struct cpu_mips cpu;