Potrzebuję napisać w Turbo Pascal prosty program TSR działający w czystym DOSie, a dokładnie w emulatorze DosBox.
Napisałem taki próbny program:
{$M $800,0,0 } { 2K stack, no heap }
uses Crt, Dos;
var
KbdIntVec : Procedure;
{$F+}
procedure Keyclick; interrupt;
var X,Y:Integer;
K:Byte;
begin
K:=Port[$60];
if K < $80 then
begin
If K=44 Then { Klawisz "z" - pojawienie sie gwiazdki w losowym miejscu i pisniecie }
Begin
X:=WhereX;
Y:=WhereY;
GotoXY(Random(79),Random(24));
Write('*');
GotoXY(X,Y);
Sound(1000);
Delay(10);
Nosound;
End;
If K=45 Then { Klawisz "x" - unload programu - JAK TO ZROBIC ??? }
Begin
SetIntVec($9,@KbdIntVec);
End;
end;
inline ($9C); { PUSHF -- Push flags }
KbdIntVec;
end;
{$F-}
begin
GetIntVec($9,@KbdIntVec);
SetIntVec($9,Addr(Keyclick));
Keep(0);
end.
Tutaj jest tak, że podczas pracy w TSR, normalnie pracuje się w systemie DOS, ale każdorazowe wciśnięcie klawisza "z" powoduje wyświetlenie gwiazdki, a wciśnięcie klawisza "x" ma powodować usunięcie programu TSR. Udało mi się to zrobić, że przywraca oryginalny program obsługi przerwania dla klawiatury, ale program cały czas "siedzi" w pamieci (widać po wywołaniu komendy "MEM"). Próbowałem z instrukcją "Halt", ale nie wychodziło. Jak zrobić usunięcie programu z pamięci tak, że po wciśnięciu "x" program całkowicie zwalnia zajmowaną przez siebie pamiec?