-4. Текст Программы (1071400)
Текст из файла
9
Московский государственный технический университет им. Н.Э.Баумана
____________________________________________________________________
Утверждаю: | |
Большаков С.А. | "__"_____________2002 г. |
Курсовая работа по системному программированию
“Загрузчик текстового шрифта в память дисплея ”
Текст программы
(вид документа)
писчая бумага
(вид носителя)
7
(количество листов)
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-51 | _____________________ |
Свиридов А.С. | "__"_____________2002 г. |
Москва - 2002
________________________________________________________________
1 ; Резидентная программа загрузки шрифта в память дисплея
Turbo Assembler Version 4.1 15/12/02 23:49:11 Page 1
font.ASM
1 ; Резидентная программа загрузки шрифта в память дисплея
2 0000 text segment 'code'
3 assume CS:text,DS:text
4 org 100h
5
6 .186
7 ; *************** Основная процедура *****************
8 0100 main proc far
9 0100 E8 01B9 call Init ; вызываем инициализацию
10 include TSR.inc ; включаем резидентные подпрограммы и данные
1 11 ; ------- Код для резидентной части ------
1 12 ; ********** Новый обработчик мультиплексного прерывания 2Fh **********
1 13 ; * Используется для управления программой извне. *
1 14 ; * Вход: АН=0CDh - перехватываемая функция. *
1 15 ; * AL: запрашиваемое действие *
1 16 ; * AL=00: проверка на установленность. Выход: AL=01: загружена *
1 17 ; * AL=01: выгрузить программу. Выход: AL=00: успех, AL=0E: неудача *
1 18 ; *********************************************************************
1 19 0103 New_2Fh proc near
1 20 0103 80 FC CD cmp AH, 0CDh ; Наша функция?
1 21 0106 75 09 jne CallStandart ; Нет-вызываем стандартный обработчик
1 22 0108 3C 00 cmp AL, 00h ; проверка на установленность
1 23 010A 74 0A je Loaded
1 24 010C 3C 01 cmp AL, 01h ; выгрузить программу
1 25 010E 74 09 je UnLoad
1 26 0110 CF iret ; ###
1 27 0111 CallStandart:
1 28 ; Используем jmp, чтобы не связываться со стеком. В этом случае после
1 29 ; отработки системного обработчика в наш управление не возвращается.
1 30 0111 2E: FF 2E 0212r jmp CS:Old_2Fh ; вызываем стандартный обработчик
1 31 0116 Loaded:
1 32 0116 B0 01 mov AL, 01h ; да, прога уже установлена
1 33 0118 CF iret
1 34 0119 UnLoad: ; выгрузить программу
1 35 0119 1E 06 53 51 52 push DS ES BX CX DX ; сохраним используемые регистры
1 36 011E B0 0E mov AL, 0Eh ; пишем код ошибки при выгрузке
1 37 0120 E8 002D call CheckIfLast ; проверяем, можно ли выгружать
1 38 0123 3C 0E cmp AL, 0Eh ; нельзя-на выход
1 39 0125 74 23 je Finish_New_2Fh
1 40 ; восстанавливаем перехваченные векторы
1 41 ; восстанавливаем 09h
1 42 0127 B8 2509 mov AX, 2509h ; 25-установка вектора, 09-номер
1 43 012A 2E: C5 16 0216r lds DX, CS:Old_09h ; DS:=HIBYTE(Old_09h), DX:=LOBYTE(Old_09h)
1 44 012F CD 21 int 21h
1 45 ; восстанавливаем 2Fh
1 46 0131 B8 252F mov AX, 252Fh ; 25-установка вектора, 2F-номер
1 47 0134 2E: C5 16 0212r lds DX, CS:Old_2Fh ; DS:=HIBYTE(Old_2Fh), DX:=LOBYTE(Old_2Fh)
1 48 0139 CD 21 int 21h
1 49 ; Получим из PSP адрес собственного окружения и выгрузим его
1 50 013B 2E: 8E 06 002C mov ES,CS:2Ch
1 51 0140 B4 49 mov AH, 49h ; функция освобождения памяти
1 52 0142 CD 21 int 21h
1 53 ; а теперь выгрузим саму программу
1 54 0144 0E push CS
1 55 0145 07 pop ES ; ES:=CS-указывает на PSP
1 56 0146 B4 49 mov AH, 49h ; функция освобождения памяти
1 57 0148 CD 21 int 21h
Turbo Assembler Version 4.1 15/12/02 23:49:11 Page 2
font.ASM
1 58 014A Finish_New_2Fh:
1 59 014A 5A 59 5B 07 1F pop DX CX BX ES DS ; восстанавливаем используемые регистры
1 60 014F CF iret
1 61 0150 New_2Fh endp
1 62
1 63 ; *********** Проверка, является ли наш вектор 09h последним ***********
1 64 ; * Только в этом случае возможна корректная выгрузка *
1 65 ; * Т.к. код ошибки уже записан в AL, при невозможности выгрузки надо *
1 66 ; * всего лишь пойти на выход. В противном случае-записать в AL ноль *
1 67 ; **********************************************************************
1 68 0150 CheckIfLast proc
1 69 ; получим в ES:BX адрес последнего вектора
1 70 0150 50 push AX ; сохраняем
1 71 0151 B4 35 mov AH, 35h
1 72 0153 B0 09 mov AL, 09h
1 73 0155 CD 21 int 21h
1 74 0157 58 pop AX
1 75 0158 81 FB 0169r cmp BX, offset New_09h
1 76 015C 75 0A jne FinCheck
1 77 015E 8C C1 mov CX,ES
1 78 0160 8C CB mov BX,CS
1 79 0162 3B CB cmp CX,BX
1 80 0164 75 02 jne FinCheck
1 81 0166 B0 00 mov AL,00
1 82 0168 FinCheck:
1 83 0168 C3 ret
1 84 0169 CheckIfLast endp
1 85
1 86 ; *********** Новый обработчик прерывания от клавиатуры 09h ***********
1 87 ; * Используется для активации замены шрифта. *
1 88 ; *********************************************************************
1 89 0169 New_09h proc near
1 90 0169 FA cli
1 91 016A 9C pushf
1 92 ; А здесь используем call, так как сначала вызываем системный
1 93 ; обработчик, а потом надо перейти в наш
1 94 016B 2E: FF 1E 0216r call CS:Old_09h
1 95 0170 50 53 51 06 push AX BX CX ES
1 96 ; получим символ из буфера
1 97 0174 B8 0040 mov AX, 40h
1 98 0177 8E C0 mov ES,AX ; по адресу 40h находятся данные БИОС
1 99 0179 26: 8B 1E 001A mov BX, ES:1ah ; адрес очередного символа
1 100 017E 26: 8B 07 mov AX, ES:[BX] ; в АХ - скан-код нажатой клавиши
1 101 0181 3D 8500 90 cmp AX, F11 ; наша ?
1 102 0185 75 03 jne Finish_New_09h ; нет-на выход
1 103 0187 E8 0006 call SwapChars ; да-заменяем шрифт
1 104 018A Finish_New_09h:
1 105 018A 07 59 5B 58 pop ES CX BX AX
1 106 018E FB sti
1 107 018F CF iret
1 108 0190 New_09h endp
1 109
1 110 ; ******* Процедура замены шрифта в зависимости от значения flag *******
1 111 0190 SwapChars proc near
1 112 0190 60 pusha
1 113 0191 06 push ES ; сохраняем регистры
1 114
Turbo Assembler Version 4.1 15/12/02 23:49:11 Page 3
font.ASM
1 115 ;mov AX,0B800h ; адрес текстовой видеопамяти
1 116 ;mov ES, AX
1 117 ;mov Ah, flag
1 118 ;mov Al, 0fh
1 119 ;mov ES:1,ax ; 0F- белый на чёрном фоне, 07-ASCII код символа
1 120
1 121 0192 80 3E 021Ar 01 cmp flag,1
1 122 0197 74 23 je LoadNew
1 123 0199 80 3E 021Ar 02 cmp flag,2
1 124 019E 74 47 je LoadOld
1 125 ; 1-й раз - сохраняем старый шрифт, потом переходим на LoadNew
1 126 01A0 1E push DS
1 127 01A1 B8 1130 mov AX,1130h
1 128 01A4 B7 01 mov BH, 01h ; Получаем адрес старого шрифта
1 129 01A6 CD 10 int 10h
1 130 ; ES:BP - адрес старого шрифта
1 131 ; Для movsb надо: DS:SI-адрес источника
1 132 01A8 1E 06 push DS ES ; \ меняем содержимое
1 133 01AA 1F 07 pop DS ES ; / DS и ES местами.
1 134 01AC 8B F5 mov SI,BP
1 135 01AE 81 C6 0800 add SI,'А'*16 ; начальный символ
1 136 01B2 BF 021Br mov DI,offset oldchar
1 137 ; ES:DI-адрес приёмника
1 138 01B5 FC cld ; DF:=0 (двигаемся вперёд)
1 139 01B6 B9 0050 mov CX,16*5 ; количество повторений
1 140 01B9 F3> A4 rep movsb ; oldchar:=старый шрифт
1 141 01BB 1F pop DS ; восстанавливаем DS
1 142 01BC LoadNew:
1 143 ; рисуем символ в верхнем левом углу экрана
1 144 01BC B8 B800 mov AX,0B800h ; адрес текстовой видеопамяти
1 145 01BF 8E C0 mov ES, AX
1 146 01C1 26: C7 06 0000 0F07 mov ES:0,0F07h ; 0F- белый на чёрном фоне, 07-ASCII код символа
1 147
1 148 01C8 8C C8 mov AX, CS ; ES:=CS
1 149 01CA 8E C0 mov ES, AX
1 150
1 151 01CC B8 1110 mov AX, 1110h ; Загрузка и активация шрифта
1 152 01CF B7 10 mov BH,16 ; Высота символа
1 153 01D1 B3 00 mov BL,0 ; Блок знакогенератора
1 154 01D3 B9 0005 mov CX,5 ; Количество символов
1 155 01D6 BA 0080 mov DX,'А' ; ASCII код символа А
1 156 01D9 BD 026Br mov BP, offset newchar ; ES:BP - адрес нового шрифта
1 157 01DC CD 10 int 10h
1 158 01DE C6 06 021Ar 02 90 mov flag,2 ; Следующий раз надо будет загружать старый шрифт
1 159 01E4 EB 29 90 jmp Fin
1 160
1 161 01E7 LoadOld:
1 162 ; рисуем символ в верхнем левом углу экрана
1 163 01E7 B8 B800 mov AX,0B800h ; адрес текстовой видеопамяти
1 164 01EA 8E C0 mov ES, AX
1 165 01EC 26: C7 06 0000 0F09 mov ES:0,0F09h ; 0F- белый на чёрном фоне, 09-ASCII код символа
1 166
1 167 01F3 8C C8 mov AX, CS ; ES:=CS
1 168 01F5 8E C0 mov ES, AX
1 169
1 170 01F7 B8 1110 mov AX, 1110h ; Загрузка и активация шрифта
1 171 01FA B7 10 mov BH,16 ; Высота символа
Turbo Assembler Version 4.1 15/12/02 23:49:11 Page 4
font.ASM
1 172 01FC B3 00 mov BL,0 ; Блок знакогенератора
1 173 01FE B9 0005 mov CX,5 ; Количество символов
1 174 0201 BA 0080 mov DX,'А' ; ASCII код символа А
1 175 0204 BD 021Br mov BP, offset oldchar ; ES:BP - адрес нового шрифта
1 176 0207 CD 10 int 10h
1 177 0209 C6 06 021Ar 01 90 mov flag,1 ; Следующий раз надо будет загружать новый шрифт
1 178
1 179 020F Fin:
1 180 020F 07 pop ES
1 181 0210 61 popa ; восстанавливаем регистры
1 182 0211 C3 ret ; возврат
1 183 0212 SwapChars endp
1 184
1 185
1 186 ; +++++++ Данные резидентной части +++++++
1 187 0212 00000000 Old_2Fh dd 0
1 188 0216 00000000 Old_09h dd 0
1 189 =8500 F11 equ 8500h ; горячая клавиша
1 190 021A 00 flag db 0 ; 0=>1-й запуск; 1=>грузить новый шрифт; 2=>старый
1 191 021B 50*(00) oldchar db 80 dup(0) ; буфер для старого шрифта
1 192 ; А
1 193 026B 00 newchar db 00000000b ; новые начертания букв АБВГД
1 194 026C 00 db 00000000b
1 195 026D 00 db 00000000b
1 196 026E 3C db 00111100b
1 197 026F 42 db 01000010b
1 198 0270 42 db 01000010b
1 199 0271 42 db 01000010b
1 200 0272 7E db 01111110b
1 201 0273 42 db 01000010b
1 202 0274 42 db 01000010b
1 203 0275 42 db 01000010b
1 204 0276 00 db 00000000b
1 205 0277 FF db 11111111b
1 206 0278 00 db 00000000b
1 207 0279 00 db 00000000b
1 208 027A 00 db 00000000b
1 209 ; Б
1 210 027B 00 db 00000000b
1 211 027C 00 db 00000000b
1 212 027D 00 db 00000000b
1 213 027E 7E db 01111110b
1 214 027F 40 db 01000000b
1 215 0280 40 db 01000000b
1 216 0281 7C db 01111100b
1 217 0282 42 db 01000010b
1 218 0283 42 db 01000010b
1 219 0284 42 db 01000010b
1 220 0285 7C db 01111100b
1 221 0286 00 db 00000000b
1 222 0287 FF db 11111111b
1 223 0288 00 db 00000000b
1 224 0289 00 db 00000000b
1 225 028A 00 db 00000000b
1 226 ; В
1 227 028B 00 db 00000000b
1 228 028C 00 db 00000000b
Turbo Assembler Version 4.1 15/12/02 23:49:11 Page 5
font.ASM
1 229 028D 00 db 00000000b
1 230 028E 7C db 01111100b
1 231 028F 42 db 01000010b
1 232 0290 42 db 01000010b
1 233 0291 7C db 01111100b
1 234 0292 42 db 01000010b
1 235 0293 42 db 01000010b
1 236 0294 42 db 01000010b
1 237 0295 7C db 01111100b
1 238 0296 00 db 00000000b
1 239 0297 FF db 11111111b
1 240 0298 00 db 00000000b
1 241 0299 00 db 00000000b
1 242 029A 00 db 00000000b
1 243 ; Г
1 244 029B 00 db 00000000b
1 245 029C 00 db 00000000b
1 246 029D 00 db 00000000b
1 247 029E 7E db 01111110b
1 248 029F 40 db 01000000b
1 249 02A0 40 db 01000000b
1 250 02A1 40 db 01000000b
1 251 02A2 40 db 01000000b
1 252 02A3 40 db 01000000b
1 253 02A4 40 db 01000000b
1 254 02A5 40 db 01000000b
1 255 02A6 00 db 00000000b
1 256 02A7 FF db 11111111b
1 257 02A8 00 db 00000000b
1 258 02A9 00 db 00000000b
1 259 02AA 00 db 00000000b
1 260 ; Д
1 261 02AB 00 db 00000000b
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.