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
uae_mmu030_get_ilong(uaecptr addr)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 }
uae_mmu030_get_iword(uaecptr addr)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 }
uae_mmu030_get_ibyte(uaecptr addr)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 }
uae_mmu030_get_long(uaecptr addr)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 }
uae_mmu030_get_word(uaecptr addr)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 }
uae_mmu030_get_byte(uaecptr addr)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 }
uae_mmu030_put_long(uaecptr addr,uae_u32 val)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 }
uae_mmu030_put_word(uaecptr addr,uae_u16 val)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 }
uae_mmu030_put_byte(uaecptr addr,uae_u8 val)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
sfc030_get_long(uaecptr addr)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
sfc030_get_word(uaecptr addr)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
sfc030_get_byte(uaecptr addr)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
dfc030_put_long(uaecptr addr,uae_u32 val)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
dfc030_put_word(uaecptr addr,uae_u16 val)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
dfc030_put_byte(uaecptr addr,uae_u8 val)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
put_byte_mmu030(uaecptr addr,uae_u32 v)184 STATIC_INLINE void put_byte_mmu030 (uaecptr addr, uae_u32 v)
185 {
186 uae_mmu030_put_byte (addr, v);
187 }
put_word_mmu030(uaecptr addr,uae_u32 v)188 STATIC_INLINE void put_word_mmu030 (uaecptr addr, uae_u32 v)
189 {
190 uae_mmu030_put_word (addr, v);
191 }
put_long_mmu030(uaecptr addr,uae_u32 v)192 STATIC_INLINE void put_long_mmu030 (uaecptr addr, uae_u32 v)
193 {
194 uae_mmu030_put_long (addr, v);
195 }
get_byte_mmu030(uaecptr addr)196 STATIC_INLINE uae_u32 get_byte_mmu030 (uaecptr addr)
197 {
198 return uae_mmu030_get_byte (addr);
199 }
get_word_mmu030(uaecptr addr)200 STATIC_INLINE uae_u32 get_word_mmu030 (uaecptr addr)
201 {
202 return uae_mmu030_get_word (addr);
203 }
get_long_mmu030(uaecptr addr)204 STATIC_INLINE uae_u32 get_long_mmu030 (uaecptr addr)
205 {
206 return uae_mmu030_get_long (addr);
207 }
get_ibyte_mmu030(int o)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 }
get_iword_mmu030(int o)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 }
get_ilong_mmu030(int o)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 }
next_iword_mmu030(void)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 }
next_ilong_mmu030(void)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
242