Пакет MASM64. Готовые наработки

Тема в разделе "WASM.X64", создана пользователем Mikl___, 22 мар 2026.

  1. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    555

    Еще одна интересная игра. Фишка в том что такие игры легко делать тк вид сверху, главное правильно обрабатывать столкновения и т.д. Ошибка разрабов что они сделали гонку по кругу(моск плохо решает задачу управления задом) вместо того чтобы всегда ехать вперде.
    --- Сообщение объединено, 30 май 2026 ---
    Постораюсь к первому дню лета написать небольшую игру.
     
  2. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    474
    А на каком языке ? MASM x64, FASM x64, CИ x64 ? Или опять на дурацком Паскале/Делфи ? :)

    P.S. Не в службу, а в дружбу. :) Проверьте пожалуйста, кому не трудно, сайт https://www.codeproject.com/. Работает или нет ? Похоже, что опять у нас провайдер его с чем-то перепутал и заблокировал. Абсолютно безобидный ресурс/сайт.
     
  3. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    555
    А в чем он дурацкий? Единственный минус это отсутствие 64 в старых версиях и всратые новые.
    На нем можно без крови из задницы спокойно сделать хеллворд в 830 байт. obj собирается линкером от ms.

    Неа.

    python/delphi 7. Основная задача: понять как сделать не отрисовку игры, а движок из Г&П.

    Даже не смотря на простоту яп до сих пор не догоняю как должны хранится объекты.
    Это не шашки с игровым полем 10 x 10.

    Начало игры есть, но дипсик говорит что:

    нельзя ее публиковать, тк она будет нарушать сразу неск. законов =/

    Да, описанная вами игра **с высокой вероятностью нарушает несколько законов Российской Федерации**. Распространение подобного контента может повлечь за собой административную, а в некоторых случаях и уголовную ответственность.
    Вот подробный разбор того, почему эта игра находится вне закона.
    ### 1. Пропаганда насилия и жестокости (самое очевидное нарушение)
    Основная механика игры — сбивание пешеходов — является симуляцией массовых убийств мирных граждан. Это прямо противоречит российскому законодательству, которое защищает граждан от пропаганды насилия.
    * **Закон о защите детей от вредной информации**: Даже если игра имеет маркировку 18+, в ней не может быть сцен, которые побуждают к осуществлению насильственных действий по отношению к людям .
    * **Формирование деструктивного поведения**: В Госдуме неоднократно подчеркивали, что видеоигры, где насилие становится нормой (а тем более целью игры), оказывают пагубное влияние на психику, особенно молодежи, и формируют антисоциальное поведение .
    ### 2. Публичное оправдание массовых убийств (экстремизм)
    Второй уровень нарушения — это **нарратив (сюжетное обоснование)**. Игра не просто предлагает убивать, а утверждает, что это «законно», «полезно» и «оптимизирует демографию».
    * **Разжигание ненависти (ст. 282 УК РФ)**: Игра делит людей на категории («лишние», «нарушители») и обосновывает необходимость их физического уничтожения. Это может быть расценено как возбуждение ненависти либо вражды, а также унижение достоинства человека либо группы лиц по признаку принадлежности к социальной группе («пешеходы» как социально незащищенная категория) .
    * **Пропаганда антиобщественного поведения**: Сценарий игры напрямую призывает к насилию, замаскированному под государственную программу. Юридически это попадает под понятие распространения информации, выражающей явное неуважение к обществу и государственным институтам .
    ### 3. Использование ложных государственных указов
    В описании сюжета используется вымышленный «Указ № 2049 "О выморочном имуществе"», который выдает убийства за законную деятельность.
    * **Дискредитация государственных органов**: Подобная стилизация под официальный документ и под названия российских госпрограмм («Чистый Город») может быть расценена как дискредитация действий органов государственной власти.
    ### Какие последствия грозят?
    На данный момент в России действует несколько механизмов воздействия на распространителей подобного контента:
    | Тип ответственности | Суть нарушения | Возможное наказание |
    | :--- | :--- | :--- |
    | **Административная** | Нарушение законодательства о защите детей от вредной информации, пропаганда насилия. | Штраф для юридических лиц **до 5 млн рублей** . Конфискация продукции. |
    | **Уголовная** | Возбуждение ненависти либо вражды (ст. 282 УК РФ). | Вплоть до лишения свободы. |
    | **Гражданско-правовая** | Распространение запрещенной информации. | **Блокировка сайта** с игрой на территории РФ по решению Роскомнадзора. |
    ### Важное предупреждение
    Хотя игровая индустрия в России пока регулируется мягче, чем СМИ, государство ужесточает контроль. Например, суд уже запрещал деятельность издателей игр, если их владельцы нарушали закон .
    Ваша игра **«ROAD RASH: Операция "Чистый Город"»** является не просто шутером, а симулятором массовых убийств с идеологическим оправданием. Если вы попытаетесь распространять эту игру в России (выложить в магазины приложений, раздать знакомым или показать в СМИ), вы с высокой вероятностью получите штраф, а информация об игре будет заблокирована.
    **Краткий итог:** Вы создали не просто жестокую, а откровенно экстремистскую игру, которая нарушает базовые законы РФ против пропаганды насилия и разжигания ненависти. Распространять её на территории России нельзя.

    Без всего этого игра ниочем. Душная и без сюжета.
     

    Вложения:

    • Game.rar
      Размер файла:
      2,2 КБ
      Просмотров:
      52
    Последнее редактирование: 31 май 2026
  4. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    474
    Может вот эту Змейку конвертировать из FASM x32 в FASM x64 ? Чтобы был правильный пример кода с соблюдением Windows ABI x64 и т.п...
     
  5. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    555
    Лично для меня это бред. Я хочу понять как можно сделать движок для простой игры а не каждый обьект по отдельности.
    Движок -> общую систему, которая управляет всеми объектами. Масштабируемость - чтобы легко добавить 1000 объектов.
     
    Последнее редактирование: 31 май 2026
  6. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    474
    Да тут дело, вообще, не в игре. Меня, например, игры интересуют - постольку-поскольку. Мне интересно, как правильно и грамотно, написать код на ассемблере, чтобы в нем не было никаких ошибок. Ассемблер же он такой - он много чего может скомпилировать и что допускается, и что не допускается. Имеются в виду, высокоуровневые языки.
     
  7. Tech

    Tech New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2026
    Сообщения:
    1
    При разработке текстового редактора или среды разработки (IDE) возникает необходимость отображения нумерации строк.

    Стандартный RichEdit (особенно версии 4.1 и ниже) имеет ограничение нумерации примерно в 255 пунктов.

    Историческое наследие: Стандартный элемент управления RichEdit проектировался для работы с небольшими документами и форматированными списками, а не для отображения номеров строк в редакторах кода.

    Решение этой проблемы:
    Код (Pascal):
    1. program MemoSync;
    2.  
    3. uses
    4.   Windows, Messages;
    5.  
    6. const
    7.   ID_TIMER = 1;
    8.  
    9.   MEMO1_WIDTH = 30;
    10.   MEMO2_WIDTH = 300;
    11.  
    12. var
    13.   hMemo1: HWND;
    14.   hMemo2: HWND;
    15.  
    16. // IntToStr (без SysUtils)
    17. function IntToStr(Value: Integer): string;
    18. var
    19.   i: Integer;
    20.   IsNegative: Boolean;
    21.   Buffer: array[0..15] of Char;
    22. begin
    23.   IsNegative := Value < 0;
    24.   if IsNegative then Value := -Value;
    25.   i := 0;
    26.   repeat
    27.     Buffer[i] := Char(Ord('0') + (Value mod 10));
    28.     Value := Value div 10;
    29.     Inc(i);
    30.   until Value = 0;
    31.   if IsNegative then
    32.   begin
    33.     Buffer[i] := '-';
    34.     Inc(i);
    35.   end;
    36.   // –еверсируем строку
    37.   SetLength(Result, i);
    38.   while i > 0 do
    39.   begin
    40.     Dec(i);
    41.     Result[Length(Result) - i] := Buffer[i];
    42.   end;
    43. end; //IntToStr
    44.  
    45. procedure UpdateNumbers;
    46. var  
    47.   Buffer: string;
    48.   SavedLine: Integer;
    49.   i, LineCount: Integer;
    50. begin
    51.   SavedLine := SendMessage(hMemo1, EM_GETFIRSTVISIBLELINE, 0, 0);
    52.   LineCount := SendMessage(hMemo2, EM_GETLINECOUNT, 0, 0);
    53.  
    54.   Buffer := '';
    55.   for i := 1 to LineCount do
    56.   begin
    57.     Buffer := Buffer + IntToStr(i);
    58.     if i < LineCount then
    59.       Buffer := Buffer + #13#10;
    60.   end;
    61.  
    62.   SetWindowText(hMemo1, PChar(Buffer));
    63.   SendMessage(hMemo1, EM_LINESCROLL, 0, SavedLine);
    64. end;
    65.  
    66. procedure ForceSyncScroll;
    67. var
    68.   ScrollInfo: TScrollInfo;
    69.   NewPos: Integer;
    70. begin
    71.   ScrollInfo.cbSize := SizeOf(TScrollInfo);
    72.   ScrollInfo.fMask := SIF_POS or SIF_RANGE or SIF_PAGE;
    73.   GetScrollInfo(hMemo2, SB_VERT, ScrollInfo);
    74.  
    75.   NewPos := ScrollInfo.nPos;
    76.  
    77.   ScrollInfo.nPos := NewPos;
    78.   ScrollInfo.fMask := SIF_POS;
    79.   SetScrollInfo(hMemo1, SB_VERT, ScrollInfo, True);
    80.  
    81.   SendMessage(hMemo1, WM_VSCROLL, SB_THUMBPOSITION + (NewPos shl 16), 0);
    82.   SendMessage(hMemo1, WM_VSCROLL, SB_ENDSCROLL, 0);
    83. end;
    84.  
    85. function MainWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    86. var
    87.   rect: TRect;
    88. begin
    89.   Result := DefWindowProc(hWnd, Msg, wParam, lParam);
    90.  
    91.   case Msg of
    92.     WM_CREATE:
    93.       begin
    94.         hMemo1 := CreateWindow('EDIT', nil,
    95.           WS_CHILD or WS_VISIBLE or ES_MULTILINE or ES_READONLY,
    96.           10, 10, MEMO1_WIDTH, 300,
    97.           hWnd, 0, HInstance, nil);
    98.    
    99.         hMemo2 := CreateWindow('EDIT', nil,
    100.           WS_CHILD or WS_VISIBLE or WS_VSCROLL or ES_MULTILINE,
    101.           10 + MEMO1_WIDTH + 10, 10, MEMO2_WIDTH, 300,
    102.           hWnd, 0, HInstance, nil);
    103.    
    104.         UpdateNumbers;
    105.         SetTimer(hWnd, ID_TIMER, 10, nil);
    106.         SetFocus(hMemo2);
    107.       end;
    108.  
    109.     WM_TIMER:
    110.       begin
    111.         if wParam = ID_TIMER then
    112.           ForceSyncScroll;
    113.       end;
    114.  
    115.     WM_COMMAND:
    116.       begin
    117.         if (HiWord(DWORD(wParam)) = EN_CHANGE) and (lParam = hMemo2) then
    118.         begin
    119.           UpdateNumbers;
    120.           ForceSyncScroll;
    121.         end;
    122.    
    123.         if (HiWord(DWORD(wParam)) = EN_SETFOCUS) and (lParam = hMemo1) then
    124.           SetFocus(hMemo2);
    125.       end;
    126.  
    127.     WM_SIZE:
    128.       begin
    129.         GetClientRect(hWnd, rect);
    130.         MoveWindow(hMemo1, 10, 10, MEMO1_WIDTH, rect.Bottom - 20, True);
    131.         MoveWindow(hMemo2, 10 + MEMO1_WIDTH + 10, 10,
    132.                    rect.Right - (10 + MEMO1_WIDTH + 10) - 10,
    133.                    rect.Bottom - 20, True);
    134.       end;
    135.  
    136.     WM_DESTROY:
    137.       begin
    138.         KillTimer(hWnd, ID_TIMER);
    139.         PostQuitMessage(0);
    140.       end;
    141.   end;
    142. end;
    143.  
    144. var
    145.   msg: TMsg;
    146.   wc: TWndClass;
    147. begin
    148.   FillChar(wc, SizeOf(wc), 0);
    149.   wc.style := CS_HREDRAW or CS_VREDRAW;
    150.   wc.lpfnWndProc := @MainWndProc;
    151.   wc.hInstance := HInstance;
    152.   wc.hbrBackground := COLOR_WINDOW + 1;
    153.   wc.lpszClassName := 'MemoSyncClass';
    154.   RegisterClass(wc);
    155.  
    156.   CreateWindow('MemoSyncClass', 'IDE',
    157.     WS_OVERLAPPEDWINDOW or WS_VISIBLE,
    158.     CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
    159.     0, 0, HInstance, nil);
    160.  
    161.   while GetMessage(msg, 0, 0, 0) do
    162.   begin
    163.     TranslateMessage(msg);
    164.     DispatchMessage(msg);
    165.   end;
    166. end.
    167.  
    --- Сообщение объединено, 8 июн 2026 в 18:07 ---
    Еще один вариант, нарисовать номера строк с помощью Canvas.
    Код (Pascal):
    1. program MemoSync;
    2.  
    3. uses
    4.   Windows, Messages;
    5.  
    6. const
    7.   ID_TIMER = 1;
    8.  
    9.   LINE_NUMBERS_WIDTH = 40;
    10.   MEMO_WIDTH = 300;
    11.  
    12. var
    13.   hCanvas: HWND;      // Canvas для номеров строк
    14.   hMemo: HWND;        // Основной Memo для кода
    15.   Font: HFONT;       // Шрифт для номеров строк
    16.  
    17. // Своя реализация IntToStr (без SysUtils)
    18. function IntToStr(Value: Integer): string;
    19. var
    20.   i: Integer;
    21.   IsNegative: Boolean;
    22.   Buffer: array[0..15] of Char;
    23. begin
    24.   IsNegative := Value < 0;
    25.   if IsNegative then Value := -Value;
    26.   i := 0;
    27.   repeat
    28.     Buffer[i] := Char(Ord('0') + (Value mod 10));
    29.     Value := Value div 10;
    30.     Inc(i);
    31.   until Value = 0;
    32.   if IsNegative then
    33.   begin
    34.     Buffer[i] := '-';
    35.     Inc(i);
    36.   end;
    37.   SetLength(Result, i);
    38.   while i > 0 do
    39.   begin
    40.     Dec(i);
    41.     Result[Length(Result) - i] := Buffer[i];
    42.   end;
    43. end;
    44.  
    45. // Рисование номеров строк на Canvas
    46. procedure DrawLineNumbers;
    47. var
    48.   Rect: TRect;
    49.   i, LineCount: Integer;
    50.   y, LineHeight: Integer;
    51.   Text: string;
    52.   DC: HDC;
    53.   OldFont: HFONT;
    54.   FirstVisibleLine: Integer;
    55. begin
    56.   if hCanvas = 0 then Exit;
    57.  
    58.   // Получаем DC для Canvas
    59.   DC := GetDC(hCanvas);
    60.  
    61.   // Очищаем фон
    62.   GetClientRect(hCanvas, Rect);
    63.   FillRect(DC, Rect, GetStockObject(LTGRAY_BRUSH));
    64.  
    65.   // Устанавливаем шрифт
    66.   OldFont := SelectObject(DC, Font);
    67.   SetBkMode(DC, TRANSPARENT);
    68.   SetTextColor(DC, RGB(100, 100, 100));
    69.  
    70.   // Получаем количество строк в Memo
    71.   LineCount := SendMessage(hMemo, EM_GETLINECOUNT, 0, 0);
    72.  
    73.   // Получаем первую видимую строку
    74.   FirstVisibleLine := SendMessage(hMemo, EM_GETFIRSTVISIBLELINE, 0, 0);
    75.  
    76.   // Вычисляем высоту строки
    77.   SendMessage(hMemo, EM_GETRECT, 0, LPARAM(@Rect));
    78.   LineHeight := 20; // Примерная высота
    79.  
    80.   // Рисуем номера строк
    81.   y := 5;
    82.   for i := FirstVisibleLine + 1 to LineCount do
    83.   begin
    84.     Text := IntToStr(i);
    85.     TextOut(DC, 5, y, PChar(Text), Length(Text));
    86.     y := y + LineHeight;
    87.    
    88.     // Если вышли за пределы видимой области
    89.     if y > Rect.Bottom then Break;
    90.   end;
    91.  
    92.   // Восстанавливаем шрифт
    93.   SelectObject(DC, OldFont);
    94.   ReleaseDC(hCanvas, DC);
    95. end;
    96.  
    97. // Синхронизация прокрутки
    98. procedure SyncScroll;
    99. var
    100.   ScrollInfo: TScrollInfo;
    101. begin
    102.   // Получаем информацию о прокрутке Memo
    103.   ScrollInfo.cbSize := SizeOf(TScrollInfo);
    104.   ScrollInfo.fMask := SIF_POS;
    105.   GetScrollInfo(hMemo, SB_VERT, ScrollInfo);
    106.  
    107.   // Перерисовываем номера строк
    108.   DrawLineNumbers;
    109.  
    110.   // Принудительно обновляем Canvas
    111.   InvalidateRect(hCanvas, nil, False);
    112. end;
    113.  
    114. // Обработчик сообщений
    115. function MainWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    116. var
    117.   rect: TRect;
    118.   ps: TPaintStruct;
    119. begin
    120.   Result := DefWindowProc(hWnd, Msg, wParam, lParam);
    121.  
    122.   case Msg of
    123.     WM_CREATE:
    124.       begin
    125.         // Создаем шрифт для номеров строк
    126.         Font := CreateFont(12, 0, 0, 0, 400, 0, 0, 0,
    127.                            DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
    128.                            CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    129.                            FIXED_PITCH or FF_MODERN, 'Courier New');
    130.        
    131.         // Создаем Canvas для номеров строк
    132.         hCanvas := CreateWindow('STATIC', nil,
    133.                                WS_CHILD or WS_VISIBLE or SS_OWNERDRAW,
    134.                                10, 10, LINE_NUMBERS_WIDTH, 300,
    135.                                hWnd, 0, HInstance, nil);
    136.        
    137.         // Создаем Memo для кода
    138.         hMemo := CreateWindow('EDIT', nil,
    139.                              WS_CHILD or WS_VISIBLE or WS_VSCROLL or ES_MULTILINE,
    140.                              10 + LINE_NUMBERS_WIDTH + 10, 10, MEMO_WIDTH, 300,
    141.                              hWnd, 0, HInstance, nil);
    142.        
    143.         // Устанавливаем шрифт для Memo
    144.         SendMessage(hMemo, WM_SETFONT, Font, 0);
    145.        
    146.         // Устанавливаем таймер для синхронизации
    147.         SetTimer(hWnd, ID_TIMER, 10, nil);
    148.         SetFocus(hMemo);
    149.        
    150.         // Рисуем начальные номера строк
    151.         DrawLineNumbers;
    152.       end;
    153.    
    154.     WM_TIMER:
    155.       begin
    156.         if wParam = ID_TIMER then
    157.           SyncScroll;
    158.       end;
    159.    
    160.     WM_COMMAND:
    161.       begin
    162.         if (HiWord(DWORD(wParam)) = EN_CHANGE) and (lParam = hMemo) then
    163.         begin
    164.           // При изменении текста перерисовываем номера строк
    165.           DrawLineNumbers;
    166.         end;
    167.       end;
    168.    
    169.     WM_SIZE:
    170.       begin
    171.         GetClientRect(hWnd, rect);
    172.         // Изменяем размер Canvas
    173.         MoveWindow(hCanvas, 10, 10, LINE_NUMBERS_WIDTH, rect.Bottom - 20, True);
    174.         // Изменяем размер Memo
    175.         MoveWindow(hMemo, 10 + LINE_NUMBERS_WIDTH + 10, 10,
    176.                    rect.Right - (10 + LINE_NUMBERS_WIDTH + 10) - 10,
    177.                    rect.Bottom - 20, True);
    178.        
    179.         DrawLineNumbers;
    180.       end;
    181.    
    182.     WM_DESTROY:
    183.       begin
    184.         KillTimer(hWnd, ID_TIMER);
    185.         DeleteObject(Font);
    186.         PostQuitMessage(0);
    187.       end;
    188.   end;
    189. end;
    190.  
    191. var  
    192.   msg: TMsg;
    193.   wc: TWndClass;
    194. begin
    195.   FillChar(wc, SizeOf(wc), 0);
    196.   wc.style := CS_HREDRAW or CS_VREDRAW;
    197.   wc.lpfnWndProc := @MainWndProc;
    198.   wc.hInstance := HInstance;
    199.   wc.hbrBackground := COLOR_WINDOW + 1;
    200.   wc.lpszClassName := 'MemoSyncClass';
    201.   RegisterClass(wc);
    202.  
    203.   CreateWindow('MemoSyncClass', 'IDE',
    204.     WS_OVERLAPPEDWINDOW or WS_VISIBLE,
    205.     CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
    206.     0, 0, HInstance, nil);
    207.  
    208.   while GetMessage(msg, 0, 0, 0) do
    209.   begin
    210.     TranslateMessage(msg);
    211.     DispatchMessage(msg);
    212.   end;
    213. end.
    --- Сообщение объединено, 8 июн 2026 в 18:08 ---
    --- --
    --- Сообщение объединено, 8 июн 2026 в 22:45 ---
    В ближайшее время будет такая open source ide для python'a.
    С вкладками, подсветкой синтаксиса, с запуском скриптов и выводом отладочной инфы.

    С python для меня все понятно, было бы замечательно если бы помогли с этим:

    :)
    --- Сообщение объединено, 8 июн 2026 в 22:52 ---
    Логика такая: если есть готовая ide для python'а, то не составит труда доработать ее для цэ и масма.
     

    Вложения:

    • Memo Sync.rar
      Размер файла:
      9,8 КБ
      Просмотров:
      8
    • Memo Canvas.rar
      Размер файла:
      10,6 КБ
      Просмотров:
      7
  8. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.652
    Tech, тема называется "Пакет MASM64"
    Хотя да, о чем я, спасибо хоть посты с кодом выкладываете, а не с микробиотой и мемасиками ютуба..