|
|
1.1 root 1:
2: STATIC_INLINE uae_u32 get_word_prefetch (int o)
3: {
4: uae_u32 v = regs.irc;
5: regs.irc = get_wordi (m68k_getpc () + o);
6: return v;
7: }
8: STATIC_INLINE uae_u32 get_long_prefetch (int o)
9: {
10: uae_u32 v = get_word_prefetch (o) << 16;
11: v |= get_word_prefetch (o + 2);
12: return v;
13: }
14:
15: #ifdef CPUEMU_20
16:
17: STATIC_INLINE void checkcycles_ce020 (void)
18: {
19: regs.ce020memcycles = 0;
20: }
21:
22: STATIC_INLINE uae_u32 mem_access_delay_long_read_ce020 (uaecptr addr)
23: {
24: checkcycles_ce020 ();
25: return get_long (addr);
26: }
27:
28: STATIC_INLINE uae_u32 mem_access_delay_longi_read_ce020 (uaecptr addr)
29: {
30: checkcycles_ce020 ();
31: return get_longi (addr);
32: }
33:
34: STATIC_INLINE uae_u32 mem_access_delay_word_read_ce020 (uaecptr addr)
35: {
36: checkcycles_ce020 ();
37: return get_word (addr);
38: }
39:
40: STATIC_INLINE uae_u32 mem_access_delay_wordi_read_ce020 (uaecptr addr)
41: {
42: checkcycles_ce020 ();
43: return get_wordi (addr);
44: }
45:
46: STATIC_INLINE uae_u32 mem_access_delay_byte_read_ce020 (uaecptr addr)
47: {
48: checkcycles_ce020 ();
49: return get_byte (addr);
50: }
51:
52: STATIC_INLINE void mem_access_delay_byte_write_ce020 (uaecptr addr, uae_u32 v)
53: {
54: checkcycles_ce020 ();
55: put_byte (addr, v);
56: }
57:
58: STATIC_INLINE void mem_access_delay_word_write_ce020 (uaecptr addr, uae_u32 v)
59: {
60: checkcycles_ce020 ();
61: put_word (addr, v);
62: }
63:
64: STATIC_INLINE void mem_access_delay_long_write_ce020 (uaecptr addr, uae_u32 v)
65: {
66: checkcycles_ce020 ();
67: put_long (addr, v);
68: }
69:
70: STATIC_INLINE uae_u32 get_long_ce020 (uaecptr addr)
71: {
72: return mem_access_delay_long_read_ce020 (addr);
73: }
74: STATIC_INLINE uae_u32 get_word_ce020 (uaecptr addr)
75: {
76: return mem_access_delay_word_read_ce020 (addr);
77: }
78: STATIC_INLINE uae_u32 get_byte_ce020 (uaecptr addr)
79: {
80: return mem_access_delay_byte_read_ce020 (addr);
81: }
82:
83: STATIC_INLINE void put_long_ce020 (uaecptr addr, uae_u32 v)
84: {
85: mem_access_delay_long_write_ce020 (addr, v);
86: }
87: STATIC_INLINE void put_word_ce020 (uaecptr addr, uae_u32 v)
88: {
89: mem_access_delay_word_write_ce020 (addr, v);
90: }
91: STATIC_INLINE void put_byte_ce020 (uaecptr addr, uae_u32 v)
92: {
93: mem_access_delay_byte_write_ce020 (addr, v);
94: }
95:
96: uae_u32 get_word_ce020_prefetch (int);
97:
98: STATIC_INLINE uae_u32 get_long_ce020_prefetch (int o)
99: {
100: uae_u32 v;
101: v = get_word_ce020_prefetch (o) << 16;
102: v |= get_word_ce020_prefetch (o + 2);
103: return v;
104: }
105:
106: STATIC_INLINE uae_u32 next_iword_020ce (void)
107: {
108: uae_u32 r = get_word_ce020_prefetch (0);
109: m68k_incpc (2);
110: return r;
111: }
112: STATIC_INLINE uae_u32 next_ilong_020ce (void)
113: {
114: uae_u32 r = get_long_ce020_prefetch (0);
115: m68k_incpc (4);
116: return r;
117: }
118:
119: STATIC_INLINE void m68k_do_bsr_ce020 (uaecptr oldpc, uae_s32 offset)
120: {
121: m68k_areg (regs, 7) -= 4;
122: put_long_ce020 (m68k_areg (regs, 7), oldpc);
123: m68k_incpc (offset);
124: }
125: STATIC_INLINE void m68k_do_rts_ce020 (void)
126: {
127: m68k_setpc (get_long_ce020 (m68k_areg (regs, 7)));
128: m68k_areg (regs, 7) += 4;
129: }
130: #endif
131:
132: #ifdef CPUEMU_21
133:
134: uae_u32 get_word_ce030_prefetch (int);
135: void write_dcache030 (uaecptr, uae_u32, int);
136: uae_u32 read_dcache030 (uaecptr, int);
137:
138: STATIC_INLINE void put_long_ce030 (uaecptr addr, uae_u32 v)
139: {
140: write_dcache030 (addr, v, 2);
141: mem_access_delay_long_write_ce020 (addr, v);
142: }
143: STATIC_INLINE void put_word_ce030 (uaecptr addr, uae_u32 v)
144: {
145: write_dcache030 (addr, v, 1);
146: mem_access_delay_word_write_ce020 (addr, v);
147: }
148: STATIC_INLINE void put_byte_ce030 (uaecptr addr, uae_u32 v)
149: {
150: write_dcache030 (addr, v, 0);
151: mem_access_delay_byte_write_ce020 (addr, v);
152: }
153: STATIC_INLINE uae_u32 get_long_ce030 (uaecptr addr)
154: {
155: return read_dcache030 (addr, 2);
156: }
157: STATIC_INLINE uae_u32 get_word_ce030 (uaecptr addr)
158: {
159: return read_dcache030 (addr, 1);
160: }
161: STATIC_INLINE uae_u32 get_byte_ce030 (uaecptr addr)
162: {
163: return read_dcache030 (addr, 0);
164: }
165:
166: STATIC_INLINE uae_u32 get_long_ce030_prefetch (int o)
167: {
168: uae_u32 v;
169: v = get_word_ce030_prefetch (o) << 16;
170: v |= get_word_ce030_prefetch (o + 2);
171: return v;
172: }
173:
174: STATIC_INLINE uae_u32 next_iword_030ce (void)
175: {
176: uae_u32 r = get_word_ce030_prefetch (0);
177: m68k_incpc (2);
178: return r;
179: }
180: STATIC_INLINE uae_u32 next_ilong_030ce (void)
181: {
182: uae_u32 r = get_long_ce030_prefetch (0);
183: m68k_incpc (4);
184: return r;
185: }
186:
187: STATIC_INLINE void m68k_do_bsr_ce030 (uaecptr oldpc, uae_s32 offset)
188: {
189: m68k_areg (regs, 7) -= 4;
190: put_long_ce030 (m68k_areg (regs, 7), oldpc);
191: m68k_incpc (offset);
192: }
193: STATIC_INLINE void m68k_do_rts_ce030 (void)
194: {
195: m68k_setpc (get_long_ce030 (m68k_areg (regs, 7)));
196: m68k_areg (regs, 7) += 4;
197: }
198: #endif
199:
200: #ifdef CPUEMU_12
201:
202: STATIC_INLINE void ipl_fetch (void)
203: {
204: regs.ipl = regs.ipl_pin;
205: }
206:
207: STATIC_INLINE uae_u32 mem_access_delay_word_read (uaecptr addr)
208: {
209: return get_word (addr);
210: }
211: STATIC_INLINE uae_u32 mem_access_delay_wordi_read (uaecptr addr)
212: {
213: return get_wordi (addr);
214: }
215:
216: STATIC_INLINE uae_u32 mem_access_delay_byte_read (uaecptr addr)
217: {
218: return get_byte (addr);
219: }
220: STATIC_INLINE void mem_access_delay_byte_write (uaecptr addr, uae_u32 v)
221: {
222: put_byte (addr, v);
223: }
224: STATIC_INLINE void mem_access_delay_word_write (uaecptr addr, uae_u32 v)
225: {
226: put_word (addr, v);
227: }
228:
229: STATIC_INLINE uae_u32 get_long_ce (uaecptr addr)
230: {
231: uae_u32 v = mem_access_delay_word_read (addr) << 16;
232: v |= mem_access_delay_word_read (addr + 2);
233: return v;
234: }
235: STATIC_INLINE uae_u32 get_word_ce (uaecptr addr)
236: {
237: return mem_access_delay_word_read (addr);
238: }
239: STATIC_INLINE uae_u32 get_wordi_ce (uaecptr addr)
240: {
241: return mem_access_delay_wordi_read (addr);
242: }
243: STATIC_INLINE uae_u32 get_byte_ce (uaecptr addr)
244: {
245: return mem_access_delay_byte_read (addr);
246: }
247: STATIC_INLINE uae_u32 get_word_ce_prefetch (int o)
248: {
249: uae_u32 v = regs.irc;
250: regs.irc = get_wordi_ce (m68k_getpc () + o);
251: return v;
252: }
253:
254: STATIC_INLINE void put_long_ce (uaecptr addr, uae_u32 v)
255: {
256: mem_access_delay_word_write (addr, v >> 16);
257: mem_access_delay_word_write (addr + 2, v);
258: }
259: STATIC_INLINE void put_word_ce (uaecptr addr, uae_u32 v)
260: {
261: mem_access_delay_word_write (addr, v);
262: }
263: STATIC_INLINE void put_byte_ce (uaecptr addr, uae_u32 v)
264: {
265: mem_access_delay_byte_write (addr, v);
266: }
267:
268: STATIC_INLINE void m68k_do_rts_ce (void)
269: {
270: uaecptr pc;
271: pc = get_word_ce (m68k_areg (regs, 7)) << 16;
272: pc |= get_word_ce (m68k_areg (regs, 7) + 2);
273: m68k_areg (regs, 7) += 4;
274: if (pc & 1)
275: exception3 (0x4e75, m68k_getpc ());
276: else
277: m68k_setpc (pc);
278: }
279:
280: STATIC_INLINE void m68k_do_bsr_ce (uaecptr oldpc, uae_s32 offset)
281: {
282: m68k_areg (regs, 7) -= 4;
283: put_word_ce (m68k_areg (regs, 7), oldpc >> 16);
284: put_word_ce (m68k_areg (regs, 7) + 2, oldpc);
285: m68k_incpc (offset);
286: }
287:
288: STATIC_INLINE void m68k_do_jsr_ce (uaecptr oldpc, uaecptr dest)
289: {
290: m68k_areg (regs, 7) -= 4;
291: put_word_ce (m68k_areg (regs, 7), oldpc >> 16);
292: put_word_ce (m68k_areg (regs, 7) + 2, oldpc);
293: m68k_setpc (dest);
294: }
295: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.