Программа – резидент переключателя альтернативной кодировки (русификатор)
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
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