home *** CD-ROM | disk | FTP | other *** search
- 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.
-