home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1991-09-23 | 3.9 KB | 178 lines |
- (*========================================================*)
- (* TSR.MOD *)
- (* Copyright (C) 1991 P. Engels & DOS-toolbox *)
- (*--------------------------------------------------------*)
- (* Compiler: Topspeed Modula-2 Version 2.XX *)
- (*========================================================*)
-
- IMPLEMENTATION MODULE TSR;
-
- (*# call (seg_name => null) *)
-
- (*# data (seg_name => null) *)
-
- (*# check (nil_ptr => off,
- index => off,
- stack => off,
- range => off,
- overflow => off),
- debug (vid => off) *)
-
- FROM SYSTEM IMPORT Ret, Registers, HeapBase, A2;
- FROM Lib IMPORT Intr, Dos, SetReturnCode, PSP, Speaker;
-
- TYPE
- A3 = ARRAY [0..2] OF SHORTCARD;
-
- (*# save,
- call (near_call => off,
- reg_param => (ax),
- reg_return => (ax)) *)
-
- KeyProc = PROCEDURE (CARDINAL): CARDINAL;
-
- (*# restore *)
-
- (*# data (volatile => on) *)
-
- VAR
- PopUpSSeg,
- PopUpSOfs : CARDINAL;
- SystemSSeg,
- SystemSOfs : CARDINAL;
- PopUp_ : PROC;
- HotKey_ : CARDINAL;
- Int16Save : KeyProc;
-
- (*# save,
- call (reg_return => (ax)) *)
-
- PROCEDURE SSeg(): CARDINAL = A3 (8CH, 0D0H, Ret);
-
- PROCEDURE SOfs(): CARDINAL = A3 (8BH, 0C4H, Ret);
-
- PROCEDURE BasePtr(): CARDINAL = A3 (8BH, 0C5H, Ret);
-
- (*# call (inline => on) *)
-
- PROCEDURE GetFlags(): BITSET = A2 (9CH, 58H);
-
- (*# call (inline => off) *)
-
- (*# restore *)
-
- PROCEDURE RegisterOfs(): CARDINAL;
- BEGIN
- RETURN BasePtr() + 2
- END RegisterOfs;
-
- PROCEDURE GetInt(nr: SHORTCARD;
- VAR ISR: InterruptRoutine);
- VAR
- dummy: POINTER 0 TO InterruptRoutine;
- BEGIN
- dummy := NearADDRESS(CARDINAL(nr) << 2);
- ISR := dummy^
- END GetInt;
-
- PROCEDURE SetInt(nr: SHORTCARD;
- ISR: InterruptRoutine);
- VAR
- dummy: POINTER 0 TO InterruptRoutine;
- BEGIN
- dummy := NearADDRESS(CARDINAL(nr) << 2);
- dummy^ := ISR
- END SetInt;
-
- PROCEDURE Keep(ReturnCode: SHORTCARD);
- VAR
- r : Registers;
- BEGIN
- SetReturnCode(ReturnCode);
- r.AH := 31H;
- r.DX := HeapBase - PSP;
- Dos(r)
- END Keep;
-
- (*# save,
- call (inline => on,
- reg_saved => (ds),
- reg_param => (ax)) *)
-
- PROCEDURE LoadSS (SS: CARDINAL) = A2 (8EH, 0D0H);
-
- PROCEDURE LoadSP (SP: CARDINAL) = A2 (8BH, 0E0H);
-
- PROCEDURE SwitchStack;
- BEGIN
- SystemSSeg := SSeg();
- SystemSOfs := SOfs();
- LoadSS(PopUpSSeg);
- LoadSP(PopUpSOfs)
- END SwitchStack;
-
- PROCEDURE SwitchBack;
- BEGIN
- LoadSS(SystemSSeg);
- LoadSP(SystemSOfs)
- END SwitchBack;
-
- (*# restore *)
-
- (*# save,
- call (interrupt => on,
- same_ds => off,
- near_call => off) *)
-
- PROCEDURE Int16;
-
- VAR
- IntReg: RegisterPtr;
- CurrInt16: InterruptRoutine;
- Read: BOOLEAN;
- BEGIN
- IntReg := [SSeg() : RegisterOfs()];
- WITH IntReg^ DO
- Read := BITSET(AH)*BITSET(3) = {};
- PushF;
- AX := Int16Save(AX);
- Flags := GetFlags();
- IF Read THEN
- Speaker(1000, 100);
- IF (AX = HotKey_) THEN
- SwitchStack;
- GetInt(16H, CurrInt16);
- SetInt(16H, InterruptRoutine(Int16Save));
- PopUp_;
- SetInt(16H, CurrInt16);
- SwitchBack
- END
- END
- END
- END Int16;
-
- (* restore *)
-
- PROCEDURE MakeResident(PopUp: PROC;
- HotKey: CARDINAL);
- BEGIN
- PopUp_ := PopUp;
- HotKey_ := HotKey;
- GetInt(16H, InterruptRoutine(Int16Save));
- SetInt(16H, Int16);
- Keep(0)
- END MakeResident;
-
- BEGIN
- PopUpSSeg := SSeg();
- (*%T _fcall*)
- PopUpSOfs := SOfs() + 4;
- (*%E*)
- (*%F _fcall*)
- PopUpSOfs := SOfs() + 2
- (*%E*)
- END TSR.
-
- (*========================================================*)
- (* Ende von TSR.MOD *)