Нет отдельного буфера, в который считывается карта VGA.(Помните, что когда VGA был новым, даже 32 КБ памяти DRAM были дорогими. Кроме того, пропускная способность памяти была низкой. Некоторые видеокарты использовали двухпортовую ОЗУ , поэтому доступ из ЦП не мешал сканированию; он может быть прочитан / записан на одном порту, когда CRTC / RAMDAC считывает данные пикселей.)
В течение интервала вертикального гашения видеокарта не читает или не записывает видеоОперативная память вообще;он существует, так что ЭЛТ может изменять напряжение отклоняющих пластин электронного луча назад к верхней части экрана, не рисуя линию вверх по экрану.Затем аппаратное обеспечение VGA начинает считывать видеопамять по порядку для следующего сканирования следующего кадра.
(Современное оборудование, конечно, не управляет ЭЛТ, но читает VRAM в порядке с "интервалом гашения""все еще вещь).
Ожидание установки бита и его очистки помогает повысить вероятность того, что ваш код начнет выполняться в начале интервала гашения, а не ближе к концуинтервал гашения.
Если ваш код, который изменяет видеопамять, работает достаточно быстро, это делается до того, как аппаратное обеспечение снова начинает читать, так что вы не получите разрыв.(На самом деле, поскольку вы пишете экран в порядке сканирования, , он должен быть достаточно быстрым, чтобы опережать растровое сканирование , поэтому вывод на экран не передает memcpy и отображает некоторые«старые» пиксели позже в кадре.)
На старом оборудовании rep movsw
было недостаточно быстрым для копирования целого кадра данных во время VBI, особенно при записи в ввод-вывод с отображением в памятьчерез автобус ISA.Вместо этого вы обычно двойной буфер , изменяя базу VGA, чтобы указывать на уже нарисованный кадр во время VBI.Таким образом, вы рисуете в одном буфере, в то время как другой сканируется, давая вам полный интервал кадров для его обновления, а не только VBI.
rep movsw
работает очень быстрона современных современных процессорах (например, если вы загружаете современный компьютер в реальном режиме).Если VRAM отображается как WC (он же USWC: не кэшируемое спекулятивное объединение записи), то rep movsw
будет копировать 16 или 32 байта за раз (режим Fast Strings или даже ERMSB (Enhanced Rep Mov / Stos B)), получая выгоду от записиобъединение буферов.(Обычные хранилища в памяти WC похожи на хранилища NT в обычной памяти WB (с обратной записью)).Ошибки Intel (, такие как IvyBridge BU2 ) указывают на то, что REP MOVS в памяти WC действительно работает следующим образом: если вы пересекаете страницу из WC в память UC, некоторые хранилища в память UC могут происходить с широкими хранилищами быстрой строкивместо отдельных 16-битных хранилищ за rep movsw
.Это означает, что ЦП должен делать широкие накопления в памяти WC.
Если исходные данные горячие в кеше L1d или L2, потому что вы только что записали их, а местом назначения является видеопамять USWC, то с помощью rep movsw
должен легко закончить во время VBI.Если он отображается как UC (это был вариант BIOS, когда WC был относительно новой функцией, по крайней мере, на платах Pentium III / ранних K8), то современный ПК с множеством ГГц, вероятно, все еще достаточно быстр.
(Кстати, repne cmpsb
все еще медленный, но повторы перемещений / стоков быстро).
Кстати, даже со встроенной графикой, где «видеопамять» все еще является частью вашей обычной DRAM, это будет UC(без кэширования) или WC (без кэширования с комбинированием записи).Конечно, большая часть интерфейса VGA эмулируется в наши дни.VGA память может быть реальным кадровым буфером, используемым вашим графическим оборудованием, хотя (если он работает на голом металле, а не на DOSBOX или другом эмуляторе).
В любом случае, на современном оборудовании для низких частот, вы, вероятно, хорошопроверяйте только очищаемый бит, так как копирование выполняется так быстро по сравнению с частотой обновления, что вероятность получения разрывов практически равна нулю.Или, может быть, первый или два пикселя могут быть из старого кадра.
В DOSBOX, имитирующем настоящий старый ПК с реалистичной тактовой частотой :
@ Ped7G говорит, что rep movsw
было недостаточно быстрым для копирования кадра во время VBI, если только вы не настроили DOSBOX для имитации 486 при ~ 70 МГц или скорости «динамический / макс.»