ReC98/th04/formats/cdg_put_plane_roll.asm

81 lines
1.3 KiB
NASM

public CDG_PUT_PLANE_ROLL
cdg_put_plane_roll proc far
@@plane_dst = word ptr [bp+6]
@@plane_src = word ptr [bp+8]
@@slot = word ptr [bp+10]
@@y = word ptr [bp+12]
@@x = word ptr [bp+14]
@@stride_backwards equ dx
@@h equ bx
push bp
mov bp, sp
push si
push di
mov ax, @@plane_dst
mov es, ax
mov si, @@slot
shl si, 4
add si, offset _cdg_slots
mov di, @@x
sar di, 3
mov @@h, [si+CDGSlot.pixel_height]
mov ax, @@y
add ax, @@h
dec ax
shl ax, 6
add di, ax
shr ax, 2
add di, ax
mov ax, [si+CDGSlot.width_divided_by_32]
mov word ptr cs:@@width_dwords, ax
jmp short $+2
shl ax, 2
add ax, ROW_SIZE
mov @@stride_backwards, ax
push ds
mov ax, [si+CDGSlot.sgm_colors]
mov si, [si+CDGSlot.bitplane_size]
mov ds, ax
mov cx, @@plane_src
inc cx
mov ax, si
neg si
@@plane_src_num_to_offset:
add si, ax
loop @@plane_src_num_to_offset
cmp di, (ROW_SIZE * RES_Y)
jb short @@start_blitting
sub di, (ROW_SIZE * RES_Y)
@@start_blitting:
cld
nop
@@next_row:
@@width_dwords equ $+1
mov cx, 1234h
@@blit_dword:
mov eax, [si]
or es:[di], eax
add si, 4
add di, 4
loop @@blit_dword
sub di, @@stride_backwards
jge short @@more_rows?
add di, (ROW_SIZE * RES_Y)
@@more_rows?:
dec @@h
jnz short @@next_row
pop ds
pop di
pop si
pop bp
retf 0Ah
cdg_put_plane_roll endp