ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Unix/main_unix.cpp
(Generate patch)

Comparing BasiliskII/src/Unix/main_unix.cpp (file contents):
Revision 1.24 by cebix, 2000-10-17T12:24:59Z vs.
Revision 1.28 by cebix, 2001-01-04T19:50:22Z

# Line 30 | Line 30
30   # include <pthread.h>
31   #endif
32  
33 < #if defined(USE_MAPPED_MEMORY) || REAL_ADDRESSING || DIRECT_ADDRESSING
33 > #if REAL_ADDRESSING || DIRECT_ADDRESSING
34   # include <sys/mman.h>
35   #endif
36  
# Line 50 | Line 50 | struct sigstate {
50  
51   #ifdef ENABLE_GTK
52   # include <gtk/gtk.h>
53 + # include <gdk/gdk.h>
54   #endif
55  
56   #ifdef ENABLE_XF86_DGA
# Line 160 | Line 161 | static bool memory_mapped_from_zero = fa
161   static uint32 mapped_ram_rom_size;              // Total size of mmap()ed RAM/ROM area
162   #endif
163  
163 #ifdef USE_MAPPED_MEMORY
164 extern char *address_space, *good_address_map;
165 #endif
166
164  
165   // Prototypes
166   static void *xpram_func(void *arg);
# Line 212 | Line 209 | int main(int argc, char **argv)
209          printf(GetString(STR_ABOUT_TEXT1), VERSION_MAJOR, VERSION_MINOR);
210          printf(" %s\n", GetString(STR_ABOUT_TEXT2));
211  
212 <        // Parse arguments
212 > #ifdef ENABLE_GTK
213 >        // Init GTK
214 >        gtk_set_locale();
215 >        gtk_init(&argc, &argv);
216 >        x_display_name = gdk_get_display(); // gtk_init() handles and removes the "--display" argument
217 > #endif
218 >
219 >        // Parse and remove arguments
220          for (int i=1; i<argc; i++) {
221 <                if (strcmp(argv[i], "-display") == 0 && ++i < argc)
222 <                        x_display_name = argv[i];
223 <                else if (strcmp(argv[i], "-break") == 0 && ++i < argc)
224 <                        ROMBreakpoint = strtol(argv[i], NULL, 0);
225 <                else if (strcmp(argv[i], "-rominfo") == 0)
221 >                if (strcmp(argv[i], "--display") == 0) {
222 >                        argv[i] = NULL;
223 >                        if ((i + 1) < argc && argv[i + 1]) {
224 >                                argv[i++] = NULL;
225 >                                x_display_name = strdup(argv[i]);
226 >                        }
227 >                } else if (strcmp(argv[i], "--break") == 0) {
228 >                        argv[i] = NULL;
229 >                        if ((i + 1) < argc && argv[i + 1]) {
230 >                                argv[i++] = NULL;
231 >                                ROMBreakpoint = strtol(argv[i], NULL, 0);
232 >                        }
233 >                } else if (strcmp(argv[i], "--rominfo") == 0) {
234 >                        argv[i] = NULL;
235                          PrintROMInfo = true;
236 +                }
237 +        }
238 +        for (int i=1; i<argc; i++) {
239 +                int k;
240 +                for (k=i; k<argc; k++)
241 +                        if (argv[k] != NULL)
242 +                                break;
243 +                if (k > i) {
244 +                        k -= i;
245 +                        for (int j=i+k; j<argc; j++)
246 +                                argv[j-k] = argv[j];
247 +                        argc -= k;
248 +                }
249          }
250  
251          // Open display
# Line 236 | Line 262 | int main(int argc, char **argv)
262          XF86DGAForkApp(DefaultScreen(x_display));
263   #endif
264  
239 #ifdef ENABLE_GTK
240        // Init GTK
241        gtk_set_locale();
242        gtk_init(&argc, &argv);
243 #endif
244
265          // Read preferences
266 <        PrefsInit();
266 >        PrefsInit(argc, argv);
267  
268          // Init system routines
269          SysInit();
# Line 313 | Line 333 | int main(int argc, char **argv)
333   #endif
334  
335          // Create areas for Mac RAM and ROM
336 < #if defined(USE_MAPPED_MEMORY)
317 <    good_address_map = (char *)mmap(NULL, 1<<24, PROT_READ, MAP_PRIVATE, zero_fd, 0);
318 <    address_space = (char *)mmap(NULL, 1<<24, PROT_READ | PROT_WRITE, MAP_PRIVATE, zero_fd, 0);
319 <    if ((int)address_space < 0 || (int)good_address_map < 0) {
320 <                ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR));
321 <                QuitEmulator();
322 <    }
323 <    RAMBaseHost = (uint8 *)mmap(address_space, RAMSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, zero_fd, 0);
324 <    ROMBaseHost = (uint8 *)mmap(address_space + 0x00400000, 0x80000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, zero_fd, 0);
325 <        char *nam = tmpnam(NULL);
326 <    int good_address_fd = open(nam, O_CREAT | O_RDWR, 0600);
327 <        char buffer[4096];
328 <    memset(buffer, 1, sizeof(buffer));
329 <    write(good_address_fd, buffer, sizeof(buffer));
330 <    unlink(nam);
331 <    for (int i=0; i<RAMSize; i+=4096)
332 <        mmap(good_address_map + i, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
333 <    for (int i=0; i<0x80000; i+=4096)
334 <        mmap(good_address_map + i + 0x00400000, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
335 < #elif REAL_ADDRESSING || DIRECT_ADDRESSING
336 > #if REAL_ADDRESSING || DIRECT_ADDRESSING
337          // gb-- Overkill, needs to be cleaned up. Probably explode it for either
338          // real or direct addressing mode.
339   #if REAL_ADDRESSING
# Line 773 | Line 774 | static void *xpram_func(void *arg)
774   {
775          while (!xpram_thread_cancel) {
776                  for (int i=0; i<60 && !xpram_thread_cancel; i++)
777 <                        Delay_usec(1000000);
777 >                        Delay_usec(999999);
778                  xpram_watchdog();
779          }
780          return NULL;
# Line 860 | Line 861 | uint64 GetTicks_usec(void)
861  
862   /*
863   *  Delay by specified number of microseconds (<1 second)
864 < *  (adapted from SDL_Delay() source)
864 > *  (adapted from SDL_Delay() source; this function is designed to provide
865 > *  the highest accuracy possible)
866   */
867  
868 + #if defined(linux)
869 + // Linux select() changes its timeout parameter upon return to contain
870 + // the remaining time. Most other unixen leave it unchanged or undefined.
871 + #define SELECT_SETS_REMAINING
872 + #elif defined(__FreeBSD__) || defined(__sun__) || defined(sgi)
873 + #define USE_NANOSLEEP
874 + #endif
875 +
876   void Delay_usec(uint32 usec)
877   {
878          int was_error;
879 < #ifndef __linux__       // Non-Linux implementations need to calculate time left
879 >
880 > #ifdef USE_NANOSLEEP
881 >        struct timespec elapsed, tv;
882 > #else
883 >        struct timeval tv;
884 > #ifndef SELECT_SETS_REMAINING
885          uint64 then, now, elapsed;
886   #endif
887 <        struct timeval tv;
887 > #endif
888  
889          // Set the timeout interval - Linux only needs to do this once
890 < #ifdef __linux__
891 <        tv.tv_sec = 0;
892 <        tv.tv_usec = usec;
890 > #ifdef SELECT_SETS_REMAINING
891 >    tv.tv_sec = 0;
892 >    tv.tv_usec = usec;
893 > #elif defined(USE_NANOSLEEP)
894 >    elapsed.tv_sec = 0;
895 >    elapsed.tv_nsec = usec * 1000;
896   #else
897 <        then = GetTicks_usec();
897 >    then = GetTicks_usec();
898   #endif
899 +
900          do {
901                  errno = 0;
902 < #ifndef __linux__
903 <                /* Calculate the time interval left (in case of interrupt) */
902 > #ifdef USE_NANOSLEEP
903 >                tv.tv_sec = elapsed.tv_sec;
904 >                tv.tv_nsec = elapsed.tv_nsec;
905 >                was_error = nanosleep(&tv, &elapsed);
906 > #else
907 > #ifndef SELECT_SETS_REMAINING
908 >                // Calculate the time interval left (in case of interrupt)
909                  now = GetTicks_usec();
910                  elapsed = now - then;
911                  then = now;
# Line 892 | Line 916 | void Delay_usec(uint32 usec)
916                  tv.tv_usec = usec;
917   #endif
918                  was_error = select(0, NULL, NULL, NULL, &tv);
919 + #endif
920          } while (was_error && (errno == EINTR));
921   }
922  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines