Тут автор реализовал подключение игровой библиотеки Raylib на ассемблер MASM, сделал это хакерским методом подключения dll к процессу, и своими настроенными функциями. Можете это увидеть в видео. Мне это не очень понравилось. И я решил по экспериментировать с этой библиотекой, но решил это сделать более стандартным способом, просто настройка заголовочного файла и файл raylib.lib версии 3.0. Сейчас в следствии спешки, сделал всего несколько функций, чтобы убедится что метод работает, и метод заработал! Но пока выкладывать не буду, надо нормально всё сделать. Всё будет сделано именно для ассемблера UASM !!! Для масма и фасма и др. я делать ничего не буду, если надо, всё сами сами. Вот, доделал. Так же пару примеров, один пример из видео питон против С++.
Пока ковыряю 3 версию, с более старшими проблемы с линкером, не находит uuid.lib, а если из СДК версии 7.0а подсунуть, то куча ошибок, в общем надо СДК по свежей. Но пока решил с 3 версией разобраться. Что интересно используется прототипы функций где тяжёлые данные типа структуры не по ссылке передаются, а непосредственно в стек помещаются, так же передаются и возвращаемые значения структур. Если размер структуры 4 байт, то передаётся в eax, если 8 байт то через пару регистров eax и edx. Более тяжёлый уже по указателю, который возвращается в eax, при этом не явно задаётся указатель на локальную структуру. Типа так: Код (C++): RLAPI Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM) На асме получается так: Код (ASM): LoadImage PROTO C (dword) res:ptr Image, fileName:LPCSTR ;// Load image from file into CPU memory (RAM) Из-за этого приходится делать почти всё вручную. h2incx.exe тут плохо помогает. Тут бы, этот самый питухон применить, но я не умею.
...а вообще странно сделано, некоторые структуры весят по 96 байт, и всё это запихивается в стек, что не очень хорошо, особенно если ассемблер используешь, да и вообще. Даже скриптовые луа с питоном структуры используют только по ссылке или указателю.
В общем, сделал, ещё вчера. Но программа запускается если dll только в самой папке с программой, надо как-то зарегистрировать raylib.dll, но таким образом чтобы программа искала СВОЮ версию. Прочитал, что если приложение возьмёт не свою версию, то возможен даже аппаратный сбой, не знаю, но в любом случае будет не хорошо. В общем, нужен метод, чтобы при запуске программы, та искала свою dll по конкретному адресу, который предварительно регистрирует/устанавливается. Типа переменная PATH, причём в файле который лежит с программой в месте. Во времена дос и Win32 это было не слишком сложно насколько помню. В общем, нашел способ, возможно не самый лучший, но работает. Запускаем через батник, где указанно переменная PATH с расположением нашей конкретной dll'ки Код (Text): @echo off REM путь где лежит raylib.dll set PATH=%PATH%;C:\assemblers\raylib_300\bin REM запуск игры raylib textures_bunnymark Файл удобно назвать run.bat, можно ещё зарегистрировать должным образом, но там будут проблемы с точкой входа, raylib.dll на это рассчитан... ЗЫ. Блин, не то нажал, ладно позже. В общем, добавил файлы в ТС. Один из способа запуска батником. Файл назвать run.bat Код (Text): @echo off REM путь где лежит raylib.dll set PATH=%PATH%;C:\assemblers\raylib_300\bin REM запуск файла start textures_bunnymark Настраиваем путь к raylib.dll, и вводим имя файла. Запускаем. Так же можно зарегистрировать дллку, и просто запускать файл, но как я понял, надо установить путь в PATH, но так, чтобы не затереть что-то нужное. Потом сделаю для более новых версий raylib, а так же для Win64. Ах да, там ещё пару файлов надо(macros.asm, include msvcrt.inc), их надо обновить, я там устранил несколько ошибок, и добавил функций.
Автор сделал вторую часть. А я отладил демку мандельброта, работает. И на 3600Х, выдаёт приличный ФПС, аж 455-460. Запуск через run.bat, пути к дллке настройте под себя.
Важно: функции GetScreenWidth и GetScreenHeight возвращает размер всего окна. У меня возвращает размер клиентской области окна, то есть той области в которой вы можете рисовать. Так что придётся ещё своими функциями дополнять. Получить это можно функцией GetClientRect, странно что в движке это не сделано.