Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Распаковка данных в формате ZX7 Mini на Ассемблере

17.09.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

Распаковка данных в формате ZX7 Mini на Ассемблере

ZX7 Mini за авторством Antonio Jose Villena Godoy - алгоритм упаковки и распаковки, который используется в ZX-Spectrum. Он основан на алгоритме ZX7 от Einar Saukas, но код распаковщика получился более компактным. По степени компрессии алгоритм находится в "третьей тройке игроков", примерно на уровне оригинального LZ77.

Читать статью целиком »
Просмотров: 796 | Комментариев: 1

Распаковка данных в формате MegaLZ на Ассемблере

04.09.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

Распаковка данных в формате MegaLZ на Ассемблере

Алгоритм MegaLZ был разработан участниками демо-группы MAYhEM для AmigaOS, но из открытых исходников можно собрать упаковщик для Windows. Степень компрессии неплохая, особенно на текстовых данных, на бинарных файлах чуть похуже. И при этом MegaLZ работает очень быстро как на упаковку, так и на распаковку, что тоже является его несомненным плюсом.

Читать статью целиком »
Просмотров: 870 | Комментариев: 0

Обработка критических ошибок с помощью VEH

23.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

Обработка критических ошибок с помощью VEH

Продолжение темы, начатой в статье про обработку ошибок, где для этого используется механизм SEH. Принципиальное отличие VEH (Vectored Exception Handling) от SEH (Structured Exception Handling) в том, что обработчики VEH глобальны для процесса и позволяют обрабатывать абсолютно все исключения для всех потоков, тогда как при использовании SEH нужно писать отдельный обработчик на каждый поток.

Читать статью целиком »
Просмотров: 1053 | Комментариев: 3

Генератор xoshiro64 на Ассемблере

19.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
В качестве продолжения статьи про xoshiro128 реализация алгоритма xoshiro64 на Ассемблере. Напомню, что xoshiro (xoroshiro) - семейство высокоскоростных алгоритмов для генерации псевдослучайных чисел. Есть две разновидности xoshiro64, отличающиеся друг от друга только количеством операций умножения. Это, соответственно, версия xoshiro64* и xoshiro64**. Для работы генератор использует буфер размером в 2 DWORD'а.

В оригинальном алгоритме отсутствует функция инициализации, там достаточно просто записать какие-то начальные ненулевые значения в рабочий буфер. Если вам надо инициализировать и "прогреть" генератор, то я сделал для этого функцию по аналогии с xoshiro128. Но это уже моя самодеятельность, в авторском алгоритме ничего такого нет.
  1. ;---------------------------------------------
  2. ; Инициализация генератора случайных чисел
  3. ; stdcall long_jump,seed
  4. ;---------------------------------------------
  5. proc long_jump seed:DWORD
  6.         locals
  7.              s0 dd ?
  8.              s1 dd ?
  9.         endl
  10.  
  11.         pusha
  12.  
  13.         ; Начальное "засеивание" генератора
  14.         mov     edi,s
  15.         mov     eax,[seed]
  16.         rol     eax,1
  17.         xor     eax,0x1C580662
  18.         stosd
  19.         rol     eax,3
  20.         add     eax,0x0B6F099F
  21.         stosd
  22.  
  23.         ; Холостая прокрутка генератора для инициализации
  24.         lea     edi,[s0]
  25.         push    edi
  26.         xor     eax,eax
  27.         stosd
  28.         stosd
  29.  
  30.         xor     ebx,ebx
  31. .loc_for_1:
  32.         xor     ecx,ecx
  33. .loc_for_2:
  34.         mov     eax,[.lj+ebx*4]
  35.         and     eax,1
  36.         shl     eax,cl
  37.         jz      @f
  38.  
  39.         mov     esi,s
  40.         lodsd
  41.         xor     [s0],eax
  42.         lodsd
  43.         xor     [s1],eax
  44. @@:
  45.         stdcall next
  46.  
  47.         inc     ecx
  48.         cmp     ecx,32
  49.         jb      .loc_for_2
  50.  
  51.         inc     ebx
  52.         jnp     .loc_for_1
  53.  
  54.         pop     esi
  55.         mov     edi,s
  56.         movsd
  57.         movsd
  58.  
  59.         popa
  60.         ret
  61.  
  62. .lj:    dd 0xB523952E
  63.         dd 0x0B6F099F
  64. endp
Инициализация выполняет первичное "засеивание" рабочего буфера, а затем делает 264 холостых прогонов генератора с одновременным перемешиванием данных рабочего буфера.

Читать статью целиком »
Просмотров: 893 | Комментариев: 4

Графический курсор (каретка) в поле EDIT

09.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня отдохнем от системы и немного поработаем с графикой, будем делать собственный графический курсор в поле EDIT. Какого-то необычайно полезного практического применения этому нет, просто симпатичное дополнение к интерфейсу, например, к окнам нестандартной формы. Ну а что, раз уж наворотили чудо-окна, почему бы не наворотить и чудо-курсор.

Начнем с теории. В отличие от "мышиного" курсора, который может легко принимать любой вид, управлять кареткой, то есть курсором в текстовом поле, не так просто. Функция CreateCaret позволяет только описывать форму для каретки, но не меняет ее изображение. Достаточно один раз попробовать, чтобы убедиться в ее бесполезности. Придется самостоятельно рисовать графическую каретку на холсте поля ввода.
  1.         ; Загрузить из ресурсов картинку
  2.         invoke  GetModuleHandle,0
  3.         invoke  LoadBitmap,eax,1
  4.         mov     [hСaret],eax
  5.  
  6.         ; Выбрать картинку для холста поля ввода
  7.         invoke  GetDlgItem,[hwnddlg],ID_EDIT
  8.         invoke  GetDC,eax
  9.         mov     [hDC],eax
  10.         invoke  CreateCompatibleDC,[hDC]
  11.         mov     [hСaretDC],eax
  12.         invoke  SelectObject,[hСaretDC],[hСaret]
  13.  
  14.         ; Получить цвет угловой точки картинки
  15.         invoke  GetPixel,[hСaretDC],0,0
  16.         mov     [bColor],eax
  17.         ; Создать кисть с этим цветом
  18.         invoke  CreateSolidBrush,[bColor]
  19.         mov     [hBrush],eax
  20.  
  21.         ; Прибраться за собой
  22.         invoke  DeleteObject,[hСaret]
Для простоты реализации рисунок текстового курсора будет храниться в ресурсах. Загружаем его стандартными функциями, затем получаем холст поля ввода и добавляем к нему загруженный рисунок. Теоретически рисунок каретки может быть любого размера, но практически он должен хотя бы по вертикали соответствовать высоте поля ввода, а лучше высоте шрифта.

Читать статью целиком »
Просмотров: 1628 | Комментариев: 7

01 ... 21 22 23 24 25 26 27 ... 75
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.12 сек. / MySQL: 3 (0.0232 сек.) / Память: 4.5 Mb
Наверх