gates_of_skeldal/VIDEO/ANIPACK.ASM
2025-01-24 18:27:22 +01:00

318 lines
7.2 KiB
NASM

.model small
.386
;16 bit line (de)comprimator
;
DGROUP group _DATA
extern _anim_line_len:dword
_TEXT segment byte public 'CODE' use32
assume CS:_TEXT
assume DS:DGROUP
save_line1 macro reg1,reg2
shr reg1,8
rcr reg2,1
shr reg1,8
rcr reg2,1
shr reg1,8
rcr reg2,1
shr reg1,8
rcr reg2,1
endm
save_linex macro reg1,reg2,rols
shrd reg2,reg1,rols
shr reg1,8
shrd reg2,reg1,rols
shr reg1,8
shrd reg2,reg1,rols
shr reg1,8
shrd reg2,reg1,rols
endm
public save_1bit_ ;ESI source
;EDI target
;vraci EDI ukazatel na konce;
save_1bit_:
mov cl,8
s1b1: lodsd
save_linex eax,ebx,1
dec cl
jnz s1b1
mov eax,ebx
stosd
mov cl,8
s1b2: lodsd
save_linex eax,ebx,1
dec cl
jnz s1b2
mov eax,ebx
stosd
ret
public save_2bit_
save_2bit_:
mov ch,4
c2b11: mov cl,4
c2b12: lodsd
save_linex eax,ebx,2
dec cl
jnz c2b12
mov eax,ebx
stosd
dec ch
jnz c2b11
ret
public save_3bit_
save_3bit_:
mov ch,8
c3b11: mov cl,2
c3b12: lodsd
save_linex eax,ebx,3
dec cl
jnz c3b12
mov eax,ebx
shr eax,8
stosd
dec edi
dec ch
jnz c3b11
ret
public save_4bit_
save_4bit_:
mov ch,8
c4b11: mov cl,2
c4b12: lodsd
save_linex eax,ebx,4
dec cl
jnz c4b12
mov eax,ebx
stosd
dec ch
jnz c4b11
ret
public load_1bit_ ;ESI - Source
;EDI - Target
;EBX - Palette
;anim_line_len - delka radky
load_1bit_ :
mov ch,8
l1b1: mov dl,[esi]
inc esi
mov cl,8
l1b2: movzx eax,dl
and eax,1
mov eax,[ebx+eax*2]
test eax,8000h
jnz short l1b1s
mov [edi],ax
l1b1s: add edi,2
shr dl,1
dec cl
jnz l1b2
mov eax,_anim_line_len
sub eax,16
add edi,eax
dec ch
jnz l1b1
ret
public load_2bit_ ;ESI - Source
;EDI - Target
;EBX - Palette
;anim_line_len - delka radky
load_2bit_:
mov ch,8
l2b1: mov dx,[esi]
add esi,2
mov cl,8
l2b2: mov eax,edx
and eax,3
mov eax,[ebx+eax*2]
test eax,8000h
jnz short l2b1s
mov [edi],ax
l2b1s: add edi,2
shr edx,2
dec cl
jnz l2b2
mov eax,_anim_line_len
sub eax,16
add edi,eax
dec ch
jnz l2b1
ret
public load_3bit_ ;ESI - Source
;EDI - Target
;EBX - Palette
;anim_line_len - delka radky
load_3bit_:
mov ch,8
l3b1: mov edx,[esi]
add esi,3
mov cl,8
l3b2: mov eax,edx
and eax,7
mov eax,[ebx+eax*2]
test eax,8000h
jnz short l3b1s
mov [edi],ax
l3b1s: add edi,2
shr edx,3
dec cl
jnz l3b2
mov eax,_anim_line_len
sub eax,16
add edi,eax
dec ch
jnz l3b1
ret
public load_4bit_ ;ESI - Source
;EDI - Target
;EBX - Palette
;anim_line_len - delka radky
load_4bit_:
mov ch,8
l4b1: mov edx,[esi]
add esi,4
mov cl,8
l4b2: mov eax,edx
and eax,15
mov eax,[ebx+eax*2]
test eax,8000h
jnz short l4b1s
mov [edi],ax
l4b1s: add edi,2
shr edx,4
dec cl
jnz l4b2
mov eax,_anim_line_len
sub eax,16
add edi,eax
dec ch
jnz l4b1
ret
public load_8bit_ ;ESI - Source
;EDI - Target
;EBX - Palette
;anim_line_len - delka radky
load_8bit_:
mov ch,8
l8b1: mov cl,8
l8b2: lodsb
movzx eax,al
mov eax,[ebx+eax*2]
test eax,8000h
jnz short l8b1s
mov [edi],ax
l8b1s: add edi,2
dec cl
jnz l8b2
mov eax,_anim_line_len
sub eax,16
add edi,eax
dec ch
jnz l8b1
ret
public load_0bit_ ;EDI - Target
;EBX - Palette
;anim_line_len - delka radky
load_0bit_:
movzx eax,word ptr[ebx]
test eax,8000h
jnz l0b1s
mov ebx,eax
shl ebx,16
or eax,ebx
mov ch,8
l0b1: mov cl,4
l0b2: stosd
dec cl
jnz l0b2
mov edx,_anim_line_len
sub edx,16
add edi,edx
dec ch
jnz l0b1
l0b1s: ret
public display_interlaced_fused_lfb_
;ESI buffer1
;EBX buffer2
;EDI screen
;vezme buffer 1 a sfuzuje s bufferem 2, predtim ovsem prepise buffer2 bufferem 1
;pracuje s lfb
display_interlaced_fused_lfb_:
mov ecx,180
dif_lp1:push ecx
mov ecx,320
dif_lp2:lodsd
mov edx,eax
xchg edx,[ebx]
and eax,7bde7bdeh
and edx,7bde7bdeh
add eax,edx
shr eax,1
stosd
add ebx,4
dec ecx
jnz dif_lp2
pop ecx
add edi,1280
dec ecx
jnz dif_lp1
ret
extern mapvesaadr_:near
public display_interlaced_fused_bank_
;ESI buffer1
;EBX buffer2
;EDI screen
;vezme buffer 1 a sfuzuje s bufferem 2, predtim ovsem prepise buffer2 bufferem 1
;pracuje s lfb
display_interlaced_fused_bank_:
mov ecx,180
difblp1:push ecx
push edi
call mapvesaadr_
mov ecx,320
difblp2:lodsd
mov edx,eax
xchg edx,[ebx]
and eax,7bde7bdeh
and edx,7bde7bdeh
add eax,edx
shr eax,1
stosd
add ebx,4
dec ecx
jnz difblp2
pop edi
pop ecx
add edi,4096
dec ecx
jnz difblp1
ret
_TEXT ends
end