;************************************************************* ;** Terminate-but-Stay-Resident ** ;** Original from the "Programmer's Journal" ** ;** Modified by Alroger L. Gomes Jr. ** ;** Any comments/question send message for "Roger Gomes" ** ;** on the PDSE BBS (408)735-7190. Have Fun! ** ;************************************************************* ; Insert you program on line # 157. Delay_Count Equ 36 ;36 ticks=approx. 2 seconds ; Locations of BIOS Data needed by the resident program Bios_Data Segment at 40h Org 17h Kbd_Status dw ? Org 6Ch Low_Timer dw ? Bios_Data EndS Code Segment Assume Cs:Code, Ds:Code, Es:Nothing, Ss:Nothing Org 100h Entry_Point: Jmp Install Hot_Keys dw 01010B This_Time dw ? Trig_Time dw ? Dos_Busy Label dword Dos_Busy_Off dw ? Dos_Busy_Seg dw ? Criterr_Flag db ? Already8 db 0 MenuON db 0 ;*** Replacement for Int 24h - critical Dos Error *** Diverted_Int24: Mov Cs:Criterr_Flag,1 Xor Al,Al Iret Int_24_Vect Label dword Int_24_Off dw ? Int_24_Seg dw ? ;***** ID CODE ***** Res_ID1 dw 'Al' Res_ID2 dw 'ro' Res_ID3 dw 'ge' ;******************* ;*** Replacement for Int 8 - Timer hardware Interrupt *** Diverted_Int8: Pushf Call_Int8 db 09Ah Int_8_Vect Label dword Int_8_Off dw ? Int_8_Seg dw ? Cmp Cs:MenuOn,0 Je MenuNOT Iret MenuNOT: Mov Cs:MenuOn,1 Push Ds Push Bx Lds Bx,Cs:Dos_Busy Cmp Byte Ptr [Bx],0 Pop Bx Pop Ds Mov Cs:MenuOn,0 Jz Get_Bios_Data Dos_is_Busy: Iret ;*** Replacement for Int 28 - Generated by Dos, esp. during keyboard I/O *** Diverted_Int28: Pushf Call_Int28 db 09Ah Int_28_Vec Label dword Int_28_Off dw ? Int_28_Seg dw ? Cmp Cs:MenuOn,0 Je Get_Bios_Data Iret Get_Bios_Data: Mov Cs:MenuOn,1 Sti Push Ds Push Ax Mov Ax,Bios_Data Mov Ds,Ax Assume Ds:Bios_Data Mov Ax,Low_Timer Mov Cs:This_time,Ax Mov Ax,Kbd_Status Push Cs Pop Ds Assume Ds:Code Chk_Keys: And Ax,Hot_Keys Cmp Ax,Hot_Keys Jne Back_to_Applic Chk_Timer: Mov Ax,This_Time Cmp Ax,Trig_Time Jb Time_is_Right Sub Ax,Trig_Time Sub Ax,Delay_Count Jnc Time_is_Right Back_to_Applic: Pop Ax Pop Ds Mov Cs:MenuOn,0 Iret Time_is_Right: Mov Ax,This_Time Mov Trig_Time,Ax Pop Ax Pop Ds ;*************************************************************************** ; This is the Start of the application-dependent resident code Start_Program: Mov Cs:MenuOn,1 Push Ax Push Bx Push Cx Push Dx Push Si Push Di Push Bp Push Ds Push Es Push Cs Pop Ds Mov Ax,3524h Int 21h Mov Int_24_Off,Bx Mov Int_24_Seg,Es Mov Ax,2524h Mov Dx,Offset Diverted_Int24 Int 21h ;**************************************************************************** ; Insert your program here. ;**************************************************************************** Restore_Int24: Lds Dx,Int_24_Vect Mov Ax,2524h Int 21h Pop Es Pop Ds Pop Bp Pop Di Pop Si Pop Dx Pop Cx Pop Bx Pop Ax Mov Cs:MenuOn,0 Mov Cs:Already8,0 Iret ; This is the end off the applicant-dependent resident code End_of_Res Label word ;*************************************************************************** ; Installation Install: Mov Ax,Cs Mov Ds,Ax Mov Es,Ax Mov Ah,9 Mov Dx,OffSet CopyRight Int 21h ; Make sure that it is at least Dos 2.00 Mov Ah,30h Int 21h Or Al,Al Jnz Chk_Vectors Mov Dx,Offset BadDos_Msg Mov Ah,9 Int 21h Int 20h ; See if resident code is already Installed in Memory Chk_Vectors: Mov Ax,Cs Mov Ds,Ax Mov Es,Ax Mov Ax,3508h Int 21h Cmp Word Ptr [Es:Bx-6],'Al' Jne Not_Installed1 Cmp Word Ptr [Es:Bx-4],'ro' Jne Not_Installed1 Cmp Word Ptr [Es:Bx-2],'ge' Jne Not_Installed1 Mov Dx,Offset No_Install_Msg Mov Ah,9 Int 21h Mov Ax,4C01h Int 21h Not_Installed1: Mov Ax,3577h Int 21h Mov Ax,Es Cmp Ax,'Al' Jne Not_Installed Cmp Bx,'ro' Jne Not_Installed Mov Dx,Offset No_Install_Msg Mov Ah,9 Int 21h Mov Ax,4C01h Int 21h Not_Installed: Mov Ax,Cs Mov Ds,Ax Mov Es,Ax Push Es Mov Ax,Cs Mov Ds,Ax Mov Es,Ax Mov Ah,34h Int 21h Mov Dos_Busy_Off,Bx Mov Dos_Busy_Seg,Es Mov Ax,3508h Int 21h Mov Int_8_Off,Bx Mov Int_8_Seg,Es Mov Ax,Cs Mov Es,Ax Mov Ds,Ax Mov Ax,2508h Mov Dx,Offset Diverted_Int8 Int 21h Mov Ax,'Al' Mov Ds,Ax Mov Dx,'ro' Mov Ax,2577h Int 21h Mov Ax,Cs Mov Ds,Ax Mov Ax,3528h Int 21h Mov Int_28_Off,Bx Mov Int_28_Seg,Es Mov Ax,2528h Mov Dx,Offset Diverted_Int28 Int 21h Pop Es ; Terminate and stay resident Mov Dx,Offset Install Int 27h No_Install_Msg db 'xxxx is already in memory!',10,13,10,13,'$' BadDos_Msg db 'DOS 2.0 or greater needed!',10,13,10,13,'$' CopyRight db 'xxxx by ?????? - yyyy $' Code EndS End Entry_Point