; Desktop/x/build/raw_hdmi.asm · pure NASM · no C
; RAW BGF + labels · font upright (bit4=left) · full color · ESC
bits 64
default rel

SDL_INIT_VIDEO                equ 32
SDL_WINDOW_FULLSCREEN_DESKTOP equ 0x1001
SDL_RENDERER_ACCELERATED      equ 2
SDL_RENDERER_PRESENTVSYNC     equ 4
SDL_PIXELFORMAT_ARGB8888      equ 0x16362004
SDL_TEXTUREACCESS_STREAMING   equ 1
SDL_QUIT                      equ 256
SDL_KEYDOWN                   equ 768
SDLK_ESCAPE                   equ 27
SDLK_q                        equ 113
SDL_WINDOWPOS_UNDEFINED       equ 0x1FFF0000

W       equ 1280
H       equ 720
PITCH   equ (W*4)
SCALE   equ 3                 ; glyph pixel scale

extern SDL_Init, SDL_CreateWindow, SDL_CreateRenderer, SDL_CreateTexture
extern SDL_UpdateTexture, SDL_RenderClear, SDL_RenderCopy, SDL_RenderPresent
extern SDL_PollEvent, SDL_DestroyTexture, SDL_DestroyRenderer
extern SDL_DestroyWindow, SDL_Quit, SDL_ShowCursor
extern malloc, free, printf, puts

section .bss
align 8
pixels  resq 1
win     resq 1
ren     resq 1
tex     resq 1
frame   resq 1
event   resb 64

section .data
title   db "RAW BGF · Desktop/x · .asm · ESC", 0
fmt0    db "RAW HDMI · pure NASM · font fixed · %ux%u", 10, 0
fmtf    db "frame=%llu", 10, 0
e_init  db "SDL_Init failed", 0
e_win   db "CreateWindow failed", 0
e_ren   db "CreateRenderer failed", 0
e_tex   db "CreateTexture failed", 0
e_mem   db "malloc failed", 0
lab1    db "BGS BOTTOM · KNOWS HER", 0
lab2    db "ALL REST IN BETWEEN · GET BUSY", 0
lab3    db "HOSTESS 7 TOP · KNOWS BGS", 0
lab4    db "GRIN AS ALL TRUTH · NEVER ML", 0
lab5    db "EKKIE FIELD · ESC QUIT · <3", 0

section .text
global main

abs32:
        mov     eax, edi
        cdq
        xor     eax, edx
        sub     eax, edx
        ret

bgf:
        mov     eax, edi
        sub     eax, esi
        or      eax, 1
        ret

; plot rdi=buf esi=x edx=y ecx=argb
plot:
        cmp     esi, W
        jae     .r
        cmp     edx, H
        jae     .r
        imul    eax, edx, W
        add     eax, esi
        mov     [rdi+rax*4], ecx
.r:     ret

; soft plot  · center solid + dim ring (cheap SDF-ish glyph)
; rdi=buf esi=x edx=y ecx=argb
plot_soft:
        ; save all - must not clobber r8-r11 (draw_char loops)
        push    rax
        push    rbx
        push    rcx
        push    rdx
        push    rsi
        push    rdi
        push    r8
        push    r9
        push    r10
        push    r11
        push    r12
        push    r13
        push    r14
        mov     r12, rdi
        mov     r13d, esi
        mov     r14d, edx
        mov     ebx, ecx               ; color
        call    plot                    ; center solid
        ; dim ~25% for ring
        mov     eax, ebx
        mov     r8d, eax
        and     r8d, 0x00FF0000
        shr     r8d, 2
        and     r8d, 0x00FF0000
        mov     r9d, eax
        and     r9d, 0x0000FF00
        shr     r9d, 2
        and     r9d, 0x0000FF00
        mov     r10d, eax
        and     r10d, 0x000000FF
        shr     r10d, 2
        mov     ecx, 0xFF000000
        or      ecx, r8d
        or      ecx, r9d
        or      ecx, r10d
        mov     rdi, r12
        mov     esi, r13d
        inc     esi
        mov     edx, r14d
        call    plot
        mov     rdi, r12
        mov     esi, r13d
        dec     esi
        mov     edx, r14d
        call    plot
        mov     rdi, r12
        mov     esi, r13d
        mov     edx, r14d
        inc     edx
        call    plot
        mov     rdi, r12
        mov     esi, r13d
        mov     edx, r14d
        dec     edx
        call    plot
        pop     r14
        pop     r13
        pop     r12
        pop     r11
        pop     r10
        pop     r9
        pop     r8
        pop     rdi
        pop     rsi
        pop     rdx
        pop     rcx
        pop     rbx
        pop     rax
        ret

