Лекция по разработке TST (курсовая работа), страница 3
Описание файла
Документ из архива "Лекция по разработке TST (курсовая работа)", который расположен в категории "". Всё это находится в предмете "системное программирование" из 4 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "системное программирование" в общих файлах.
Онлайн просмотр документа "Лекция по разработке TST (курсовая работа)"
Текст 3 страницы из документа "Лекция по разработке TST (курсовая работа)"
jmp end_09h
key_6:
mov tone, 659 ;частота ноты ля
call dinamik
jmp end_09h
key_7:
mov tone, 587 ;частота ноты си
call dinamik
jmp end_09h
key_8:
mov tone, 523 ;частота ноты до 2 октавы
call dinamik
jmp end_09h
end_09h:
mov ah,00h ;функция удаления симвла из буфера, что бы
int 16h ;не выволить его на экран
end_9h: pop es
pop si
pop di
pop ax
iret
new_09h endp
melodia proc near ; написанная мелодия
mov ax,dlit
push ax
mov dlit,15000
mov tone, 1046
call dinamik
mov dlit,5000
mov tone, 988
call dinamik
mov dlit,10000
mov tone, 880
call dinamik
mov tone,1046
call dinamik
mov dlit,5000
mov tone, 880
call dinamik
call delay ;чтобы не залиговывать 2 ноты
mov tone, 880
call dinamik
mov tone, 988
call dinamik
mov tone, 1046
call dinamik
mov dlit,10000
mov tone, 988
call dinamik
mov tone, 1176
call dinamik
pop ax
mov dlit,ax
ret
melodia endp
vkl proc near
mov al, 0b6h ;порт 43- регистр упавления.С его помощью выбираем канал
;задаем режим работы и передачи значения в канал таймера
out 43h, al
in al, 61h ;инициализируем динамик
or al, 3
out 61h,al
ret
vkl endp
nota proc near ;звучание ноты на определенной частоте и определенной ;длительности
mov cx, dlit
musicup:
mov ax, tone
out 42h, al ;порт 42-регистр ввода-вывода.С его помощью
;опред нужную высоту тона
xchg al,ah
out 42h, al
call delay
loop musicup
ret
nota endp
nosound proc near ;выключение динамика
in al, 61h
and al, 0fch
out 61h, al
ret
nosound endp
dinamik proc near ;процедура звучания ноты(включение ;динамика,звук,выключение)
call vkl
call nota
call nosound
ret
dinamik endp
delay proc near ;процедура задержки звучания ноты или пауза
push cx
mov cx, 2
ext:
push cx
mov cx, 5000
iter:
loop iter
pop cx
loop ext
pop cx
ret
delay endp
new_2Fh proc ;новый обработчик прерывания 2fh (мультиплексное прерывание)
;оно нужно для связи с резидентными программами
;мы его используем для идентификации нашей программы, те для
;защиты от повторной загрузки и для выгрузки программы
cmp ah,0C2h ; C2h - идентификатор программы
;c2h-одна из свободных функций этого прерывания, которую
;мы заняли
;00h-подфункция, использующаяся для проверки наличия
;резидентной программы в памяти
jne otherprogram
cmp al,00h ; check if installed subfunction
je isinstalled
cmp al,01h
je uninstall
otherprogram:
jmp cs:old_2Fh
isinstalled:
mov al,0FFh ; вернуть в al 0FFh - уже загружена
iret
uninstall:
push ds
push es
push dx
mov ax,2509h ; восстанавливаем старый обработчик 09h
lds dx,cs:old_09h
int 21h
mov ax,252Fh ; восстанавливаем старый обработчик 2Fh
lds dx,cs:old_2Fh
int 21h
mov es,cs:[2Ch] ; читаем адрес сегмета окружения из PSP
mov ah,49h ; освобождение памяти занимаемой сегментом
int 21h
push cs
pop es ; cs -> es
mov ah,49h ; освобождение памяти занимаемой сегментом
int 21h
pop dx
pop es
pop ds
iret
new_2Fh endp
;_________________________________________________________;
; КОНЕЦ РЕЗИДЕНТНОЙ ЧАСТИ ;
; НАЧАЛО СЕКЦИИ ИНИЦИАЛИЗАЦИИ ;
;_________________________________________________________;
init proc
mov cl, es:80h
xor ch, ch
cmp cx,0 ;если командная строка пуста
je install
mov si, 82h ;адрес начла параметров КС
mov bl, es:[si] ;проверяем, задан ли параметр помощи
cmp bl, '/'
jne install
mov bl, es:[si+1]
cmp bl,'?'
jne install
mov ah, 09h ;вывод справки
mov dx, offset help
int 21h
exit: mov ax,4C00h ;выход из программы
int 21h ; Exit to DOS
install: mov ax,0C200h ; проверка повторной загрузки резидента (00h)
int 2Fh
cmp al,0FFh ; резидент установлен (ДА-НЕТ)
jne load
mov cl, es:80h
xor ch, ch
cmp cx,0
je N
mov ah, 09h ;сообщение о том,для выгрузки надо запустить
;программу без параметров
mov dx, offset zagruzka
int 21h
jmp exit
N: mov ax,0C201h ; выгрузка (01h)
int 2Fh
mov dx,offset msg_unload
mov ax,0900h ; вывод строки
int 21h
jmp exit
load:
mov ax,3509h ; сохранение старого обработчика 09h
int 21h
mov word ptr cs:old_09h, bx
mov word ptr cs:old_09h+2,es
mov ax,352Fh ; сохранение старого обработчика 2Fh
int 21h
mov word ptr cs:old_2Fh, bx
mov word ptr cs:old_2Fh+2,es
mov ax,2509h ; установка нового обработчика 09h
mov dx,offset new_09h
int 21h
mov ax,252Fh ; установка нового обработчика 2Fh
mov dx,offset new_2Fh
int 21h
mov ax,0900h ; вывод строки
mov dx,offset msg_load
int 21h
mov dx,(init-main+10Fh)/16 ; размер резидентной части в параграфах
mov ax,3100h ; Функция DOS : Terminate and State Resident
int 21h
init endp
; данные инициализирующей части
msg_load db 'Программа tsr.com загружена в память$' ;;загружена
msg_unload db 'Программа tsr.com успешно выгружена из памяти$'
;программа выгружена из памяти
help db 'Программа tsr.com написана ст. ИУ5-52 Ефремовой Ю.Н.',0dh, 0ah,'Загрузка резидента- запуск tsr.com',0dh,0ah, 'Выгрузка резидента- повторный запуск tsr.com без параметров',0dh,0ah,0dh,0ah,'Для прослушивания мелодии необходимо нажать F1',0dh,0ah,'Музыкальные ноты клавиши:',0dh,0ah,'1-до',0dh,0ah,'2-ре',0dh,0ah,'3-ми',0dh,0ah,'4-фа',0dh,0ah,'5-соль',0dh,0ah,'6-ля',0dh,0ah,'7-си',0dh,0ah,'8-до 2ой октавы',0dh,0ah,'$';справка по работе с программой
zagruzka db 'Программа tsr.com уже находится в памяти$';Программа уже находится в памяти
code ends
end main
***********************************************
Работа с экраном:
text segment 'code'
assume CS:text,DS:text
org 100h
begin:
jmp Install
; ---------- РЕЗИДЕНТ --------------
alt_1 equ 52h
ctrl equ 04h
ctrl_u equ 16h
;----------------------------
; Здеся данные для резидента
;----------------------------
oldhandler2d dd 0
oldhandler09 dd 0
codepage db 0
Unloadmes db 'Capture is unloaded'
filename db 'display.scr',0
filehandler dw 0 ; дескриптор
fbuffer db 2050 DUP (?) ; буфер для образа экрана
;---------------------------------------
; Cоответтвенно конец данных для онного
;--------------------------------------
;-----------------------------------------
;Обработчик мультипексного прерывания
;новый -----------------------------
my2dhandler proc
cmp AH,0Ch
jne system
cmp AL,00h
jne system
mov AL,0ffh
system:
pushf
call CS:Oldhandler2d
iret
my2dhandler endp
;-----------------------------------------
;-----------------------------------------
;Обработчик прерывания с клавиартуры
;новый -----------------------------
newkeybhandler proc
in AL,60h
cmp AL,alt_1
jne ifctrlu
mov codepage,0
call savescreen
jmp X3
ifctrlu:cmp AL,ctrl_u
jne X3
push es
push 0
pop es
test byte ptr es:[417h],ctrl ;логическое И над операндами
jz X2 ;ctrl не был нажат
call printunload
in AL,61h
or Al,80h
out 61h,AL
and Al,07Fh
out 61h,AL
mov AL,20h
out 20h,AL
pop es
mov ax,2509H
lds dx,cs:oldhandler09
int 21H
mov ax,252dH
lds dx,cs:oldhandler2d
int 21H
mov es,cs:[2cH] ; освобождение сегмента
mov ah,49H ; окружения
int 21H
push cs ; настройка ES на DS
pop es
mov ah,49H ; освобождение памяти от сегмента комманд
int 21H
iret
X2: pop es
X3:
pushf
call CS:Oldhandler09
in AL,61h
or Al,80h
out 61h,AL
and Al,07Fh
out 61h,AL
mov AL,20h
out 20h,AL
iret
newkeybhandler endp
;-------------------------------------------------------------
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;-------------Процедура сохранения экрана
;----------в фаел display.scr
savescreen proc
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
mov ax,0b800H ; Определяем кодовую страницу
mov dx,0
mov dl,Codepage
mul dx
add ax,0b800H
mov ds,ax
xor si,si ; настройка DS:SI на видеопамять
push cs
pop es ; настройка ES:DI на буфер
mov di,offset fbuffer
cld
;-----------Читаем ЭКРАН *-------------
mov cx,25 ; цикл по строкам
outer: push cx
mov cx,80
inner: lodsb ; чтение в al символа из видеопамяти
inc si ; пропуск байта атрибута
stosb ; сохранение символа в буфере
loop inner ; конец цикла по столбцам
mov al,0dh
stosb
mov al,0ah
stosb
pop cx
loop outer ; конец цикла по строкам
mov ah,51H ; получение PSP текущей программы в BX
int 21H
push bx
mov ah,50H ; установка PSP нашей программы
mov bx,cs
int 21H
;--------Открываем файл файл -------
push cs
pop ds
mov ah,3ch
mov dx,offset cs:filename
xor cx,cx ; атрибут файла
int 21h
mov filehandler,ax
;--------Записываем в файл из буфера -------
mov ah,40h
mov bx,filehandler
mov dx,offset cs:fbuffer ; смещение буфера
mov cx,2050 ; число байт
int 21h
;--------Закрываем файл -------
mov ah,3eh
mov bx,filehandler
int 21h
pop bx
mov ah,50H ; установка PSP текущей программы
int 21H
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
savescreen endp
;-------------------------------------------------
printunload proc
mov AX,0b800h
mov ES,AX
mov AH,1Eh
xor si,si
mov AL,'-'
mov byte ptr ES:0000[si],AL
inc si
inc si
mov AL,'U'
mov byte ptr ES:0000[si],AL
inc si
inc si
mov AL,'n'
mov byte ptr ES:0000[si],AL
inc si
inc si
mov AL,'l'
mov byte ptr ES:0000[si],AL
inc si
inc si
mov AL,'o'
mov byte ptr ES:0000[si],AL
inc si
inc si
mov AL,'a'
mov byte ptr ES:0000[si],AL
inc si
inc si
mov AL,'d'
mov byte ptr ES:0000[si],AL
inc si
inc si
mov AL,'e'
mov byte ptr ES:0000[si],AL
inc si
inc si
mov AL,'d'
mov byte ptr ES:0000[si],AL
inc si
inc si
mov AL,'-'
mov byte ptr ES:0000[si],AL
inc si
inc si
ret
printunload endp
;-----------------------------------------
ressize=$-begin
; ---------- INSTALLiation --------------
Install:
mov BL,ES:[80h] ; Длинна строки параметров ; Looking
cmp bl,0 ; for
je NoParam ; Command
mov BL,ES:[82h] ; line's
cmp BL,'/' ; key
jne NotRkey ; If '/?'
mov BL,ES:[83h] ;
cmp BL,'?' ; then help, else
jne NotRkey ; message about
; key's.
;
mov ah,09h ;
lea dx,help ;
int 21h ;
jmp noInst ;
;
NotRkey: ;
mov ah,09h ;
lea dx,Unknownkey ;
int 21h ;
jmp noInst ;
NoParam:
mov AX,0C00h
int 2dh
cmp AL,0ffh
je reinsttry
mov AX,352Dh
int 21h
mov word ptr oldhandler2d,BX
mov word ptr oldhandler2d+2,ES
mov AX,252Dh
mov DX,offset my2dhandler
int 21h
mov AX,3509h
int 21h
mov word ptr oldhandler09,BX
mov word ptr oldhandler09+2,ES
mov AX,2509h
mov DX,offset newkeybhandler
int 21h
mov AH,09h
lea DX,Installed
int 21h
mov AX,3100h
mov DX,(ressize+10FH)/16