2022-08-21 09:07:57 +00:00
|
|
|
;*************************************************************
|
|
|
|
;** 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
|
|
|
|
|