ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/main.cpp
Revision: 1.12
Committed: 2002-03-19T14:25:50Z (22 years, 8 months ago) by cebix
Branch: MAIN
Changes since 1.11: +31 -1 lines
Log Message:
XPRAM gets loaded with default values if "NuMc" signature isn't found. This is
done so the correct (default) video mode is used if the PRAM was wiped.

File Contents

# Content
1 /*
2 * main.cpp - Startup/shutdown code
3 *
4 * Basilisk II (C) 1997-2002 Christian Bauer
5 *
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
23 #include "cpu_emulation.h"
24 #include "xpram.h"
25 #include "timer.h"
26 #include "sony.h"
27 #include "disk.h"
28 #include "cdrom.h"
29 #include "scsi.h"
30 #include "extfs.h"
31 #include "audio.h"
32 #include "video.h"
33 #include "serial.h"
34 #include "ether.h"
35 #include "clip.h"
36 #include "adb.h"
37 #include "rom_patches.h"
38 #include "user_strings.h"
39 #include "prefs.h"
40 #include "main.h"
41
42 #define DEBUG 0
43 #include "debug.h"
44
45 #if ENABLE_MON
46 #include "mon.h"
47
48 static uint32 mon_read_byte_b2(uint32 adr)
49 {
50 return ReadMacInt8(adr);
51 }
52
53 static void mon_write_byte_b2(uint32 adr, uint32 b)
54 {
55 WriteMacInt8(adr, b);
56 }
57 #endif
58
59
60 /*
61 * Initialize everything, returns false on error
62 */
63
64 bool InitAll(void)
65 {
66 // Check ROM version
67 if (!CheckROM()) {
68 ErrorAlert(STR_UNSUPPORTED_ROM_TYPE_ERR);
69 return false;
70 }
71
72 #if EMULATED_68K
73 // Set CPU and FPU type (UAE emulation)
74 switch (ROMVersion) {
75 case ROM_VERSION_64K:
76 case ROM_VERSION_PLUS:
77 case ROM_VERSION_CLASSIC:
78 CPUType = 0;
79 FPUType = 0;
80 TwentyFourBitAddressing = true;
81 break;
82 case ROM_VERSION_II:
83 CPUType = PrefsFindInt32("cpu");
84 if (CPUType < 2) CPUType = 2;
85 if (CPUType > 4) CPUType = 4;
86 FPUType = PrefsFindBool("fpu") ? 1 : 0;
87 if (CPUType == 4) FPUType = 1; // 68040 always with FPU
88 TwentyFourBitAddressing = true;
89 break;
90 case ROM_VERSION_32:
91 CPUType = PrefsFindInt32("cpu");
92 if (CPUType < 2) CPUType = 2;
93 if (CPUType > 4) CPUType = 4;
94 FPUType = PrefsFindBool("fpu") ? 1 : 0;
95 if (CPUType == 4) FPUType = 1; // 68040 always with FPU
96 TwentyFourBitAddressing = false;
97 break;
98 }
99 CPUIs68060 = false;
100 #endif
101
102 // Load XPRAM
103 XPRAMInit();
104
105 // Load XPRAM default values if signature not found
106 if (XPRAM[0x0c] != 0x4e || XPRAM[0x0d] != 0x75
107 || XPRAM[0x0e] != 0x4d || XPRAM[0x0f] != 0x63) {
108 D(bug("Loading XPRAM default values\n"));
109 memset(XPRAM, 0, 0x100);
110 XPRAM[0x0c] = 0x4e; // "NuMc" signature
111 XPRAM[0x0d] = 0x75;
112 XPRAM[0x0e] = 0x4d;
113 XPRAM[0x0f] = 0x63;
114 XPRAM[0x01] = 0x80; // InternalWaitFlags = DynWait (don't wait for SCSI devices upon bootup)
115 XPRAM[0x10] = 0xa8; // Standard PRAM values
116 XPRAM[0x11] = 0x00;
117 XPRAM[0x12] = 0x00;
118 XPRAM[0x13] = 0x22;
119 XPRAM[0x14] = 0xcc;
120 XPRAM[0x15] = 0x0a;
121 XPRAM[0x16] = 0xcc;
122 XPRAM[0x17] = 0x0a;
123 XPRAM[0x1c] = 0x00;
124 XPRAM[0x1d] = 0x02;
125 XPRAM[0x1e] = 0x63;
126 XPRAM[0x1f] = 0x00;
127 XPRAM[0x08] = 0x13;
128 XPRAM[0x09] = 0x88;
129 XPRAM[0x0a] = 0x00;
130 XPRAM[0x0b] = 0xcc;
131 XPRAM[0x76] = 0x00; // OSDefault = MacOS
132 XPRAM[0x77] = 0x01;
133 }
134
135 // Set boot volume
136 int16 i16 = PrefsFindInt32("bootdrive");
137 XPRAM[0x78] = i16 >> 8;
138 XPRAM[0x79] = i16 & 0xff;
139 i16 = PrefsFindInt32("bootdriver");
140 XPRAM[0x7a] = i16 >> 8;
141 XPRAM[0x7b] = i16 & 0xff;
142
143 // Init drivers
144 SonyInit();
145 DiskInit();
146 CDROMInit();
147 SCSIInit();
148
149 #if SUPPORTS_EXTFS
150 // Init external file system
151 ExtFSInit();
152 #endif
153
154 // Init serial ports
155 SerialInit();
156
157 // Init network
158 EtherInit();
159
160 // Init Time Manager
161 TimerInit();
162
163 // Init clipboard
164 ClipInit();
165
166 // Init ADB
167 ADBInit();
168
169 // Init audio
170 AudioInit();
171
172 // Init video
173 if (!VideoInit(ROMVersion == ROM_VERSION_64K || ROMVersion == ROM_VERSION_PLUS || ROMVersion == ROM_VERSION_CLASSIC))
174 return false;
175
176 // Set default video mode in XPRAM
177 XPRAM[0x56] = 0x42; // 'B'
178 XPRAM[0x57] = 0x32; // '2'
179 XPRAM[0x58] = DepthToAppleMode(VideoMonitor.mode.depth);
180 XPRAM[0x59] = 0;
181
182 #if EMULATED_68K
183 // Init 680x0 emulation (this also activates the memory system which is needed for PatchROM())
184 if (!Init680x0())
185 return false;
186 #endif
187
188 // Install ROM patches
189 if (!PatchROM()) {
190 ErrorAlert(STR_UNSUPPORTED_ROM_TYPE_ERR);
191 return false;
192 }
193
194 #if ENABLE_MON
195 // Initialize mon
196 mon_init();
197 mon_read_byte = mon_read_byte_b2;
198 mon_write_byte = mon_write_byte_b2;
199 #endif
200
201 return true;
202 }
203
204
205 /*
206 * Deinitialize everything
207 */
208
209 void ExitAll(void)
210 {
211 #if ENABLE_MON
212 // Deinitialize mon
213 mon_exit();
214 #endif
215
216 // Save XPRAM
217 XPRAMExit();
218
219 // Exit video
220 VideoExit();
221
222 // Exit audio
223 AudioExit();
224
225 // Exit ADB
226 ADBExit();
227
228 // Exit clipboard
229 ClipExit();
230
231 // Exit Time Manager
232 TimerExit();
233
234 // Exit serial ports
235 SerialExit();
236
237 // Exit network
238 EtherExit();
239
240 #if SUPPORTS_EXTFS
241 // Exit external file system
242 ExtFSExit();
243 #endif
244
245 // Exit drivers
246 SCSIExit();
247 CDROMExit();
248 DiskExit();
249 SonyExit();
250 }
251
252
253 /*
254 * Display error/warning alert given the message string ID
255 */
256
257 void ErrorAlert(int string_id)
258 {
259 ErrorAlert(GetString(string_id));
260 }
261
262 void WarningAlert(int string_id)
263 {
264 WarningAlert(GetString(string_id));
265 }