ReC98/th05/formats/pi_asm_2.asm

101 lines
1.6 KiB
NASM

; Second TH05 .PI assembly translation unit.
.386
.model use16 large
locals
include pc98.inc
include libs/master.lib/func.inc
include libs/master.lib/master.inc
include th03/arg_bx.inc
extrn Palettes:palette_t
extrn _pi_headers:PiHeader
extrn _pi_buffers:far ptr
SHARED_ segment word public 'CODE' use16
assume cs:SHARED_
public PI_PUT_8_ROWLOOP
pi_put_8_rowloop proc pascal near
; Can't use ARG, because the function doesn't `PUSH BP`!
@@stride_packed = word ptr [bp+2]
@@w = word ptr [bp+4]
@@top = word ptr [bp+6]
@@left = word ptr [bp+8]
@@h equ di
mov bp, sp
@@put_row:
push es
call graph_pack_put_8_noclip pascal, @@left, @@top, es, si, @@w
pop es
inc @@top
cmp @@top, RES_Y
jb short @@next_row
sub @@top, RES_Y
@@next_row:
add si, @@stride_packed
; .PI pointer normalization, see pi_buffer_p_normalize()
mov ax, si
shr ax, 4
mov dx, es
add dx, ax
mov es, dx
and si, 0Fh
dec @@h
jnz short @@put_row
retn 8
pi_put_8_rowloop endp
public PI_PALETTE_APPLY
func pi_palette_apply
arg_bx far, @slot:word
push si
push di
mov si, @slot
imul si, size PiHeader
add si, offset _pi_headers + PiHeader._palette
mov di, offset Palettes
mov ax, ds
mov es, ax
mov cx, (size palette_t / dword)
rep movsd
call palette_show
pop di
pop si
ret_bx
endfunc
public PI_FREE
func pi_free
arg_bx far, @slot:word
mov bx, @slot
mov ax, bx
shl bx, 2
add bx, offset _pi_buffers
cmp dword ptr [bx], 0
jz short @@ret
imul ax, size PiHeader
add ax, offset _pi_headers
push ds
push ax
push word ptr [bx+2]
push word ptr [bx]
mov dword ptr [bx], 0
call graph_pi_free
@@ret:
ret 2
endfunc
SHARED_ ends
end