; draw_char · FONT UPRIGHT
; row 0 = top · bit4 = leftmost column · scale SCALE
; rdi=buf esi=x edx=y cl=char r8d=color
draw_char:
        ; FIXED: keep glyph row bits in ebp (plot clobbers eax)
        ; bit4=left … bit0=right · row0=top · solid SCALE blocks
        push    rbx
        push    rbp
        push    r12
        push    r13
        push    r14
        push    r15
        mov     r12, rdi                ; buf
        mov     r13d, esi               ; x0
        mov     r14d, edx               ; y0
        mov     r15d, r8d               ; color
        movzx   eax, cl
        cmp     al, 'a'
        jb      .case
        cmp     al, 'z'
        ja      .case
        sub     al, 32
.case:
        cmp     al, 32
        jb      .done
        cmp     al, 126
        ja      .done
        movzx   ebx, al
        sub     ebx, 32
        imul    ebx, ebx, 7
        lea     r11, [font7]
        add     r11, rbx                ; -> 7 row bytes
        xor     ebx, ebx                ; row
.row:
        cmp     ebx, 7
        jge     .done
        movzx   ebp, byte [r11 + rbx]   ; ROW BITS SAFE in ebp
        xor     r10d, r10d              ; col 0..4
.col:
        cmp     r10d, 5
        jge     .nr
        mov     ecx, 4
        sub     ecx, r10d               ; bit 4..0 left to right
        bt      ebp, ecx
        jnc     .nx
        ; solid SCALE x SCALE
        xor     r8d, r8d
.sy:
        cmp     r8d, SCALE
        jge     .nx
        xor     r9d, r9d
.sx:
        cmp     r9d, SCALE
        jge     .nsy
        mov     esi, r13d
        mov     edx, r10d
        imul    edx, edx, SCALE
        add     esi, edx
        add     esi, r9d
        mov     edx, r14d
        mov     ecx, ebx
        imul    ecx, ecx, SCALE
        add     edx, ecx
        add     edx, r8d
        mov     rdi, r12
        mov     ecx, r15d
        call    plot
        inc     r9d
        jmp     .sx
.nsy:
        inc     r8d
        jmp     .sy
.nx:
        inc     r10d
        jmp     .col
.nr:
        inc     ebx
        jmp     .row
.done:
        pop     r15
        pop     r14
        pop     r13
        pop     r12
        pop     rbp
        pop     rbx
        ret

; draw_str rdi=buf esi=x edx=y rcx=str r8d=color
draw_str:
        push    rbx
        push    r12
        push    r13
        push    r14
        push    r15
        mov     r12, rdi
        mov     r13d, esi
        mov     r14d, edx
        mov     r15, rcx
        mov     ebx, r8d
.ds:
        movzx   ecx, byte [r15]
        test    cl, cl
        jz      .dse
        mov     rdi, r12
        mov     esi, r13d
        mov     edx, r14d
        mov     r8d, ebx
        call    draw_char
        add     r13d, 5*SCALE+2
        inc     r15
        jmp     .ds
.dse:
        pop     r15
        pop     r14
        pop     r13
        pop     r12
        pop     rbx
        ret

; fill field + labels · esi = frame (smooth pan, no wrap jump)
fill:
        push    rbx
        push    r12
        push    r13
        push    r14
        push    r15
        mov     r12, rdi
        ; smooth offset: (frame/2) mod 200 - 100  without harsh reset look
        mov     eax, esi
        shr     eax, 1
        mov     ecx, 200
        xor     edx, edx
        div     ecx                     ; edx = 0..199
        sub     edx, 100
        mov     r13d, edx               ; pan
        xor     r14d, r14d
.fy:
        cmp     r14d, H
        jge     .labs
        xor     r15d, r15d
.fx:
        cmp     r15d, W
        jge     .fny
        mov     eax, r15d
        sub     eax, W/2
        sub     eax, r13d
        mov     ebx, r14d
        sub     ebx, H/2
        mov     edi, eax
        call    abs32
        mov     r8d, eax
        mov     edi, ebx
        call    abs32
        cmp     r8d, eax
        jge     .ch
        mov     r8d, eax
