home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* JUMPS.PAS *)
- (* Prozedur- und Funktionsübergreifende Sprünge *)
- (* für Turbo-Pascal 6.0 *)
- (* (c) 1991 Stefan Brinkmann & DMV-Verlag *)
- (* ------------------------------------------------------ *)
- UNIT Jumps;
-
- {$F+}
-
- INTERFACE
-
- TYPE
- JumpBuf = RECORD
- BP, IP, CS, SP : WORD;
- END;
-
- FUNCTION InitJump(VAR Buf : JumpBuf) : WORD;
-
- PROCEDURE Jump(VAR Buf : JumpBuf; RetCode : WORD);
-
-
- IMPLEMENTATION
-
- FUNCTION InitJump;
- BEGIN
- ASM
- PUSH DS
- PUSH SS
- POP DS
- MOV SI,BP { SI := Offset alter BP auf Stack }
- LES DI,[BP+6] { ES:DI := @RegSave }
- CLD
- MOVSW { alten BP in RegSave speichern }
- MOVSW { alten IP " " " }
- MOVSW { altes CS " " " }
- MOV AX,SP
- ADD AX,$E { SP korrigieren -> AX = alter SP }
- STOSW { alten SP in RegSave speichern }
-
- MOV WORD PTR[BP-2],0
- { Rückgabewert InitJump := 0 }
- POP DS
- END;
- END;
-
- PROCEDURE Jump;
- VAR
- Ret : WORD; { entspricht Rückgabewert InitJump }
- BEGIN
- ASM
- PUSH DS
- LDS SI,SS:[BP+8] { DS:SI := @RegSave }
- ADD SI,4 { SI := Offset RegSave.CS }
- MOV BX,[SI+2] { BX := RegSave.SP }
- MOV DX,SS:[BP+6] { DX := RetCode }
- MOV SS:[BP-2],DX { Ret := RetCode }
- PUSH SS
- POP ES
- MOV DI,BX
- SUB DI,8 { DI := neue Stackpostion }
- STD
- MOVSW { RegSave.CS auf Stack schreiben }
- MOVSW { " .IP " " " }
- MOVSW { " .BP " " " }
- CLD
- POP DS
- MOV BP,BX
- SUB BP,$C { BP neu berechnen }
- POP AX { alten BP aus Stackrahmen holen }
- PUSH BP { neuen BP im Stackrahmen setzen }
- MOV SP,BP
- SUB SP,2 { neuer SP }
- END;
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von JUMPS.PAS *)
-