Док 7 - Текст программы (КП - управление принтером, 1 вариант)
Описание файла
Файл "Док 7 - Текст программы" внутри архива находится в следующих папках: КП - управление принтером, 1 вариант, max. Документ из архива "КП - управление принтером, 1 вариант", который расположен в категории "". Всё это находится в предмете "системное программирование" из 5 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "системное программирование" в общих файлах.
Онлайн просмотр документа "Док 7 - Текст программы"
Текст из документа "Док 7 - Текст программы"
Московский Государственный Технический Университет им. Н.Э.Баумана
Утверждаю:
Большаков С.А.
«___»____________ 2003 г.
Курсовая работа по дисциплине СП
«Управление принтером»
текст программы
(вид документа)
А4
(носитель)
_____________
(кол-во листов)
Выполнил:
студент группы ИУ5-53
Пыченков А.Б.
Москва
2003
Файл prnctl.asm
MY_INT equ 2fh
MY_FN equ 77h
CHECK_FN equ 01h
CHECK_PRESENTS equ 1234h
UNLOAD_FN equ 02h
BUFFER_SIZE equ 20
code segment
assume cs:code, ds:code
org 100h
start: jmp begin
oldKeybVector dd ? ;Старый вектор прерывания 09h
oldMyVector dd ? ;Старый вектор прерывания 2fh
currentFont db 0 ;Текущий шрифт принтера
currentSize db 0 ;Текущий режим печати
f1key db 'Прогон страницы$'
f2key0 db 'Шрифт 1$'
f2key1 db 'Шрифт 2$'
f3key0 db 'Режим 1$'
f3key1 db 'Режим 2$'
screenbuffer db BUFFER_SIZE*2 dup (' ') ;Буфер для хранения участка экрана
storebuffer proc far
;Функция сохранения начала видеопамяти в буфере
;Вход - нет
;Выход - screenbuffer
cld
push ds
push es
push ax
push cx
push si
push di
mov ax,cs
mov es,ax
mov ax,0b800h
mov ds,ax
mov si,0h
lea di,cs:screenbuffer
mov cx,BUFFER_SIZE*2
rep movsb
pop di
pop si
pop cx
pop ax
pop es
pop ds
ret
storebuffer endp
printbuffer proc far
;Функция вывода в начало видеопамяти сохраненного буфера
;Вход - screenbuffer
;Выход - нет
cld
push ds
push es
push ax
push cx
push si
push di
mov ax,cs
mov ds,ax
mov ax,0b800h
mov es,ax
mov di,0h
lea si,cs:screenbuffer
mov cx,BUFFER_SIZE*2
rep movsb
pop di
pop si
pop cx
pop ax
pop es
pop ds
ret
printbuffer endp
printstring proc far
;Функция прямой печати строки в видеопамяти
;с аттрибутом 8bh
;Вход - si - строка на печать
;Выход - нет
cld
push di
push ax
push cx
push ds
push es
mov di,00h
mov ax,0b800h
mov es,ax
mov ax,cs
mov ds,ax
printstring_loop:
lodsb
cmp al,'$'
je printstring_finish
stosb ;Печать символа
mov al,8bh
stosb ;Печать атрибута
jmp printstring_loop
printstring_finish:
pop es
pop ds
pop cx
pop ax
pop di
ret
printstring endp
keybdint proc far
;Функция-обработчик прерывания от клавиатуры
;Вход - нет
;Выход - currentFont, currentSize
push ax
push es
mov ax,40h
mov es,ax
mov al,es:[17h] ;Чтение флагов из 40:17h
pop es
and al,04h
test al,al ;нажат ли Ctrl
jz keybd_call_old
in al,60h ;читаем нажатую кнопку
cmp al,3bh ;Ctrl+F1
je keybd_page_feed
cmp al,3ch ;Ctrl+F2
je keybd_mode_switch
cmp al,3dh ;Ctrl+F3
je keybd_set_size
keybd_call_old: ;вызов старого прерывания
pop ax
jmp dword ptr cs:oldKeybVector
keybd_page_feed:
;выводим надпись
push si
call storebuffer
lea si,cs:f1key
call printstring
push dx
mov ah,0 ;команда принтеру `прогон страницы`
mov al,0ch
mov dx,0
int 17h
pop dx
kbd_loop1: ;Ожидание отпускания клавиши
in al,60h
cmp al,3bh
je kbd_loop1
call cs:printbuffer
pop si
jmp keybd_finish
keybd_mode_switch:
xor cs:currentFont,1 ;currentFont=1-currentFont
push si
call storebuffer
lea si,cs:f2key0
cmp cs:currentFont,0
je keybd_f2_next
lea si,cs:f2key1
keybd_f2_next:
call cs:printstring
push dx
mov ah,0 ;команда принтеру установки шрифта
mov dx,0
mov al,1bh
int 17h
mov ah,0
mov al,45h
cmp cs:currentFont,0
je keybd_f2_next1
mov al,46h
keybd_f2_next1:
int 17h
pop dx
kbd_loop2: ;Ожидание отпускания клавиши
in al,60h
cmp al,3ch
je kbd_loop2
call cs:printbuffer
pop si
jmp keybd_finish
keybd_set_size:
xor cs:currentSize,1 ;currentSize=1-currentSize
push si
call storebuffer
lea si,cs:f3key0
cmp cs:currentSize,0
je keybd_f3_next
lea si,cs:f3key1
keybd_f3_next:
call cs:printstring
push dx
mov ah,0 ;команда принтеру установки размера страницы
mov al,1bh
mov dx,0
int 17h
mov ah,0
mov al,32h
cmp cs:currentSize,0
je keybd_f3_next1
mov al,30h
keybd_f3_next1:
int 17h
pop dx
kbd_loop3:
in al,60h ;Ожидание отпускания клавиши
cmp al,3dh
je kbd_loop3
call cs:printbuffer
pop si
jmp keybd_finish
keybd_finish:
mov al,20h
out 20h,al
pop ax
iret
keybdint endp
myint proc far
;Функция-обработчик мультиплексного прерывания
;Вход - ah,al
;Выход - ax
cmp ah,MY_FN
je myint_cont
myint_runold:
jmp cs:oldMyVector
myint_cont:
push dx
cmp al,CHECK_FN
je myint_check
cmp al,UNLOAD_FN
je myint_unload
pop dx
jmp cs:oldMyVector
myint_check:
mov ax,CHECK_PRESENTS ;Проверка загрузки
jmp myint_finish
myint_unload: ;Выгрузка
push ds
push es
;Восстановление векторов
mov dx,cs:word ptr [oldKeybVector]
mov ds,cs:word ptr [oldKeybVector+2]
mov ah,25h
mov al,9h
int 21h
mov dx,cs:word ptr [oldMyVector]
mov ds,cs:word ptr [oldMyVector+2]
mov ah,25h
mov al,MY_INT
int 21h
;Освобождение памяти
mov es,cs:[2ch]
mov ah,49h
int 21h
push cs
pop es
mov ah,49h
int 21h
pop es
pop ds
myint_finish:
pop dx
iret
myint endp
;Загрузчик программы
begin:
;Смотрим /?
mov ch,0
mov cl,ds:[80h]
jcxz load
mov al,ds:[82h]
cmp al,'/'
jne cmderr
mov al,ds:[83h]
cmp al,'?'
jne cmderr
mov ah,9h
lea dx,helpStr
int 21h ;Выводим справку
mov ah,4ch
int 21h
cmderr: ;Ошибка в командной строке
mov ah,9h
lea dx,cmdErrStr
int 21h
mov ah,4ch
int 21h
load:
;Проверяем на наличие в памяти
mov ah,MY_FN
mov al,CHECK_FN
int MY_INT
cmp ax,CHECK_PRESENTS
jne install
mov ah,9
lea dx,alreadyPresentsStr
int 21h ;Программа уже загружена
mov ah,4ch
int 21h
install:
;Запоминаем старые векторы
mov ah,35h
mov al,9h
int 21h
mov word ptr oldKeybVector,bx
mov word ptr oldKeybVector+2,es
mov al,MY_INT
int 21h
mov word ptr oldMyVector,bx
mov word ptr oldMyVector+2,es
;Устанавливаем новые векторы
mov ah,25h
mov al,09h
lea dx,keybdint
int 21h
mov al,MY_INT
lea dx,myint
int 21h
;Сообщение об успешной загрузке
mov ah,9
lea dx,loadedStr
int 21h
;Остаемся резидентно
lea dx,begin
int 27h
alreadyPresentsStr db 'Программа уже загружена',10,13,'$'
loadedStr db 'Программа загружена',10,13,'$'
helpStr db 'prnctl.com - управление принтером',10,13,'Для выгрузки программы используйте unldtsr.exe',10,13,'Автор: Пыченков Алексей, ИУ5-53',10,13,'$'
cmdErrStr db 'Неверный аргумент. Для получения справки введите',10,13,'prnctl.com /?',10,13,'$'
code ends
end start
Файл unldtsr.asm
MY_INT equ 2fh
MY_FN equ 77h
CHECK_FN equ 01h
CHECK_PRESENTS equ 1234h
UNLOAD_FN equ 02h
stck segment stack
db 256 dup (?)
stck ends
data segment
notpresentstr db 'Программа не загружена в память',10,13,'$'
unloadedstr db 'Программа выгружена из памяти',10,13,'$'
data ends
code segment
assume cs:code, ds:data, ss:stck
main proc
mov ax,data
mov ds,ax
;Проверяем на наличие в памяти
mov ah,MY_FN
mov al,CHECK_FN
int MY_INT
cmp ax,CHECK_PRESENTS
je unload
mov ah,9 ;Программа отсутствует в памяти
lea dx,notpresentstr
int 21h
mov ah,4ch
int 21h
unload:
mov ah,MY_FN ;Вызов функции выгрузки
mov al,UNLOAD_FN
int MY_INT
mov ah,9
lea dx,unloadedstr
int 21h
mov ah,4ch
int 21h
main endp
code ends
end main