[Back to INTERRUP SWAG index] [Back to Main SWAG index] [Original]
{$R-,S+,I+,D+,T+,F-,V+,B-,N-,L+ }
{$M 4096,0,0 }
program interrupt_table (input,output);
{
A Program that displays all interrupt vectors.
Version 1.00 - 03/10/88 - First release
Kevin Mess
PO Box 35
Boulder City, NV 89005
Compuserve 71121,3360
}
uses
crt,dos,cursors; { Cursors unit as written by Scott Bussinger }
const
bell = ^G;
type
string4 = string [4];
keyset = (ESC,PGUP,PGDN,nothing);
pointer_rec = record
case integer of
0 : (address : pointer);
1 : (offset, segment : word)
end; { record }
screentype = record
position : array [1..4000] of byte;
x,y : byte;
end; { record }
var
vector : array [$00..$FF] of pointer_rec absolute $0000:0000;
colorscreen : screentype absolute $B800:0000;
monoscreen : screentype absolute $B000:0000;
savedscreen : screentype;
intnumber : byte;
finished : Boolean;
{*************************************}
function hex (decimal : word) : string4;
const
hexdigit : array [$0..$F] of char = '0123456789ABCDEF';
var
temp : string4;
begin
temp := '';
temp := hexdigit [ hi (decimal) div 16 ] +
hexdigit [ hi (decimal) mod 16 ] +
hexdigit [ lo (decimal) div 16 ] +
hexdigit [ lo (decimal) mod 16 ] ;
hex := temp
end;
{*************************************}
procedure frame (x1,y1,x2,y2 : byte);
const
upperleft = #201;
lowerleft = #200;
upperright = #187;
lowerright = #188;
horizontal = #205;
vertical = #186;
var
i : byte;
begin
gotoxy (x1-1,y1-1);
write (upperleft);
gotoxy (x2+1,y1-1);
write (upperright);
gotoxy (x1-1,y2+1);
write (lowerleft);
gotoxy (x2+1,y2+1);
write (lowerright);
for i := x1 to x2 do
begin
gotoxy (i,y1-1);
write (horizontal);
gotoxy (i,y2+1);
write (horizontal)
end;
for i := y1 to y2 do
begin
gotoxy (x1-1,i);
write (vertical);
gotoxy (x2+1,i);
write (vertical)
end;
end; { frame }
{*************************************}
procedure display_screen (first_intnumber : byte);
var
x,y,
last_intnumber,
intnumber : byte;
begin { display_screen }
last_intnumber := first_intnumber + $3F;
x := 5;
y := 1;
for intnumber := first_intnumber to last_intnumber do
with vector [intnumber] do
begin
gotoxy (x,y);
write (copy(hex(intnumber),3,2),hex(segment):6,':',hex(offset));
inc (y);
if ((intnumber + 1) mod $10) = 0 then
if intnumber <> last_intnumber then
begin
inc (x,19);
y := 1
end
end; { with }
end; { display_screen }
{*************************************}
function endkey : keyset;
var
anykey : char;
exit : keyset;
begin
repeat
exit := nothing;
anykey := readkey;
if anykey = #0 then
anykey := readkey;
case anykey of
#27 : exit := ESC;
#73 : exit := PGUP;
#81 : exit := PGDN;
else write (bell);
end; { case }
until exit in [ESC,PGUP,PGDN];
endkey := exit
end;
{*************************************}
procedure int_table (intnumber : byte);
begin { int_table }
if monodisplay then
savedscreen := monoscreen
else
begin
savedscreen := colorscreen;
textcolor (white);
textbackground (blue)
end;
savedscreen.x := wherex;
savedscreen.y := wherey;
makecursor (nocursor);
frame (2,2,79,19);
window (2,2,79,19);
clrscr;
gotoxy (12,18);
write ('PgUp - Previous Page, PgDn - Next Page, Esc to Exit');
finished := FALSE;
repeat
display_screen (intnumber);
case endkey of
PGUP : if intnumber >= $40 then
dec (intnumber,$40)
else
intnumber := $C0;
PGDN : if intnumber <= $80 then
inc (intnumber,$40)
else
intnumber := $00;
ESC : finished := TRUE
end { case }
until finished;
window (1,1,80,25);
if monodisplay then
monoscreen := savedscreen
else
colorscreen := savedscreen;
gotoxy (savedscreen.x,savedscreen.y);
makecursor (restorecursor)
end; { int_table }
{*************************************}
begin { main }
intnumber := $00;
int_table (intnumber)
end. { main }
[Back to INTERRUP SWAG index] [Back to Main SWAG index] [Original]