|
|
1.1 root 1:
2: #ifndef MMU_COMMON_H
3: #define MMU_COMMON_H
4:
5: #if 0
6: struct m68k_exception {
7: int prb;
8: m68k_exception (int exc) : prb (exc) {}
9: operator int() { return prb; }
10: };
11: #define SAVE_EXCEPTION
12: #define RESTORE_EXCEPTION
13: #define TRY(var) try
14: #define CATCH(var) catch(m68k_exception var)
15: #define THROW(n) throw m68k_exception(n)
16: #define THROW_AGAIN(var) throw
17:
18: #else
19: /* we are in plain C, just use a stack of long jumps */
20: #include <setjmp.h>
21: extern jmp_buf __exbuf;
22: extern int __exvalue;
23: #define TRY(DUMMY) __exvalue=setjmp(__exbuf); \
24: if (__exvalue==0) { __pushtry(&__exbuf);
25: #define CATCH(x) __poptry(); } else { fprintf(stderr,"Gotcha! %d %s in %d\n",__exvalue,__FILE__,__LINE__);
26: #define ENDTRY __poptry();}
27: #define THROW(x) if (__is_catched()) {fprintf(stderr,"Longjumping %s in %d\n",__FILE__,__LINE__);longjmp(__exbuf,x);}
28: #define THROW_AGAIN(var) if (__is_catched()) longjmp(*__poptry(),__exvalue)
29: #define SAVE_EXCEPTION
30: #define RESTORE_EXCEPTION
31: jmp_buf* __poptry(void);
32: void __pushtry(jmp_buf *j);
33: int __is_catched(void);
34:
35: typedef int m68k_exception;
36:
37: #endif
38:
39: /* special status word (access error stack frame) */
40: /* this is only valid for 68040 */
41: /* TODO: correctly handle SSW on 68030 */
42: #define MMU_SSW_TM 0x0007
43: #define MMU_SSW_TT 0x0018
44: #define MMU_SSW_SIZE 0x0060
45: #define MMU_SSW_SIZE_B 0x0020
46: #define MMU_SSW_SIZE_W 0x0040
47: #define MMU_SSW_SIZE_L 0x0000
48: #define MMU_SSW_RW 0x0100
49: #define MMU_SSW_LK 0x0200
50: #define MMU_SSW_ATC 0x0400
51: #define MMU_SSW_MA 0x0800
52: #define MMU_SSW_CM 0x1000
53: #define MMU_SSW_CT 0x2000
54: #define MMU_SSW_CU 0x4000
55: #define MMU_SSW_CP 0x8000
56:
57: #define MMU030_SSW_FC 0x8000
58: #define MMU030_SSW_FB 0x4000
59: #define MMU030_SSW_RC 0x2000
60: #define MMU030_SSW_RB 0x1000
61: #define MMU030_SSW_DF 0x0100
62: #define MMU030_SSW_RM 0x0080
63: #define MMU030_SSW_RW 0x0040
64: #define MMU030_SSW_SIZE_MASK 0x0030
65: #define MMU030_SSW_SIZE_B 0x0010 /* correct ? */
66: #define MMU030_SSW_SIZE_W 0x0020 /* correct ? */
67: #define MMU030_SSW_SIZE_L 0x0000 /* correct ? */
68: #define MMU030_SSW_FC_MASK 0x0007
69:
70:
71: #define ALWAYS_INLINE __inline
72:
73: // take care of 2 kinds of alignement, bus size and page
74: static inline bool is_unaligned(uaecptr addr, int size)
75: {
76: return unlikely((addr & (size - 1)) && (addr ^ (addr + size - 1)) & 0x1000);
77: }
78:
79: static ALWAYS_INLINE void phys_put_long(uaecptr addr, uae_u32 l)
80: {
81: longput(addr, l);
82: }
83: static ALWAYS_INLINE void phys_put_word(uaecptr addr, uae_u32 w)
84: {
85: wordput(addr, w);
86: }
87: static ALWAYS_INLINE void phys_put_byte(uaecptr addr, uae_u32 b)
88: {
89: byteput(addr, b);
90: }
91: static ALWAYS_INLINE uae_u32 phys_get_long(uaecptr addr)
92: {
93: return longget (addr);
94: }
95: static ALWAYS_INLINE uae_u32 phys_get_word(uaecptr addr)
96: {
97: return wordget (addr);
98: }
99: static ALWAYS_INLINE uae_u32 phys_get_byte(uaecptr addr)
100: {
101: return byteget (addr);
102: }
103:
104: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.