Док 7 - Текст программы (1071528)
Текст из файла
Московский Государственный Технический Университет им. Н.Э.Баумана
Утверждаю:
Большаков С.А.
«___»____________ 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
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.