home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / tvision / tvpas / xevents.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-11-10  |  4.2 KB  |  200 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      XEVENTS.PAS                       *)
  3. (*                                                        *)
  4. (*   Neue Maus- und Tastaturroutinen auf unterster Ebene  *)
  5. (*         (C) 1992 by Christian Ohr & DMV-Verlag         *)
  6. (* ------------------------------------------------------ *)
  7.  
  8. UNIT XEvents;
  9.  
  10.  
  11. INTERFACE
  12.  
  13.  
  14. USES Drivers;
  15.  
  16. CONST
  17.   kbAltGrayIns     = $A200;
  18.   kbAltGrayDel     = $A300;
  19.   kbAltGrayHome    = $9700;
  20.   kbAltGrayEnd     = $9F00;
  21.   kbAltGrayPgUp    = $9800;
  22.   kbAltGrayPgDn    = $A100;
  23.   kbAltGrayLeft    = $9B00;
  24.   kbAltGrayRight   = $9D00;
  25.  
  26.   kbF11            = $8500;
  27.   kbF12            = $8600;
  28.   kbShiftF11       = $8700;
  29.   kbShiftF12       = $8800;
  30.   kbCtrlF11        = $8900;
  31.   kbCtrlF12        = $8A00;
  32.   kbAltF11         = $8B00;
  33.   kbAltF12         = $8C00;
  34.  
  35.   kbNum5           = $4C00;
  36.   kbCtrlNum5       = $8F00;
  37.  
  38.   kbAltGrayPlus    = $4E00;
  39.   kbAltGrayMinus   = $4A00;
  40.   kbAltGrayMul     = $3700;
  41.   kbAltGrayDiv     = $A400;
  42.   kbCtrlGrayPlus   = $9000;
  43.   kbCtrlGrayMinus  = $8E00;
  44.   kbCtrlGrayMul    = $9600;
  45.   kbCtrlGrayDiv    = $9500;
  46.  
  47.   kbCtrlTab        = $9400;
  48.   kbAltTab         = $A500;
  49.   kbAltPlus        = $1B00;
  50.   kbAltMinus       = $3500;
  51.   kbAltComma       = $3300;
  52.   kbAltDot         = $3400;
  53.   kbAltEnter       = $1C00;
  54.  
  55.  
  56. PROCEDURE InitEvents;
  57. PROCEDURE DoneEvents;
  58.  
  59. PROCEDURE GetKeyEvent(VAR Event: tEvent);
  60.  
  61.  
  62. IMPLEMENTATION
  63.  
  64.  
  65. USES DOS;
  66.  
  67.  
  68. TYPE
  69.  
  70.   (* Dieser interne Record liegt gleich hinter d. letzten *)
  71.   (* öffentlichen Variable (Drivers.CursorLines).         *)
  72.  
  73.   pEvQ = ^tEvQ;
  74.   tEvQ = RECORD
  75.     OldMouseButtons: BYTE;
  76.     DoubleButton   : BYTE;
  77.     OldDouble      : BOOLEAN;
  78.     Unused         : BYTE;
  79.     OldX           : WORD;
  80.     OldY           : WORD;
  81.     DoubleX        : WORD;
  82.     DoubleY        : WORD;
  83.     DoubleTime     : WORD;
  84.     OldTime        : WORD;
  85.     DoubleDelay    : WORD;
  86.     EventCount     : WORD;
  87.     EventQHead     : WORD;
  88.     EventQTail     : WORD;
  89.     EventQueue     : ARRAY[0..15] OF TEvent;
  90.   END;
  91.  
  92.  
  93. VAR
  94.   EvQ          : pEvQ;
  95.   Index        : WORD;
  96.   MouseUserSave: POINTER;
  97.   
  98.  
  99.  
  100. (* der folgende kleine Umweg ist dringend nötig!          *)
  101.  
  102. CONST
  103.   MouseUser = $78;
  104.  
  105. PROCEDURE UserInterrupt; ASSEMBLER;
  106. ASM
  107.   int MouseUser;
  108. END;
  109.  
  110.  
  111. (* Das ist die neue Maus-Subroutine (diesmal in Pascal,   *)
  112. (* der Übersichtlichkeit halber). Sie entspricht der      *)
  113. (* seitherigen, allerdings werden die Mauskoordinaten     *)
  114. (* vom Videomodus abhängig bearbeitet.                    *)
  115.  
  116. PROCEDURE MyMouseSubRtn(Flags, CS, IP, AX, BX, CX, DX, SI,
  117.                         DI, DS, ES, BP: WORD); INTERRUPT;
  118. BEGIN
  119.   IF (ScreenMode = 3) OR (ScreenMode = 7) THEN BEGIN
  120.     CX := CX SHR 3;
  121.     DX := DX SHR 3;
  122.   END;
  123.   MouseButtons := BX;
  124.   MouseWhere.X := CX;
  125.   MouseWhere.Y := DX;
  126.   WITH EvQ^ DO
  127.     IF (AX AND $001E <> 0) AND (EventCount < 16) THEN BEGIN
  128.       WITH EventQueue[Index] DO BEGIN
  129.         What    := MemW[$0040:$006C];
  130.         Buttons := Lo(BX);
  131.         DOUBLE  := FALSE;
  132.         Where.X := CX;
  133.         Where.Y := DX;
  134.       END;
  135.       Index := Succ(Index) MOD 16;
  136.       Inc(EventCount);
  137.     END;
  138.   MouseIntFlag := 1;
  139. END;
  140.  
  141.  
  142. (* InitEvents installiert die neue Maus-Interruptroutine  *)
  143.  
  144. PROCEDURE InitEvents;
  145. BEGIN
  146.   Drivers.InitEvents;
  147.   IF MouseEvents THEN BEGIN
  148.     GetIntVec(MouseUser, MouseUserSave);
  149.     SetIntVec(MouseUser, @MyMouseSubRtn);
  150.     EvQ := Ptr(Seg(CursorLines), Ofs(CursorLines) + 2);
  151.     Index := 0;
  152.     ASM
  153.       MOV AX,000Ch
  154.       MOV CX,0FFFFh
  155.       MOV DX,SEG UserInterrupt
  156.       MOV ES,DX
  157.       MOV DX,OFFSET UserInterrupt
  158.       INT 33h
  159.    END;
  160.   END;
  161. END;
  162.  
  163.  
  164. PROCEDURE DoneEvents;
  165. BEGIN
  166.   Drivers.DoneEvents;
  167.   SetIntVec(MouseUser, MouseUserSave);
  168. END;
  169.  
  170.  
  171.  
  172. PROCEDURE GetKeyEvent(VAR Event: tEvent); ASSEMBLER;
  173. ASM
  174.   MOV AH,11h
  175.   INT 16h
  176.   MOV AX,0000h
  177.   MOV BX,AX
  178.   JE @@1
  179.   MOV AH,10h
  180.   INT 16h
  181.   XCHG BX,AX
  182.   MOV AX,10h
  183. @@1:
  184.   LES DI,Event
  185.   CLD
  186.   STOSW
  187.   XCHG BX,AX
  188.   STOSW
  189.   XOR AX,AX
  190.   STOSW
  191.   STOSW
  192. END;
  193.  
  194. END.
  195.  
  196.  
  197. (* ------------------------------------------------------ *)
  198. (*                   Ende von XEVENTS.PAS                 *)
  199.  
  200.