	  .MODEL tiny
	  .CODE        ; Драйвер состоит из одного
						; сегмента кода

	  org 0        ; Эта строка может отсуствовать

	  include sysp.inc

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

stop    PROC far         ;драйвер - это FAR-процедура

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

E_O_P:            ;Метка конца программы,
						;устанавливаем ее в начало
						;драйвера, т.к. нам не надо
						;оставлять драйвер резидентно
						;в памяти

; Заголовок драйвера

	  dd   0ffffffffh       ;адрес следующего драйвера
	  dw   8000h            ;байт атрибутов
	  dw   dev_strategy     ;адрес процедуры стратегии
	  dw   dev_interrupt    ;адрес процедуры прерывания
	  db   'STOP    '       ;имя устройство (дополненное пробелами)

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

; Программа стратегии

dev_strategy:
		mov  cs:req_seg,es
		mov  cs:req_off,bx
		ret

; Здесь запоминается адрес заголовка запроса

req_seg         dw ?
req_off         dw ?

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

;Обработчик прерывания

dev_interrupt:
	push es     ;сохраняем регистры
	push ds
	push ax
	push bx
	push cx
	push dx
	push si
	push di
	push bp

; Устанавливаем ES:BX на заголовок запроса

	mov  ax,cs:req_seg
	mov  es,ax
	mov  bx,cs:req_off

; Получаем код команды из заголовка запроса и умножаем
; его на два, чтобы использовать в качестве индекса
; таблицы адресов обработчиков команд

	mov  al,es:[bx]+2
	shl  al,1

	sub  ah,ah            ; Обнуляем AH
	lea  di,functions     ; DI указывает на смещение таблицы
	add  di,ax            ; Добавляем смещение в таблице
	jmp  word ptr [di]    ; Переходим на адрес из таблицы

functions   LABEL  WORD  ; Таблица функций

   dw   initialize
   dw   check_media
   dw   make_bpb
   dw   ioctl_in
   dw   input_data
   dw   nondestruct_in
   dw   input_status
   dw   clear_input
   dw   output_data
   dw   output_verify
   dw   output_status
   dw   clear_output
   dw   ioctl_out
   dw   Device_open
   dw   Device_close
   dw   Removable_media

; Выход из драйвера, если функция не поддерживается

check_media:
make_bpb:
ioctl_in:
nondestruct_in:
input_status:
clear_input:
output_verify:
output_status:
clear_output:
ioctl_out:
Removable_media:
Device_open:
Device_close:
output_data:
input_data:

	or   es:word ptr [bx]+3,8103h
   jmp  quit

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

quit:
	or   es:word ptr [bx]+3,100h
	pop bp
	pop di
	pop si
	pop dx
	pop cx
	pop bx
	pop ax
	pop ds
	pop es
   ret

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

; Процедура выводит на экран строку
; символов в формате ASCIIZ

dpc proc near
	push si
dpc_loop:
	cmp  ds:byte ptr [si],0
	jz   end_dpc
	mov  al,ds:byte ptr [si]
	@@out_ch al
	inc si
	jmp dpc_loop

end_dpc:
	pop si
	ret
dpc endp

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

hello db 13,10,'╔════════════════════════════════╗'
		db 13,10,'║  *STOP*   (C)Frolov A., 1990   ║'
      db 13,10,'╚════════════════════════════════╝'
		db 13,10
		db 13,10,'Enter password...'
		db 13,10,0

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

initialize:

   lea  ax,E_O_P      ;смещение конца программы в AX
   mov  es:word ptr [bx]+14,ax   ;помещаем его в заголовок
   mov  es:word ptr [bx]+16,cs   ;

; Стираем экран

	mov   dh,18h
	mov   dl,80h

	xor   cx,cx
	mov   bh,7
	xor   al,al
	mov   ah,6
	int   10h

; Устанавливаем курсор в левый верхний угол экрана

	mov   bh,0
	xor   dx,dx
	mov   ah,2
	int   10h

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

	mov ax,cs
	mov ds,ax
	mov si,offset hello
	call dpc

; Ожидаем ввода правильного пароля

loop_password:

	mov   ax,0
	int   16h
	cmp   al,'s'
	jne   loop_password

	mov   ax,0
	int   16h
	cmp   al,'y'
	jne   loop_password

	mov   ax,0
	int   16h
	cmp   al,'s'
	jne   loop_password

	jmp  quit

stop   ENDP

		 END stop
