Паньгин правильно в комментариях пишет, что есть ещё способ с VMStructs. То чувство, когда облажался дважды: мог же посмотреть о чем он рассказывает на JPoint, да и про VMStructs можно было догадаться
В общем, думаю основная линейка будет продолжаться про Грааль, но в апреле после доклада Паньгина нужно будет сделать спин-офф с VMStructs, Panama и JNR (JNR-x86asm в данном случае)
Сейчас полчаса вспоминал/разбирался, что это я там делал и зачем.
Чуть позже, помню еще что-то про MMX было (когда БПФ уже хотелось на них делать, а С в эти модные регистры ещё не умел).
Всплакнул. Всё напрочь забыл. Дворники тоже стране нужны (с).
Не вполне ясно, что делается. Зачем nop в начале? Сразу 16 бит (в ax) нельзя читать одной инструкцией? Зачем вообще копировать через регистр? Я нагуглил, что write mode 1 это копирование без переноса в память хоста, но внятного описания так и не нашёл.
Да кто ж вспомнит-то. Скорее всего это еще раньше писалось, просто сейчас нашел у себя в архиве за 95й год.
nop - возможно для выравнивания по границе слова. А может и просто дурень писал.
А делается копирование куска памяти прямо на видеопамять. Сам Basic так не умел. Там вручную (прерыванием int 0x10 (???)) графический режим устанавливался и все примитивы графические вручную реализовывались. Как и шрифты. Стандартный Basic ни режим SVGA не умел, ни тем более кириллицу. Поэтому каждую букву точками рисовал. И впихивал в видеопамять насильно куски.
А делается копирование куска памяти прямо на видеопамять.
Неа. Смотри, ты в es кладёшь 0xa000, так? И при копировании используешь es как для источника, так и для назначения. Этот код копирует из видеопамяти в видеопамять. Память хоста тут не используется.
Там 640х480х16. 12 режим. По 80 байт на строчку в 4 слоя. Итого 480*80 = 38400 (0x9600) - это всё что видно на экране. Соответственно, всё что после A000:9601 не видно, и я его использую как карманы. Нарисовал что-то по точкам один раз, скопировал за пределы видимости эту область и держу там, пока её перерисовать не надо будет целиком. Как понадобилась - так всю площадь и вставил, не считая снова точки.
Конкретно в этом куске копипасты - копирование в карман элемента интерфейса слева на экране. В другим кусках - другие карманы или вставляются, или сохраняются.