Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C + asm] Графический режим 12h. Ускорение графики, работа с регистрами видеоадаптера 
V
    Опции темы
Kuvaldis
Дата 14.12.2007, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



Всем привет:
Приходится мне ручками реализовывать некоторые функции BGI из Borland C++ 3.1 ( это под ДОС). Работаю в графическом режиме 12h
ПРи работе на уровне БИОСА  наблюдаются ужасные тормоза. Начал искать инфу, как работать напрямую с видеопамятью в данном случае. Не нашел. Но в зубкове в разделе про программирование портов нашел работу через регистры. Хотя тоже достаточно медленно (виден процесс прорисовки), но это лучше, чем было. Но честно говоря, не врубаюсь я, как там это сделано. :( 

Теперь следующая проблема. Для создания рисования в режиме XOR ( т.е. новая точка ксорится со старой, что нужно для динамического рисования прямой (и ее стирания) нужно получать цвет старой точки. Но как это сделать НЕ ЧЕРЕЗ БИОС??? Через биос это очень медленно.
Вот то, что я наработал:

Код

void PutPixel( int x, int y, COLOR color )
{
    if( writeMode == XOR_PUT )   // глобальная переменная
    {        
        color ^= GetPixel( x, y );      
    }

    #ifdef BIOS

    _asm {
        mov     ah, 0xC
        mov     al, color
        mov     bh, 0
        mov     cx, x
        mov     dx, y
        int     0x10
    }

    #else

    _asm {
        pusha
        push       0xA000
        pop        es
        mov        cx, x
        mov        dx,y
        mov        al,color
        cbw
        push       ax
        pop           bp
        // вычислить номер байта в видеопамяти
        xor        bx, bx
        mov        ax,dx                // AX = строка
        push       bx
        mov        bx, 5
        mul        bx
        pop        bx
      //    lea        eax, [eax + eax * 4]    //АХ = АХ * 5
        shl        ax, 4                 // АХ = АХ * 16
        // АХ = строка * байт_в_строке
        // (строка * 80)
        push       cx
        shr        cx,3               // CX = номер байта в строке
        add        ax,cx              // АХ = номер байта в видеопамяти
        mov        di,ax              // сохранить его в DI
        // вычислить номер бита в байте
        pop        cx
        and        cx,0x07             // остаток от деления на 8 - номер
        // бита в байте, считая справа налево
        mov        bx,0x0080
        shr        bx,cl              // в BL теперь нужный бит установлен в 1
        // программирование портов
        mov        dx,0x03CE           // индексный порт
        // графического контроллера
        mov        ax,0x0F01           // регистр 01h: разрешение
        // установки/сброса
        out        dx,ax              // разрешить установку/сброс для
        // всех плоскостей (эту часть лучше
        // сделать однажды в программе, например сразу после установки
        // видеорежима, и не повторять каждый раз при вызове процедуры)

        mov        ax,bp


        shl        ax,8               // регистр 00h: регистр
        // установки/сброса
        out        dx,ax              // АН = цвет
        mov        al,0x08              // порт 08h: битовая маска
        mov        ah,bl              // записать в битовую маску нули
        // всюду, кроме
        out        dx,ax              // бита, соответствующего выводимому пикселю
        mov        ah,byte ptr es:[di]  // заполнить
        // регистры-защелки
        mov        byte ptr es:[di],ah  // вывод на экран:
    // выводится единственный бит
        // в соответствии с содержимым регистра битовой маски, остальные
        // биты берутся из защелки, то есть не изменяются. Цвет выводимого
        // бита полностью определяется значением регистра установки/сброса
        popa
    }  

    #endif
}
//---------------------------------------------------------------------------
COLOR GetPixel( int x, int y )
{
    COLOR  color;

    _asm {
        mov     ah, 0xD
        mov     bh, 0
        mov     cx, x
        mov     dx, y
        int     0x10
        mov     color, al 
    }
    return color;
}


Как быть? Может, кто-нибудь занимался таким?
Буду рад помощи.


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
dumb
Дата 14.12.2007, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Цитата(Kuvaldis @  14.12.2007,  01:40 Найти цитируемый пост)
Для создания рисования в режиме XOR ( т.е. новая точка ксорится со старой, что нужно для динамического рисования прямой (и ее стирания) нужно получать цвет старой точки.
не, не нужно. достаточно выбрать правильный режим в data rotate register.

примерно так должно быть(а GetPixel на всякий пожарный):
Код

unsigned char Mode = 0; // 0 - set mode, 0x18 - XOR mode
void PutPixel( int X, int Y, COLOR Color )
{
  _asm {
    push es
    push bx
    mov ax,0A000h
    mov es,ax
    ;// вычисляем смещение - 80 * y + x/8
    mov ax,Y
    shl ax,4        ;// y * 16
    mov bx,ax       
    shl ax,2        ;// y * 64
    add bx,ax       ;// y * 80
    mov ax,X
    shr ax,3        ;// x / 8
    add bx,ax
    mov cx,X
    and cx,7        ;// x mod 8
    mov ah,80h
    shr ah,cl       ;// bit mask
    mov al,8        ;// bit mask register
    mov dx,3CEh
    out dx,ax
    mov ax,0205h    ;// mode: read 0, write 2
    out dx,ax
    mov ah,Mode     ;// 0 - set, 18h - xor
    mov al,3        ;// function select register
    out dx,ax
    mov al,es:[bx]  ;// читаем чтобы "защелкнуть" значение
    mov cl,Color
    mov byte ptr es:[bx],cl ;// пишем наш цвет
    ;// сброс на default-значения
    mov ax,0FF08h   ;// bit mask
    out dx,ax
    mov ax,3        ;// function
    out dx,ax
    mov ax,5        ;// mode
    out dx,ax
    pop bx
    pop es
  }
}
//---------------------------------------------------------------------------
COLOR GetPixel( int X, int Y )
{
  _asm {
    push es
    push bx
    push si
    mov ax,0A000h
    mov es,ax
    ;// вычисляем смещение - 80 * y + x/8
    mov ax,Y
    shl ax,4        ;// y * 16
    mov bx,ax       
    shl ax,2        ;// y * 64
    add bx,ax       ;// y * 80
    mov ax,X        
    shr ax,3        ;// x / 8
    add bx,ax       
    mov cx,X        
    and cx,7        ;// x mod 8
    mov ch,80h      
    shr ch,cl       ;// bit mask
    ;// читаем 4 слоя, выбирая бит, отвечающий за наш пиксель
    mov si,bx
    xor bl,bl       
    mov dx,3CEh
    mov ax,0304h    ;// ah - плоскость, al - read map select
  }
  next_plane: // grrr... =/
  _asm {
    out dx,ax       ;// выбираем слой (3,2,1,0)
    mov bh,es:[si]
    and bh,ch
    neg bh          ;// если bh != 0, то ставим знаковый(старший) бит
    rol bx,1        ;// вгоняем в bl
    dec ah
    jge next_plane
    mov al,bl       ;// цвет
    inc ah          ;// обнулим ah
    pop si
    pop bx
    pop es
  }
}

PM MAIL   Вверх
Kuvaldis
Дата 14.12.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



dumb, 
С П А С И Б О!!!!!!!!!!!!!  Очень помогло smile
Еще один вопрос: а где вообще почитать об этом всем, чтобы было понятно?


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
dumb
Дата 14.12.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Цитата(Kuvaldis @  14.12.2007,  14:13 Найти цитируемый пост)
а где вообще почитать об этом всем, чтобы было понятно?

http://www.frolov-lib.ru/books/bsp/v03/index.html
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.