4Текст (1071377)
Текст из файла
Текст: H:\CP\KURSAC1\STSR\STSR.ASM Ст. 0 15 216 байт 0%
; STSR release 1. Copyright (C) 2001 by LORD
; *******************************************************
; *CAUTION:THIS PROGRAM IS FREEWARE, SO U CAN USE, HACK *
; *AND CRACK IT AS MANY TIMES AS YOU WANT *
; *******************************************************
; определения препроцессора
START_POS equ (80*5+20)*2 ; смещение верхнего левого угла окна программы в
видеопамяти
LINES_NUM equ 7 ; число экранных строк (высота окна)
CHARS_NUM equ 40 ; число экранных символов (ширина окна)
; номера строк для вывода
STR_NONE equ 0
STR_ONE equ 1
STR_TWO equ 2
STR_THREE equ 3
.model tiny
.code
.186
org 2Ch
envseg dw ?
org 80h
cmd_len db ? ; длина строки параметров,
cmd_line db ? ; по этой метке можно судить о начале строки параметров
org 100h ; COM-программа
start:
jmp init ; переходим на процедуру инициализации
hw_reset9: ; минимальный сброс
retf
; Обработчик прерывания клавиатуры
int09h_handler proc far
jmp short act_int09h_handler ; пропустить ISP
; формируем ISP
old_int09h dd ?
dw 424Bh
db 00h
jmp short hw_reset9
db 7 dup(0)
; вход в обработчик
act_int09h_handler:
cli
pushf
call dword ptr cs:old_int09h ; вызов старого обработчик
pusha ; прерывание аппаратное, сохраняем всек регистры
push ds
push es
cld
push 0B800h ; видеобуфер текстового режима EGA
pop es
push 00040h ; сегмент буфера клавиатуры
pop ds
mov di, word ptr ds:001Ah ; адрес головы буфера клавитуры
cmp di, word ptr ds:001Ch ; не равен ли адресу хвоста
буфера клавиатуры?
je do_exithnd ; если буфер пуст,
выходим
jmp done_chk
do_exithnd:
jmp exit_09h_handler
done_chk:
mov ax, word ptr [di] ; иначе - читаем символ
mov ax, word ptr [di] ; иначе - читаем символ
cmp byte ptr cs:we_are_active,0 ; программа уже
ктивирована?
jne already_active ; да,
переходим к обработке команд пользователя
; иначе - идем дальше
; проверка текущего видеорежима
; программа работает только в стандартном режиме ДОС - 03h
mov al, byte ptr ds:0049h
test al, 03h ; текущий видеорежим - 03h?
jz do_exithnd ; - нет, выходим, иначе идем дальше
; проверка на нажатие комбинации Ctrl+U
cmp ah, 1Fh ; нажата [s] ?
jne not_s ; нет -
идем дальше
mov cs:for_unload, 0
jmp yeah_s
not_s:
cmp ah, 16h ; нажат
[u] ?
mov cs:for_unload, 1
jne exit_09h_handler
yeah_s:
mov al, byte ptr ds:0017h ; байт состояния клавиатуры
test al, 04h ; нажат Ctrl?
jz exit_09h_handler ; нет - выходим
cmp cs:for_unload, 1
jne do_start
; нажаты Ctrl+U, надо выгрузить программу
mov word ptr ds:001Ch, di ; очистить буфер клавиатуры
call restore_scr
mov cs:we_are_active, 0
mov ah, cs:mux_id
mov al, 02h ; вызвать функцию AMIS 02 - выгрузка
резидента
int 2Dh
jmp exit_09h_handler
do_start:
; нажаты Ctrl+S, необходимо активировать программу
mov word ptr ds:001Ch, di ; очистить буфер клавиатуры
call save_scr ; сохраняем фон
call save_scr ; сохраняем фон
под окном
push cs
pop ds
call show_scr ; показать окно
программы
mov byte ptr we_are_active, 1 ; активируем резидент
jmp short exit_09h_handler
; программа уже активирована
already_active:
mov word ptr ds:001Ch, di ; очистить буфер клавиатуры
mov bh, STR_NONE ; не надо выводить строки
push cs
pop ds
mov al, ah ; команды cmp ah, ? короче, чем cmp al, ?
cmp al, 02h ; нажата клавиша [1]?
jne not_1
; выводим 1-ю строку
mov bh, STR_ONE
not_1:
cmp al, 03h ; нажата клавиша [2]?
jne not_2
; выводим 2-ю строку
mov bh, STR_TWO
not_2:
cmp al, 04h ; нажата клавиша [3]?
jne not_3
; выводим 3-ю строку
mov bh, STR_THREE
not_3:
dec al ; нажата [Escape]?
jnz exit_with_display ; нарисовать окно и выйти
; деактивируем программу
call restore_scr
mov byte ptr we_are_active, 0
jmp short exit_09h_handler ; выходим
exit_with_display: ; нарисовать окно и выйти
mov byte ptr current_str, bh
call show_scr
exit_09h_handler:
pop es
pop ds
popa
sti
iret ; возврат
; переменные, используемые в обработчике
we_are_active db 0
current_str db 0
for_unload db 0
save_scr proc near ; запоминает фон под окном для его последующего восст
новления
mov si, START_POS
push 0B800h ; DS:SI - начало области окна в видеобуфере
pop ds
push es
push cs
pop es
mov di, offset scr_buf
mov dx, LINES_NUM
save_scr_loop: ; построчный цикл записи фона
mov cx, CHARS_NUM
rep movsw
add si, (80-CHARS_NUM)*2
dec dx
jnz save_scr_loop
pop es
ret
save_scr endp
restore_scr proc near ; восстанавливает фон под окном
mov di, START_POS
mov si, offset scr_buf
mov dx, LINES_NUM ; число строк для копирования
scr_loop: ; построчный цикл восстановления фона
mov cx, CHARS_NUM ; число символов на ширину окна
rep movsw
add di, (80-CHARS_NUM)*2
dec dx
jnz scr_loop
ret
restore_scr endp
show_scr proc near ; процедура рисования окна
mov di, START_POS
mov dx, LINES_NUM-2
; выведем заголовок окна
mov ah, 3Fh
xor al, al
mov cx, CHARS_NUM
rep stows
; нарисуем тело окна
add di, (80-CHARS_NUM)*2
mov ah, 1Fh
fill_loop:
mov cx, CHARS_NUM
rep stosw
add di, (80-CHARS_NUM)*2
dec dx
jnz fill_loop
; нарисуем рамку окна
inc di
inc di
mov al, 196
mov cx, CHARS_NUM-2
rep stosw
mov al, 179
mov di, START_POS+80*2
mov dx, LINES_NUM-2
vert_loop:
stosw
add di, (CHARS_NUM-2)*2
stosw
add di, (80-CHARS_NUM)*2
dec dx
jnz vert_loop
mov al, 192
stosw
add di, (CHARS_NUM-2)*2
mov al, 217
stosw
; выведем текст
mov di, START_POS
mov ah, 3Fh
mov si, offset header
call print_str
mov ah, 1Eh
mov di, START_POS+2+80*2
mov si, offset help
call print_str
mov di, START_POS+2+80*2*5
mov si, offset msg_xt
call print_str
; определим, какую строку надо вывести
mov ah, 1Ch
mov di, START_POS+2+80*2*3
cmp ds:current_str, STR_NONE
jne not_none
mov si, offset msg0
call print_str
not_none:
cmp ds:current_str, STR_ONE
jne not_one
mov si, offset msg1
call print_str
not_one:
cmp ds:current_str, STR_TWO
jne not_two
mov si, offset msg2
call print_str
not_two:
cmp ds:current_str, STR_THREE
jne not_three
mov si, offset msg3
call print_str
not_three:
ret
show_scr endp
print_str proc near ; печатает строку с заданным в AH атрибутом
; DS:SI - адрес строки, ES:DI - адрес
видеопамяти
prn_loop:
mov al, byte ptr [si]
cmp al, 0
je prn_exit
stosw
inc si
jmp prn_loop
prn_exit:
ret
print_str endp
int09h_handler endp
; Конец обработчика прерывания клавиатуры
; переменные, использованные в обработчике
scr_buf db LINES_NUM*CHARS_NUM*2 dup(?)
header db 'Вывод строк', 0
help db 'Введите номер строки (1, 2, или 3)', 0
msg0 db 'Строка не выбрана', 0
msg1 db 'This is a line number one', 0
msg2 db 'This is a line number two', 0
msg3 db 'This is a line number three', 0
msg_xt db 'Чтобы продолжить, нажмите Escape', 0
; Обработчик мультиплексорного прерывания. Программа использует AMIS-сигнатуру
; для совместимости с другими программами
; поддерживает функции AMIS 3.6 00h, 02h, 03h, 04h и 05h
hw_reset2D: retf
int2Dh_handler proc far
jmp short act2Dh_handler ; пропустить ISP
old_int2Dh dd ?
dw 424Bh
db 00h
jmp short hw_reset2D
db 7 dup(0)
act2Dh_handler:
db 80h, 0FCh ; начало команды cmp ah, число
mux_id db ? ; идентификатор программы
je its_us ; если вызывают с чужим AH - это не н
с
jmp dword ptr cs:old_int2Dh ; вызов старого обработчика
its_us: ; вызвали все-таки нас
cmp al, 06h ; функции AMIS выше 06h не поддерживаются
jae int2D_no ;
cbw ; занести в AX номер функции AMIS
mov di, ax
shl di, 1 ; умножить его на 2, т. к. jumptable - т
блица слов
jmp word ptr cs:jumptable[di] ; вызов обработчика
функции
;jumptable : таблица адресов обрабатываемых функций AMIS
jumptable dw offset int2D_00, offset int2d_no
dw offset int2D_02, offset int2d_03
dw offset int2D_04, offset int2d_05
int2D_00: ; функция 00 - запрос сигнатуры AMIS
mov al, 0FFh
mov cx, 0100h
push cs
pop dx
mov di, offset amis_sign ; DX:DI - адрес AMIS сигнатуры
iret
int2D_no: ; функция не поддерживается
mov al, 00h
iret
unload_failed: ; сюда передается управление, если
; векторы прерываний были заняты после нашей прогр
ммы
mov al, 01h
iret
int2D_02: ; функция 02 - выгрузка резидента
push 0
pop ds ; сегментный арес таблицы векторов прерываний
ДОС
mov ax, cs ; наш сегмент кода
; проверим, все ли перехваченные прерывания по прежнему указывают на нас
cmp ax, word ptr ds:[09h*4+2] ; проверка для прерывания
клавиатуры
jne unload_failed
cmp ax, word ptr ds:[2Dh*4+2] ; проверка для
мультиплексорного прерывания
jne unload_failed
; восстановим старые обработчики прерываний
mov ax, 2509h
lds dx, dword ptr cs:old_int09h
int 21h
mov ax, 252Dh
lds dx, dword ptr cs:old_int2Dh
int 21h
push cs
pop ds
mov ah, 09h
mov dx, offset cs:unloaded_ok
int 21h
; выгрузка резидента
mov es,cs:[2Ch]
mov ah,49h
int 21h
push cs
pop es
mov ah,49h
int 21h
iret
unloaded_ok db 'Программа успешно выгружена из памяти', 13, 10, '$'
cant_unl db 'Ошибка: Другая программа перехватила прерывания', 13, 10,
'$'
int2D_03: ; функция AMIS 03 - запрос на активацию программы
cmp byte ptr we_are_active, 0 ; мы и так активны?
je already_popup
call save_scr
push cs
pop ds
call show_scr
mov byte ptr we_are_active, 1 ; активировать программу
already_popup: ; программа уже активна
mov al, 03h
iret
int2D_04:; функция AMIS 04 - получить список перехваченных прерываний
mov dx, cs
mov bx, offset amis_hooklist
iret
int2D_05: ; функция AMIS 05 - получить список "горячих" клавиш
mov al, 0FFh
mov dx, cs
mov bx, offset amis_hotkeys
iret
int2Dh_handler endp
; Конец обработчика мультиплексорного прерывания
; AMIS - сигнатура для резидентных программ
amis_sign db "LORD...." ; имя автора
db "STSR...." ; имя программы
db "Вывод строки по запросу пользователя", 0
; AMIS - список перехваченных прерываний
amis_hooklist db 09h
dw offset int09h_handler
db 2Dh
dw offset int2Dh_handler
; AMIS - список горячих клавиш
amis_hotkeys db 01h ; проверяются после вызова стандартного обработчика
db 1 ; используем одну клавишу
db 16h ; скэн-код клавиши [u]
dw 04h ; вызывается по Ctrl
dw 0 ; запрещенные флаги
db 1 ; клавиша не остается в буфере клави
туры
; резидентная часть завершена
; процедура инициализации резидента
init proc near
jmp short init_entry_pnt ; прыжок на точку входа
exit_with_msg: ; выйти, написав сообщение
call show_msg
ret
already_loaded: ; резидент уже загружен
cmp byte ptr unloading, 1 ; пользователь потребовал выгрузки?
je do_unload ; да, выгрузить
mov dx, offset already_msg ; вывод сообщения о том, что резидент в п
мяти
jmp short exit_with_msg
no_more_mux: ; если свободный идентификатор MUX не найден
mov dx, offset no_more_mux_msg
jmp short exit_with_msg
cant_unload1: ; если нельзя выгрузить программу
mov dx, offset cant_unload1_msg
jmp short exit_with_msg
do_unload: ; выгрузить резидент, в AH - идентификатор программы - 1
inc ah
mov al, 02h ; вызвать функцию AMIS 02 - выгрузка резидента
; mov dx, cs
; mov bx, offset exit_pnt
cli
int 2Dh
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.