|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * DOS GRX lib svga interface. ! 5: * ! 6: * (c) 1995 Bernd Schmidt ! 7: * (c) 1996 Gustavo Goedert ! 8: */ ! 9: ! 10: #include "sysconfig.h" ! 11: #include "sysdeps.h" ! 12: ! 13: #include <stdlib.h> ! 14: #include <string.h> ! 15: #include <stdio.h> ! 16: #include <assert.h> ! 17: #include <signal.h> ! 18: #include <unistd.h> ! 19: #include <grx20.h> ! 20: #include <pc.h> ! 21: #include <go32.h> ! 22: #include <dpmi.h> ! 23: #include <sys/nearptr.h> ! 24: #include <sys/exceptn.h> ! 25: #include <conio.h> ! 26: ! 27: #include "config.h" ! 28: #include "options.h" ! 29: #include "memory.h" ! 30: #include "custom.h" ! 31: #include "newcpu.h" ! 32: #include "keyboard.h" ! 33: #include "xwin.h" ! 34: #include "keybuf.h" ! 35: #include "disk.h" ! 36: ! 37: int CorrectAspectRatio = 0; ! 38: ! 39: void my_kbd_handler(void); ! 40: void my_mouse_handler(_go32_dpmi_registers *mouse_regs); ! 41: void HandleDisk(int num); ! 42: ! 43: extern struct _GR_driverInfo _GrDriverInfo; ! 44: extern struct _GR_contextInfo _GrContextInfo; ! 45: ! 46: #define BANKPOS(offs) ((unsigned short)(offs)) ! 47: #define BANKNUM(offs) (((unsigned short *)(&(offs)))[1]) ! 48: #define BANKLFT(offs) (0x10000 - BANKPOS(offs)) ! 49: ! 50: /* dummie Amiga Keys */ ! 51: #define AK_EjectDisk 0xfe ! 52: #define AK_ChangeDisk 0xff ! 53: ! 54: /* Command Flags */ ! 55: #define ResetCPU 0x001 ! 56: #define EjectDisk0 0x002 ! 57: #define EjectDisk1 0x004 ! 58: #define EjectDisk2 0x008 ! 59: #define EjectDisk3 0x010 ! 60: #define ChangeDisk0 0x020 ! 61: #define ChangeDisk1 0x040 ! 62: #define ChangeDisk2 0x080 ! 63: #define ChangeDisk3 0x100 ! 64: ! 65: /* PC Keys */ ! 66: #define SCODE_CURSORBLOCKUP 103 /* Cursor key block. */ ! 67: #define SCODE_CURSORBLOCKLEFT 105 ! 68: #define SCODE_CURSORBLOCKRIGHT 106 ! 69: #define SCODE_CURSORBLOCKDOWN 108 ! 70: ! 71: #define SCODE_INSERT 110 ! 72: #define SCODE_HOME 102 ! 73: #define SCODE_PGUP 104 ! 74: #define SCODE_DELETE 111 ! 75: #define SCODE_END 107 ! 76: #define SCODE_PGDN 109 ! 77: ! 78: #define SCODE_KEYPAD0 82 ! 79: #define SCODE_KEYPAD1 79 ! 80: #define SCODE_KEYPAD2 80 ! 81: #define SCODE_KEYPAD3 81 ! 82: #define SCODE_KEYPAD4 75 ! 83: #define SCODE_KEYPAD5 76 ! 84: #define SCODE_KEYPAD6 77 ! 85: #define SCODE_KEYPAD7 71 ! 86: #define SCODE_KEYPAD8 72 ! 87: #define SCODE_KEYPAD9 73 ! 88: #define SCODE_KEYPADENTER 96 ! 89: #define SCODE_KEYPADPLUS 78 ! 90: #define SCODE_KEYPADMINUS 74 ! 91: ! 92: #define SCODE_Q 16 ! 93: #define SCODE_W 17 ! 94: #define SCODE_E 18 ! 95: #define SCODE_R 19 ! 96: #define SCODE_T 20 ! 97: #define SCODE_Y 21 ! 98: #define SCODE_U 22 ! 99: #define SCODE_I 23 ! 100: #define SCODE_O 24 ! 101: #define SCODE_P 25 ! 102: ! 103: #define SCODE_A 30 ! 104: #define SCODE_S 31 ! 105: #define SCODE_D 32 ! 106: #define SCODE_F 33 ! 107: #define SCODE_G 34 ! 108: #define SCODE_H 35 ! 109: #define SCODE_J 36 ! 110: #define SCODE_K 37 ! 111: #define SCODE_L 38 ! 112: ! 113: #define SCODE_Z 44 ! 114: #define SCODE_X 45 ! 115: #define SCODE_C 46 ! 116: #define SCODE_V 47 ! 117: #define SCODE_B 48 ! 118: #define SCODE_N 49 ! 119: #define SCODE_M 50 ! 120: ! 121: #define SCODE_ESCAPE 1 ! 122: #define SCODE_ENTER 28 ! 123: #define SCODE_RIGHTCONTROL 97 ! 124: #define SCODE_CONTROL 97 ! 125: #define SCODE_RIGHTALT 100 ! 126: #define SCODE_LEFTCONTROL 29 ! 127: #define SCODE_LEFTALT 56 ! 128: #define SCODE_SPACE 57 ! 129: ! 130: #define SCODE_F1 59 ! 131: #define SCODE_F2 60 ! 132: #define SCODE_F3 61 ! 133: #define SCODE_F4 62 ! 134: #define SCODE_F5 63 ! 135: #define SCODE_F6 64 ! 136: #define SCODE_F7 65 ! 137: #define SCODE_F8 66 ! 138: #define SCODE_F9 67 ! 139: #define SCODE_F10 68 ! 140: ! 141: #define KEY_EVENTRELEASE 0 ! 142: #define KEY_EVENTPRESS 1 ! 143: ! 144: #define SCODE_0 11 ! 145: #define SCODE_1 2 ! 146: #define SCODE_2 3 ! 147: #define SCODE_3 4 ! 148: #define SCODE_4 5 ! 149: #define SCODE_5 6 ! 150: #define SCODE_6 7 ! 151: #define SCODE_7 8 ! 152: #define SCODE_8 9 ! 153: #define SCODE_9 10 ! 154: ! 155: #define SCODE_LEFTSHIFT 42 ! 156: #define SCODE_RIGHTSHIFT 54 ! 157: #define SCODE_TAB 15 ! 158: ! 159: #define SCODE_F11 87 ! 160: #define SCODE_F12 88 ! 161: #define SCODE_NEXT 81 ! 162: #define SCODE_PRIOR 73 ! 163: #define SCODE_BS 14 ! 164: /* ! 165: #define SCODE_asciicircum 1 ! 166: */ ! 167: #define SCODE_bracketleft 26 ! 168: #define SCODE_bracketright 27 ! 169: #define SCODE_comma 51 ! 170: #define SCODE_period 52 ! 171: #define SCODE_slash 53 ! 172: #define SCODE_semicolon 39 ! 173: #define SCODE_grave 40 ! 174: #define SCODE_minus 12 ! 175: #define SCODE_equal 13 ! 176: #define SCODE_numbersign 41 ! 177: #define SCODE_ltgt 43 ! 178: #define SCODE_scrolllock 70 ! 179: ! 180: #define SCODE_LWIN95 125 ! 181: #define SCODE_RWIN95 126 ! 182: #define SCODE_MWIN95 127 ! 183: ! 184: #define SCODE_Caps_Lock 58 ! 185: ! 186: static unsigned char escape_keys[128] = { ! 187: 0, 0, 0, 0, ! 188: 0, 0, 0, 0, ! 189: 0, 0, 0, 0, ! 190: 0, 0, 0, 0, ! 191: 0, 0, 0, 0, ! 192: 0, 0, 0, 0, ! 193: 0, 0, 0, 0, ! 194: SCODE_KEYPADENTER, SCODE_RIGHTCONTROL, 0, 0, ! 195: 0, 0, 0, 0, ! 196: 0, 0, 0, 0, ! 197: 0, 0, 0, 0, ! 198: 0, 0, 0, 0, ! 199: 0, 0, 0, 0, ! 200: 0, 0, 0, 0, ! 201: 0, 0, 0, 0, ! 202: 0, 0, 0, 0, ! 203: 0, 0, 0, 0, ! 204: 0, 0, 0, SCODE_HOME, ! 205: SCODE_CURSORBLOCKUP, SCODE_PGUP, 0, SCODE_CURSORBLOCKLEFT, ! 206: 0, SCODE_CURSORBLOCKRIGHT, 0, SCODE_END, ! 207: SCODE_CURSORBLOCKDOWN,SCODE_PGDN, SCODE_INSERT, SCODE_DELETE, ! 208: 0, 0, 0, 0, ! 209: 0, 0, 0, SCODE_LWIN95, ! 210: SCODE_RWIN95, SCODE_MWIN95, 0, 0, ! 211: 0, 0, 0, 0, ! 212: 0, 0, 0, 0, ! 213: 0, 0, 0, 0, ! 214: 0, 0, 0, 0, ! 215: 0, 0, 0, 0, ! 216: 0, 0, 0, 0, ! 217: 0, 0, 0, 0, ! 218: 0, 0, 0, 0 ! 219: }; ! 220: ! 221: static int vsize; ! 222: static int linebytes; ! 223: static int screenheight; ! 224: static int screencolors; ! 225: static int use_fastline; ! 226: static int CommandFlags = 0; ! 227: ! 228: xcolnr xcolors[4096]; ! 229: ! 230: struct vidbuf_description gfxvidinfo; ! 231: ! 232: void flush_line(int y) ! 233: { ! 234: static char *addr, *ptr; ! 235: int target_y = y, target_x; ! 236: long offs; ! 237: int page, left; ! 238: ! 239: addr = gfxvidinfo.bufmem + y*gfxvidinfo.rowbytes; ! 240: switch (screen_res) { ! 241: case 0: ! 242: if (CorrectAspectRatio) { ! 243: if (target_y%3==0) ! 244: return; ! 245: target_y=(target_y<<1)/3+5; ! 246: } else ! 247: target_y -= 8; ! 248: addr += gfxvidinfo.pixbytes * (prev_max_diwstop - 328); ! 249: break; ! 250: case 1: ! 251: if (CorrectAspectRatio) { ! 252: if (target_y%5==0) ! 253: return; ! 254: target_y=(target_y<<2)/5+6; ! 255: } else ! 256: target_y -= 8; ! 257: addr += prev_max_diwstop - 328; ! 258: target_y -= 8; ! 259: break; ! 260: case 2: ! 261: if (CorrectAspectRatio) { ! 262: if (target_y%3==0) ! 263: return; ! 264: target_y=(target_y<<1)/3+10; ! 265: } else ! 266: target_y += 57; ! 267: addr += prev_max_diwstop - 328; ! 268: break; ! 269: case 3: ! 270: if (CorrectAspectRatio) { ! 271: if (target_y%5==0) ! 272: return; ! 273: target_y=(target_y<<2)/5+12; ! 274: } else ! 275: target_y += 97; ! 276: addr += gfxvidinfo.pixbytes * (prev_max_diwstop - 656); ! 277: break; ! 278: case 4: ! 279: if (CorrectAspectRatio) ! 280: target_y += 15; ! 281: else ! 282: target_y += 157; ! 283: break; ! 284: } ! 285: if (target_y < screenheight && target_y >= 0) { ! 286: if(use_fastline) { ! 287: offs = target_y * _GrContextInfo.current.gc_lineoffset; ! 288: ptr = &_GrContextInfo.current.gc_baseaddr[0][BANKPOS(offs)]; ! 289: page = BANKNUM(offs); ! 290: left = BANKLFT(offs); ! 291: if (page != _GrDriverInfo.curbank) { ! 292: _GrDriverInfo.curbank = page; ! 293: (*_GrDriverInfo.setbank)(page); ! 294: } ! 295: if (left >= linebytes) ! 296: asm (" ! 297: push %%es ! 298: cld ! 299: movw %0, %%es ! 300: shrl $2, %%ecx ! 301: rep ! 302: movsl ! 303: pop %%es ! 304: " ! 305: : ! 306: : "g" (_GrContextInfo.current.gc_selector), ! 307: "S" (addr), "D" (ptr), "c" (linebytes) ! 308: : "%esi", "%edi", "%ecx", "cc" ! 309: ); ! 310: else { ! 311: asm (" ! 312: push %%es ! 313: cld ! 314: movw %1, %%es ! 315: shrl $2, %%ecx ! 316: rep ! 317: movsl ! 318: pop %%es ! 319: " ! 320: : "=D" (ptr) ! 321: : "g" (_GrContextInfo.current.gc_selector), ! 322: "S" (addr), "0" (ptr), "c" (left) ! 323: : "%esi", "%edi", "%ecx", "cc" ! 324: ); ! 325: ptr = ptr - 0x10000; ! 326: _GrDriverInfo.curbank = page + 1; ! 327: (*_GrDriverInfo.setbank)(_GrDriverInfo.curbank); ! 328: asm (" ! 329: push %%es ! 330: cld ! 331: movw %0, %%es ! 332: addl %1, %%esi ! 333: subl %1, %%ecx ! 334: shrl $2, %%ecx ! 335: rep ! 336: movsl ! 337: pop %%es ! 338: " ! 339: : ! 340: : "g" (_GrContextInfo.current.gc_selector), "g" (left), ! 341: "S" (addr), "D" (ptr), "c" (linebytes) ! 342: : "%esi", "%edi", "%ecx", "cc" ! 343: ); ! 344: } ! 345: } else { ! 346: for (target_x=0; target_x<320; target_x++, addr++) ! 347: (*GrCurrentFrameDriver()->drawpixel)(target_x, target_y, *addr); ! 348: } ! 349: } ! 350: } ! 351: ! 352: void flush_block(int a, int b) ! 353: { ! 354: abort(); ! 355: } ! 356: ! 357: void flush_screen(int a, int b) ! 358: { ! 359: } ! 360: ! 361: static int colors_allocated; ! 362: ! 363: static int get_color(int r, int g, int b, xcolnr *cnp) ! 364: { ! 365: if (colors_allocated == 256) ! 366: return -1; ! 367: *cnp = colors_allocated; ! 368: GrSetColor(colors_allocated, doMask(r, 8, 0), doMask(g, 8, 0), doMask(b, 8, 0)); ! 369: colors_allocated++; ! 370: return 1; ! 371: } ! 372: ! 373: static void init_colors(void) ! 374: { ! 375: int rw = 5, gw = 5, bw = 5; ! 376: colors_allocated = 0; ! 377: if (color_mode == 2) gw = 6; ! 378: ! 379: if (gfxvidinfo.pixbytes == 2) ! 380: alloc_colors64k(rw, gw, bw, gw+bw, bw, 0); ! 381: else ! 382: alloc_colors256(get_color); ! 383: } ! 384: ! 385: int buttonstate[3] = { 0, 0, 0 }; ! 386: int lastmx, lastmy; ! 387: int newmousecounters = 0; ! 388: ! 389: static int keystate[256]; ! 390: static int ledsstate; ! 391: ! 392: static int scancode2amiga(int scancode) ! 393: { ! 394: switch(scancode) { ! 395: case SCODE_A: return AK_A; ! 396: case SCODE_B: return AK_B; ! 397: case SCODE_C: return AK_C; ! 398: case SCODE_D: return AK_D; ! 399: case SCODE_E: return AK_E; ! 400: case SCODE_F: return AK_F; ! 401: case SCODE_G: return AK_G; ! 402: case SCODE_H: return AK_H; ! 403: case SCODE_I: return AK_I; ! 404: case SCODE_J: return AK_J; ! 405: case SCODE_K: return AK_K; ! 406: case SCODE_L: return AK_L; ! 407: case SCODE_M: return AK_M; ! 408: case SCODE_N: return AK_N; ! 409: case SCODE_O: return AK_O; ! 410: case SCODE_P: return AK_P; ! 411: case SCODE_Q: return AK_Q; ! 412: case SCODE_R: return AK_R; ! 413: case SCODE_S: return AK_S; ! 414: case SCODE_T: return AK_T; ! 415: case SCODE_U: return AK_U; ! 416: case SCODE_V: return AK_V; ! 417: case SCODE_W: return AK_W; ! 418: case SCODE_X: return AK_X; ! 419: case SCODE_Y: return AK_Y; ! 420: case SCODE_Z: return AK_Z; ! 421: ! 422: case SCODE_0: return AK_0; ! 423: case SCODE_1: return AK_1; ! 424: case SCODE_2: return AK_2; ! 425: case SCODE_3: return AK_3; ! 426: case SCODE_4: return AK_4; ! 427: case SCODE_5: return AK_5; ! 428: case SCODE_6: return AK_6; ! 429: case SCODE_7: return AK_7; ! 430: case SCODE_8: return AK_8; ! 431: case SCODE_9: return AK_9; ! 432: ! 433: case SCODE_KEYPAD0: return AK_NP0; ! 434: case SCODE_KEYPAD1: return AK_NP1; ! 435: case SCODE_KEYPAD2: return AK_NP2; ! 436: case SCODE_KEYPAD3: return AK_NP3; ! 437: case SCODE_KEYPAD4: return AK_NP4; ! 438: case SCODE_KEYPAD5: return AK_NP5; ! 439: case SCODE_KEYPAD6: return AK_NP6; ! 440: case SCODE_KEYPAD7: return AK_NP7; ! 441: case SCODE_KEYPAD8: return AK_NP8; ! 442: case SCODE_KEYPAD9: return AK_NP9; ! 443: ! 444: case SCODE_F1: return AK_F1; ! 445: case SCODE_F2: return AK_F2; ! 446: case SCODE_F3: return AK_F3; ! 447: case SCODE_F4: return AK_F4; ! 448: case SCODE_F5: return AK_F5; ! 449: case SCODE_F6: return AK_F6; ! 450: case SCODE_F7: return AK_F7; ! 451: case SCODE_F8: return AK_F8; ! 452: case SCODE_F9: return AK_F9; ! 453: case SCODE_F10: return AK_F10; ! 454: ! 455: case SCODE_BS: return AK_BS; ! 456: case SCODE_LEFTCONTROL: return AK_CTRL; ! 457: case SCODE_RIGHTCONTROL: return AK_CTRL; ! 458: case SCODE_TAB: return AK_TAB; ! 459: case SCODE_LEFTALT: return AK_LALT; ! 460: case SCODE_RIGHTALT: return AK_RALT; ! 461: case SCODE_ENTER: return AK_RET; ! 462: case SCODE_SPACE: return AK_SPC; ! 463: case SCODE_LEFTSHIFT: return AK_LSH; ! 464: case SCODE_RIGHTSHIFT: return AK_RSH; ! 465: case SCODE_ESCAPE: return AK_ESC; ! 466: ! 467: case SCODE_INSERT: break; ! 468: /* case SCODE_END: ! 469: case SCODE_HOME: break;*/ ! 470: ! 471: case SCODE_DELETE: return AK_DEL; ! 472: case SCODE_CURSORBLOCKUP: return AK_UP; ! 473: case SCODE_CURSORBLOCKDOWN: return AK_DN; ! 474: case SCODE_CURSORBLOCKLEFT: return AK_LF; ! 475: case SCODE_CURSORBLOCKRIGHT: return AK_RT; ! 476: ! 477: case SCODE_F11: return AK_BACKSLASH; ! 478: /* ! 479: case SCODE_asciicircum: return AK_00; ! 480: */ ! 481: case SCODE_bracketleft: return AK_LBRACKET; ! 482: case SCODE_bracketright: return AK_RBRACKET; ! 483: case SCODE_comma: return AK_COMMA; ! 484: case SCODE_period: return AK_PERIOD; ! 485: case SCODE_slash: return AK_SLASH; ! 486: case SCODE_semicolon: return AK_SEMICOLON; ! 487: case SCODE_grave: return AK_QUOTE; ! 488: case SCODE_minus: return AK_MINUS; ! 489: case SCODE_equal: return AK_EQUAL; ! 490: ! 491: /* This one turns off screen updates. */ ! 492: case SCODE_scrolllock: return AK_inhibit; ! 493: ! 494: case SCODE_PGUP: case SCODE_RWIN95: return AK_RAMI; ! 495: case SCODE_PGDN: case SCODE_LWIN95: return AK_LAMI; ! 496: ! 497: /*#ifdef KBD_LANG_DE*/ ! 498: case SCODE_numbersign: return AK_NUMBERSIGN; ! 499: case SCODE_ltgt: return AK_LTGT; ! 500: /*#endif*/ ! 501: case SCODE_END: return AK_EjectDisk; ! 502: case SCODE_HOME: return AK_ChangeDisk; ! 503: } ! 504: return -1; ! 505: } ! 506: ! 507: void my_kbd_handler(void) ! 508: { ! 509: static is_escape = 0; ! 510: int scancode, newstate, akey; ! 511: scancode = inportb(0x60); ! 512: if (scancode == 0xe0) { ! 513: is_escape = 1; ! 514: outportb(0x20, 0x20); ! 515: return; ! 516: } ! 517: newstate = !(scancode & 0x80); ! 518: scancode = scancode & 0x7f; ! 519: if (is_escape) { ! 520: scancode = escape_keys[scancode]; ! 521: is_escape = 0; ! 522: } ! 523: outportb(0x20, 0x20); ! 524: ! 525: akey = scancode2amiga(scancode); ! 526: if (scancode == SCODE_Caps_Lock) { ! 527: if (newstate == KEY_EVENTPRESS) { ! 528: akey = AK_CAPSLOCK; ! 529: newstate = !keystate[akey]; ! 530: } else ! 531: return; ! 532: } ! 533: if (scancode == SCODE_F12) ! 534: specialflags |= SPCFLAG_BRK; ! 535: ! 536: if (akey == -1) ! 537: return; ! 538: if (akey <= 0xFF) { ! 539: if (keystate[akey] == newstate) ! 540: return; ! 541: keystate[akey] = newstate; ! 542: } ! 543: ! 544: if ((akey != AK_EjectDisk) && (akey != AK_ChangeDisk)) { ! 545: if (newstate == KEY_EVENTPRESS) { ! 546: if (akey == AK_inhibit) ! 547: inhibit_frame ^= 1; ! 548: else ! 549: record_key (akey << 1); ! 550: } else ! 551: record_key ((akey << 1) | 1); ! 552: } ! 553: ! 554: /* "Affengriff" */ ! 555: if (keystate[AK_CTRL] && keystate[AK_LAMI] && keystate[AK_RAMI]) ! 556: CommandFlags |= ResetCPU; ! 557: if (keystate[AK_EjectDisk]) { ! 558: if (keystate[AK_F1]) ! 559: CommandFlags |= EjectDisk0; ! 560: if (keystate[AK_F2]) ! 561: CommandFlags |= EjectDisk1; ! 562: if (keystate[AK_F3]) ! 563: CommandFlags |= EjectDisk2; ! 564: if (keystate[AK_F4]) ! 565: CommandFlags |= EjectDisk3; ! 566: } ! 567: if (keystate[AK_ChangeDisk]) { ! 568: if (keystate[AK_F1]) ! 569: CommandFlags |= ChangeDisk0; ! 570: if (keystate[AK_F2]) ! 571: CommandFlags |= ChangeDisk1; ! 572: if (keystate[AK_F3]) ! 573: CommandFlags |= ChangeDisk2; ! 574: if (keystate[AK_F4]) ! 575: CommandFlags |= ChangeDisk3; ! 576: } ! 577: } ! 578: ! 579: void my_mouse_handler(_go32_dpmi_registers *mouse_regs) ! 580: { ! 581: lastmx = (short)mouse_regs->x.si; ! 582: lastmy = (short)mouse_regs->x.di; ! 583: buttonstate[0] = mouse_regs->x.bx & 1; ! 584: buttonstate[1] = mouse_regs->x.bx & 4; ! 585: buttonstate[2] = mouse_regs->x.bx & 2; ! 586: } ! 587: ! 588: _go32_dpmi_seginfo old_kbd_handler, new_kbd_handler, mouse_handler; ! 589: _go32_dpmi_registers mouse_callback_regs; ! 590: ! 591: int graphics_init(void) ! 592: { ! 593: int i; ! 594: GrFrameMode fm; ! 595: const GrVideoMode *mp; ! 596: int found_mode = 0; ! 597: int gw, gh, gc, gbpp; ! 598: _go32_dpmi_registers regs; ! 599: ! 600: remove("uae.log"); ! 601: _go32_want_ctrl_break(1); ! 602: __djgpp_set_ctrl_c(0); ! 603: ! 604: if(ersatzkickfile && disk_empty(0)) { ! 605: fprintf (stderr, "No KickStart and no bootdisk, giving up.\n"); ! 606: return 0; ! 607: } ! 608: ! 609: _go32_dpmi_get_protected_mode_interrupt_vector(9, &old_kbd_handler); ! 610: new_kbd_handler.pm_offset = (int)my_kbd_handler; ! 611: if (_go32_dpmi_allocate_iret_wrapper(&new_kbd_handler) != 0) { ! 612: fprintf (stderr, "Can't allocate keyboard iret_wrapper.\n"); ! 613: return 0; ! 614: } ! 615: if (_go32_dpmi_set_protected_mode_interrupt_vector(9, &new_kbd_handler) != 0) { ! 616: fprintf (stderr, "Can't set protected mode interrupt vector.\n"); ! 617: return 0; ! 618: } ! 619: ! 620: regs.x.ax=0; ! 621: regs.x.ss=regs.x.sp=regs.x.flags=0; ! 622: _go32_dpmi_simulate_int(0x33, ®s); ! 623: if (regs.x.ax==0) { ! 624: fprintf (stderr, "Mouse driver not present.\n"); ! 625: return 0; ! 626: } ! 627: mouse_handler.pm_offset = (int)my_mouse_handler; ! 628: if (_go32_dpmi_allocate_real_mode_callback_retf(&mouse_handler, &mouse_callback_regs) != 0) { ! 629: fprintf (stderr, "Can't allocate mouse callback_retf.\n"); ! 630: return 0; ! 631: } ! 632: regs.x.ax=0xc; ! 633: regs.x.cx=0x7f; ! 634: regs.x.es=mouse_handler.rm_segment; ! 635: regs.x.dx=mouse_handler.rm_offset; ! 636: regs.x.ss=regs.x.sp=regs.x.flags=0; ! 637: _go32_dpmi_simulate_int(0x33, ®s); ! 638: ! 639: switch (screen_res) { ! 640: case 0: gw=320; gh=200; use_fastline=1; break; ! 641: case 1: gw=320; gh=240; use_fastline=0; break; ! 642: case 2: gw=320; gh=400; use_fastline=0; break; ! 643: case 3: gw=640; gh=480; use_fastline=1; break; ! 644: case 4: gw=800; gh=600; use_fastline=1; break; ! 645: default: ! 646: fprintf(stderr, "Invalid screen mode.\n"); ! 647: return 0; ! 648: } ! 649: if (CorrectAspectRatio && (screen_res>1)) ! 650: dont_want_aspect=0; ! 651: else ! 652: dont_want_aspect=1; ! 653: switch (color_mode) { ! 654: case 0: gc=256; gbpp=8; break; ! 655: case 1: gc=32768; gbpp=16; break; ! 656: case 2: gc=65536; gbpp=16; break; ! 657: default: ! 658: fprintf(stderr, "Invalid color mode.\n"); ! 659: return 0; ! 660: } ! 661: GrSetDriver(NULL); ! 662: if (GrCurrentVideoDriver() == NULL) { ! 663: _GrDriverInfo.vdriver = NULL; ! 664: fprintf(stderr, "Graphics adapter not supported.\n"); ! 665: return 0; ! 666: } ! 667: for (fm = GR_frameHERC1; (fm <= GR_frameSVGA32H) && (!found_mode); fm++) { ! 668: for (mp = GrFirstVideoMode(fm); mp && (!found_mode); mp = GrNextVideoMode(mp)) { ! 669: if (gw==mp->width && gh==mp->height && gbpp==mp->bpp) ! 670: found_mode = 1; ! 671: } ! 672: } ! 673: if (!found_mode) { ! 674: _GrDriverInfo.vdriver = NULL; ! 675: fprintf(stderr, "Sorry, this combination of color and video mode is not available.\n"); ! 676: return 0; ! 677: } ! 678: if (GrSetMode(GR_width_height_color_graphics, gw, gh, gc) == 0) { ! 679: _GrDriverInfo.vdriver = NULL; ! 680: fprintf(stderr, "Graphics inicialization error.\n"); ! 681: return 0; ! 682: } ! 683: freopen("UAE.LOG", "w", stderr); ! 684: ! 685: gfxvidinfo.pixbytes = (gbpp >> 3); ! 686: vsize = dont_want_aspect ? numscrlines : 2*numscrlines; ! 687: gfxvidinfo.maxblocklines = 0; ! 688: gfxvidinfo.rowbytes = 800 * gfxvidinfo.pixbytes; ! 689: gfxvidinfo.bufmem = malloc(gfxvidinfo.rowbytes * vsize); ! 690: memset(gfxvidinfo.bufmem, 0, gfxvidinfo.rowbytes * vsize); ! 691: ! 692: linebytes = gw * gfxvidinfo.pixbytes; ! 693: screenheight = gh; ! 694: screencolors = gc; ! 695: ! 696: init_colors(); ! 697: ! 698: buttonstate[0] = buttonstate[1] = buttonstate[2] = 0; ! 699: for(i = 0; i < 256; i++) ! 700: keystate[i] = 0; ! 701: ! 702: lastmx = lastmy = 0; ! 703: newmousecounters = 0; ! 704: ! 705: return 1; ! 706: } ! 707: ! 708: void graphics_leave(void) ! 709: { ! 710: _go32_dpmi_registers regs; ! 711: ! 712: if (_GrDriverInfo.vdriver) { ! 713: _GrDriverInfo.vdriver->reset(); ! 714: _GrDriverInfo.vdriver = NULL; ! 715: } ! 716: freopen("CON", "w", stderr); ! 717: _go32_dpmi_set_protected_mode_interrupt_vector(9, &old_kbd_handler); ! 718: _go32_dpmi_free_iret_wrapper(&new_kbd_handler); ! 719: regs.x.ax=0xc; ! 720: regs.x.cx=0x0; ! 721: regs.x.ss=regs.x.sp=regs.x.flags=0; ! 722: _go32_dpmi_simulate_int(0x33, ®s); ! 723: _go32_dpmi_free_real_mode_callback(&mouse_handler); ! 724: } ! 725: ! 726: void handle_events(void) ! 727: { ! 728: if (CommandFlags) { ! 729: if (CommandFlags & ResetCPU) { ! 730: MC68000_reset(); ! 731: CommandFlags &= ~ResetCPU; ! 732: } ! 733: if (CommandFlags & EjectDisk0) { ! 734: disk_eject(0); ! 735: CommandFlags &= ~EjectDisk0; ! 736: } ! 737: if (CommandFlags & EjectDisk1) { ! 738: disk_eject(1); ! 739: CommandFlags &= ~EjectDisk1; ! 740: } ! 741: if (CommandFlags & EjectDisk2) { ! 742: disk_eject(2); ! 743: CommandFlags &= ~EjectDisk2; ! 744: } ! 745: if (CommandFlags & EjectDisk3) { ! 746: disk_eject(3); ! 747: CommandFlags &= ~EjectDisk3; ! 748: } ! 749: if (CommandFlags & ChangeDisk0) { ! 750: HandleDisk(0); ! 751: keystate[AK_ChangeDisk] = 0; ! 752: keystate[AK_F1] = 0; ! 753: record_key ((AK_F1 << 1) | 1); ! 754: CommandFlags &= ~ChangeDisk0; ! 755: } ! 756: if (CommandFlags & ChangeDisk1) { ! 757: HandleDisk(1); ! 758: keystate[AK_ChangeDisk] = 0; ! 759: keystate[AK_F2] = 0; ! 760: record_key ((AK_F2 << 1) | 1); ! 761: CommandFlags &= ~ChangeDisk1; ! 762: } ! 763: if (CommandFlags & ChangeDisk2) { ! 764: HandleDisk(2); ! 765: keystate[AK_ChangeDisk] = 0; ! 766: keystate[AK_F3] = 0; ! 767: record_key ((AK_F3 << 1) | 1); ! 768: CommandFlags &= ~ChangeDisk2; ! 769: } ! 770: if (CommandFlags & ChangeDisk3) { ! 771: HandleDisk(3); ! 772: keystate[AK_ChangeDisk] = 0; ! 773: keystate[AK_F4] = 0; ! 774: record_key ((AK_F4 << 1) | 1); ! 775: CommandFlags &= ~ChangeDisk3; ! 776: } ! 777: } ! 778: } ! 779: ! 780: int debuggable(void) ! 781: { ! 782: return 0; ! 783: } ! 784: ! 785: int needmousehack(void) ! 786: { ! 787: return 0; ! 788: } ! 789: ! 790: void LED(int on) ! 791: { ! 792: } ! 793: ! 794: void HandleDisk(int num) { ! 795: int i; ! 796: char buf[256]; ! 797: _go32_dpmi_set_protected_mode_interrupt_vector(9, &old_kbd_handler); ! 798: GrSetMode(GR_80_25_text); ! 799: switch(num) { ! 800: case 0: ! 801: puts("Enter filename for drive DF0:"); ! 802: break; ! 803: case 1: ! 804: puts("Enter filename for drive DF1:"); ! 805: break; ! 806: case 2: ! 807: puts("Enter filename for drive DF2:"); ! 808: break; ! 809: case 3: ! 810: puts("Enter filename for drive DF3:"); ! 811: break; ! 812: } ! 813: gets(buf); ! 814: disk_insert(num, buf); ! 815: _go32_dpmi_set_protected_mode_interrupt_vector(9, &new_kbd_handler); ! 816: /* Restore screen */ ! 817: GrSetMode(GR_width_height_color_graphics, linebytes / gfxvidinfo.pixbytes, screenheight, screencolors); ! 818: if (gfxvidinfo.pixbytes == 1) { ! 819: colors_allocated = 0; ! 820: alloc_colors256(get_color); ! 821: } ! 822: for(i=0; i<vsize; i++) ! 823: flush_line(i); ! 824: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.