TalismanChet
@TalismanChet
Лицо зла

Почему не работает двойная буферизация?

Я пишу ОС для всех платформ (пока что х86-16), и после решения проблемы с мышью, я начал исправлять мерцание изображения. Остановился на самом простом варианте: двойная буферизация (отрисовка в спрятанный буфер, копирование в актуальный - в цикле). Я пробовал реализовать это с помощью инструкций для работы со строками (конктретно - rep movsw/b, но я ничего кромя фона не вижу. Перебрал все возможные ошибки, которые пришли в голову. Они были, но после исправления, ничего не изменилось.

архив с проектом
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
VIDEO_BUFFER_SEGMENT = 0xA000
VIDEO_BUFFER_OFFSET = 0xFA00
VIDEO_SEGMENT = 0xA000
VIDEO_OFFSET = 0x0000

как ты думаешь, сколько памяти в сегменте VIDEO_BUFFER_SEGMENT доступно начиная со смещения VIDEO_BUFFER_OFFSET и что там идёт дальше?

Если в твоём коде сделать вот такие изменения, то всё работает:
diff --git a/lib/video.inc b/lib/video.inc
index 3a26f43e2f79..d7054e194da9 100644
--- a/lib/video.inc
+++ b/lib/video.inc
@@ -3,8 +3,8 @@ VIDEO_INC equ 0
 
 include "memory.inc"
 
-VIDEO_BUFFER_SEGMENT = 0xA000
-VIDEO_BUFFER_OFFSET = 0xFA00
+VIDEO_BUFFER_SEGMENT = 0x6000
+VIDEO_BUFFER_OFFSET = 0x0000
 VIDEO_SEGMENT = 0xA000
 VIDEO_OFFSET = 0x0000
 VIDEO_SIZE_DB = 0xFA00
@@ -79,11 +79,11 @@ macro video!flip {
        mov ax, VIDEO_SEGMENT
        mov bx, VIDEO_BUFFER_SEGMENT
        mov es, ax
-       mov ds, ax
+       mov ds, bx
        mov cx, VIDEO_SIZE_DB
        cld
        mov si, VIDEO_BUFFER_OFFSET
-       xor di, VIDEO_OFFSET
+       mov di, VIDEO_OFFSET
        rep movsb
        pop ds es
 }
diff --git a/os.asm b/os.asm
index 1949e95b4e99..e5ebb3d280aa 100644
--- a/os.asm
+++ b/os.asm
@@ -91,9 +91,9 @@ kernel.routine.startup:
 kernel.routine.video:
        cli
        video!fill 0x4E
-       ;video!window 30, 40, 100, 60, 0x1A, 0xFF, 13 , 0x1F
-       ;video!cursor
-       ;video!flip
+       video!window 30, 40, 100, 60, 0x1A, 0xFF, 13 , 0x1F
+       video!cursor
+       video!flip
        sti
        ret
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Двойной буфер это же не копирование. Это отображение с начала одного буфера, пока другой заполняют, а затем переключение на второй. И так туда сюда.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы