Annotation of uae/src/main.c, revision 1.1

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__ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.