burkett@csd4.csd.uwm.edu (Edward W Burkett) (01/02/90)
I am interested in learning how to write TSR programs and was wondering if someone could give me some hints. Since a picture (or in this case source code) is worth a thousand words, I was wondering if someone could send me (or post) an example of any source code in Pascal or Quick Basic that illustrates the technique. I don't care what the code does, something simple would be fine. Thanks a million in advance, Ed Burkett Dept. of Biological Sciences University of Wisconsin - Milwaukee
azarian@hpcc01.HP.COM (Randy Azarian) (01/04/90)
Following is a Turbo Pascal (4.0) TSR that will compile and execute. The
results of which are probably less than desirable. It converts the
blinking cursor on the PC to that of a static block (an inverse character
attribute, to be exact). Like I say, it compiles and executes, but when
the screen scrolls you won't be happy (probably). The only application
that is moderately tolerable was Walker, Richer, & Quinn's Reflection 7+
terminal emulator. It depends upon how badly you hate the blinking cursor.
This was something I started a while ago (at the request of my boss), and
never had the time to complete. Good luck. And if anyone does finish it
or has a good idea, please send it my way.
azarian@hpcc01.hp.com 415 857-5637
BTW, although I can't say for sure, but I have a feeling the results would be
totally unsatisfactory on a VGA screen without modification to the
CURSOR procedure (or its calls). I wrote it on a EGA screen with a
12Mhz 80286 Vectra ES/12 PC.
Also, since I never did finish it. It may have extraneous variable
declarations that I used in experimentation.
{$M 16384,0,6000}
uses dos, crt;
const timer = $1C;
type screenptr = ^screentype;
screentype = array[1..25,1..80] of record
ch : char;
5t : byte;
end;
var vector : pointer;
tempx, tempy, tempchar, i : integer;
procedure cursor(startline,endline:integer);
(* this procedure alters size of the cursor off/on *)
(* stype and ttype define scan lines of cursor *)
var regs : registers;
begin
fillchar(regs,sizeof(regs),0);
regs.ah:=$01;
regs.cl:=endline;
regs.ch:=startline;
intr($10, regs);
end;
function keyready : boolean;
var regs : registers;
begin
fillchar(regs,sizeof(regs),0);
regs.ah := $01;
intr($16,regs);
if (regs.flags and fzero) = fzero then keyready := true
else keyready := false;
end;
(***********)
procedure IntHandler(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP : word); interrupt;
var regs : registers;
procedure cli; inline($FA);
procedure sti; inline($FB);
begin
cli; { disable interrupts }
cursor(16,0); { turn cursor off, diff screens may require diff parms }
if keyready then
if (wherex <> tempx) or (wherey <> tempy) then
begin
mem[$B800:(80*(tempy-1)+tempx-1)*2+1] := tempchar;
tempchar := mem[$B800:(80*(wherey-1)+wherex-1)*2+1];
mem[$B800:(80*(wherey-1)+wherex-1)*2+1] :=
not mem[$B800:(80*(wherey-1)+wherex-1)*2+1] - 128; { inverse attrib }
tempx := wherex; tempy := wherey;
end;
sti; { enable interrupts }
end;
(***********)
begin
clrscr;
cursor(16,0);
getintvec(timer,vector);
setintvec(timer,@inthandler);
keep(exitcode);
end.