|
|
1.1 root 1:
2: #ifndef CPUMMU030_H
3: #define CPUMMU030_H
4:
5: #include "mmu_common.h"
6:
7: void mmu_op30_pmove (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
8: void mmu_op30_ptest (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
9: void mmu_op30_pload (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
10: void mmu_op30_pflush (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
11:
12: uae_u32 mmu_op30_helper_get_fc(uae_u16 next);
13:
14: void mmu030_ptest_atc_search(uaecptr logical_addr, uae_u32 fc, bool write);
15: uae_u32 mmu030_ptest_table_search(uaecptr extra, uae_u32 fc, bool write, int level);
16: uae_u32 mmu030_table_search(uaecptr addr, uae_u32 fc, bool write, int level);
17:
18:
19: typedef struct {
20: uae_u32 addr_base;
21: uae_u32 addr_mask;
22: uae_u32 fc_base;
23: uae_u32 fc_mask;
24: } TT_info;
25:
26: TT_info mmu030_decode_tt(uae_u32 TT);
27: void mmu030_decode_tc(uae_u32 TC);
28: void mmu030_decode_rp(uae_u64 RP);
29:
30: int mmu030_logical_is_in_atc(uaecptr addr, uae_u32 fc, bool write);
31: void mmu030_atc_handle_history_bit(int entry_num);
32:
33: void mmu030_put_long_atc(uaecptr addr, uae_u32 val, int l);
34: void mmu030_put_word_atc(uaecptr addr, uae_u16 val, int l);
35: void mmu030_put_byte_atc(uaecptr addr, uae_u8 val, int l);
36: uae_u32 mmu030_get_long_atc(uaecptr addr, int l);
37: uae_u16 mmu030_get_word_atc(uaecptr addr, int l);
38: uae_u8 mmu030_get_byte_atc(uaecptr addr, int l);
39:
40: void mmu030_flush_atc_fc(uae_u32 fc_base, uae_u32 fc_mask);
41: void mmu030_flush_atc_page(uaecptr logical_addr);
42: void mmu030_flush_atc_page_fc(uaecptr logical_addr, uae_u32 fc_base, uae_u32 fc_mask);
43: void mmu030_flush_atc_all(void);
44: void mmu030_reset(int hardreset);
45:
46: int mmu030_match_ttr(uaecptr addr, uae_u32 fc, bool write);
47: int mmu030_do_match_ttr(uae_u32 tt, TT_info masks, uaecptr addr, uae_u32 fc, bool write);
48:
49: void mmu030_put_long(uaecptr addr, uae_u32 val, uae_u32 fc, int size);
50: void mmu030_put_word(uaecptr addr, uae_u16 val, uae_u32 fc, int size);
51: void mmu030_put_byte(uaecptr addr, uae_u8 val, uae_u32 fc, int size);
52: uae_u32 mmu030_get_long(uaecptr addr, uae_u32 fc, int size);
53: uae_u16 mmu030_get_word(uaecptr addr, uae_u32 fc, int size);
54: uae_u8 mmu030_get_byte(uaecptr addr, uae_u32 fc, int size);
55:
56: void mmu030_page_fault(uaecptr addr, bool read);
57:
58: extern uae_u16 REGPARAM3 mmu030_get_word_unaligned(uaecptr addr, uae_u32 fc) REGPARAM;
59: extern uae_u32 REGPARAM3 mmu030_get_long_unaligned(uaecptr addr, uae_u32 fc) REGPARAM;
60: extern void REGPARAM3 mmu030_put_word_unaligned(uaecptr addr, uae_u16 val, uae_u32 fc) REGPARAM;
61: extern void REGPARAM3 mmu030_put_long_unaligned(uaecptr addr, uae_u32 val, uae_u32 fc) REGPARAM;
62:
63: static ALWAYS_INLINE uae_u32 uae_mmu030_get_ilong(uaecptr addr)
64: {
65: uae_u32 fc = (regs.s ? 4 : 0) | 2;
66:
67: if (unlikely(is_unaligned(addr, 4)))
68: return mmu030_get_long_unaligned(addr, fc);
69: return mmu030_get_long(addr, fc, sz_long);
70: }
71: static ALWAYS_INLINE uae_u16 uae_mmu030_get_iword(uaecptr addr)
72: {
73: uae_u32 fc = (regs.s ? 4 : 0) | 2;
74:
75: if (unlikely(is_unaligned(addr, 2)))
76: return mmu030_get_word_unaligned(addr, fc);
77: return mmu030_get_word(addr, fc, sz_word);
78: }
79: static ALWAYS_INLINE uae_u16 uae_mmu030_get_ibyte(uaecptr addr)
80: {
81: uae_u32 fc = (regs.s ? 4 : 0) | 2;
82:
83: return mmu030_get_byte(addr, fc, sz_byte);
84: }
85: static ALWAYS_INLINE uae_u32 uae_mmu030_get_long(uaecptr addr)
86: {
87: uae_u32 fc = (regs.s ? 4 : 0) | 1;
88:
89: if (unlikely(is_unaligned(addr, 4)))
90: return mmu030_get_long_unaligned(addr, fc);
91: return mmu030_get_long(addr, fc, sz_long);
92: }
93: static ALWAYS_INLINE uae_u16 uae_mmu030_get_word(uaecptr addr)
94: {
95: uae_u32 fc = (regs.s ? 4 : 0) | 1;
96:
97: if (unlikely(is_unaligned(addr, 2)))
98: return mmu030_get_word_unaligned(addr, fc);
99: return mmu030_get_word(addr, fc, sz_word);
100: }
101: static ALWAYS_INLINE uae_u8 uae_mmu030_get_byte(uaecptr addr)
102: {
103: uae_u32 fc = (regs.s ? 4 : 0) | 1;
104:
105: return mmu030_get_byte(addr, fc, sz_byte);
106: }
107: static ALWAYS_INLINE void uae_mmu030_put_long(uaecptr addr, uae_u32 val)
108: {
109: uae_u32 fc = (regs.s ? 4 : 0) | 1;
110:
111: if (unlikely(is_unaligned(addr, 4)))
112: mmu030_put_long_unaligned(addr, val, fc);
113: else
114: mmu030_put_long(addr, val, fc, sz_long);
115: }
116: static ALWAYS_INLINE void uae_mmu030_put_word(uaecptr addr, uae_u16 val)
117: {
118: uae_u32 fc = (regs.s ? 4 : 0) | 1;
119:
120: if (unlikely(is_unaligned(addr, 2)))
121: mmu030_put_word_unaligned(addr, val, fc);
122: else
123: mmu030_put_word(addr, val, fc, sz_word);
124: }
125: static ALWAYS_INLINE void uae_mmu030_put_byte(uaecptr addr, uae_u8 val)
126: {
127: uae_u32 fc = (regs.s ? 4 : 0) | 1;
128:
129: mmu030_put_byte(addr, val, fc, sz_byte);
130: }
131:
132: static ALWAYS_INLINE uae_u32 sfc030_get_long(uaecptr addr)
133: {
134: uae_u32 fc = regs.sfc&7;
135: printf("sfc030_get_long: FC = %i\n",fc);
136: if (unlikely(is_unaligned(addr, 4)))
137: return mmu030_get_long_unaligned(addr, fc);
138: return mmu030_get_long(addr, fc, sz_long);
139: }
140:
141: static ALWAYS_INLINE uae_u16 sfc030_get_word(uaecptr addr)
142: {
143: uae_u32 fc = regs.sfc&7;
144: printf("sfc030_get_word: FC = %i\n",fc);
145: if (unlikely(is_unaligned(addr, 2)))
146: return mmu030_get_word_unaligned(addr, fc);
147: return mmu030_get_word(addr, fc, sz_word);
148: }
149:
150: static ALWAYS_INLINE uae_u8 sfc030_get_byte(uaecptr addr)
151: {
152: uae_u32 fc = regs.sfc&7;
153: printf("sfc030_get_byte: FC = %i\n",fc);
154: return mmu030_get_byte(addr, fc, sz_byte);
155: }
156:
157: static ALWAYS_INLINE void dfc030_put_long(uaecptr addr, uae_u32 val)
158: {
159: uae_u32 fc = regs.dfc&7;
160: printf("dfc030_put_long: FC = %i\n",fc);
161: if (unlikely(is_unaligned(addr, 4)))
162: mmu030_put_long_unaligned(addr, val, fc);
163: else
164: mmu030_put_long(addr, val, fc, sz_long);
165: }
166:
167: static ALWAYS_INLINE void dfc030_put_word(uaecptr addr, uae_u16 val)
168: {
169: uae_u32 fc = regs.dfc&7;
170: printf("dfc030_put_word: FC = %i\n",fc);
171: if (unlikely(is_unaligned(addr, 2)))
172: mmu030_put_word_unaligned(addr, val, fc);
173: else
174: mmu030_put_word(addr, val, fc, sz_word);
175: }
176:
177: static ALWAYS_INLINE void dfc030_put_byte(uaecptr addr, uae_u8 val)
178: {
179: uae_u32 fc = regs.dfc&7;
180: printf("dfc030_put_byte: FC = %i\n",fc);
181: mmu030_put_byte(addr, val, fc, sz_byte);
182: }
183:
184: STATIC_INLINE void put_byte_mmu030 (uaecptr addr, uae_u32 v)
185: {
186: uae_mmu030_put_byte (addr, v);
187: }
188: STATIC_INLINE void put_word_mmu030 (uaecptr addr, uae_u32 v)
189: {
190: uae_mmu030_put_word (addr, v);
191: }
192: STATIC_INLINE void put_long_mmu030 (uaecptr addr, uae_u32 v)
193: {
194: uae_mmu030_put_long (addr, v);
195: }
196: STATIC_INLINE uae_u32 get_byte_mmu030 (uaecptr addr)
197: {
198: return uae_mmu030_get_byte (addr);
199: }
200: STATIC_INLINE uae_u32 get_word_mmu030 (uaecptr addr)
201: {
202: return uae_mmu030_get_word (addr);
203: }
204: STATIC_INLINE uae_u32 get_long_mmu030 (uaecptr addr)
205: {
206: return uae_mmu030_get_long (addr);
207: }
208: STATIC_INLINE uae_u32 get_ibyte_mmu030 (int o)
209: {
210: uae_u32 pc = m68k_getpc () + o;
211: return uae_mmu030_get_iword (pc);
212: }
213: STATIC_INLINE uae_u32 get_iword_mmu030 (int o)
214: {
215: uae_u32 pc = m68k_getpc () + o;
216: return uae_mmu030_get_iword (pc);
217: }
218: STATIC_INLINE uae_u32 get_ilong_mmu030 (int o)
219: {
220: uae_u32 pc = m68k_getpc () + o;
221: return uae_mmu030_get_ilong (pc);
222: }
223: STATIC_INLINE uae_u32 next_iword_mmu030 (void)
224: {
225: uae_u32 pc = m68k_getpc ();
226: m68k_incpci (2);
227: return uae_mmu030_get_iword (pc);
228: }
229: STATIC_INLINE uae_u32 next_ilong_mmu030 (void)
230: {
231: uae_u32 pc = m68k_getpc ();
232: m68k_incpci (4);
233: return uae_mmu030_get_ilong (pc);
234: }
235:
236: extern void m68k_do_rts_mmu030 (void);
237: extern void m68k_do_rte_mmu030 (uaecptr a7);
238: extern void flush_mmu030 (uaecptr, int);
239: extern void m68k_do_bsr_mmu030 (uaecptr oldpc, uae_s32 offset);
240:
241: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.