|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * p.OS interface ! 5: * ! 6: * Copyright 1997 Samuel Devulder. ! 7: */ ! 8: ! 9: /****************************************************************************/ ! 10: ! 11: #include "sysconfig.h" ! 12: #include "sysdeps.h" ! 13: ! 14: #include <ctype.h> ! 15: #include <signal.h> ! 16: #include <ix.h> ! 17: ! 18: /****************************************************************************/ ! 19: ! 20: #include "threaddep/penguin.h" ! 21: #include "uae.h" ! 22: #include "config.h" ! 23: #include "options.h" ! 24: #include "../include/memory.h" ! 25: #include "custom.h" ! 26: #include "readcpu.h" ! 27: #include "newcpu.h" ! 28: #include "xwin.h" ! 29: #include "keyboard.h" ! 30: #include "keybuf.h" ! 31: #include "disk.h" ! 32: #include "debug.h" ! 33: #include "gui.h" ! 34: #include "uaeexe.h" ! 35: #include "picasso96.h" ! 36: ! 37: /****************************************************************************/ ! 38: ! 39: struct pOS_Locale; ! 40: struct pOS_Library; ! 41: struct pOS_ExecBase; ! 42: struct pOS_DosBase; ! 43: struct pOS_Method; ! 44: struct pOS_Resource; ! 45: struct pOS_RawDoFmtData; ! 46: struct pOS_AsciiDoFmtData; ! 47: struct pOS_AsciiFmtData; ! 48: struct pOS_ClassGrp; ! 49: struct pOS_DosDevPathInfo; ! 50: struct pOS_ShellScript; ! 51: struct pOS_SegmentInfo; ! 52: struct IClass; ! 53: struct Isrvstr; ! 54: struct TagItem; ! 55: struct MemHeader; ! 56: struct SemaphoreMessage; ! 57: struct StackSwapStruct; ! 58: struct Interrupt; ! 59: struct StandardPacket; ! 60: struct InfoData; ! 61: struct WBStartup; ! 62: ! 63: #define _SIZE_T /* to avoid interference with <syst/types.h> */ ! 64: #include <pExec/Types.h> ! 65: #include <pDOS/Lock.h> ! 66: #include <pDOS/ArgTags.h> ! 67: #include <pDOS/DosSig.h> ! 68: #include <pDOS/DosErrors.h> ! 69: #include <psl/FileReq.h> ! 70: #include <psl/pSLTags.h> ! 71: #include <pGadget/Gadget.h> ! 72: #include <pGfx/StdGMap.h> ! 73: #include <pGfx/StdCMap.h> ! 74: #include <pGfx/GfxTags.h> ! 75: #include <pGfx/RastPort.h> ! 76: #include <pScreen/ScrTags.h> ! 77: #include <pScreen/Window.h> ! 78: #include <pScreen/Screen.h> ! 79: #include <pScreen/DrawInfo.h> ! 80: #include <pIntui/IntuMsg.h> ! 81: #include <pIntui/ICI.h> ! 82: #include <pIntui/Tags.h> ! 83: #include <pIntui/GClass.h> ! 84: #include <pIntui/DragTags.h> ! 85: #include <pDtType/DClass.h> ! 86: #include <pDtType/DtBase.h> ! 87: #include <pDtType/DtTags.h> ! 88: #include <pDtType/DosObj.h> ! 89: ! 90: /*#include <pInline/pLibExt.h> */ ! 91: #include <pInline/pExec2.h> ! 92: #include <pInline/pDos2.h> ! 93: #include <pInline/pIntui2.h> ! 94: #include <pInline/pGfx2.h> ! 95: #include <pInline/pPSL2.h> ! 96: #include <pInline/pDtType2.h> ! 97: ! 98: /****************************************************************************/ ! 99: ! 100: xcolnr xcolors[4096]; ! 101: ! 102: /* Keyboard and mouse */ ! 103: ! 104: static int keystate[256]; ! 105: ! 106: int buttonstate[3]; ! 107: int lastmx, lastmy; ! 108: int newmousecounters; ! 109: ! 110: static int inwindow; ! 111: ! 112: struct vidbuf_description gfxvidinfo; ! 113: static char *oldpixbuf; ! 114: ! 115: /****************************************************************************/ ! 116: /* ! 117: * prototypes & global vars ! 118: */ ! 119: extern int rexx_init(void); ! 120: extern void rexx_exit(void); ! 121: extern void initpseudodevices(void); ! 122: extern void closepseudodevices(void); ! 123: extern char *to_unix_path(char *s); ! 124: extern char *from_unix_path(char *s); ! 125: extern void split_dir_file(char *src, char **dir, char **file); ! 126: ! 127: void main_window_led(int led, int on); ! 128: ULONG pOS_GetObjectData(APTR obj,ULONG tag); ! 129: ! 130: extern struct pOS_ExecBase *gb_ExecBase; ! 131: extern struct pOS_ExecLibFunction *gb_ExecLib; ! 132: extern struct pOS_DosBase *gb_DosBase; ! 133: extern struct pOS_LocaleBase *gb_LocaleBase; ! 134: ! 135: struct pOS_IntuiDevice *gb_IntuiBase; ! 136: struct pOS_GfxBase *gb_GfxBase; ! 137: struct pOS_pSLBase *gb_PSLBase; ! 138: struct pOS_DataTypeBase *gb_DtTypeBase; ! 139: ! 140: /****************************************************************************/ ! 141: ! 142: static void disk_hotkeys(void); ! 143: static void set_title(void); ! 144: static void HandleDrop(struct pOS_IEDragDrop *DD); ! 145: ! 146: static struct pOS_Window *W; ! 147: static struct pOS_RastPort *RP; ! 148: static struct pOS_StdRGB8GfxMap *GM24; ! 149: static struct pOS_StdChunky8GfxMap *GM8; ! 150: static struct pOS_StdRLColorMap *CM; ! 151: static struct pOS_Gadget *DDGad; /* Drag&Drop gadget */ ! 152: ! 153: static int XOffset,YOffset; ! 154: static int use_gray; ! 155: ! 156: /****************************************************************************/ ! 157: ! 158: static RETSIGTYPE sigbrkhandler(int foo) ! 159: { ! 160: activate_debugger(); ! 161: } ! 162: ! 163: void setup_brkhandler(void) ! 164: { ! 165: signal(SIGINT,sigbrkhandler); ! 166: } ! 167: ! 168: /****************************************************************************/ ! 169: ! 170: __inline__ void flush_line(int y) ! 171: { ! 172: int len, l; ! 173: unsigned char *buf, *dst, *src; ! 174: int xs; ! 175: ! 176: if(y<0 || y>=gfxvidinfo.height) return; ! 177: xs = 0; ! 178: len = gfxvidinfo.width; ! 179: buf = gfxvidinfo.linemem; if(!buf) ! 180: buf = gfxvidinfo.bufmem + y*gfxvidinfo.rowbytes; ! 181: ! 182: if(currprefs.use_low_bandwidth) { ! 183: switch(gfxvidinfo.pixbytes) { ! 184: case 2: { ! 185: short *newp = (short *)buf; ! 186: short *oldp = (short *)(oldpixbuf + y*gfxvidinfo.rowbytes); ! 187: while (*newp++ == *oldp++) if(!--len) return; ! 188: src = (char *)--newp; ! 189: dst = (char *)--oldp; ! 190: newp += len; ! 191: oldp += len; ! 192: while (*--newp == *--oldp); ! 193: len = 1 + (oldp - (short *)dst); ! 194: xs = (src - buf)/2; ! 195: pOS_CopyMem (src, dst, len * 2); ! 196: } break; ! 197: case 1: { ! 198: char *newp = (char *)buf; ! 199: char *oldp = (char *)(oldpixbuf + y*gfxvidinfo.rowbytes); ! 200: while (*newp++ == *oldp++) if(!--len) return; ! 201: src = (char *)--newp; ! 202: dst = (char *)--oldp; ! 203: newp += len; ! 204: oldp += len; ! 205: while (*--newp == *--oldp); ! 206: len = 1 + (oldp - (char *)dst); ! 207: xs = (src - buf); ! 208: pOS_CopyMem (src, dst, len); ! 209: } break; ! 210: default: abort(); ! 211: } ! 212: } ! 213: switch(gfxvidinfo.pixbytes) { ! 214: case 1: ! 215: buf += xs; ! 216: l = len; src = buf; dst = GM8->ckgm_Chunky+xs; ! 217: while(l--) {*dst++ = *src++;} ! 218: pOS_WriteStdGfxMapRastPort(&GM8->ckgm_Gfx,xs,0, ! 219: RP,XOffset+xs,YOffset+y,len,1,0); ! 220: break; ! 221: case 2: ! 222: /* if only pOS could provide a ARGB8 struct that fits on a ULONG */ ! 223: buf += 2*xs; ! 224: l = len; src = buf; dst = GM24->rgbgm_R+xs; ! 225: while(l--) {*dst++ = (ULONG)*src * 0x11 ; src+=2;} ! 226: l = len; src = buf+1; dst = GM24->rgbgm_G+xs; ! 227: while(l--) {*dst++ = (ULONG)(*src>>4) * 0x11; src+=2;} ! 228: l = len; src = buf+1; dst = GM24->rgbgm_B+xs; ! 229: while(l--) {*dst++ = (ULONG)(*src&15) * 0x11; src+=2;} ! 230: pOS_WriteStdGfxMapRastPort(&GM24->rgbgm_Gfx,xs,0, ! 231: RP,XOffset+xs,YOffset+y,len,1,0); ! 232: break; ! 233: } ! 234: } ! 235: ! 236: /****************************************************************************/ ! 237: ! 238: void flush_block (int ystart, int ystop) ! 239: { ! 240: int y; ! 241: for(y=ystart; y<=ystop; ++y) flush_line(y); ! 242: } ! 243: ! 244: /****************************************************************************/ ! 245: ! 246: void flush_screen (int ystart, int ystop) ! 247: { ! 248: } ! 249: ! 250: /****************************************************************************/ ! 251: ! 252: static int get_color(int r, int g, int b, xcolnr *cnp) ! 253: { ! 254: static int col; ! 255: ! 256: r *= 0x11; g *= 0x11; b *= 0x11; ! 257: if(use_gray) r = g = b = (77*r + 151*g + 29*b) / 256; ! 258: ! 259: CM->rlcm_Colors[col].rc_U.rc_E.rcue_R = r; ! 260: CM->rlcm_Colors[col].rc_U.rc_E.rcue_G = g; ! 261: CM->rlcm_Colors[col].rc_U.rc_E.rcue_B = b; ! 262: ! 263: *cnp = col++; ! 264: ! 265: return 1; ! 266: } ! 267: ! 268: /****************************************************************************/ ! 269: ! 270: static int init_colors(void) ! 271: { ! 272: int i; ! 273: ! 274: switch(currprefs.color_mode) { ! 275: case 0: case 2: ! 276: write_log("Using 256 gray scales.\n"); ! 277: use_gray = 1; ! 278: /* fall through */ ! 279: case 1: ! 280: if(!use_gray) write_log("Using 256 colors.\n"); ! 281: alloc_colors256(get_color); ! 282: break; ! 283: case 3: ! 284: printf("Using truecolor.\n"); ! 285: for(i=0;i<4096;++i) xcolors[i] = i; ! 286: break; ! 287: } ! 288: switch (gfxvidinfo.pixbytes) { ! 289: case 2: ! 290: for (i = 0; i < 4096; i++) ! 291: xcolors[i] = xcolors[i] * 0x00010001; ! 292: gfxvidinfo.can_double = 1; ! 293: break; ! 294: case 1: ! 295: for (i = 0; i < 4096; i++) ! 296: xcolors[i] = xcolors[i] * 0x01010101; ! 297: gfxvidinfo.can_double = 1; ! 298: break; ! 299: default: ! 300: gfxvidinfo.can_double = 0; ! 301: break; ! 302: } ! 303: return 1; ! 304: } ! 305: ! 306: /****************************************************************************/ ! 307: ! 308: #define IND "===" ! 309: ! 310: static int setup_publicscreen(void) ! 311: { ! 312: static char ScreenTitle[100]; ! 313: static struct pOS_IBox ZoomArray = {0,0,0,0}; ! 314: struct pOS_Screen *S; ! 315: ! 316: sprintf(ScreenTitle, ! 317: "UAE-%d.%d.%d � by Bernd Schmidt & contributors, " ! 318: "p.OS Port by Samuel Devulder.", ! 319: (version / 100) % 10, (version / 10) % 10, version % 10); ! 320: ! 321: S = pOS_LockPubScreen(NULL); ! 322: if(!S) { ! 323: write_log("No public screen !\n"); ! 324: return 0; ! 325: } ! 326: ! 327: if(currprefs.gfx_height + S->scr_BarHeight + 1 >= (int)S->scr_Height) { ! 328: currprefs.gfx_height >>= 1; ! 329: currprefs.gfx_correct_aspect = 1; ! 330: } ! 331: ! 332: DDGad = (void *)pOS_NewIObject( ! 333: NULL, S->scr_DrawInfo->dri_Names[SCRNAM_GClass], 0, ! 334: ICLTAG_GadBorderType, GADBORTYP_BlkBox, ! 335: ICLTAG_Left, 1, ! 336: ICLTAG_Top, 1, ! 337: ICLTAG_RelWidth, -1, ! 338: ICLTAG_RelHeight, -1, ! 339: ICLTAG_StandardDrop, TRUE, ! 340: ICLTAG_AddDropAttName, (ULONG)"#?dosobj/#?", ! 341: // ICLTAG_StandardDrag, TRUE, ! 342: ICLTAG_HighlightDropBox, TRUE, ! 343: ICLTAG_NoSelect, TRUE, ! 344: TAG_DONE); ! 345: ! 346: ZoomArray.Top = 0; ! 347: ZoomArray.Left = S->scr_Width - 128; ! 348: ZoomArray.Width = 128; ! 349: ZoomArray.Height = S->scr_BarHeight+1; ! 350: ! 351: W=pOS_OpenWindow( ! 352: SCRTAG_Title, (ULONG)"UAE - Power: "IND" Disks: " ! 353: IND" "IND" "IND" "IND, ! 354: SCRTAG_ScreenTitle, (ULONG)ScreenTitle, ! 355: SCRTAG_Screen, (ULONG)S, ! 356: SCRTAG_InnerWidth, currprefs.gfx_width, ! 357: SCRTAG_InnerHeight, currprefs.gfx_height, ! 358: SCRTAG_AutoAdjust, TRUE, ! 359: SCRTAG_UnderMouse, TRUE, ! 360: SCRTAG_ZipGadget, TRUE, ! 361: SCRTAG_ZipIBox, (ULONG)&ZoomArray, ! 362: SCRTAG_Flags, WINFLGF_DepthGadget| ! 363: WINFLGF_SimpleRefresh| ! 364: WINFLGF_CloseGadget| ! 365: WINFLGF_Dragbar| ! 366: WINFLGF_ReportMouse| ! 367: WINFLGF_RMBTrap| ! 368: // WINFLGF_Activate| ! 369: 0, ! 370: SCRTAG_IDCMP, IDCMP_MouseButtons| ! 371: IDCMP_MouseMove| ! 372: IDCMP_RawKey| ! 373: IDCMP_ActiveWindow| ! 374: IDCMP_InactiveWindow| ! 375: IDCMP_CloseWindow| ! 376: IDCMP_RefreshWindow| ! 377: IDCMP_NewSize| ! 378: IDCMP_DragDrop| ! 379: 0, ! 380: SCRTAG_Gadget, (ULONG)DDGad, ! 381: TAG_DONE); ! 382: pOS_UnlockPubScreen(S); ! 383: if(!W) { ! 384: fprintf(stderr,"Can't open window !\n"); ! 385: return 0; ! 386: } ! 387: ! 388: /* now we know the window box and can setup the drag&drop gad. */ ! 389: { ! 390: struct pOS_IBox Box; ! 391: ! 392: pOS_GetWindowIBox(W, &Box, NULL); ! 393: --Box.Left; ! 394: --Box.Top; ! 395: ! 396: DDGad->gad_LeftEdge = Box.Left; ! 397: DDGad->gad_TopEdge = Box.Top; ! 398: DDGad->gad_Width = -(W->win_BorRight + W->win_BorLeft) + 2; ! 399: DDGad->gad_Height = -(W->win_BorBottom + W->win_BorTop) + 2; ! 400: /* ! 401: pOS_DrawBorderBox(W->win_RastPort, S->scr_DrawInfo, ! 402: (W->win_Flags&WINFLGF_Activate)? ! 403: GADBORTYP_BevelDownBox:GADBORTYP_HfBevelDownBox, ! 404: &Box); ! 405: */ ! 406: } ! 407: ! 408: /* Give priority 0 when active, -1 when inactive */ ! 409: pOS_SetWindowTask(W, pOS_FindTask(NULL), 0, -1); ! 410: ! 411: gfxvidinfo.width = (W->win_Width - W->win_BorRight - W->win_BorLeft); ! 412: gfxvidinfo.height = (W->win_Height - W->win_BorTop - W->win_BorBottom); ! 413: XOffset = W->win_BorLeft; ! 414: YOffset = W->win_BorTop; ! 415: ! 416: RP = W->win_RastPort; ! 417: ! 418: return 1; ! 419: } ! 420: ! 421: /****************************************************************************/ ! 422: ! 423: #ifndef HAVE_SIGACTION /* test for -nixpos */ ! 424: double frexp(double value, int *exp) ! 425: { ! 426: *exp = 0; ! 427: if(value>1) while(value>1) {value /= 2;++*exp;} ! 428: else if(value>0) while(value<1) {value *= 2;--*exp;} ! 429: else if(value<-1) while(value<-1) {value /= 2;++*exp;} ! 430: else if(value<0) while(value>-1) {value *= 2;--*exp;} ! 431: return value; ! 432: } ! 433: ! 434: double ldexp(double value, int exp) ! 435: { ! 436: if(exp<0) while(exp++) value /= 2; ! 437: else while(exp--) value *= 2; ! 438: return value; ! 439: } ! 440: #endif ! 441: ! 442: /****************************************************************************/ ! 443: ! 444: int graphics_setup(void) ! 445: { ! 446: #ifdef HAVE_SIGACTION /* test for -nixpos */ ! 447: if(ix_os != OS_IS_POS) { ! 448: ix_req(NULL, "Abort", NULL, "That version of %s is only for p.OS!", __progname); ! 449: exit(20); ! 450: } ! 451: #endif ! 452: gb_IntuiBase = (void*)pOS_OpenLibrary("pintui.library",0); ! 453: if(!gb_IntuiBase) { ! 454: fprintf(stderr,"No pintui.library ?\n"); ! 455: return 0; ! 456: } ! 457: gb_GfxBase = (void*)pOS_OpenLibrary("pgraphics.library",0); ! 458: if(!gb_GfxBase) { ! 459: fprintf(stderr,"No pgraphics.library ?\n"); ! 460: return 0; ! 461: } ! 462: gb_DtTypeBase =(void*)pOS_OpenLibrary("pDtType.library",0); ! 463: if(!gb_DtTypeBase) { ! 464: fprintf(stderr,"No pDtType.library ?\n"); ! 465: return 0; ! 466: } ! 467: initpseudodevices(); ! 468: atexit(graphics_leave); ! 469: return 1; ! 470: } ! 471: ! 472: /****************************************************************************/ ! 473: ! 474: int graphics_init(void) ! 475: { ! 476: int i; ! 477: ! 478: if (currprefs.color_mode > 3) { ! 479: fprintf(stderr, "Bad color mode selected. Using default.\n"); ! 480: currprefs.color_mode = 3; ! 481: } ! 482: if (currprefs.gfx_width < 320) ! 483: currprefs.gfx_width = 320; ! 484: if (currprefs.gfx_height < 100) ! 485: currprefs.gfx_height = 100; ! 486: currprefs.gfx_width += 7; ! 487: currprefs.gfx_width &= ~7; ! 488: ! 489: gfxvidinfo.width = currprefs.gfx_width; ! 490: gfxvidinfo.height = currprefs.gfx_height; ! 491: ! 492: if(!setup_publicscreen()) return 0; ! 493: ! 494: switch(currprefs.color_mode) { ! 495: case 0: case 1: case 2: ! 496: gfxvidinfo.pixbytes = 1; ! 497: CM=(void*)pOS_AllocColorMap(NULL, ! 498: GFXTAG_ColorType, COLMAPTYP_StdRLut, ! 499: GFXTAG_Colors, 256, ! 500: currprefs.color_mode==2?TAG_IGNORE: ! 501: GFXTAG_ColorFlags, COLMAPF_Q1, ! 502: TAG_END); ! 503: if(CM) ! 504: GM8=(void*)pOS_AllocGfxMap(NULL, ! 505: GFXTAG_Width, currprefs.gfx_width, ! 506: GFXTAG_Height, 1, ! 507: GFXTAG_GfxType, GFXMAPTYP_StdChunky8, ! 508: GFXTAG_CrtGfxMapEx, TRUE, ! 509: GFXTAG_ColorMap, (ULONG)CM, ! 510: TAG_END); ! 511: if(GM8) break; ! 512: write_log("trying 24bit GfxMap...\n"); ! 513: /* fall through */ ! 514: case 3: /* 24 bits */ ! 515: gfxvidinfo.pixbytes = 2; ! 516: GM24=(void*)pOS_AllocGfxMap(NULL, ! 517: GFXTAG_Width, currprefs.gfx_width, ! 518: GFXTAG_Height, 1, ! 519: GFXTAG_GfxType, GFXMAPTYP_StdRGB8, ! 520: TAG_END); ! 521: break; ! 522: } ! 523: ! 524: if(!GM8 && !GM24) { ! 525: fprintf(stderr,"Unable to get GfxMap.\n"); ! 526: return 0; ! 527: } ! 528: ! 529: gfxvidinfo.linemem = NULL; ! 530: gfxvidinfo.rowbytes = gfxvidinfo.pixbytes * currprefs.gfx_width; ! 531: gfxvidinfo.bufmem = (char *)calloc(gfxvidinfo.rowbytes, ! 532: currprefs.gfx_height); ! 533: if(!gfxvidinfo.bufmem) { ! 534: fprintf(stderr,"Not enough memory for video bufmem.\n"); ! 535: return 0; ! 536: } ! 537: gfxvidinfo.maxblocklines = 0; ! 538: ! 539: if (currprefs.use_low_bandwidth) { ! 540: oldpixbuf = (char *)calloc(gfxvidinfo.rowbytes, ! 541: currprefs.gfx_height); ! 542: if(!gfxvidinfo.bufmem) { ! 543: write_log("Not enough mem for low-bandwidth!\n"); ! 544: currprefs.use_low_bandwidth = 0; ! 545: } else gfxvidinfo.maxblocklines = currprefs.gfx_height-1; ! 546: } ! 547: ! 548: set_title(); ! 549: ! 550: if (!init_colors()) { ! 551: write_log("Failed to init colors.\n"); ! 552: return 0; ! 553: } ! 554: ! 555: buttonstate[0] = buttonstate[1] = buttonstate[2] = 0; ! 556: for(i=0; i<256; i++) ! 557: keystate[i] = 0; ! 558: ! 559: lastmx = lastmy = 0; ! 560: newmousecounters = 0; ! 561: inwindow = 0; ! 562: ! 563: rexx_init(); ! 564: ! 565: pOS_ActivateWindow(W); ! 566: ! 567: return 1; ! 568: } ! 569: ! 570: /****************************************************************************/ ! 571: ! 572: void graphics_leave(void) ! 573: { ! 574: rexx_exit(); ! 575: closepseudodevices(); ! 576: if(GM8) { ! 577: pOS_FreeGfxMap(&GM8->ckgm_Gfx); ! 578: GM8 = NULL; ! 579: } ! 580: if(GM24) { ! 581: pOS_FreeGfxMap(&GM24->rgbgm_Gfx); ! 582: GM24 = NULL; ! 583: } ! 584: if(CM) { ! 585: pOS_FreeColorMap(&CM->rlcm_CM); ! 586: CM = NULL; ! 587: } ! 588: if(W) { ! 589: pOS_CloseWindow(W); ! 590: W = NULL; ! 591: } ! 592: if(DDGad) { ! 593: pOS_DisposeIObject(DDGad); ! 594: DDGad = NULL; ! 595: } ! 596: if(gb_DtTypeBase) { ! 597: pOS_CloseLibrary((void*)gb_DtTypeBase); ! 598: gb_DtTypeBase = NULL; ! 599: } ! 600: if(gb_PSLBase) { ! 601: pOS_CloseLibrary((void*)gb_PSLBase); ! 602: gb_PSLBase = NULL; ! 603: } ! 604: if(gb_IntuiBase) { ! 605: pOS_CloseLibrary((void*)gb_IntuiBase); ! 606: gb_IntuiBase = NULL; ! 607: } ! 608: if(gb_GfxBase) { ! 609: pOS_CloseLibrary((void*)gb_GfxBase); ! 610: gb_GfxBase = NULL; ! 611: } ! 612: } ! 613: ! 614: ! 615: /***************************************************************************/ ! 616: ! 617: void handle_events(void) ! 618: { ! 619: struct pOS_IntuiMessage *msg; ! 620: int mx,my,class,code; ! 621: ! 622: newmousecounters = 0; ! 623: ! 624: if(pOS_SetSignal(0L, DOSSIGF_CTRL_C|DOSSIGF_CTRL_D) & ! 625: (DOSSIGF_CTRL_C|DOSSIGF_CTRL_D)) { ! 626: activate_debugger(); ! 627: } ! 628: ! 629: while((msg=(void*)pOS_GetMsg(W->win_UserPort))) { ! 630: class = msg->im_Class; ! 631: code = msg->im_Code; ! 632: mx = msg->im_MouseX; ! 633: my = msg->im_MouseY; ! 634: ! 635: mx -= XOffset; ! 636: my -= YOffset; ! 637: ! 638: switch(class) { ! 639: case IDCMP_DragDrop: ! 640: if(code == IECODE_DROP_WORK) { /* object is dropped */ ! 641: struct pOS_IEDragDrop *DD; ! 642: ! 643: DD = &((struct pOS_ISMDrop*)msg->im_Data)->ismd_IEDD; ! 644: HandleDrop(DD); ! 645: pOS_ActivateWindow(W); ! 646: } ! 647: break; ! 648: ! 649: case IDCMP_NewSize: ! 650: /* where is WFLG_ZOOMED for pOS ? */ ! 651: inhibit_frame = W->win_Height<50?1:0; ! 652: set_title(); ! 653: break; ! 654: ! 655: case IDCMP_RefreshWindow: ! 656: if(currprefs.use_low_bandwidth) { ! 657: /* hack: this forces refresh */ ! 658: char *ptr = oldpixbuf; ! 659: int i, len = gfxvidinfo.rowbytes; ! 660: for(i=0;i<gfxvidinfo.height;++i) { ! 661: ptr[00000] ^= 255; ! 662: ptr[len-1] ^= 255; ! 663: ptr += len; ! 664: } ! 665: } ! 666: pOS_BeginRefresh(W, NULL); ! 667: flush_block(0,gfxvidinfo.height-1); ! 668: pOS_EndRefresh(W, TRUE); ! 669: set_title(); ! 670: break; ! 671: ! 672: case IDCMP_CloseWindow: ! 673: activate_debugger(); ! 674: break; ! 675: ! 676: case IDCMP_RawKey: { ! 677: int kc = code&127; ! 678: int released = code&128?1:0; ! 679: ! 680: if(released) { ! 681: keystate[kc] = 0; ! 682: record_key ((kc << 1) | 1); ! 683: } else if (!keystate[kc]) { ! 684: keystate[kc] = 1; ! 685: record_key (kc << 1); ! 686: } ! 687: } break; ! 688: ! 689: case IDCMP_MouseMove: ! 690: if(inwindow) { ! 691: lastmx = mx; ! 692: lastmy = my; ! 693: } break; ! 694: ! 695: case IDCMP_MouseButtons: ! 696: if(code==IECODE_LBUTTON) buttonstate[0]=1; ! 697: if(code==IECODE_LBUTTON+IECODE_UP_PREFIX) buttonstate[0]=0; ! 698: if(code==IECODE_MBUTTON) buttonstate[1]=1; ! 699: if(code==IECODE_MBUTTON+IECODE_UP_PREFIX) buttonstate[1]=0; ! 700: if(code==IECODE_RBUTTON) buttonstate[2]=1; ! 701: if(code==IECODE_RBUTTON+IECODE_UP_PREFIX) buttonstate[2]=0; ! 702: break; ! 703: ! 704: case IDCMP_ActiveWindow: ! 705: inwindow = 1; ! 706: newmousecounters = 1; ! 707: set_title(); ! 708: break; ! 709: ! 710: case IDCMP_InactiveWindow: ! 711: inwindow = 0; ! 712: set_title(); ! 713: break; ! 714: ! 715: case IDCMP_ChangeWindow: ! 716: set_title(); ! 717: break; ! 718: ! 719: default: ! 720: fprintf(stderr, "Unknown class: 0x%x\n",class); ! 721: break; ! 722: } ! 723: if(msg && !pOS_SysIMessage(msg)) pOS_ReplyMsg(&msg->im_Message); ! 724: } ! 725: /* "Affengriff" */ ! 726: if(keystate[AK_CTRL] && keystate[AK_LAMI] && keystate[AK_RAMI]) ! 727: m68k_reset(); ! 728: ! 729: /* PC-like :-) CTRL-ALT-DEL => reboot */ ! 730: if(keystate[AK_CTRL] && (keystate[AK_LALT] || keystate[AK_RALT]) && ! 731: keystate[AK_DEL]) ! 732: m68k_reset(); ! 733: ! 734: /* CTRL+LSHIFT+LALT+F10 on amiga => F12 on X11 */ ! 735: /* F9 => ScrollLock on X11 (inhibit_frame) */ ! 736: if(keystate[AK_CTRL] && keystate[AK_LSH] && keystate[AK_LALT]) { ! 737: if(keystate[AK_F10]) togglemouse(); ! 738: if(keystate[AK_F9]) { ! 739: inhibit_frame ^= 1; ! 740: set_title(); ! 741: if(inhibit_frame) printf("display disabled\n"); ! 742: else printf("display enabled\n"); ! 743: } ! 744: } ! 745: disk_hotkeys(); ! 746: gui_handle_events(); ! 747: } ! 748: ! 749: /***************************************************************************/ ! 750: ! 751: int debuggable(void) ! 752: { ! 753: return 1; ! 754: } ! 755: ! 756: /***************************************************************************/ ! 757: ! 758: int needmousehack(void) ! 759: { ! 760: return 1; ! 761: } ! 762: ! 763: /***************************************************************************/ ! 764: ! 765: void LED(int on) ! 766: { ! 767: } ! 768: ! 769: /***************************************************************************/ ! 770: ! 771: static int led_state[5]; ! 772: ! 773: /* prints some text */ ! 774: static void t_print(char *t, const struct pOS_DrawInfo *di) ! 775: { ! 776: pOS_SetABPenDrMd(RP, di->dri_Pens[(W->win_Flags&WINFLGF_Activate)? ! 777: SCRPEN_ActiveWinTitle: ! 778: SCRPEN_InactiveWinTitle], ! 779: di->dri_Pens[(W->win_Flags&WINFLGF_Activate)? ! 780: SCRPEN_ActiveWindow: ! 781: SCRPEN_InactiveWindow], ! 782: DRMD_Jam2); ! 783: pOS_DrawText(RP, t, strlen(t)); ! 784: /* ! 785: RP->rp_CP.X += pOS_TextLength(RP, t, strlen(t)); ! 786: */ ! 787: } ! 788: ! 789: /* display one led */ ! 790: static void t_led(ULONG BGR, const struct pOS_DrawInfo *di) ! 791: { ! 792: struct pOS_Rectangle rect; ! 793: int x,y,oy; ! 794: ! 795: oy = RP->rp_CP.Y; ! 796: x = RP->rp_CP.X; ! 797: y = (W->win_BorTop - 6)/2; ! 798: ! 799: rect.MinX = x; ! 800: rect.MaxX = x+pOS_TextLength(RP,IND,strlen(IND))-1; ! 801: rect.MinY = y; ! 802: rect.MaxY = y+5; ! 803: ! 804: if(BGR<=0x100000) ! 805: pOS_SetAPenR(RP, (struct pOS_RColor*)&BGR); ! 806: else ! 807: pOS_SetAPen(RP, di->dri_Pens[(W->win_Flags&WINFLGF_Activate)? ! 808: SCRPEN_ActiveWindow:SCRPEN_InactiveWindow]); ! 809: ! 810: pOS_DrawRectFill(RP, rect.MinX+1,rect.MinY+1, rect.MaxX-1,rect.MaxY-1); ! 811: pOS_DrawBorderBox(RP, di, (W->win_Flags&WINFLGF_Activate)? ! 812: GADBORTYP_BevelDownBox:GADBORTYP_HfBevelDownBox, ! 813: &rect); ! 814: RP->rp_CP.X = rect.MaxX+1; ! 815: RP->rp_CP.Y = oy; ! 816: } ! 817: ! 818: static void set_title(void) ! 819: { ! 820: int drk, red, grn; ! 821: const struct pOS_DrawInfo *di = W->win_ICI->ici_DrawInfo; ! 822: ! 823: if(W->win_Width<=128) return; /* iconified: no txt */ ! 824: ! 825: pOS_SetPosition(RP, 25, (W->win_BorTop - RP->rp_TxHeight)/2 ! 826: + RP->rp_TxBaseline); ! 827: ! 828: ! 829: red = (W->win_Flags&WINFLGF_Activate)?255:190; ! 830: grn = ((W->win_Flags&WINFLGF_Activate)?255:190)<<8; ! 831: drk = 0x1000000/*0xAAAAAA*/; ! 832: ! 833: t_print("UAE - Power: ", di); ! 834: t_led(led_state[0]?red:drk, di); ! 835: t_print(" Disks: ", di); ! 836: t_led(led_state[1]?grn:drk, di); ! 837: t_print(" ", di); ! 838: t_led(led_state[2]?grn:drk, di); ! 839: t_print(" ", di); ! 840: t_led(led_state[3]?grn:drk, di); ! 841: t_print(" ", di); ! 842: t_led(led_state[4]?grn:drk, di); ! 843: } ! 844: ! 845: /****************************************************************************/ ! 846: ! 847: void main_window_led(int led, int on) /* is used in amigui.c */ ! 848: { ! 849: if(led>=0 && led<=4) led_state[led] = on; ! 850: set_title(); ! 851: } ! 852: ! 853: /****************************************************************************/ ! 854: ! 855: static void unrecord(int kc) ! 856: { ! 857: keystate[kc] = 0; ! 858: record_key ((kc << 1) | 1); ! 859: } ! 860: ! 861: /****************************************************************************/ ! 862: ! 863: static void disk_hotkeys(void) ! 864: { ! 865: struct pOS_PslFileRequester *FileRequest; ! 866: char buff[80]; ! 867: int drive; ! 868: char *last_file,*last_dir,*s; ! 869: ! 870: if(!(keystate[AK_CTRL] && keystate[AK_LALT])) return; ! 871: ! 872: /* CTRL-LSHIFT-LALT F1-F4 => eject_disk */ ! 873: if(keystate[AK_LSH]) { ! 874: int ok = 0; ! 875: ! 876: if(keystate[AK_F1]) {ok=1;disk_eject(0); ! 877: printf("drive DF0: ejected\n");} ! 878: if(keystate[AK_F2]) {ok=1;disk_eject(1); ! 879: printf("drive DF1: ejected\n");} ! 880: if(keystate[AK_F3]) {ok=1;disk_eject(2); ! 881: printf("drive DF2: ejected\n");} ! 882: if(keystate[AK_F4]) {ok=1;disk_eject(3); ! 883: printf("drive DF3: ejected\n");} ! 884: ! 885: if(ok) { ! 886: unrecord(AK_CTRL);unrecord(AK_LALT);unrecord(AK_LSH); ! 887: unrecord(AK_F1);unrecord(AK_F2); ! 888: unrecord(AK_F3);unrecord(AK_F4); ! 889: } ! 890: return; ! 891: } ! 892: ! 893: /* CTRL-LALT F1-F4 => insert_disk */ ! 894: if(keystate[AK_F1]) {drive = 0;unrecord(AK_F1);} ! 895: else if(keystate[AK_F2]) {drive = 1;unrecord(AK_F2);} ! 896: else if(keystate[AK_F3]) {drive = 2;unrecord(AK_F3);} ! 897: else if(keystate[AK_F4]) {drive = 3;unrecord(AK_F4);} ! 898: else return; ! 899: unrecord(AK_CTRL);unrecord(AK_LALT); ! 900: ! 901: switch(drive) { ! 902: case 0: case 1: case 2: case 3: last_file = currprefs.df[drive]; break; ! 903: default: return; ! 904: } ! 905: ! 906: split_dir_file(from_unix_path(last_file), &last_dir, &last_file); ! 907: if(!last_file) return; ! 908: if(!last_dir) return; ! 909: ! 910: if(!gb_PSLBase) gb_PSLBase=(void*)pOS_OpenLibrary("psl.library",0); ! 911: if(!gb_PSLBase) { ! 912: write_log("Can't open psl.library!\n"); ! 913: return; ! 914: } ! 915: ! 916: FileRequest = pOS_AllocFileRequest(TAG_DONE); ! 917: if(!FileRequest) { ! 918: write_log("Unable to allocate file requester.\n"); ! 919: return; ! 920: } ! 921: ! 922: sprintf(buff,"Select file to use for drive DF%d:",drive); ! 923: if(pOS_PslFileRequest(FileRequest, ! 924: PSLFRTAG_Title, (ULONG)buff, ! 925: PSLFRTAG_PathPart, (ULONG)last_dir, ! 926: PSLFRTAG_FilePart, (ULONG)last_file, ! 927: PSLFRTAG_Pattern, (ULONG)"(#?.ad(f|z)#?|df?|?)", ! 928: PSLFRTAG_PatternGad, TRUE, ! 929: TAG_DONE)) { ! 930: free(last_file); ! 931: last_file = malloc(3 + strlen(FileRequest->pfr_Path) + ! 932: strlen(FileRequest->pfr_File)); ! 933: if(last_file) { ! 934: s = last_file; ! 935: strcpy(s,FileRequest->pfr_Path); ! 936: if(*s && !(s[strlen(s)-1]==':' || s[strlen(s)-1]=='/')) ! 937: strcat(s,"/"); ! 938: strcat(s,FileRequest->pfr_File); ! 939: last_file = to_unix_path(s);free(s); ! 940: } ! 941: } else { ! 942: free(last_file); ! 943: last_file = NULL; ! 944: } ! 945: pOS_FreePslRequest(FileRequest); ! 946: free(last_dir); ! 947: ! 948: if(last_file) { ! 949: disk_insert(drive,last_file); ! 950: free(last_file); ! 951: } ! 952: } ! 953: ! 954: void write_log (const char *buf) ! 955: { ! 956: fprintf (stderr, buf); ! 957: } ! 958: ! 959: /****************************************************************************/ ! 960: ! 961: ULONG pOS_GetObjectData(APTR obj,ULONG tag) ! 962: { ! 963: struct pOS_IntuiMethod Mth; ! 964: ULONG Dt; ! 965: ! 966: Mth.imth_Method=ICLMTH_Get; ! 967: Mth.imth_U.imth_Get.imgt_ID=tag; ! 968: Mth.imth_U.imth_Get.imgt_Variable=&Dt; ! 969: pOS_DoIMethodA(obj,(struct pOS_Method*)&Mth); ! 970: return(Dt); ! 971: } ! 972: ! 973: /****************************************************************************/ ! 974: ! 975: #define SIZE 1024 ! 976: ! 977: static void HandleDrop(struct pOS_IEDragDrop *dd) ! 978: { ! 979: char *Type = (char*)pOS_GetObjectData(dd->iedd_Object, DCLTAG_Type); ! 980: if(!stricmp(Type, pOS_DTFORM_DOSOBJ)) { ! 981: char *Buffer = (CHAR*)pOS_AllocMem(2*SIZE, MEMF_ANY); ! 982: if( Buffer ) { ! 983: struct pOS_DtTypeDosObj DosObj = {NULL, 0, NULL}; ! 984: struct pOS_DClassInfo DCI = { ! 985: pOS_DTFORM_DOSOBJ, NULL, DCLINFOF_None, NULL ! 986: }; ! 987: ! 988: pOS_DCLASSINFO(&DCI); ! 989: DCI.dci_Data = &DosObj; ! 990: ! 991: DosObj.dtdos_Buffer = Buffer+SIZE; ! 992: DosObj.dtdos_BufSize = SIZE; ! 993: strcpy(DosObj.dtdos_Buffer, "run "); ! 994: DosObj.dtdos_Buffer += strlen(DosObj.dtdos_Buffer); ! 995: DosObj.dtdos_BufSize -= strlen(DosObj.dtdos_Buffer); ! 996: ! 997: if(pOS_LoadDTObjectA(dd->iedd_Object, &DCI, NULL)) { ! 998: if(DCI.dci_Result > 0) { ! 999: if(DosObj.dtdos_Lock) { ! 1000: strcpy(Buffer, "cd "); ! 1001: ! 1002: pOS_NameFromObjectLock(DosObj.dtdos_Lock, ! 1003: Buffer+3, SIZE-3-1); ! 1004: uaeexe(Buffer); ! 1005: uaeexe(DosObj.dtdos_Buffer); ! 1006: } else { ! 1007: uaeexe(DosObj.dtdos_Buffer); ! 1008: } ! 1009: } ! 1010: } ! 1011: } ! 1012: pOS_FreeMem(Buffer, 2*SIZE); ! 1013: } ! 1014: } ! 1015: ! 1016: /***************************************************************************/ ! 1017: ! 1018: /* sam: need to put all this in a separate module */ ! 1019: ! 1020: #ifdef PICASSO96 ! 1021: ! 1022: void DX_Invalidate (int first, int last) ! 1023: { ! 1024: } ! 1025: ! 1026: int DX_BitsPerCannon (void) ! 1027: { ! 1028: return 8; ! 1029: } ! 1030: ! 1031: void DX_SetPalette(int start, int count) ! 1032: { ! 1033: } ! 1034: ! 1035: int DX_FillResolutions (uae_u16 *ppixel_format) ! 1036: { ! 1037: return 0; ! 1038: } ! 1039: ! 1040: void gfx_set_picasso_modeinfo (int w, int h, int depth) ! 1041: { ! 1042: } ! 1043: ! 1044: void gfx_set_picasso_baseaddr (uaecptr a) ! 1045: { ! 1046: } ! 1047: ! 1048: void gfx_set_picasso_state (int on) ! 1049: { ! 1050: } ! 1051: ! 1052: void begindrawing (void) ! 1053: { ! 1054: } ! 1055: ! 1056: void enddrawing (void) ! 1057: { ! 1058: } ! 1059: ! 1060: uae_u8 *lockscr (void) ! 1061: { ! 1062: return NULL; ! 1063: } ! 1064: ! 1065: void unlockscr (void) ! 1066: { ! 1067: } ! 1068: #endif ! 1069:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.