Annotation of uae/amiga.c, revision 1.1.1.1

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 "filesys.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 MC68000_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 = dont_want_aspect ? numscrlines : 2*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: 
                    276:        if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",39)))
                    277:        {
                    278:                fprintf(stderr,"Sorry guv'nor, unable to open intuition.library v39.\n");
                    279:                return(0);
                    280:        }
                    281: 
                    282:        if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",39)))
                    283:        {
                    284:                fprintf(stderr,"Sorry guv'nor, unable to open graphics.library v39.\n");
                    285:                return(0);
                    286:        }
                    287: 
                    288:        DisplayID = INVALID_ID;
                    289:        GotOne = FALSE;
                    290: 
                    291:        while((DisplayID = NextDisplayInfo(DisplayID)) != INVALID_ID)
                    292:        {
                    293:                if(GetDisplayInfoData(NULL,(APTR)&Dims,sizeof(Dims),DTAG_DIMS,DisplayID))
                    294:                {
                    295:                        if(Dims.MaxDepth >= 8)
                    296:                        {
                    297:                                GotOne = TRUE;
                    298:                                break;
                    299:                        }
                    300:                }
                    301:        }
                    302: 
                    303:        if(!GotOne)
                    304:        {
                    305:                fprintf(stderr,"Sorry guv'nor, your Amiga needs an AA chip set or a graphics card.\n");
                    306:                return(0);
                    307:        }
                    308: 
                    309:        if(!(AslBase = OpenLibrary("asl.library",38)))
                    310:        {
                    311:                fprintf(stderr,"Sorry guv'nor, unable to open asl.library v38.\n");
                    312:                return(0);
                    313:        }
                    314: 
                    315:        if(!(ScreenRequest = AllocAslRequest(ASL_ScreenModeRequest,NULL)))
                    316:        {
                    317:                fprintf(stderr,"Sorry guv'nor, unable to allocate screen mode requester.\n");
                    318:                return(0);
                    319:        }
                    320: 
                    321:        if(AslRequestTags(ScreenRequest,
                    322:                ASLSM_TitleText,        "Select screen display mode",
                    323:                ASLSM_MinDepth,         8,
                    324:        TAG_DONE))
                    325:        {
                    326:                DisplayID = ScreenRequest->sm_DisplayID;
                    327: 
                    328:                GetDisplayInfoData(NULL,(APTR)&Dims,sizeof(Dims),DTAG_DIMS,DisplayID);
                    329: 
                    330:                Depth = Dims.MaxDepth;
                    331: 
                    332:                if(Depth > 8)
                    333:                        color_mode = 1;
                    334:        }
                    335:        else
                    336:                DisplayID = INVALID_ID;
                    337: 
                    338:        FreeAslRequest(ScreenRequest);
                    339: 
                    340:        CloseLibrary(AslBase);
                    341:        AslBase = NULL;
                    342: 
                    343:        if(DisplayID == INVALID_ID)
                    344:                return(0);
                    345: 
                    346:        if(!(Screen = OpenScreenTags(NULL,
                    347:                SA_DisplayID,   DisplayID,
                    348:                SA_Depth,       Depth,
                    349:                SA_Interleaved, TRUE,
                    350:                SA_ShowTitle,   FALSE,
                    351:                SA_BackFill,    LAYERS_NOBACKFILL,
                    352:                SA_Quiet,       TRUE,
                    353:                SA_Behind,      TRUE,
                    354:                SA_SharePens,   TRUE,
                    355:                SA_Exclusive,   TRUE,
                    356:                SA_Draggable,   FALSE,
                    357:        TAG_DONE)))
                    358:        {
                    359:                fprintf(stderr,"Sorry guv'nor, unable to open the screen.\n");
                    360:                return(0);
                    361:        }
                    362: 
                    363:        ScreenWidth     = Screen->Width;
                    364:        ScreenHeight    = Screen->Height;
                    365: 
                    366:        if(ScreenWidth > 800)
                    367:                ScreenWidth = 800;
                    368: 
                    369:        if(ScreenHeight > 600)
                    370:                ScreenHeight = 600;
                    371: 
                    372: #ifdef _CYBERGFX
                    373:        if(CyberGfxBase = OpenLibrary("cybergraphics.library",40))
                    374:        {
                    375:                if(!IsCyberModeID(DisplayID) || ScreenHeight < vsize)
                    376:                {
                    377:                        CloseLibrary(CyberGfxBase);
                    378:                        CyberGfxBase = NULL;
                    379:                }
                    380:        }
                    381: #endif
                    382: 
                    383:        if(!(BitMap = AllocBitMap(Screen->Width,1,8,BMF_CLEAR|BMF_MINPLANES,Screen->RastPort.BitMap)))
                    384:        {
                    385:                fprintf(stderr,"Sorry guv'nor, unable to allocate BitMap.\n");
                    386:                return(0);
                    387:        }
                    388: 
                    389:        if(!(TempRPort = AllocVec(sizeof(struct RastPort),MEMF_ANY|MEMF_PUBLIC)))
                    390:        {
                    391:                fprintf(stderr,"Sorry guv'nor, unable to allocate RastPort.\n");
                    392:                return(0);
                    393:        }
                    394: 
                    395:        if(!(Line = AllocVec((Screen->Width + 15) & ~15,MEMF_ANY|MEMF_PUBLIC)))
                    396:        {
                    397:                fprintf(stderr,"Sorry guv'nor, unable to allocate raster buffer.\n");
                    398:                return(0);
                    399:        }
                    400: 
                    401:        CopyMem(&Screen->RastPort,TempRPort,sizeof(struct RastPort));
                    402:        TempRPort->Layer = NULL;
                    403:        TempRPort->BitMap = BitMap;
                    404: 
                    405:        PointerLine = 0x0000;
                    406: 
                    407:        InitBitMap(&PointerBitMap,2,16,1);
                    408:        PointerBitMap.Planes[0] = (PLANEPTR)&PointerLine;
                    409:        PointerBitMap.Planes[1] = (PLANEPTR)&PointerLine;
                    410: 
                    411:        if(!(Pointer = NewObject(NULL,POINTERCLASS,
                    412:                POINTERA_BitMap,        &PointerBitMap,
                    413:                POINTERA_WordWidth,     1,
                    414:        TAG_DONE)))
                    415:        {
                    416:                fprintf(stderr,"Sorry guv'nor, unable to allocate blank mouse pointer.\n");
                    417:                return(0);
                    418:        }
                    419: 
                    420:        if(!(Window = OpenWindowTags(NULL,
                    421:                WA_Width,               Screen->Width,
                    422:                WA_Height,              Screen->Height,
                    423:                WA_CustomScreen,        Screen,
                    424:                WA_Backdrop,            TRUE,
                    425:                WA_Borderless,          TRUE,
                    426:                WA_BackFill,            LAYERS_NOBACKFILL,
                    427:                WA_RMBTrap,             TRUE,
                    428:                WA_IDCMP,               IDCMP_RAWKEY|IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE,
                    429:                WA_Pointer,             Pointer,
                    430:                WA_ReportMouse,         TRUE,
                    431:        TAG_DONE)))
                    432:        {
                    433:                fprintf(stderr,"Sorry guv'nor, unable to open the window.\n");
                    434:                return(0);
                    435:        }
                    436: 
                    437:        RenderPort = &Screen->RastPort;
                    438: 
                    439:        WindowMask = 1UL << Window->UserPort->mp_SigBit;
                    440: 
                    441:        SetRast(RenderPort,0);
                    442: 
                    443:        switch(Depth)
                    444:        {
                    445:                case 8:
                    446: 
                    447:                        alloc_colors256(get_color);
                    448:                        break;
                    449: 
                    450:                case 15:
                    451: 
                    452:                        alloc_colors64k(5,5,5,10,5,0);
                    453:                        break;
                    454: 
                    455:                case 16:
                    456: 
                    457:                        alloc_colors64k(5,6,5,11,5,0);
                    458:                        break;
                    459: 
                    460:                case 24:
                    461:                case 32:
                    462: 
                    463:                        alloc_colors64k(8,8,8,16,8,0);
                    464:                        break;
                    465:        }
                    466: 
                    467:        ScreenToFront(Screen);
                    468:        ActivateWindow(Window);
                    469: 
                    470:        buttonstate[0] = buttonstate[1] = buttonstate[2] = 0;
                    471: 
                    472:        lastmx = lastmy = 0;
                    473:        newmousecounters = 0;
                    474: 
                    475: #ifdef _CYBERGFX
                    476:        if(CyberGfxBase)
                    477:        {
                    478:                free(gfxvidinfo.bufmem);
                    479: 
                    480:                gfxvidinfo.bufmem       = (char *)GetCyberMapAttr(Screen->RastPort.BitMap,CYBRMATTR_DISPADR);
                    481:                gfxvidinfo.rowbytes     = GetCyberMapAttr(Screen->RastPort.BitMap,CYBRMATTR_XMOD);
                    482:                gfxvidinfo.pixbytes     = GetCyberMapAttr(Screen->RastPort.BitMap,CYBRMATTR_BPPIX);
                    483:        }
                    484: #endif
                    485:        return(1);
                    486: }
                    487: 
                    488: void
                    489: graphics_leave(void)
                    490: {
                    491:        AmigaCleanup();
                    492: }
                    493: 
                    494: void
                    495: handle_events(void)
                    496: {
                    497:        ULONG Mask;
                    498: 
                    499:        Mask = SetSignal(0,SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D|WindowMask);
                    500: 
                    501:        if(Mask & SIGBREAKF_CTRL_C)
                    502:        {
                    503:                PrintFault(ERROR_BREAK,"uae");
                    504:                exit(RETURN_WARN);
                    505:        }
                    506: 
                    507:        if(Mask & SIGBREAKF_CTRL_D)
                    508:                MC68000_reset();
                    509: 
                    510:        if(Mask & WindowMask)
                    511:        {
                    512:                struct IntuiMessage *IMsg;
                    513:                ULONG MsgClass;
                    514:                UWORD MsgCode;
                    515:                WORD MsgX,MsgY;
                    516:                WORD Button;
                    517:                BOOL Quit;
                    518: 
                    519:                newmousecounters = 0;
                    520:                Quit = FALSE;
                    521: 
                    522:                while(IMsg = (struct IntuiMessage *)GetMsg(Window->UserPort))
                    523:                {
                    524:                        MsgClass        = IMsg->Class;
                    525:                        MsgCode         = IMsg->Code;
                    526:                        MsgX            = IMsg->MouseX;
                    527:                        MsgY            = IMsg->MouseY;
                    528: 
                    529:                        if((IMsg->Qualifier & (IEQUALIFIER_LCOMMAND|IEQUALIFIER_RCOMMAND)) == (IEQUALIFIER_LCOMMAND|IEQUALIFIER_RCOMMAND))
                    530:                                Quit = TRUE;
                    531: 
                    532:                        ReplyMsg(IMsg);
                    533: 
                    534:                        switch(MsgClass)
                    535:                        {
                    536:                                case IDCMP_RAWKEY:
                    537: 
                    538:                                        if(MsgCode & IECODE_UP_PREFIX)
                    539:                                                record_key(((MsgCode & ~IECODE_UP_PREFIX) << 1) | 1);
                    540:                                        else
                    541:                                                record_key((MsgCode) << 1);
                    542: 
                    543:                                        break;
                    544: 
                    545:                                case IDCMP_MOUSEBUTTONS:
                    546: 
                    547:                                        switch(MsgCode & ~IECODE_UP_PREFIX)
                    548:                                        {
                    549:                                                case IECODE_LBUTTON:
                    550: 
                    551:                                                        Button = 0;
                    552:                                                        break;
                    553: 
                    554:                                                case IECODE_MBUTTON:
                    555: 
                    556:                                                        Button = 1;
                    557:                                                        break;
                    558: 
                    559:                                                case IECODE_RBUTTON:
                    560: 
                    561:                                                        Button = 2;
                    562:                                                        break;
                    563:                                        }
                    564: 
                    565:                                        if(MsgCode & IECODE_UP_PREFIX)
                    566:                                                buttonstate[Button] = 0;
                    567:                                        else
                    568:                                                buttonstate[Button] = 1;
                    569: 
                    570:                                        break;
                    571: 
                    572:                                case IDCMP_MOUSEMOVE:
                    573: 
                    574:                                        lastmx = MsgX;
                    575:                                        lastmy = MsgY;
                    576: 
                    577:                                        newmousecounters = 1;
                    578: 
                    579:                                        break;
                    580:                        }
                    581:                }
                    582: 
                    583:                if(Quit)
                    584:                        exit(RETURN_OK);
                    585:        }
                    586: }
                    587: 
                    588: int
                    589: debuggable(void)
                    590: {
                    591:        return 1;
                    592: }
                    593: 
                    594: int
                    595: needmousehack(void)
                    596: {
                    597:        return 1;
                    598: }
                    599: 
                    600: void
                    601: LED(int on)
                    602: {
                    603: }
                    604: 
                    605: /****************************************************************************/
                    606: 
                    607: int quit_program;
                    608: 
                    609: int
                    610: gui_init(void)
                    611: {
                    612:        quit_program = 0;
                    613: }
                    614: 
                    615: void
                    616: gui_exit(void)
                    617: {
                    618: }
                    619: 
                    620: void
                    621: gui_led(int led, int on)
                    622: {
                    623: }
                    624: 
                    625: void
                    626: gui_filename(int num, char *name)
                    627: {
                    628: }
                    629: 
                    630: void
                    631: gui_handle_events(void)
                    632: {
                    633: }
                    634: 
                    635: /****************************************************************************/
                    636: 
                    637: int    opterr = 1;                     /* error => print message */
                    638: int    optind = 1;                     /* next argv[] index */
                    639: char   *optarg = NULL;                 /* option parameter if any */
                    640: 
                    641: static int
                    642: Err( name, mess, c )                   /* returns '?' */
                    643:        char    *name;                  /* program name argv[0] */
                    644:        char    *mess;                  /* specific message */
                    645:        int     c;                      /* defective option letter */
                    646:        {
                    647:        if ( opterr )
                    648:                (void) fprintf( stderr,
                    649:                                "%s: %s -- %c\n",
                    650:                                name, mess, c
                    651:                              );
                    652: 
                    653:        return '?';                     /* erroneous-option marker */
                    654:        }
                    655: 
                    656: int
                    657: getopt( argc, argv, optstring )                /* returns letter, '?', EOF */
                    658:        int             argc;           /* argument count from main */
                    659:        char            *argv[];        /* argument vector from main */
                    660:        char            *optstring;     /* allowed args, e.g. "ab:c" */
                    661:        {
                    662:        static int      sp = 1;         /* position within argument */
                    663:        register int    osp;            /* saved `sp' for param test */
                    664:        register int    c;              /* option letter */
                    665:        register char   *cp;            /* -> option in `optstring' */
                    666: 
                    667:        optarg = NULL;
                    668: 
                    669:        if ( sp == 1 )                  /* fresh argument */
                    670:                if ( optind >= argc             /* no more arguments */
                    671:                  || argv[optind][0] != '-'     /* no more options */
                    672:                  || argv[optind][1] == '\0'    /* not option; stdin */
                    673:                   )
                    674:                        return EOF;
                    675:                else if ( strcmp( argv[optind], "--" ) == 0 )
                    676:                        {
                    677:                        ++optind;       /* skip over "--" */
                    678:                        return EOF;     /* "--" marks end of options */
                    679:                        }
                    680: 
                    681:        c = argv[optind][sp];           /* option letter */
                    682:        osp = sp++;                     /* get ready for next letter */
                    683: 
                    684:        if ( argv[optind][sp] == '\0' ) /* end of argument */
                    685:                {
                    686:                ++optind;               /* get ready for next try */
                    687:                sp = 1;                 /* beginning of next argument */
                    688:                }
                    689: 
                    690:        if ( c == ':'                   /* optstring syntax conflict */
                    691:          || (cp = strchr( optstring, c )) == NULL      /* not found */
                    692:           )
                    693:                return Err( argv[0], "illegal option", c );
                    694: 
                    695:        if ( cp[1] == ':' )             /* option takes parameter */
                    696:                {
                    697:                if ( osp != 1 )
                    698:                        return Err( argv[0],
                    699:                                    "option must not be clustered",
                    700:                                    c
                    701:                                  );
                    702: 
                    703:                if ( sp != 1 )          /* reset by end of argument */
                    704:                        return Err( argv[0],
                    705:                               "option must be followed by white space",
                    706:                                    c
                    707:                                  );
                    708: 
                    709:                if ( optind >= argc )
                    710:                        return Err( argv[0],
                    711:                                    "option requires an argument",
                    712:                                    c
                    713:                                  );
                    714: 
                    715:                optarg = argv[optind];  /* make parameter available */
                    716:                ++optind;               /* skip over parameter */
                    717:                }
                    718: 
                    719:        return c;
                    720:        }
                    721: 
                    722: /****************************************************************************/
                    723: 
                    724: static void usage(void)
                    725: {
                    726:     printf("UAE - The Un*x Amiga emulator\n");
                    727:     printf("Summary of command-line options:\n");
                    728:     printf("  -h                       : Print help\n");
                    729:     printf("  -m VOLNAME:mount_point   : mount file system at <mount point> as AmigaDOS\n"
                    730:           "                             volume VOLNAME:\n");
                    731:     printf("  -M VOLNAME:mount_point   : like -m, but mount read-only\n");
                    732:     printf("  -a                       : Don't mount the harddisk file automatically.\n"
                    733:           "                             Useful only for testing.\n");
                    734:     printf("  -S                       : Turn off sound support (if it is configured)\n");
                    735:     printf("  -s                       : Emulate 1 MB slow memory at 0xC00000\n");
                    736:     printf("  -F n                     : Emulate n MB fast memory at 0x200000\n");
                    737:     printf("  -f n                     : Set the frame rate to 1/n\n");
                    738:     printf("  -x                       : Use visible cross-hair cursor (X Windows version)\n");
                    739:     printf("  -D                       : Start up the built-in debugger\n");
                    740:     printf("  -[0123] file             : Use file instead of df[0123].adf as disk image file\n");
                    741:     printf("  -r file                  : Use file as ROM image instead of kick.rom\n");
                    742:     printf("  -J                       : Fake joystick emulation with the numeric pad.\n");
                    743:     printf("  -g                       : Turn on gfx-lib replacement.\n");
                    744:     printf("  -d mode                  : Select resolution with the mode parameter.\n");
                    745:     printf("  -H mode                  : Set the number of colors with the mode parameter.\n");
                    746:     printf("\n");
                    747:     printf("Valid resolutions: 0 (320x200); 1 (320x240); 2 (320x400); 3 (800x600);\n"
                    748:           "                   4 (800x600, correct aspect)\n"
                    749:           "Valid color modes: 0 (256 colors); 1 (32768 colors); 2 (65536 colors)\n"
                    750:           "UAE may choose to ignore the color mode/resolution setting.\n");
                    751: }
                    752: 
                    753: void parse_cmdline(int argc, char **argv)
                    754: {
                    755: extern ULONG fastmem_size;
                    756: 
                    757:     int c;
                    758: 
                    759:     while(((c = getopt(argc, argv, "l:Df:gd:hxF:asSJm:M:0:1:2:3:r:H:")) != EOF)) switch(c) {
                    760:      case 'h': usage();        exit(0);
                    761: 
                    762:      case '0': strncpy(df0, optarg, 255); df0[255] = 0;        break;
                    763:      case '1': strncpy(df1, optarg, 255); df1[255] = 0; break;
                    764:      case '2': strncpy(df2, optarg, 255); df2[255] = 0; break;
                    765:      case '3': strncpy(df3, optarg, 255); df3[255] = 0; break;
                    766:      case 'r': strncpy(romfile, optarg, 255); romfile[255] = 0; break;
                    767: 
                    768:      case 'm':
                    769:      case 'M':
                    770:        {
                    771:            /* mount file system (repeatable)
                    772:             * syntax: [-m | -M] VOLNAME:/mount_point
                    773:             * example: -M CDROM:/cdrom -m UNIXFS:./disk
                    774:             */
                    775:            static int mount_seen = 0;
                    776:            char buf[256];
                    777:            char *s2;
                    778:            int readonly = (c == 'M');
                    779: 
                    780:            if (mount_seen)
                    781:                fprintf(stderr, "warning: multiple mounts confuse Kickstart 1.3\n");
                    782:            mount_seen = 1;
                    783:            strncpy(buf, optarg, 255); buf[255] = 0;
                    784:            s2 = strchr(buf, ':');
                    785:            if(s2) {
                    786:                *s2++ = '\0';
                    787:                add_filesys_unit(buf, s2, readonly);
                    788:            } else {
                    789:                fprintf(stderr, "Usage: [-m | -M] VOLNAME:/mount_point\n");
                    790:            }
                    791:        }
                    792:        break;
                    793: 
                    794:      case 'S': produce_sound = 0; break;
                    795:      case 'f': framerate = atoi(optarg); break;
                    796:      case 'x': use_xhair = 1; break;
                    797:      case 'D': use_debugger = 1; break;
                    798:      case 'J': fake_joystick = 1; break;
                    799:      case 'a': automount_uaedev = 0; break;
                    800:      case 's': use_slow_mem = 1; break;
                    801:      case 'g': use_gfxlib = 1; break;
                    802: 
                    803:      case 'F':
                    804:        fastmem_size = atoi(optarg) * 0x100000;
                    805:        if (fastmem_size != 0x100000 && fastmem_size != 0x200000
                    806:            && fastmem_size != 0x400000 && fastmem_size != 0x800000)
                    807:        {
                    808:            fastmem_size = 0;
                    809:            fprintf(stderr, "Unsupported fastmem size!\n");
                    810:        }
                    811: 
                    812:        break;
                    813: 
                    814:      case 'd':
                    815:        screen_res = atoi(optarg);
                    816:        if (screen_res >= 0 && screen_res <= 4) {
                    817:        } else {
                    818:            fprintf(stderr, "Bad video mode selected. Using default.\n");
                    819:            screen_res = 3;
                    820:        }
                    821:        dont_want_aspect = screen_res != 4;
                    822:        use_lores = screen_res < 3;
                    823:        break;
                    824: 
                    825:      case 'H':
                    826:        color_mode = atoi(optarg);
                    827:        if (color_mode < 0 || color_mode > 2) {
                    828:            fprintf(stderr, "Bad color mode selected. Using default.\n");
                    829:            color_mode = 0;
                    830:        }
                    831:        break;
                    832:     }
                    833: }

unix.superglobalmegacorp.com

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