<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=14418&amp;view=findpost&amp;p=122294</guid>
        <pubDate>Sun, 27 Jul 2003 14:13:13 +0000</pubDate>
        <title>Резидент с выгрузкой</title>
        <link>https://forum.sources.ru/index.php?showtopic=14418&amp;view=findpost&amp;p=122294</link>
        <description><![CDATA[vot: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">- RU.PASCAL (2:5021/4.22) --------------------------------------- RU.PASCAL -</div><div class="code_line">&nbsp;From : Alexey Pavluchenko &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2:463/416.256 &nbsp; 22 Jun 03 &nbsp;12:31:28</div><div class="code_line">&nbsp;To &nbsp; : Sanya Petrochenko &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 29 Jun 03 &nbsp;16:00:40</div><div class="code_line">&nbsp;Subj : Расскажите</div><div class="code_line">-----------------------------------------------------------------------------</div><div class="code_line">Hola, Sanya!</div><div class="code_line">Sanya Petrochenko (21 Jun 2003 at 01:18) wrote to Eugeny Fedorenko:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;SP&#62; Сложность в том, что pезиденты в Туpбо-Паскале не выгpужаются из</div><div class="code_line">&nbsp;SP&#62; памяти, а пpимеp можно найти из хелпа по (Ctrl+F1) к пpоцедуpе</div><div class="code_line">&nbsp;SP&#62; KEEP.</div><div class="code_line">&nbsp;</div><div class="code_line">Можно и выгружать. Было бы желание :)</div><div class="code_line">&nbsp;</div><div class="code_line">========== Cut ==========</div><div class="code_line">(* simptsr.pas *)</div><div class="code_line">&nbsp;</div><div class="code_line">(* Simple TSR example. When you run this program at first *)</div><div class="code_line">(* time, it installs itself into memory and then changes &nbsp;*)</div><div class="code_line">(* border color each time when Ctrl+D is pressed. When &nbsp; &nbsp;*)</div><div class="code_line">(* launched next time, it uninstalls itself from memory. &nbsp;*)</div><div class="code_line">&nbsp;</div><div class="code_line">(* Copyleft (C) 1999 by Asp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *)</div><div class="code_line">&nbsp;</div><div class="code_line">program SimpTSR;</div><div class="code_line">{$M 1024,0,0}</div><div class="code_line">&nbsp;</div><div class="code_line">uses DOS;</div><div class="code_line">var OldInt88,OldInt09:pointer; &nbsp;(* Saved interrupt vectors *)</div><div class="code_line">&nbsp;&nbsp; &nbsp;TSRPSP:word; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(* Resident copy PSP &nbsp; &nbsp; &nbsp; *)</div><div class="code_line">&nbsp;&nbsp; &nbsp;Installed:boolean; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(* Installed flag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*)</div><div class="code_line">&nbsp;</div><div class="code_line">procedure NewInt88;external; &nbsp; &nbsp;(* This one is written in &nbsp;*)</div><div class="code_line">{$L INT88.OBJ} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(* outline assembler :) &nbsp; &nbsp;*)</div><div class="code_line">&nbsp;</div><div class="code_line">function &nbsp;GetKeyStatus(Key:word):boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;GetKeyStatus:=((MemW[Seg0040:] and Key)&#60;&#62;0);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure NewInt09;interrupt;</div><div class="code_line">const Switch:boolean=false;</div><div class="code_line">begin</div><div class="code_line">&nbsp;if ((Port[] and F)=32) &nbsp; &nbsp;(* &#39;D&#39; is pressed &nbsp;*)</div><div class="code_line">&nbsp;&nbsp; &nbsp;and GetKeyStatus(4) &nbsp; &nbsp; &nbsp; &nbsp; (* Ctrl is pressed *)</div><div class="code_line">&nbsp;then begin</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; mov ax,{text}B00</div><div class="code_line">&nbsp;&nbsp; cmp Switch,true</div><div class="code_line">&nbsp;&nbsp; je @@ClearBorder</div><div class="code_line">&nbsp;&nbsp; mov Switch,true</div><div class="code_line">&nbsp;&nbsp; mov bx,14</div><div class="code_line">&nbsp;&nbsp; jmp @@Int10</div><div class="code_line">&nbsp;&nbsp;@@ClearBorder:</div><div class="code_line">&nbsp;&nbsp; mov Switch,false</div><div class="code_line">&nbsp;&nbsp; xor bx,bx</div><div class="code_line">&nbsp;&nbsp;@@Int10:</div><div class="code_line">&nbsp;&nbsp; int </div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;while (Port[] and F)=32 do;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;asm</div><div class="code_line">&nbsp;&nbsp;pushf</div><div class="code_line">&nbsp;&nbsp;call OldInt09</div><div class="code_line">&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Install;</div><div class="code_line">begin</div><div class="code_line">&nbsp;GetIntVec(,OldInt09);</div><div class="code_line">&nbsp;SetIntVec(,@NewInt88);</div><div class="code_line">&nbsp;SetIntVec(,@NewInt09);</div><div class="code_line">&nbsp;WriteLn(&#39;SIMPTSR installed. Press Ctrl+D to change border color.&#39;);</div><div class="code_line">&nbsp;SwapVectors;</div><div class="code_line">&nbsp;Keep(0);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Unload;</div><div class="code_line">var EnvSeg:word;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Error:boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;EnvSeg:=MemW[TSRPSP:C]; &nbsp; &nbsp; &nbsp;(* Resident copy environment *)</div><div class="code_line">&nbsp;if (Mem[TSRPSP-1:0]&#60;&#62;77) or (Mem[EnvSeg-1:0]&#60;&#62;77) then begin</div><div class="code_line">&nbsp;&nbsp;WriteLn(&#39;MCB corrupted - something is wrong!&#39;);</div><div class="code_line">&nbsp;&nbsp;Halt(255); &nbsp; &nbsp;(* Neither of them should be the last MCB *)</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;SetIntVec(,OldInt09); &nbsp; &nbsp; &nbsp; (* Restore interrupt vectors *)</div><div class="code_line">&nbsp;SetIntVec(,OldInt88);</div><div class="code_line">&nbsp;asm</div><div class="code_line">&nbsp;&nbsp;mov Error,false</div><div class="code_line">&nbsp;&nbsp;mov ax,00</div><div class="code_line">&nbsp;&nbsp;mov es,EnvSeg</div><div class="code_line">&nbsp;&nbsp;int 21h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (* Unload environment *)</div><div class="code_line">&nbsp;&nbsp;jc @@Error</div><div class="code_line">&nbsp;&nbsp;mov ax,00</div><div class="code_line">&nbsp;&nbsp;mov es,TSRPSP</div><div class="code_line">&nbsp;&nbsp;int 21h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (* Unload code &amp; data *)</div><div class="code_line">&nbsp;&nbsp;jnc @@Exit</div><div class="code_line">&nbsp;@@Error:</div><div class="code_line">&nbsp;&nbsp;mov Error,true</div><div class="code_line">&nbsp;@@Exit:</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;if Error then begin</div><div class="code_line">&nbsp;&nbsp;WriteLn(&#39;Could not unload SIMPTSR: memory allocation error.&#39;);</div><div class="code_line">&nbsp;&nbsp;Halt(255);</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;WriteLn(&#39;SIMPTSR unloaded.&#39;);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;WriteLn(&#39;SimpTSR - Pascal TSR program example&#39;);</div><div class="code_line">&nbsp;WriteLn(&#39;Copyleft (C) 1999 by Asp&#39;);</div><div class="code_line">&nbsp;GetIntVec(,OldInt88);</div><div class="code_line">&nbsp;Installed:=false;</div><div class="code_line">&nbsp;if OldInt88&#60;&#62;nil then asm</div><div class="code_line">&nbsp;&nbsp;int 88h</div><div class="code_line">&nbsp;&nbsp;cmp ax,$DEED</div><div class="code_line">&nbsp;&nbsp;jne @@NotInstalled</div><div class="code_line">&nbsp;&nbsp;mov Installed,true</div><div class="code_line">&nbsp;&nbsp;mov TSRPSP,bx</div><div class="code_line">&nbsp;&nbsp;mov word ptr OldInt88,dx</div><div class="code_line">&nbsp;&nbsp;mov word ptr OldInt88+2,cx</div><div class="code_line">&nbsp;&nbsp;mov word ptr OldInt09,di</div><div class="code_line">&nbsp;&nbsp;mov word ptr OldInt09+2,si</div><div class="code_line">&nbsp;@@NotInstalled:</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;if not Installed then Install else Unload;</div><div class="code_line">end.</div><div class="code_line">========== Cut ==========</div><div class="code_line">&nbsp;</div><div class="code_line">========== Cut ==========</div><div class="code_line">; int88.asm</div><div class="code_line">&nbsp;</div><div class="code_line">.286</div><div class="code_line">.model tpascal</div><div class="code_line">&nbsp;</div><div class="code_line">.data</div><div class="code_line">&nbsp;extrn OldInt88:dword</div><div class="code_line">&nbsp;extrn OldInt09:dword</div><div class="code_line">&nbsp;extrn PrefixSeg:word</div><div class="code_line">&nbsp;</div><div class="code_line">.code</div><div class="code_line">&nbsp;public NewInt88</div><div class="code_line">&nbsp;</div><div class="code_line">NewInt88 &nbsp; &nbsp; &nbsp; proc far</div><div class="code_line">&nbsp;push ds</div><div class="code_line">&nbsp;mov ax,@Data</div><div class="code_line">&nbsp;mov ds,ax</div><div class="code_line">&nbsp;mov ax,0DEEDh &nbsp; &nbsp; &nbsp; &nbsp; ; Magic number</div><div class="code_line">&nbsp;mov bx,PrefixSeg &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; bx = original PSP</div><div class="code_line">&nbsp;mov dx,word ptr OldInt88 &nbsp; &nbsp; &nbsp; ; cx:dx = original int 88h vector</div><div class="code_line">&nbsp;mov cx,word ptr OldInt88+2</div><div class="code_line">&nbsp;mov di,word ptr OldInt09</div><div class="code_line">&nbsp;mov si,word ptr OldInt09+2 &nbsp; ; si:di = original int 9 vector</div><div class="code_line">&nbsp;pop ds</div><div class="code_line">&nbsp;iret</div><div class="code_line">NewInt88 &nbsp; endp</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">========== Cut ==========</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">Sincerely yours,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Alexey.</div><div class="code_line">&nbsp;</div><div class="code_line">--- </div><div class="code_line">&nbsp;* Origin: General Protection Violation at (2:463/416.256)</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>vot</author>
        <category>Pascal</category>
      </item>
	
      </channel>
      </rss>
	