Annotation of uae/dos-grx.c, revision 1.1

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, &regs);
        !           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, &regs);
        !           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, &regs);
        !           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: }

unix.superglobalmegacorp.com

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