|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * Amiga (native) specific support code; compiles with SAS/C 6.56, ! 5: * to get CyberGraphX support, add "DEFINE=_CYBERGFX" to the compiler ! 6: * flags in the smakefile. When running, hold down both Amiga keys ! 7: * to quit the emulation. The emulation also responds to ^C, which ! 8: * will abort it and to ^D which will reset it. Take care, the code ! 9: * appears to be very brittle and collapses easily if you switch ! 10: * screens. With CyberGraphX support enabled, the screen setup tries ! 11: * to be smart and falls back to standard screen update techniques ! 12: * if the screen to be opened does not belong to CyberGraphX. The ! 13: * 15/16/24 bit colour modes require that a graphics card like the ! 14: * CyberVision64 is installed that's not subject to byte ordering ! 15: * problems. ! 16: * ! 17: * (c) 1996 Olaf `Olsen' Barthel ! 18: */ ! 19: ! 20: #include <intuition/intuitionbase.h> ! 21: #include <intuition/pointerclass.h> ! 22: ! 23: #include <graphics/gfxbase.h> ! 24: #include <graphics/displayinfo.h> ! 25: ! 26: #include <libraries/asl.h> ! 27: ! 28: #include <exec/memory.h> ! 29: ! 30: #include <dos/dos.h> ! 31: #include <dos/dosasl.h> ! 32: ! 33: #include <clib/intuition_protos.h> ! 34: #include <clib/graphics_protos.h> ! 35: #include <clib/exec_protos.h> ! 36: #include <clib/dos_protos.h> ! 37: #include <clib/asl_protos.h> ! 38: ! 39: #include <pragmas/intuition_pragmas.h> ! 40: #include <pragmas/graphics_pragmas.h> ! 41: #include <pragmas/exec_pragmas.h> ! 42: #include <pragmas/dos_pragmas.h> ! 43: #include <pragmas/asl_pragmas.h> ! 44: ! 45: #include <stdlib.h> ! 46: #include <string.h> ! 47: #include <stdio.h> ! 48: ! 49: #ifdef _CYBERGFX ! 50: #include <cybergraphics/cybergraphics.h> ! 51: #include <clib/cybergraphics_protos.h> ! 52: #include <pragmas/cybergraphics_pragmas.h> ! 53: #endif ! 54: ! 55: /****************************************************************************/ ! 56: ! 57: #include "custom.h" ! 58: #include "options.h" ! 59: #include "keybuf.h" ! 60: #include "autoconf.h" ! 61: #include "xwin.h" ! 62: ! 63: /****************************************************************************/ ! 64: ! 65: extern struct ExecBase *SysBase; ! 66: extern struct DosLibrary *DOSBase; ! 67: ! 68: struct IntuitionBase *IntuitionBase; ! 69: struct GfxBase *GfxBase; ! 70: struct Library *AslBase; ! 71: struct Library *CyberGfxBase; ! 72: ! 73: /****************************************************************************/ ! 74: ! 75: STATIC struct Screen *Screen; ! 76: STATIC struct Window *Window; ! 77: STATIC Object *Pointer; ! 78: STATIC ULONG WindowMask; ! 79: ! 80: STATIC struct RastPort *TempRPort, ! 81: *RenderPort; ! 82: STATIC struct BitMap *BitMap; ! 83: STATIC UBYTE *Line; ! 84: ! 85: STATIC LONG ScreenHeight, ! 86: ScreenWidth; ! 87: ! 88: /****************************************************************************/ ! 89: ! 90: int buttonstate[3]; ! 91: int lastmx, lastmy; ! 92: int newmousecounters; ! 93: long int xcolors[4096]; ! 94: struct vidbuf_description gfxvidinfo; ! 95: ! 96: /****************************************************************************/ ! 97: ! 98: void m68k_reset(void); ! 99: ! 100: /****************************************************************************/ ! 101: ! 102: STATIC VOID ! 103: AmigaCleanup(VOID) ! 104: { ! 105: if(BitMap) ! 106: { ! 107: WaitBlit(); ! 108: FreeBitMap(BitMap); ! 109: BitMap = NULL; ! 110: } ! 111: ! 112: if(TempRPort) ! 113: { ! 114: FreeVec(TempRPort); ! 115: TempRPort = NULL; ! 116: } ! 117: ! 118: if(Line) ! 119: { ! 120: FreeVec(Line); ! 121: Line = NULL; ! 122: } ! 123: ! 124: if(Window) ! 125: { ! 126: CloseWindow(Window); ! 127: Window = NULL; ! 128: } ! 129: ! 130: if(Pointer) ! 131: { ! 132: DisposeObject(Pointer); ! 133: Pointer = NULL; ! 134: } ! 135: ! 136: if(Screen) ! 137: { ! 138: CloseScreen(Screen); ! 139: Screen = NULL; ! 140: } ! 141: ! 142: if(AslBase) ! 143: { ! 144: CloseLibrary(AslBase); ! 145: AslBase = NULL; ! 146: } ! 147: ! 148: if(GfxBase) ! 149: { ! 150: CloseLibrary(GfxBase); ! 151: GfxBase = NULL; ! 152: } ! 153: ! 154: if(IntuitionBase) ! 155: { ! 156: CloseLibrary(IntuitionBase); ! 157: IntuitionBase = NULL; ! 158: } ! 159: ! 160: if(CyberGfxBase) ! 161: { ! 162: CloseLibrary(CyberGfxBase); ! 163: CyberGfxBase = NULL; ! 164: } ! 165: } ! 166: ! 167: void ! 168: flush_line(int y) ! 169: { ! 170: if(!CyberGfxBase) ! 171: { ! 172: if(y >= 0 && y < ScreenHeight) ! 173: { ! 174: char *linebuf = y * gfxvidinfo.rowbytes + gfxvidinfo.bufmem; ! 175: ! 176: CopyMem(linebuf,Line,ScreenWidth); ! 177: WritePixelLine8(RenderPort,0,y,ScreenWidth,Line,TempRPort); ! 178: } ! 179: } ! 180: } ! 181: ! 182: void ! 183: flush_block(int ystart,int ystop) ! 184: { ! 185: if(!CyberGfxBase) ! 186: { ! 187: if(ystart < 0) ! 188: ystart = 0; ! 189: else ! 190: { ! 191: if(ystart >= ScreenHeight) ! 192: ystart = ScreenHeight - 1; ! 193: } ! 194: ! 195: if(ystop < 0) ! 196: ystop = 0; ! 197: else ! 198: { ! 199: if(ystop >= ScreenHeight) ! 200: ystop = ScreenHeight - 1; ! 201: } ! 202: ! 203: if(ystart <= ystop) ! 204: { ! 205: char *mem; ! 206: int i; ! 207: ! 208: mem = ystart * gfxvidinfo.rowbytes + gfxvidinfo.bufmem; ! 209: ! 210: for(i = ystart ; i <= ystop ; i++, mem += gfxvidinfo.rowbytes) ! 211: { ! 212: CopyMem(mem,Line,ScreenWidth); ! 213: WritePixelLine8(RenderPort,0,i,ScreenWidth,Line,TempRPort); ! 214: } ! 215: } ! 216: } ! 217: } ! 218: ! 219: void ! 220: flush_screen(int ystart,int ystop) ! 221: { ! 222: } ! 223: ! 224: static int ! 225: get_color(int r,int g,int b,long *cnp) ! 226: { ! 227: ULONG Red,Green,Blue; ! 228: LONG Pen; ! 229: ! 230: Red = 0x11111111 * r; ! 231: Green = 0x11111111 * g; ! 232: Blue = 0x11111111 * b; ! 233: ! 234: Pen = ObtainBestPen(Screen->ViewPort.ColorMap,Red,Green,Blue, ! 235: OBP_Precision,PRECISION_IMAGE, ! 236: TAG_DONE); ! 237: ! 238: if(Pen == -1) ! 239: return(0); ! 240: else ! 241: { ! 242: *cnp = Pen; ! 243: ! 244: return(1); ! 245: } ! 246: } ! 247: ! 248: int ! 249: graphics_init(void) ! 250: { ! 251: struct ScreenModeRequester *ScreenRequest; ! 252: ULONG DisplayID; ! 253: struct BitMap PointerBitMap; ! 254: UWORD PointerLine; ! 255: struct DimensionInfo Dims; ! 256: BOOL GotOne; ! 257: LONG Depth; ! 258: int vsize; ! 259: ! 260: atexit(AmigaCleanup); ! 261: ! 262: vsize = correct_aspect ? 2*numscrlines : numscrlines; ! 263: ! 264: if(!(gfxvidinfo.bufmem = malloc(800 * vsize))) ! 265: { ! 266: fprintf(stderr,"Sorry guv'nor, not enough memory for the line buffer.\n"); ! 267: return(0); ! 268: } ! 269: ! 270: memset(gfxvidinfo.bufmem,0,800 * vsize); ! 271: ! 272: gfxvidinfo.rowbytes = 800; ! 273: gfxvidinfo.pixbytes = 1; ! 274: gfxvidinfo.maxblocklines = 100; ! 275: gfxvidinfo.maxline = 100000; /* ??? */ ! 276: ! 277: if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",39))) ! 278: { ! 279: fprintf(stderr,"Sorry guv'nor, unable to open intuition.library v39.\n"); ! 280: return(0); ! 281: } ! 282: ! 283: if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",39))) ! 284: { ! 285: fprintf(stderr,"Sorry guv'nor, unable to open graphics.library v39.\n"); ! 286: return(0); ! 287: } ! 288: ! 289: DisplayID = INVALID_ID; ! 290: GotOne = FALSE; ! 291: ! 292: while((DisplayID = NextDisplayInfo(DisplayID)) != INVALID_ID) ! 293: { ! 294: if(GetDisplayInfoData(NULL,(APTR)&Dims,sizeof(Dims),DTAG_DIMS,DisplayID)) ! 295: { ! 296: if(Dims.MaxDepth >= 8) ! 297: { ! 298: GotOne = TRUE; ! 299: break; ! 300: } ! 301: } ! 302: } ! 303: ! 304: if(!GotOne) ! 305: { ! 306: fprintf(stderr,"Sorry guv'nor, your Amiga needs an AA chip set or a graphics card.\n"); ! 307: return(0); ! 308: } ! 309: ! 310: if(!(AslBase = OpenLibrary("asl.library",38))) ! 311: { ! 312: fprintf(stderr,"Sorry guv'nor, unable to open asl.library v38.\n"); ! 313: return(0); ! 314: } ! 315: ! 316: if(!(ScreenRequest = AllocAslRequest(ASL_ScreenModeRequest,NULL))) ! 317: { ! 318: fprintf(stderr,"Sorry guv'nor, unable to allocate screen mode requester.\n"); ! 319: return(0); ! 320: } ! 321: ! 322: if(AslRequestTags(ScreenRequest, ! 323: ASLSM_TitleText, "Select screen display mode", ! 324: ASLSM_MinDepth, 8, ! 325: TAG_DONE)) ! 326: { ! 327: DisplayID = ScreenRequest->sm_DisplayID; ! 328: ! 329: GetDisplayInfoData(NULL,(APTR)&Dims,sizeof(Dims),DTAG_DIMS,DisplayID); ! 330: ! 331: Depth = Dims.MaxDepth; ! 332: ! 333: if(Depth > 8) ! 334: color_mode = 1; ! 335: } ! 336: else ! 337: DisplayID = INVALID_ID; ! 338: ! 339: FreeAslRequest(ScreenRequest); ! 340: ! 341: CloseLibrary(AslBase); ! 342: AslBase = NULL; ! 343: ! 344: if(DisplayID == INVALID_ID) ! 345: return(0); ! 346: ! 347: if(!(Screen = OpenScreenTags(NULL, ! 348: SA_DisplayID, DisplayID, ! 349: SA_Depth, Depth, ! 350: SA_Interleaved, TRUE, ! 351: SA_ShowTitle, FALSE, ! 352: SA_BackFill, LAYERS_NOBACKFILL, ! 353: SA_Quiet, TRUE, ! 354: SA_Behind, TRUE, ! 355: SA_SharePens, TRUE, ! 356: SA_Exclusive, TRUE, ! 357: SA_Draggable, FALSE, ! 358: TAG_DONE))) ! 359: { ! 360: fprintf(stderr,"Sorry guv'nor, unable to open the screen.\n"); ! 361: return(0); ! 362: } ! 363: ! 364: ScreenWidth = Screen->Width; ! 365: ScreenHeight = Screen->Height; ! 366: ! 367: if(ScreenWidth > 800) ! 368: ScreenWidth = 800; ! 369: ! 370: if(ScreenHeight > 600) ! 371: ScreenHeight = 600; ! 372: ! 373: #ifdef _CYBERGFX ! 374: if(CyberGfxBase = OpenLibrary("cybergraphics.library",40)) ! 375: { ! 376: if(!IsCyberModeID(DisplayID) || ScreenHeight < vsize) ! 377: { ! 378: CloseLibrary(CyberGfxBase); ! 379: CyberGfxBase = NULL; ! 380: } ! 381: } ! 382: #endif ! 383: ! 384: if(!(BitMap = AllocBitMap(Screen->Width,1,8,BMF_CLEAR|BMF_MINPLANES,Screen->RastPort.BitMap))) ! 385: { ! 386: fprintf(stderr,"Sorry guv'nor, unable to allocate BitMap.\n"); ! 387: return(0); ! 388: } ! 389: ! 390: if(!(TempRPort = AllocVec(sizeof(struct RastPort),MEMF_ANY|MEMF_PUBLIC))) ! 391: { ! 392: fprintf(stderr,"Sorry guv'nor, unable to allocate RastPort.\n"); ! 393: return(0); ! 394: } ! 395: ! 396: if(!(Line = AllocVec((Screen->Width + 15) & ~15,MEMF_ANY|MEMF_PUBLIC))) ! 397: { ! 398: fprintf(stderr,"Sorry guv'nor, unable to allocate raster buffer.\n"); ! 399: return(0); ! 400: } ! 401: ! 402: CopyMem(&Screen->RastPort,TempRPort,sizeof(struct RastPort)); ! 403: TempRPort->Layer = NULL; ! 404: TempRPort->BitMap = BitMap; ! 405: ! 406: PointerLine = 0x0000; ! 407: ! 408: InitBitMap(&PointerBitMap,2,16,1); ! 409: PointerBitMap.Planes[0] = (PLANEPTR)&PointerLine; ! 410: PointerBitMap.Planes[1] = (PLANEPTR)&PointerLine; ! 411: ! 412: if(!(Pointer = NewObject(NULL,POINTERCLASS, ! 413: POINTERA_BitMap, &PointerBitMap, ! 414: POINTERA_WordWidth, 1, ! 415: TAG_DONE))) ! 416: { ! 417: fprintf(stderr,"Sorry guv'nor, unable to allocate blank mouse pointer.\n"); ! 418: return(0); ! 419: } ! 420: ! 421: if(!(Window = OpenWindowTags(NULL, ! 422: WA_Width, Screen->Width, ! 423: WA_Height, Screen->Height, ! 424: WA_CustomScreen, Screen, ! 425: WA_Backdrop, TRUE, ! 426: WA_Borderless, TRUE, ! 427: WA_BackFill, LAYERS_NOBACKFILL, ! 428: WA_RMBTrap, TRUE, ! 429: WA_IDCMP, IDCMP_RAWKEY|IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE, ! 430: WA_Pointer, Pointer, ! 431: WA_ReportMouse, TRUE, ! 432: TAG_DONE))) ! 433: { ! 434: fprintf(stderr,"Sorry guv'nor, unable to open the window.\n"); ! 435: return(0); ! 436: } ! 437: ! 438: RenderPort = &Screen->RastPort; ! 439: ! 440: WindowMask = 1UL << Window->UserPort->mp_SigBit; ! 441: ! 442: SetRast(RenderPort,0); ! 443: ! 444: switch(Depth) ! 445: { ! 446: case 8: ! 447: ! 448: alloc_colors256(get_color); ! 449: break; ! 450: ! 451: case 15: ! 452: ! 453: alloc_colors64k(5,5,5,10,5,0); ! 454: break; ! 455: ! 456: case 16: ! 457: ! 458: alloc_colors64k(5,6,5,11,5,0); ! 459: break; ! 460: ! 461: case 24: ! 462: case 32: ! 463: ! 464: alloc_colors64k(8,8,8,16,8,0); ! 465: break; ! 466: } ! 467: ! 468: ScreenToFront(Screen); ! 469: ActivateWindow(Window); ! 470: ! 471: buttonstate[0] = buttonstate[1] = buttonstate[2] = 0; ! 472: ! 473: lastmx = lastmy = 0; ! 474: newmousecounters = 0; ! 475: ! 476: #ifdef _CYBERGFX ! 477: if(CyberGfxBase) ! 478: { ! 479: free(gfxvidinfo.bufmem); ! 480: ! 481: gfxvidinfo.bufmem = (char *)GetCyberMapAttr(Screen->RastPort.BitMap,CYBRMATTR_DISPADR); ! 482: gfxvidinfo.rowbytes = GetCyberMapAttr(Screen->RastPort.BitMap,CYBRMATTR_XMOD); ! 483: gfxvidinfo.pixbytes = GetCyberMapAttr(Screen->RastPort.BitMap,CYBRMATTR_BPPIX); ! 484: } ! 485: #endif ! 486: return(1); ! 487: } ! 488: ! 489: void ! 490: graphics_leave(void) ! 491: { ! 492: AmigaCleanup(); ! 493: } ! 494: ! 495: void ! 496: handle_events(void) ! 497: { ! 498: ULONG Mask; ! 499: ! 500: Mask = SetSignal(0,SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D|WindowMask); ! 501: ! 502: if(Mask & SIGBREAKF_CTRL_C) ! 503: { ! 504: PrintFault(ERROR_BREAK,"uae"); ! 505: exit(RETURN_WARN); ! 506: } ! 507: ! 508: if(Mask & SIGBREAKF_CTRL_D) ! 509: m68k_reset(); ! 510: ! 511: if(Mask & WindowMask) ! 512: { ! 513: struct IntuiMessage *IMsg; ! 514: ULONG MsgClass; ! 515: UWORD MsgCode; ! 516: WORD MsgX,MsgY; ! 517: WORD Button; ! 518: BOOL Quit; ! 519: ! 520: newmousecounters = 0; ! 521: Quit = FALSE; ! 522: ! 523: while(IMsg = (struct IntuiMessage *)GetMsg(Window->UserPort)) ! 524: { ! 525: MsgClass = IMsg->Class; ! 526: MsgCode = IMsg->Code; ! 527: MsgX = IMsg->MouseX; ! 528: MsgY = IMsg->MouseY; ! 529: ! 530: if((IMsg->Qualifier & (IEQUALIFIER_LCOMMAND|IEQUALIFIER_RCOMMAND)) == (IEQUALIFIER_LCOMMAND|IEQUALIFIER_RCOMMAND)) ! 531: Quit = TRUE; ! 532: ! 533: ReplyMsg(IMsg); ! 534: ! 535: switch(MsgClass) ! 536: { ! 537: case IDCMP_RAWKEY: ! 538: ! 539: if(MsgCode & IECODE_UP_PREFIX) ! 540: record_key(((MsgCode & ~IECODE_UP_PREFIX) << 1) | 1); ! 541: else ! 542: record_key((MsgCode) << 1); ! 543: ! 544: break; ! 545: ! 546: case IDCMP_MOUSEBUTTONS: ! 547: ! 548: switch(MsgCode & ~IECODE_UP_PREFIX) ! 549: { ! 550: case IECODE_LBUTTON: ! 551: ! 552: Button = 0; ! 553: break; ! 554: ! 555: case IECODE_MBUTTON: ! 556: ! 557: Button = 1; ! 558: break; ! 559: ! 560: case IECODE_RBUTTON: ! 561: ! 562: Button = 2; ! 563: break; ! 564: } ! 565: ! 566: if(MsgCode & IECODE_UP_PREFIX) ! 567: buttonstate[Button] = 0; ! 568: else ! 569: buttonstate[Button] = 1; ! 570: ! 571: break; ! 572: ! 573: case IDCMP_MOUSEMOVE: ! 574: ! 575: lastmx = MsgX; ! 576: lastmy = MsgY; ! 577: ! 578: newmousecounters = 1; ! 579: ! 580: break; ! 581: } ! 582: } ! 583: ! 584: if(Quit) ! 585: exit(RETURN_OK); ! 586: } ! 587: } ! 588: ! 589: int ! 590: debuggable(void) ! 591: { ! 592: return 1; ! 593: } ! 594: ! 595: int ! 596: needmousehack(void) ! 597: { ! 598: return 1; ! 599: } ! 600: ! 601: void ! 602: LED(int on) ! 603: { ! 604: } ! 605: ! 606: /****************************************************************************/ ! 607: ! 608: int quit_program; ! 609: ! 610: int ! 611: gui_init(void) ! 612: { ! 613: quit_program = 0; ! 614: } ! 615: ! 616: void ! 617: gui_exit(void) ! 618: { ! 619: } ! 620: ! 621: void ! 622: gui_led(int led, int on) ! 623: { ! 624: } ! 625: ! 626: void ! 627: gui_filename(int num, char *name) ! 628: { ! 629: } ! 630: ! 631: void ! 632: gui_handle_events(void) ! 633: { ! 634: } ! 635: ! 636: /****************************************************************************/ ! 637: ! 638: int opterr = 1; /* error => print message */ ! 639: int optind = 1; /* next argv[] index */ ! 640: char *optarg = NULL; /* option parameter if any */ ! 641: ! 642: static int ! 643: Err( name, mess, c ) /* returns '?' */ ! 644: char *name; /* program name argv[0] */ ! 645: char *mess; /* specific message */ ! 646: int c; /* defective option letter */ ! 647: { ! 648: if ( opterr ) ! 649: (void) fprintf( stderr, ! 650: "%s: %s -- %c\n", ! 651: name, mess, c ! 652: ); ! 653: ! 654: return '?'; /* erroneous-option marker */ ! 655: } ! 656: ! 657: int ! 658: getopt( argc, argv, optstring ) /* returns letter, '?', EOF */ ! 659: int argc; /* argument count from main */ ! 660: char *argv[]; /* argument vector from main */ ! 661: char *optstring; /* allowed args, e.g. "ab:c" */ ! 662: { ! 663: static int sp = 1; /* position within argument */ ! 664: register int osp; /* saved `sp' for param test */ ! 665: register int c; /* option letter */ ! 666: register char *cp; /* -> option in `optstring' */ ! 667: ! 668: optarg = NULL; ! 669: ! 670: if ( sp == 1 ) /* fresh argument */ ! 671: if ( optind >= argc /* no more arguments */ ! 672: || argv[optind][0] != '-' /* no more options */ ! 673: || argv[optind][1] == '\0' /* not option; stdin */ ! 674: ) ! 675: return EOF; ! 676: else if ( strcmp( argv[optind], "--" ) == 0 ) ! 677: { ! 678: ++optind; /* skip over "--" */ ! 679: return EOF; /* "--" marks end of options */ ! 680: } ! 681: ! 682: c = argv[optind][sp]; /* option letter */ ! 683: osp = sp++; /* get ready for next letter */ ! 684: ! 685: if ( argv[optind][sp] == '\0' ) /* end of argument */ ! 686: { ! 687: ++optind; /* get ready for next try */ ! 688: sp = 1; /* beginning of next argument */ ! 689: } ! 690: ! 691: if ( c == ':' /* optstring syntax conflict */ ! 692: || (cp = strchr( optstring, c )) == NULL /* not found */ ! 693: ) ! 694: return Err( argv[0], "illegal option", c ); ! 695: ! 696: if ( cp[1] == ':' ) /* option takes parameter */ ! 697: { ! 698: if ( osp != 1 ) ! 699: return Err( argv[0], ! 700: "option must not be clustered", ! 701: c ! 702: ); ! 703: ! 704: if ( sp != 1 ) /* reset by end of argument */ ! 705: return Err( argv[0], ! 706: "option must be followed by white space", ! 707: c ! 708: ); ! 709: ! 710: if ( optind >= argc ) ! 711: return Err( argv[0], ! 712: "option requires an argument", ! 713: c ! 714: ); ! 715: ! 716: optarg = argv[optind]; /* make parameter available */ ! 717: ++optind; /* skip over parameter */ ! 718: } ! 719: ! 720: return c; ! 721: } ! 722: ! 723: /****************************************************************************/ ! 724: ! 725: static void usage(void) ! 726: { ! 727: printf("UAE - The Un*x Amiga emulator\n"); ! 728: printf("Summary of command-line options:\n"); ! 729: printf(" -h : Print help\n"); ! 730: printf(" -m VOLNAME:mount_point : mount file system at <mount point> as AmigaDOS\n" ! 731: " volume VOLNAME:\n"); ! 732: printf(" -M VOLNAME:mount_point : like -m, but mount read-only\n"); ! 733: printf(" -a : Don't mount the harddisk file automatically.\n" ! 734: " Useful only for testing.\n"); ! 735: printf(" -S : Turn off sound support (if it is configured)\n"); ! 736: printf(" -s : Emulate 1 MB slow memory at 0xC00000\n"); ! 737: printf(" -F n : Emulate n MB fast memory at 0x200000\n"); ! 738: printf(" -f n : Set the frame rate to 1/n\n"); ! 739: printf(" -x : Use visible cross-hair cursor (X Windows version)\n"); ! 740: printf(" -D : Start up the built-in debugger\n"); ! 741: printf(" -[0123] file : Use file instead of df[0123].adf as disk image file\n"); ! 742: printf(" -r file : Use file as ROM image instead of kick.rom\n"); ! 743: printf(" -J : Fake joystick emulation with the numeric pad.\n"); ! 744: printf(" -g : Turn on gfx-lib replacement.\n"); ! 745: printf(" -d mode : Select resolution with the mode parameter.\n"); ! 746: printf(" -H mode : Set the number of colors with the mode parameter.\n"); ! 747: printf("\n"); ! 748: printf("Valid resolutions: 0 (320x200); 1 (320x240); 2 (320x400); 3 (800x600);\n" ! 749: " 4 (800x600, correct aspect)\n" ! 750: "Valid color modes: 0 (256 colors); 1 (32768 colors); 2 (65536 colors)\n" ! 751: "UAE may choose to ignore the color mode/resolution setting.\n"); ! 752: } ! 753: ! 754: void parse_cmdline(int argc, char **argv) ! 755: { ! 756: extern ULONG fastmem_size; ! 757: ! 758: int c; ! 759: ! 760: while(((c = getopt(argc, argv, "l:Df:gd:hxF:asSJm:M:0:1:2:3:r:H:")) != EOF)) switch(c) { ! 761: case 'h': usage(); exit(0); ! 762: ! 763: case '0': strncpy(df0, optarg, 255); df0[255] = 0; break; ! 764: case '1': strncpy(df1, optarg, 255); df1[255] = 0; break; ! 765: case '2': strncpy(df2, optarg, 255); df2[255] = 0; break; ! 766: case '3': strncpy(df3, optarg, 255); df3[255] = 0; break; ! 767: case 'r': strncpy(romfile, optarg, 255); romfile[255] = 0; break; ! 768: ! 769: case 'm': ! 770: case 'M': ! 771: { ! 772: /* mount file system (repeatable) ! 773: * syntax: [-m | -M] VOLNAME:/mount_point ! 774: * example: -M CDROM:/cdrom -m UNIXFS:./disk ! 775: */ ! 776: static int mount_seen = 0; ! 777: char buf[256]; ! 778: char *s2; ! 779: int readonly = (c == 'M'); ! 780: ! 781: if (mount_seen) ! 782: fprintf(stderr, "warning: multiple mounts confuse Kickstart 1.3\n"); ! 783: mount_seen = 1; ! 784: strncpy(buf, optarg, 255); buf[255] = 0; ! 785: s2 = strchr(buf, ':'); ! 786: if(s2) { ! 787: *s2++ = '\0'; ! 788: add_filesys_unit(buf, s2, readonly); ! 789: } else { ! 790: fprintf(stderr, "Usage: [-m | -M] VOLNAME:/mount_point\n"); ! 791: } ! 792: } ! 793: break; ! 794: ! 795: case 'S': produce_sound = 0; break; ! 796: case 'f': framerate = atoi(optarg); break; ! 797: case 'x': use_xhair = 1; break; ! 798: case 'D': use_debugger = 1; break; ! 799: case 'J': fake_joystick = 1; break; ! 800: case 'a': automount_uaedev = 0; break; ! 801: case 's': use_slow_mem = 1; break; ! 802: case 'g': use_gfxlib = 1; break; ! 803: ! 804: case 'F': ! 805: fastmem_size = atoi(optarg) * 0x100000; ! 806: if (fastmem_size != 0x100000 && fastmem_size != 0x200000 ! 807: && fastmem_size != 0x400000 && fastmem_size != 0x800000) ! 808: { ! 809: fastmem_size = 0; ! 810: fprintf(stderr, "Unsupported fastmem size!\n"); ! 811: } ! 812: ! 813: break; ! 814: ! 815: case 'd': ! 816: screen_res = atoi(optarg); ! 817: if (screen_res >= 0 && screen_res <= 4) { ! 818: } else { ! 819: fprintf(stderr, "Bad video mode selected. Using default.\n"); ! 820: screen_res = 3; ! 821: } ! 822: /*dont_want_aspect = screen_res != 4;*/ ! 823: use_lores = screen_res < 3; ! 824: break; ! 825: ! 826: case 'H': ! 827: color_mode = atoi(optarg); ! 828: if (color_mode < 0 || color_mode > 2) { ! 829: fprintf(stderr, "Bad color mode selected. Using default.\n"); ! 830: color_mode = 0; ! 831: } ! 832: break; ! 833: } ! 834: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.