28.05.2010, 17:20
общий
это ответ
Здравствуйте, Гальцов Андрей.
Пример программирования знакогенератора для замены матрицы одного символа приведен в приложении. Предполагается, что видеоадаптер — VGA. Программа это не проверяет. Сначала программа определяет высоту символьной матрицы. Затем, если матрица стандартная (8, 14 или 16 байт), то запрашивается адрес таблицы определения шрифта. Перед вызовом функции регистр CX устанавливается в -1, после возврата из прерывания можно проверить CX — если значение не изменилось, то соответствующая функция недоступна. (Программа эту проверку не делает.) Затем сохраняется текущая матрица для буквы 'u' и заменяется на матрицу для буквы 'г'. Перед выходом матрица буквы 'u' восстанавливается.
Компилировать в COM-файл.
Программа нормально работает в DOSBOX (у меня используется русификатор UNISCR). В окне DOS в оконном режиме — не работает, в полноэкранном — работает наполовину: матрица 'u' заменяется, но не на 'г' — на соответствующем месте в таблице, указатель на которую возвращает ф-я 1130h, рисунок буквы 'u с черточкой'. Чтобы гарантировать замену на 'г', программа должна сама предоставить 3 матрицы: для шрифтов 8x8, 8x14 и 8x16. Вот, например, матрица 8x16:
db 0, 0, 0, 0, 0FEh, 66h, 60h, 60h, 60h, 60h, 60h, 60h, 0F0h, 0, 0, 0 ; г
Успехов!
Приложение:
; Программирование знакогенератора VGA
; английская буква "u" заменяетстя на pусскую букву "г"
; (расположены на одной клавише)
; Перед выходом таблица шрифта восстанавливается.
locals @@
model tiny
.data
msgIntro db 13,10,'Reprogramming character generator to change char(75h).'
db 13,10,'These are sample strings:'
db 13,10,'qwertyuiop'
db 13,10,'йцукенгшщз'
db 13,10,' ^',13,10,'$'
msgNonStandard db 13,10,'Non-standard font is used.'
db 13,10,'Don''t know how to get font table to save character matrix.'
db 13,10,'Press any key to exit...',13,10,'$'
msgExit db 13,10,'Press any key to exit. The font table will be restored...$'
matrix_u db 16 dup(0)
.code
.startup
mov ah,9 ; Информационное сообщение
mov dx,offset msgIntro
int 21h
mov ax,40h
push ax
pop ES ; ES = область данных BIOS
mov ax,ES:[85h] ; высота символьной матрицы = байт/символ
mov bh,3 ; получить адрес шрифта 8x8
cmp al,8
je @@fn11
mov bh,2 ; получить адрес шрифта 8x14
cmp al,14
je @@fn11
mov bh,6 ; получить адрес шрифта 8x16
cmp al,16
je @@fn11
mov ah,9
mov dx,offset msgNonStandard
int 21h
xor ah,ah ; ждем нажатия любой клавиши
int 16h
int 20h
@@fn11:
mov ax,1130h
mov cx,-1
int 10h
; CX = высота символьной матрицы = байт/символ
; ES:BP - адрес таблицы шрифта
; вычисляем смещение буквы 'u' в таблице шрифта
mov al,'u'
mul cl ; AX = код символа * высоту матрицы
mov bh,cl ; BH = высота матрицы для дальнейшего использования
mov si,bp
add si,ax ; SI = смещение матрицы символа 'u' в таблице
push DS ; обмениваем значения регистров DS и ES
push ES
pop DS
pop ES
mov di,offset matrix_u
rep movsb ; сохраняем матрицу
push DS ; обмениваем значения регистров DS и ES
push ES ; (восстанавливаем прежние значения)
pop DS
pop ES
; вычисляем смещение буквы 'г' в таблице шрифта
mov al,'г'
mul bh ; AX = код символа * высоту матрицы
add bp,ax ; BP = смещение матрицы символа 'г' в таблице
; загружаем матрицу буквы 'г' для 'u'
; ES:BP = адрес таблицы шрифта (у нас - один символ)
mov ax,1100h
mov bl,0 ; BL=блок шрифта, BH=высота матрицы
mov cx,1 ; CX = количество определяемых символов
mov dx,'u' ; DX = ASCII код первого символа
int 10h
mov ah,9
mov dx,offset msgExit ; предложение нажать клавишу для выхода
int 21h
xor ah,ah ; ждем нажатия любой клавиши
int 16h
mov ax,1100h ; восстанавливаем матрицу для буквы 'u'
mov dx,'u'
push DS
pop ES
mov bp,offset matrix_u
int 10h
int 20h ; завершаем программу
end