Работа напрямую с видеобуфером

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 8 Sep 2011.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    Привет ув.ачатовцы.Вопрос заключается в следующем.
    Нужно вывести строку напрямую в видеобуфер.Вот мой код:
    Code:
    .model tiny
    .code
    org 100h
    start:
    mov ax,3 ; установим видеорежим
    int 10h
    call video
    
    video proc
    mov ax,0b800h ;сегментный адрес видеобуфера
    mov es,ax
    mov ah,02h ; зеленый цвет
    mov di,1640 ; ??? вот тут параша какая-то,не могу понять как вычислить начальный адрес видеобуфера,а с нулем не выводит нихера
    mov cx,offset len ; в cx кол-во символов
    mov si,offset msg ;в si строку
    
    
    outsv:
    mov al,[si] ; берем байт из строки
    mov es:[di],ax ; 2 байта указывающие на буфер
    
    inc si ; следующий символ
    add di,2 ;след.
    loop outsv ; выводим cx-раз
    video endp
    
    .data
    msg db 'The matrix has you',0dh,0ah ; строка
    len equ $-msg ;получаем ее длину
    end start 
    
    в общем ткните и разъясните что идет в di и где я тут еще накосячил...
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    di - это оффсет в сегменте по которому записываются данные в видеобуфер.
    вычисляется просто 2*(X + Y*80)
    X - позиция по горизонтали
    Y - по вертикали.

    Всё именно так, потому, что в строке 80 символов. По этому X + Y * 80 - даст нам номер символа. А так как для каждого символа используются 2 байта (цвет + код символа) то всё надо умножать на 2.
    причем заполнение идет по такому принципу:
    [символ1][цвет1][символ2][цвет2]...[символN][цветN]
    при записи mov [di], ax
    AH - цвет
    AL - код символа

    Ну и конечноже запускай прогу в DosBox'e потому что винда довольно хреново эмулирует режим доса (частенько теряет цвета и символы при работе напрямую с видеобуфером). т.е. показывает более менее норм, тока в полноэкранном режиме
     
    1 person likes this.
  3. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    еще пару уточнений:
    А если допустим выбрать какие либо координаты отличные от 0,достаточно ли будет вписать значение в di или надо проводить расчет в регистрах?

    upd:
    в di поместил 162-от начала координат,но в конце строки выводится два левых символа каких то,не пойму почему.Досбокс ведет себя странно-через раз по запуску проги,вылетает через 5 секунд.если 0 выводит,но также
    [​IMG]
     
    #3 DooD, 8 Sep 2011
    Last edited: 8 Sep 2011
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    мне кажется у тебя ошибка в
    mov cx,offset len ; в cx кол-во символов
    mov si,offset msg ;в si строку

    пройдись отладчиком по этим местам
     
    1 person likes this.
  5. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    ёлы-палы ,блин надо привыкать юзать дебаггер,в cx не понятно какого хрена заносилось 15,тогда как вычислять длину?считать символы-боян.
    з.ы. из под винды ваще не запустилось...вывалило процессор ntvdm....
     
    #5 DooD, 8 Sep 2011
    Last edited: 8 Sep 2011