home *** CD-ROM | disk | FTP | other *** search
- (* ---------------------------------- *)
- (* MAKEINT.INC *)
- (* Prozeduren zur Interrupt-Hand- *)
- (* habung. *)
- (* ---------------------------------- *)
-
- TYPE
- IntEntry_ =
- RECORD
- Offset, Segment : INTEGER;
- END;
-
- (* Interrupts vom Interrupt-Chip wieder
- zulassen. *)
- PROCEDURE IntChipRestart;
- BEGIN
- Port[$20] := $20;
- END;
-
- (* Werte der aktivier- und passivier-
- baren Hardware-Interrupts: *)
- CONST
- IntChipMaskPort = $21;
- IntChipTimerMask = $01;
- IntChipKeyboardMask = $02;
- IntChipCassetteMask = $03;
- IntChipCom2Mask = $08;
- IntChipCom1Mask = $10;
- IntChipBscMask = $18;
- IntChipDiskMask = $20;
- IntChipFloppyMask = $40;
- IntChipPrinterMask = $80;
-
- (* Unterbrechung zulassen: *)
- PROCEDURE IntChipEnable (Mask: Byte);
- VAR Section : CriticalSection_;
- BEGIN
- CriticalBegin (Section);
- Port [IntChipMaskPort]:=
- Port [IntChipMaskPort]
- AND NOT Mask;
- CriticalEnd (Section);
- END;
-
- (* Unterbrechung unterbinden: *)
- PROCEDURE IntChipDisable (Mask: Byte);
- VAR Section : CriticalSection_;
- BEGIN
- CriticalBegin (Section);
- Port [IntChipMaskPort]:=
- Port [IntChipMaskPort]
- OR Mask;
- CriticalEnd (Section);
- END;
-
- (* die Interrupt-Vektoren: *)
- CONST
- IntPrintScreen = $05;
- IntHardwareTimer = $08;
- IntHardwareKeyboard = $09;
- IntCassette = $0A;
- IntCom2 = $0B;
- IntBscReceive = $0B;
- IntCom1 = $0C;
- IntBscSend = $0C;
- IntHardwareDisk = $0D;
- IntHardwareDiskette = $0E;
- IntCentronics = $0F;
- IntKeyBoard = $16;
- IntPrinter = $17;
- IntBootstrap = $19;
- IntTimeOfDay = $1A;
- IntCtrlBreak = $1B;
- IntTimer = $1C;
-
- (* Interrupt-Vektor holen: *)
- PROCEDURE
- IntGet (IntNr: Byte;
- VAR Segment, Offset : Integer);
- VAR Regs8088 : Regs8088_;
- BEGIN
- WITH Regs8088 DO
- BEGIN
- Ah:= $35;
- Al:= IntNr;
- MsDos (Regs8088);
- Segment:= Es;
- Offset:= Bx;
- END;
- END;
-
- (* Interrupt-Vektor setzen: *)
- PROCEDURE
- IntSet (IntNr: Byte;
- Segment, Offset : INTEGER);
- VAR Regs8088 : Regs8088_;
- SaveDs : INTEGER
- ABSOLUTE Cseg:$00A0;
- BEGIN
- SaveDs:= Dseg;
- WITH Regs8088 DO
- BEGIN
- Ah:= $25;
- Al:= IntNr;
- Ds:= Segment;
- DX:= Offset;
- MsDos (Regs8088);
- END;
- END;
-
- (* Interrupt-Routine resident machen: *)
- PROCEDURE MakeResident;
- VAR Regs8088 : Regs8088_;
- BEGIN
- WITH Regs8088 DO
- BEGIN
- Ah:= $31;
- Dx:= Seg (HeapPtr^)
- - Cseg
- + ((Ofs (HeapPtr^)+15)
- SHR 4);
- MsDos (Regs8088);
- END;
- END;
-
- (* ---------------------------------- *)
- (* Ende von MAKEINT.INC *)