Raylib на ассемблере

Тема в разделе "UASM", создана пользователем Intro, 28 апр 2025.

Метки:
  1. Intro

    Intro Well-Known Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    1.692

    Тут автор реализовал подключение игровой библиотеки Raylib на ассемблер MASM, сделал это хакерским методом подключения dll к процессу, и своими настроенными функциями. Можете это увидеть в видео. Мне это не очень понравилось.

    И я решил по экспериментировать с этой библиотекой, но решил это сделать более стандартным способом, просто настройка заголовочного файла и файл raylib.lib версии 3.0. Сейчас в следствии спешки, сделал всего несколько функций, чтобы убедится что метод работает, и метод заработал! Но пока выкладывать не буду, надо нормально всё сделать.
    Всё будет сделано именно для ассемблера UASM !!! Для масма и фасма и др. я делать ничего не буду, если надо, всё сами сами.
    Test_raylib_for_UASM.png

    Вот, доделал. Так же пару примеров, один пример из видео питон против С++.
     

    Вложения:

    • raylib_300.rar
      Размер файла:
      435,3 КБ
      Просмотров:
      63
    • raylib.rar
      Размер файла:
      23,4 КБ
      Просмотров:
      59
    Последнее редактирование: 1 май 2025
    Research нравится это.
  2. Intro

    Intro Well-Known Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    1.692
    Пока ковыряю 3 версию, с более старшими проблемы с линкером, не находит uuid.lib, а если из СДК версии 7.0а подсунуть, то куча ошибок, в общем надо СДК по свежей. Но пока решил с 3 версией разобраться.
    Что интересно используется прототипы функций где тяжёлые данные типа структуры не по ссылке передаются, а непосредственно в стек помещаются, так же передаются и возвращаемые значения структур. Если размер структуры 4 байт, то передаётся в eax, если 8 байт то через пару регистров eax и edx. Более тяжёлый уже по указателю, который возвращается в eax, при этом не явно задаётся указатель на локальную структуру. Типа так:
    Код (C++):
    1. RLAPI Image LoadImage(const char *fileName);    // Load image from file into CPU memory (RAM)
    На асме получается так:
    Код (ASM):
    1. LoadImage  PROTO C (dword) res:ptr Image, fileName:LPCSTR     ;// Load image from file into CPU memory (RAM)
    Из-за этого приходится делать почти всё вручную. h2incx.exe тут плохо помогает. Тут бы, этот самый питухон применить, но я не умею.
     
  3. Intro

    Intro Well-Known Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    1.692
    ...а вообще странно сделано, некоторые структуры весят по 96 байт, и всё это запихивается в стек, что не очень хорошо, особенно если ассемблер используешь, да и вообще. Даже скриптовые луа с питоном структуры используют только по ссылке или указателю.
     
  4. Intro

    Intro Well-Known Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    1.692
    В общем, сделал, ещё вчера. Но программа запускается если dll только в самой папке с программой, надо как-то зарегистрировать raylib.dll, но таким образом чтобы программа искала СВОЮ версию. Прочитал, что если приложение возьмёт не свою версию, то возможен даже аппаратный сбой, не знаю, но в любом случае будет не хорошо. В общем, нужен метод, чтобы при запуске программы, та искала свою dll по конкретному адресу, который предварительно регистрирует/устанавливается. Типа переменная PATH, причём в файле который лежит с программой в месте. Во времена дос и Win32 это было не слишком сложно насколько помню.
    В общем, нашел способ, возможно не самый лучший, но работает. Запускаем через батник, где указанно переменная PATH с расположением нашей конкретной dll'ки
    Код (Text):
    1. @echo off
    2. REM путь где лежит raylib.dll
    3. set PATH=%PATH%;C:\assemblers\raylib_300\bin
    4. REM запуск игры raylib
    5. textures_bunnymark
    Файл удобно назвать run.bat, можно ещё зарегистрировать должным образом, но там будут проблемы с точкой входа, raylib.dll на это рассчитан...
    ЗЫ. Блин, не то нажал, ладно позже.
    В общем, добавил файлы в ТС. Один из способа запуска батником. Файл назвать run.bat
    Код (Text):
    1. @echo off
    2. REM путь где лежит raylib.dll
    3. set PATH=%PATH%;C:\assemblers\raylib_300\bin
    4. REM запуск файла
    5. start textures_bunnymark
    Настраиваем путь к raylib.dll, и вводим имя файла. Запускаем. Так же можно зарегистрировать дллку, и просто запускать файл, но как я понял, надо установить путь в PATH, но так, чтобы не затереть что-то нужное.
    Потом сделаю для более новых версий raylib, а так же для Win64. Ах да, там ещё пару файлов надо(macros.asm, include msvcrt.inc), их надо обновить, я там устранил несколько ошибок, и добавил функций.
     
  5. Intro

    Intro Well-Known Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    1.692
    Автор сделал вторую часть.

    А я отладил демку мандельброта, работает. И на 3600Х, выдаёт приличный ФПС, аж 455-460.
    Запуск через run.bat, пути к дллке настройте под себя.
     

    Вложения:

    • Mandelbrot.rar
      Размер файла:
      7,9 КБ
      Просмотров:
      60
    Последнее редактирование: 1 май 2025
    alex_dz нравится это.
  6. Intro

    Intro Well-Known Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    1.692
    Важно: функции GetScreenWidth и GetScreenHeight возвращает размер всего окна. У меня возвращает размер клиентской области окна, то есть той области в которой вы можете рисовать.
    Так что придётся ещё своими функциями дополнять. Получить это можно функцией GetClientRect, странно что в движке это не сделано.