|
|
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.