|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Main program
5: *
6: * (c) 1995 Bernd Schmidt, Ed Hanway
7: */
8:
9: #include "sysconfig.h"
10: #include "sysdeps.h"
11: #include <assert.h>
12:
13: #include "config.h"
14: #include "options.h"
15: #include "memory.h"
16: #include "custom.h"
17: #include "serial.h"
18: #include "newcpu.h"
19: #include "disk.h"
20: #include "debug.h"
21: #include "xwin.h"
22: #include "os.h"
23: #include "keybuf.h"
24: #include "gui.h"
25: #include "zfile.h"
26: #include "autoconf.h"
27: #include "compiler.h"
28:
29: int version = 100*UAEMAJOR + 10*UAEMINOR + UAEURSAMINOR;
30: int framerate = 1;
31: int use_debugger = 0;
32: int illegal_mem = 0;
33: int use_gfxlib = 0;
34: int no_xhair = 0;
35: int use_lores = 0;
36: int use_serial = 0;
37: int automount_uaedev = 1;
38: int produce_sound = 0;
39: int fake_joystick = 0;
40: KbdLang keyboard_lang = KBD_LANG_US;
41: int screen_res = 4;
42: int correct_aspect = 0;
43: int color_mode = 0;
44: int sound_desired_bits = 16;
45: int sound_desired_freq = 44100;
46: int sound_desired_bsiz = 8192;
47: int allow_save = 0;
48: int no_gui = 0;
49:
50: long hardfile_size = 0;
51:
52: ULONG fastmem_size = 0x000000;
53: ULONG chipmem_size = 0x200000;
54: ULONG bogomem_size = 0x000000;
55: char df0[256]="df0.adf", df1[256]="df1.adf", df2[256]="df2.adf", df3[256]="df3.adf";
56: char romfile[256] = "kick.rom";
57: #ifndef __DOS__
58: char prtname[256] = "lpr ";
59: #else
60: char prtname[256] = "PRN";
61: #endif
62:
63: char optionsfile[256];
64:
65: /* If you want to pipe Printer output to a file, put something like
66: * "cat >>printerfile.tmp" above.
67: * The printer support was only tested with the driver "PostScript" on
68: * Amiga side, using apsfilter for linux to print ps-data.
69: *
70: * Note for the DOS-Port: Maybe it's only neccesary to use a
71: * -p LPT1: or -p PRN: to print in a DOSBOX. I don't know,
72: * I do not use DOS... (please try) -=SR=-
73: */
74:
75: /* People must provide their own name for this */
76: char sername[256] = "";
77:
78: /* And again: Serial lines work under Linux. I don't know
79: * how this behaves in other OSes. This is work for the porting
80: * people -=SR=-
81: */
82:
83: void usage(void)
84: {
85: printf("UAE - The Un*x Amiga emulator\n");
86: printf("Summary of command-line options:\n");
87: printf(" -h : Print help\n");
88: printf(" -m VOLNAME:mount_point : mount file system at <mount point> as AmigaDOS\n"
89: " volume VOLNAME:\n");
90: printf(" -M VOLNAME:mount_point : like -m, but mount read-only\n");
91: printf(" -s n : Emulate n*256 KB slow memory at 0xC00000\n");
92: printf(" -c n : Emulate n*512 KB chip memory at 0x000000\n");
93: printf(" -F n : Emulate n MB fast memory at 0x200000\n");
94: printf(" -a : Add no expansion devices (disables fastmem and\n"
95: " harddisk support.\n");
96: printf(" -J : Fake joystick emulation with the numeric pad.\n");
97: printf(" -f n : Set the frame rate to 1/n\n");
98: printf(" -D : Start up the built-in debugger\n");
99: printf(" -i : Print illegal memory accesses\n");
100: printf(" -o : Allow options to be saved\n");
101: printf(" -G : Disable user interface\n");
102: printf(" -[0123] file : Use file instead of df[0123].adf as disk image.e\n");
103: printf(" -r file : Use file as ROM image instead of kick.rom\n");
104: target_specific_usage();
105: /* printf(" -g : Turn on gfx-lib replacement (EXPERIMENTAL).\n");*/
106: printf(" -d mode : Select resolution with the mode parameter.\n");
107: printf(" -H mode : Set the number of colors with the mode parameter.\n");
108: printf(" -C : Use correct aspect display mode.\n");
109: printf("\n");
110: printf("Valid resolutions: 0 (320x200); 1 (320x240); 2 (320x400); 3 (640x480);\n"
111: " 4 (800x600)\n"
112: "Valid color modes: 0 (256 colors); 1 (32768 colors); 2 (65536 colors)\n"
113: " 3 (256 colors, with dithering for better results)\n"
114: " 4 (16 colors, dithered); 5 (16 million colors)\n"
115: "UAE may choose to ignore the color mode/resolution setting.\n");
116: }
117:
118: #ifdef __unix
119:
120: void parse_cmdline(int argc, char **argv)
121: {
122: int c;
123: extern char *optarg;
124:
125: while(((c = getopt(argc, argv, "l:Dif:gd:hxF:as:c:S:Jm:M:0:1:2:3:r:H:p:CI:b:R:B:oG")) != EOF))
126: switch(c) {
127: case 'h': usage(); exit(0);
128:
129: case '0': strncpy(df0, optarg, 255); df0[255] = 0; break;
130: case '1': strncpy(df1, optarg, 255); df1[255] = 0; break;
131: case '2': strncpy(df2, optarg, 255); df2[255] = 0; break;
132: case '3': strncpy(df3, optarg, 255); df3[255] = 0; break;
133: case 'r': strncpy(romfile, optarg, 255); romfile[255] = 0; break;
134: case 'p': strncpy(prtname, optarg, 255); prtname[255] = 0; break;
135: case 'I': strncpy(sername, optarg, 255); sername[255] = 0; use_serial = 1; break;
136: case 'm':
137: case 'M':
138: {
139: char buf[256];
140: char *s2;
141: int readonly = (c == 'M');
142:
143: strncpy(buf, optarg, 255); buf[255] = 0;
144: s2 = strchr(buf, ':');
145: if(s2) {
146: *s2++ = '\0';
147: #ifdef __DOS__
148: {
149: char *tmp;
150:
151: while ((tmp = strchr(s2, '\\')))
152: *tmp = '/';
153: }
154: #endif
155: add_filesys_unit(buf, s2, readonly);
156: } else {
157: fprintf(stderr, "Usage: [-m | -M] VOLNAME:/mount_point\n");
158: }
159: }
160: break;
161:
162: case 'S': produce_sound = atoi(optarg); break;
163: case 'f': framerate = atoi(optarg); break;
164: case 'x': no_xhair = 1; break;
165: case 'D': use_debugger = 1; break;
166: case 'i': illegal_mem = 1; break;
167: case 'J': fake_joystick = 1; break;
168: case 'a': automount_uaedev = 0; break;
169: case 'g': use_gfxlib = 1; break;
170: case 'C': correct_aspect = 1; break;
171: case 'o': allow_save = 1; break;
172: case 'G': no_gui = 1; break;
173:
174: case 'F':
175: fastmem_size = atoi(optarg) * 0x100000;
176: if (fastmem_size != 0x100000 && fastmem_size != 0x200000
177: && fastmem_size != 0x400000 && fastmem_size != 0x800000)
178: {
179: fastmem_size = 0;
180: fprintf(stderr, "Unsupported fastmem size!\n");
181: }
182: break;
183:
184: case 's':
185: bogomem_size = atoi(optarg) * 0x40000;
186: if (bogomem_size != 0x80000 && bogomem_size != 0x100000
187: /* Braino && bogomem_size != 0x180000 && bogomem_size != 0x1C0000*/)
188: {
189: bogomem_size = 0;
190: fprintf(stderr, "Unsupported bogomem size!\n");
191: }
192: break;
193:
194: case 'c':
195: chipmem_size = atoi(optarg) * 0x80000;
196: if (chipmem_size != 0x80000 && chipmem_size != 0x100000
197: && chipmem_size != 0x200000)
198: {
199: chipmem_size = 0x200000;
200: fprintf(stderr, "Unsupported chipmem size!\n");
201: }
202:
203: break;
204:
205: case 'l':
206: if (0 == strcasecmp(optarg, "de"))
207: keyboard_lang = KBD_LANG_DE;
208: else if (0 == strcasecmp(optarg, "us"))
209: keyboard_lang = KBD_LANG_US;
210: else if (0 == strcasecmp(optarg, "se"))
211: keyboard_lang = KBD_LANG_SE;
212: else if (0 == strcasecmp(optarg, "fr"))
213: keyboard_lang = KBD_LANG_FR;
214: else if (0 == strcasecmp(optarg, "it"))
215: keyboard_lang = KBD_LANG_IT;
216: break;
217:
218: case 'd':
219: screen_res = atoi(optarg);
220: if (screen_res < 0 || screen_res > MAX_SCREEN_MODES) {
221: fprintf(stderr, "Bad video mode selected. Using default.\n");
222: screen_res = 3;
223: }
224: break;
225:
226: case 'H':
227: color_mode = atoi(optarg);
228: if (color_mode < 0 || color_mode > MAX_COLOR_MODES) {
229: fprintf(stderr, "Bad color mode selected. Using default.\n");
230: color_mode = 0;
231: }
232: break;
233:
234: case 'b': sound_desired_bits = atoi(optarg); break;
235: case 'B': sound_desired_bsiz = atoi(optarg); break;
236: case 'R': sound_desired_freq = atoi(optarg); break;
237: }
238: }
239: #endif
240:
241: #ifndef __bebox__ /* BeOS needs its own startup code */
242:
243: static void parse_cmdline_and_init_file(int argc, char **argv)
244: {
245: FILE *f;
246: char *home;
247: char *buffer,*tmpbuf, *token;
248: char smallbuf[256];
249: int bufsiz, result;
250: int n_args;
251: char **new_argv;
252: int new_argc;
253:
254: strcpy(optionsfile,"");
255:
256: #if !defined(__DOS__) && !defined(__mac__)
257: home = getenv("HOME");
258: if (home != NULL && strlen(home) < 240)
259: {
260: strcpy(optionsfile, home);
261: strcat(optionsfile, "/");
262: }
263: #endif
264:
265: #ifndef __DOS__
266: strcat(optionsfile, ".uaerc");
267: #else
268: strcat(optionsfile, "uae.rc");
269: #endif
270:
271: f = fopen(optionsfile,"r");
272: if (f == NULL) {
273: parse_cmdline(argc, argv);
274: return;
275: }
276: fseek(f, 0, SEEK_END);
277: bufsiz = ftell(f);
278: fseek(f, 0, SEEK_SET);
279:
280: buffer = (char *)malloc(bufsiz+1);
281: buffer[bufsiz] = 0;
282: if (fread(buffer, 1, bufsiz, f) < bufsiz) {
283: fprintf(stderr, "Error reading configuration file\n");
284: fclose(f);
285: parse_cmdline(argc, argv);
286: return;
287: }
288: fclose(f);
289:
290: #ifdef __DOS__
291: {
292: char *tmp;
293:
294: while ((tmp = strchr(buffer, 0x0d)))
295: *tmp = ' ';
296: while ((tmp = strchr(buffer, 0x0a)))
297: *tmp = ' ';
298: while (buffer[0] == ' ')
299: strcpy(buffer, buffer+1);
300: while ((strlen(buffer) > 0) && (buffer[strlen(buffer) - 1] == ' '))
301: buffer[strlen(buffer) - 1] = '\0';
302: while ((tmp = strstr(buffer, " ")))
303: strcpy(tmp, tmp+1);
304: }
305: #endif
306:
307: tmpbuf = my_strdup (buffer);
308:
309: n_args = 0;
310: if (strtok(tmpbuf, "\n ") != NULL) {
311: do {
312: n_args++;
313: } while (strtok(NULL, "\n ") != NULL);
314: }
315: free (tmpbuf);
316:
317: new_argv = (char **)malloc ((1 + n_args + argc) * sizeof (char **));
318: new_argv[0] = argv[0];
319: new_argc = 1;
320:
321: token = strtok(buffer, "\n ");
322: while (token != NULL) {
323: new_argv[new_argc] = my_strdup (token);
324: new_argc++;
325: token = strtok(NULL, "\n ");
326: }
327: for (n_args = 1; n_args < argc; n_args++)
328: new_argv[new_argc++] = argv[n_args];
329: new_argv[new_argc] = NULL;
330: parse_cmdline(new_argc, new_argv);
331: }
332:
333: static int ARE_YOU_NUTS = 0;
334:
335: int main(int argc, char **argv)
336: {
337: FILE *hf;
338:
339: hf = fopen("hardfile", "rb");
340: if (hf == NULL)
341: hardfile_size = 0;
342: else {
343: fseek(hf, 0, SEEK_END);
344: hardfile_size = ftell(hf);
345: fclose(hf);
346: }
347: rtarea_init ();
348: hardfile_install ();
349:
350: parse_cmdline_and_init_file(argc, argv);
351: if (!init_sound()) {
352: fprintf(stderr, "Sound driver unavailable: Sound output disabled\n");
353: produce_sound = 0;
354: }
355:
356: if (!no_gui && gui_init() < 0) {
357: fprintf(stderr, "Failed to initialize the GUI\n");
358: /* abort()? Maybe. */
359: }
360: init_joystick();
361: keybuf_init();
362:
363: expansion_init ();
364: memory_init();
365:
366: filesys_install();
367: execlib_install();
368: gfxlib_install();
369: emulib_install();
370:
371: custom_init();
372: serial_init();
373: DISK_init();
374: init_m68k();
375: compiler_init();
376:
377: /* We ought to know this by now */
378: use_lores = screen_res < 3;
379:
380: if (graphics_init()) {
381: m68k_reset();
382:
383: setup_brkhandler();
384: if (use_debugger && debuggable())
385: activate_debugger();
386: if (ARE_YOU_NUTS)
387: execlib_sysinit();
388: else
389: m68k_go(1);
390:
391: graphics_leave();
392: close_joystick();
393: }
394: dump_counts();
395: serial_exit();
396: zfile_exit();
397: if (!no_gui)
398: gui_exit();
399: return 0;
400: }
401: #endif /* not __bebox__ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.