Про обратный ход луча

Тема в разделе "WASM.ASSEMBLER", создана пользователем Same, 1 фев 2005.

  1. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    Мне нужнна прорисовывать полностью экран - Сначала я повесил это дело на прерывание таймера - с задержкой до обратного хода

    но таймер и без того перегружен кодом поэтому я решил отрисовывать экран по прерыванию обратного хода луча - только возникла проблема как его включить?



    Взял для справки то что написано у Зубкова:

    Регистры контроллера CRT (03D4h – 03D5H)

    Контроллер CRT управляет разверткой и формированием кадров на дисплее. Как и для графического контроллера, для обращения к регистрам контроллера CRT следует записать индекс нужного регистра в порт 03D4h, после чего можно будет читать и писать данные для выбранного регистра в порт 03D5h. Если требуется только запись в регистры, можно просто поместить индекс в AL, посылаемый байт — в АН и выполнить команду вывода слова в порт 03D4h.

    ...

    11h: Конец вертикального обратного хода луча без старшего бита



    бит 7: защита от записи в регистры 00 – 07 (кроме бита 4 в 07h)



    бит 6: 1/0 — 5/3 цикла регенерации за время обратного хода луча



    бит 5: 1/0 — выключить/включить прерывание по обратному ходу луча



    бит 4: запись нуля сюда заканчивает обработку прерывания



    биты 3 – 0: конец вертикального обратного хода луча

    ...


    Код (Text):
    1.  
    2. Следовательно
    3. TR_ENABLE = 11011111b
    4. BASE_ADDR = 03D4h
    5.    MOV DX,BASE_ADDR ;DX = 03D4h
    6.    MOV AL,11h       ;AL = 11h (Index)
    7.    OUT DX,AL        ;OUT 3D4h,11h
    8.    INC DX           ;DX = 03D5h
    9.    IN  AL,DX        ;AL = ????????b
    10.    MOV AH,AL        ;
    11.    AND AH,TR_ENABLE ;AH = ??[b]0[/b]?????b
    12.    MOV AL,11h       ;AL = 11h (Index)
    13.    DEC DX           ;DX = 03D4h
    14.    OUT DX,AX        ;OUT 3D4h,11h : OUT 3D5h,??[b]0[/b]?????b
    15.  


    1.Что я делаю не так? мож кто обьяснит бедному чукотскому мальчонке?

    2.Кто нибудь знает как наиболее быстро организовать послойную отрисовку экрана?

    допустим есть некоторое количество слоёв - их все последоватьно надо отрисовать на экран.

    как сделать это наиболее быстро?
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    1. Отрыл где-то код, может поможет.

    почему порты другие не знаю :)
    Код (Text):
    1.  
    2. (*-----------------------------------------*)
    3.  
    4. procedure VBLANK; assembler;
    5. asm
    6.     cmp TimerInstalled,TRUE
    7.     je      @timerinstalled
    8.     mov dx,3DAh
    9. @vent1:
    10.     in      al,dx
    11.     test    al,8
    12.     jz      @vent1
    13.     cli
    14. @vent2:
    15.     in      al,dx
    16.     test    al,8
    17.     jnz @vent2
    18.     sti
    19.     jmp NEAR PTR @done
    20.  
    21. @timerinstalled:
    22.     mov ax,total_retraces
    23. @vent3:
    24.     cmp ax,total_retraces
    25.     je      @vent3
    26. @done:
    27. end;
    28.  
    29. procedure VBLANK_QUICK; assembler;
    30. asm
    31.     cmp TimerInstalled,TRUE
    32.     je      @timerinstalled
    33.     cli
    34.     mov     dx,3DAh
    35. @vent1:
    36.     in      al,dx
    37.     test    al,8
    38.     jz       @vent1
    39.     sti
    40.     jmp NEAR PTR @done
    41.  
    42. @timerinstalled:
    43.     mov ax,total_retraces
    44. @vent2:
    45.     cmp ax,total_retraces
    46.     je      @vent2
    47. @done:
    48. end;




    2. Что под слоями понимать?
     
  3. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    >1. Отрыл где-то код, может поможет.

    >почему порты другие не знаю :)



    Регистр состояния ввода 1 (ISR1) — доступен для чтения из порта 03DAH

    бит 3: происходит вертикальный обратный ход луча

    бит 0: происходит любой обратный ход луча



    Это код задерки до начала обратного хода луча.

    Так он выглядит у зубкова
    Код (Text):
    1.  
    2. wait_retrace       proc    near
    3.     push       ax
    4.     push       dx
    5.     mov        dx,03DAh ; порт регистра ISR1
    6. wait_retrace_end:
    7.     in    al,dx
    8.     test  al,1000b ; проверить бит 3 если не ноль
    9.     jnz   wait_retrace_end   ; подождать конца
    10.                              ; текущего обратного хода
    11. wait_retrace_start:
    12.     in         al,dx
    13.     test       al,1000b  ; а теперь подождать начала следующего
    14.     jz         wait_retrace_start
    15.     pop        dx
    16.     pop        ax
    17.     ret
    18. wait_retrace       endp
    19.  


    Могу твой код прокоментировать подробно.



    2.Допустип есть 7 рисунков их все один поверх другово надо вывести на экран - только есть проблемы - у каждого рисунка могут поменятся координаты.

    Сейчас я делаю так:

    A.Отрисовываю в буфер слои - по порядку с новыми координатами.

    B.Вывывожу буфер на экран.

    Это не совсем эфективно так как на экране рисунок меняет координаты с легким запозданием и это смотрится не красиво.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Same

    по прерыванию обратного хода луча - только возникла проблема как его включить?

    В аттаче отрывок из 12 главы Richard Wilton. Programmer'S Guide to PC(R) And PS/2(TM) Video Systems.



    Отрисовываю в буфер слои ... Вывывожу буфер на экран

    Afaik наиболее быстрый метод.



    с легким запозданием

    Может быть алгоритм заполнения буфера не оптимальный?

    [​IMG] _1628849966__V12.RAR
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Same



    Теперь понял!!! это я протупил :) Ты ждать VSync не хочешь, а хочешь прерывание включить по нему.

    Как я знаю, это не все видеокарты поддерживают (раньше вообще была перемычка такая), может у тебя как раз такой случай.



    Про "слои" - теоретически, можно запараллелить рисование рисунков, например по 2 или 3.

    Эмулировать тайловую архитектуру - разбить экран на квадраты и смотреть какая часть какого слоя куда попадает.. IMHO гемора много и реального выигрыша может не дать, т.к сейчас у компов архитектура не фон-неймановская.



    "7 рисунков" слишком расплывчатое понятие, многое зависит от того, каков их размер, как они перекрываются, способ наложения и т.п. Возможно получится как-то сэкономить не рисуя перекрывающиеся участки или обновлять только dirty rectangles...



    >




    Что значит лёгкое запаздавание? не успевает каждый кадр перерисовывать?

    Проверь с простой анимацией, может быть проблема в синхроницации.
     
  6. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    2 q_q

    В аттаче отрывок из 12 главы Richard Wilton. Programmer'S Guide to PC(R) And PS/2(TM) Video Systems.


    Спасибо большое - счас прочитать не успею, но вечером займусь.

    Afaik наиболее быстрый метод.

    Может быть алгоритм заполнения буфера не оптимальный?


    Что посоветуеш почитать на тему?

    2 S_T_A_S_

    "7 рисунков" слишком расплывчатое понятие, многое зависит от того, каков их размер, как они перекрываются, способ наложения и т.п. Возможно получится как-то сэкономить не рисуя перекрывающиеся участки или обновлять только dirty rectangles...

    Что значит лёгкое запаздавание? не успевает каждый кадр перерисовывать?

    Проверь с простой анимацией, может быть проблема в синхроницации.


    Что бы люди не смеялись я умолчал что пробую делать жалкое подобие GUI.В этой области я совсем зеленый и не знаю что почитать на эту тему в нете алгоритмов нет, есть готовые реализации типа Z-Buffer на Си.

    Пока интерфейс простой - фон пять окон курсор. Раньше я например при отрисовке курсора сохранял облась под ним после смещения востанавливал и отрисовывал снова.сейчас я пошел другим путём.
    Код (Text):
    1.  
    2. ==========[Курсор ]============ Слой 0Fh
    3. =============================== ...
    4. ==========[Фон]================ 00h
    5.  


    В промежуточных слоях отрисовываются окна по таблице есесно они могут менять координаты и размер.

    Так вот при быстром быстром движении мышкой или перемещении окна оно несколько отстаёт от мышки а при медленном всё нормально.
     
  7. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    2 q_q

    Пример не помог.



    На счет заполнения буфера возможно ты прав - вот пример рисования квадрата.
    Код (Text):
    1.  
    2. ;-------------------------------
    3. ;DBLCOORD:dd ? ;00h;x1
    4. ;         dd ? ;04h;y1
    5. ;         dd ? ;08h;x2
    6. ;         dd ? ;0Ch;y2
    7. ;-------------------------------
    8. ;  FSTYLE:dd ? ;04h;FColor
    9. ;         dd ? ;0Ch;RESERVED
    10. ;         dd ? ;10h;RESERVED
    11. ;===============================
    12. ;EBP = ip DBLCOORDS Struct
    13. ;ESI = ip FSTYLE Struct
    14. ;EAX = Layer
    15. DrawRect8:PUSHA
    16.       MOV  EBX,DS:[EBP+00h]             ;X1
    17.       MOV  EAX,DS:[EBP+04h]             ;Y1
    18.       MOV  ECX,DS:[EBP+0Ch]             ;Y2
    19.       SUB  ECX,EAX                      ;Y2 - Y1 = Height
    20.       MUL  WORD PTR[FS:SYS_SCREEN_WIDTH];EAX = Y1
    21.       SHL  EDX,10h
    22.       MOV  DX,AX
    23.       MOV  EDI,EDX                      ;EDI = Line
    24.       MOV  EDX,DS:[EBP+08h]                ;X2
    25.       SUB  EDX,EBX                      ;X2 - X1 = EDX = WIdth
    26.       MOV  EAX,DS:[ESI+00h]             ;FColor
    27. RectHloop8:PUSH ECX
    28.            PUSH EBX
    29.            MOV  ECX,EDX
    30. RectVloop8:CMP  EBX,[FS:SYS_SCREEN_WIDTH]
    31.            JGE  RectNxtPx8
    32.            CMP  AL,CLR_NO
    33.            JZ   RectNxtPx8
    34.            MOV  GS:[EDI+EBX],AL
    35. RectNxtPx8:INC  EBX
    36.      loop  RectVloop8
    37.            ADD  EDI,[FS:SYS_SCREEN_WIDTH]
    38.            POP  EBX
    39.            POP  ECX
    40.      loop  RectHloop8
    41.            POPA
    42. RETN            
    43. CLR_NO = 0FFh
    44.  


    Я работаю с буфером как с двухмерной матрицей X,Y

    Обрати внимание на
    Код (Text):
    1.  
    2. MOV  GS:[EDI+EBX],AL ;EDI = Y*ScreenWidth = Current_Line
    3.                      ;EBX = Pixel offset from Line_Start
    4.  


    Это позволяет мне котролировать избражение чтобы оно не отрисовывалось за пределы экрана.Последний допустимый пиксель это ScrenWidth - 1

    По адресу [FS:SYS_SCREEN_WIDTH] находится текущий размер одной линии экрана в Байтах
    Код (Text):
    1.  
    2. CMP  EBX,[FS:SYS_SCREEN_WIDTH] ;If current Pixel offset >= ScrenWidth
    3. JGE  RectNxtPx8  ;Then Don't Draw it
    4.  




    2 S_T_A_S_

    Как я знаю, это не все видеокарты поддерживают (раньше вообще была перемычка такая), может у тебя как раз такой случай.

    Странно карточка вроде новая или это вышло из моды?(GeForce 4 mx 440 64mb)



    Про торможениее графики скорее всего прав q_q

    На прерывание таймера я повесил такую процедуру
    Код (Text):
    1.  
    2. ;================================;||
    3. DrawScreen:PUSHA                 ;||
    4.            PUSH DS               ;||
    5.            PUSH ES               ;||
    6. ;--------------------------------;||
    7.            PUSH VIDEO_BUFFER_Sel ;||
    8.            POP  DS               ;||
    9.            PUSH EXT_VIDEO_MEM_Sel;||
    10.            POP  ES               ;||
    11.            XOR  EDI,EDI          ;||
    12.            XOR  ESI,ESI          ;||
    13.            Call WaitSync    ;->  ;||
    14. ;--------------------------------;||
    15.    MOV ECX,[FS:SYS_SCREEN_WIDTH] ;||
    16. DrawScrnH8:PUSH ECX              ;||
    17.    MOV ECX,[FS:SYS_SCREEN_HEIGHT];||
    18.            SHR ECX,02h           ;||
    19. DrawScrnV8:MOVSD                 ;||
    20.            LOOP DrawScrnV8       ;||
    21.            POP ECX               ;||
    22.            LOOP DrawScrnH8       ;||
    23. ;--------------------------------;||
    24.            POP ES                ;||
    25.            POP DS                ;||
    26.            POPA                  ;||
    27. RETN                             ;||
    28. ;=================================||
    29.  




    А в заполнении буфера оставил только:
    Код (Text):
    1.  
    2. ;===============================||
    3. FillVBuffer:PUSHA              ;||
    4. ;==============================;||
    5.             MOV EAX,03h ;Color ;||
    6.             call FillScreen    ;||
    7. ;===========[ Mouse ]==========;||
    8.             call DrawCursor    ;||
    9. ;==============================;||
    10.             POPA               ;||
    11. RETN                           ;||
    12. ;===============================||
    13.  


    Все равно торможение чуть есть - правда эта процедура висит на IRQ12...
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Same >




    Ну теперь понятно, значит почти всё что я говорил мимо :)

    IMHO ждать синхру в этом случае не нужно, врядли кто так делает, это ж не игрушки.



    >




    afaik так и делают, правда в виндосе курсор обычно аппаратный.

    перерисовывать окна целиком в этом случае не выгодно, т.к. в GUI ОС никто никогда не ставит задачей добится нормального функционирования самого GUI, приоритет отдаётся "задачам".



    Посмотри ещё сорцы SolarOS, автор хвалился, что у него gui быстрое.





    >




    Делай корректировку размеров ДО рисования, тогда проверка будет лишней.



    Вообще, в виндосе подобными квадратами можно раз 5 заполнять целиком экран 640*48*32 _каждый_ кадр
     
  9. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    2 S_T_A_S_



    afaik так и делают, правда в виндосе курсор обычно аппаратный.

    перерисовывать окна целиком в этом случае не выгодно, т.к. в GUI ОС никто никогда не ставит задачей добится нормального функционирования самого GUI, приоритет отдаётся "задачам".

    Посмотри ещё сорцы SolarOS, автор хвалился, что у него gui быстрое.



    Я хочу сделать сам а не копировать чужие идеи аки абизьяна

    У него в ОС кроме GUI не чего и нет:)



    Делай корректировку размеров ДО рисования, тогда проверка будет лишней.



    А ты представь окно не выходит за пределы экрана на половину обрезаясь - а просто уменьшается в размерах?:))



    Вообще, в виндосе подобными квадратами можно раз 5 заполнять целиком экран 640*48*32 _каждый_ кадр


    640*480*32?

    у меня при 640*480*8/16 тоже скорость офигенная





    Короче я решил эту проблему так:

    У меня был таймер настроен на 256 Тиков в секунду а поскольку Отрисовка висела на нём:) то торможение возникло в связи с нагрузом на код таймера.

    Я добавил счетчик синхронизуя ~30fps - торможение исчезло:)
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Same >




    IMHO это невозможно! если ты не знаком с чужими идеями, то можешь случайно их повторить, сам того не осознавая :derisive:



    >




    Нет, размеры не нужно уменьшать.

    Например, если backgroung окна имеет прямоугольную форму и однотонный, то прямоугольник меньшего по ширине размера - это тоже самое, что и часть предыдущего.

    Т.е. он просто отрисовывается, никаких проверок не нужно.

    Потом по краям рисуются части рамки. понятное дело, что правую рамку не нужно будет рисовать, если она выходит за пределы экрана.

    Проверять координаты для каждого пикселя - это расточительство ;).



    >




    Зачем сейчас эти анахронизмы? делай 32 bpp и не парься со всякими палитрами и масками цветовых компонент.

    А "лишний" байт можно как-нибудь хитро задействовать, например для элементов управления ;)



    >




    Нет смысла перерисовывать чаще, чем частота кадров. А для "не-GUI" ориентированной ОС можно перерисовывать только в случае каких-то действий пользователя и/или пользовательских программ. Т.е. даже меньше, чем 30fps
     
  11. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    S_T_A_S_

    32bpp это расточительство.

    Я пока тольком не разобрался с видео картой чтобы переключать режимы и задавать частоту развертки через порты ввода вывода - а делать это через VESA я не хочу.

    При проверки пикселя экран не тормазит пока оставлю так потом сделаю по другому как говориш ты

    Если X+Width > Screen Width то лишнее обрезаем:)



    У меня вопросы есть но пока осмысленно задать их не могу -кое чего у меня с собой нет - задам завтра.
     
  12. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    1.Как опредилить базовый адрес видео памяти не средствами Vesa?

    2.Можно ли использовать второй кадр 48мб под буффер?



    Чтобы понять вопрос желательно бегло пробежатся по аттачу

    В свое время хотел статью написать да лень переборолла:)

    [​IMG] 1709669452__Arch001.zip