ReC98/th04/formats/cdg_put.asm

121 lines
1.6 KiB
NASM

; Displays the CDG image in the given [slot] at (⌊x/8⌋*8, y).
; void pascal cdg_put(int x, int y, int slot);
public CDG_PUT
cdg_put proc far
@@slot = word ptr 6
@@y = word ptr 8
@@x = word ptr 10
push bp
mov bp, sp
push si
push di
push ds
cli
mov al, GC_RMW
out 7Ch, al
mov dx, 7Eh
xor al, al
out dx, al
out dx, al
out dx, al
out dx, al
sti
mov si, [bp+@@slot]
shl si, 4
add si, offset _cdg_slots
if GAME eq 4
mov ax, [si+CDGSlot.sgm_colors]
mov word ptr cs:@@sgm_colors+1, ax
jmp short $+2
mov ax, [bp+@@y]
mov bx, ax
shl ax, 2
add ax, bx
else
mov ax, [bp+@@y]
shl ax, 2
add ax, [bp+@@y]
endif
add ax, 0A800h
mov es, ax
assume es:nothing
push 0
add ax, 3800h
push ax
sub ax, 2800h
push ax
sub ax, 800h
push ax
mov ax, [bp+@@x]
shr ax, 3
add ax, [si+CDGSlot.vram_byte_at_bottom_left]
mov di, ax
mov bx, ax
mov ax, [si+CDGSlot.width_divided_by_32]
mov bp, ax
shl ax, 2
add ax, (640 / 8)
mov dx, ax
if GAME eq 4
mov ax, [si+CDGSlot.sgm_alpha]
mov ds, ax
else
mov ax, [si+CDGSlot.sgm_colors]
mov cx, [si+CDGSlot.sgm_alpha]
mov ds, cx
endif
xor si, si
cld
align 2
@@alpha:
mov cx, bp
rep movsd
sub di, dx
jns short @@alpha
if GAME eq 5
mov ds, ax
endif
xor al, al
out 7Ch, al
xor si, si
if GAME eq 5
align 2
endif
if GAME eq 4
@@sgm_colors:
mov ax, 1234h
mov ds, ax
assume ds:nothing
endif
@@next_plane:
mov di, bx
@@next_row:
mov cx, bp
@@blit_dword:
lodsd
or es:[di], eax
add di, 4
loop @@blit_dword
sub di, dx
jns short @@next_row
pop ax
mov es, ax
or ax, ax
jnz short @@next_plane
pop ds
assume ds:_DATA
pop di
pop si
pop bp
retf 6
cdg_put endp
align 2