Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > работа с видеопамятью


Автор: Shurik 15.3.2004, 00:48
Каким образом можно в графическом режиме указывать высоту выводимого символа при прямой работе с видеопамятью?

Автор: Serzh 15.3.2004, 01:13
дык при выводе и указывай...
или я что то не понял?

Автор: Shurik 15.3.2004, 02:10
В какой регистр необходимо записывать?

Автор: Chingachguk 15.3.2004, 09:18
Вообще-то в графике выводятся шрифты - битовые маски определяют каждый символ - например, в режиме 13h биос выводит символы 8x8 (примерно). Я брал адрес таблицы символов и выводил их вручную:

Код

{Вывод текста}
Procedure outt256(color:byte; x,y,addr:word);
 Begin
   Asm
     les  SI,tabl_shrift
     mov  AX,320
     mul  Y
     mov  DI,X
     add  DI,AX
     mov  BX,Addr
     mov  CL,[BX]
     inc  BX
     xor  CH,CH
@Start: mov  AL,[BX]
       inc  BX
       xor  AH,AH
       push SI
       push CX
       shl  AX,3
       add  SI,AX
       push DS
       push DI
       push 0A000h
       pop  DS
       mov  CX,8
       mov  AL,Color
@start1:  mov  AH,ES:[SI]
         inc  SI
         push CX
         mov  CL,8
@Paint:   shl  AH,1
         jnc  @Next_Pix
         mov  [DI],AL
@Next_Pix:inc  DI
         loop @Paint
         pop  CX
         add  DI,320-8
         loop @start1
       pop  DI
       pop  DS
       pop  CX
       pop  SI
       add  DI,8
       loop @Start
   End;
 End;


Ничего не мешает использовать любые другие таблицы символов. В интерфейсе прерывания in 10h есть как функции получения адресов различных таблиц так и переопределения их в знакогенераторе (для текста).

Автор: Serzh 16.3.2004, 04:06
Chingachguk, ну ты даешь...
хоть бы написал, что должен быть массив со шрифтом tabl_shrift и что процедура вызываеться с параметрами: цвет, координата x, координата y, адрес строки...
а то ведь не понятно...

Автор: Chingachguk 16.3.2004, 09:11
Я думаю, парень разберется ;) С мышью он быстро разобрался smile.gif

Автор: Jin X 16.3.2004, 18:42
Высота символов меняется так:
Код
  mov dx,3D4h
  mov al,9
  out dx,al
  inc dx
  mov al,8 ; ВысотаСимволов
  out dx,al


Образ символов вот так (если без прерываний):
Код
; Процедура GetCharImage - получить образ символа
; Вход: AL = код символа, ES:DI = адрес для записи образа символа (16 байт)
GetCharImage    proc    near

               xor     ah,ah
               xchg    si,ax

               cli
               mov     dx,3CEh
               mov     ax,0C06h
               out     dx,ax         ; Отвязываем чётную карту от нечётной, Seg=0B800h (P.S. Wow! Как умно сказанул!)
               mov     ax,00204h
               out     dx,ax         ; Выбираем для чтения карту #2
               mov     ax,00005h
               out     dx,ax         ; Регистр режима (НЕ odd/even-адресация и т.д)

               push    ds
if              @Cpu and 1
               push    0B800h
               pop     ds
               shl     si,5
else
               mov     cx,0B800h
               mov     ds,cx
               mov     cl,5
               shl     si,cl
endif
               mov     cx,8
               cld
               rep     movsw         ; Копируем образ символа в память
               pop     ds

               mov     ax,0E06h
               out     dx,ax         ; Связываем чётную карту с нечётной, Seg=0B800h
               mov     ax,1005h
               out     dx,ax         ; Регистр режима (odd/even-адресация и т.д)
               mov     ax,4
               out     dx,ax         ; Выбираем для чтения карту #0

               sti
               ret

GetCharImage    endp

;----------------------------------------------------------------------------;

; Процедура SetCharImage - установить образ символа
; Вход: AL = код символа, DS:SI = адрес образа символа (16 байт)
SetCharImage    proc    near

               xor     ah,ah
               xchg    di,ax

               cli
               mov     dx,3C4h
               mov     ax,402h
               out     dx,ax         ; Разрешаем запись в плоскость 2
               mov     ax,504h
               out     dx,ax         ; Режим памяти (текстовый, последов, 64K памяти)
               mov     dl,0CEh
               mov     ax,0C06h
               out     dx,ax         ; Отвязываем чётную карту от нечётной, Seg=0B800h
                                     ; (P.S. Wow! Как умно сказанул!)
               push    es
if              @Cpu and 1
               push    0B800h
               pop     es
               shl     di,5
else
               mov     cx,0B800h
               mov     es,cx
               mov     cl,5
               shl     di,cl
endif
               mov     cx,8
               cld
               rep     movsw         ; Копируем образ символа из памяти
               pop     es

               mov     ah,0Eh
               out     dx,ax         ; Связываем чётную карту с нечётной
               mov     dl,0C4h
               mov     ax,304h
               out     dx,ax         ; Режим памяти (текстовый, чередующ, расш.пам)
               mov     al,2
               out     dx,ax         ; Запрещаем запись в плоскость 2

               sti
               ret
SetCharImage    endp

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)