home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9101 / tricks / pascal / jumps / jumps.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1991-09-30  |  2.5 KB  |  80 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      JUMPS.PAS                         *)
  3. (*      Prozedur- und Funktionsübergreifende Sprünge      *)
  4. (*                     für Turbo-Pascal 6.0               *)
  5. (*        (c) 1991 Stefan Brinkmann & DMV-Verlag          *)
  6. (* ------------------------------------------------------ *)
  7. UNIT Jumps;
  8.  
  9. {$F+}
  10.  
  11. INTERFACE
  12.  
  13. TYPE
  14.   JumpBuf = RECORD
  15.               BP, IP, CS, SP : WORD;
  16.             END;
  17.  
  18.   FUNCTION InitJump(VAR Buf : JumpBuf) : WORD;
  19.  
  20.   PROCEDURE Jump(VAR Buf : JumpBuf; RetCode : WORD);
  21.  
  22.  
  23. IMPLEMENTATION
  24.  
  25.   FUNCTION InitJump;
  26.   BEGIN
  27.     ASM
  28.       PUSH    DS
  29.       PUSH    SS
  30.       POP     DS
  31.       MOV     SI,BP      { SI := Offset alter BP auf Stack }
  32.       LES     DI,[BP+6]  { ES:DI := @RegSave               }
  33.       CLD
  34.       MOVSW              { alten BP in RegSave speichern   }
  35.       MOVSW              { alten IP "     "        "       }
  36.       MOVSW              { altes CS "     "        "       }
  37.       MOV     AX,SP
  38.       ADD     AX,$E      { SP korrigieren -> AX = alter SP }
  39.       STOSW              { alten SP in RegSave speichern   }
  40.  
  41.       MOV     WORD PTR[BP-2],0
  42.                               { Rückgabewert InitJump := 0 }
  43.       POP     DS
  44.     END;
  45.   END;
  46.  
  47.   PROCEDURE Jump;
  48.   VAR
  49.     Ret : WORD;        { entspricht Rückgabewert InitJump  }
  50.   BEGIN
  51.     ASM
  52.       PUSH    DS
  53.       LDS     SI,SS:[BP+8]    { DS:SI := @RegSave          }
  54.       ADD     SI,4            { SI := Offset RegSave.CS    }
  55.       MOV     BX,[SI+2]       { BX := RegSave.SP           }
  56.       MOV     DX,SS:[BP+6]    { DX := RetCode              }
  57.       MOV     SS:[BP-2],DX    { Ret := RetCode             }
  58.       PUSH    SS
  59.       POP     ES
  60.       MOV     DI,BX
  61.       SUB     DI,8        { DI := neue Stackpostion        }
  62.       STD
  63.       MOVSW               { RegSave.CS auf Stack schreiben }
  64.       MOVSW               {    "   .IP  "    "       "     }
  65.       MOVSW               {    "   .BP  "    "       "     }
  66.       CLD
  67.       POP     DS
  68.       MOV     BP,BX
  69.       SUB     BP,$C       { BP neu berechnen               }
  70.       POP     AX          { alten BP aus Stackrahmen holen }
  71.       PUSH    BP          { neuen BP im Stackrahmen setzen }
  72.       MOV     SP,BP
  73.       SUB     SP,2        { neuer SP                       }
  74.     END;
  75.   END;
  76.  
  77. END.
  78. (* ------------------------------------------------------ *)
  79. (*               Ende von JUMPS.PAS                       *)
  80.