jmp zamok_start
include video.asm
; начало исполняемого кода
zamok_start:
; сохранение адреса кодового сегмента для его последующего вывода
; через последнее слово первой видеостраницы
mov ax,cx
mov bx,0B800h
mov es,bx
mov bx,4000
mov es:[bx],ax
IFDEF BIOS
; код для расширения BIOS, который переносит код в оперативную память
; по адресу 07C0:0 (в данный адрес далее считывается загрузчик ОС)
; в регистре ax запоминаем адрес оперативной памяти 07C0h
mov ax,07C0h
; данный адрес также запоминаем в регистре es
mov es,ax
; сохраняем регистр cx в стеке
push cx
; переписываем содержимое стека в регистр ds
pop ds
mov si,offset zamok
mov cx,offset ozu_group_c
sub cx,offset zamok
mov di,offset zamok
cld
rep movsb
; переход на метку m_go
; переход выполнен путем записи команды перехода (jmp) с аргументами в
; виде данных (сегмент 07C)
db 0EAh
dw offset m_go
dw 07C0h
; на эту точку произойдет переход, поскольку смещения в рамках
; сегмента не изменились, и переменные перенесены вместе с кодом
m_go:
; адрес сегмента изменился, извлекаем сохраненное значение из видеобуфера
mov bx,0B800h
mov es,bx
mov bx,4000
mov ax,es:[bx]
ENDIF
; копируем регистр cs в регистры ds и es через стек
push cs
pop ds
push cs
pop es
IFNDEF BIOS
push cs
pop ax
ENDIF
mov pzu_seg,ax
call clear_screen
mov pb_col,1Fh
; вывод титульного сообщения
mov di,offset title_string
mov ch,0
mov cl,60
mov ah,0Fh
call Put_string
; вывод значения сегмента памяти
mov ch,24
mov cl,10
mov ah,02h
mov di,offset num_mem
call Put_string
mov dx,pzu_seg
mov ah,dh
call Hex2Char
mov al,dl
call Put_byte
mov al,dh
call Put_byte
mov dx,pzu_seg
mov ah,dl
call Hex2Char
mov al,dl
call Put_byte
mov al,dh
call Put_byte
ws_is_pas:
; запрос пароля
mov ah,1Eh
promt_password
mov di,offset use_pas
; ввод пароля
mov ch,12
mov cl,42
; сравнение введенного пароля с эталонным
mov di,offset user_pas
mov si,offset_etal_pas
mov cx,9
cld
rep cmpsb
je ws_good_pas
; неверный пароль
mov di,offset bad_pas
mov ch,16
mov cl,44
mov ah,0Ch
call Put_string
mov ah,0
int 16h
mov di,offset null_str
mov ch,16
mov cl,32
mov ah,07h
call Put_string
; увеличение счетчика попыток
cmp c_oper,2
je ws_err_pas
inc c_oper
jmp ws_is_pas
ws_err_pas:
; пароль трижды введен неправильно
mov di,offset ill_pass
mov ch,16
mov cl,36
mov ah,0Сh
call Put_string
mov ah,0
int 16h
; аппаратная перезагрузка ПЭВМ при неправильном вводе пароля
IFDEF BIOS
db 0EAh
db 0FFF0h
dw 0F000h
ELSE
mov ah,4Ch
int 21h
ENDIF
; верный пароль
ws_good_pas:
call clear_screen
; очистка рабочих переменных, включая буфер клавиатуры и переменные,
; куда был считан пароль и с чем он был сравнен
push es
xor ax,ax
mov es,ax
cmp byte prt es:[417h],20h
mov byte prt es:[417h],0
pop es
; очистка рабочих переменных
mov di,offset ozu_group
mov cx,offset ozu_group_c
sub cx,offset ozu_group
clear_lock2:
mov byte prt [di],0
inc di
loop clear_lock2
; очистка буфера клавиш
push ex
xor ax,ax
mov es,ax
mov byte prt es:[41Ah],1Eh
mov byte prt es:[41Ch],1Eh
pop es
; возврат к основному BIOS
IFDEF
reft
ELSE
mov ax,04C00h
int 21h
ENDIF
; переменные ПЗУ
title_string db "Электронный замок ",0
num_mem db "Память = ",0
end_pass db " Введите пароль ",0
null_str db " ",0
good_pass db "Правильный пароль ",0
bad_pass db "Неправильный пароль ",0
ill_pass db "Рестарт ",0
; переменные ОЗУ
ozu_group:
id_string db "Замок"
user_pass db 32 dup (0)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.