На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> VESA, Protected mode и LFB.
    По поводу переключения банков: лучше переключать их, делая FAR CALL, а не через INT 10h. Шустрее будет....
      Особенно медленно прерывания (в т.ч. и INT 10h) работают в 32-битных приложениях защищенного режима, т.к. thunking (переключение режима 32bit->16bit->32bit) очень сильно тормозит приложение. Таким образом, прямой вызов 32-битной процедуры переключения банков, которая доступна в VESA 2.0 и выше (функция 0Ah - Return VBE Protected Mode Interface), действительно очень ускоряет работу с графикой в banked SVGA режимах.
        7in
        Первый пример VESA который я в дальнейшем разобрал
        как раз использавал этот FAR CALL. (см. ниже)
          vb
          По поводу примера:
          Далее приведён почти рабочий пример программы с использованием моей процедуры закраски экрана (VFAP) в Real mode. Следует отметить что она ращитана на работу с разными разрешениями и колличеством цветов, так же предусмотрен просчёт для переключения видео страниц.
          Но т.к. тут всё фиксировано то все числа подставлены в ручную. Надеюсь что я подставил верные параметры для работы проги но если она не заработает то прошу меня проинформировать). На моём 333 Cel эта процедура даёт около 47 кадров за секунду. Может есть замечания, предложения по оптимизации, или критика то пишите.
          ExpandedWrap disabled
            Var wAddPixel:Word; {Заполняется процедурой переключения видео страниц}
                wAddChunk:Word; {-//-//-}
                wEndChunk:Word; {-//-//-}
                wEndPixel:Word; {-//-//-}
             
                BytesPerPixel:Byte;{Заполняется при инициализации}
                pWindowingFunction:Pointer;{-//-//-}
                wDeltaChunk:Word;{-//-//-}
                wWriteSegment:Word;{-//-//-}
                wReadWriteChunk:Word;{Нужно для хранения активного банка.
                                      Позволяет избавляться от лишнего переключения банка.
                                      Активно используется процедурой прорисовки точки.}
             
                Buf:Array[0..63]of LongInt;
             
            Function VESAModeSupport(GrMode:Word):Boolean;
            {Нужна для получения информации}
            Assembler;
            Asm
            mov ax,Seg(Buf)
            mov es,ax
            mov di,Offset(Buf)
            mov ax,$4F01
            mov cx,GrMode
            int $10
            End;
             
             
            Procedure VFAP(wColor:word);{Вот так она у меня выглядит}
            Assembler;
            Asm
            mov     ax,wAddPixel
            mov     bl,BytesPerPixel
            xor     bh,bh
            mul     bx
            add     dx,wAddChunk
            mov     di,ax
            mov     bx,0
            pusha; cli; call pWindowingFunction; sti; popa
            mov     cx,wDeltaChunk
            add     cx,wEndChunk
            mov     ax,wWriteSegment
            mov     es,ax
            mov     ax,wColor
            db      66h
            shl     ax,16
            add     ax,wColor
             
            {Далее сама закраска}
            @1: db 66h;stosw
            cmp     di,1
            jnc     @1
             
            inc     dx
            pusha; cli; call pWindowingFunction; sti; popa
            sub     cx,1
            jnz     @1
             
            @2:
            db      66h
            stosw
            cmp di,wEndPixel
            jnz @2
             
            mov dx,wReadWriteChunk
            pusha; cli; call pWindowingFunction; sti; popa
            End;
             
            Begin
            VesaModeSupport($101);
            {Нужна для получения адреса процедуры переключения строниц}
            pWindowingFunction:=Pointer(Buf[3]);{Сам адрес}
             
            wWriteSegment:=$A000; {По умолчанию}
            BytesPerPixel:=2;
            wDeltaChunk:=640*480 div $8000;
            wEndPixel:=24576;
             
            Asm mov ax,$4f02;mov bx,$111; int 10h; end;
            {Грубоя инициализация режима 640x480x16 на самом деле всё делается не так}
             
            VFAP($ffff);{Обычно я закрашиваю чёрным цветом}
             
            ReadLn;
            Asm mov ax,3; int 10h; End;
            End.
            А для чего ты вызываешь pWindowingFunction в конце процедуры (непосредственно перед “End;”)? IMHO кроме дополнительного торможения программы, это ничего не дает... Кроме того, “rep stosd” будет выполняться быстрее, чем последовательность “@2: stosd; cmp di, wEndPixel; jnz @2”. Еще, вместо pusha/popa можно сохранять только те регистры, которые используются в твоей процедуре (es, ax, di, cx и dx) – так быстрее. Ну и разумеется, если переписать все это дело под 32-bit protected mode, то можно будет избавиться от префикса 66h, что даст дополнительный прирост производительности.
              vb
              Спасибо за советы, учту.
              Было бы интересно посмотреть твои 32-ух битные разработки(если они у тебя есть),
              может скинеш что нибудь?
                Честно говоря, мне и скинуть то нечего... Давать тебе обобщенные процедуры нет смысла, т.к. они все равно будут достаточно медленными. Писать что-то конкретное для твоего примера тоже не интересно, т.к. ты это прекрасно сделаешь и без меня. Если же надо дать пару-тройку советов по оптимизации конкретного примера - всегда пожалуйста!
                  Не врубаюсь, зачем нужна 2-ух байтная переменная wWindowGranulity?
                  (5-ий байт буффера передавймый при вызове VESAModeSupport (AX=4F01))
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0265 ]   [ 16 queries used ]   [ Generated: 18.04.24, 22:33 GMT ]