Программа – резидент переключателя альтернативной кодировки (русификатор)

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

push di

push es

mov di,0A000h ;смещение на начало видеобуфера

mov es,di ;будет адресоваться через сегмент доп. данных

xor ah,ah ; чистка

imul di,ax,20h ; ?????????????

push ds

push si

mov si,cs ;

mov ds,si ; для адресации данных устанавливаем DS

lea si,WRITE_ON ; на массив параметров

push cx

call SetMode

pop cx

 

pop si

pop ds

mov dl,ch

xor ch,ch

xor dh,dh

@@All_symbols:

push cx

mov ax,di

mov cx,dx

shr cx,1 ; cx /= 2

rep movsw

mov di,ax

add di,20h

pop cx

loop @@All_symbols

lea si,WRITE_OFF

call SetMode

pop es

pop di

pop si

pop dx

pop cx

pop ax

popf

ret

WRITE_ON db 2,4 ; Параметры включения

db 4,7 ; генерации

db 4,2

db 5,0

db 6,4

WRITE_OFF db 2,3 ; Параметры завершения

db 4,3 ; генерации

db 4,0

db 5,10h

db 6

DispType db 0Eh ; 0Eh - CGA/EGA/VGA 0Ah - MDA/HDA

LoadFont endp

SetMode proc

xor cx,cx

mov cl,2

mov dx,3C4h ; делаем доступным

call @@Outport ; знакогенератор пользователя в памяти EGA

mov cl,3

mov dl,0CEh

@@Outport:

rep outsw

retn

SetMode endp

SetDisplayType proc

push ax

push es

xor ax,ax

mov al,es:[0487h] ; а какой у тебя адаптер ?

test al,2 ; EGA ?

jz @@Exit

mov al,0Ah ; MDA / HDA - значит

mov [DispType],al ; придется с ним работать

@@Exit:

pop es

pop ax

ret

SetDisplayType endp

NewFont db 16*256 dup(0)

END_TSR:

FileName db 8x16.fnt,0

ErrorMsg db Cannot find 8x16.fnt in current directory.

Aborting,13,10,$

Install:

mov ax,3D00h ; отpыть файл

 

mov dx,offset FileName

int 21h

jc errorExit ; CF=1 - ну не смог открыть …

mov bx,ax ; bx - дескpиптоp

mov cx,4096 ; количество байт

mov dx,offset NewFont ; указатель на буффеp

mov ah,3Fh ; пpочитать из файла

int 21h ;cx

mov ah,3Eh ; закpыть файл

int 21h

mov al,0

mov cl,0FFh

mov ch,16

mov si,offset NewFont

call LoadFont ; пеpвоначальная загpузка фонта

mov ax,3509h ; какой адрес 09 ?

int 21h

mov word ptr [OldHandler09],bx ; получаем и сохpаняем стаpый

mov word ptr [OldHandler09+2],es ; вектоp int 09

mov dx,offset Hook09

mov ax,2509h ; устанавливаем свой

int 21h

mov ax,3510h

int 21h

mov word ptr [OldHandler10],bx

mov word ptr [OldHandler10+2],es

mov dx,offset Hook10

mov ax,2510h

int 21h

mov dx,offset END_TSR ; DX первый байт после нас

int 27h ; выйти и pез.

errorExit:

mov ah,09

mov dx,offset ErrorMsg

int 21h

mov ax,4C01h ; пpосто выход пpи ошибке

int 21h

END