1 |
|
/* |
2 |
|
* C64_x.h - Put the pieces together, X specific stuff |
3 |
|
* |
4 |
< |
* Frodo (C) 1994-1997,2002-2003 Christian Bauer |
4 |
> |
* Frodo Copyright (C) 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 |
95 |
|
} |
96 |
|
#endif |
97 |
|
|
98 |
+ |
#ifdef __linux__ |
99 |
+ |
// select() timing is much more accurate under Linux |
100 |
+ |
static void Delay_usec(unsigned long usec) |
101 |
+ |
{ |
102 |
+ |
int was_error; |
103 |
+ |
struct timeval tv; |
104 |
+ |
|
105 |
+ |
tv.tv_sec = 0; |
106 |
+ |
tv.tv_usec = usec; |
107 |
+ |
do { |
108 |
+ |
errno = 0; |
109 |
+ |
was_error = select(0, NULL, NULL, NULL, &tv); |
110 |
+ |
} while (was_error && (errno == EINTR)); |
111 |
+ |
} |
112 |
+ |
#else |
113 |
+ |
static void Delay_usec(unsigned long usec) |
114 |
+ |
{ |
115 |
+ |
usleep(usec); |
116 |
+ |
} |
117 |
+ |
#endif |
118 |
+ |
|
119 |
|
|
120 |
|
/* |
121 |
|
* Constructor, system-dependent things |
128 |
|
joy_maxx[0] = joy_maxy[0] = -32768; |
129 |
|
joy_minx[1] = joy_miny[1] = 32767; |
130 |
|
joy_maxx[1] = joy_maxy[1] = -32768; |
110 |
– |
|
111 |
– |
// we need to create a potential GUI subprocess here, because we don't want |
112 |
– |
// it to inherit file-descriptors (such as for the audio-device and alike..) |
113 |
– |
#if defined(__svgalib__) |
114 |
– |
gui = 0; |
115 |
– |
#else |
116 |
– |
// try to start up Tk gui. |
117 |
– |
gui = new CmdPipe("wish", BINDIR "Frodo_GUI.tcl"); |
118 |
– |
if (gui) { |
119 |
– |
if (gui->fail) { |
120 |
– |
delete gui; gui = 0; |
121 |
– |
} |
122 |
– |
} |
123 |
– |
// wait until the GUI process responds (if it does...) |
124 |
– |
if (gui) { |
125 |
– |
if (5 != gui->ewrite("ping\n",5)) { |
126 |
– |
delete gui; gui = 0; |
127 |
– |
} else { |
128 |
– |
char c; |
129 |
– |
fd_set set; |
130 |
– |
FD_ZERO(&set); |
131 |
– |
FD_SET(gui->get_read_fd(), &set); |
132 |
– |
struct timeval tv; |
133 |
– |
tv.tv_usec = 0; |
134 |
– |
tv.tv_sec = 5; |
135 |
– |
// Use the following commented line for HP-UX < 10.20 |
136 |
– |
// if (select(FD_SETSIZE, (int *)&set, (int *)NULL, (int *)NULL, &tv) <= 0) { |
137 |
– |
if (select(FD_SETSIZE, &set, NULL, NULL, &tv) <= 0) { |
138 |
– |
delete gui; gui = 0; |
139 |
– |
} else { |
140 |
– |
if (1 != gui->eread(&c, 1)) { |
141 |
– |
delete gui; gui = 0; |
142 |
– |
} else { |
143 |
– |
if (c != 'o') { |
144 |
– |
delete gui; gui = 0; |
145 |
– |
} |
146 |
– |
} |
147 |
– |
} |
148 |
– |
} |
149 |
– |
} |
150 |
– |
#endif // __svgalib__ |
131 |
|
} |
132 |
|
|
133 |
|
void C64::c64_ctor2(void) |
134 |
|
{ |
135 |
< |
#ifndef __svgalib__ |
136 |
< |
if (!gui) { |
137 |
< |
fprintf(stderr,"Alas, master, no preferences window will be available.\n" |
138 |
< |
"If you wish to see one, make sure the 'wish' interpreter\n" |
159 |
< |
"(Tk version >= 4.1) is installed in your path.\n" |
160 |
< |
"You can still use Frodo, though. Use F10 to quit, \n" |
161 |
< |
"F11 to cause an NMI and F12 to reset the C64.\n" |
162 |
< |
"You can change the preferences by editing ~/.frodorc\n"); |
163 |
< |
} |
164 |
< |
#endif // SVGAlib |
135 |
> |
printf("Use F9 to enter the SAM machine language monitor,\n" |
136 |
> |
"F10 to edit preferences or quit,\n" |
137 |
> |
"F11 to cause an NMI (RESTORE key) and\n" |
138 |
> |
"F12 to reset the C64.\n\n"); |
139 |
|
|
140 |
|
gettimeofday(&tv_start, NULL); |
141 |
|
} |
221 |
|
|
222 |
|
// Limit speed to 100% if desired |
223 |
|
if ((speed_index > 100) && ThePrefs.LimitSpeed) { |
224 |
< |
usleep((unsigned long)(ThePrefs.SkipFrames * 20000 - elapsed_time)); |
224 |
> |
Delay_usec((unsigned long)(ThePrefs.SkipFrames * 20000 - elapsed_time)); |
225 |
|
speed_index = 100; |
226 |
|
} |
227 |
|
|
238 |
|
|
239 |
|
void C64::thread_func(void) |
240 |
|
{ |
267 |
– |
int linecnt = 0; |
268 |
– |
|
241 |
|
#ifdef FRODO_SC |
242 |
|
while (!quit_thyself) { |
243 |
|
|
286 |
|
// 1541 processor disabled, only emulate 6510 |
287 |
|
TheCPU->EmulateLine(cycles); |
288 |
|
#endif |
317 |
– |
linecnt++; |
318 |
– |
#if !defined(__svgalib__) |
319 |
– |
if ((linecnt & 0xfff) == 0 && gui) { |
320 |
– |
|
321 |
– |
// check for command from GUI process |
322 |
– |
// fprintf(stderr,":"); |
323 |
– |
while (gui->probe()) { |
324 |
– |
char c; |
325 |
– |
if (gui->eread(&c, 1) != 1) { |
326 |
– |
delete gui; |
327 |
– |
gui = 0; |
328 |
– |
fprintf(stderr,"Oops, GUI process died...\n"); |
329 |
– |
} else { |
330 |
– |
// fprintf(stderr,"%c",c); |
331 |
– |
switch (c) { |
332 |
– |
case 'q': |
333 |
– |
quit_thyself = true; |
334 |
– |
break; |
335 |
– |
case 'r': |
336 |
– |
Reset(); |
337 |
– |
break; |
338 |
– |
case 'p':{ |
339 |
– |
Prefs *np = Frodo::reload_prefs(); |
340 |
– |
NewPrefs(np); |
341 |
– |
ThePrefs = *np; |
342 |
– |
break; |
343 |
– |
} |
344 |
– |
default: |
345 |
– |
break; |
346 |
– |
} |
347 |
– |
} |
348 |
– |
} |
349 |
– |
} |
350 |
– |
#endif |
289 |
|
} |
290 |
< |
#if !defined(__svgalib__) |
291 |
< |
if (gui) { |
292 |
< |
gui->ewrite("quit\n",5); |
293 |
< |
} |
294 |
< |
#endif |
290 |
> |
} |
291 |
> |
|
292 |
> |
|
293 |
> |
/* |
294 |
> |
* Pause main emulation thread |
295 |
> |
*/ |
296 |
> |
|
297 |
> |
void C64::Pause(void) |
298 |
> |
{ |
299 |
> |
TheSID->PauseSound(); |
300 |
> |
} |
301 |
> |
|
302 |
> |
|
303 |
> |
/* |
304 |
> |
* Resume main emulation thread |
305 |
> |
*/ |
306 |
> |
|
307 |
> |
void C64::Resume(void) |
308 |
> |
{ |
309 |
> |
TheSID->ResumeSound(); |
310 |
|
} |