home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* INTERRPT.PAS *)
- (* Inline-Code zum residenten Terminieren des Programmes *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Interrpt;
- BEGIN
- INLINE(
- $80/$FC/$00/ (* Cmp Ah,00 ; wenn Char angefordert *)
- $74/$07/ (* Je ChrRqst ; residenten Code einlesen *)
- $5D/$5D/ (* Pop Bp/Pop Bp else Restore Bp & *)
- $2E/ (* Jump ; Original DOS Interrupt *)
- $FF/$2E/TSR_IntIP/ (* Jmp Far Cs:[TSR_IntIp] *)
-
- $FA / (* Cli ; Interrupts unterbinden *)
- $55/ (* Push Bp ; noch einmal fuer Regpak *)
- $BD/Regs/ (* Mov Bp,offset ; REGS Adresse *)
- $2E/$89/$46/$00/ (* CS:Mov [Bp+0],AX ; TSR Register sichern *)
- $2E/$89/$5E/$02/ (* Cs:Mov [Bp+2],Bx *)
- $2E/$89/$4E/$04/ (* CS:Mov [Bp+4],CX *)
- $2E/$89/$56/$06/ (* CS:Mov [Bp+6],DX *)
- $2E/$8F/$46/$08/ (* Pop Cs:[Bp+8] ; Bp vom Stack holen *)
- $2E/$89/$76/$0A/ (* CS:Mov [Bp+A],SI *)
- $2E/$89/$7E/$0C/ (* CS:Mov [Bp+C],DI *)
- $2E/$8C/$5E/$0E/ (* CS:Mov [Bp+E],DS *)
- $2E/$8C/$46/$10/ (* CS:Mov [Bp+10],ES *)
- $9C/ (* PUSHF ; Flags *)
- $2E/$8F/$46/$12/ (* POP Cs:[Bp+12] *)
-
- $2E/$80/$3E/TSR_InUse/$01/(* Cmp Cs:[Inuse],1 ; Inuse = True ? *)
- $74/$62/ (* Je ReCurin ; falls Ja, JUMP *)
-
- $2E/$8C/$16/DosSSeg/ (* Mov Cs:DosSSeg,SS *)
- $8C/$D6/ (* Mov Si,SS ; Es:=DOS Stack *)
- $8E/$C6/ (* Mov Es,Si *)
- $2E/$8E/$16/TSRSSeg/ (* Mov SS,Cs:TSRSSeg ; SS:=TSR Stack Segment *)
- $2E/$8E/$1E/TSRDseg/ (* Mov Ds,Cs:TSR_Ds ; DS:=TSR Data Segment *)
-
- $2E/$3B/$36/TSRSSeg/ (* Cmp Si,Cs:TSRSSeg ; If SS:=TSRSSeg then *)
- $89/$E6/ (* Mov Si,Sp ; Register unveraendert *)
- $74/$05/ (* Je $+5 ; lassen else Stack Ptr *)
- $3E/$8B/$36/$74/$01/ (* Mov Si,Ds:[174] ; Code an B2B (3.0x) *)
- $87/$F4/ (* Xchg Sp,Si ; neuer Stack Ptr *)
-
- $2E/$FF/$76/$00/ (* Push [Bp+0] Save Ax ; Orginal Interupts *)
- $2E/$FF/$76/$02/ (* Push [Bp+2] Save Bx ; die bei dem *)
- $2E/$FF/$76/$04/ (* Push [Bp+4] Save Cx ; Ruecksprung in das *)
- $2E/$FF/$76/$06/ (* Push [Bp+6] Save Dx ; aufrufende Programm *)
- $2E/$FF/$76/$0A/ (* Push [Bp+A] Save Si ; wiederhergestellt *)
- $2E/$FF/$76/$0C/ (* Push [Bp+C] Save Di ; werden muessen. *)
- $2E/$FF/$76/$0E/ (* Push [Bp+E] Save Ds *)
- $2E/$FF/$76/$10/ (* Push [Bp+10] Save Es *)
-
- $29/$C9/ (* Sub Cx,Cx ; Minimum des Stacks oder *)
- $29/$F1/ (* Sub Cx,Si ; 40 words sichern *)
- $D1/$E9/ (* Shr Cx,1 ; Stackbytes/2 *)
- $83/$F9/$40/ (* Cmp Cx,+40 *)
- $7E/$03/ (* Jle $+3 ; Stack Segment if kleiner *)
- $B9/$40/$00/ (* Mov Cx,40 ; als DOS Stack *)
- $2E/$89/$0E/StackSize/ (* Mov Cs:StackSize,Cx ; Stack Wert sichern *)
- $26/$FF/$34/ (* Push Es:[Si] TSR Stack := Dos Es:Si *)
- $46/$46/ (* Inc Si/Inc Si ; naechstes DOS Stack Word *)
- $E2/$F9/ (* Loop to Restack *)
- $56/ (* Push Si Save bottom of Dos Stack *)
- $2E/$8C/$5E/$0E/ (* Mov Cs:[Bp+E],Ds ; regs:=neues Data Segment*)
- $FB (* Sti ; Interrupts ermoeglichen *)
- );
-
- Intr (TSR_Int, Regs); (* Jetzt wird der neue Interrupt be- *)
- IF (Halfregs.Ah = TSR_Char) THEN (* nutzt, um die TSR Tastenkombination *)
- IF (NOT TSR_InUse) THEN (* abzufangen, sofern nicht InUse *)
- BEGIN
- TSR_InUse := TRUE;
- TSRPgm; (* hier startet das TSR-Programm *)
- WHILE (NOT KeyPressed);
- SaveRegs.Ax := 0 ;
- Intr(TSR_Int,SaveRegs);
- Regs.Ax := SaveRegs.Ax;
- TSR_InUse := FALSE;
- END;
-
- INLINE(
- $BD/Regs/ (* Mov Bp,offset REGS *)
- $2E/$8B/$46/$00/ (* CS:Mov Ax,[Bp+0] *)
- $2E/$8B/$5E/$02/ (* Cs:Mov Bx,[Bp+2] *)
- $2E/$8B/$4E/$04/ (* CS:Mov Cx,[Bp+4] *)
- $2E/$8B/$56/$06/ (* CS:Mov Dx,[Bp+6] *)
- $2E/$8B/$76/$0A/ (* CS:Mov Si,[Bp+A] *)
- $2E/$8B/$7E/$0C/ (* CS:Mov Di,[Bp+C] *)
- $2E/$8E/$5E/$0E/ (* CS:Mov DS,[Bp+E] *)
- $2E/$8E/$46/$10/ (* CS:Mov ES,[Bp+10] *)
- $2E/$FF/$76/$12/ (* Push Cs:[Bp+12] *)
-
- $EB/$01/ (* JMP $+3 ; ueberspringen: IRET *)
- $CF/ (* IRET ; POP IP/CS/Flags *)
- $0E/ (* PUSH CS ; Return *)
- $E8/$FB/$FF/ (* CALL CS:$-2 ; Pop Flags *)
- $2E/$80/$3E/TSR_InUse/$01/(* Cmp byte ptr Cs:[TSR_InUse],1 *)
- $74/$25/ (* Je *)
-
- $FA / (* Cli ; keine Interrupts mehr *)
- $5E/ (* Pop Si ; Stack wiederherstellen *)
- $2E/$8B/$0E/StackSize/ (* Mov Cx,Cs:StackSize *)
- $2E/$8E/$06/DosSSeg/ (* Mov ES,Cs:DosSSeg *)
- $4E/$4E/ (* Dec Si/Dec Si *)
- $26/$8F/$04/ (* Pop Es:[Si] Dos Stack := TSR Stack *)
- $E2/$F9/ (* Loop *)
- $89/$F5/ (* Mov Bp,Si *)
- (* AX enthaelt Rueckkehrstatus *)
- $07/ (* Pop Es *)
- $1F/ (* Pop Ds *)
- $5F/ (* Pop Di *)
- $5E/ (* Pop Si *)
- $5A/ (* Pop Dx *)
- $59/ (* Pop Cx *)
- $5B/ (* Pop Bx *)
- $44/$44/ (* Inc sp/Inc sp ; alten Ax Inhalt loeschen *)
- $89/$EC/ (* Mov Sp,Bp ; DOS Stack Ptr *)
- $2E/$8E/$16/DosSSeg/ (* Mov SS,Cs:DosSSeg ; DOS Stack uebergeben *)
-
- $5D/ (* Pop Bp ; alter DOS Sp loeschen *)
- $BD/Regs/ (* Mov Bp,offset REGS *)
- $2E/$FF/$76/$12/ (* Push Cs:[Bp+12] ; die Flags des letzten *)
- (* ; Interrupts. *)
- $EB/$01/ (* JMP $+3 ; ueberspringen: IRET *)
- $CF/ (* IRET ; POP IP/CS/Flags *)
- $0E/ (* PUSH CS ; Return *)
- $E8/$FB/$FF/ (* CALL CS:$-2 ; Pop Flags *)
-
- $5D/ (* Pop Bp ; alten BP holen *)
- $FB/ (* Sti ; Interrupts ermoeglichen*)
- $CA/$02/$00 (* Ret Far 002 ;alte Flags nicht mehr benoetigt*)
- );
- END;
- (* ----------------------------------------------------------------------- *)
- (* Ende von INTERRPT.PAS *)
-