ReC98/th03/formats/cdg_put_hflip.asm

113 lines
1.9 KiB
NASM

; Displays the CDG image in the given [slot] at (⌊x/8⌋*8, y), flipped
; horizontally.
; void DEFCONV cdg_put_hflip(int x, int y, int slot);
proc_defconv cdg_put_hflip
@@slot = word ptr 6
@@y = word ptr 8
@@x = word ptr 10
push bp
mov bp, sp
push si
push di
call grcg_setcolor pascal, (GC_RMW shl 16) + 0
mov si, [bp+@@slot]
shl si, 4
add si, offset _cdg_slots
mov ax, [bp+@@x]
sar ax, 3
add ax, [si+CDGSlot.vram_byte_at_bottom_left]
mov bx, [si+CDGSlot.width_divided_by_32]
shl bx, 2
add ax, bx
dec ax
mov di, ax
mov word ptr cs:@@last_x_alpha+1, ax
mov word ptr cs:@@last_x_colors+1, ax
mov word ptr cs:@@width_bytes_alpha+1, bx
mov word ptr cs:@@width_bytes_colors+1, bx
mov ax, (640 / 8)
sub ax, bx
mov word ptr cs:@@stride_alpha+1, ax
mov word ptr cs:@@stride_colors+1, ax
jmp short $+2
mov ax, [bp+@@y]
mov bx, ax
shl ax, 2
add ax, bx
add ax, 0A800h
mov es, ax
assume es:nothing
mov bx, offset hflip_lut
mov fs, [si+CDGSlot.sgm_alpha]
xor si, si
@@stride_alpha:
mov dx, 1234h
nop
@@width_bytes_alpha:
mov cx, 1234h
@@blit_hflip_alpha:
mov al, fs:[si]
xlat
mov es:[di], al
inc si
dec di
loop @@blit_hflip_alpha
sub di, dx
jns short @@width_bytes_alpha
xor al, al
out 7Ch, al
@@last_x_alpha:
mov di, 1234h
mov si, [bp+@@slot]
shl si, 4
add si, offset _cdg_slots
mov fs, [si+CDGSlot.sgm_colors]
xor si, si
@@stride_colors:
mov dx, 1234h
nop
@@width_bytes_colors:
mov cx, 1234
@@blit_hflip_colors:
mov al, fs:[si]
xlat
or es:[di], al
inc si
dec di
loop @@blit_hflip_colors
sub di, dx
jns short @@width_bytes_colors
@@last_x_colors:
mov di, 1234h
mov ax, es
add ax, 800h
mov es, ax
assume es:nothing
cmp ax, 0C000h
jb short @@width_bytes_colors
cmp ax, 0C800h
jnb short @@ret
add ax, 2000h
mov es, ax
assume es:nothing
jmp short @@width_bytes_colors
@@ret:
pop di
pop si
pop bp
retf 6
endp_defconv
align 2