Size: a a a

Ассемблер

2021 March 27

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Saenro T
Предлагаешь рисовать в одном сегменте, а в буфер экрана просто копировать готовый блок?
Да, так по-нормальному и делается. Двойная буферизация называется :)
источник

ST

Saenro T in Ассемблер
Так пересылка данных считай в два раза больше же
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Во-первых, у тебя картинка не будет волнами выводиться, если вычисления долгие. Во-вторых, работа с видеопамятью на порядок медленнее, чем в обычной.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
У тебя 4 чтения из памяти и 1 запись. Это если классическое пламя брать.
Плюс копирование в видеопамять при буферизации.
Первый этап (4 чтения и запись) с обычном памятью будет быстрее (почти наверняка), чем одно чтение из видеопамяти.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
А 4 чтения из видеопамяти — сам понимаешь :)
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Но вывод в видеопамять — тоже не супербыстрая штука. Если нужно ускорить, включают режим write-combining (MTRR-регистры в мануалах Intel есть). Под DOSBox только это не будет работать, т.к. нужен P6+.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
источник

ST

Saenro T in Ассемблер
Так вот оно как ФПС контролировать)
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Это немного замороченный вариант. На самом деле всё просто:
lea ecx,[259h]  ; это чуть короче по байтам, чем mov ecx,259h
rdmsr
mov eax,01010101h
wrmsr
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Регистр MSR номер 259h — это тип памяти для сегмента 0A000h (4 блока по 16 Кб) в EAX и для 0B000h (тоже 4 блока по 16 Кб) в EDX, их не трогаем (поэтому rdmsr).
Выставляет для всех 4-х блоков сегмента 0A000h тип write-combining (номер 1) и записываем в регистр.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Работает почти на всех P6+ процессорах. За редким исключением.
источник

ST

Saenro T in Ассемблер
Какой хороший чат "Ассемблер" в телеге)
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Но в режиме write-combining желательно только писать в видеопамять. Иначе могут быть глюки. Но запись ускоряется во много раз (точно не помню во сколько, я как-то тестил, но вроде в десятки раз прям). Но только не меньше, чем в 3-4 раза :))
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Я как-то даже отправлял сюда не так давно...
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
В 35 раз у меня было.
источник
2021 March 28

ST

Saenro T in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
Это немного замороченный вариант. На самом деле всё просто:
lea ecx,[259h]  ; это чуть короче по байтам, чем mov ecx,259h
rdmsr
mov eax,01010101h
wrmsr
А выключить нулями?
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Saenro T
А выключить нулями?
Выключить — это сохранить старое значение EAX (после rdmsr) и потом снова записать в 259h. Ну и EDX тоже.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Т.е. ты либо rdmsr снова делаешь и восстанавливаешь потом EAX (потому что rdmsr читаем из регистра в EDX:EAX), а затем пишешь (wrmsr), либо сохраняешь пару EAX/EDX и потом wrmsr просто.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Но по умолчанию там нули, т.е. кэширование отключено. Собственно, поэтому видеопамять медленно и работает: во-первых, кэширование отключено, во-вторых, сегмент 0A000h — это же отображение видеопамяти.
источник