|
|
1.1 ! root 1: // vi:set ts=4: ! 2: ! 3: // ! 4: // nono ! 5: // Copyright (C) 2024 nono project ! 6: // Licensed under nono-license.txt ! 7: // ! 8: ! 9: #ifndef runx_h ! 10: #define runx_h ! 11: ! 12: #include <err.h> ! 13: #include <errno.h> ! 14: #include <unistd.h> ! 15: #include <stdio.h> ! 16: #include <sys/ptrace.h> ! 17: #include <machine/reg.h> ! 18: ! 19: #define countof(x) (sizeof(x) / sizeof((x)[0])) ! 20: ! 21: #define DEBUG(lv, fmt...) do { \ ! 22: if (opt_debug >= (lv)) { \ ! 23: printf("\x1b[33m"); \ ! 24: printf(fmt); \ ! 25: printf("\x1b[m"); \ ! 26: printf("\n"); \ ! 27: } \ ! 28: } while (0) ! 29: ! 30: #define TRACE(pc, fmt...) do { \ ! 31: if (opt_trace) { \ ! 32: printf("\x1b[33m"); \ ! 33: printf("%06x: ", pc); \ ! 34: printf(fmt); \ ! 35: printf("\x1b[m"); \ ! 36: printf("\n"); \ ! 37: } \ ! 38: } while (0) ! 39: ! 40: // struct reg *reg は固定。 ! 41: #define RegR(n) (reg->r_regs[(n)]) ! 42: #define RegD(n) (reg->r_regs[(n)]) ! 43: #define RegA(n) (reg->r_regs[8 + (n)]) ! 44: #define RegPC (reg->r_pc) ! 45: #define RegCCR (reg->r_sr) ! 46: ! 47: typedef uint8_t uint8; ! 48: typedef uint16_t uint16; ! 49: typedef uint32_t uint32; ! 50: typedef int8_t int8; ! 51: typedef int16_t int16; ! 52: typedef int32_t int32; ! 53: ! 54: struct reg_emul { ! 55: uint16 sr; // SR の上位バイトのみ保持。下位(CCR) は持たない。 ! 56: uint32 usp; ! 57: uint32 ssp; ! 58: uint32 vbr; ! 59: uint32 caar; ! 60: }; ! 61: // SR+CCR を返す ! 62: #define GetSR (emul.sr | (RegCCR & 0x00ff)) ! 63: // SR+CCR をセットする ! 64: #define SetSR(v_) do { \ ! 65: uint32 v__ = (v_); \ ! 66: emul.sr = v__ & 0xff00; \ ! 67: RegCCR = v__ & 0x00ff; \ ! 68: } while (0) ! 69: ! 70: /* runx.cpp */ ! 71: extern uint32 readmem1(uint32); ! 72: extern uint32 readmem2(uint32); ! 73: extern uint32 readmem4(uint32); ! 74: extern void writemem1(uint32, uint32); ! 75: extern void writemem2(uint32, uint32); ! 76: extern void writemem4(uint32, uint32); ! 77: ! 78: /* doscall.cpp */ ! 79: extern int init_doscall(); ! 80: extern int doscall(pid_t, uint32, struct reg *); ! 81: ! 82: /* iocscall.cpp */ ! 83: extern int iocscall(pid_t, struct reg *); ! 84: ! 85: /* m680x0.cpp */ ! 86: extern uint32 exception_format0(struct reg *, uint32, uint32); ! 87: extern uint32 exception_format2(struct reg *, uint32); ! 88: extern uint32 exec_op(pid_t, struct reg *, int, uint32); ! 89: ! 90: /* util.cpp */ ! 91: extern int getpgsize(); ! 92: extern const char *signame(int); ! 93: ! 94: extern int opt_debug; ! 95: extern int opt_trace; ! 96: extern struct reg_emul emul; ! 97: ! 98: #endif /* !runx_h */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.