home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 08 / tsr / interrpt.inc next >
Encoding:
Text File  |  1987-06-02  |  8.6 KB  |  136 lines

  1. (* ----------------------------------------------------------------------- *)
  2. (*                           INTERRPT.PAS                                  *)
  3. (*          Inline-Code zum residenten Terminieren des Programmes          *)
  4. (* ----------------------------------------------------------------------- *)
  5. PROCEDURE Interrpt;
  6. BEGIN
  7.   INLINE(
  8.   $80/$FC/$00/              (* Cmp Ah,00        ; wenn Char angefordert    *)
  9.   $74/$07/                  (* Je   ChrRqst     ; residenten Code einlesen *)
  10.   $5D/$5D/                  (* Pop  Bp/Pop Bp else  Restore Bp &           *)
  11.   $2E/                      (* Jump             ; Original DOS Interrupt   *)
  12.   $FF/$2E/TSR_IntIP/        (* Jmp Far Cs:[TSR_IntIp]                      *)
  13.  
  14.   $FA /                     (* Cli              ; Interrupts unterbinden   *)
  15.   $55/                      (* Push   Bp        ; noch einmal fuer Regpak  *)
  16.   $BD/Regs/                 (* Mov    Bp,offset ; REGS Adresse             *)
  17.   $2E/$89/$46/$00/          (* CS:Mov [Bp+0],AX ; TSR Register sichern     *)
  18.   $2E/$89/$5E/$02/          (* Cs:Mov [Bp+2],Bx                            *)
  19.   $2E/$89/$4E/$04/          (* CS:Mov [Bp+4],CX                            *)
  20.   $2E/$89/$56/$06/          (* CS:Mov [Bp+6],DX                            *)
  21.   $2E/$8F/$46/$08/          (* Pop    Cs:[Bp+8] ; Bp vom Stack  holen      *)
  22.   $2E/$89/$76/$0A/          (* CS:Mov [Bp+A],SI                            *)
  23.   $2E/$89/$7E/$0C/          (* CS:Mov [Bp+C],DI                            *)
  24.   $2E/$8C/$5E/$0E/          (* CS:Mov [Bp+E],DS                            *)
  25.   $2E/$8C/$46/$10/          (* CS:Mov [Bp+10],ES                           *)
  26.   $9C/                      (* PUSHF           ; Flags                     *)
  27.   $2E/$8F/$46/$12/          (* POP Cs:[Bp+12]                              *)
  28.  
  29.   $2E/$80/$3E/TSR_InUse/$01/(* Cmp  Cs:[Inuse],1   ; Inuse = True ?        *)
  30.   $74/$62/                  (* Je   ReCurin        ; falls Ja, JUMP        *)
  31.  
  32.   $2E/$8C/$16/DosSSeg/      (* Mov  Cs:DosSSeg,SS                          *)
  33.   $8C/$D6/                  (* Mov  Si,SS         ; Es:=DOS Stack          *)
  34.   $8E/$C6/                  (* Mov  Es,Si                                  *)
  35.   $2E/$8E/$16/TSRSSeg/      (* Mov  SS,Cs:TSRSSeg ; SS:=TSR Stack Segment  *)
  36.   $2E/$8E/$1E/TSRDseg/      (* Mov  Ds,Cs:TSR_Ds  ; DS:=TSR Data Segment   *)
  37.  
  38.   $2E/$3B/$36/TSRSSeg/      (* Cmp  Si,Cs:TSRSSeg ; If SS:=TSRSSeg then    *)
  39.   $89/$E6/                  (* Mov  Si,Sp         ; Register unveraendert  *)
  40.   $74/$05/                  (* Je   $+5           ; lassen else Stack Ptr  *)
  41.   $3E/$8B/$36/$74/$01/      (* Mov  Si,Ds:[174]   ; Code an B2B (3.0x)     *)
  42.   $87/$F4/                  (* Xchg Sp,Si         ; neuer Stack Ptr        *)
  43.  
  44.   $2E/$FF/$76/$00/          (* Push [Bp+0]  Save Ax  ; Orginal Interupts   *)
  45.   $2E/$FF/$76/$02/          (* Push [Bp+2]  Save Bx  ; die bei dem         *)
  46.   $2E/$FF/$76/$04/          (* Push [Bp+4]  Save Cx  ; Ruecksprung in das  *)
  47.   $2E/$FF/$76/$06/          (* Push [Bp+6]  Save Dx  ; aufrufende Programm *)
  48.   $2E/$FF/$76/$0A/          (* Push [Bp+A]  Save Si  ; wiederhergestellt   *)
  49.   $2E/$FF/$76/$0C/          (* Push [Bp+C]  Save Di  ; werden muessen.     *)
  50.   $2E/$FF/$76/$0E/          (* Push [Bp+E]  Save Ds                        *)
  51.   $2E/$FF/$76/$10/          (* Push [Bp+10] Save Es                        *)
  52.  
  53.   $29/$C9/                  (* Sub  Cx,Cx  ; Minimum des Stacks oder       *)
  54.   $29/$F1/                  (* Sub  Cx,Si  ; 40 words sichern              *)
  55.   $D1/$E9/                  (* Shr  Cx,1   ; Stackbytes/2                  *)
  56.   $83/$F9/$40/              (* Cmp  Cx,+40                                 *)
  57.   $7E/$03/                  (* Jle  $+3    ; Stack Segment if kleiner      *)
  58.   $B9/$40/$00/              (* Mov  Cx,40  ; als DOS Stack                 *)
  59.   $2E/$89/$0E/StackSize/    (* Mov  Cs:StackSize,Cx ; Stack Wert sichern   *)
  60.   $26/$FF/$34/              (* Push Es:[Si] TSR Stack := Dos Es:Si         *)
  61.   $46/$46/                  (* Inc  Si/Inc Si ; naechstes DOS Stack Word   *)
  62.   $E2/$F9/                  (* Loop to Restack                             *)
  63.   $56/                      (* Push Si            Save bottom of Dos Stack *)
  64.   $2E/$8C/$5E/$0E/          (* Mov  Cs:[Bp+E],Ds ; regs:=neues Data Segment*)
  65.   $FB                       (* Sti            ; Interrupts ermoeglichen    *)
  66.   );
  67.  
  68.   Intr (TSR_Int, Regs);             (* Jetzt wird der neue Interrupt be-   *)
  69.   IF (Halfregs.Ah = TSR_Char) THEN  (* nutzt, um die TSR Tastenkombination *)
  70.     IF (NOT TSR_InUse) THEN         (* abzufangen, sofern nicht InUse      *)
  71.       BEGIN
  72.         TSR_InUse := TRUE;
  73.         TSRPgm;                     (* hier startet das TSR-Programm       *)
  74.         WHILE (NOT KeyPressed);
  75.         SaveRegs.Ax := 0 ;
  76.         Intr(TSR_Int,SaveRegs);
  77.         Regs.Ax := SaveRegs.Ax;
  78.         TSR_InUse := FALSE;
  79.       END;
  80.  
  81.   INLINE(
  82.   $BD/Regs/                 (* Mov    Bp,offset REGS                       *)
  83.   $2E/$8B/$46/$00/          (* CS:Mov Ax,[Bp+0]                            *)
  84.   $2E/$8B/$5E/$02/          (* Cs:Mov Bx,[Bp+2]                            *)
  85.   $2E/$8B/$4E/$04/          (* CS:Mov Cx,[Bp+4]                            *)
  86.   $2E/$8B/$56/$06/          (* CS:Mov Dx,[Bp+6]                            *)
  87.   $2E/$8B/$76/$0A/          (* CS:Mov Si,[Bp+A]                            *)
  88.   $2E/$8B/$7E/$0C/          (* CS:Mov Di,[Bp+C]                            *)
  89.   $2E/$8E/$5E/$0E/          (* CS:Mov DS,[Bp+E]                            *)
  90.   $2E/$8E/$46/$10/          (* CS:Mov ES,[Bp+10]                           *)
  91.   $2E/$FF/$76/$12/          (* Push Cs:[Bp+12]                             *)
  92.  
  93.   $EB/$01/                  (* JMP $+3           ; ueberspringen: IRET     *)
  94.   $CF/                      (* IRET              ; POP IP/CS/Flags         *)
  95.   $0E/                      (* PUSH CS           ; Return                  *)
  96.   $E8/$FB/$FF/              (* CALL CS:$-2       ; Pop Flags               *)
  97.   $2E/$80/$3E/TSR_InUse/$01/(* Cmp  byte ptr Cs:[TSR_InUse],1              *)
  98.   $74/$25/                  (* Je                                          *)
  99.  
  100.   $FA /                     (* Cli              ; keine Interrupts mehr    *)
  101.   $5E/                      (* Pop Si            ; Stack wiederherstellen  *)
  102.   $2E/$8B/$0E/StackSize/    (* Mov Cx,Cs:StackSize                         *)
  103.   $2E/$8E/$06/DosSSeg/      (* Mov ES,Cs:DosSSeg                           *)
  104.   $4E/$4E/                  (* Dec Si/Dec Si                               *)
  105.   $26/$8F/$04/              (* Pop Es:[Si]       Dos Stack := TSR Stack    *)
  106.   $E2/$F9/                  (* Loop                                        *)
  107.   $89/$F5/                  (* Mov Bp,Si                                   *)
  108.                             (* AX enthaelt Rueckkehrstatus                 *)
  109.   $07/                      (* Pop  Es                                     *)
  110.   $1F/                      (* Pop  Ds                                     *)
  111.   $5F/                      (* Pop  Di                                     *)
  112.   $5E/                      (* Pop  Si                                     *)
  113.   $5A/                      (* Pop  Dx                                     *)
  114.   $59/                      (* Pop  Cx                                     *)
  115.   $5B/                      (* Pop  Bx                                     *)
  116.   $44/$44/                  (* Inc sp/Inc sp    ; alten Ax Inhalt loeschen *)
  117.   $89/$EC/                  (* Mov  Sp,Bp         ; DOS Stack Ptr          *)
  118.   $2E/$8E/$16/DosSSeg/      (* Mov  SS,Cs:DosSSeg ; DOS Stack uebergeben   *)
  119.  
  120.   $5D/                      (* Pop Bp             ; alter DOS Sp loeschen  *)
  121.   $BD/Regs/                 (* Mov Bp,offset REGS                          *)
  122.   $2E/$FF/$76/$12/          (* Push Cs:[Bp+12]    ; die Flags des letzten  *)
  123.                             (*                    ; Interrupts.            *)
  124.   $EB/$01/                  (* JMP $+3            ; ueberspringen: IRET    *)
  125.   $CF/                      (* IRET               ; POP IP/CS/Flags        *)
  126.   $0E/                      (* PUSH CS            ; Return                 *)
  127.   $E8/$FB/$FF/              (* CALL CS:$-2        ; Pop Flags              *)
  128.  
  129.   $5D/                      (* Pop Bp             ; alten BP holen         *)
  130.   $FB/                      (* Sti                ; Interrupts ermoeglichen*)
  131.   $CA/$02/$00               (* Ret Far 002 ;alte Flags nicht mehr benoetigt*)
  132.   );
  133. END;
  134. (* ----------------------------------------------------------------------- *)
  135. (*                           Ende von INTERRPT.PAS                         *)
  136.