Annotation of uae/src/od-dos/misc/handlers.c, revision 1.1

1.1     ! root        1:  /*
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   *
        !             4:   * DOS handlers.
        !             5:   *
        !             6:   * (c) 1997 Gustavo Goedert
        !             7:   *
        !             8:   * Led routines by Michael Sontheimer
        !             9:   */
        !            10: 
        !            11: #include "sysconfig.h"
        !            12: #include "sysdeps.h"
        !            13: 
        !            14: #include <dos.h>
        !            15: #include <go32.h>
        !            16: #include <dpmi.h>
        !            17: #include <sys/farptr.h>
        !            18: 
        !            19: #include "config.h"
        !            20: #include "options.h"
        !            21: #include "threaddep/penguin.h"
        !            22: #include "memory.h"
        !            23: #include "custom.h"
        !            24: #include "readcpu.h"
        !            25: #include "newcpu.h"
        !            26: #include "keyboard.h"
        !            27: #include "xwin.h"
        !            28: #include "keybuf.h"
        !            29: #include "disk.h"
        !            30: #include "gui.h"
        !            31: #include "tui.h"
        !            32: #include "uae.h"
        !            33: #include "picasso96.h"
        !            34: #include "misc/handlers.h"
        !            35: #include "misc/misc.h"
        !            36: 
        !            37: /* dummie Amiga Keys */
        !            38: #define AK_EjectDisk    0xfa
        !            39: #define AK_ChangeDisk   0xfb
        !            40: #define AK_SaveScreen1  0xfc
        !            41: #define AK_SaveScreen2  0xfd
        !            42: #define AK_TougleScreen 0xfe
        !            43: #define AK_QuitProgram  0xff
        !            44: 
        !            45: /* Event Flags */
        !            46: #define EF_ResetCPU       0x0001
        !            47: #define EF_EjectDisk0     0x0002
        !            48: #define EF_EjectDisk1     0x0004
        !            49: #define EF_EjectDisk2     0x0008
        !            50: #define EF_EjectDisk3     0x0010
        !            51: #define EF_ChangeDisk0    0x0020
        !            52: #define EF_ChangeDisk1    0x0040
        !            53: #define EF_ChangeDisk2    0x0080
        !            54: #define EF_ChangeDisk3    0x0100
        !            55: #define EF_ChangeOptions  0x0200
        !            56: #define EF_EnterDebug     0x0400
        !            57: #define EF_SaveScreen     0x0800
        !            58: #define EF_TougleScreen   0x1000
        !            59: #define EF_TougleSound    0x2000
        !            60: #define EF_TougleCapsLock 0x4000
        !            61: #define EF_QuitProgram    0x8000
        !            62: 
        !            63: extern int kpb_first, kpb_last;
        !            64: extern int keybuf[256];
        !            65: 
        !            66: int Original_produce_sound;
        !            67: int KeyBoardInstalled = 0, MouseInstalled = 0;
        !            68: int EventFlags = 0;
        !            69: int KeyState[256];
        !            70: int buttonstate[3] = {0, 0, 0};
        !            71: int lastmx, lastmy;
        !            72: int newmousecounters = 0;
        !            73: _go32_dpmi_seginfo OldKeyboardHandler, NewKeyboardHandler, NewMouseHandler;
        !            74: _go32_dpmi_registers MouseCallbackRegs;
        !            75: volatile int NumLockState = -1, CapsLockState = -1, ScrollLockState = -1;
        !            76: UBYTE SavedLEDa;
        !            77: 
        !            78: int AmigaKeys[128] = {
        !            79:     -1,             AK_ESC,        AK_1,           AK_2,           AK_3,      AK_4,     AK_5,            AK_6,
        !            80:     AK_7,           AK_8,          AK_9,           AK_0,           AK_MINUS,  AK_EQUAL, AK_BS,           AK_TAB,
        !            81:     AK_Q,           AK_W,          AK_E,           AK_R,           AK_T,      AK_Y,     AK_U,            AK_I,
        !            82:     AK_O,           AK_P,          AK_LBRACKET,    AK_RBRACKET,    AK_RET,    AK_CTRL,  AK_A,            AK_S,
        !            83:     AK_D,           AK_F,          AK_G,           AK_H,           AK_J,      AK_K,     AK_L,            AK_SEMICOLON,
        !            84:     AK_QUOTE,       AK_NUMBERSIGN, AK_LSH,         AK_LTGT,        AK_Z,      AK_X,     AK_C,            AK_V,
        !            85:     AK_B,           AK_N,          AK_M,           AK_COMMA,       AK_PERIOD, AK_SLASH, AK_RSH,          -1,
        !            86:     AK_LALT,        AK_SPC,        AK_CAPSLOCK,    AK_F1,          AK_F2,     AK_F3,    AK_F4,           AK_F5,
        !            87:     AK_F6,          AK_F7,         AK_F8,          AK_F9,          AK_F10,    -1,       AK_TougleScreen, AK_NP7,
        !            88:     AK_NP8,         AK_NP9,        -1,             AK_NP4,         AK_NP5,    AK_NP6,   -1,              AK_NP1,
        !            89:     AK_NP2,         AK_NP3,        AK_NP0,         -1,             -1,        -1,       -1,              AK_BACKSLASH,
        !            90:     AK_QuitProgram, -1,            -1,             -1,             -1,        -1,       -1,              -1,
        !            91:     -1,             AK_RCTRL,      AK_SaveScreen1, AK_SaveScreen2, AK_RALT,   -1,       AK_ChangeDisk,   AK_UP,
        !            92:     AK_RAMI,        AK_LF,         AK_RT,          AK_EjectDisk,   AK_DN,     AK_LAMI,  AK_HELP,         AK_DEL,
        !            93:     -1,             -1,            -1,             -1,             -1,        -1,       -1,              -1,
        !            94:     -1,             -1,            -1,             -1,             -1,        AK_LAMI,  AK_RAMI,         -1
        !            95: };
        !            96: 
        !            97: unsigned char EscapeKeys[128] = {
        !            98:     0,   0,   0,   0,   0,   0,   0,   0,
        !            99:     0,   0,   0,   0,   0,   0,   0,   0,
        !           100:     0,   0,   0,   0,   0,   0,   0,   0,
        !           101:     0,   0,   0,   0,   96,  97,  0,   0,
        !           102:     0,   0,   0,   0,   0,   0,   0,   0,
        !           103:     0,   0,   98,  0,   0,   0,   0,   0,
        !           104:     0,   0,   0,   0,   0,   0,   0,   99,
        !           105:     100, 0,   0,   0,   0,   0,   0,   0,
        !           106:     0,   0,   0,   0,   0,   0,   0,   102,
        !           107:     103, 104, 0,   105, 0,   106, 0,   107,
        !           108:     108, 109, 110, 111, 0,   0,   0,   0,
        !           109:     0,   0,   0,   125, 126, 127, 0,   0,
        !           110:     0,   0,   0,   0,   0,   0,   0,   0,
        !           111:     0,   0,   0,   0,   0,   0,   0,   0,
        !           112:     0,   0,   0,   0,   0,   0,   0,   0,
        !           113:     0,   0,   0,   0,   0,   0,   0,   0,
        !           114: };
        !           115: 
        !           116: int InstallHandlers(void) {
        !           117:     if (!KeyBoardInstalled)
        !           118:        if (!InstallKeyboardHandler())
        !           119:            return(0);
        !           120:     if (!MouseInstalled)
        !           121:        if (!InstallMouseHandler())
        !           122:            return(0);
        !           123:     SavedLEDa = InitLED();
        !           124:     return(1);
        !           125: }
        !           126: 
        !           127: void UninstallHandlers(void) {
        !           128:     if (KeyBoardInstalled)
        !           129:        UninstallKeyboardHandler();
        !           130:     if (MouseInstalled)
        !           131:        UninstallMouseHandler();
        !           132:     RestoreLEDStatus(SavedLEDa);
        !           133: }
        !           134: 
        !           135: void handle_events(void) {
        !           136:     if (EventFlags) {
        !           137:        if (EventFlags & EF_ResetCPU) {
        !           138:            m68k_reset();
        !           139:            EventFlags &= ~EF_ResetCPU;
        !           140:        }
        !           141:        if (EventFlags & EF_EjectDisk0) {
        !           142:            disk_eject(0);
        !           143:            EventFlags &= ~EF_EjectDisk0;
        !           144:        }
        !           145:        if (EventFlags & EF_EjectDisk1) {
        !           146:            disk_eject(1);
        !           147:            EventFlags &= ~EF_EjectDisk1;
        !           148:        }
        !           149:        if (EventFlags & EF_EjectDisk2) {
        !           150:            disk_eject(2);
        !           151:            EventFlags &= ~EF_EjectDisk2;
        !           152:        }
        !           153:        if (EventFlags & EF_EjectDisk3) {
        !           154:            disk_eject(3);
        !           155:            EventFlags &= ~EF_EjectDisk3;
        !           156:        }
        !           157:        if (EventFlags & EF_ChangeDisk0) {
        !           158:            HandleDisk(0);
        !           159:            KeyState[AK_ChangeDisk] = 0;
        !           160:            KeyState[AK_F1] = 0;
        !           161:            record_key ((AK_F1 << 1) | 1);
        !           162:            EventFlags &= ~EF_ChangeDisk0;
        !           163:        }
        !           164:        if (EventFlags & EF_ChangeDisk1) {
        !           165:            HandleDisk(1);
        !           166:            KeyState[AK_ChangeDisk] = 0;
        !           167:            KeyState[AK_F2] = 0;
        !           168:            record_key ((AK_F2 << 1) | 1);
        !           169:            EventFlags &= ~EF_ChangeDisk1;
        !           170:        }
        !           171:        if (EventFlags & EF_ChangeDisk2) {
        !           172:            HandleDisk(2);
        !           173:            KeyState[AK_ChangeDisk] = 0;
        !           174:            KeyState[AK_F3] = 0;
        !           175:            record_key ((AK_F3 << 1) | 1);
        !           176:            EventFlags &= ~EF_ChangeDisk2;
        !           177:        }
        !           178:        if (EventFlags & EF_ChangeDisk3) {
        !           179:            HandleDisk(3);
        !           180:            KeyState[AK_ChangeDisk] = 0;
        !           181:            KeyState[AK_F4] = 0;
        !           182:            record_key ((AK_F4 << 1) | 1);
        !           183:            EventFlags &= ~EF_ChangeDisk3;
        !           184:        }
        !           185:        if (EventFlags & EF_EnterDebug) {
        !           186:            EnterDebug();
        !           187:            EventFlags &= ~EF_EnterDebug;
        !           188:        }
        !           189:        if (EventFlags & EF_SaveScreen) {
        !           190:            SaveScreen();
        !           191:            EventFlags &= ~EF_SaveScreen;
        !           192:        }
        !           193:        if (EventFlags & EF_TougleScreen) {
        !           194:            inhibit_frame ^= 1;
        !           195:            EventFlags &= ~EF_TougleScreen;
        !           196:        }
        !           197:        if (EventFlags & EF_TougleSound) {
        !           198:            if (currprefs.produce_sound == 0)
        !           199:                currprefs.produce_sound = Original_produce_sound;
        !           200:            else
        !           201:                currprefs.produce_sound = 0;
        !           202:            EventFlags &= ~EF_TougleSound;
        !           203:        }
        !           204:        if (EventFlags & EF_TougleCapsLock) {
        !           205:            CapsLockLED(!CapsLockState);
        !           206:            EventFlags &= ~EF_TougleCapsLock;
        !           207:        }
        !           208:        if (EventFlags & EF_QuitProgram) {
        !           209:            regs.spcflags |= SPCFLAG_BRK;
        !           210:            quit_program = 1;
        !           211:            EventFlags &= ~EF_QuitProgram;
        !           212:        }
        !           213:     }
        !           214: #ifdef PICASSO96
        !           215:     PicassoRefresh();
        !           216: #endif
        !           217: }
        !           218: 
        !           219: static void KeyboardHandler(void) {
        !           220:     static int IsEscape = 0, CapsLockCanChange = 1;
        !           221:     int ScanCode, NewState, AmigaKey;
        !           222: 
        !           223:     ScanCode = inportb(0x60);
        !           224: 
        !           225:     if (ScanCode == 0xe0) {
        !           226:        IsEscape = 1;
        !           227:        outportb(0x20, 0x20);
        !           228:        return;
        !           229:     }
        !           230: 
        !           231:     /* PAUSE Key */
        !           232:     if (IsEscape > 1) {
        !           233:        IsEscape++;
        !           234:        if (IsEscape == 7) {
        !           235:            EventFlags |= EF_TougleSound;
        !           236:            IsEscape = 0;
        !           237:        }
        !           238:        outportb(0x20, 0x20);
        !           239:        return;
        !           240:     }
        !           241:     if (ScanCode == 0xe1) {
        !           242:        IsEscape = 2;
        !           243:        outportb(0x20, 0x20);
        !           244:        return;
        !           245:     }
        !           246: 
        !           247:     NewState = !(ScanCode & 0x80);
        !           248:     ScanCode = ScanCode & 0x7f;
        !           249:     if (IsEscape) {
        !           250:        ScanCode = EscapeKeys[ScanCode];
        !           251:        IsEscape = 0;
        !           252:     }
        !           253:     outportb(0x20, 0x20);
        !           254: 
        !           255:     AmigaKey = AmigaKeys[ScanCode];
        !           256: 
        !           257:     if (AmigaKey == -1)
        !           258:        return;
        !           259: 
        !           260:     if (AmigaKey == AK_CAPSLOCK) {
        !           261:        if (NewState) {
        !           262:            if (CapsLockCanChange) {
        !           263:                NewState = !KeyState[AmigaKey];
        !           264:                CapsLockCanChange = 0;
        !           265:            } else
        !           266:               return;
        !           267:        } else {
        !           268:            CapsLockCanChange = 1;
        !           269:            return;
        !           270:        }
        !           271:        EventFlags |= EF_TougleCapsLock;
        !           272:     }
        !           273: 
        !           274:     if (KeyState[AmigaKey] == NewState)
        !           275:        return;
        !           276:     KeyState[AmigaKey] = NewState;
        !           277: 
        !           278:     if (AmigaKey < AK_EjectDisk) {
        !           279:        if (NewState)
        !           280:            record_key (AmigaKey << 1);
        !           281:        else
        !           282:            record_key ((AmigaKey << 1) | 1);
        !           283:     }
        !           284: 
        !           285:     if ((KeyState[AK_CTRL] && KeyState[AK_LAMI] && KeyState[AK_RAMI]) ||
        !           286:        (KeyState[AK_RCTRL] && KeyState[AK_LAMI] && KeyState[AK_RAMI]))
        !           287:        EventFlags |= EF_ResetCPU;
        !           288:     if (KeyState[AK_EjectDisk]) {
        !           289:        if (KeyState[AK_F1])
        !           290:            EventFlags |= EF_EjectDisk0;
        !           291:        if (KeyState[AK_F2])
        !           292:            EventFlags |= EF_EjectDisk1;
        !           293:        if (KeyState[AK_F3])
        !           294:            EventFlags |= EF_EjectDisk2;
        !           295:        if (KeyState[AK_F4])
        !           296:            EventFlags |= EF_EjectDisk3;
        !           297:     }
        !           298:     if (KeyState[AK_ChangeDisk]) {
        !           299:        if (KeyState[AK_F1])
        !           300:            EventFlags |= EF_ChangeDisk0;
        !           301:        if (KeyState[AK_F2])
        !           302:            EventFlags |= EF_ChangeDisk1;
        !           303:        if (KeyState[AK_F3])
        !           304:            EventFlags |= EF_ChangeDisk2;
        !           305:        if (KeyState[AK_F4])
        !           306:            EventFlags |= EF_ChangeDisk3;
        !           307:        if (KeyState[AK_F6])
        !           308:            EventFlags |= EF_EnterDebug;
        !           309:     }
        !           310:     if (KeyState[AK_TougleScreen])
        !           311:        EventFlags |= EF_TougleScreen;
        !           312:     if (KeyState[AK_SaveScreen1] && KeyState[AK_SaveScreen2])
        !           313:        EventFlags |= EF_SaveScreen;
        !           314:     if (KeyState[AK_QuitProgram])
        !           315:        EventFlags |= EF_QuitProgram;
        !           316: }
        !           317: 
        !           318: int InstallKeyboardHandler(void) {
        !           319:     int i;
        !           320: 
        !           321:     if (KeyBoardInstalled)
        !           322:        return(1);
        !           323:     _go32_dpmi_get_protected_mode_interrupt_vector(9, &OldKeyboardHandler);
        !           324:     NewKeyboardHandler.pm_offset = (int)KeyboardHandler;
        !           325:     if (_go32_dpmi_allocate_iret_wrapper(&NewKeyboardHandler) != 0) {
        !           326:        printf ("Can't allocate keyboard iret_wrapper.\n");
        !           327:        return(0);
        !           328:     }
        !           329:     if (_go32_dpmi_set_protected_mode_interrupt_vector(9, &NewKeyboardHandler) != 0) {
        !           330:        printf ("Can't set protected mode interrupt vector.\n");
        !           331:        return(0);
        !           332:     }
        !           333:     for(i = 0; i < 256; i++)
        !           334:        KeyState[i] = 0;
        !           335:     _go32_dpmi_lock_code(KeyboardHandler, (unsigned int)InstallKeyboardHandler-(unsigned int)KeyboardHandler);
        !           336:     _go32_dpmi_lock_data(AmigaKeys, sizeof(AmigaKeys));
        !           337:     _go32_dpmi_lock_data(EscapeKeys, sizeof(EscapeKeys));
        !           338:     _go32_dpmi_lock_data(KeyState, sizeof(KeyState));
        !           339:     _go32_dpmi_lock_data(&EventFlags, sizeof(EventFlags));
        !           340:     _go32_dpmi_lock_data(&OldKeyboardHandler, sizeof(OldKeyboardHandler));
        !           341:     _go32_dpmi_lock_data(&NewKeyboardHandler, sizeof(NewKeyboardHandler));
        !           342:     _go32_dpmi_lock_code(record_key, (unsigned int)keybuf_init-(unsigned int)record_key);
        !           343:     _go32_dpmi_lock_data(&kpb_first, sizeof(kpb_first));
        !           344:     _go32_dpmi_lock_data(&kpb_last, sizeof(kpb_last));
        !           345:     _go32_dpmi_lock_data(keybuf, sizeof(keybuf));
        !           346:     KeyBoardInstalled = 1;
        !           347:     return(1);
        !           348: }
        !           349: 
        !           350: void UninstallKeyboardHandler(void) {
        !           351:     if (!KeyBoardInstalled)
        !           352:        return;
        !           353:     _go32_dpmi_set_protected_mode_interrupt_vector(9, &OldKeyboardHandler);
        !           354:     _go32_dpmi_free_iret_wrapper(&NewKeyboardHandler);
        !           355:     KeyBoardInstalled = 0;
        !           356: }
        !           357: 
        !           358: static void MouseHandler(_go32_dpmi_registers *MouseRegs) {
        !           359:     lastmx = (short)MouseRegs->x.si;
        !           360:     lastmy = (short)MouseRegs->x.di;
        !           361:     buttonstate[0] = MouseRegs->x.bx & 1;
        !           362:     buttonstate[1] = MouseRegs->x.bx & 4;
        !           363:     buttonstate[2] = MouseRegs->x.bx & 2;
        !           364: }
        !           365: 
        !           366: int InstallMouseHandler(void) {
        !           367:     _go32_dpmi_registers IntRegs;
        !           368: 
        !           369:     if (MouseInstalled)
        !           370:        return(1);
        !           371:     IntRegs.x.ax = 0;
        !           372:     IntRegs.x.ss = IntRegs.x.sp = IntRegs.x.flags = 0;
        !           373:     _go32_dpmi_simulate_int(0x33, &IntRegs);
        !           374:     if (IntRegs.x.ax==0) {
        !           375:        printf ("Mouse driver not present.\n");
        !           376:        return(0);
        !           377:     }
        !           378:     NewMouseHandler.pm_offset = (int)MouseHandler;
        !           379:     if (_go32_dpmi_allocate_real_mode_callback_retf(&NewMouseHandler, &MouseCallbackRegs) != 0) {
        !           380:        printf ("Can't allocate mouse callback_retf.\n");
        !           381:        return(0);
        !           382:     }
        !           383:     IntRegs.x.ax = 0xc;
        !           384:     IntRegs.x.cx = 0x7f;
        !           385:     IntRegs.x.es = NewMouseHandler.rm_segment;
        !           386:     IntRegs.x.dx = NewMouseHandler.rm_offset;
        !           387:     IntRegs.x.ss = IntRegs.x.sp = IntRegs.x.flags = 0;
        !           388:     buttonstate[0] = buttonstate[1] = buttonstate[2] = 0;
        !           389:     lastmx = lastmy = 0;
        !           390:     newmousecounters = 0;
        !           391:     _go32_dpmi_simulate_int(0x33, &IntRegs);
        !           392:     _go32_dpmi_lock_code(MouseHandler, (unsigned int)InstallMouseHandler-(unsigned int)MouseHandler);
        !           393:     _go32_dpmi_lock_data(&lastmx, sizeof(lastmx));
        !           394:     _go32_dpmi_lock_data(&lastmy, sizeof(lastmy));
        !           395:     _go32_dpmi_lock_data(buttonstate, sizeof(buttonstate));
        !           396:     _go32_dpmi_lock_data(&NewMouseHandler, sizeof(NewMouseHandler));
        !           397:     _go32_dpmi_lock_data(&MouseCallbackRegs, sizeof(MouseCallbackRegs));
        !           398:     MouseInstalled = 1;
        !           399:     return(1);
        !           400: }
        !           401: 
        !           402: void UninstallMouseHandler(void) {
        !           403:     _go32_dpmi_registers IntRegs;
        !           404: 
        !           405:     if (!MouseInstalled)
        !           406:        return;
        !           407:     IntRegs.x.ax = 0xc;
        !           408:     IntRegs.x.cx = 0x0;
        !           409:     IntRegs.x.ss = IntRegs.x.sp = IntRegs.x.flags = 0;
        !           410:     _go32_dpmi_simulate_int(0x33, &IntRegs);
        !           411:     _go32_dpmi_free_real_mode_callback(&NewMouseHandler);
        !           412:     MouseInstalled = 0;
        !           413: }
        !           414: 
        !           415: 
        !           416: void LED(int on) {
        !           417: 
        !           418:     ScrollLockLED(!on);
        !           419: 
        !           420: }
        !           421: 
        !           422: void NumLockLED(int on) {
        !           423: 
        !           424:     _go32_dpmi_registers regs;
        !           425: 
        !           426:     if( NumLockState != on )     // Avoid more int's than necessary
        !           427:     {
        !           428:        if( on )
        !           429:            _farnspokeb( (0x40<<4)+0x17, _farnspeekb( (0x40<<4)+0x17 ) | 32 );
        !           430:        else
        !           431:            _farnspokeb( (0x40<<4)+0x17, _farnspeekb( (0x40<<4)+0x17 ) & ~32 );
        !           432: 
        !           433:        regs.x.ax = 0x0100;
        !           434:        regs.x.ss=regs.x.sp=regs.x.flags=0;
        !           435:        _go32_dpmi_simulate_int(0x16, &regs);
        !           436: 
        !           437:        NumLockState = on;
        !           438:     }
        !           439: 
        !           440: }
        !           441: 
        !           442: void CapsLockLED(int on) {
        !           443: 
        !           444:     _go32_dpmi_registers regs;
        !           445: 
        !           446:     if( CapsLockState != on )     // Avoid more int's than necessary
        !           447:     {
        !           448:        if( on )
        !           449:            _farnspokeb( (0x40<<4)+0x17, _farnspeekb( (0x40<<4)+0x17 ) | 64 );
        !           450:        else
        !           451:            _farnspokeb( (0x40<<4)+0x17, _farnspeekb( (0x40<<4)+0x17 ) & ~64 );
        !           452: 
        !           453:        regs.x.ax = 0x0100;
        !           454:        regs.x.ss=regs.x.sp=regs.x.flags=0;
        !           455:        _go32_dpmi_simulate_int(0x16, &regs);
        !           456: 
        !           457:        CapsLockState = on;
        !           458:     }
        !           459: 
        !           460: }
        !           461: 
        !           462: void ScrollLockLED(int on) {
        !           463: 
        !           464:     _go32_dpmi_registers regs;
        !           465: 
        !           466:     if( ScrollLockState != on )     // Avoid more int's than necessary
        !           467:     {
        !           468:        if( on )
        !           469:            _farnspokeb( (0x40<<4)+0x17, _farnspeekb( (0x40<<4)+0x17 ) | 16 );
        !           470:        else
        !           471:            _farnspokeb( (0x40<<4)+0x17, _farnspeekb( (0x40<<4)+0x17 ) & ~16 );
        !           472: 
        !           473:        regs.x.ax = 0x0100;
        !           474:        regs.x.ss=regs.x.sp=regs.x.flags=0;
        !           475:        _go32_dpmi_simulate_int(0x16, &regs);
        !           476: 
        !           477:        ScrollLockState = on;
        !           478:     }
        !           479: 
        !           480: }
        !           481: 
        !           482: UBYTE InitLED(void) {
        !           483: 
        !           484:     UBYTE ubSavedLED;
        !           485: 
        !           486:     ubSavedLED = _farnspeekb( (0x40<<4)+0x17 );    // Save LED-status
        !           487: 
        !           488:     NumLockLED(0);
        !           489:     CapsLockLED(0);
        !           490:     ScrollLockLED(0);
        !           491: 
        !           492:     return(ubSavedLED);
        !           493: 
        !           494: }
        !           495: 
        !           496: void RestoreLEDStatus(UBYTE ubSavedLED) {
        !           497: 
        !           498:     _go32_dpmi_registers regs;
        !           499: 
        !           500:     _farnspokeb( (0x40<<4)+0x17, ubSavedLED );
        !           501: 
        !           502:     regs.x.ax = 0x0100;
        !           503:     regs.x.ss=regs.x.sp=regs.x.flags=0;
        !           504:     _go32_dpmi_simulate_int(0x16, &regs);
        !           505: 
        !           506: }

unix.superglobalmegacorp.com

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