|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * NeXT interface ! 5: * NeXTwin.m ! 6: * ! 7: * Copyright 1995, 1996 Bernd Schmidt ! 8: * Copyright 1996 Ed Hanway, Andre Beck ! 9: * Copyright 1996 Ian Stephenson ! 10: */ ! 11: ! 12: #include "sysconfig.h" ! 13: #include "sysdeps.h" ! 14: ! 15: #import <appkit/appkit.h> ! 16: ! 17: #include "config.h" ! 18: #include "options.h" ! 19: #include "memory.h" ! 20: #include "custom.h" ! 21: #include "newcpu.h" ! 22: #include "keyboard.h" ! 23: #include "keybuf.h" ! 24: ! 25: // If you are compiling on NeXTStep 3.2, uncomment the following line: ! 26: // #define NX_EightBitRGBDepth 514 ! 27: ! 28: struct vidbuf_description ! 29: { ! 30: char *bufmem; ! 31: int rowbytes; ! 32: int pixbytes; ! 33: int maxblocklines; ! 34: }; ! 35: ! 36: struct vidbuf_description gfxvidinfo; ! 37: ! 38: /* Keyboard and mouse */ ! 39: ! 40: static BOOL keystate[256]; ! 41: int commandKey = -1; ! 42: ! 43: int quit_program; ! 44: ! 45: BOOL buttonstate[3]; ! 46: int lastmx, lastmy; ! 47: BOOL newmousecounters; ! 48: long int xcolors[4096]; ! 49: ! 50: static NXCursor *cursor; ! 51: ! 52: static View *screen; ! 53: static NXBitmapImageRep *bitmap; ! 54: static char * xlinebuffer; ! 55: static int bitOffset; ! 56: static int keycode2amiga(NXEvent * theEvent); ! 57: ! 58: @interface AmigaView:View ! 59: { ! 60: } ! 61: //From Menu... ! 62: - reset:sender; ! 63: - quit:sender; ! 64: - joystick:sender; ! 65: ! 66: //Floppy Stuff... ! 67: - eject:sender; ! 68: - insert:sender; ! 69: ! 70: //Misc... ! 71: - (BOOL)acceptsFirstResponder; ! 72: - resetCursorRects; ! 73: ! 74: //The ones which do the work... ! 75: - keyDown:(NXEvent *)theEvent; ! 76: - keyUp:(NXEvent *)theEvent; ! 77: - flagsChanged:(NXEvent *)theEvent; ! 78: - mouseDown:(NXEvent *)theEvent; ! 79: - mouseUp:(NXEvent *)theEvent; ! 80: - rightMouseDown:(NXEvent *)theEvent; ! 81: - rightMouseUp:(NXEvent *)theEvent; ! 82: @end ! 83: ! 84: @implementation AmigaView ! 85: -reset:sender ! 86: { ! 87: MC68000_reset(); ! 88: return self; ! 89: } ! 90: -quit:sender ! 91: { ! 92: broken_in = TRUE; ! 93: specialflags |= SPCFLAG_BRK; ! 94: quit_program = 1; ! 95: return self; ! 96: } ! 97: -joystick:sender ! 98: { ! 99: fake_joystick=[sender state]; ! 100: return self; ! 101: } ! 102: -eject:sender ! 103: { ! 104: disk_eject([sender tag]); ! 105: return self; ! 106: } ! 107: -insert:sender ! 108: { ! 109: disk_eject([sender tag]); ! 110: disk_insert([sender tag],[sender stringValue]); ! 111: return self; ! 112: } ! 113: ! 114: - (BOOL)acceptsFirstResponder ! 115: { ! 116: return YES; ! 117: } ! 118: - keyDown:(NXEvent *)theEvent ! 119: { ! 120: if(theEvent->data.key.repeat == 0) ! 121: { ! 122: int kc = keycode2amiga((NXEvent *)theEvent); ! 123: if (!keystate[kc]) ! 124: { ! 125: keystate[kc] = TRUE; ! 126: record_key (kc << 1); ! 127: } ! 128: } ! 129: return self; ! 130: } ! 131: - keyUp:(NXEvent *)theEvent ! 132: { ! 133: int kc = keycode2amiga((NXEvent *)theEvent); ! 134: if (kc == -1) return; ! 135: keystate[kc] = FALSE; ! 136: record_key ((kc << 1) | 1); ! 137: ! 138: return self; ! 139: } ! 140: -flagsChanged:(NXEvent *)theEvent ! 141: { ! 142: if(theEvent->flags & NX_SHIFTMASK) ! 143: {//Shift is Down ! 144: if(!keystate[AK_LSH]) ! 145: { ! 146: keystate[AK_LSH] = TRUE; ! 147: record_key ((AK_LSH << 1)); ! 148: } ! 149: if(!keystate[AK_RSH]) ! 150: { ! 151: keystate[AK_RSH] = TRUE; ! 152: record_key ((AK_RSH << 1)); ! 153: } ! 154: } ! 155: else ! 156: {//Shift is Up ! 157: if(keystate[AK_LSH]) ! 158: { ! 159: keystate[AK_LSH] = FALSE; ! 160: record_key ((AK_LSH << 1) | 1); ! 161: } ! 162: if(keystate[AK_RSH]) ! 163: { ! 164: keystate[AK_RSH] = FALSE; ! 165: record_key ((AK_RSH << 1) | 1); ! 166: } ! 167: } ! 168: ! 169: if(theEvent->flags & NX_CONTROLMASK) ! 170: { ! 171: if(!keystate[AK_CTRL]) ! 172: { ! 173: keystate[AK_CTRL] = TRUE; ! 174: record_key ((AK_CTRL << 1)); ! 175: } ! 176: } ! 177: else ! 178: if(keystate[AK_CTRL]) ! 179: { ! 180: keystate[AK_CTRL] = FALSE; ! 181: record_key ((AK_CTRL << 1) | 1); ! 182: } ! 183: ! 184: if(theEvent->flags & NX_ALTERNATEMASK) ! 185: {//Alt is Down ! 186: if(!keystate[AK_LALT]) ! 187: { ! 188: keystate[AK_LALT] = TRUE; ! 189: record_key ((AK_LALT << 1)); ! 190: } ! 191: if(!keystate[AK_RALT]) ! 192: { ! 193: keystate[AK_RALT] = TRUE; ! 194: record_key ((AK_RALT << 1)); ! 195: } ! 196: } ! 197: else ! 198: {//Alt is Up ! 199: if(keystate[AK_LALT]) ! 200: { ! 201: keystate[AK_LALT] = FALSE; ! 202: record_key ((AK_LALT << 1) | 1); ! 203: } ! 204: if(keystate[AK_RALT]) ! 205: { ! 206: keystate[AK_RALT] = FALSE; ! 207: record_key ((AK_RALT << 1) | 1); ! 208: } ! 209: ! 210: } ! 211: return self; ! 212: } ! 213: - mouseDown:(NXEvent *)theEvent ! 214: { ! 215: buttonstate[0] = 1; ! 216: return self; ! 217: } ! 218: - mouseUp:(NXEvent *)theEvent ! 219: { ! 220: buttonstate[0] = 0; ! 221: return self; ! 222: } ! 223: - rightMouseDown:(NXEvent *)theEvent ! 224: { ! 225: buttonstate[2] = 1; ! 226: return self; ! 227: } ! 228: - rightMouseUp:(NXEvent *)theEvent ! 229: { ! 230: buttonstate[2] = 0; ! 231: return self; ! 232: } ! 233: ! 234: - resetCursorRects ! 235: { ! 236: NXRect visible; ! 237: ! 238: ! 239: ! 240: if ([self getVisibleRect:&visible]) ! 241: [self addCursorRect:&visible cursor:cursor]; ! 242: return self; ! 243: } ! 244: @end ! 245: // End of AmigaView Object - common functions now!!! ! 246: ! 247: ! 248: void flush_block (int ystart, int ystop) ! 249: { ! 250: id tmpBitmap; ! 251: NXPoint where; ! 252: ! 253: //printf("Flush Block:%d->%d\n",ystart,ystop); ! 254: if(ystart >= ystop) ! 255: return; ! 256: ! 257: ystop++; //Make sure we get the last line! ! 258: ! 259: tmpBitmap=[[NXBitmapImageRep alloc] ! 260: initData:[bitmap data]+ystart*[bitmap bytesPerRow] ! 261: pixelsWide:(int)800 ! 262: pixelsHigh:(int)(ystop-ystart) ! 263: bitsPerSample:[bitmap bitsPerSample] ! 264: samplesPerPixel:[bitmap samplesPerPixel] ! 265: hasAlpha:(BOOL)[bitmap hasAlpha] ! 266: isPlanar:(BOOL)NO ! 267: colorSpace:[bitmap colorSpace] ! 268: bytesPerRow:[bitmap bytesPerRow] ! 269: bitsPerPixel:[bitmap bitsPerPixel] ! 270: ]; ! 271: ! 272: where.x=0; ! 273: where.y=283-ystop; ! 274: [screen lockFocus]; ! 275: [tmpBitmap drawAt:&where]; ! 276: [screen unlockFocus]; ! 277: [screen display]; ! 278: [tmpBitmap free]; ! 279: } ! 280: ! 281: void flush_screen (void) ! 282: { ! 283: return; ! 284: //This simple version is no longer required... ! 285: [screen lockFocus]; ! 286: [bitmap draw]; ! 287: [screen unlockFocus]; ! 288: [screen display]; ! 289: } ! 290: ! 291: void flush_line(int y) ! 292: { ! 293: ! 294: return; ! 295: } ! 296: ! 297: ! 298: void graphics_init(void) ! 299: { ! 300: int i; ! 301: NXRect rect; ! 302: ! 303: quit_program = NO; ! 304: fake_joystick = NO; ! 305: ! 306: [Application new]; ! 307: if (![NXApp loadNibSection:"Uae.nib" owner:NXApp withNames:NO]) ! 308: { ! 309: puts("Can't find NIB file"); ! 310: exit(-1); ! 311: } ! 312: [NXApp perform:@selector(stop:) with:nil afterDelay:0.0 cancelPrevious:NO]; ! 313: [NXApp run]; ! 314: ! 315: screen=[NXApp delegate]; ! 316: ! 317: [[screen window] addToEventMask:NX_RMOUSEDOWNMASK|NX_RMOUSEUPMASK]; ! 318: ! 319: cursor=[[NXCursor alloc] initFromImage:[NXImage findImageNamed:"dummy"]]; ! 320: ! 321: switch([Window defaultDepthLimit]) ! 322: { ! 323: case NX_TwentyFourBitRGBDepth: ! 324: { ! 325: for(i = 0; i < 4096; i++) ! 326: { ! 327: xcolors[i]= NXSwapHostLongToBig(((i & 0x0f00) << (20))| ! 328: ((i & 0x00f0) << (16))| ! 329: ((i & 0x000f) << (12))| ! 330: 0xff); ! 331: } ! 332: ! 333: bitmap=[[NXBitmapImageRep alloc] ! 334: initData:(unsigned char *)NULL ! 335: pixelsWide:(int)800 ! 336: pixelsHigh:(int)(313-29) ! 337: bitsPerSample:(int)8 ! 338: samplesPerPixel:(int)4 ! 339: hasAlpha:(BOOL)YES ! 340: isPlanar:(BOOL)NO ! 341: colorSpace:(NXColorSpace)NX_RGBColorSpace ! 342: bytesPerRow:(int)800*4 ! 343: bitsPerPixel:(int)32 ! 344: ]; ! 345: gfxvidinfo.pixbytes=4; ! 346: break; ! 347: } ! 348: case NX_TwelveBitRGBDepth: ! 349: case NX_EightBitRGBDepth: ! 350: { ! 351: for(i = 0; i < 4096; i++) ! 352: { ! 353: xcolors[i] = NXSwapHostShortToBig((short)((i << 4) | 0xf)); ! 354: } ! 355: ! 356: bitmap=[[NXBitmapImageRep alloc] ! 357: initData:(unsigned char *)NULL ! 358: pixelsWide:(int)800 ! 359: pixelsHigh:(int)(313-29) ! 360: bitsPerSample:(int)4 ! 361: samplesPerPixel:(int)4 ! 362: hasAlpha:(BOOL)YES ! 363: isPlanar:(BOOL)NO ! 364: colorSpace:(NXColorSpace)NX_RGBColorSpace ! 365: bytesPerRow:(int)800*2 ! 366: bitsPerPixel:(int)16 ! 367: ]; ! 368: gfxvidinfo.pixbytes=2; ! 369: break; ! 370: } ! 371: case NX_EightBitGrayDepth: ! 372: { ! 373: for(i = 0; i < 4096; i++) ! 374: { ! 375: xcolors[i]= ( ((i & 0x0f00) >> 5)+ ! 376: ((i & 0x00f0) >>1 )+ ! 377: ((i & 0x000f) <<2)) ; ! 378: ! 379: if(xcolors[i]>255) ! 380: xcolors[i]=255; ! 381: } ! 382: ! 383: bitmap=[[NXBitmapImageRep alloc] ! 384: initData:(unsigned char *)NULL ! 385: pixelsWide:(int)800 ! 386: pixelsHigh:(int)(313-29) ! 387: bitsPerSample:(int)8 ! 388: samplesPerPixel:(int)1 ! 389: hasAlpha:(BOOL)NO ! 390: isPlanar:(BOOL)NO ! 391: colorSpace:(NXColorSpace)NX_OneIsWhiteColorSpace ! 392: bytesPerRow:(int)800 ! 393: bitsPerPixel:(int)8 ! 394: ]; ! 395: gfxvidinfo.pixbytes=1; ! 396: break; ! 397: } ! 398: case NX_TwoBitGrayDepth: ! 399: default: ! 400: { ! 401: for(i = 0; i < 4096; i++) ! 402: { ! 403: xcolors[i]= (((i & 0x0f00) >> (1+8))+ ! 404: ((i & 0x00f0) >> (1+4))+ ! 405: ((i & 0x000f) >> (2+0))) >> 2; ! 406: ! 407: if(xcolors[i]>3) ! 408: xcolors[i]=3; ! 409: ! 410: } ! 411: ! 412: bitmap=[[NXBitmapImageRep alloc] ! 413: initData:(unsigned char *)NULL ! 414: pixelsWide:(int)800 ! 415: pixelsHigh:(int)(313-29) ! 416: bitsPerSample:(int)2 ! 417: samplesPerPixel:(int)1 ! 418: hasAlpha:(BOOL)NO ! 419: isPlanar:(BOOL)NO ! 420: colorSpace:(NXColorSpace)NX_OneIsWhiteColorSpace ! 421: bytesPerRow:(int)800/4 ! 422: bitsPerPixel:(int)2 ! 423: ]; ! 424: gfxvidinfo.pixbytes=0; //bit of a hack!... ! 425: } ! 426: } ! 427: gfxvidinfo.rowbytes=[bitmap bytesPerRow]; ! 428: gfxvidinfo.bufmem=[bitmap data]; ! 429: gfxvidinfo.maxblocklines = 1000; /* whatever...??? */ ! 430: } ! 431: ! 432: ! 433: ! 434: void graphics_leave(void) ! 435: { ! 436: [bitmap free]; ! 437: [NXApp free]; ! 438: } ! 439: ! 440: ! 441: static int keycode2amiga(NXEvent * theEvent) ! 442: { ! 443: ! 444: if((theEvent->flags & NX_COMMANDMASK)) ! 445: { ! 446: switch ((char)(theEvent->data.key.charCode)) ! 447: { ! 448: case '1': commandKey = AK_F1; return AK_F1; ! 449: case '2': commandKey = AK_F2; return AK_F2; ! 450: case '3': commandKey = AK_F3; return AK_F3; ! 451: case '4': commandKey = AK_F4; return AK_F4; ! 452: case '5': commandKey = AK_F5; return AK_F5; ! 453: case '6': commandKey = AK_F6; return AK_F6; ! 454: case '7': commandKey = AK_F7; return AK_F7; ! 455: case '8': commandKey = AK_F8; return AK_F8; ! 456: case '9': commandKey = AK_F9; return AK_F9; ! 457: case '0': commandKey = AK_F10; return AK_F10; ! 458: default : return -1; //So not to generate stuck key. ! 459: } ! 460: } ! 461: ! 462: if ( theEvent->flags & NX_NUMERICPADMASK ) ! 463: { ! 464: ! 465: switch ((char)(theEvent->data.key.charCode)) { ! 466: case '0': return AK_NP0; ! 467: case '1': return fake_joystick?AK_LAMI:AK_NP1; ! 468: case '2': return AK_NP2; ! 469: case '3': return fake_joystick?AK_RAMI:AK_NP3; ! 470: case '4': return AK_NP4; ! 471: case '5': return AK_NP5; ! 472: case '6': return AK_NP6; ! 473: case '7': return AK_NP7; ! 474: case '8': return AK_NP8; ! 475: case '9': return AK_NP9; ! 476: } ! 477: } ! 478: ! 479: switch ((char)(theEvent->data.key.charCode)) { ! 480: case 'a': case 'A': return AK_A; ! 481: case 'B': case 'b': return AK_B; ! 482: case 'C': case 'c': return AK_C; ! 483: case 'D': case 'd': return AK_D; ! 484: case 'E': case 'e': return AK_E; ! 485: case 'F': case 'f': return AK_F; ! 486: case 'G': case 'g': return AK_G; ! 487: case 'H': case 'h': return AK_H; ! 488: case 'I': case 'i': return AK_I; ! 489: case 'J': case 'j': return AK_J; ! 490: case 'K': case 'k': return AK_K; ! 491: case 'L': case 'l': return AK_L; ! 492: case 'M': case 'm': return AK_M; ! 493: case 'N': case 'n': return AK_N; ! 494: case 'O': case 'o': return AK_O; ! 495: case 'P': case 'p': return AK_P; ! 496: case 'Q': case 'q': return AK_Q; ! 497: case 'R': case 'r': return AK_R; ! 498: case 'S': case 's': return AK_S; ! 499: case 'T': case 't': return AK_T; ! 500: case 'U': case 'u': return AK_U; ! 501: case 'V': case 'v': return AK_V; ! 502: case 'W': case 'w': return AK_W; ! 503: case 'X': case 'x': return AK_X; ! 504: case 'Y': case 'y': return AK_Y; ! 505: case 'Z': case 'z': return AK_Z; ! 506: ! 507: case '0':case ')': return AK_0; ! 508: case '1':case '!': return AK_1; ! 509: case '2':case '@': return AK_2; ! 510: case '3':case '#': return AK_3; ! 511: case '4':case '$': return AK_4; ! 512: case '5':case '%': return AK_5; ! 513: case '6':case '^': return AK_6; ! 514: case '7':case '&': return AK_7; ! 515: case '8':case '*': return AK_8; ! 516: case '9':case '(': return AK_9; ! 517: ! 518: ! 519: ! 520: case ';': case ':': return AK_SEMICOLON; ! 521: case '-': case '_': return AK_MINUS; ! 522: case '/': case '?': return AK_SLASH; ! 523: case '.': case '>': return AK_PERIOD; ! 524: case ',': case '<': return AK_COMMA; ! 525: case '=': case '+': return AK_EQUAL; ! 526: case '[': case '{': return AK_LBRACKET; ! 527: case ']': case '}': return AK_RBRACKET; ! 528: ! 529: ! 530: ! 531: case 127: return AK_BS; ! 532: case 9: return AK_TAB; ! 533: case 13: return AK_RET; ! 534: case 32: return AK_SPC; ! 535: case 27: return AK_ESC; ! 536: ! 537: case -83: return AK_UP; ! 538: case -81: return AK_DN; ! 539: case -84: return AK_LF; ! 540: case -82: return AK_RT; ! 541: ! 542: case '\\': return AK_BACKSLASH; ! 543: } ! 544: return -1; ! 545: } ! 546: ! 547: void handle_events(void) ! 548: { ! 549: NXEvent dummy; // used for throwaway checks ! 550: NXPoint mouseLoc; ! 551: ! 552: //Update Mouse Position ! 553: [[screen window] getMouseLocation:&mouseLoc]; ! 554: [screen convertPoint:&mouseLoc fromView:nil]; ! 555: lastmx=mouseLoc.x; ! 556: lastmy=(313-29)-mouseLoc.y; ! 557: ! 558: //COMMAND'd keypresses do not generate key ups! ! 559: //(at least not on my system - Black3.2) ! 560: //We therefore have to fake the key up... ! 561: if(commandKey != -1) ! 562: { ! 563: keystate[commandKey]=FALSE; ! 564: record_key ((commandKey << 1) | 1); ! 565: commandKey = -1; ! 566: } ! 567: ! 568: //Check for NeXT events, and run NXApp... ! 569: if([NXApp peekNextEvent: NX_ALLEVENTS into: &dummy]) ! 570: { ! 571: [NXApp perform:@selector(stop:) with:nil afterDelay:0.0 cancelPrevious:NO]; ! 572: [NXApp run]; ! 573: } ! 574: } ! 575: ! 576: BOOL debuggable(void) ! 577: { ! 578: return TRUE; ! 579: } ! 580: ! 581: BOOL needmousehack(void) ! 582: { ! 583: return TRUE; ! 584: } ! 585: ! 586: void LED(int on) ! 587: { ! 588: } ! 589: ! 590: ! 591: //Keep X gui happy! ! 592: ! 593: int gui_init(void) ! 594: { ! 595: } ! 596: ! 597: void gui_exit(void) ! 598: { ! 599: } ! 600: ! 601: void gui_led(int led, int on) ! 602: { ! 603: } ! 604: ! 605: void gui_filename(int num, char *name) ! 606: { ! 607: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.