	.MODEL tiny
	.CODE
	.STARTUP
 
	jmp begin


old_int2Fh_off  dw 0  ; Адрес старого обработчика
old_int2Fh_seg  dw 0  ; прерывания 2Fh

; Сообщение, которое будет выдано на экран
; при запуске WINDOWS

msg_win     db 'Windows Started. Press any key...$'
msg_win_off dw offset msg_win

; Сообщение, которое будет выдано на экран
; при завершении WINDOWS

msg_win1     db 'Windows Ended. Press any key...$'
msg_winend_off dw offset msg_win1

; Новый обработчик прерывания 2Fh нужен
; для проверки наличия программы в памяти
; при ее запуске для предохранения
; от повторного запуска

new_int2Fh  proc  far
		cmp   ax,0FF00h
		jz    installed

		cmp   ax,1605h
		jz    winstart

		cmp   ax,1606h
		jz    winend
		jmp   dword ptr cs:old_int2Fh_off

winstart:	; запуск WINDOWS

		push ax
		push bx
		push cx
		push dx
		push ds

		mov   dx,cs:msg_win_off
		mov   ah,9
		push  cs
		pop   ds
		int   21h

		mov   ax,0
		int   16h

		pop ds
		pop dx
		pop cx
		pop bx
		pop ax

		jmp   dword ptr cs:old_int2Fh_off

winend:		; завершение WINDOWS

		push ax
		push bx
		push cx
		push dx
		push ds

		mov   dx,cs:msg_winend_off
		mov   ah,9
		push  cs
		pop   ds
		int   21h

		mov   ax,0
		int   16h

		pop ds
		pop dx
		pop cx
		pop bx
		pop ax

		jmp   dword ptr cs:old_int2Fh_off


; Если код функции 0FF00h, то возвращаем
; в регистре AX значение 00FFh. Это признак
; того, что программа уже загружена в память

installed:
		mov   ax,00FFh
		iret

new_int2Fh  endp

;==============================

; Точка входа в программу
; В этом месте начинается выполнение программы

begin proc

; Проверяем, не загружена ли уже программа
; в память

		mov   ax,0FF00h
		int   2Fh

		cmp   ax,00FFh
		jne   first_start

		mov   dx,offset msg_load1
		mov   ah,9
		int   21h

		.EXIT

; Первоначальный запуск программы

first_start:

; Запоминаем адрес старого обработчика прерывания 2Fh

		mov   ax,352Fh
		int   21h
		mov   cs:old_int2Fh_off,bx
		mov   cs:old_int2Fh_seg,es

		push  cs
		pop	ds

; Выводим сообщение

		mov   dx,offset msg_load
		mov	ah,9
		int   21h


		mov   dx,OFFSET new_int2Fh
		mov   ax,252Fh
		int   21h

; Завершаем программу и оставляем резидентно
; в памяти часть программы, содержащую новые
; обработчики прерываний

		mov   dx,OFFSET begin
		int   27h

begin endp

msg_load      db 'Резидентная программа WINTSR загружена$'
msg_load1     db 'Резидентная программа WINTSR уже загружена$'

		end
