|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
1.1.1.4 ! root 3: *
1.1 root 4: * p.OS interface
1.1.1.4 ! root 5: *
1.1 root 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:
1.1.1.3 root 20: #include "threaddep/thread.h"
1.1 root 21: #include "uae.h"
22: #include "config.h"
23: #include "options.h"
24: #include "../include/memory.h"
1.1.1.4 ! root 25: #include "custom.h"
! 26: #include "readcpu.h"
! 27: #include "newcpu.h"
1.1 root 28: #include "xwin.h"
1.1.1.4 ! root 29: #include "keyboard.h"
! 30: #include "keybuf.h"
! 31: #include "disk.h"
1.1 root 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:
1.1.1.4 ! root 115: /****************************************************************************/
1.1 root 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;
1.1.1.4 ! root 179: buf = gfxvidinfo.linemem; if(!buf)
1.1 root 180: buf = gfxvidinfo.bufmem + y*gfxvidinfo.rowbytes;
181:
182: if(currprefs.use_low_bandwidth) {
1.1.1.4 ! root 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: }
1.1 root 212: }
213: switch(gfxvidinfo.pixbytes) {
214: case 1:
1.1.1.4 ! root 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;
1.1 root 221: case 2:
1.1.1.4 ! root 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;
1.1 root 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:
1.1.1.4 ! root 276: write_log("Using 256 gray scales.\n");
! 277: use_gray = 1;
! 278: /* fall through */
1.1 root 279: case 1:
1.1.1.4 ! root 280: if(!use_gray) write_log("Using 256 colors.\n");
! 281: alloc_colors256(get_color);
! 282: break;
1.1 root 283: case 3:
1.1.1.4 ! root 284: printf("Using truecolor.\n");
! 285: for(i=0;i<4096;++i) xcolors[i] = i;
! 286: break;
1.1 root 287: }
288: switch (gfxvidinfo.pixbytes) {
289: case 2:
1.1.1.4 ! root 290: for (i = 0; i < 4096; i++)
! 291: xcolors[i] = xcolors[i] * 0x00010001;
! 292: gfxvidinfo.can_double = 1;
! 293: break;
1.1 root 294: case 1:
1.1.1.4 ! root 295: for (i = 0; i < 4096; i++)
! 296: xcolors[i] = xcolors[i] * 0x01010101;
! 297: gfxvidinfo.can_double = 1;
! 298: break;
1.1 root 299: default:
1.1.1.4 ! root 300: gfxvidinfo.can_double = 0;
! 301: break;
1.1 root 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,
1.1.1.4 ! root 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);
1.1 root 320:
321: S = pOS_LockPubScreen(NULL);
322: if(!S) {
1.1.1.4 ! root 323: write_log("No public screen !\n");
! 324: return 0;
1.1 root 325: }
326:
327: if(currprefs.gfx_height + S->scr_BarHeight + 1 >= (int)S->scr_Height) {
1.1.1.4 ! root 328: currprefs.gfx_height >>= 1;
! 329: currprefs.gfx_correct_aspect = 1;
1.1 root 330: }
1.1.1.4 ! root 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/#?",
1.1 root 341: // ICLTAG_StandardDrag, TRUE,
1.1.1.4 ! root 342: ICLTAG_HighlightDropBox, TRUE,
! 343: ICLTAG_NoSelect, TRUE,
! 344: TAG_DONE);
1.1 root 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(
1.1.1.4 ! root 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|
1.1 root 368: // WINFLGF_Activate|
1.1.1.4 ! root 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);
1.1 root 382: pOS_UnlockPubScreen(S);
383: if(!W) {
1.1.1.4 ! root 384: fprintf(stderr,"Can't open window !\n");
! 385: return 0;
1.1 root 386: }
387:
388: /* now we know the window box and can setup the drag&drop gad. */
389: {
1.1.1.4 ! root 390: struct pOS_IBox Box;
1.1 root 391:
1.1.1.4 ! root 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: */
1.1 root 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) {
1.1.1.4 ! root 448: ix_req(NULL, "Abort", NULL, "That version of %s is only for p.OS!", __progname);
! 449: exit(20);
! 450: }
1.1 root 451: #endif
452: gb_IntuiBase = (void*)pOS_OpenLibrary("pintui.library",0);
453: if(!gb_IntuiBase) {
1.1.1.4 ! root 454: fprintf(stderr,"No pintui.library ?\n");
! 455: return 0;
1.1 root 456: }
457: gb_GfxBase = (void*)pOS_OpenLibrary("pgraphics.library",0);
458: if(!gb_GfxBase) {
1.1.1.4 ! root 459: fprintf(stderr,"No pgraphics.library ?\n");
! 460: return 0;
1.1 root 461: }
462: gb_DtTypeBase =(void*)pOS_OpenLibrary("pDtType.library",0);
463: if(!gb_DtTypeBase) {
1.1.1.4 ! root 464: fprintf(stderr,"No pDtType.library ?\n");
! 465: return 0;
1.1 root 466: }
1.1.1.4 ! root 467: initpseudodevices();
1.1 root 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) {
1.1.1.4 ! root 479: fprintf(stderr, "Bad color mode selected. Using default.\n");
! 480: currprefs.color_mode = 3;
1.1 root 481: }
482: if (currprefs.gfx_width < 320)
1.1.1.4 ! root 483: currprefs.gfx_width = 320;
1.1 root 484: if (currprefs.gfx_height < 100)
1.1.1.4 ! root 485: currprefs.gfx_height = 100;
1.1 root 486: currprefs.gfx_width += 7;
487: currprefs.gfx_width &= ~7;
1.1.1.4 ! root 488:
1.1 root 489: gfxvidinfo.width = currprefs.gfx_width;
490: gfxvidinfo.height = currprefs.gfx_height;
491:
492: if(!setup_publicscreen()) return 0;
1.1.1.4 ! root 493:
1.1 root 494: switch(currprefs.color_mode) {
495: case 0: case 1: case 2:
1.1.1.4 ! root 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 */
1.1 root 514: case 3: /* 24 bits */
1.1.1.4 ! root 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;
1.1 root 522: }
1.1.1.4 ! root 523:
1.1 root 524: if(!GM8 && !GM24) {
1.1.1.4 ! root 525: fprintf(stderr,"Unable to get GfxMap.\n");
! 526: return 0;
1.1 root 527: }
528:
1.1.1.2 root 529: gfxvidinfo.emergmem = 0;
530: gfxvidinfo.linemem = 0;
1.1 root 531: gfxvidinfo.rowbytes = gfxvidinfo.pixbytes * currprefs.gfx_width;
1.1.1.4 ! root 532: gfxvidinfo.bufmem = (char *)calloc(gfxvidinfo.rowbytes,
! 533: currprefs.gfx_height);
1.1 root 534: if(!gfxvidinfo.bufmem) {
1.1.1.4 ! root 535: fprintf(stderr,"Not enough memory for video bufmem.\n");
! 536: return 0;
! 537: }
1.1 root 538: gfxvidinfo.maxblocklines = 0;
539:
540: if (currprefs.use_low_bandwidth) {
1.1.1.4 ! root 541: oldpixbuf = (char *)calloc(gfxvidinfo.rowbytes,
! 542: currprefs.gfx_height);
! 543: if(!gfxvidinfo.bufmem) {
! 544: write_log("Not enough mem for low-bandwidth!\n");
! 545: currprefs.use_low_bandwidth = 0;
! 546: } else gfxvidinfo.maxblocklines = currprefs.gfx_height-1;
1.1 root 547: }
548:
549: set_title();
550:
551: if (!init_colors()) {
1.1.1.4 ! root 552: write_log("Failed to init colors.\n");
! 553: return 0;
1.1 root 554: }
555:
556: buttonstate[0] = buttonstate[1] = buttonstate[2] = 0;
557: for(i=0; i<256; i++)
1.1.1.4 ! root 558: keystate[i] = 0;
! 559:
! 560: lastmx = lastmy = 0;
1.1 root 561: newmousecounters = 0;
562: inwindow = 0;
563:
564: rexx_init();
565:
566: pOS_ActivateWindow(W);
567:
568: return 1;
569: }
570:
571: /****************************************************************************/
572:
573: void graphics_leave(void)
574: {
575: rexx_exit();
576: closepseudodevices();
577: if(GM8) {
1.1.1.4 ! root 578: pOS_FreeGfxMap(&GM8->ckgm_Gfx);
! 579: GM8 = NULL;
! 580: }
1.1 root 581: if(GM24) {
1.1.1.4 ! root 582: pOS_FreeGfxMap(&GM24->rgbgm_Gfx);
! 583: GM24 = NULL;
! 584: }
1.1 root 585: if(CM) {
1.1.1.4 ! root 586: pOS_FreeColorMap(&CM->rlcm_CM);
! 587: CM = NULL;
1.1 root 588: }
589: if(W) {
1.1.1.4 ! root 590: pOS_CloseWindow(W);
! 591: W = NULL;
1.1 root 592: }
593: if(DDGad) {
1.1.1.4 ! root 594: pOS_DisposeIObject(DDGad);
! 595: DDGad = NULL;
1.1 root 596: }
597: if(gb_DtTypeBase) {
1.1.1.4 ! root 598: pOS_CloseLibrary((void*)gb_DtTypeBase);
! 599: gb_DtTypeBase = NULL;
1.1 root 600: }
601: if(gb_PSLBase) {
1.1.1.4 ! root 602: pOS_CloseLibrary((void*)gb_PSLBase);
! 603: gb_PSLBase = NULL;
1.1 root 604: }
605: if(gb_IntuiBase) {
1.1.1.4 ! root 606: pOS_CloseLibrary((void*)gb_IntuiBase);
! 607: gb_IntuiBase = NULL;
1.1 root 608: }
609: if(gb_GfxBase) {
1.1.1.4 ! root 610: pOS_CloseLibrary((void*)gb_GfxBase);
! 611: gb_GfxBase = NULL;
1.1 root 612: }
613: }
614:
615:
616: /***************************************************************************/
617:
618: void handle_events(void)
619: {
620: struct pOS_IntuiMessage *msg;
621: int mx,my,class,code;
1.1.1.4 ! root 622:
1.1 root 623: newmousecounters = 0;
624:
1.1.1.4 ! root 625: if(pOS_SetSignal(0L, DOSSIGF_CTRL_C|DOSSIGF_CTRL_D) &
! 626: (DOSSIGF_CTRL_C|DOSSIGF_CTRL_D)) {
! 627: activate_debugger();
1.1 root 628: }
629:
630: while((msg=(void*)pOS_GetMsg(W->win_UserPort))) {
1.1.1.4 ! root 631: class = msg->im_Class;
! 632: code = msg->im_Code;
! 633: mx = msg->im_MouseX;
! 634: my = msg->im_MouseY;
! 635:
! 636: mx -= XOffset;
! 637: my -= YOffset;
! 638:
! 639: switch(class) {
! 640: case IDCMP_DragDrop:
! 641: if(code == IECODE_DROP_WORK) { /* object is dropped */
! 642: struct pOS_IEDragDrop *DD;
! 643:
! 644: DD = &((struct pOS_ISMDrop*)msg->im_Data)->ismd_IEDD;
! 645: HandleDrop(DD);
! 646: pOS_ActivateWindow(W);
! 647: }
! 648: break;
! 649:
! 650: case IDCMP_NewSize:
! 651: /* where is WFLG_ZOOMED for pOS ? */
! 652: inhibit_frame = W->win_Height<50?1:0;
! 653: set_title();
! 654: break;
! 655:
! 656: case IDCMP_RefreshWindow:
! 657: if(currprefs.use_low_bandwidth) {
! 658: /* hack: this forces refresh */
! 659: char *ptr = oldpixbuf;
! 660: int i, len = gfxvidinfo.rowbytes;
! 661: for(i=0;i<gfxvidinfo.height;++i) {
! 662: ptr[00000] ^= 255;
! 663: ptr[len-1] ^= 255;
! 664: ptr += len;
! 665: }
! 666: }
! 667: pOS_BeginRefresh(W, NULL);
! 668: flush_block(0,gfxvidinfo.height-1);
! 669: pOS_EndRefresh(W, TRUE);
! 670: set_title();
! 671: break;
! 672:
! 673: case IDCMP_CloseWindow:
! 674: activate_debugger();
! 675: break;
! 676:
! 677: case IDCMP_RawKey: {
! 678: int kc = code&127;
! 679: int released = code&128?1:0;
! 680:
! 681: if(released) {
! 682: keystate[kc] = 0;
! 683: record_key ((kc << 1) | 1);
! 684: } else if (!keystate[kc]) {
! 685: keystate[kc] = 1;
! 686: record_key (kc << 1);
! 687: }
! 688: } break;
! 689:
! 690: case IDCMP_MouseMove:
! 691: if(inwindow) {
! 692: lastmx = mx;
! 693: lastmy = my;
! 694: } break;
! 695:
! 696: case IDCMP_MouseButtons:
! 697: if(code==IECODE_LBUTTON) buttonstate[0]=1;
! 698: if(code==IECODE_LBUTTON+IECODE_UP_PREFIX) buttonstate[0]=0;
! 699: if(code==IECODE_MBUTTON) buttonstate[1]=1;
! 700: if(code==IECODE_MBUTTON+IECODE_UP_PREFIX) buttonstate[1]=0;
! 701: if(code==IECODE_RBUTTON) buttonstate[2]=1;
! 702: if(code==IECODE_RBUTTON+IECODE_UP_PREFIX) buttonstate[2]=0;
! 703: break;
! 704:
! 705: case IDCMP_ActiveWindow:
! 706: inwindow = 1;
! 707: newmousecounters = 1;
! 708: set_title();
! 709: break;
! 710:
! 711: case IDCMP_InactiveWindow:
! 712: inwindow = 0;
! 713: set_title();
! 714: break;
! 715:
! 716: case IDCMP_ChangeWindow:
! 717: set_title();
! 718: break;
! 719:
! 720: default:
! 721: fprintf(stderr, "Unknown class: 0x%x\n",class);
! 722: break;
! 723: }
! 724: if(msg && !pOS_SysIMessage(msg)) pOS_ReplyMsg(&msg->im_Message);
1.1 root 725: }
726: /* "Affengriff" */
1.1.1.4 ! root 727: if(keystate[AK_CTRL] && keystate[AK_LAMI] && keystate[AK_RAMI])
! 728: m68k_reset();
1.1 root 729:
730: /* PC-like :-) CTRL-ALT-DEL => reboot */
1.1.1.4 ! root 731: if(keystate[AK_CTRL] && (keystate[AK_LALT] || keystate[AK_RALT]) &&
! 732: keystate[AK_DEL])
! 733: m68k_reset();
1.1 root 734:
735: /* CTRL+LSHIFT+LALT+F10 on amiga => F12 on X11 */
736: /* F9 => ScrollLock on X11 (inhibit_frame) */
737: if(keystate[AK_CTRL] && keystate[AK_LSH] && keystate[AK_LALT]) {
1.1.1.4 ! root 738: if(keystate[AK_F10]) togglemouse();
! 739: if(keystate[AK_F9]) {
! 740: inhibit_frame ^= 1;
! 741: set_title();
! 742: if(inhibit_frame) printf("display disabled\n");
! 743: else printf("display enabled\n");
! 744: }
1.1 root 745: }
746: disk_hotkeys();
747: gui_handle_events();
748: }
749:
750: /***************************************************************************/
751:
752: int debuggable(void)
753: {
754: return 1;
755: }
756:
757: /***************************************************************************/
758:
759: int needmousehack(void)
760: {
761: return 1;
762: }
763:
764: /***************************************************************************/
765:
766: void LED(int on)
767: {
768: }
769:
770: /***************************************************************************/
771:
772: static int led_state[5];
773:
774: /* prints some text */
775: static void t_print(char *t, const struct pOS_DrawInfo *di)
776: {
777: pOS_SetABPenDrMd(RP, di->dri_Pens[(W->win_Flags&WINFLGF_Activate)?
1.1.1.4 ! root 778: SCRPEN_ActiveWinTitle:
! 779: SCRPEN_InactiveWinTitle],
! 780: di->dri_Pens[(W->win_Flags&WINFLGF_Activate)?
! 781: SCRPEN_ActiveWindow:
! 782: SCRPEN_InactiveWindow],
! 783: DRMD_Jam2);
1.1 root 784: pOS_DrawText(RP, t, strlen(t));
785: /*
786: RP->rp_CP.X += pOS_TextLength(RP, t, strlen(t));
787: */
788: }
789:
790: /* display one led */
791: static void t_led(ULONG BGR, const struct pOS_DrawInfo *di)
792: {
793: struct pOS_Rectangle rect;
794: int x,y,oy;
795:
796: oy = RP->rp_CP.Y;
797: x = RP->rp_CP.X;
798: y = (W->win_BorTop - 6)/2;
799:
800: rect.MinX = x;
801: rect.MaxX = x+pOS_TextLength(RP,IND,strlen(IND))-1;
802: rect.MinY = y;
803: rect.MaxY = y+5;
804:
805: if(BGR<=0x100000)
806: pOS_SetAPenR(RP, (struct pOS_RColor*)&BGR);
807: else
808: pOS_SetAPen(RP, di->dri_Pens[(W->win_Flags&WINFLGF_Activate)?
1.1.1.4 ! root 809: SCRPEN_ActiveWindow:SCRPEN_InactiveWindow]);
1.1 root 810:
811: pOS_DrawRectFill(RP, rect.MinX+1,rect.MinY+1, rect.MaxX-1,rect.MaxY-1);
812: pOS_DrawBorderBox(RP, di, (W->win_Flags&WINFLGF_Activate)?
1.1.1.4 ! root 813: GADBORTYP_BevelDownBox:GADBORTYP_HfBevelDownBox,
! 814: &rect);
1.1 root 815: RP->rp_CP.X = rect.MaxX+1;
816: RP->rp_CP.Y = oy;
817: }
818:
819: static void set_title(void)
820: {
821: int drk, red, grn;
822: const struct pOS_DrawInfo *di = W->win_ICI->ici_DrawInfo;
823:
824: if(W->win_Width<=128) return; /* iconified: no txt */
825:
826: pOS_SetPosition(RP, 25, (W->win_BorTop - RP->rp_TxHeight)/2
1.1.1.4 ! root 827: + RP->rp_TxBaseline);
1.1 root 828:
829:
830: red = (W->win_Flags&WINFLGF_Activate)?255:190;
831: grn = ((W->win_Flags&WINFLGF_Activate)?255:190)<<8;
832: drk = 0x1000000/*0xAAAAAA*/;
833:
834: t_print("UAE - Power: ", di);
835: t_led(led_state[0]?red:drk, di);
836: t_print(" Disks: ", di);
837: t_led(led_state[1]?grn:drk, di);
838: t_print(" ", di);
839: t_led(led_state[2]?grn:drk, di);
840: t_print(" ", di);
841: t_led(led_state[3]?grn:drk, di);
842: t_print(" ", di);
843: t_led(led_state[4]?grn:drk, di);
844: }
845:
846: /****************************************************************************/
847:
848: void main_window_led(int led, int on) /* is used in amigui.c */
849: {
850: if(led>=0 && led<=4) led_state[led] = on;
851: set_title();
852: }
853:
854: /****************************************************************************/
855:
856: static void unrecord(int kc)
857: {
858: keystate[kc] = 0;
859: record_key ((kc << 1) | 1);
860: }
861:
862: /****************************************************************************/
863:
864: static void disk_hotkeys(void)
865: {
866: struct pOS_PslFileRequester *FileRequest;
867: char buff[80];
868: int drive;
869: char *last_file,*last_dir,*s;
870:
871: if(!(keystate[AK_CTRL] && keystate[AK_LALT])) return;
872:
873: /* CTRL-LSHIFT-LALT F1-F4 => eject_disk */
874: if(keystate[AK_LSH]) {
1.1.1.4 ! root 875: int ok = 0;
1.1 root 876:
1.1.1.4 ! root 877: if(keystate[AK_F1]) {ok=1;disk_eject(0);
! 878: printf("drive DF0: ejected\n");}
! 879: if(keystate[AK_F2]) {ok=1;disk_eject(1);
! 880: printf("drive DF1: ejected\n");}
! 881: if(keystate[AK_F3]) {ok=1;disk_eject(2);
! 882: printf("drive DF2: ejected\n");}
! 883: if(keystate[AK_F4]) {ok=1;disk_eject(3);
! 884: printf("drive DF3: ejected\n");}
! 885:
! 886: if(ok) {
! 887: unrecord(AK_CTRL);unrecord(AK_LALT);unrecord(AK_LSH);
! 888: unrecord(AK_F1);unrecord(AK_F2);
! 889: unrecord(AK_F3);unrecord(AK_F4);
! 890: }
! 891: return;
1.1 root 892: }
893:
894: /* CTRL-LALT F1-F4 => insert_disk */
895: if(keystate[AK_F1]) {drive = 0;unrecord(AK_F1);}
896: else if(keystate[AK_F2]) {drive = 1;unrecord(AK_F2);}
897: else if(keystate[AK_F3]) {drive = 2;unrecord(AK_F3);}
898: else if(keystate[AK_F4]) {drive = 3;unrecord(AK_F4);}
899: else return;
1.1.1.4 ! root 900: unrecord(AK_CTRL);unrecord(AK_LALT);
1.1 root 901:
902: switch(drive) {
903: case 0: case 1: case 2: case 3: last_file = currprefs.df[drive]; break;
904: default: return;
905: }
906:
907: split_dir_file(from_unix_path(last_file), &last_dir, &last_file);
908: if(!last_file) return;
909: if(!last_dir) return;
910:
911: if(!gb_PSLBase) gb_PSLBase=(void*)pOS_OpenLibrary("psl.library",0);
912: if(!gb_PSLBase) {
1.1.1.4 ! root 913: write_log("Can't open psl.library!\n");
! 914: return;
1.1 root 915: }
916:
917: FileRequest = pOS_AllocFileRequest(TAG_DONE);
918: if(!FileRequest) {
1.1.1.4 ! root 919: write_log("Unable to allocate file requester.\n");
! 920: return;
1.1 root 921: }
922:
923: sprintf(buff,"Select file to use for drive DF%d:",drive);
924: if(pOS_PslFileRequest(FileRequest,
1.1.1.4 ! root 925: PSLFRTAG_Title, (ULONG)buff,
! 926: PSLFRTAG_PathPart, (ULONG)last_dir,
! 927: PSLFRTAG_FilePart, (ULONG)last_file,
! 928: PSLFRTAG_Pattern, (ULONG)"(#?.ad(f|z)#?|df?|?)",
! 929: PSLFRTAG_PatternGad, TRUE,
! 930: TAG_DONE)) {
! 931: free(last_file);
! 932: last_file = malloc(3 + strlen(FileRequest->pfr_Path) +
! 933: strlen(FileRequest->pfr_File));
! 934: if(last_file) {
! 935: s = last_file;
! 936: strcpy(s,FileRequest->pfr_Path);
! 937: if(*s && !(s[strlen(s)-1]==':' || s[strlen(s)-1]=='/'))
! 938: strcat(s,"/");
! 939: strcat(s,FileRequest->pfr_File);
! 940: last_file = to_unix_path(s);free(s);
! 941: }
1.1 root 942: } else {
1.1.1.4 ! root 943: free(last_file);
! 944: last_file = NULL;
1.1 root 945: }
946: pOS_FreePslRequest(FileRequest);
947: free(last_dir);
948:
949: if(last_file) {
1.1.1.4 ! root 950: disk_insert(drive,last_file);
! 951: free(last_file);
1.1 root 952: }
953: }
954:
955: /****************************************************************************/
956:
957: ULONG pOS_GetObjectData(APTR obj,ULONG tag)
958: {
959: struct pOS_IntuiMethod Mth;
960: ULONG Dt;
961:
962: Mth.imth_Method=ICLMTH_Get;
963: Mth.imth_U.imth_Get.imgt_ID=tag;
964: Mth.imth_U.imth_Get.imgt_Variable=&Dt;
965: pOS_DoIMethodA(obj,(struct pOS_Method*)&Mth);
966: return(Dt);
967: }
968:
969: /****************************************************************************/
970:
971: #define SIZE 1024
972:
973: static void HandleDrop(struct pOS_IEDragDrop *dd)
974: {
975: char *Type = (char*)pOS_GetObjectData(dd->iedd_Object, DCLTAG_Type);
976: if(!stricmp(Type, pOS_DTFORM_DOSOBJ)) {
1.1.1.4 ! root 977: char *Buffer = (CHAR*)pOS_AllocMem(2*SIZE, MEMF_ANY);
! 978: if( Buffer ) {
! 979: struct pOS_DtTypeDosObj DosObj = {NULL, 0, NULL};
! 980: struct pOS_DClassInfo DCI = {
! 981: pOS_DTFORM_DOSOBJ, NULL, DCLINFOF_None, NULL
! 982: };
! 983:
! 984: pOS_DCLASSINFO(&DCI);
! 985: DCI.dci_Data = &DosObj;
! 986:
! 987: DosObj.dtdos_Buffer = Buffer+SIZE;
! 988: DosObj.dtdos_BufSize = SIZE;
! 989: strcpy(DosObj.dtdos_Buffer, "run ");
! 990: DosObj.dtdos_Buffer += strlen(DosObj.dtdos_Buffer);
! 991: DosObj.dtdos_BufSize -= strlen(DosObj.dtdos_Buffer);
! 992:
! 993: if(pOS_LoadDTObjectA(dd->iedd_Object, &DCI, NULL)) {
! 994: if(DCI.dci_Result > 0) {
! 995: if(DosObj.dtdos_Lock) {
! 996: strcpy(Buffer, "cd ");
! 997:
! 998: pOS_NameFromObjectLock(DosObj.dtdos_Lock,
! 999: Buffer+3, SIZE-3-1);
! 1000: uaeexe(Buffer);
! 1001: uaeexe(DosObj.dtdos_Buffer);
! 1002: } else {
! 1003: uaeexe(DosObj.dtdos_Buffer);
! 1004: }
! 1005: }
! 1006: }
! 1007: }
! 1008: pOS_FreeMem(Buffer, 2*SIZE);
1.1 root 1009: }
1010: }
1011:
1012: /***************************************************************************/
1013:
1014: /* sam: need to put all this in a separate module */
1015:
1016: #ifdef PICASSO96
1017:
1018: void DX_Invalidate (int first, int last)
1019: {
1020: }
1021:
1022: int DX_BitsPerCannon (void)
1023: {
1024: return 8;
1025: }
1026:
1027: void DX_SetPalette(int start, int count)
1028: {
1029: }
1030:
1031: int DX_FillResolutions (uae_u16 *ppixel_format)
1032: {
1033: return 0;
1034: }
1035:
1036: void gfx_set_picasso_modeinfo (int w, int h, int depth)
1037: {
1038: }
1039:
1040: void gfx_set_picasso_baseaddr (uaecptr a)
1041: {
1042: }
1043:
1044: void gfx_set_picasso_state (int on)
1045: {
1046: }
1047:
1048: void begindrawing (void)
1049: {
1050: }
1051:
1052: void enddrawing (void)
1053: {
1054: }
1055:
1056: uae_u8 *lockscr (void)
1057: {
1058: return NULL;
1059: }
1060:
1061: void unlockscr (void)
1062: {
1063: }
1064: #endif
1065:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.