satpro icon

FillColor.asm

satpro | PRO | 02/16/26 02:43:31 PM UTC | 0 ⭐ | 13766 👁️ | Never ⏰ | [SSE, avx]
ASM (NASM) |

0 B

|

Source Code

|

0 👍

/

0 👎

 
 
 
 
; ========================================================================================
; FillColor(x,y,w,h,c)
; p1: r8d  = x
; p2: r9d  = y
; p3: r10d = width
; p4: r11d = height
; p5: r12d = rgb color
;
; Dispatches to AVX2 or SSE based on cpuSupport.
; ========================================================================================
 
MEMORY$             equ 20000000h                 ; base of emulator RAM
VIDEO$              equ 24000000h             ; 2048x1080x4 = $87:0000 bytes
SPRITE$             equ VIDEO$+880000h            ; 2048x64x4 = 80000h (512k)
REU$                equ 25000000h        ; 16 mb reu
 
global FillColor
export FillColor
 
align 16
FillColor:
 
  sub rsp, 28h
  mov [rsp+00h], rsi
  mov [rsp+08h], rdi
  mov [rsp+10h], rbx
  mov [rsp+18h], rbp
  mov [rsp+20h], r15
 
; ----- Enter -----
 
 
; Compute starting dst: base + y*pitch + x*4
  mov edi, VIDEO$             ;base 
 
  shl r8d, 2                  ; x * 4
  shl r9d, 13                 ; y * 2000h
 
  add edi, r8d
  add edi, r9d                ; dst ptr
 
  mov ebp, edi                ; 1st row ptr = dst ptr
 
; --------------------------------------
;   CPU feature detection (AVX yes/no)
; --------------------------------------
  xor r15d, r15d                        ; default = 0 (no avx)
 
  mov eax, 1
  cpuid
  shr ecx, 28                           ; shift AVX feature bit into bit 0
  and ecx, 1                            ; isolate the bit (will be 0 or 1)
  add r15d, ecx                         ; add 0 (no AVX) or 1 (AVX)
  test r15d, r15d
  jz .use_sse
 
; --------
; AVX path
; --------
  call FillColorAVX 
  jmp .Exit
 
; --------
; SSE path
; --------
.use_sse:
  call FillColorSSE
 
 
; ----- Exit -----
 
.Exit:
  mov rsi, [rsp+00h]
  mov rdi, [rsp+08h]
  mov rbx, [rsp+10h]
  mov rbp, [rsp+18h]
  mov r15, [rsp+20h]
  add rsp, 28h
  ret
 
; ========================================================================================
 
 
; ========================================================================================
; FillColorAVX2:  (x,w) must be multiples of 8 pixels
; ========================================================================================
; r8d = x, r9d = y, r10d = w, r11d = h, r12d = color
; ========================================================================================
 
global FillColorAVX
;export FillColorAVX
 
align 16
FillColorAVX:
 
 
; Broadcast color to ymm0
  movd xmm1, r12d             ; color
  vbroadcastss ymm0, xmm1
 
  shr r10d, 3                 ; 8 pixels per ymm0
 
; ----- The Loop -----
 
  mov edx, r11d               ; height
 
.fc0:
  mov ecx, r10d               ; width
;  shr ecx, 3                  ; 8 pixels per ymm0
 
.fc1:
  vmovdqa [edi], ymm0
  add edi, 32                 ; 8 * 4 bytes
  dec ecx
  jnz .fc1
 
; next row
  add ebp, 2000h              ; next row ptr
  mov edi, ebp                ; next dst ptr
  dec edx
  jnz .fc0
 
 
  ret
 
; ========================================================================================
 
 
; ========================================================================================
; FillColorSSE:  (x,w) must be multiples of 4 pixels
; ========================================================================================
; r8d = x, r9d = y, r10d = w, r11d = h, r12d = color
; ========================================================================================
 
global FillColorSSE
;export FillColorSSE
 
align 16
FillColorSSE:
 
 
  movd xmm0, r12d
  pshufd xmm0, xmm0, 0        ; replicate color to 4 dwords
 
  shr r10d, 2                 ; 4 pixels per xmm0
 
 
; ----- The Loop -----
 
  mov edx, r11d               ; height
 
.fc0:
  mov ecx, r10d               ; width
;  shr ecx, 2                  ; 4 pixels per xmm0
 
.fc1:
  movdqa [edi], xmm0
  add edi, 16
  dec ecx
  jnz .fc1
 
  add ebp, 2000h
  mov edi, ebp
  dec edx
  jnz .fc0
 
 
  ret
 
; ========================================================================================
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