]> Shamusworld >> Repos - virtualjaguar/blob - src/Jagem.cpp
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes.
[virtualjaguar] / src / Jagem.cpp
1 ////////////////////////////////////////////////////////////////////////////////\r
2 //\r
3 ////////////////////////////////////////////////////////////////////////////////\r
4 //\r
5 //\r
6 //\r
7 //\r
8 //\r
9 //\r
10 //\r
11 ////////////////////////////////////////////////////////////////////////////////\r
12 #ifndef __PORT__\r
13 #include "stdafx.h"\r
14 #include <mmsystem.h>\r
15 #include <direct.h>\r
16 #endif  // #ifndef __PORT__\r
17 #include <time.h>\r
18 \r
19 /* Added by SDLEMU (http://sdlemu.ngemu.com) */\r
20 /* Added for GCC UNIX compatibility          */\r
21 #ifdef __GCCUNIX__\r
22 #include <unistd.h>\r
23 #endif  // #ifdef __GCCUNIX__\r
24 \r
25 #include <SDL.h>\r
26 #include "SDLptc.h"\r
27 #include "jaguar.h"\r
28 \r
29 /* Enable this (uncomment) for speed control */\r
30 //#define SPEED_CONTROL\r
31 \r
32 Surface * surface;\r
33 Format format(16, 0x007C00, 0x00003E0, 0x0000001F);\r
34 uint8 finished = 0;\r
35 Console console;\r
36 \r
37 int fullscreen = 0;\r
38 char * jaguar_boot_dir;\r
39 \r
40 void main_screen_switch(void)\r
41 {\r
42         fullscreen = !fullscreen;\r
43         if (fullscreen)\r
44                 console.option("fullscreen output");\r
45         else\r
46                 console.option("windowed output");\r
47         console.close();\r
48         console.open("WIP VERSION", tom_width, tom_height, format);\r
49 }\r
50 \r
51 #ifdef __PORT__\r
52 \r
53 /* Added/changed by SDLEMU http://sdlemu.ngemu.com */\r
54 \r
55 int main(int argc, char * argv[])\r
56 {\r
57         uint32 startTime, totalFrames;//, endTime;//, w, h;\r
58 //      int32 * vs;\r
59         uint32 nNormalLast = 0;\r
60         int32 nNormalFrac = 0; \r
61 //      int32 i = 0;\r
62 //unused        int32 nTime = 0;\r
63 //unused        int32 nCount = 0;\r
64     int32 nFrameskip = 1;                                                               // Frameskip\r
65     int32 nFrame = 0;                                                                   // No. of Frame\r
66     int32 nJoyport = 0;                                                                 // Joystick port\r
67 \r
68         printf("Virtual Jaguar/SDL v1.0.1 (GCC/SDL Port)\n");\r
69         printf("Based upon Virtual Jaguar core v1.0.0 by Potato emulation.\n");\r
70         printf("Written by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)\n");\r
71         printf("Portions massaged by James L. Hammons (WIN32)\n");\r
72         printf("Contact : http://sdlemu.ngemu.com/ | sdlemu@ngemu.com\n");\r
73 \r
74         if (argc <= 1)\r
75         {\r
76             printf("Usage : \n\n");\r
77                 printf("jag_em <romfile> [switches]  ]\n");\r
78                 printf("                  -fullscreen     : Enable fullscreen mode           \n");\r
79                 printf("                  -window         : Enable windowed   mode (default) \n");\r
80                 printf("                  -frameskip 1-10 : Enable frameskip 1 (default) - 10\n");\r
81                 printf("                  -joystick       : Enable joystick/gamepad          \n");\r
82                 printf("                  -joyport   0-3  : Select desired joystick port     \n");\r
83                 return true;\r
84         }\r
85 \r
86         jaguar_boot_dir = (char *)malloc(1024);\r
87         getcwd(jaguar_boot_dir, 1024);\r
88 \r
89         log_init("jag_em.log");\r
90 \r
91         memory_init();\r
92         version_init();\r
93         version_display(log_get());\r
94         jaguar_init(argv[1]);\r
95         jaguar_reset();\r
96         \r
97         /* Setting up the backbuffer */\r
98         int16 * backbuffer = (int16 *)malloc(845 * 525 * sizeof(int16));\r
99         memset(backbuffer, 0xAA, tom_getVideoModeWidth() * tom_getVideoModeHeight() * sizeof(int16));\r
100 \r
101         /* Setting up the primary SDL display */\r
102 //Already defined!      Format format(16, 0x007C00, 0x00003E0, 0x0000001F);\r
103         surface = new Surface(tom_getVideoModeWidth(), tom_getVideoModeHeight(), format);\r
104     console.option("windowed output");\r
105 \r
106         /* Checking the switches ;) */\r
107         for(int i=0; (i<argc || argv[i]!=NULL); i++)\r
108         {\r
109                 if (!strcmp(argv[i], "-fullscreen")) \r
110                         console.option("fullscreen output");\r
111 \r
112                 if (!strcmp(argv[i], "-window")) \r
113                         console.option("windowed output");\r
114 \r
115                 if (!strcmp(argv[i], "-joystick")) \r
116                         console.option("joystick enabled");\r
117 \r
118                 if (!strcmp(argv[i], "-joyport"))\r
119                 {\r
120                         nJoyport = atoi(argv[++i]) + 1;\r
121                         if (nJoyport > 3)\r
122                                 nJoyport = 3;\r
123                 }\r
124 \r
125                 if (!strcmp(argv[i], "-frameskip"))\r
126                 {\r
127                         nFrameskip = atoi(argv[++i]) + 1;\r
128                         if (nFrameskip > 10)\r
129                                 nFrameskip = 10;\r
130                         #ifdef SPEED_CONTROL\r
131                            nFrameskip = 0;\r
132             #endif\r
133            }\r
134     }\r
135 \r
136         /* Initialize Joystick support under SDL */\r
137         if (console.JoyEnabled() == 1)\r
138         {\r
139                 if (SDL_NumJoysticks() <= 0)\r
140                 {\r
141                 console.option("joystick disabled");\r
142                         printf("No joystick(s) or joypad(s) detected on your system. Using keyboards....\n");\r
143                 }\r
144                 else\r
145                 {\r
146                         if ((console.joystick = SDL_JoystickOpen(nJoyport)) == 0)\r
147                         {\r
148                                 console.option("joystick disabled");\r
149                                 printf("Unable to open a Joystick on port : %d\n", (int)nJoyport);\r
150                         }\r
151                         else\r
152                                 printf("Using: %s\n", SDL_JoystickName(nJoyport));\r
153                 }\r
154         }\r
155 \r
156         /* Open the display and start emulating some l337 Atari Jaguar games :P */\r
157         console.open("Virtual Jaguar", tom_getVideoModeWidth(), tom_getVideoModeHeight(), format);\r
158         \r
159         totalFrames = 0;\r
160         startTime = clock();\r
161         nNormalLast = 0;                                                                        // Last value of timeGetTime()\r
162         nNormalFrac = 0;                                                                        // Extra fraction we did\r
163         nNormalLast = SDL_GetTicks();                                           //timeGetTime();\r
164 \r
165         while (!finished)\r
166         {\r
167 #ifdef SPEED_CONTROL\r
168                 nTime = SDL_GetTicks() - nNormalLast;                   // calcule le temps écoulé depuis le dernier affichage\r
169                                                                                                                 // nTime est en mili-secondes.\r
170                 // détermine le nombre de trames à passer + 1\r
171                 nCount = (nTime * 600 - nNormalFrac) / 10000;\r
172 \r
173                 // si le nombre de trames à passer + 1 est nul ou négatif,\r
174                 // ne rien faire pendant 2 ms\r
175                 if (nCount <= 0) \r
176                 { \r
177                         //Sleep(2); \r
178                         //SDL_Delay(1);\r
179                 } // No need to do anything for a bit\r
180                 else\r
181                 {\r
182                         nNormalFrac += nCount * 10000;                          // \r
183                         nNormalLast += nNormalFrac / 600;                       // add the duration of nNormalFrac frames\r
184                         nNormalFrac %= 600;                                                     // \r
185 \r
186                         // Pas plus de 9 (10-1) trames non affichées \r
187                         if (nCount > 10)\r
188                                 nCount = 10;\r
189                         for(int i=0; i<nCount-1; i++)\r
190                                 jaguar_exec(backbuffer, 0);\r
191 #endif\r
192             /* Setting up new backbuffer with new pixels and data */\r
193                         jaguar_exec(backbuffer, 1);\r
194                         totalFrames++;\r
195 \r
196                         /* Simple frameskip */\r
197                         if (nFrame == nFrameskip)\r
198                         {\r
199 //                              w = tom_width;\r
200 //                              h = tom_height;\r
201                                 int32 * vs = (int32 *)surface->lock();\r
202                                 memcpy(vs, backbuffer, tom_width * tom_height * 2);\r
203                                 surface->unlock();\r
204                                 surface->copy(console);\r
205                                 console.update();\r
206                                 nFrame = 0;\r
207                         }\r
208                         else\r
209                                 nFrame++;\r
210 \r
211                         joystick_exec();\r
212                         \r
213 #ifdef SPEED_CONTROL\r
214                 }\r
215 #endif\r
216         }\r
217 \r
218         int elapsedTime = clock() - startTime;\r
219         int fps = (1000 * totalFrames) / elapsedTime;\r
220         fprintf(log_get(), "Statistics: %i fps\n", fps);\r
221         \r
222         if (console.JoyEnabled() == 1) {}\r
223  \r
224 //      fprintf(log_get(), "--> About to do jaguar_done...\n");\r
225         jaguar_done();\r
226         version_done();\r
227         memory_done();\r
228         log_done();     \r
229         console.close();                                                                        // Close SDL items as last!\r
230     return 0;\r
231 }\r
232 \r
233 #else\r
234 \r
235 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)\r
236 {\r
237         uint32           startTime, endTime, totalFrames;\r
238         unsigned int nNormalLast=0;\r
239         int                      nNormalFrac=0; \r
240         int                      nTime=0,nCount=0; int i=0;\r
241 \r
242         jaguar_boot_dir=(char*)malloc(1024);\r
243         _getcwd(jaguar_boot_dir,1024);\r
244 \r
245         log_init("jagem.log");\r
246         // 15 bits RGB555\r
247         SDL_Event       app_input_event;\r
248 \r
249         memory_init();\r
250         version_init();\r
251         version_display(log_get());\r
252         jaguar_init();\r
253         jaguar_reset();\r
254         \r
255 \r
256         int16 * backbuffer = (int16 *)malloc(845 * 525 * sizeof(int16));\r
257         memset(backbuffer, 0xAA, tom_getVideoModeWidth() * tom_getVideoModeHeight() * sizeof(int16));\r
258         surface=new Surface(tom_getVideoModeWidth(),tom_getVideoModeHeight(),format);\r
259         console.option("DirectX");\r
260         console.option("windowed output");\r
261 //      console.option("fullscreen output");\r
262         console.option("center window");\r
263         console.open("WIP VERSION",tom_getVideoModeWidth(),tom_getVideoModeHeight(),format);\r
264         uint32 surfacePitch=(surface->pitch()>>1);\r
265 \r
266         totalFrames=0;\r
267         startTime=clock();\r
268         nNormalLast=0;// Last value of timeGetTime()\r
269         nNormalFrac=0; // Extra fraction we did\r
270         nNormalLast=timeGetTime();\r
271         while (!finished)\r
272         {\r
273                 while ( SDL_PollEvent(&app_input_event) )\r
274                 {\r
275                         if ( app_input_event.type == SDL_QUIT )\r
276                         {\r
277                                 finished = 1;\r
278                         }\r
279                 }\r
280                 joystick_exec();\r
281 #define SPEED_CONTROL\r
282 #ifdef SPEED_CONTROL\r
283                 nTime=timeGetTime()-nNormalLast;                                          // calcule le temps écoulé depuis le dernier affichage\r
284                                                                                                                           // nTime est en mili-secondes.\r
285                 // détermine le nombre de trames à passer + 1\r
286                 nCount=(nTime*600 - nNormalFrac) /10000;        \r
287 \r
288                 // si le nombre de trames à passer + 1 est nul ou négatif,\r
289                 // ne rien faire pendant 2 ms\r
290                 if (nCount<=0) \r
291                 { \r
292                         Sleep(2); \r
293                 } // No need to do anything for a bit\r
294                 else\r
295                 {\r
296                         nNormalFrac+=nCount*10000;                              // \r
297                         nNormalLast+=nNormalFrac/600;                           // add the duration of nNormalFrac frames\r
298                         nNormalFrac%=600;                                                       // \r
299 \r
300                         // Pas plus de 9 (10-1) trames non affichées \r
301                         if (nCount>10) \r
302                           nCount=10; \r
303                         for (i=0;i<nCount-1;i++) \r
304                                 jaguar_exec(backbuffer,0);\r
305 #endif\r
306                         jaguar_exec(backbuffer,1);\r
307                         totalFrames++;\r
308 \r
309                         int32 *vs = (int32 *)surface->lock();\r
310                         uint32 w,h;\r
311                         w=tom_width;\r
312                         h=tom_height;\r
313 \r
314                         memcpy(vs,backbuffer,w*h*2);\r
315                         surface->unlock();\r
316                         surface->copy(console);\r
317 \r
318                         console.update();\r
319 #ifdef SPEED_CONTROL\r
320                 }\r
321 #endif\r
322         }\r
323         int elapsedTime=clock()-startTime;\r
324         int fps=(1000*totalFrames)/elapsedTime;\r
325         fprintf(log_get(),"statistics: %i fps\n",fps);\r
326         \r
327         console.close();\r
328 \r
329         jaguar_done();\r
330         version_done();\r
331         memory_done();\r
332         log_done();     \r
333     return 0;\r
334     \r
335 }\r
336 \r
337 #endif\r
338 \r