Annotation of uae/svga.c, revision 1.1.1.2

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.