Курсовая работа: КП - вывод текста на экран
Описание
Характеристики курсовой работы
Список файлов
- КП - вывод текста на экран
- STSR
- 1_TZ.DOC 51,5 Kb
- 2_OpisPrim.doc 31 Kb
- 3_TehOpis.doc 26 Kb
- 4Текст.doc 86,5 Kb
- 5_Prog&MetIsp.doc 40 Kb
- 6_RukPolz.doc 25 Kb
- 7_RukSysProg.doc 26,5 Kb
- Listing tit.DOC 24 Kb
- Listing.txt 14,79 Kb
- Rukovod_polz еше.DOC 32,5 Kb
- STSR
- STSR.ASM 14,86 Kb
- opisan primen tit.DOC 40,5 Kb
- progr i metoda ispit еше.DOC 47 Kb
- rukovodstvo sisprog еше.DOC 32,5 Kb
- texn zadan tit.DOC 29 Kb
- texnich opis tit.DOC 43,5 Kb
- Прочти меня.txt 32 b
Текст: 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
Файл скачан с сайта StudIzba.com
Начать зарабатывать