|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * SVGAlib interface.
5: *
6: * (c) 1995 Bernd Schmidt
7: */
8:
1.1.1.2 ! root 9: #include "sysconfig.h"
! 10: #include "sysdeps.h"
! 11:
1.1 root 12: #include <assert.h>
13: #include <signal.h>
14: #include <vga.h>
15: #include <vgamouse.h>
16: #include <vgakeyboard.h>
17:
18: #include "config.h"
19: #include "options.h"
20: #include "memory.h"
21: #include "custom.h"
22: #include "newcpu.h"
23: #include "keyboard.h"
24: #include "xwin.h"
25: #include "keybuf.h"
26:
1.1.1.2 ! root 27: #define SCODE_CURSORBLOCKUP 103 /* Cursor key block. */
! 28: #define SCODE_CURSORBLOCKLEFT 105
! 29: #define SCODE_CURSORBLOCKRIGHT 106
! 30: #define SCODE_CURSORBLOCKDOWN 108
! 31:
! 32: #define SCODE_INSERT 110
! 33: #define SCODE_HOME 102
! 34: #define SCODE_PGUP 104
! 35: #define SCODE_DELETE 111
! 36: #define SCODE_END 107
! 37: #define SCODE_PGDN 109
! 38:
! 39: #define SCODE_KEYPAD0 82
! 40: #define SCODE_KEYPAD1 79
! 41: #define SCODE_KEYPAD2 80
! 42: #define SCODE_KEYPAD3 81
! 43: #define SCODE_KEYPAD4 75
! 44: #define SCODE_KEYPAD5 76
! 45: #define SCODE_KEYPAD6 77
! 46: #define SCODE_KEYPAD7 71
! 47: #define SCODE_KEYPAD8 72
! 48: #define SCODE_KEYPAD9 73
! 49: #define SCODE_KEYPADENTER 96
! 50: #define SCODE_KEYPADPLUS 78
! 51: #define SCODE_KEYPADMINUS 74
! 52:
! 53: #define SCODE_Q 16
! 54: #define SCODE_W 17
! 55: #define SCODE_E 18
! 56: #define SCODE_R 19
! 57: #define SCODE_T 20
! 58: #define SCODE_Y 21
! 59: #define SCODE_U 22
! 60: #define SCODE_I 23
! 61: #define SCODE_O 24
! 62: #define SCODE_P 25
! 63:
! 64: #define SCODE_A 30
! 65: #define SCODE_S 31
! 66: #define SCODE_D 32
! 67: #define SCODE_F 33
! 68: #define SCODE_G 34
! 69: #define SCODE_H 35
! 70: #define SCODE_J 36
! 71: #define SCODE_K 37
! 72: #define SCODE_L 38
! 73:
! 74: #define SCODE_Z 44
! 75: #define SCODE_X 45
! 76: #define SCODE_C 46
! 77: #define SCODE_V 47
! 78: #define SCODE_B 48
! 79: #define SCODE_N 49
! 80: #define SCODE_M 50
! 81:
! 82: #define SCODE_ESCAPE 1
! 83: #define SCODE_ENTER 28
! 84: #define SCODE_RIGHTCONTROL 97
! 85: #define SCODE_CONTROL 97
! 86: #define SCODE_RIGHTALT 100
! 87: #define SCODE_LEFTCONTROL 29
! 88: #define SCODE_LEFTALT 56
! 89: #define SCODE_SPACE 57
! 90:
! 91: #define SCODE_F1 59
! 92: #define SCODE_F2 60
! 93: #define SCODE_F3 61
! 94: #define SCODE_F4 62
! 95: #define SCODE_F5 63
! 96: #define SCODE_F6 64
! 97: #define SCODE_F7 65
! 98: #define SCODE_F8 66
! 99: #define SCODE_F9 67
! 100: #define SCODE_F10 68
! 101:
! 102: #define SCODE_0 11
! 103: #define SCODE_1 2
! 104: #define SCODE_2 3
! 105: #define SCODE_3 4
! 106: #define SCODE_4 5
! 107: #define SCODE_5 6
! 108: #define SCODE_6 7
! 109: #define SCODE_7 8
! 110: #define SCODE_8 9
! 111: #define SCODE_9 10
! 112:
! 113: #define SCODE_LEFTSHIFT 42
! 114: #define SCODE_RIGHTSHIFT 54
! 115: #define SCODE_TAB 15
! 116:
! 117: #define SCODE_F11 87
! 118: #define SCODE_F12 88
! 119: #define SCODE_NEXT 81
! 120: #define SCODE_PRIOR 73
! 121: #define SCODE_BS 14
1.1 root 122: /*
1.1.1.2 ! root 123: #define SCODE_asciicircum 1
1.1 root 124: */
1.1.1.2 ! root 125: #define SCODE_bracketleft 26
! 126: #define SCODE_bracketright 27
! 127: #define SCODE_comma 51
! 128: #define SCODE_period 52
! 129: #define SCODE_slash 53
! 130: #define SCODE_semicolon 39
! 131: #define SCODE_grave 40
! 132: #define SCODE_minus 12
! 133: #define SCODE_equal 13
! 134: #define SCODE_numbersign 41
! 135: #define SCODE_ltgt 43
! 136: #define SCODE_scrolllock 70
! 137:
! 138: #define SCODE_LWIN95 125
! 139: #define SCODE_RWIN95 126
! 140: #define SCODE_MWIN95 127
! 141:
! 142: static int vsize;
! 143: static vga_modeinfo modeinfo;
! 144: static char *linear_mem = NULL;
! 145: xcolnr xcolors[4096];
1.1 root 146:
1.1.1.2 ! root 147: struct vidbuf_description gfxvidinfo;
1.1 root 148:
1.1.1.2 ! root 149: void flush_line(int y)
1.1 root 150: {
1.1.1.2 ! root 151: int target_y = y;
! 152:
! 153: if (screen_res < 2)
! 154: target_y -= 8;
! 155: if (linear_mem == NULL) {
! 156: char *addr = gfxvidinfo.bufmem + y*gfxvidinfo.rowbytes;
! 157: if (use_lores) {
! 158: addr += gfxvidinfo.pixbytes * (prev_max_diwstop - 328);
! 159: }
! 160: if (target_y < modeinfo.height && target_y >= 0)
! 161: vga_drawscanline(target_y, addr);
! 162: }
1.1 root 163: }
164:
1.1.1.2 ! root 165: void flush_block(int a, int b)
1.1 root 166: {
1.1.1.2 ! root 167: abort();
1.1 root 168: }
169:
1.1.1.2 ! root 170: void flush_screen(int a, int b)
1.1 root 171: {
1.1.1.2 ! root 172: }
1.1 root 173:
1.1.1.2 ! root 174: static int colors_allocated;
1.1 root 175:
1.1.1.2 ! root 176: static int get_color(int r, int g, int b, xcolnr *cnp)
! 177: {
! 178: if (colors_allocated == 256)
! 179: return -1;
! 180: *cnp = colors_allocated;
! 181: vga_setpalette(colors_allocated, doMask(r, 6, 0), doMask(g, 6, 0), doMask(b, 6, 0));
! 182: colors_allocated++;
! 183: return 1;
1.1 root 184: }
185:
186: static void init_colors(void)
187: {
1.1.1.2 ! root 188: int rw = 5, gw = 5, bw = 5;
! 189: colors_allocated = 0;
! 190: if (color_mode == 2) gw = 6;
1.1 root 191:
1.1.1.2 ! root 192: if (gfxvidinfo.pixbytes == 2)
! 193: alloc_colors64k(rw, gw, bw, gw+bw, bw, 0);
! 194: else
! 195: alloc_colors256(get_color);
1.1 root 196: }
197:
1.1.1.2 ! root 198: int buttonstate[3] = { 0, 0, 0 };
1.1 root 199: int lastmx, lastmy;
1.1.1.2 ! root 200: int newmousecounters = 0;
1.1 root 201:
1.1.1.2 ! root 202: static int keystate[256];
1.1 root 203:
204: static int scancode2amiga(int scancode)
205: {
206: switch(scancode) {
1.1.1.2 ! root 207: case SCODE_A: return AK_A;
! 208: case SCODE_B: return AK_B;
! 209: case SCODE_C: return AK_C;
! 210: case SCODE_D: return AK_D;
! 211: case SCODE_E: return AK_E;
! 212: case SCODE_F: return AK_F;
! 213: case SCODE_G: return AK_G;
! 214: case SCODE_H: return AK_H;
! 215: case SCODE_I: return AK_I;
! 216: case SCODE_J: return AK_J;
! 217: case SCODE_K: return AK_K;
! 218: case SCODE_L: return AK_L;
! 219: case SCODE_M: return AK_M;
! 220: case SCODE_N: return AK_N;
! 221: case SCODE_O: return AK_O;
! 222: case SCODE_P: return AK_P;
! 223: case SCODE_Q: return AK_Q;
! 224: case SCODE_R: return AK_R;
! 225: case SCODE_S: return AK_S;
! 226: case SCODE_T: return AK_T;
! 227: case SCODE_U: return AK_U;
! 228: case SCODE_V: return AK_V;
! 229: case SCODE_W: return AK_W;
! 230: case SCODE_X: return AK_X;
! 231: case SCODE_Y: return AK_Y;
! 232: case SCODE_Z: return AK_Z;
1.1 root 233:
1.1.1.2 ! root 234: case SCODE_0: return AK_0;
! 235: case SCODE_1: return AK_1;
! 236: case SCODE_2: return AK_2;
! 237: case SCODE_3: return AK_3;
! 238: case SCODE_4: return AK_4;
! 239: case SCODE_5: return AK_5;
! 240: case SCODE_6: return AK_6;
! 241: case SCODE_7: return AK_7;
! 242: case SCODE_8: return AK_8;
! 243: case SCODE_9: return AK_9;
1.1 root 244:
1.1.1.2 ! root 245: case SCODE_KEYPAD0: return AK_NP0;
! 246: case SCODE_KEYPAD1: return AK_NP1;
! 247: case SCODE_KEYPAD2: return AK_NP2;
! 248: case SCODE_KEYPAD3: return AK_NP3;
! 249: case SCODE_KEYPAD4: return AK_NP4;
! 250: case SCODE_KEYPAD5: return AK_NP5;
! 251: case SCODE_KEYPAD6: return AK_NP6;
! 252: case SCODE_KEYPAD7: return AK_NP7;
! 253: case SCODE_KEYPAD8: return AK_NP8;
! 254: case SCODE_KEYPAD9: return AK_NP9;
1.1 root 255:
1.1.1.2 ! root 256: case SCODE_F1: return AK_F1;
! 257: case SCODE_F2: return AK_F2;
! 258: case SCODE_F3: return AK_F3;
! 259: case SCODE_F4: return AK_F4;
! 260: case SCODE_F5: return AK_F5;
! 261: case SCODE_F6: return AK_F6;
! 262: case SCODE_F7: return AK_F7;
! 263: case SCODE_F8: return AK_F8;
! 264: case SCODE_F9: return AK_F9;
! 265: case SCODE_F10: return AK_F10;
1.1 root 266:
1.1.1.2 ! root 267: case SCODE_BS: return AK_BS;
! 268: case SCODE_LEFTCONTROL: return AK_CTRL;
! 269: case SCODE_RIGHTCONTROL: return AK_CTRL;
! 270: case SCODE_TAB: return AK_TAB;
! 271: case SCODE_LEFTALT: return AK_LALT;
! 272: case SCODE_RIGHTALT: return AK_RALT;
! 273: case SCODE_ENTER: return AK_RET;
! 274: case SCODE_SPACE: return AK_SPC;
! 275: case SCODE_LEFTSHIFT: return AK_LSH;
! 276: case SCODE_RIGHTSHIFT: return AK_RSH;
! 277: case SCODE_ESCAPE: return AK_ESC;
1.1 root 278:
1.1.1.2 ! root 279: case SCODE_INSERT:
! 280: case SCODE_END:
! 281: case SCODE_HOME: break;
! 282:
! 283: case SCODE_DELETE: return AK_DEL;
! 284: case SCODE_CURSORBLOCKUP: return AK_UP;
! 285: case SCODE_CURSORBLOCKDOWN: return AK_DN;
! 286: case SCODE_CURSORBLOCKLEFT: return AK_LF;
! 287: case SCODE_CURSORBLOCKRIGHT: return AK_RT;
1.1 root 288:
1.1.1.2 ! root 289: case SCODE_F11: return AK_BACKSLASH;
1.1 root 290: /*
1.1.1.2 ! root 291: case SCODE_asciicircum: return AK_00;
1.1 root 292: */
1.1.1.2 ! root 293: case SCODE_bracketleft: return AK_LBRACKET;
! 294: case SCODE_bracketright: return AK_RBRACKET;
! 295: case SCODE_comma: return AK_COMMA;
! 296: case SCODE_period: return AK_PERIOD;
! 297: case SCODE_slash: return AK_SLASH;
! 298: case SCODE_semicolon: return AK_SEMICOLON;
! 299: case SCODE_grave: return AK_QUOTE;
! 300: case SCODE_minus: return AK_MINUS;
! 301: case SCODE_equal: return AK_EQUAL;
1.1 root 302:
303: /* This one turns off screen updates. */
1.1.1.2 ! root 304: case SCODE_scrolllock: return AK_inhibit;
1.1 root 305:
1.1.1.2 ! root 306: case SCODE_PGUP: case SCODE_RWIN95: return AK_RAMI;
! 307: case SCODE_PGDN: case SCODE_LWIN95: return AK_LAMI;
1.1 root 308:
309: /*#ifdef KBD_LANG_DE*/
1.1.1.2 ! root 310: case SCODE_numbersign: return AK_NUMBERSIGN;
! 311: case SCODE_ltgt: return AK_LTGT;
1.1 root 312: /*#endif*/
313: }
314: return -1;
315: }
316:
317: static void my_kbd_handler(int scancode, int newstate)
318: {
319: int akey = scancode2amiga(scancode);
320:
321: assert(scancode >= 0 && scancode < 0x100);
1.1.1.2 ! root 322: if (scancode == SCODE_F12)
1.1 root 323: specialflags |= SPCFLAG_BRK;
324: if (keystate[scancode] == newstate)
325: return;
326: keystate[scancode] = newstate;
327:
328: if (akey == -1)
329: return;
330:
331: if (newstate == KEY_EVENTPRESS) {
332: if (akey == AK_inhibit)
333: inhibit_frame ^= 1;
334: else
335: record_key (akey << 1);
336: } else
337: record_key ((akey << 1) | 1);
338:
339: /* "Affengriff" */
340: if(keystate[AK_CTRL] && keystate[AK_LAMI] && keystate[AK_RAMI])
341: MC68000_reset();
342: }
343:
1.1.1.2 ! root 344: int graphics_init(void)
1.1 root 345: {
346: int i;
1.1.1.2 ! root 347: int vgamode;
! 348: if ((screen_res == 1 || screen_res == 2) && color_mode != 0) {
! 349: fprintf(stderr, "Sorry, this combination of color and video mode is not supported.\n");
! 350: return 0;
! 351: }
! 352: switch (screen_res) {
! 353: case 0: vgamode = (color_mode == 0 ? G320x200x256
! 354: : color_mode == 1 ? G320x200x32K
! 355: : G320x200x64K);
! 356: break;
! 357: case 1: vgamode = G320x240x256; break;
! 358: case 2: vgamode = G320x400x256; break;
! 359: case 3:
! 360: case 4: vgamode = (color_mode == 0 ? G800x600x256
! 361: : color_mode == 1 ? G800x600x32K
! 362: : G800x600x64K);
! 363: break;
! 364: default:
! 365: printf("Invalid screen mode.\n");
! 366: return 0;
! 367: }
1.1 root 368: vga_init();
1.1.1.2 ! root 369: modeinfo = *vga_getmodeinfo (vgamode);
! 370: if (modeinfo.bytesperpixel == 0) {
! 371: printf("Got a bogus value from SVGAlib... %s.\n",
! 372: screen_res == 1 || screen_res == 2 ? "trying to fix it" : "giving up");
! 373: if (screen_res != 1 && screen_res != 2)
! 374: return 0;
! 375: modeinfo.bytesperpixel = 1;
! 376: modeinfo.linewidth = 320;
! 377: }
! 378: gfxvidinfo.pixbytes = modeinfo.bytesperpixel;
! 379: if (vga_setmode(vgamode) < 0) {
! 380: sleep(1);
! 381: vga_setmode(TEXT);
! 382: fprintf(stderr, "SVGAlib doesn't like my video mode. Giving up.\n");
! 383: return 0;
! 384: }
! 385:
! 386: if ((modeinfo.flags & CAPABLE_LINEAR) && !use_lores && !use_xhair) {
! 387: if (vga_setlinearaddressing() != -1) {
! 388: linear_mem = (char *)vga_getgraphmem();
! 389: printf("Using linear addressing: %p.\n", linear_mem);
! 390: }
! 391: }
! 392:
! 393: vsize = dont_want_aspect ? numscrlines : 2*numscrlines;
! 394: gfxvidinfo.maxblocklines = 0;
! 395: /* printf("%d %d %d\n", modeinfo.linewidth, modeinfo.bytesperpixel, modeinfo.maxpixels);*/
! 396: if (linear_mem) {
! 397: gfxvidinfo.bufmem = linear_mem;
! 398: gfxvidinfo.rowbytes = modeinfo.linewidth;
! 399: } else {
! 400: gfxvidinfo.rowbytes = 800 * gfxvidinfo.pixbytes;
! 401: gfxvidinfo.bufmem = malloc(gfxvidinfo.rowbytes * vsize);
! 402: memset(gfxvidinfo.bufmem, 0, gfxvidinfo.rowbytes * vsize);
! 403: }
! 404: init_colors();
1.1 root 405: vga_setmousesupport(1);
406: mouse_init("/dev/mouse",vga_getmousetype(),10);
1.1.1.2 ! root 407: if (keyboard_init() != 0)
1.1 root 408: abort();
409: keyboard_seteventhandler(my_kbd_handler);
1.1.1.2 ! root 410: keyboard_translatekeys(DONT_CATCH_CTRLC);
1.1 root 411:
1.1.1.2 ! root 412: buttonstate[0] = buttonstate[1] = buttonstate[2] = 0;
1.1 root 413: for(i = 0; i < 256; i++)
1.1.1.2 ! root 414: keystate[i] = 0;
1.1 root 415:
1.1.1.2 ! root 416: lastmx = lastmy = 0;
! 417: newmousecounters = 0;
1.1 root 418:
419: mouse_setxrange(-1000,1000);
420: mouse_setyrange(-1000,1000);
421: mouse_setposition(0,0);
1.1.1.2 ! root 422:
! 423: return 1;
1.1 root 424: }
425:
426: void graphics_leave(void)
427: {
428: sleep(1); /* Maybe this will fix the "screen full of garbage" problem */
429: vga_setmode(TEXT);
430: keyboard_close();
431: }
432:
433: void handle_events(void)
434: {
435: int button = mouse_getbutton();
436:
437: keyboard_update();
438: mouse_update();
439: lastmx += mouse_getx();
440: lastmy += mouse_gety();
441: mouse_setposition(0,0);
442:
443: buttonstate[0] = button & 4;
444: buttonstate[1] = button & 2;
445: buttonstate[2] = button & 1;
446: }
447:
1.1.1.2 ! root 448: int debuggable(void)
1.1 root 449: {
1.1.1.2 ! root 450: return 0;
1.1 root 451: }
452:
1.1.1.2 ! root 453: int needmousehack(void)
1.1 root 454: {
1.1.1.2 ! root 455: return 0;
1.1 root 456: }
457:
458: void LED(int on)
459: {
460: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.