2016-06-27 12 views
1

Я пытаюсь напечатать символ в графическом режиме. Обычно, когда я напечатать символ я делаю:Сборка - печать символа в графическом режиме


mov ah,14 ; ah=14 
mov al,'x' 
int 10h  ; print the character 

На этот раз он не работает. Я думаю, что проблема в том, что я включаю в графическом режиме:


push ax 
mov ah, 0 
mov al, 13h 
int 10h 
pop ax 
ret 

Так как же я по-прежнему использовать графический режим (мне это нужно) и напечатать символ? Я использую компилятор nasm, отладчик bochs и платформу 8086.

Спасибо большое!

ответ

7

Всегда есть Ralf Brown Interrupt List под рукой.

Служба int 10h/AH=0Eh требует номер страницы в BH и цвет для использования в BL.

Этот фрагмент кода работает

mov ah, 0eh   ;0eh = 14 
mov al, 'x' 
xor bx, bx   ;Page number zero 
mov bl, 0ch   ;Color is red 
int 10h 

В текстовом режиме BL не используется, однако в графическом режиме он есть.
Неправильная настройка может закончиться написанием «черным по черному».

+0

Удивительный! он отлично работает! – NivSlu

0

Вы должны нарисовать его (по крайней мере, если вы хотите отполировать его внешний вид).

IIRC прерывание BIOS или DOS на самом деле было способно печатать символы в режиме gfx, но шрифт был уродливым, и он уничтожал другой контент, поэтому, когда мне нужно было печатать текст в режиме 13h, мне пришлось делать это само по себе.

Если вы новичок в этом, начните так:

  1. создать 6x8 байт массива с некоторым изображением (* 1)
  2. сделать это = создать PutSprite (источник, ширина = 6, высота = 8 , posx = 10, posy = 10) function
  3. создать основной шрифт ASCII в формате 6x8 256 (или искать интернет для некоторого шрифта asm с фиксированным размером)
  4. создать свою собственную функцию «печати», вызывающую PutSprite с правильным шрифтом , и перемещения координат назначения для каждого символа.
  5. (необязательно), если вы хотите иметь пропорциональные шрифты, вы должны хранить ширину каждого глифа вместе с графикой шрифта, а предварительные позиции в соответствии с ним
  6. (необязательно) продлить PutSprite, чтобы проверить цвет прозрачности, например как 255, поэтому он будет копировать исходный байт только для непрозрачных пикселей.

* 1) Для первого шага вы можете использовать некоторые отладки GFX вроде этого (с палитрой по умолчанию DOS):

testSprite: ; testing gfx glyph, size 6x8 pixels for 13h mode 
    times 6 db 15 ; white line at top 
    times 6*6 db 2 ; dark green middle 
    times 6 db 13 ; violet line at bottom 

На втором этапе вы должны скопировать значения из исходного адреса 0xA000: 320 * posy + posx memory area, правильно продвигающиеся указатели: источник ++ после каждого байта, скопированного по адресу ++, для адресата ++ в одной строке (для ширина байт), затем пункт назначения + = 320-ширина для перехода к следующей строке для height строк.

+1

INT 1F - СИСТЕМА ДАННЫХ - 8x8 ГРАФИКА FONT Desc: \t этот вектор указывает на 1024 байтов графических данных, 8 байтов для каждого \t символа 80h-FFh Примечания: \t графических данных для символов 00h-7Fh хранится в F000h: FA6Eh в 100% \t совместимые BIOS –