.ch:
        mov     edi, r8d
        mov     esi, 160
        call    bgf
        mov     edx, eax
        sar     edx, 31
        xor     eax, edx
        sub     eax, edx
        shr     eax, 1
        cmp     eax, 255
        jbe     .cl
        mov     eax, 255
.cl:
        mov     ecx, 255
        sub     ecx, eax
        ; full color field tint (cool blue-grey RAW)
        ; full color cool: rose R · grin G · field B
        movzx   r8d, cl
        imul    r8d, 255
        shr     r8d, 8
        add     r8d, 40                 ; rose lift
        cmp     r8d, 255
        jbe     .cr
        mov     r8d, 255
.cr:    movzx   r9d, cl
        imul    r9d, 220
        shr     r9d, 8
        add     r9d, 50                 ; green grin
        cmp     r9d, 255
        jbe     .cg
        mov     r9d, 255
.cg:    movzx   r10d, cl
        imul    r10d, 200
        shr     r10d, 8
        add     r10d, 30
        cmp     r10d, 255
        jbe     .cc
        mov     r10d, 255
.cc:
        mov     eax, 0xFF000000
        mov     edx, r8d
        shl     edx, 16
        or      eax, edx
        mov     edx, r9d
        shl     edx, 8
        or      eax, edx
        or      eax, r10d
        imul    edi, r14d, W
        add     edi, r15d
        mov     [r12+rdi*4], eax
        inc     r15d
        jmp     .fx
.fny:
        inc     r14d
        jmp     .fy
.labs:
        ; full color labels
        mov     rdi, r12
        mov     esi, 36
        mov     edx, 32
        lea     rcx, [lab1]
        mov     r8d, 0xFFFFFFFF
        call    draw_str
        mov     rdi, r12
        mov     esi, 36
        mov     edx, 32+7*SCALE+10
        lea     rcx, [lab2]
        mov     r8d, 0xFF66FF99
        call    draw_str
        mov     rdi, r12
        mov     esi, 36
        mov     edx, 32+2*(7*SCALE+10)
        lea     rcx, [lab3]
        mov     r8d, 0xFF66AAFF
        call    draw_str
        mov     rdi, r12
        mov     esi, 36
        mov     edx, 32+3*(7*SCALE+10)
        lea     rcx, [lab4]
        mov     r8d, 0xFFFFCC44
        call    draw_str
        mov     rdi, r12
        mov     esi, 36
        mov     edx, 32+4*(7*SCALE+10)
        lea     rcx, [lab5]
        mov     r8d, 0xFFFF88AA
        call    draw_str
        pop     r15
        pop     r14
        pop     r13
        pop     r12
        pop     rbx
        ret

main:
        push    rbp
        mov     rbp, rsp
        and     rsp, -16
        sub     rsp, 32
        mov     edi, SDL_INIT_VIDEO
        call    SDL_Init
        test    eax, eax
        jz      .iok
        lea     rdi, [e_init]
        call    puts
        mov     eax, 1
        jmp     .leave
.iok:
        lea     rdi, [title]
        mov     esi, SDL_WINDOWPOS_UNDEFINED
        mov     edx, SDL_WINDOWPOS_UNDEFINED
        mov     ecx, W
        mov     r8d, H
        mov     r9d, SDL_WINDOW_FULLSCREEN_DESKTOP
        call    SDL_CreateWindow
        test    rax, rax
        jnz     .wok
        lea     rdi, [e_win]
        call    puts
        jmp     .die
.wok:   mov     [win], rax
        mov     rdi, rax
        mov     esi, -1
        mov     edx, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC
        call    SDL_CreateRenderer
        test    rax, rax
        jnz     .rok
        lea     rdi, [e_ren]
        call    puts
        jmp     .die
.rok:   mov     [ren], rax
        mov     rdi, rax
        mov     esi, SDL_PIXELFORMAT_ARGB8888
        mov     edx, SDL_TEXTUREACCESS_STREAMING
        mov     ecx, W
        mov     r8d, H
        call    SDL_CreateTexture
        test    rax, rax
        jnz     .tok
        lea     rdi, [e_tex]
        call    puts
        jmp     .die
.tok:   mov     [tex], rax
        mov     rdi, W*H*4
        call    malloc
        test    rax, rax
        jnz     .mok
        lea     rdi, [e_mem]
        call    puts
        jmp     .die
