|
|
1.1.1.2 ! root 1: /* 1.1 root 2: * UAE - The Un*x Amiga Emulator 3: * 4: * Main program 5: * 6: * (c) 1995 Bernd Schmidt, Ed Hanway 7: */ 8: 1.1.1.2 ! root 9: #include "sysconfig.h" ! 10: #include "sysdeps.h" 1.1 root 11: #include <assert.h> 12: 13: #include "config.h" 14: #include "options.h" 15: #include "memory.h" 16: #include "custom.h" 17: #include "newcpu.h" 18: #include "disk.h" 19: #include "debug.h" 20: #include "xwin.h" 21: #include "os.h" 22: #include "filesys.h" 23: #include "keybuf.h" 1.1.1.2 ! root 24: #include "gui.h" 1.1 root 25: 1.1.1.2 ! root 26: int framerate = 1; ! 27: int dont_want_aspect = 1; ! 28: int use_debugger = 0; ! 29: int use_slow_mem = 0; ! 30: int use_gfxlib = 0; ! 31: int use_xhair = 0; ! 32: int use_lores = 0; ! 33: int automount_uaedev = 1; ! 34: int produce_sound = 1; ! 35: int fake_joystick = 0; ! 36: KbdLang keyboard_lang = KBD_LANG_US; ! 37: #ifndef __DOS__ ! 38: int screen_res = 3; ! 39: #else ! 40: int screen_res = 4; ! 41: #endif ! 42: int color_mode = 0; ! 43: ULONG fastmem_size = 0; ! 44: char df0[256]="df0.adf", df1[256]="df1.adf", df2[256]="df2.adf", df3[256]="df3.adf"; ! 45: char romfile[256] = "kick.rom"; ! 46: #ifndef __DOS__ ! 47: char prtname[256] = "lpr "; ! 48: #else ! 49: char prtname[256] = "LPT1:"; ! 50: #endif 1.1 root 51: 1.1.1.2 ! root 52: /* If you want to pipe Printer output to a file, put something like ! 53: * "cat >>printerfile.tmp" above. ! 54: * The printer support was only tested with the driver "PostScript" on ! 55: * Amiga side, using apsfilter for linux to print ps-data. ! 56: * ! 57: * Note for the DOS-Port: Maybe it's only neccesary to use a ! 58: * -p LPT1: or -p PRN: to print in a DOSBOX. I don't know, ! 59: * I do not use DOS... (please try) -=SR=- ! 60: */ ! 61: ! 62: #ifndef __bebox__ /* BeOS needs its own startup code */ ! 63: ! 64: static void usage(void) ! 65: { ! 66: printf("UAE - The Un*x Amiga emulator\n"); ! 67: printf("Summary of command-line options:\n"); ! 68: printf(" -h : Print help\n"); ! 69: printf(" -m VOLNAME:mount_point : mount file system at <mount point> as AmigaDOS\n" ! 70: " volume VOLNAME:\n"); ! 71: printf(" -M VOLNAME:mount_point : like -m, but mount read-only\n"); ! 72: printf(" -a : Don't mount the harddisk file automatically.\n" ! 73: " Useful only for testing.\n"); ! 74: printf(" -s : Emulate 1 MB slow memory at 0xC00000\n"); ! 75: printf(" -F n : Emulate n MB fast memory at 0x200000\n"); ! 76: printf(" -f n : Set the frame rate to 1/n\n"); ! 77: printf(" -D : Start up the built-in debugger\n"); ! 78: printf(" -[0123] file : Use file instead of df[0123].adf as disk image file\n"); ! 79: printf(" -r file : Use file as ROM image instead of kick.rom\n"); ! 80: printf(" -J : Fake joystick emulation with the numeric pad.\n"); ! 81: /* printf(" -g : Turn on gfx-lib replacement.\n");*/ ! 82: /* We'll have to sort out the following a little better in the future... */ ! 83: printf(" -S : Turn off sound support (if it is configured)\n"); ! 84: printf(" -x : Use visible cross-hair cursor (X Windows version)\n"); ! 85: printf(" -l lang : Set keyboard language to lang, where lang is\n" ! 86: " DE, SE, US, FR or IT\n"); ! 87: #if defined(__unix) && !defined(__DOS__) ! 88: printf(" -p command : Use command to pipe printer output to.\n"); ! 89: #else ! 90: printf(" -p filename : Use filename to save printer output (may be LPT1: ?)\n"); ! 91: #endif ! 92: printf(" -d mode : Select resolution with the mode parameter.\n"); ! 93: printf(" -H mode : Set the number of colors with the mode parameter.\n"); ! 94: printf("\n"); ! 95: #ifndef __DOS__ ! 96: printf("Valid resolutions: 0 (320x200); 1 (320x240); 2 (320x400); 3 (800x600);\n" ! 97: " 4 (800x600, correct aspect)\n" ! 98: "Valid color modes: 0 (256 colors); 1 (32768 colors); 2 (65536 colors)\n" ! 99: "UAE may choose to ignore the color mode/resolution setting.\n"); ! 100: #else ! 101: printf("Valid resolutions: 0 (320x200); 1 (320x240); 2 (320x400); 3 (640x480);\n" ! 102: " 4 (800x600); 5 (800x600, correct aspect)\n" ! 103: "Valid color modes: 0 (256 colors); 1 (32768 colors); 2 (65536 colors)\n" ! 104: "UAE may choose to ignore the color mode/resolution setting.\n"); ! 105: #endif ! 106: } 1.1 root 107: 1.1.1.2 ! root 108: #ifdef __unix 1.1 root 109: 110: static void parse_cmdline(int argc, char **argv) 111: { 112: int c; 113: extern char *optarg; 114: 1.1.1.2 ! root 115: while(((c = getopt(argc, argv, "l:Df:gd:hxF:asSJm:M:0:1:2:3:r:H:p:")) != EOF)) switch(c) { ! 116: case 'h': usage(); exit(0); ! 117: ! 118: case '0': strncpy(df0, optarg, 255); df0[255] = 0; break; ! 119: case '1': strncpy(df1, optarg, 255); df1[255] = 0; break; ! 120: case '2': strncpy(df2, optarg, 255); df2[255] = 0; break; ! 121: case '3': strncpy(df3, optarg, 255); df3[255] = 0; break; ! 122: case 'r': strncpy(romfile, optarg, 255); romfile[255] = 0; break; ! 123: case 'p': strncpy(prtname, optarg, 255); prtname[255] = 0; break; ! 124: case 'm': ! 125: case 'M': 1.1 root 126: { 127: /* mount file system (repeatable) 128: * syntax: [-m | -M] VOLNAME:/mount_point 129: * example: -M CDROM:/cdrom -m UNIXFS:./disk 130: */ 1.1.1.2 ! root 131: static int mount_seen = 0; ! 132: char buf[256]; 1.1 root 133: char *s2; 1.1.1.2 ! root 134: int readonly = (c == 'M'); ! 135: 1.1 root 136: if (mount_seen) 1.1.1.2 ! root 137: fprintf(stderr, "warning: multiple mounts confuse Kickstart 1.3\n"); ! 138: mount_seen = 1; ! 139: strncpy(buf, optarg, 255); buf[255] = 0; ! 140: s2 = strchr(buf, ':'); ! 141: if(s2) { ! 142: *s2++ = '\0'; ! 143: #ifdef __DOS__ ! 144: { ! 145: char *tmp; ! 146: ! 147: while ((tmp = strchr(s2, '\\'))) ! 148: *tmp = '/'; 1.1 root 149: } 1.1.1.2 ! root 150: #endif ! 151: add_filesys_unit(buf, s2, readonly); ! 152: } else { ! 153: fprintf(stderr, "Usage: [-m | -M] VOLNAME:/mount_point\n"); 1.1 root 154: } 155: } 156: break; 157: 1.1.1.2 ! root 158: case 'S': produce_sound = 0; break; ! 159: case 'f': framerate = atoi(optarg); break; ! 160: case 'x': use_xhair = 1; break; ! 161: case 'D': use_debugger = 1; break; ! 162: case 'J': fake_joystick = 1; break; ! 163: case 'a': automount_uaedev = 0; break; ! 164: case 's': use_slow_mem = 1; break; ! 165: case 'g': use_gfxlib = 1; break; ! 166: ! 167: case 'F': ! 168: fastmem_size = atoi(optarg) * 0x100000; ! 169: if (fastmem_size != 0x100000 && fastmem_size != 0x200000 ! 170: && fastmem_size != 0x400000 && fastmem_size != 0x800000) ! 171: { ! 172: fastmem_size = 0; ! 173: fprintf(stderr, "Unsupported fastmem size!\n"); ! 174: } 1.1 root 175: 176: break; 177: 178: case 'l': 179: if (0 == strcasecmp(optarg, "de")) 180: keyboard_lang = KBD_LANG_DE; 181: else if (0 == strcasecmp(optarg, "us")) 182: keyboard_lang = KBD_LANG_US; 1.1.1.2 ! root 183: else if (0 == strcasecmp(optarg, "se")) ! 184: keyboard_lang = KBD_LANG_SE; ! 185: else if (0 == strcasecmp(optarg, "fr")) ! 186: keyboard_lang = KBD_LANG_FR; ! 187: else if (0 == strcasecmp(optarg, "it")) ! 188: keyboard_lang = KBD_LANG_IT; 1.1 root 189: break; 190: 1.1.1.2 ! root 191: case 'd': ! 192: screen_res = atoi(optarg); ! 193: #ifndef __DOS__ ! 194: if (screen_res >= 0 && screen_res <= 4) { ! 195: } else { ! 196: fprintf(stderr, "Bad video mode selected. Using default.\n"); ! 197: screen_res = 3; ! 198: } ! 199: dont_want_aspect = screen_res != 4; ! 200: #else ! 201: if (screen_res >= 0 && screen_res <= 5) { ! 202: } else { ! 203: fprintf(stderr, "Bad video mode selected. Using default.\n"); ! 204: screen_res = 4; ! 205: } ! 206: dont_want_aspect = screen_res != 5; ! 207: #endif ! 208: use_lores = screen_res < 3; 1.1 root 209: break; 1.1.1.2 ! root 210: ! 211: case 'H': ! 212: color_mode = atoi(optarg); ! 213: if (color_mode < 0 || color_mode > 2) { ! 214: fprintf(stderr, "Bad color mode selected. Using default.\n"); ! 215: color_mode = 0; ! 216: } 1.1 root 217: break; 218: } 219: } 220: #endif 221: 1.1.1.2 ! root 222: static void parse_cmdline_and_init_file(int argc, char **argv) ! 223: { ! 224: FILE *f; ! 225: char file[256], *home; ! 226: char *buffer,*tmpbuf, *token; ! 227: char smallbuf[256]; ! 228: int bufsiz, result; ! 229: int n_args; ! 230: char **new_argv; ! 231: int new_argc; ! 232: ! 233: strcpy(file,""); ! 234: ! 235: #if !defined(__DOS__) && !defined(__mac__) ! 236: home = getenv("HOME"); ! 237: if (home != NULL && strlen(home) < 240) ! 238: { ! 239: strcpy(file, home); ! 240: strcat(file, "/"); ! 241: } ! 242: #endif ! 243: ! 244: #if defined(__unix) && !defined(__DOS__) ! 245: strcat(file, ".uaerc"); ! 246: #else ! 247: strcat(file, "uae.rc"); ! 248: #endif ! 249: ! 250: f = fopen(file,"rb"); ! 251: if (f == NULL) { ! 252: parse_cmdline(argc, argv); ! 253: return; ! 254: } ! 255: fseek(f, 0, SEEK_END); ! 256: bufsiz = ftell(f); ! 257: fseek(f, 0, SEEK_SET); ! 258: ! 259: buffer = (char *)malloc(bufsiz+1); ! 260: buffer[bufsiz] = 0; ! 261: if (fread(buffer, 1, bufsiz, f) < bufsiz) { ! 262: fprintf(stderr, "Error reading configuration file\n"); ! 263: fclose(f); ! 264: parse_cmdline(argc, argv); ! 265: return; ! 266: } ! 267: fclose(f); ! 268: ! 269: #ifdef __DOS__ ! 270: { ! 271: char *tmp; ! 272: ! 273: while ((tmp = strchr(buffer, 0x0d))) ! 274: *tmp = ' '; ! 275: while ((tmp = strchr(buffer, 0x0a))) ! 276: *tmp = ' '; ! 277: while (buffer[0] == ' ') ! 278: strcpy(buffer, buffer+1); ! 279: while ((strlen(buffer) > 0) && (buffer[strlen(buffer) - 1] == ' ')) ! 280: buffer[strlen(buffer) - 1] = '\0'; ! 281: while ((tmp = strstr(buffer, " "))) ! 282: strcpy(tmp, tmp+1); ! 283: } ! 284: #endif ! 285: ! 286: tmpbuf = my_strdup (buffer); ! 287: ! 288: n_args = 0; ! 289: if (strtok(tmpbuf, "\n ") != NULL) { ! 290: do { ! 291: n_args++; ! 292: } while (strtok(NULL, "\n ") != NULL); ! 293: } ! 294: free (tmpbuf); ! 295: ! 296: new_argv = (char **)malloc ((1 + n_args + argc) * sizeof (char **)); ! 297: new_argv[0] = argv[0]; ! 298: new_argc = 1; ! 299: ! 300: token = strtok(buffer, "\n "); ! 301: while (token != NULL) { ! 302: new_argv[new_argc] = my_strdup (token); ! 303: new_argc++; ! 304: token = strtok(NULL, "\n "); ! 305: } ! 306: for (n_args = 1; n_args < argc; n_args++) ! 307: new_argv[new_argc++] = argv[n_args]; ! 308: new_argv[new_argc] = NULL; ! 309: parse_cmdline(new_argc, new_argv); ! 310: } ! 311: 1.1 root 312: int main(int argc, char **argv) 313: { 1.1.1.2 ! root 314: parse_cmdline_and_init_file(argc, argv); ! 315: if (produce_sound && !init_sound()) { ! 316: fprintf(stderr, "Sound driver unavailable: Sound output disabled\n"); ! 317: produce_sound = 0; 1.1 root 318: } 319: 1.1.1.2 ! root 320: if (gui_init() < 0) { ! 321: fprintf(stderr, "Failed to initialize the GUI\n"); ! 322: /* abort()? Maybe. */ ! 323: } 1.1 root 324: init_joystick(); 1.1.1.2 ! root 325: keybuf_init(); 1.1 root 326: memory_init(); 327: custom_init(); 328: DISK_init(); 1.1.1.2 ! root 329: init_m68k(); ! 330: ! 331: if (graphics_init()) { ! 332: MC68000_reset(); 1.1 root 333: 1.1.1.2 ! root 334: debug(); 1.1 root 335: 1.1.1.2 ! root 336: graphics_leave(); ! 337: close_joystick(); ! 338: } ! 339: #ifdef COUNT_INSTRS ! 340: { ! 341: extern void dump_counts(void); ! 342: dump_counts(); ! 343: } 1.1 root 344: #endif 1.1.1.2 ! root 345: gui_exit(); 1.1 root 346: return 0; 347: } 1.1.1.2 ! root 348: #endif /* not __bebox__ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.