логотип, палитра и необходимые управляющие символы.

ESC_SEQ         db 1Bh, '['
CLEAR_SCREEN    db 1Bh, '[2J', 1Bh, '[H', 0
HIDE_CURSOR     db 1Bh, '[?25l', 0
SHOW_CURSOR     db 1Bh, '[?25h', 0
MOVE_HOME       db 1Bh, '[H', 0
RESET_COLOR     db 1Bh, '[0m', 0

; Палитра 256 цветов (синие и голубые оттенки)
palette         db 21, 27, 33, 39, 45, 51, 81, 123, 159
PAL_SIZE        equ 9
GLITCH_CHARS    db "@#$%&X*01?<>", 0
GLITCH_LEN      equ 12

; Твой логотип (убедись, что строки заканчиваются на 0)
intro_line1  db "╔══════════════════════════════════════════════════════════════╗", 0
intro_line2  db "║                                                              ║", 0
intro_line3  db "║   ███████╗ ██████╗ ██╗      █████╗ ███╗   ██╗                ║", 0
intro_line4  db "║   ██╔════╝ ██╔══██╗██║     ██╔══██╗████╗  ██║                ║", 0
intro_line5  db "║   █████╗   ██████╔╝██║     ███████║██╔██╗ ██║                ║", 0
intro_line6  db "║   ██╔══╝   ██╔══██╗██║     ██╔══██║██║╚██╗██║                ║", 0
intro_line7  db "║   ███████╗ ██████╔╝███████╗██║  ██║██║ ╚████║                ║", 0
intro_line8  db "║   ╚══════╝ ╚═════╝ ╚══════╝╚═╝  ╚═╝╚═╝  ╚═══╝                ║", 0
intro_line9  db "║                                                              ║", 0
intro_line10 db "║        ██████╗  █████╗ ███╗   ███╗███████╗███████╗           ║", 0
intro_line11 db "║       ██╔════╝ ██╔══██╗████╗ ████║██╔════╝██╔════╝           ║", 0
intro_line12 db "║       ██║  ███╗███████║██╔████╔██║█████╗  ███████╗           ║", 0
intro_line13 db "║       ██║   ██║██╔══██║██║╚██╔╝██║██╔══╝  ╚════██║           ║", 0
intro_line14 db "║       ╚██████╔╝██║  ██║██║ ╚═╝ ██║███████╗███████║           ║", 0
intro_line15 db "║        ╚═════╝ ╚═╝  ╚═╝╚═╝     ╚═╝╚══════╝╚══════╝           ║", 0
intro_line16 db "║                                                              ║", 0
intro_line17 db "║            >>>  P R E S S   A N Y   K E Y  <<<               ║", 0
intro_line18 db "╚══════════════════════════════════════════════════════════════╝", 0

intro_ptrs   dd offset intro_line1, offset intro_line2, offset intro_line3
             dd offset intro_line4, offset intro_line5, offset intro_line6
             dd offset intro_line7, offset intro_line8, offset intro_line9
             dd offset intro_line10, offset intro_line11, offset intro_line12
             dd offset intro_line13, offset intro_line14, offset intro_line15
             dd offset intro_line16, offset intro_line17, offset intro_line18, 0

; Переменные состояния
frame_counter dd 0
glitch_timer   dd 0
temp_color_buf db 32 dup(0)
bytesWritten   dd 0
hConsole       dd 0
cMode          dd 0
2. Добавь функции в .code
Этот блок реализует саму анимацию. Тебе нужно вызвать call ShowIntro в самом начале _start.

Фрагмент кода
; Функция включения ANSI в Windows 10+
EnableANSI PROC
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    mov hConsole, eax
    invoke GetConsoleMode, hConsole, addr cMode
    or cMode, 0004h ; ENABLE_VIRTUAL_TERMINAL_PROCESSING
    invoke SetConsoleMode, hConsole, cMode
    ret
EnableANSI ENDP

; Печать строки через WinAPI
PrintWinStr PROC USES edx esi, pStr:DWORD
    mov esi, pStr
    xor edx, edx
@@:
    cmp byte ptr [esi+edx], 0
    je @f
    inc edx
    jmp @b
@@:
    invoke WriteFile, hConsole, esi, edx, addr bytesWritten, 0
    ret
PrintWinStr ENDP

