📄 compile.c
字号:
eas.s.ea_nop.s.srcbbyte = LABEL_REFN (FETCH_NOP, 1); eas.s.ea_nop.s.srcbword = LABEL_REFN (FETCH_NOP, 1); eas.s.ea_nop.s.dstbyte = LABEL_REF (STORE_NOP); eas.s.ea_nop.s.dstword = LABEL_REF (STORE_NOP); eas.s.ea_cr.s.srcabyte = LABEL_REFN (FETCH_CRB, 0); eas.s.ea_cr.s.srcaword = LABEL_REFN (FETCH_CRW, 0); eas.s.ea_cr.s.srcbbyte = LABEL_REFN (FETCH_CRB, 1); eas.s.ea_cr.s.srcbword = LABEL_REFN (FETCH_CRW, 1); eas.s.ea_cr.s.dstbyte = LABEL_REF (STORE_CRB); eas.s.ea_cr.s.dstword = LABEL_REF (STORE_CRW); eas.s.ea_reg.s.srcabyte = LABEL_REFN (FETCH_REG_B, 0); eas.s.ea_reg.s.srcaword = LABEL_REFN (FETCH_REG_W, 0); eas.s.ea_reg.s.srcalong = LABEL_REFN (FETCH_REG_L, 0); eas.s.ea_reg.s.srcbbyte = LABEL_REFN (FETCH_REG_B, 1); eas.s.ea_reg.s.srcbword = LABEL_REFN (FETCH_REG_W, 1); eas.s.ea_reg.s.srcblong = LABEL_REFN (FETCH_REG_L, 1); eas.s.ea_reg.s.dstbyte = LABEL_REF (STORE_REG_B); eas.s.ea_reg.s.dstword = LABEL_REF (STORE_REG_W); eas.s.ea_reg.s.dstlong = LABEL_REF (STORE_REG_L); eas.s.ea_inc.s.srcabyte = LABEL_REFN (FETCH_INC_B, 0); eas.s.ea_inc.s.srcaword = LABEL_REFN (FETCH_INC_W, 0); eas.s.ea_inc.s.srcbbyte = LABEL_REFN (FETCH_INC_B, 1); eas.s.ea_inc.s.srcbword = LABEL_REFN (FETCH_INC_W, 1); eas.s.ea_inc.s.dstbyte = LABEL_REF (STORE_INC_B); eas.s.ea_inc.s.dstword = LABEL_REF (STORE_INC_W); eas.s.ea_dec.s.srcabyte = LABEL_REFN (FETCH_DEC_B, 0); eas.s.ea_dec.s.srcaword = LABEL_REFN (FETCH_DEC_W, 0); eas.s.ea_dec.s.srcbbyte = LABEL_REFN (FETCH_DEC_B, 1); eas.s.ea_dec.s.srcbword = LABEL_REFN (FETCH_DEC_W, 1); eas.s.ea_dec.s.dstbyte = LABEL_REF (STORE_DEC_B); eas.s.ea_dec.s.dstword = LABEL_REF (STORE_DEC_W); eas.s.ea_disp.s.srcabyte = LABEL_REFN (FETCH_DISP_B, 0); eas.s.ea_disp.s.srcaword = LABEL_REFN (FETCH_DISP_W, 0); eas.s.ea_disp.s.srcbbyte = LABEL_REFN (FETCH_DISP_B, 1); eas.s.ea_disp.s.srcbword = LABEL_REFN (FETCH_DISP_W, 1); eas.s.ea_disp.s.dstbyte = LABEL_REF (STORE_DISP_B); eas.s.ea_disp.s.dstword = LABEL_REF (STORE_DISP_W); eas.s.ea_imm.s.srcabyte = LABEL_REFN (FETCH_IMM, 0); eas.s.ea_imm.s.srcaword = LABEL_REFN (FETCH_IMM, 0); eas.s.ea_imm.s.srcbbyte = LABEL_REFN (FETCH_IMM, 1); eas.s.ea_imm.s.srcbword = LABEL_REFN (FETCH_IMM, 1); flag_special = LABEL_REF (FLAG_special); flag_mp = LABEL_REF (FLAG_m); flag_Mp = LABEL_REF (FLAG_M); flag_ap = LABEL_REF (FLAG_a); flag_Ap = LABEL_REF (FLAG_A); flag_nonep = LABEL_REF (FLAG_NONE); flag_nostorep = LABEL_REF (FLAG_NOSTORE); flag_clearp = LABEL_REF (FLAG_CLEAR); flag_shiftbyte = LABEL_REF (FLAG_shiftbyte); flag_shiftword = LABEL_REF (FLAG_shiftword); flag_multbyte = LABEL_REF (FLAG_multbyte); flag_multword = LABEL_REF (FLAG_multword); exec_dispatch[O_ADDS] = LABEL_REF (O_ADDS); exec_dispatch[O_ADDX] = LABEL_REF (O_ADDX); exec_dispatch[O_ADD] = LABEL_REF (O_ADD); exec_dispatch[O_ANDC] = LABEL_REF (O_ANDC); exec_dispatch[O_AND] = LABEL_REF (O_AND); exec_dispatch[O_BCC] = LABEL_REF (O_BCC); exec_dispatch[O_BCLR] = LABEL_REF (O_BCLR); exec_dispatch[O_BCS] = LABEL_REF (O_BCS); exec_dispatch[O_BEQ] = LABEL_REF (O_BEQ); exec_dispatch[O_BF] = LABEL_REF (O_BF); exec_dispatch[O_BGE] = LABEL_REF (O_BGE); exec_dispatch[O_BGT] = LABEL_REF (O_BGT); exec_dispatch[O_BHI] = LABEL_REF (O_BHI); exec_dispatch[O_BHS] = LABEL_REF (O_BHS); exec_dispatch[O_BLE] = LABEL_REF (O_BLE); exec_dispatch[O_BLO] = LABEL_REF (O_BLO); exec_dispatch[O_BLS] = LABEL_REF (O_BLS); exec_dispatch[O_BLT] = LABEL_REF (O_BLT); exec_dispatch[O_BMI] = LABEL_REF (O_BMI); exec_dispatch[O_BNE] = LABEL_REF (O_BNE); exec_dispatch[O_BNOT] = LABEL_REF (O_BNOT); exec_dispatch[O_BPL] = LABEL_REF (O_BPL); exec_dispatch[O_BPT] = LABEL_REF (O_BPT); exec_dispatch[O_BRA] = LABEL_REF (O_BRA); exec_dispatch[O_BRN] = LABEL_REF (O_BRN); exec_dispatch[O_BSET] = LABEL_REF (O_BSET); exec_dispatch[O_BSR] = LABEL_REF (O_BSR); exec_dispatch[O_BTST] = LABEL_REF (O_BTST); exec_dispatch[O_BT] = LABEL_REF (O_BT); exec_dispatch[O_BVC] = LABEL_REF (O_BVC); exec_dispatch[O_BVS] = LABEL_REF (O_BVS); exec_dispatch[O_CLR] = LABEL_REF (O_CLR); exec_dispatch[O_CMP] = LABEL_REF (O_CMP); exec_dispatch[O_DADD] = LABEL_REF (O_DADD); exec_dispatch[O_DIVXU] = LABEL_REF (O_DIVXU); exec_dispatch[O_DSUB] = LABEL_REF (O_DSUB); exec_dispatch[O_EXTS] = LABEL_REF (O_EXTS); exec_dispatch[O_EXTU] = LABEL_REF (O_EXTU); exec_dispatch[O_JMP] = LABEL_REF (O_JMP); exec_dispatch[O_JSR] = LABEL_REF (O_JSR); exec_dispatch[O_LDC] = LABEL_REF (O_LDC); exec_dispatch[O_LDM] = LABEL_REF (O_LDM); exec_dispatch[O_LINK] = LABEL_REF (O_LINK); exec_dispatch[O_MOVFPE] = LABEL_REF (O_MOVFPE); exec_dispatch[O_MOVTPE] = LABEL_REF (O_MOVTPE); exec_dispatch[O_MOV] = LABEL_REF (O_MOV); exec_dispatch[O_MULXU] = LABEL_REF (O_MULXU); exec_dispatch[O_NEG] = LABEL_REF (O_NEG); exec_dispatch[O_NOP] = LABEL_REF (O_NOP); exec_dispatch[O_NOT] = LABEL_REF (O_NOT); exec_dispatch[O_ORC] = LABEL_REF (O_ORC); exec_dispatch[O_OR] = LABEL_REF (O_OR); exec_dispatch[O_PJMP] = LABEL_REF (O_PJMP); exec_dispatch[O_PJSR] = LABEL_REF (O_PJSR); exec_dispatch[O_PRTD] = LABEL_REF (O_PRTD); exec_dispatch[O_PRTS] = LABEL_REF (O_PRTS); exec_dispatch[O_RECOMPILE] = LABEL_REF (O_RECOMPILE); exec_dispatch[O_ROTL] = LABEL_REF (O_ROTL); exec_dispatch[O_ROTR] = LABEL_REF (O_ROTR); exec_dispatch[O_ROTXL] = LABEL_REF (O_ROTXL); exec_dispatch[O_ROTXR] = LABEL_REF (O_ROTXR); exec_dispatch[O_RTD] = LABEL_REF (O_RTD); exec_dispatch[O_RTS] = LABEL_REF (O_RTS); exec_dispatch[O_SCB_EQ] = LABEL_REF (O_SCB_EQ); exec_dispatch[O_SCB_F] = LABEL_REF (O_SCB_F); exec_dispatch[O_SCB_NE] = LABEL_REF (O_SCB_NE); exec_dispatch[O_SHAL] = LABEL_REF (O_SHAL); exec_dispatch[O_SHAR] = LABEL_REF (O_SHAR); exec_dispatch[O_SHLL] = LABEL_REF (O_SHLL); exec_dispatch[O_SHLR] = LABEL_REF (O_SHLR); exec_dispatch[O_SLEEP] = LABEL_REF (O_SLEEP); exec_dispatch[O_STC] = LABEL_REF (O_STC); exec_dispatch[O_STM] = LABEL_REF (O_STM); exec_dispatch[O_SUBS] = LABEL_REF (O_SUBS); exec_dispatch[O_SUBX] = LABEL_REF (O_SUBX); exec_dispatch[O_SUB] = LABEL_REF (O_SUB); exec_dispatch[O_SWAP] = LABEL_REF (O_SWAP); exec_dispatch[O_TAS] = LABEL_REF (O_TAS); exec_dispatch[O_TRAPA] = LABEL_REF (O_TRAPA); exec_dispatch[O_TRAP_VS] = LABEL_REF (O_TRAP_VS); exec_dispatch[O_TST] = LABEL_REF (O_TST); exec_dispatch[O_UNLK] = LABEL_REF (O_UNLK); exec_dispatch[O_XCH] = LABEL_REF (O_XCH); exec_dispatch[O_XORC] = LABEL_REF (O_XORC); exec_dispatch[O_XOR] = LABEL_REF (O_XOR); nop.type = eas.s.ea_nop.s.srcabyte; cpu.cache[0].opcode = exec_dispatch[O_RECOMPILE]; cpu.cache[0].srca.type = eas.s.ea_nop.s.srcabyte; cpu.cache[0].srcb.type = eas.s.ea_nop.s.srcbbyte; } prev = signal (SIGINT, control_c); prev_seg = signal (SIGSEGV, segv); if (step) { cpu.exception = SIGTRAP; } else { cpu.exception = 0; } pc = cpu.regs[R_PC].s[LOW] + (NORMAL_CP << 16); GETSR (); if (setjmp (jbuf) == 0) { do { int cidx; decoded_inst *code; top: cidx = cpu.cache_idx[pc]; code = cpu.cache + cidx; FETCH (arga, code->srca, 0); FETCH (argb, code->srcb, 1); #ifdef DEBUG if (debug) { printf ("%x %d %s\n", pc, code->opcode, code->op ? code->op->name : "**"); }#endif cycles += code->cycles; insts++; DISPATCH (code->opcode) { LABEL (O_RECOMPILE): /* This opcode is a fake for when we get to an instruction which hasn't been compiled */ compile (pc); goto top; break; LABEL (O_NEG): arga = -arga; argb = 0; res = arga + argb; break; LABEL (O_SUBX): arga += C; LABEL (O_SUB): LABEL (O_SUBS): arga = -arga; LABEL (O_ADD): LABEL (O_ADDS): res = arga + argb; break; LABEL (O_ADDX): res = arga + argb + C; break; LABEL (O_AND): LABEL (O_ANDC): res = arga & argb; break; break; LABEL (O_BCLR): arga &= 0xf; bit = (argb & (1 << arga)); res = argb & ~(1 << arga); goto bitop; LABEL (O_BRA): LABEL (O_BT): if (1) goto condtrue; LABEL (O_BRN): LABEL (O_BF): if (0) goto condtrue; break; LABEL (O_BHI): if ((C || Z) == 0) goto condtrue; break; LABEL (O_BLS): if ((C || Z)) goto condtrue; break; LABEL (O_BCS): LABEL (O_BLO): if ((C == 1)) goto condtrue; break; LABEL (O_BCC): LABEL (O_BHS): if ((C == 0)) goto condtrue; break; LABEL (O_BEQ): if (Z) goto condtrue; break; LABEL (O_BGT): if (((Z || (N ^ V)) == 0)) goto condtrue; break; LABEL (O_BLE): if (((Z || (N ^ V)) == 1)) goto condtrue; break; LABEL (O_BGE): if ((N ^ V) == 0) goto condtrue; break; LABEL (O_BLT): if ((N ^ V)) goto condtrue; break; LABEL (O_BMI): if ((N)) goto condtrue; break; LABEL (O_BNE): if ((Z == 0)) goto condtrue; break; LABEL (O_BPL): if (N == 0) goto condtrue; break; break; LABEL (O_BVC): if ((V == 0)) goto condtrue; break; LABEL (O_BVS): if ((V == 1)) goto condtrue; break; LABEL (O_BNOT): bit = argb & (1<<(arga & 0xf)); res = argb ^ (1<<(arga & 0xf)); goto bitop; break; LABEL (O_BSET): arga = 1 << (arga & 0xf); bit = argb & arga; res = argb | arga; goto bitop; break; LABEL (O_PJMP): pc = arga; goto next; LABEL (O_UNLK): { int t; SET_NORMREG (R7, GET_NORMREG (R6)); POPWORD (t); SET_NORMREG (R6, t); pc = code->next_pc; goto next; } LABEL (O_RTS): { int cp = pc & 0xff0000; POPWORD (pc); pc |= cp; goto next; } break; LABEL (O_PRTS): { int cp; int off; POPWORD (cp); POPWORD (off); cp <<= 16; SET_SEGREG (R_CP, cp); pc = cp + off; } goto next; LABEL (O_PJSR): PUSHWORD (argb & 0xffff); PUSHWORD (argb >> 16); pc = (arga & 0xffffff); goto next; LABEL (O_BSR): LABEL (O_JSR): PUSHWORD (code->next_pc); pc = arga | (pc & 0xff0000); goto next; LABEL (O_BTST): Z = (((argb >> (arga & 0xf)) & 1) == 0); pc = code->next_pc; goto next; LABEL (O_CLR): res = 0; break; LABEL (O_CMP): arga = -arga; res = arga + argb; break; LABEL (O_DADD): res = arga + argb + C; if (res > 99) { res -= 100; C = 1; } else { C = 0; } Z = Z && (res == 0); break; LABEL (O_DSUB): res = argb - arga - C; if (res < 0) { res += 100; C = 1; } else { C = 0; } Z = Z && (res == 0); break; LABEL (O_EXTS): res = SEXTCHAR (arga); break; LABEL (O_EXTU): res = (unsigned char) arga; break; LABEL (O_JMP): pc = arga | (pc & 0xff0000); goto next; break; LABEL (O_LDM): for (tmp = 0; tmp < 7; tmp++) { if (argb & (1 << tmp)) { POPWORD (cpu.regs[tmp].s[LOW]); } } if (argb & 0x80) POPWORD (tmp); /* dummy ready for sp */ goto nextpc; break; LABEL (O_LINK): PUSHWORD (cpu.regs[R6].s[LOW]); cpu.regs[R6].s[LOW] = cpu.regs[R7].s[LOW]; cpu.regs[R7].s[LOW] += argb; goto nextpc; LABEL (O_STC): LABEL (O_LDC): LABEL (O_MOVFPE): LABEL (O_MOVTPE): LABEL (O_MOV): LABEL (O_TST): res = arga; break; LABEL (O_TRAPA): if (arga == 15) { trap (); } else { PUSHWORD (pc & 0xffff); if (cpu.maximum) { PUSHWORD (NORMAL_CP); } PUSHWORD (NORMAL_SR); if (cpu.maximum) { arga = arga * 4 + 0x40; SET_NORMAL_CPPC (longat (cpu.memory + arga)); } else { arga = arga * 2 + 0x20; SET_NORMAL_CPPC (wordat (cpu.memory + arga)); } } break; LABEL (O_OR): LABEL (O_ORC): res = arga | argb; break; LABEL (O_XOR): LABEL (O_XORC): res = arga ^ argb; break; LABEL (O_SCB_F): { scb_f: res = arga - 1; code->srca.reg.wptr[0] = res; if (res != -1) { pc = argb; goto next; } } break; LABEL (O_SCB_EQ): if (Z == 1) break; else goto scb_f; LABEL (O_SCB_NE): if (Z == 0) break; else goto scb_f; LABEL (O_NOP): /* If only they were all as simple as this */ break; LABEL (O_ROTL): res = arga << 1; C = (res >> argb) & 1; res |= C; break; LABEL (O_ROTR): C = arga & 1; res = arga >> 1; res |= (C << (argb - 1)); break; LABEL (O_ROTXL): res = arga << 1; res |= C; C = (res >> argb) & 1; break; LABEL (O_ROTXR): res = arga >> 1; res |= (C << (argb - 1)); C = arga & 1; break; LABEL (O_SHAL): res = arga << 1; if (argb == 16) { C = (res >> (16)) & 1; Z = ((res & 0xffff) == 0); N = ((res & 0x8000) != 0); } else { C = (res >> (8)) & 1; Z = ((res & 0xff) == 0); N = ((res & 0x80) != 0); } V = C ^ N; goto none; LABEL (O_SHAR): C = arga & 1; if (argb == 16) { res = ((short) arga) >> 1; } else { res = (SEXTCHAR (arga)) >> 1; } break; LABEL (O_SHLL): res = arga << 1; C = (res >> argb) & 1; break; LABEL (O_SHLR): C = arga & 1; res = arga >> 1; break; LABEL (O_DIVXU): if (arga == 0) { N = V = C = 0; Z = 1; cpu.exception = SIGILL; } else { int d = argb / arga; int m = argb % arga; if (code->dst.type == eas.s.ea_reg.s.dstlong) { res = (m << 16) | (d & 0xffff); } else { res = (m << 8) | (d & 0xff); } } break; LABEL (O_MULXU): res = arga * argb; break; LABEL (O_NOT): res = ~arga; break; LABEL (O_SWAP): res = ((arga >> 8) & 0xff) | ((arga << 8) & 0xff00); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -