-4. Текст Программы (1071400), страница 2
Текст из файла (страница 2)
1 262 02AC 00 db 00000000b
1 263 02AD 00 db 00000000b
1 264 02AE 3E db 00111110b
1 265 02AF 42 db 01000010b
1 266 02B0 42 db 01000010b
1 267 02B1 42 db 01000010b
1 268 02B2 42 db 01000010b
1 269 02B3 42 db 01000010b
1 270 02B4 FF db 11111111b
1 271 02B5 81 db 10000001b
1 272 02B6 00 db 00000000b
1 273 02B7 FF db 11111111b
1 274 02B8 00 db 00000000b
1 275 02B9 00 db 00000000b
1 276 02BA 00 db 00000000b
277 02BB CF iret
278 02BC main endp
279
280 =01BC TSRSize = $-main ; размер резидентной части
281
282 include Init.inc ; включаем инициализационные подпрограммы и данные
1 283 ; *************** Инициализация. Выполняется первой *****************
1 284 02BC Init proc
1 285 ; Сначала проверяем, есть ли параметры
Turbo Assembler Version 4.1 15/12/02 23:49:11 Page 6
font.ASM
1 286 02BC EB 16 90 jmp CheckParams ; ####
1 287 02BF NoParams:
1 288 ; Проверка: запущена ли уже программа
1 289 02BF B8 CD00 mov AX, 0CD00h ; перехваченная функция
1 290 02C2 CD 2F int 2Fh
1 291 02C4 3C 01 cmp AL,1 ; AL=1, если прога запущена
1 292 02C6 75 68 jne Work ; Нет копии-переходим, наконец, к работе
1 293 02C8 BA 0405r mov DX, offset sAlreadyHere ; Уже есть копия => просто завершить прогу
1 294 02CB E8 009E call PrintStr
1 295
1 296 02CE Exit:
1 297 02CE B8 4C00 mov AX, 4C00h
1 298 02D1 CD 21 int 21h
1 299 02D3 C3 ret
1 300 02D4 Init endp
1 301
1 302 ; ************************ Процедуры для Init ************************
1 303
1 304 ; ************************ Проверка параметров ***********************
1 305 02D4 CheckParams proc
1 306 02D4 26: 8A 26 0080 mov AH, ES:[80h] ; Здесь хранится длина ком. строки
1 307 02D9 80 FC 00 cmp AH, 0
1 308 02DC 74 E1 je NoParams
1 309 ; Если параметр выгрузки, пробуем выгрузить
1 310 02DE 26: 8A 26 0083 mov AH, ES:[83h]
1 311 02E3 80 FC 75 90 cmp AH, cParamLow
1 312 02E7 74 1C je Try2Kill
1 313 02E9 80 FC 55 90 cmp AH, cParamUp
1 314 02ED 74 16 je Try2Kill
1 315 ; Параметр справки
1 316 02EF 80 FC 3F 90 cmp AH, cParamHelp
1 317 02F3 74 08 je Help
1 318 ; Иначе-выдать сообщение и на выход
1 319 02F5 BA 043Er mov DX, offset sWrongParam
1 320 02F8 E8 0071 call PrintStr
1 321 02FB EB D1 jmp Exit
1 322 02FD CheckParams endp
1 323
1 324 ; ************************ Вывод помощи ***********************
1 325 02FD Help proc
1 326 02FD BA 0451r mov DX, offset sHelp
1 327 0300 E8 0069 call PrintStr
1 328 0303 EB C9 jmp Exit
1 329 0305 Help endp
1 330
1 331 ; *************** Выгрузка первой копии программы *************
1 332 0305 Try2Kill proc
1 333 ; Проверка: запущена ли уже программа
1 334 0305 B8 CD00 mov AX, 0CD00h ; перехваченная функция
1 335 0308 CD 2F int 2Fh
1 336 030A 3C 01 cmp AL,1 ; AL=1, если прога запущена
1 337 030C 74 08 je Kill ; загружена => выгружаем
1 338 030E BA 03DAr mov DX, offset sNotLoaded
1 339 0311 E8 0058 call PrintStr
1 340 0314 EB B8 jmp Exit
1 341 0316 Kill:
1 342 ; Для выгрузки первой копии просто запускаем прерывание с функцией 1
Turbo Assembler Version 4.1 15/12/02 23:49:11 Page 7
font.ASM
1 343 0316 B4 CD mov AH, 0CDh
1 344 0318 B0 01 mov AL, 01h
1 345 031A CD 2F int 2Fh
1 346 031C 3C 0E cmp AL,0Eh ; признак: невозможно выгрузить
1 347 031E 75 08 jne OK
1 348 0320 BA 0386r mov DX, offset sCantKill
1 349 0323 E8 0046 call PrintStr
1 350 0326 EB A6 jmp Exit
1 351 0328 OK:
1 352 0328 BA 0371r mov DX, offset sKilling
1 353 032B E8 003E call PrintStr
1 354 032E EB 9E jmp Exit
1 355 0330 Try2Kill endp
1 356
1 357 ; ************* Основная работа: установка векторов и т.д. ************
1 358 0330 Work proc
1 359 ; Сохраняем старый вектор 2Fh
1 360 0330 B4 35 mov AH, 35h
1 361 0332 B0 2F mov AL, 2Fh
1 362 0334 CD 21 int 21h
1 363 0336 89 1E 0212r mov word ptr Old_2Fh,BX
1 364 033A 8C 06 0214r mov word ptr Old_2Fh+2,ES
1 365 ; Установим новый вектор 2Fh
1 366 033E B4 25 mov AH, 25h
1 367 0340 B0 2F mov AL, 2Fh
1 368 0342 BA 0103r mov DX, offset New_2Fh
1 369 0345 CD 21 int 21h
1 370 ; Сохраняем старый вектор 09h
1 371 0347 B4 35 mov AH, 35h
1 372 0349 B0 09 mov AL, 09h
1 373 034B CD 21 int 21h
1 374 034D 89 1E 0216r mov word ptr Old_09h,BX ; Сохраняем IP
1 375 0351 8C 06 0218r mov word ptr Old_09h+2,ES ; Сохраняем CS
1 376 ; Установим новый вектор 09h0
1 377 0355 B4 25 mov AH, 25h
1 378 0357 B0 09 mov AL, 09h
1 379 0359 BA 0169r mov DX, offset New_09h
1 380 035C CD 21 int 21h
1 381
1 382 ; Завершим прогу, оставив часть резидентной
1 383 035E BA 03C1r mov DX, offset sLoaded
1 384 0361 E8 0008 call PrintStr
1 385 0364 BA 002C mov DX, (TSRSize+10Fh)/16 ; Размер резидентной части в параграфах
1 386 0367 B8 3100 mov AX, 3100h
1 387 036A CD 21 int 21h
1 388 036C Work endp
1 389
1 390 ; ***** Процедура вывода строки *****
1 391 036C PrintStr proc near
1 392 ; Вход: DX-смещение строки Выход: отсутствует
1 393 036C B4 09 mov AH, 09h ; функция вывода строки
1 394 036E CD 21 int 21h
1 395 0370 C3 ret
1 396 0371 PrintStr endp
1 397
1 398 ; ++++++++++ Данные для инициализации ++++++++++
1 399 0371 82 EB A3 E0 E3 A6 A0+ sKilling db 'Выгружаю...Выгрузил!$'
Turbo Assembler Version 4.1 15/12/02 23:49:11 Page 8
font.ASM
400 EE 2E 2E 2E 82 EB A3+
401 E0 E3 A7 A8 AB 21 24
1 402 0386 8D A5 20 AC AE A3 E3+ sCantKill db 'Не могу выгрузиться! Кто-то сел на мой вектор прерывания !$'
403 20 A2 EB A3 E0 E3 A7+
404 A8 E2 EC E1 EF 21 20+
405 8A E2 AE 2D E2 AE 20+
406 E1 A5 AB 20 AD A0 20+
407 AC AE A9 20 A2 A5 AA+
408 E2 AE E0 20 AF E0 A5+
409 E0 EB A2 A0 AD A8 EF+
410 20 21 24
1 411 03C1 46 6F 6E 74 20 43 68+ sLoaded db 'Font Changer загружен.',10,13,'$'
412 61 6E 67 65 72 20 A7+
413 A0 A3 E0 E3 A6 A5 AD+
414 2E 0A 0D 24
1 415 03DA 46 6F 6E 74 20 43 68+ sNotLoaded db 'Font Changer не загружен-нечего выгружать!$'
416 61 6E 67 65 72 20 AD+
417 A5 20 A7 A0 A3 E0 E3+
418 A6 A5 AD 2D AD A5 E7+
419 A5 A3 AE 20 A2 EB A3+
420 E0 E3 A6 A0 E2 EC 21+
421 24
1 422 0405 46 6F 6E 74 20 43 68+ sAlreadyHere db 'Font Changer уже загружен-повторная загрузка невозможна.$'
423 61 6E 67 65 72 20 E3+
424 A6 A5 20 A7 A0 A3 E0+
425 E3 A6 A5 AD 2D AF AE+
426 A2 E2 AE E0 AD A0 EF+
427 20 A7 A0 A3 E0 E3 A7+
428 AA A0 20 AD A5 A2 AE+
429 A7 AC AE A6 AD A0 2E+
430 24
1 431 043E 8D A5 A2 A5 E0 AD EB+ sWrongParam db 'Неверный параметр.$'
432 A9 20 AF A0 E0 A0 AC+
433 A5 E2 E0 2E 24
1 434 0451 82 EB A7 AE A2 20 AF+ sHelp db 'Вызов программы: Font.com [/u|U|?]',10,13,'Параметры u и U '
435 E0 AE A3 E0 A0 AC AC+
436 EB 3A 20 46 6F 6E 74+
437 2E 63 6F 6D 20 5B 2F+
438 75 7C 55 7C 3F 5D 0A+
439 0D 8F A0 E0 A0 AC A5+
440 E2 E0 EB 20 75 20 A8+
441 20 55 20
1 442 0485 A8 E1 AF AE AB EC A7+ db 'используются для выгрузки уже запущенной копии.',10,13
443 E3 EE E2 E1 EF 20 A4+
444 AB EF 20 A2 EB A3 E0+
445 E3 A7 AA A8 20 E3 A6+
446 A5 20 A7 A0 AF E3 E9+
447 A5 AD AD AE A9 20 AA+
448 AE AF A8 A8 2E 0A 0D
1 449 04B6 8F A0 E0 A0 AC A5 E2+ db 'Параметр /? используется для получения этой справки.$'
450 E0 20 2F 3F 20 A8 E1+
451 AF AE AB EC A7 E3 A5+
452 E2 E1 EF 20 A4 AB EF+
453 20 AF AE AB E3 E7 A5+
454 AD A8 EF 20 ED E2 AE+
455 A9 20 E1 AF E0 A0 A2+
456 AA A8 2E 24
Turbo Assembler Version 4.1 15/12/02 23:49:11 Page 9
font.ASM
1 457 =003F cParamHelp = '?'
1 458 =0075 cParamLow = 'u'
1 459 =0055 cParamUp = 'U'
460
461 04EB text ends
462 end main