ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/basilisk_glue.cpp
Revision: 1.17
Committed: 2005-01-30T21:42:16Z (19 years, 5 months ago) by gbeauche
Branch: MAIN
CVS Tags: nigel-build-17
Changes since 1.16: +1 -1 lines
Log Message:
Happy New Year!

File Contents

# User Rev Content
1 cebix 1.1 /*
2     * basilisk_glue.cpp - Glue UAE CPU to Basilisk II CPU engine interface
3     *
4 gbeauche 1.17 * Basilisk II (C) 1997-2005 Christian Bauer
5 cebix 1.1 *
6     * This program is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19     */
20    
21     #include "sysdeps.h"
22 cebix 1.4
23 cebix 1.1 #include "cpu_emulation.h"
24     #include "main.h"
25 gbeauche 1.14 #include "prefs.h"
26 cebix 1.1 #include "emul_op.h"
27     #include "rom_patches.h"
28     #include "m68k.h"
29     #include "memory.h"
30     #include "readcpu.h"
31     #include "newcpu.h"
32 gbeauche 1.14 #include "compiler/compemu.h"
33 cebix 1.1
34    
35     // RAM and ROM pointers
36 gbeauche 1.14 uint32 RAMBaseMac = 0; // RAM base (Mac address space) gb-- initializer is important
37 cebix 1.1 uint8 *RAMBaseHost; // RAM base (host address space)
38     uint32 RAMSize; // Size of RAM
39     uint32 ROMBaseMac; // ROM base (Mac address space)
40     uint8 *ROMBaseHost; // ROM base (host address space)
41     uint32 ROMSize; // Size of ROM
42    
43     #if !REAL_ADDRESSING
44     // Mac frame buffer
45     uint8 *MacFrameBaseHost; // Frame buffer base (host address space)
46     uint32 MacFrameSize; // Size of frame buffer
47     int MacFrameLayout; // Frame buffer layout
48     #endif
49    
50 gbeauche 1.7 #if DIRECT_ADDRESSING
51     uintptr MEMBaseDiff; // Global offset between a Mac address and its Host equivalent
52     #endif
53    
54 gbeauche 1.14 #if USE_JIT
55     bool UseJIT = false;
56     #endif
57    
58 cebix 1.1 // From newcpu.cpp
59 gbeauche 1.15 extern bool quit_program;
60 cebix 1.1
61    
62     /*
63     * Initialize 680x0 emulation, CheckROM() must have been called first
64     */
65    
66     bool Init680x0(void)
67     {
68     #if REAL_ADDRESSING
69     // Mac address space = host address space
70     RAMBaseMac = (uint32)RAMBaseHost;
71     ROMBaseMac = (uint32)ROMBaseHost;
72 gbeauche 1.7 #elif DIRECT_ADDRESSING
73 gbeauche 1.10 // Mac address space = host address space minus constant offset (MEMBaseDiff)
74 gbeauche 1.13 // NOTE: MEMBaseDiff is set up in main_unix.cpp/main()
75 gbeauche 1.10 RAMBaseMac = 0;
76     ROMBaseMac = Host2MacAddr(ROMBaseHost);
77 cebix 1.1 #else
78     // Initialize UAE memory banks
79     RAMBaseMac = 0;
80     switch (ROMVersion) {
81     case ROM_VERSION_64K:
82     case ROM_VERSION_PLUS:
83     case ROM_VERSION_CLASSIC:
84     ROMBaseMac = 0x00400000;
85     break;
86     case ROM_VERSION_II:
87     ROMBaseMac = 0x00a00000;
88     break;
89     case ROM_VERSION_32:
90     ROMBaseMac = 0x40800000;
91     break;
92     default:
93     return false;
94     }
95     memory_init();
96     #endif
97    
98     init_m68k();
99 gbeauche 1.14 #if USE_JIT
100     UseJIT = compiler_use_jit();
101     if (UseJIT)
102     compiler_init();
103     #endif
104 cebix 1.1 return true;
105     }
106    
107    
108     /*
109     * Deinitialize 680x0 emulation
110     */
111    
112     void Exit680x0(void)
113     {
114 gbeauche 1.14 #if USE_JIT
115     if (UseJIT)
116     compiler_exit();
117     #endif
118 gbeauche 1.6 exit_m68k();
119 cebix 1.1 }
120    
121    
122     /*
123 cebix 1.11 * Initialize memory mapping of frame buffer (called upon video mode change)
124     */
125    
126     void InitFrameBufferMapping(void)
127     {
128     #if !REAL_ADDRESSING && !DIRECT_ADDRESSING
129     memory_init();
130     #endif
131     }
132    
133     /*
134 cebix 1.1 * Reset and start 680x0 emulation (doesn't return)
135     */
136    
137     void Start680x0(void)
138     {
139     m68k_reset();
140 gbeauche 1.14 #if USE_JIT
141     if (UseJIT)
142     m68k_compile_execute();
143     else
144     #endif
145 gbeauche 1.13 m68k_execute();
146 cebix 1.1 }
147    
148    
149     /*
150     * Trigger interrupt
151     */
152    
153     void TriggerInterrupt(void)
154     {
155 gbeauche 1.13 SPCFLAGS_SET( SPCFLAG_INT );
156 cebix 1.1 }
157    
158 cebix 1.5 void TriggerNMI(void)
159     {
160     //!! not implemented yet
161     }
162    
163 cebix 1.1
164     /*
165     * Get 68k interrupt level
166     */
167    
168     int intlev(void)
169     {
170     return InterruptFlags ? 1 : 0;
171     }
172    
173    
174     /*
175     * Execute MacOS 68k trap
176     * r->a[7] and r->sr are unused!
177     */
178    
179     void Execute68kTrap(uint16 trap, struct M68kRegisters *r)
180     {
181     int i;
182    
183     // Save old PC
184     uaecptr oldpc = m68k_getpc();
185    
186     // Set registers
187     for (i=0; i<8; i++)
188     m68k_dreg(regs, i) = r->d[i];
189     for (i=0; i<7; i++)
190     m68k_areg(regs, i) = r->a[i];
191    
192     // Push trap and EXEC_RETURN on stack
193     m68k_areg(regs, 7) -= 2;
194     put_word(m68k_areg(regs, 7), M68K_EXEC_RETURN);
195     m68k_areg(regs, 7) -= 2;
196     put_word(m68k_areg(regs, 7), trap);
197    
198     // Execute trap
199     m68k_setpc(m68k_areg(regs, 7));
200     fill_prefetch_0();
201 gbeauche 1.15 quit_program = false;
202 gbeauche 1.13 m68k_execute();
203 cebix 1.1
204     // Clean up stack
205     m68k_areg(regs, 7) += 4;
206    
207     // Restore old PC
208     m68k_setpc(oldpc);
209     fill_prefetch_0();
210    
211     // Get registers
212     for (i=0; i<8; i++)
213     r->d[i] = m68k_dreg(regs, i);
214     for (i=0; i<7; i++)
215     r->a[i] = m68k_areg(regs, i);
216 gbeauche 1.15 quit_program = false;
217 cebix 1.1 }
218    
219    
220     /*
221     * Execute 68k subroutine
222     * The executed routine must reside in UAE memory!
223     * r->a[7] and r->sr are unused!
224     */
225    
226     void Execute68k(uint32 addr, struct M68kRegisters *r)
227     {
228     int i;
229    
230     // Save old PC
231     uaecptr oldpc = m68k_getpc();
232    
233     // Set registers
234     for (i=0; i<8; i++)
235     m68k_dreg(regs, i) = r->d[i];
236     for (i=0; i<7; i++)
237     m68k_areg(regs, i) = r->a[i];
238    
239     // Push EXEC_RETURN and faked return address (points to EXEC_RETURN) on stack
240     m68k_areg(regs, 7) -= 2;
241     put_word(m68k_areg(regs, 7), M68K_EXEC_RETURN);
242     m68k_areg(regs, 7) -= 4;
243     put_long(m68k_areg(regs, 7), m68k_areg(regs, 7) + 4);
244    
245     // Execute routine
246     m68k_setpc(addr);
247     fill_prefetch_0();
248 gbeauche 1.15 quit_program = false;
249 gbeauche 1.13 m68k_execute();
250 cebix 1.1
251     // Clean up stack
252     m68k_areg(regs, 7) += 2;
253    
254     // Restore old PC
255     m68k_setpc(oldpc);
256     fill_prefetch_0();
257    
258     // Get registers
259     for (i=0; i<8; i++)
260     r->d[i] = m68k_dreg(regs, i);
261     for (i=0; i<7; i++)
262     r->a[i] = m68k_areg(regs, i);
263 gbeauche 1.15 quit_program = false;
264 cebix 1.1 }