Category : Files from Magazines
Archive   : ITP9003.ZIP
Filename : CATCHINT.PAS

 
Output of file : CATCHINT.PAS contained in archive : ITP9003.ZIP
PROGRAM CatchInt;

USES
Crt,Dos,Printer;

{This program illustrates how you can modify an
interrupt service routine to perform special
services for you.}

VAR
OldInt,OldExitProc: pointer;
IntCount: array[0..255] of byte;

PROCEDURE GoOldInt(OldIntVector: pointer);
INLINE (
$5B/ {POP BX - Get Segment}
$58/ {POP AX - Get Offset}
$89/ {MOV SP,BP}
$EC/
$5D/ {POP BP}
$07/ {POP ES}
$1F/ {POP DS}
$5F/ {POP DI}
$5E/ {POP SI}
$5A/ {POP DX}
$59/ {POP CX}
$87/ {XCHG SP,BP}
$EC/
$87/ {XCHG [BP],BX}
$5E/
$00/
$87/ {XCHG [BP+2],AX}
$46/
$02/
$87/ {XCHG SP,BP}
$EC/
$CB); {RETF}


{$F+}

PROCEDURE NewExitProc;

VAR I: byte;
VAR A: char;

FUNCTION Intr21Desc(IntNbr: byte): string;

VAR
St : string[30];

BEGIN
CASE IntNbr of
$25: St := 'Set Interrupt Vector';
$36: St := 'Get Disk Free Space';
$3C: St := 'Create File with Handle';
$3E: St := 'Close FILE';
$40: St := 'WriteFile or Device';
$41: St := 'Delete FILE';
$44: St := 'IOCTL';
$3D: St := 'Open File with Handle';
$3F: St := 'Read File or Device';
$42: St := 'Move File pointer';
ELSE
St := 'Unknown DOS Service'
END;
Intr21Desc := St;
END;


FUNCTION DecToHex(Deci: byte): string;

CONST
ConvStr: string[16] = '0123456789ABCDEF';
BEGIN
DecToHex := ConvStr[Deci div 16 + 1] +
ConvStr[Deci mod 16 + 1]
END;


BEGIN
ClrScr;
ExitProc := OldExitProc;
SetIntVec($21,OldInt);
WriteLn('Int # Description');
WriteLn(' # Times');
WriteLn;
FOR I:= 0 TO 255 DO
BEGIN
IF IntCount[I] <> 0 THEN
BEGIN
Write(DecToHex(I),'H');
Write(' ',IntCount[I]:3);
GotoXY(11,WhereY);
WriteLn(Intr21Desc(I))
END
END
END;


PROCEDURE NewInt(AX,BX,CX,DX,SI,
DI,SD,ES,BP: Word); INTERRUPT;

VAR AH: byte;

BEGIN
Sound(1220);Delay(10);NoSound;
AH := Hi(AX);
IntCount[AH] := IntCount[AH]+1;
GoOldInt(OldInt)
END;
{$F-}

{************ Main Program *****************}

VAR I: byte;
F: text;
TestStr: string[40];

BEGIN

ClrScr;

{Install new Exit PROCEDURE}

OldExitProc := ExitProc;
ExitProc := @NewExitProc;

{Install new Interrupt Vector}

GetIntVec($21, OldInt);
SetIntVec($21, @NewInt);

{******** Testing Section ***********}

WriteLn('Starting Testing');Delay(1000);

FillChar(IntCount,SizeOf(IntCount),#0);

FOR I:= 0 TO 255 DO
WriteLn('Testing 1'); {WriteLn's to screens}
{do not use the 21H }
{Interrupt }

Write('TYPE anything TO test keyboard: ');
ReadLn(TestStr);

Writeln('Disk Size ',
DiskSize(3)); {Uses Service 36H}


Assign (F,'TestFile');
Rewrite(f); {Uses Service 3CH,44H}

FOR I:=0 TO 255 DO
WriteLn(F,'This is only A test'); {Service 40H}
WriteLn(F,'This is A test too');
WriteLn(f,'Last test');

Close(f); {Uses Service 3EH,40H}

Assign(F,'TestFile');
Append(f); {Uses Service 3DH,3FH,42H,44H}
Close(F); {Uses Service 3EH,40H}

Assign(F,'TestFile');
Erase(f) {Uses Service 41H}
END.


  3 Responses to “Category : Files from Magazines
Archive   : ITP9003.ZIP
Filename : CATCHINT.PAS

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/