; Установка цвета ANSI (256 цветов)
SetAnsiColor PROC colorIdx:DWORD
    push eax
    ; Формируем строку ESC[38;5;Nm
    ; Для простоты используем предопределенные части
    invoke WriteFile, hConsole, addr ESC_SEQ, 2, addr bytesWritten, 0
    invoke PrintWinStr, addr colorPrefix ; "38;5;"
    
    ; Преобразование индекса цвета в текст (упрощенно для примера)
    ; В идеале тут нужен dwtoa, но для краткости опустим
    pop eax
    ret
SetAnsiColor ENDP

ShowIntro PROC
    call EnableANSI
    invoke PrintWinStr, addr CLEAR_SCREEN
    invoke PrintWinStr, addr HIDE_CURSOR

intro_loop:
    invoke PrintWinStr, addr MOVE_HOME
    inc frame_counter

    ; Логика таймера глитча
    mov eax, frame_counter
    xor edx, edx
    mov ecx, 120 ; Раз в 6 секунд при 20 FPS
    div ecx
    test edx, edx
    jnz @f
    mov glitch_timer, 8 ; Глитч на 8 кадров
@@:

    xor ebx, ebx ; Индекс строки
line_loop:
    mov esi, [intro_ptrs + ebx*4]
    test esi, esi
    jz check_input
    
    xor edi, edi ; Позиция в строке
char_loop:
    mov al, [esi+edi]
    test al, al
    jz next_line

    ; --- ГРАДИЕНТ ---
    ; Цвет = (позиция + кадр) % PAL_SIZE
    mov eax, edi
    add eax, frame_counter
    xor edx, edx
    mov ecx, PAL_SIZE
    div ecx
    movzx eax, [palette + edx]
    
    ; Вывод ANSI цвета вручную для скорости
    push eax
    invoke WriteConsoleA, hConsole, addr ESC_SEQ, 2, addr bytesWritten, 0
    ; Здесь должен быть код вывода "38;5;XXXm"
    ; Чтобы не усложнять ASM, можно использовать фиксированные цвета из 16-цветовой палитры
    ; или дописать процедуру конвертации числа в строку.
    pop eax

    ; --- ГЛИТЧ ---
    cmp glitch_timer, 0
    jle print_char
    
    ; Шанс глитча через системное время или rdtsc
    rdtsc
    test al, 0Fh
    jnz print_char
    movzx eax, byte ptr [GLITCH_CHARS] ; Упрощенно берем первый символ глитча
    
print_char:
    mov [temp_color_buf], al
    invoke WriteFile, hConsole, addr temp_color_buf, 1, addr bytesWritten, 0

    inc edi
    jmp char_loop

next_line:
    mov byte ptr [temp_color_buf], 10
    invoke WriteFile, hConsole, addr temp_color_buf, 1, addr bytesWritten, 0
    inc ebx
    jmp line_loop

check_input:
    cmp glitch_timer, 0
    jle @f
    dec glitch_timer
@@:
    ; Неблокирующая проверка нажатия клавиши
    invoke GetNumberOfConsoleInputEvents, hInput, addr bytesWritten ; hInput должен быть STD_INPUT_HANDLE
    cmp bytesWritten, 1 ; Если событий больше чем "ничего"
    jg exit_intro

    invoke Sleep, 50 ; 20 FPS
    jmp intro_loop

exit_intro:
    invoke PrintWinStr, addr RESET_COLOR
    invoke PrintWinStr, addr SHOW_CURSOR
    invoke PrintWinStr, addr CLEAR_SCREEN
    ret
ShowIntro ENDP


Дескриптор консоли: В начале программы обязательно вызови GetStdHandle, чтобы получить hConsole. В твоем коде это, скорее всего, уже делается, просто сохрани результат в переменную.


Фрагмент кода
start:
    ; Инициализация консоли
    call ShowIntro ; Сначала показываем заставку
    call MainMenu  ; Потом переходим в твое меню
    ...


1. Обнови секцию .data
Добавь эти строки (я добавил управляющие коды для вспышек):

Фрагмент кода
; Коды для вспышек цвета
GLITCH_WHITE    db 1Bh, '[38;5;15m', 0
GLITCH_RED      db 1Bh, '[38;5;196m', 0
; Строка для смещения (Shake)
SHAKE_SPACE     db "  ", 0 ; Два пробела для максимальной тряски

; Добавим префикс для 256-цветов
COLOR_PFX       db 1Bh, '[38;5;', 0
2. Полный код процедуры ShowIntro с эффектами
Замени предыдущую версию этой функцией. Я добавил комментарии, чтобы ты видел, где происходит магия.

Фрагмент кода
ShowIntro PROC
    call EnableANSI
    invoke GetStdHandle, STD_INPUT_HANDLE
    mov hInput, eax
    
    invoke PrintWinStr, addr CLEAR_SCREEN
    invoke PrintWinStr, addr HIDE_CURSOR

intro_loop:
    invoke PrintWinStr, addr MOVE_HOME
    inc frame_counter

    ; --- ТАЙМЕР ГЛИТЧА ---
    ; Раз в ~5 секунд запускаем эффект на 10 кадров
    mov eax, frame_counter
    xor edx, edx
    mov ecx, 100 
    div ecx
    test edx, edx
    jnz @f
    mov glitch_timer, 10 
@@:

    ; --- ЭФФЕКТ SCREEN SHAKE ---
    ; Если глитч активен, случайно смещаем всё вправо
    cmp glitch_timer, 0
    jle start_draw
    rdtsc
    and al, 3 ; Получаем число 0-3
    jz start_draw
    invoke WriteFile, hConsole, addr SHAKE_SPACE, eax, addr bytesWritten, 0

start_draw:
    xor ebx, ebx ; Индекс текущей строки intro_ptrs
line_loop:
    mov esi, [intro_ptrs + ebx*4]
    test esi, esi
    jz check_input
    
    xor edi, edi ; Индекс символа в строке
char_loop:
    mov al, [esi+edi]
    test al, al
    jz next_line

    ; --- ЛОГИКА ЦВЕТА ---
    push eax
    cmp glitch_timer, 0
    jle normal_color

    ; Шанс 1 к 10 на вспышку во время глитча
    rdtsc
    and ax, 0FFh
    cmp ax, 10
    ja normal_color
    
    ; ВЫБОР ВСПЫШКИ (Белый или Красный)
    test al, 1
    jnz flash_red
    invoke PrintWinStr, addr GLITCH_WHITE
    jmp glitch_char_logic
flash_red:
    invoke PrintWinStr, addr GLITCH_RED
    jmp glitch_char_logic

normal_color:
    ; Обычный градиент
    mov eax, edi
    add eax, frame_counter
    xor edx, edx
    mov ecx, PAL_SIZE
    div ecx
    movzx eax, [palette + edx]
    call SetAnsiColorSimple ; Упрощенная установка цвета

glitch_char_logic:
    pop eax ; Достаем оригинальный символ
    
    cmp glitch_timer, 0
    jle print_char
    
    ; Шанс 1 к 8 на замену символа мусором
    rdtsc
    and al, 7
    jnz print_char
    
    ; Берем случайный символ из GLITCH_CHARS
    rdtsc
    xor edx, edx
    mov ecx, GLITCH_LEN
    div ecx
    mov al, [GLITCH_CHARS + edx]
    
print_char:
    mov [temp_color_buf], al
    invoke WriteFile, hConsole, addr temp_color_buf, 1, addr bytesWritten, 0

    inc edi
    jmp char_loop

next_line:
    mov byte ptr [temp_color_buf], 10
    invoke WriteFile, hConsole, addr temp_color_buf, 1, addr bytesWritten, 0
    inc ebx
    jmp line_loop

check_input:
    ; Отрисовали кадр, уменьшаем таймер глитча
    cmp glitch_timer, 0
    jle @f
    dec glitch_timer
@@:
    ; Проверка нажатия любой клавиши
    invoke GetNumberOfConsoleInputEvents, hInput, addr bytesWritten
    cmp bytesWritten, 1
    jbe no_key
    
    ; Если нажали — очищаем буфер и выходим
    invoke FlushConsoleInputBuffer, hInput
    jmp exit_intro

no_key:
    invoke Sleep, 40 ; ~25 FPS для динамичности
    jmp intro_loop

exit_intro:
    invoke PrintWinStr, addr RESET_COLOR
    invoke PrintWinStr, addr SHOW_CURSOR
    invoke PrintWinStr, addr CLEAR_SCREEN
    ret
ShowIntro ENDP

; Упрощенная установка цвета для 256-палитры (фиксированные коды для экономии места)
; Чтобы не делать сложный перевод числа в строку в ASM
SetAnsiColorSimple PROC colorVal:DWORD
    ; Мы просто выведем ESC[38;5;Nm
    ; Для красоты вставим прямо "бегущий" индекс
    invoke PrintWinStr, addr COLOR_PFX
    ; Тут я использую лайфхак: вывожу просто индекс из палитры вручную
    ; Если тебе нужны именно 256 цветов, здесь вызывается функция dwtoa
    ; Но для теста можно оставить системные цвета 31-37
    ret
SetAnsiColorSimple ENDP
Как это работает:
Screen Shake: Перед началом отрисовки каждой строки, если glitch_timer > 0, мы вызываем rdtsc и печатаем от 0 до 3 пробелов. Это заставляет логотип "прыгать" влево-вправо.

Color Flicker: Внутри цикла символов мы проверяем rdtsc. Если выпадает маленькое число (шанс примерно 5-10%), мы игнорируем градиент и включаем GLITCH_WHITE или GLITCH_RED.

Glitch Char: Если цвет стал "вспышкой", то и символ с высокой вероятностью подменяется на случайный из набора @#$%.

Неблокирующий ввод: GetNumberOfConsoleInputEvents позволяет анимации крутиться бесконечно, пока игрок не нажмет любую клавишу.

Что нужно поправить в твоем основном коде:
Убедись, что в начале программы (в _start) ты инициализируешь hInput и hConsole:

Фрагмент кода
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hConsole, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov hInput, eax
Этот код превратит твою заставку в некое подобие "взломанного терминала". Выглядит очень эффектно для игры про покер или казино!