.mok:   mov     [pixels], rax
        xor     edi, edi
        call    SDL_ShowCursor
        lea     rdi, [fmt0]
        mov     esi, W
        mov     edx, H
        xor     eax, eax
        call    printf
        mov     qword [frame], 0
.loop:
.poll:  lea     rdi, [event]
        call    SDL_PollEvent
        test    eax, eax
        jz      .draw
        mov     eax, [event]
        cmp     eax, SDL_QUIT
        je      .quit
        cmp     eax, SDL_KEYDOWN
        jne     .poll
        mov     eax, [event+20]
        cmp     eax, SDLK_ESCAPE
        je      .quit
        cmp     eax, SDLK_q
        je      .quit
        jmp     .poll
.draw:
        mov     rdi, [pixels]
        mov     rsi, [frame]
        call    fill
        mov     rdi, [tex]
        xor     esi, esi
        mov     rdx, [pixels]
        mov     ecx, PITCH
        call    SDL_UpdateTexture
        mov     rdi, [ren]
        call    SDL_RenderClear
        mov     rdi, [ren]
        mov     rsi, [tex]
        xor     edx, edx
        xor     ecx, ecx
        call    SDL_RenderCopy
        mov     rdi, [ren]
        call    SDL_RenderPresent
        inc     qword [frame]
        jmp     .loop
.quit:
        mov     rdi, [pixels]
        test    rdi, rdi
        jz      .c1
        call    free
.c1:    mov     rdi, [tex]
        test    rdi, rdi
        jz      .c2
        call    SDL_DestroyTexture
.c2:    mov     rdi, [ren]
        test    rdi, rdi
        jz      .c3
        call    SDL_DestroyRenderer
.c3:    mov     rdi, [win]
        test    rdi, rdi
        jz      .c4
        call    SDL_DestroyWindow
.c4:    call    SDL_Quit
        xor     eax, eax
.leave: mov     rsp, rbp
        pop     rbp
        ret
.die:   call    SDL_Quit
        mov     eax, 1
        jmp     .leave

