4Текст (КП - вывод текста на экран)

2017-12-28СтудИзба

Описание файла

Файл "4Текст" внутри архива находится в следующих папках: КП - вывод текста на экран, STSR. Документ из архива "КП - вывод текста на экран", который расположен в категории "". Всё это находится в предмете "системное программирование" из 5 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "системное программирование" в общих файлах.

Онлайн просмотр документа "4Текст"

Текст из документа "4Текст"

Текст: 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

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5167
Авторов
на СтудИзбе
438
Средний доход
с одного платного файла
Обучение Подробнее