home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* XEVENTS.PAS *)
- (* *)
- (* Neue Maus- und Tastaturroutinen auf unterster Ebene *)
- (* (C) 1992 by Christian Ohr & DMV-Verlag *)
- (* ------------------------------------------------------ *)
-
- UNIT XEvents;
-
-
- INTERFACE
-
-
- USES Drivers;
-
- CONST
- kbAltGrayIns = $A200;
- kbAltGrayDel = $A300;
- kbAltGrayHome = $9700;
- kbAltGrayEnd = $9F00;
- kbAltGrayPgUp = $9800;
- kbAltGrayPgDn = $A100;
- kbAltGrayLeft = $9B00;
- kbAltGrayRight = $9D00;
-
- kbF11 = $8500;
- kbF12 = $8600;
- kbShiftF11 = $8700;
- kbShiftF12 = $8800;
- kbCtrlF11 = $8900;
- kbCtrlF12 = $8A00;
- kbAltF11 = $8B00;
- kbAltF12 = $8C00;
-
- kbNum5 = $4C00;
- kbCtrlNum5 = $8F00;
-
- kbAltGrayPlus = $4E00;
- kbAltGrayMinus = $4A00;
- kbAltGrayMul = $3700;
- kbAltGrayDiv = $A400;
- kbCtrlGrayPlus = $9000;
- kbCtrlGrayMinus = $8E00;
- kbCtrlGrayMul = $9600;
- kbCtrlGrayDiv = $9500;
-
- kbCtrlTab = $9400;
- kbAltTab = $A500;
- kbAltPlus = $1B00;
- kbAltMinus = $3500;
- kbAltComma = $3300;
- kbAltDot = $3400;
- kbAltEnter = $1C00;
-
-
- PROCEDURE InitEvents;
- PROCEDURE DoneEvents;
-
- PROCEDURE GetKeyEvent(VAR Event: tEvent);
-
-
- IMPLEMENTATION
-
-
- USES DOS;
-
-
- TYPE
-
- (* Dieser interne Record liegt gleich hinter d. letzten *)
- (* öffentlichen Variable (Drivers.CursorLines). *)
-
- pEvQ = ^tEvQ;
- tEvQ = RECORD
- OldMouseButtons: BYTE;
- DoubleButton : BYTE;
- OldDouble : BOOLEAN;
- Unused : BYTE;
- OldX : WORD;
- OldY : WORD;
- DoubleX : WORD;
- DoubleY : WORD;
- DoubleTime : WORD;
- OldTime : WORD;
- DoubleDelay : WORD;
- EventCount : WORD;
- EventQHead : WORD;
- EventQTail : WORD;
- EventQueue : ARRAY[0..15] OF TEvent;
- END;
-
-
- VAR
- EvQ : pEvQ;
- Index : WORD;
- MouseUserSave: POINTER;
-
-
-
- (* der folgende kleine Umweg ist dringend nötig! *)
-
- CONST
- MouseUser = $78;
-
- PROCEDURE UserInterrupt; ASSEMBLER;
- ASM
- int MouseUser;
- END;
-
-
- (* Das ist die neue Maus-Subroutine (diesmal in Pascal, *)
- (* der Übersichtlichkeit halber). Sie entspricht der *)
- (* seitherigen, allerdings werden die Mauskoordinaten *)
- (* vom Videomodus abhängig bearbeitet. *)
-
- PROCEDURE MyMouseSubRtn(Flags, CS, IP, AX, BX, CX, DX, SI,
- DI, DS, ES, BP: WORD); INTERRUPT;
- BEGIN
- IF (ScreenMode = 3) OR (ScreenMode = 7) THEN BEGIN
- CX := CX SHR 3;
- DX := DX SHR 3;
- END;
- MouseButtons := BX;
- MouseWhere.X := CX;
- MouseWhere.Y := DX;
- WITH EvQ^ DO
- IF (AX AND $001E <> 0) AND (EventCount < 16) THEN BEGIN
- WITH EventQueue[Index] DO BEGIN
- What := MemW[$0040:$006C];
- Buttons := Lo(BX);
- DOUBLE := FALSE;
- Where.X := CX;
- Where.Y := DX;
- END;
- Index := Succ(Index) MOD 16;
- Inc(EventCount);
- END;
- MouseIntFlag := 1;
- END;
-
-
- (* InitEvents installiert die neue Maus-Interruptroutine *)
-
- PROCEDURE InitEvents;
- BEGIN
- Drivers.InitEvents;
- IF MouseEvents THEN BEGIN
- GetIntVec(MouseUser, MouseUserSave);
- SetIntVec(MouseUser, @MyMouseSubRtn);
- EvQ := Ptr(Seg(CursorLines), Ofs(CursorLines) + 2);
- Index := 0;
- ASM
- MOV AX,000Ch
- MOV CX,0FFFFh
- MOV DX,SEG UserInterrupt
- MOV ES,DX
- MOV DX,OFFSET UserInterrupt
- INT 33h
- END;
- END;
- END;
-
-
- PROCEDURE DoneEvents;
- BEGIN
- Drivers.DoneEvents;
- SetIntVec(MouseUser, MouseUserSave);
- END;
-
-
-
- PROCEDURE GetKeyEvent(VAR Event: tEvent); ASSEMBLER;
- ASM
- MOV AH,11h
- INT 16h
- MOV AX,0000h
- MOV BX,AX
- JE @@1
- MOV AH,10h
- INT 16h
- XCHG BX,AX
- MOV AX,10h
- @@1:
- LES DI,Event
- CLD
- STOSW
- XCHG BX,AX
- STOSW
- XOR AX,AX
- STOSW
- STOSW
- END;
-
- END.
-
-
- (* ------------------------------------------------------ *)
- (* Ende von XEVENTS.PAS *)
-
-