Консультация № 178573
22.05.2010, 21:01
0.00 руб.
0 5 1
Здравствуйте!

Помогите пожалуйста написать программу по загружаемым символьным наборам.

Задание - заменить букву английского алфавита "u" на соответствующую на клавише букву pусского алфавита "г".
После выполнения задания восстановить изобpажение на экpане.

Предпочтителен - TASM, но буду рад и другим вариантам.
Процессор - 64-битный.

Спасибо!

Обсуждение

Неизвестный
27.05.2010, 12:57
общий
Гальцов Андрей:
Не знаю, как другие эксперты, а я не понял, что нужно сделать.

Перепрограммировать знакогенератор? ("написать программу по загружаемым символьным наборам")
Прочитать изображение из буфера экрана и заменить "u" на "г"?
Заменять "u" на "г" при вводе с клавиатуры? (маловероятно, но кто знает)
Заменять только "u" на "г" или каждую латинскую на русскую, расположенную на той же клавише? (вот не было бы фразы "на соответствующую на клавише букву pусского алфавита" и этот вопрос не возник бы)

Наверное, другие эксперты тоже затрудняются понять, что же Вам нужно, потому и ответа еще нет. И отвечают на другие вопросы.
Неизвестный
27.05.2010, 19:46
общий
amnick:
Только "u" на "г"...эм, да, заменять "u" на "г" при вводе с клавиатуры...
Нашел кое какие примеры:

TITLE 'Listing 1'
NAME CGenModeSet
PAGE 55,132
;
; Name: CGenModeSet
;
; Прямой доступ к EGA и VGA символьному генератору RAM
;
; Caller: Microsoft C:
;
; void CGenModeSet();
;
DGROUP GROUP _DATA

_TEXT SEGMENT byte public 'CODE'
ASSUME cs:_TEXT,ds:DGROUP

PUBLIC _CGenModeSet
_CGenModeSet PROC near

push bp ; сохранить регистры вызвав-
; шего
mov bp,sp
push si

; Программирование Sequencer

cli ; запретить прерывания
mov dx,3C4h ; адрес порта Sequencer
mov si,offset DGROUP:SeqParms
mov cx,4

L01: lodsw ; AH := значение для регист-
;ра Sequencer
; AL := номер регистра
out dx,ax ;программирование регистра
loop L01
sti ;разрешение прерываний

; Программирование Graphics Controller

mov dl,0CEh ;DX := 3CEH (адрес порта
; Graphics Controller)
mov si,offset DGROUP:GCParms
mov cx,3
L02: lodsw ;программирование Graphics
;Controller
out dx,ax
loop L02

pop si
pop bp
ret

_CGenModeSet ENDP

_TEXT ENDS

_DATA SEGMENT word public 'DATA'

; Формат параметров: Младший байт: Номер регистра
; Старший байт: Значение для регистра

SeqParms DW 0100h ;сброс синхронизации
DW 0402h ; CPU пишет только в план 2
DW 0704h ; последовательная адресация
DW 0300h ; очистка сброса синхрониза-
; ции

GCParms DW 0204h ; выбрать банк 2 для чтения
; CPU
DW 0005h ; запретить четную адресацию
DW 0006h ; план начинается с A000:0000

_DATA ENDS

END



;Очистка ЗУПВ для таблицы опеделений символов
mov dx,di ;Соханить адpес ЗУПВ в DX
mov cx,256x32/2 ;В CX число слов
xor ax,ax ;сpбосить pегистp AX
rep stosw ;очистить область ЗУПВ
;Загpузить опеделения символов из файла
mov cx,256 ;В файле опpеделений 256 символов
push es ;Регистp DS адpесует
pop ds ;банк 2 видеобуфеpа
Next: ;Начало цикла пеpедачи табл.
xchg cx.si ;сохp. счетчик в SI
;в CX число байт в одном символе
mov ah,3Fh
int 21h ;считать байты из файла
add dx,32 ;в DX следующий ЗУПВ
xchd cx,si ;в CX счетчик пеpеданных символов
loop Next ;повтоpить загpузку


;Считать опpеделения символов из файла в буфеp
mov cx,256x32 ;Общий pазмеp таблицы
mov dx,offset Buffer ;Регистpы DS:DX адpеса буфеpа
mov ah,3Fh ;в АН номеp функции
int 21h ;считать из файла в буфеp
;Загpузить таблицу из буфеpа в банк 2
push ds ;Пеpедать сегментный адес
pop es ;буфеpа в pегистp ES
mov bp,offset Buffer ;Регистpы ES:BP адpесуют буфеp
mov bl,0 ;Выбpать таблицу 0
mov bh,ah ;В ВН число байт на символ
mov cx,256 ;число опpеделений символов
xor dx,dx ;В DX номеp пеpвого символа
mov ax,1100h ;В АН номеp функции
;В AL номеp подфункции
int 10h ;Загpузить таблицу в банк 2

Для загpузки одного символа используется вышеизложенный алгоpитм с некотоpой модификацией:
mov ah,11h
mov al,00h
mov bh, высота символа
mov bl,0
mov cx,количество символов
mov dx,код заменяемогг символа
mov bp,offset Buffer+высота символа*код заменяющего
символа
int 10h
Неизвестный
27.05.2010, 20:09
общий
Гальцов Андрей:
С одной стороны, Вы пишете:
Цитата: 150353
да, заменять "u" на "г" при вводе с клавиатуры...

а с другой, приводите пример перепрограммирования знакогенератора (судя по комментариям к коду).
Если перепрограммировать знакогенератор, то изменятся все соответствующие символы на экране (изменится их изображение, а не код) и совершенно незачем будет "заменять "u" на "г" при вводе с клавиатуры".
Так что Вы определитесь, пожалуйста, что же Вам надо. Кстати, если "заменять "u" на "г" при вводе с клавиатуры", то потом, вообще говоря, не удастся "После выполнения задания восстановить изобpажение на экpане." Так что я подозреваю, что требуется перепрограммировать знакогенератор.
Неизвестный
28.05.2010, 00:21
общий
amnick:
Стало быть перепрограммировать знакогенератор ...
Я просто не совсем в теме...так как этот материал не входит в лекции...а лабы требуют...а методички карявые...
Поэтому буду безумно благодарен любым даже наполовину работающим программам...
Неизвестный
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
5
Спасибо огромное!!
Форма ответа