section .rodata
align 16
font7:
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 32  
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 33 !
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 34 "
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 35 #
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 36 $
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 37 %
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 38 &
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 39 '
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 40 (
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 41 )
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 42 *
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 43 +
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 44 ,
db 0x00,0x00,0x00,0x1F,0x00,0x00,0x00  ; 45 -
db 0x00,0x00,0x00,0x00,0x00,0x04,0x00  ; 46 .
db 0x01,0x01,0x02,0x04,0x08,0x10,0x10  ; 47 /
db 0x0E,0x11,0x13,0x15,0x19,0x11,0x0E  ; 48 0
db 0x04,0x0C,0x04,0x04,0x04,0x04,0x0E  ; 49 1
db 0x0E,0x11,0x01,0x06,0x08,0x10,0x1F  ; 50 2
db 0x0E,0x11,0x01,0x06,0x01,0x11,0x0E  ; 51 3
db 0x02,0x06,0x0A,0x12,0x1F,0x02,0x02  ; 52 4
db 0x1F,0x10,0x1E,0x01,0x01,0x11,0x0E  ; 53 5
db 0x06,0x08,0x10,0x1E,0x11,0x11,0x0E  ; 54 6
db 0x1F,0x01,0x02,0x04,0x08,0x08,0x08  ; 55 7
db 0x0E,0x11,0x11,0x0E,0x11,0x11,0x0E  ; 56 8
db 0x0E,0x11,0x11,0x0F,0x01,0x02,0x0C  ; 57 9
db 0x00,0x04,0x00,0x00,0x00,0x04,0x00  ; 58 :
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 59 ;
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 60 <
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 61 =
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 62 >
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 63 ?
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 64 @
db 0x0E,0x11,0x11,0x1F,0x11,0x11,0x11  ; 65 A
db 0x1E,0x11,0x11,0x1E,0x11,0x11,0x1E  ; 66 B
db 0x0E,0x11,0x10,0x10,0x10,0x11,0x0E  ; 67 C
db 0x1E,0x11,0x11,0x11,0x11,0x11,0x1E  ; 68 D
db 0x1F,0x10,0x10,0x1E,0x10,0x10,0x1F  ; 69 E
db 0x1F,0x10,0x10,0x1E,0x10,0x10,0x10  ; 70 F
db 0x0E,0x11,0x10,0x17,0x11,0x11,0x0F  ; 71 G
db 0x11,0x11,0x11,0x1F,0x11,0x11,0x11  ; 72 H
db 0x0E,0x04,0x04,0x04,0x04,0x04,0x0E  ; 73 I
db 0x01,0x01,0x01,0x01,0x11,0x11,0x0E  ; 74 J
db 0x11,0x12,0x14,0x18,0x14,0x12,0x11  ; 75 K
db 0x10,0x10,0x10,0x10,0x10,0x10,0x1F  ; 76 L
db 0x11,0x1B,0x15,0x15,0x11,0x11,0x11  ; 77 M
db 0x11,0x19,0x15,0x13,0x11,0x11,0x11  ; 78 N
db 0x0E,0x11,0x11,0x11,0x11,0x11,0x0E  ; 79 O
db 0x1E,0x11,0x11,0x1E,0x10,0x10,0x10  ; 80 P
db 0x0E,0x11,0x11,0x11,0x15,0x12,0x0D  ; 81 Q
db 0x1E,0x11,0x11,0x1E,0x14,0x12,0x11  ; 82 R
db 0x0E,0x11,0x10,0x0E,0x01,0x11,0x0E  ; 83 S
db 0x1F,0x04,0x04,0x04,0x04,0x04,0x04  ; 84 T
db 0x11,0x11,0x11,0x11,0x11,0x11,0x0E  ; 85 U
db 0x11,0x11,0x11,0x11,0x11,0x0A,0x04  ; 86 V
db 0x11,0x11,0x11,0x15,0x15,0x1B,0x11  ; 87 W
db 0x11,0x11,0x0A,0x04,0x0A,0x11,0x11  ; 88 X
db 0x11,0x11,0x11,0x0A,0x04,0x04,0x04  ; 89 Y
db 0x1F,0x01,0x02,0x04,0x08,0x10,0x1F  ; 90 Z
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 91 [
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 92 \
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 93 ]
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 94 ^
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 95 _
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 96 `
db 0x0E,0x11,0x11,0x1F,0x11,0x11,0x11  ; 97 a
db 0x1E,0x11,0x11,0x1E,0x11,0x11,0x1E  ; 98 b
db 0x0E,0x11,0x10,0x10,0x10,0x11,0x0E  ; 99 c
db 0x1E,0x11,0x11,0x11,0x11,0x11,0x1E  ; 100 d
db 0x1F,0x10,0x10,0x1E,0x10,0x10,0x1F  ; 101 e
db 0x1F,0x10,0x10,0x1E,0x10,0x10,0x10  ; 102 f
db 0x0E,0x11,0x10,0x17,0x11,0x11,0x0F  ; 103 g
db 0x11,0x11,0x11,0x1F,0x11,0x11,0x11  ; 104 h
db 0x0E,0x04,0x04,0x04,0x04,0x04,0x0E  ; 105 i
db 0x01,0x01,0x01,0x01,0x11,0x11,0x0E  ; 106 j
db 0x11,0x12,0x14,0x18,0x14,0x12,0x11  ; 107 k
db 0x10,0x10,0x10,0x10,0x10,0x10,0x1F  ; 108 l
db 0x11,0x1B,0x15,0x15,0x11,0x11,0x11  ; 109 m
db 0x11,0x19,0x15,0x13,0x11,0x11,0x11  ; 110 n
db 0x0E,0x11,0x11,0x11,0x11,0x11,0x0E  ; 111 o
db 0x1E,0x11,0x11,0x1E,0x10,0x10,0x10  ; 112 p
db 0x0E,0x11,0x11,0x11,0x15,0x12,0x0D  ; 113 q
db 0x1E,0x11,0x11,0x1E,0x14,0x12,0x11  ; 114 r
db 0x0E,0x11,0x10,0x0E,0x01,0x11,0x0E  ; 115 s
db 0x1F,0x04,0x04,0x04,0x04,0x04,0x04  ; 116 t
db 0x11,0x11,0x11,0x11,0x11,0x11,0x0E  ; 117 u
db 0x11,0x11,0x11,0x11,0x11,0x0A,0x04  ; 118 v
db 0x11,0x11,0x11,0x15,0x15,0x1B,0x11  ; 119 w
db 0x11,0x11,0x0A,0x04,0x0A,0x11,0x11  ; 120 x
db 0x11,0x11,0x11,0x0A,0x04,0x04,0x04  ; 121 y
db 0x1F,0x01,0x02,0x04,0x08,0x10,0x1F  ; 122 z
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 123 {
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 124 |
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 125 }
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00  ; 126 ~
