1 ////////////////////////////////////////////////////////////////////////////////
\r
3 ////////////////////////////////////////////////////////////////////////////////
\r
11 ////////////////////////////////////////////////////////////////////////////////
\r
14 #include <mmsystem.h>
\r
16 #endif // #ifndef __PORT__
\r
19 /* Added by SDLEMU (http://sdlemu.ngemu.com) */
\r
20 /* Added for GCC UNIX compatibility */
\r
23 #endif // #ifdef __GCCUNIX__
\r
29 /* Enable this (uncomment) for speed control */
\r
30 //#define SPEED_CONTROL
\r
33 Format format(16, 0x007C00, 0x00003E0, 0x0000001F);
\r
38 char * jaguar_boot_dir;
\r
40 void main_screen_switch(void)
\r
42 fullscreen = !fullscreen;
\r
44 console.option("fullscreen output");
\r
46 console.option("windowed output");
\r
48 console.open("WIP VERSION", tom_width, tom_height, format);
\r
53 /* Added/changed by SDLEMU http://sdlemu.ngemu.com */
\r
55 int main(int argc, char * argv[])
\r
57 uint32 startTime, totalFrames;//, endTime;//, w, h;
\r
59 uint32 nNormalLast = 0;
\r
60 int32 nNormalFrac = 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
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
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
86 jaguar_boot_dir = (char *)malloc(1024);
\r
87 getcwd(jaguar_boot_dir, 1024);
\r
89 log_init("jag_em.log");
\r
93 version_display(log_get());
\r
94 jaguar_init(argv[1]);
\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
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
106 /* Checking the switches ;) */
\r
107 for(int i=0; (i<argc || argv[i]!=NULL); i++)
\r
109 if (!strcmp(argv[i], "-fullscreen"))
\r
110 console.option("fullscreen output");
\r
112 if (!strcmp(argv[i], "-window"))
\r
113 console.option("windowed output");
\r
115 if (!strcmp(argv[i], "-joystick"))
\r
116 console.option("joystick enabled");
\r
118 if (!strcmp(argv[i], "-joyport"))
\r
120 nJoyport = atoi(argv[++i]) + 1;
\r
125 if (!strcmp(argv[i], "-frameskip"))
\r
127 nFrameskip = atoi(argv[++i]) + 1;
\r
128 if (nFrameskip > 10)
\r
130 #ifdef SPEED_CONTROL
\r
136 /* Initialize Joystick support under SDL */
\r
137 if (console.JoyEnabled() == 1)
\r
139 if (SDL_NumJoysticks() <= 0)
\r
141 console.option("joystick disabled");
\r
142 printf("No joystick(s) or joypad(s) detected on your system. Using keyboards....\n");
\r
146 if ((console.joystick = SDL_JoystickOpen(nJoyport)) == 0)
\r
148 console.option("joystick disabled");
\r
149 printf("Unable to open a Joystick on port : %d\n", (int)nJoyport);
\r
152 printf("Using: %s\n", SDL_JoystickName(nJoyport));
\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
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
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
173 // si le nombre de trames à passer + 1 est nul ou négatif,
\r
174 // ne rien faire pendant 2 ms
\r
179 } // No need to do anything for a bit
\r
182 nNormalFrac += nCount * 10000; //
\r
183 nNormalLast += nNormalFrac / 600; // add the duration of nNormalFrac frames
\r
184 nNormalFrac %= 600; //
\r
186 // Pas plus de 9 (10-1) trames non affichées
\r
189 for(int i=0; i<nCount-1; i++)
\r
190 jaguar_exec(backbuffer, 0);
\r
192 /* Setting up new backbuffer with new pixels and data */
\r
193 jaguar_exec(backbuffer, 1);
\r
196 /* Simple frameskip */
\r
197 if (nFrame == nFrameskip)
\r
201 int32 * vs = (int32 *)surface->lock();
\r
202 memcpy(vs, backbuffer, tom_width * tom_height * 2);
\r
204 surface->copy(console);
\r
213 #ifdef SPEED_CONTROL
\r
218 int elapsedTime = clock() - startTime;
\r
219 int fps = (1000 * totalFrames) / elapsedTime;
\r
220 fprintf(log_get(), "Statistics: %i fps\n", fps);
\r
222 if (console.JoyEnabled() == 1) {}
\r
224 // fprintf(log_get(), "--> About to do jaguar_done...\n");
\r
229 console.close(); // Close SDL items as last!
\r
235 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
\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
242 jaguar_boot_dir=(char*)malloc(1024);
\r
243 _getcwd(jaguar_boot_dir,1024);
\r
245 log_init("jagem.log");
\r
247 SDL_Event app_input_event;
\r
251 version_display(log_get());
\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
268 nNormalLast=0;// Last value of timeGetTime()
\r
269 nNormalFrac=0; // Extra fraction we did
\r
270 nNormalLast=timeGetTime();
\r
273 while ( SDL_PollEvent(&app_input_event) )
\r
275 if ( app_input_event.type == SDL_QUIT )
\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
288 // si le nombre de trames à passer + 1 est nul ou négatif,
\r
289 // ne rien faire pendant 2 ms
\r
293 } // No need to do anything for a bit
\r
296 nNormalFrac+=nCount*10000; //
\r
297 nNormalLast+=nNormalFrac/600; // add the duration of nNormalFrac frames
\r
298 nNormalFrac%=600; //
\r
300 // Pas plus de 9 (10-1) trames non affichées
\r
303 for (i=0;i<nCount-1;i++)
\r
304 jaguar_exec(backbuffer,0);
\r
306 jaguar_exec(backbuffer,1);
\r
309 int32 *vs = (int32 *)surface->lock();
\r
314 memcpy(vs,backbuffer,w*h*2);
\r
316 surface->copy(console);
\r
319 #ifdef SPEED_CONTROL
\r
323 int elapsedTime=clock()-startTime;
\r
324 int fps=(1000*totalFrames)/elapsedTime;
\r
325 fprintf(log_get(),"statistics: %i fps\n",fps);
\r