ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/basilisk_glue.cpp
Revision: 1.13
Committed: 2002-09-01T15:17:13Z (22 years, 3 months ago) by gbeauche
Branch: MAIN
Changes since 1.12: +5 -5 lines
Log Message:
- Merge with Basilisk II/JIT cpu core, interpretive part for now
- Clean use of USE_PREFETCH_BUFFER macro and dependent bits

File Contents

# User Rev Content
1 cebix 1.1 /*
2     * basilisk_glue.cpp - Glue UAE CPU to Basilisk II CPU engine interface
3     *
4 cebix 1.12 * Basilisk II (C) 1997-2002 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     #include "emul_op.h"
26     #include "rom_patches.h"
27     #include "m68k.h"
28     #include "memory.h"
29     #include "readcpu.h"
30     #include "newcpu.h"
31    
32    
33     // RAM and ROM pointers
34 gbeauche 1.7 uint32 RAMBaseMac = 0; // RAM base (Mac address space) gb-- init is important
35 cebix 1.1 uint8 *RAMBaseHost; // RAM base (host address space)
36     uint32 RAMSize; // Size of RAM
37     uint32 ROMBaseMac; // ROM base (Mac address space)
38     uint8 *ROMBaseHost; // ROM base (host address space)
39     uint32 ROMSize; // Size of ROM
40    
41     #if !REAL_ADDRESSING
42     // Mac frame buffer
43     uint8 *MacFrameBaseHost; // Frame buffer base (host address space)
44     uint32 MacFrameSize; // Size of frame buffer
45     int MacFrameLayout; // Frame buffer layout
46     #endif
47    
48 gbeauche 1.7 #if DIRECT_ADDRESSING
49     uintptr MEMBaseDiff; // Global offset between a Mac address and its Host equivalent
50     #endif
51    
52 cebix 1.1 // From newcpu.cpp
53     extern int quit_program;
54    
55    
56     /*
57     * Initialize 680x0 emulation, CheckROM() must have been called first
58     */
59    
60     bool Init680x0(void)
61     {
62     #if REAL_ADDRESSING
63     // Mac address space = host address space
64     RAMBaseMac = (uint32)RAMBaseHost;
65     ROMBaseMac = (uint32)ROMBaseHost;
66 gbeauche 1.7 #elif DIRECT_ADDRESSING
67 gbeauche 1.10 // Mac address space = host address space minus constant offset (MEMBaseDiff)
68 gbeauche 1.13 // NOTE: MEMBaseDiff is set up in main_unix.cpp/main()
69 gbeauche 1.10 RAMBaseMac = 0;
70     ROMBaseMac = Host2MacAddr(ROMBaseHost);
71 cebix 1.1 #else
72     // Initialize UAE memory banks
73     RAMBaseMac = 0;
74     switch (ROMVersion) {
75     case ROM_VERSION_64K:
76     case ROM_VERSION_PLUS:
77     case ROM_VERSION_CLASSIC:
78     ROMBaseMac = 0x00400000;
79     break;
80     case ROM_VERSION_II:
81     ROMBaseMac = 0x00a00000;
82     break;
83     case ROM_VERSION_32:
84     ROMBaseMac = 0x40800000;
85     break;
86     default:
87     return false;
88     }
89     memory_init();
90     #endif
91    
92     init_m68k();
93     return true;
94     }
95    
96    
97     /*
98     * Deinitialize 680x0 emulation
99     */
100    
101     void Exit680x0(void)
102     {
103 gbeauche 1.6 exit_m68k();
104 cebix 1.1 }
105    
106    
107     /*
108 cebix 1.11 * Initialize memory mapping of frame buffer (called upon video mode change)
109     */
110    
111     void InitFrameBufferMapping(void)
112     {
113     #if !REAL_ADDRESSING && !DIRECT_ADDRESSING
114     memory_init();
115     #endif
116     }
117    
118     /*
119 cebix 1.1 * Reset and start 680x0 emulation (doesn't return)
120     */
121    
122     void Start680x0(void)
123     {
124     m68k_reset();
125 gbeauche 1.13 m68k_execute();
126 cebix 1.1 }
127    
128    
129     /*
130     * Trigger interrupt
131     */
132    
133     void TriggerInterrupt(void)
134     {
135 gbeauche 1.13 SPCFLAGS_SET( SPCFLAG_INT );
136 cebix 1.1 }
137    
138 cebix 1.5 void TriggerNMI(void)
139     {
140     //!! not implemented yet
141     }
142    
143 cebix 1.1
144     /*
145     * Get 68k interrupt level
146     */
147    
148     int intlev(void)
149     {
150     return InterruptFlags ? 1 : 0;
151     }
152    
153    
154     /*
155     * Execute MacOS 68k trap
156     * r->a[7] and r->sr are unused!
157     */
158    
159     void Execute68kTrap(uint16 trap, struct M68kRegisters *r)
160     {
161     int i;
162    
163     // Save old PC
164     uaecptr oldpc = m68k_getpc();
165    
166     // Set registers
167     for (i=0; i<8; i++)
168     m68k_dreg(regs, i) = r->d[i];
169     for (i=0; i<7; i++)
170     m68k_areg(regs, i) = r->a[i];
171    
172     // Push trap and EXEC_RETURN on stack
173     m68k_areg(regs, 7) -= 2;
174     put_word(m68k_areg(regs, 7), M68K_EXEC_RETURN);
175     m68k_areg(regs, 7) -= 2;
176     put_word(m68k_areg(regs, 7), trap);
177    
178     // Execute trap
179     m68k_setpc(m68k_areg(regs, 7));
180     fill_prefetch_0();
181     quit_program = 0;
182 gbeauche 1.13 m68k_execute();
183 cebix 1.1
184     // Clean up stack
185     m68k_areg(regs, 7) += 4;
186    
187     // Restore old PC
188     m68k_setpc(oldpc);
189     fill_prefetch_0();
190    
191     // Get registers
192     for (i=0; i<8; i++)
193     r->d[i] = m68k_dreg(regs, i);
194     for (i=0; i<7; i++)
195     r->a[i] = m68k_areg(regs, i);
196     quit_program = 0;
197     }
198    
199    
200     /*
201     * Execute 68k subroutine
202     * The executed routine must reside in UAE memory!
203     * r->a[7] and r->sr are unused!
204     */
205    
206     void Execute68k(uint32 addr, struct M68kRegisters *r)
207     {
208     int i;
209    
210     // Save old PC
211     uaecptr oldpc = m68k_getpc();
212    
213     // Set registers
214     for (i=0; i<8; i++)
215     m68k_dreg(regs, i) = r->d[i];
216     for (i=0; i<7; i++)
217     m68k_areg(regs, i) = r->a[i];
218    
219     // Push EXEC_RETURN and faked return address (points to EXEC_RETURN) on stack
220     m68k_areg(regs, 7) -= 2;
221     put_word(m68k_areg(regs, 7), M68K_EXEC_RETURN);
222     m68k_areg(regs, 7) -= 4;
223     put_long(m68k_areg(regs, 7), m68k_areg(regs, 7) + 4);
224    
225     // Execute routine
226     m68k_setpc(addr);
227     fill_prefetch_0();
228     quit_program = 0;
229 gbeauche 1.13 m68k_execute();
230 cebix 1.1
231     // Clean up stack
232     m68k_areg(regs, 7) += 2;
233    
234     // Restore old PC
235     m68k_setpc(oldpc);
236     fill_prefetch_0();
237    
238     // Get registers
239     for (i=0; i<8; i++)
240     r->d[i] = m68k_dreg(regs, i);
241     for (i=0; i<7; i++)
242     r->a[i] = m68k_areg(regs, i);
243     quit_program = 0;
244     }