mirror of https://github.com/nmlgc/ReC98.git
176 lines
3.5 KiB
NASM
176 lines
3.5 KiB
NASM
PELLET_TOP_H = 6
|
|
PELLET_BOTTOM_Y = (PELLET_H - PELLET_BOTTOM_H)
|
|
|
|
public _pellets_render_top
|
|
_pellets_render_top proc near
|
|
mov ax, _pellets_alive
|
|
or ax, ax
|
|
jnz short @@at_least_one_alive
|
|
retn
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@at_least_one_alive:
|
|
push bp
|
|
push si
|
|
push di
|
|
mov bp, ax
|
|
mov bx, offset _pellets_render
|
|
|
|
@@pellet_loop:
|
|
mov di, [bx+pellet_render_t.PRT_left]
|
|
mov ax, di
|
|
sar di, 3
|
|
mov cx, [bx+pellet_render_t.PRT_top]
|
|
shl cx, 6
|
|
add di, cx
|
|
shr cx, 2
|
|
add di, cx
|
|
and ax, 7
|
|
mov si, ax
|
|
shl si, 4
|
|
add si, offset _sPELLET
|
|
shl ax, 3
|
|
mov cx, PELLET_TOP_H
|
|
or ax, ax
|
|
jz short @@BYTEALIGNED
|
|
cmp di, ((RES_Y - PELLET_TOP_H + 1) * ROW_SIZE)
|
|
jb short @@SHIFTED_YLOOP2
|
|
|
|
@@SHIFTED_YLOOP1:
|
|
movsw
|
|
add di, (ROW_SIZE - word)
|
|
dec cx
|
|
cmp di, PLANE_SIZE
|
|
jb short @@SHIFTED_YLOOP1
|
|
sub di, PLANE_SIZE
|
|
|
|
@@SHIFTED_YLOOP2:
|
|
movsw
|
|
add di, (ROW_SIZE - word)
|
|
loop @@SHIFTED_YLOOP2
|
|
jmp short @@pellet_next
|
|
; ---------------------------------------------------------------------------
|
|
even
|
|
|
|
@@BYTEALIGNED:
|
|
cmp di, ((RES_Y - PELLET_TOP_H + 1) * ROW_SIZE)
|
|
jb short @@BYTEALIGNED_YLOOP2
|
|
|
|
@@BYTEALIGNED_YLOOP1:
|
|
movsb
|
|
inc si
|
|
add di, (ROW_SIZE - byte)
|
|
dec cx
|
|
cmp di, PLANE_SIZE
|
|
jb short @@BYTEALIGNED_YLOOP1
|
|
sub di, PLANE_SIZE
|
|
|
|
@@BYTEALIGNED_YLOOP2:
|
|
movsb
|
|
inc si
|
|
add di, (ROW_SIZE - byte)
|
|
loop @@BYTEALIGNED_YLOOP2
|
|
|
|
@@pellet_next:
|
|
sub di, (((PELLET_TOP_H + 1) - PELLET_BOTTOM_Y) * ROW_SIZE)
|
|
jns short @@set_bottom_data
|
|
add di, PLANE_SIZE
|
|
|
|
@@set_bottom_data:
|
|
add ax, offset _sPELLET_BOTTOM
|
|
mov [bx+pellet_render_t.PRB_vram_offset], di
|
|
mov [bx+pellet_render_t.PRB_sprite_offset], ax
|
|
add bx, size pellet_render_t
|
|
dec bp
|
|
jnz short @@pellet_loop
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
retn
|
|
_pellets_render_top endp
|
|
even
|
|
|
|
|
|
public _pellets_render_bottom
|
|
_pellets_render_bottom proc near
|
|
|
|
@@rows_after_roll equ <dx>
|
|
|
|
mov ax, _pellets_alive
|
|
or ax, ax
|
|
jnz short @@at_least_one_alive
|
|
retn
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@at_least_one_alive:
|
|
push bp
|
|
push si
|
|
push di
|
|
mov bp, ax
|
|
mov bx, offset _pellets_render
|
|
|
|
@@pellet_loop:
|
|
mov di, [bx+pellet_render_t.PRB_vram_offset]
|
|
mov si, [bx+pellet_render_t.PRB_sprite_offset]
|
|
xor @@rows_after_roll, @@rows_after_roll
|
|
cmp di, ((RES_Y - PELLET_BOTTOM_H - 1) * ROW_SIZE)
|
|
jnb short @@roll_needed
|
|
even
|
|
mov cx, (PELLET_BOTTOM_H + 1)
|
|
jmp short @@no_roll
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@roll_needed:
|
|
mov ax, (PLANE_SIZE + (ROW_SIZE - 1))
|
|
sub ax, di
|
|
mov cx, ROW_SIZE
|
|
div cx
|
|
mov cx, ax
|
|
mov @@rows_after_roll, (PELLET_BOTTOM_H + 1)
|
|
sub @@rows_after_roll, cx
|
|
|
|
@@no_roll:
|
|
mov ax, [si] ; lol, it's also just a LODSW?
|
|
jmp short @@put
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@row_loop:
|
|
lodsw
|
|
|
|
@@put:
|
|
or al, al
|
|
jz short @@only_byte_2
|
|
or ah, ah
|
|
jz short @@only_byte_1
|
|
mov es:[di], ax
|
|
jmp short @@row_next
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@only_byte_1:
|
|
mov es:[di], al
|
|
jmp short @@row_next
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@only_byte_2:
|
|
mov es:[di+1], ah
|
|
|
|
@@row_next:
|
|
add di, ROW_SIZE
|
|
loop @@row_loop
|
|
or @@rows_after_roll, @@rows_after_roll
|
|
jz short @@pellet_next
|
|
sub di, PLANE_SIZE
|
|
xchg cx, @@rows_after_roll
|
|
jmp short @@row_loop
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@pellet_next:
|
|
add bx, size pellet_render_t
|
|
dec bp
|
|
jnz short @@pellet_loop
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
retn
|
|
_pellets_render_bottom endp
|