1585 lines
28 KiB
NASM
1585 lines
28 KiB
NASM
;Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
|
|
;
|
|
;http://www.zsnes.com
|
|
;http://sourceforge.net/projects/zsnes
|
|
;
|
|
;This program is free software; you can redistribute it and/or
|
|
;modify it under the terms of the GNU General Public License
|
|
;as published by the Free Software Foundation; either
|
|
;version 2 of the License, or (at your option) any later
|
|
;version.
|
|
;
|
|
;This program is distributed in the hope that it will be useful,
|
|
;but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;GNU General Public License for more details.
|
|
;
|
|
;You should have received a copy of the GNU General Public License
|
|
;along with this program; if not, write to the Free Software
|
|
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
|
|
%include "macros.mac"
|
|
|
|
EXTSYM vidbuffer,GUIOn,MMXSupport,resolutn,En2xSaI,antienab,scanlines
|
|
EXTSYM hirestiledat,res512switch,curblank,spritetablea,lineleft,_2xSaILineW
|
|
EXTSYM _2xSaISuperEagleLineW, _2xSaISuper2xSaILineW,newengen,cfield,HalfTrans
|
|
EXTSYM GUIOn2,FilteredGUI,SpecialLine,vidbufferofsb,HalfTransB,HalfTransC
|
|
|
|
ALIGN32
|
|
section .data
|
|
NEWSYM frametot, dd 0
|
|
|
|
section .text
|
|
|
|
NEWSYM CheckFrame
|
|
pushad
|
|
xor eax,eax
|
|
mov ebx,[vidbuffer]
|
|
add ebx,16*2+256*2+32*2
|
|
add ebx,8*288*2
|
|
mov ecx,62000
|
|
.loopit
|
|
add eax,[ebx]
|
|
add ebx,4
|
|
dec ecx
|
|
jnz .loopit
|
|
mov [frametot],eax
|
|
popad
|
|
ret
|
|
|
|
SECTION .bss
|
|
NEWSYM AddEndBytes, resd 1 ; Number of bytes between each line
|
|
NEWSYM NumBytesPerLine, resd 1 ; Total number of bytes per line (1024+AddEndBytes)
|
|
NEWSYM WinVidMemStart, resd 1
|
|
SECTION .text
|
|
|
|
NEWSYM copy640x480x16bwin
|
|
cmp byte[curblank],40h
|
|
jne .startcopy
|
|
ret
|
|
.startcopy
|
|
pushad
|
|
mov esi,[vidbuffer]
|
|
mov edi,[WinVidMemStart]
|
|
add esi,16*2+256*2+32*2
|
|
cmp byte[GUIOn],1
|
|
je .not239
|
|
cmp byte[resolutn],239
|
|
jne .not239
|
|
add esi,8*288*2
|
|
.not239
|
|
xor eax,eax
|
|
; Check if interpolation mode
|
|
cmp byte[FilteredGUI],0
|
|
jne .yi
|
|
cmp byte[GUIOn2],1
|
|
je .nointerp
|
|
.yi
|
|
cmp byte[MMXSupport],1
|
|
jne .nommx
|
|
cmp byte[En2xSaI],0
|
|
jne near Process2xSaIwin
|
|
.nommx
|
|
cmp byte[antienab],1
|
|
je near interpolate640x480x16bwin
|
|
.nointerp
|
|
mov dl,224
|
|
dec dl
|
|
dec dl
|
|
cmp byte[scanlines],1
|
|
je near .scanlines
|
|
cmp byte[scanlines],3
|
|
je near .halfscanlines
|
|
cmp byte[scanlines],2
|
|
je near .quartscanlines
|
|
|
|
mov ebx,hirestiledat+1
|
|
cmp byte[newengen],0
|
|
je .loopa
|
|
mov ebx,SpecialLine+1
|
|
.loopa
|
|
mov ecx,256
|
|
cmp byte[ebx],1
|
|
je near .yeshires
|
|
cmp byte[GUIOn],1
|
|
je .ignorehr
|
|
cmp byte[ebx],1
|
|
ja near .yeshiresng
|
|
.ignorehr
|
|
cmp byte[MMXSupport],1
|
|
je near .mmx
|
|
.a
|
|
mov ax,[esi]
|
|
shl eax,16
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .a
|
|
sub esi,256*2
|
|
add edi,[AddEndBytes]
|
|
mov ecx,256
|
|
.a2
|
|
mov ax,[esi]
|
|
shl eax,16
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .a2
|
|
.return
|
|
add esi,64
|
|
add edi,[AddEndBytes]
|
|
inc ebx
|
|
dec dl
|
|
jnz near .loopa
|
|
popad
|
|
xor byte[res512switch],1
|
|
cmp byte[MMXSupport],1
|
|
je .mmx2
|
|
ret
|
|
.mmx2
|
|
emms
|
|
ret
|
|
.yeshires
|
|
mov byte[ebx],0
|
|
test byte[res512switch],1
|
|
jnz .rightside
|
|
push ebx
|
|
mov ebx,[NumBytesPerLine]
|
|
.b
|
|
mov ax,[esi]
|
|
mov [edi],ax
|
|
mov [edi+ebx],ax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .b
|
|
pop ebx
|
|
add edi,[NumBytesPerLine]
|
|
jmp .return
|
|
.rightside
|
|
push ebx
|
|
mov ebx,[NumBytesPerLine]
|
|
.c
|
|
mov ax,[esi]
|
|
mov [edi+2],ax
|
|
mov [edi+2+ebx],ax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .c
|
|
pop ebx
|
|
add edi,[NumBytesPerLine]
|
|
jmp .return
|
|
.mmx
|
|
mov eax,[spritetablea]
|
|
mov ecx,64
|
|
add eax,512
|
|
.mmxr
|
|
movq mm0,[esi]
|
|
movq mm1,mm0
|
|
punpcklwd mm0,mm1
|
|
movq [edi],mm0
|
|
punpckhwd mm1,mm1
|
|
movq [edi+8],mm1
|
|
movq [eax],mm0
|
|
movq [eax+8],mm1
|
|
add esi,8
|
|
add edi,16
|
|
add eax,16
|
|
dec ecx
|
|
jnz .mmxr
|
|
mov eax,[spritetablea]
|
|
mov ecx,32
|
|
add eax,512
|
|
add edi,[AddEndBytes]
|
|
.mmxr2
|
|
movq mm0,[eax]
|
|
movq [edi],mm0
|
|
movq mm1,[eax+8]
|
|
movq [edi+8],mm1
|
|
movq mm2,[eax+16]
|
|
movq [edi+16],mm2
|
|
movq mm3,[eax+24]
|
|
movq [edi+24],mm3
|
|
add eax,32
|
|
add edi,32
|
|
dec ecx
|
|
jnz .mmxr2
|
|
jmp .return
|
|
.yeshiresng
|
|
call HighResProc
|
|
jmp .return
|
|
|
|
.bng
|
|
mov eax,[esi+75036*4-2]
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .bng
|
|
add edi,[AddEndBytes]
|
|
sub esi,256*2
|
|
mov ecx,256
|
|
.bngb
|
|
mov eax,[esi+75036*4-2]
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .bngb
|
|
jmp .return
|
|
|
|
.scanlines
|
|
mov ebx,hirestiledat+1
|
|
cmp byte[GUIOn],1
|
|
je .loopab
|
|
cmp byte[newengen],0
|
|
je .loopab
|
|
mov ebx,SpecialLine+1
|
|
.loopab
|
|
mov ecx,256
|
|
cmp byte[ebx],1
|
|
je near .yeshiresb
|
|
cmp byte[ebx],1
|
|
jbe .ignorehrb
|
|
call HighResProc
|
|
jmp .returnb
|
|
.ignorehrb
|
|
cmp byte[MMXSupport],1
|
|
je near .mmxsl
|
|
.ab
|
|
mov ax,[esi]
|
|
shl eax,16
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .ab
|
|
.returnb
|
|
add esi,64
|
|
add edi,[AddEndBytes]
|
|
mov ecx,256
|
|
.fslloop
|
|
mov dword[edi],0
|
|
add edi,4
|
|
dec ecx
|
|
jnz .fslloop
|
|
add edi,[AddEndBytes]
|
|
inc ebx
|
|
dec dl
|
|
jnz .loopab
|
|
popad
|
|
xor byte[res512switch],1
|
|
cmp byte[MMXSupport],1
|
|
je near .mmx2
|
|
ret
|
|
.yeshiresb
|
|
mov byte[ebx],0
|
|
test byte[res512switch],1
|
|
jnz .rightsideb
|
|
.bb
|
|
mov ax,[esi]
|
|
mov [edi],ax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .bb
|
|
jmp .returnb
|
|
.rightsideb
|
|
.cb
|
|
mov ax,[esi]
|
|
mov [edi+2],ax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .cb
|
|
jmp .returnb
|
|
.mmxsl
|
|
mov ecx,64
|
|
.mmxrsl
|
|
movq mm0,[esi]
|
|
movq mm1,mm0
|
|
punpcklwd mm0,mm1
|
|
punpckhwd mm1,mm1
|
|
movq [edi],mm0
|
|
movq [edi+8],mm1
|
|
add esi,8
|
|
add edi,16
|
|
add eax,16
|
|
dec ecx
|
|
jnz .mmxrsl
|
|
jmp .returnb
|
|
|
|
.halfscanlines
|
|
mov ebx,hirestiledat+1
|
|
cmp byte[GUIOn],1
|
|
je .loopabh
|
|
cmp byte[newengen],0
|
|
je .loopabh
|
|
mov ebx,SpecialLine+1
|
|
.loopabh
|
|
cmp byte[ebx],1
|
|
jbe .ignorehrbh
|
|
call HighResProc
|
|
jmp .returnbh
|
|
.ignorehrbh
|
|
cmp byte[MMXSupport],1
|
|
je near .mmxslh
|
|
mov ecx,256
|
|
.abh
|
|
mov ax,[esi]
|
|
shl eax,16
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .abh
|
|
mov ecx,256
|
|
sub esi,512
|
|
add edi,[AddEndBytes]
|
|
.abhs
|
|
mov ax,[esi]
|
|
shl eax,16
|
|
mov ax,[esi]
|
|
and eax,[HalfTrans]
|
|
shr eax,1
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .abhs
|
|
.returnbh
|
|
add esi,64
|
|
add edi,[AddEndBytes]
|
|
inc ebx
|
|
dec dl
|
|
jnz near .loopabh
|
|
popad
|
|
cmp byte[MMXSupport],1
|
|
je near .mmx2
|
|
ret
|
|
.mmxslh
|
|
mov eax,[spritetablea]
|
|
mov ecx,64
|
|
add eax,512
|
|
.mmxrslh
|
|
movq mm0,[esi]
|
|
movq mm1,mm0
|
|
punpcklwd mm0,mm1
|
|
punpckhwd mm1,mm1
|
|
movq [edi],mm0
|
|
movq [edi+8],mm1
|
|
movq [eax],mm0
|
|
movq [eax+8],mm1
|
|
add esi,8
|
|
add edi,16
|
|
add eax,16
|
|
dec ecx
|
|
jnz .mmxrslh
|
|
mov eax,[spritetablea]
|
|
mov ecx,32
|
|
add eax,512
|
|
add edi,[AddEndBytes]
|
|
movq mm4,[HalfTrans]
|
|
.mmxr2h
|
|
movq mm0,[eax]
|
|
movq mm1,[eax+8]
|
|
movq mm2,[eax+16]
|
|
movq mm3,[eax+24]
|
|
pand mm0,mm4
|
|
pand mm1,mm4
|
|
pand mm2,mm4
|
|
pand mm3,mm4
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
psrlw mm2,1
|
|
psrlw mm3,1
|
|
movq [edi],mm0
|
|
movq [edi+8],mm1
|
|
movq [edi+16],mm2
|
|
movq [edi+24],mm3
|
|
add eax,32
|
|
add edi,32
|
|
dec ecx
|
|
jnz .mmxr2h
|
|
jmp .returnbh
|
|
|
|
.quartscanlines
|
|
mov [lineleft],dl
|
|
mov ebx,hirestiledat+1
|
|
cmp byte[GUIOn],1
|
|
je .loopabh2
|
|
cmp byte[newengen],0
|
|
je .loopabh2
|
|
mov ebx,SpecialLine+1
|
|
.loopabh2
|
|
cmp byte[ebx],1
|
|
jbe .ignorehrbh2
|
|
call HighResProc
|
|
jmp .returnbh2
|
|
.ignorehrbh2
|
|
cmp byte[MMXSupport],1
|
|
je near .mmxslh2
|
|
mov ecx,256
|
|
.abh2
|
|
mov ax,[esi]
|
|
shl eax,16
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .abh2
|
|
mov ecx,256
|
|
sub esi,512
|
|
add edi,[AddEndBytes]
|
|
.abhs2
|
|
mov ax,[esi]
|
|
shl eax,16
|
|
mov ax,[esi]
|
|
and eax,[HalfTrans]
|
|
shr eax,1
|
|
mov edx,eax
|
|
and edx,[HalfTrans]
|
|
shr edx,1
|
|
add eax,edx
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .abhs2
|
|
.returnbh2
|
|
add esi,64
|
|
add edi,[AddEndBytes]
|
|
inc ebx
|
|
dec byte[lineleft]
|
|
jnz near .loopabh2
|
|
popad
|
|
cmp byte[MMXSupport],1
|
|
je near .mmx2
|
|
ret
|
|
.mmxslh2
|
|
mov eax,[spritetablea]
|
|
mov ecx,64
|
|
add eax,512
|
|
.mmxrslh2
|
|
movq mm0,[esi]
|
|
movq mm1,mm0
|
|
punpcklwd mm0,mm1
|
|
punpckhwd mm1,mm1
|
|
movq [edi],mm0
|
|
movq [edi+8],mm1
|
|
movq [eax],mm0
|
|
movq [eax+8],mm1
|
|
add esi,8
|
|
add edi,16
|
|
add eax,16
|
|
dec ecx
|
|
jnz .mmxrslh2
|
|
mov eax,[spritetablea]
|
|
mov ecx,64
|
|
add eax,512
|
|
add edi,[AddEndBytes]
|
|
movq mm4,[HalfTrans]
|
|
.mmxr2h2
|
|
movq mm0,[eax]
|
|
movq mm1,[eax+8]
|
|
pand mm0,mm4
|
|
pand mm1,mm4
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
movq mm2,mm0
|
|
movq mm3,mm1
|
|
pand mm2,mm4
|
|
pand mm3,mm4
|
|
psrlw mm2,1
|
|
psrlw mm3,1
|
|
paddd mm0,mm2
|
|
paddd mm1,mm3
|
|
movq [edi],mm0
|
|
movq [edi+8],mm1
|
|
add eax,16
|
|
add edi,16
|
|
dec ecx
|
|
jnz .mmxr2h2
|
|
jmp .returnbh2
|
|
|
|
HighResProc:
|
|
mov ecx,256
|
|
cmp byte[ebx],3
|
|
je near .hiresmode7
|
|
cmp byte[ebx],7
|
|
je near .hiresmode7
|
|
test byte[ebx],4
|
|
jz .nofield
|
|
cmp byte[scanlines],0
|
|
jne .nofield
|
|
test byte[cfield],1
|
|
jz .nofield
|
|
add edi,[NumBytesPerLine]
|
|
.nofield
|
|
test byte[ebx],3
|
|
jnz near .hires
|
|
.a
|
|
mov ax,[esi]
|
|
shl eax,16
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .a
|
|
cmp byte[scanlines],0
|
|
jne .nofield
|
|
test byte[cfield],1
|
|
jnz .nofielde
|
|
add edi,[NumBytesPerLine]
|
|
.nofielde
|
|
ret
|
|
.hiresmode7
|
|
cmp byte[MMXSupport],1
|
|
je .yeshiresngmmxmode7
|
|
.a2
|
|
mov ax,[esi]
|
|
shl eax,16
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .a2
|
|
add edi,[AddEndBytes]
|
|
sub esi,512
|
|
mov ecx,256
|
|
add esi,75036*4
|
|
.a2b
|
|
mov ax,[esi]
|
|
shl eax,16
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .a2b
|
|
sub esi,75036*4
|
|
ret
|
|
.yeshiresngmmxmode7
|
|
mov ecx,64
|
|
.mmxr
|
|
movq mm0,[esi]
|
|
movq mm1,mm0
|
|
punpcklwd mm0,mm1
|
|
movq [edi],mm0
|
|
punpckhwd mm1,mm1
|
|
movq [edi+8],mm1
|
|
add esi,8
|
|
add edi,16
|
|
add eax,16
|
|
dec ecx
|
|
jnz .mmxr
|
|
add edi,[AddEndBytes]
|
|
sub esi,512
|
|
add esi,75036*4
|
|
mov ecx,64
|
|
.mmxrb
|
|
movq mm0,[esi]
|
|
movq mm1,mm0
|
|
punpcklwd mm0,mm1
|
|
movq [edi],mm0
|
|
punpckhwd mm1,mm1
|
|
movq [edi+8],mm1
|
|
add esi,8
|
|
add edi,16
|
|
add eax,16
|
|
dec ecx
|
|
jnz .mmxrb
|
|
sub esi,75036*4
|
|
ret
|
|
.hires
|
|
cmp byte[MMXSupport],1
|
|
je near .yeshiresngmmx
|
|
.bng
|
|
mov eax,[esi+75036*4-2]
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .bng
|
|
test byte[ebx],4
|
|
jz .nofieldb
|
|
cmp byte[scanlines],0
|
|
jne .nofieldb
|
|
test byte[cfield],1
|
|
jnz .lowerfield
|
|
add edi,[NumBytesPerLine]
|
|
.lowerfield
|
|
ret
|
|
.nofieldb
|
|
cmp byte[scanlines],1
|
|
je near .scanlines
|
|
cmp byte[scanlines],3
|
|
je near .halfscanlines
|
|
cmp byte[scanlines],2
|
|
je near .quartscanlines
|
|
add edi,[AddEndBytes]
|
|
sub esi,256*2
|
|
mov ecx,256
|
|
.bngb
|
|
mov eax,[esi+75036*4-2]
|
|
mov ax,[esi]
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .bngb
|
|
ret
|
|
.scanlines
|
|
ret
|
|
.yeshiresngmmx
|
|
mov eax,[spritetablea]
|
|
mov ecx,64
|
|
add eax,512
|
|
.ngal
|
|
movq mm0,[esi]
|
|
movq mm1,[esi+75036*4]
|
|
movq mm2,mm0
|
|
punpcklwd mm0,mm1
|
|
movq [edi],mm0
|
|
punpckhwd mm2,mm1
|
|
movq [edi+8],mm2
|
|
movq [eax],mm0
|
|
movq [eax+8],mm2
|
|
add esi,8
|
|
add edi,16
|
|
add eax,16
|
|
dec ecx
|
|
jnz .ngal
|
|
test byte[ebx],4
|
|
jz .nofieldc
|
|
cmp byte[scanlines],0
|
|
jne .nofieldc
|
|
test byte[cfield],1
|
|
jnz .lowerfieldb
|
|
add edi,[NumBytesPerLine]
|
|
.lowerfieldb
|
|
ret
|
|
.nofieldc
|
|
cmp byte[scanlines],1
|
|
je near .scanlines
|
|
cmp byte[scanlines],3
|
|
je near .halfscanlinesmmx
|
|
cmp byte[scanlines],2
|
|
je near .quartscanlinesmmx
|
|
test byte[ebx+1],3
|
|
jz .noaa
|
|
cmp byte[En2xSaI],0
|
|
jne near .antialias
|
|
cmp byte[antienab],0
|
|
jne near .antialias
|
|
.noaa
|
|
add edi,[AddEndBytes]
|
|
mov eax,[spritetablea]
|
|
mov ecx,32
|
|
add eax,512
|
|
.mmxr2
|
|
movq mm0,[eax]
|
|
movq [edi],mm0
|
|
movq mm1,[eax+8]
|
|
movq [edi+8],mm1
|
|
movq mm2,[eax+16]
|
|
movq [edi+16],mm2
|
|
movq mm3,[eax+24]
|
|
movq [edi+24],mm3
|
|
add eax,32
|
|
add edi,32
|
|
dec ecx
|
|
jnz .mmxr2
|
|
ret
|
|
.antialias
|
|
add edi,[AddEndBytes]
|
|
mov eax,[spritetablea]
|
|
mov ecx,64
|
|
add eax,512
|
|
movq mm4,[HalfTrans]
|
|
sub esi,256*2
|
|
.mmxr2aa
|
|
movq mm0,[esi+288*2]
|
|
movq mm1,[esi+288*2+75036*4]
|
|
movq mm2,mm0
|
|
punpcklwd mm0,mm1
|
|
punpckhwd mm2,mm1
|
|
movq mm1,[eax]
|
|
movq mm3,[eax+8]
|
|
pand mm0,mm4
|
|
pand mm1,mm4
|
|
pand mm2,mm4
|
|
pand mm3,mm4
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
psrlw mm2,1
|
|
psrlw mm3,1
|
|
paddd mm0,mm1
|
|
paddd mm2,mm3
|
|
movq [edi],mm0
|
|
movq [edi+8],mm2
|
|
add eax,16
|
|
add edi,16
|
|
add esi,8
|
|
dec ecx
|
|
jnz .mmxr2aa
|
|
ret
|
|
.halfscanlines
|
|
add edi,[AddEndBytes]
|
|
sub esi,256*2
|
|
mov ecx,256
|
|
.abhs
|
|
mov eax,[esi+75036*4-2]
|
|
mov ax,[esi]
|
|
and eax,[HalfTrans]
|
|
shr eax,1
|
|
mov edx,eax
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .abhs
|
|
ret
|
|
.quartscanlines
|
|
add edi,[AddEndBytes]
|
|
sub esi,256*2
|
|
mov ecx,256
|
|
.abhs2
|
|
mov eax,[esi+75036*4-2]
|
|
mov ax,[esi]
|
|
and eax,[HalfTrans]
|
|
shr eax,1
|
|
mov edx,eax
|
|
and edx,[HalfTrans]
|
|
shr edx,1
|
|
add eax,edx
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .abhs2
|
|
ret
|
|
.halfscanlinesmmx
|
|
mov eax,[spritetablea]
|
|
mov ecx,32
|
|
add eax,512
|
|
add edi,[AddEndBytes]
|
|
movq mm4,[HalfTrans]
|
|
.mmxr2h
|
|
movq mm0,[eax]
|
|
movq mm1,[eax+8]
|
|
movq mm2,[eax+16]
|
|
movq mm3,[eax+24]
|
|
pand mm0,mm4
|
|
pand mm1,mm4
|
|
pand mm2,mm4
|
|
pand mm3,mm4
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
psrlw mm2,1
|
|
psrlw mm3,1
|
|
movq [edi],mm0
|
|
movq [edi+8],mm1
|
|
movq [edi+16],mm2
|
|
movq [edi+24],mm3
|
|
add eax,32
|
|
add edi,32
|
|
dec ecx
|
|
jnz .mmxr2h
|
|
ret
|
|
.quartscanlinesmmx
|
|
mov eax,[spritetablea]
|
|
mov ecx,64
|
|
add eax,512
|
|
add edi,[AddEndBytes]
|
|
movq mm4,[HalfTransC]
|
|
.mmxr2h2
|
|
movq mm0,[eax]
|
|
movq mm1,[eax+8]
|
|
pand mm0,mm4
|
|
pand mm1,mm4
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
movq mm2,mm0
|
|
movq mm3,mm1
|
|
pand mm2,mm4
|
|
pand mm3,mm4
|
|
psrlw mm2,1
|
|
psrlw mm3,1
|
|
paddd mm0,mm2
|
|
paddd mm1,mm3
|
|
movq [edi],mm0
|
|
movq [edi+8],mm1
|
|
add eax,16
|
|
add edi,16
|
|
dec ecx
|
|
jnz .mmxr2h2
|
|
popad
|
|
ret
|
|
|
|
Process2xSaIwin:
|
|
mov ebx,hirestiledat+1
|
|
cmp byte[GUIOn],1
|
|
je .loopabi
|
|
cmp byte[newengen],0
|
|
je .loopabi
|
|
mov ebx,SpecialLine+1
|
|
.loopabi
|
|
mov [InterPtr],ebx
|
|
|
|
; add edi,[VESAAddr]
|
|
mov dl,224
|
|
sub dl,2 ; Compensate for top/bottom line + 2 lines in 2xSaI
|
|
mov byte[lineleft],dl
|
|
mov dword[esi+512],0
|
|
mov dword[esi+512+576*2],0
|
|
mov ebx,[vidbufferofsb]
|
|
add ebx,288*2
|
|
|
|
.next
|
|
mov dword[esi+512+576*3],0
|
|
|
|
mov eax,[InterPtr]
|
|
cmp byte[eax],1
|
|
jbe .ignorehr
|
|
push ebx
|
|
mov ebx,[InterPtr]
|
|
call HighResProc
|
|
pop ebx
|
|
push ebx
|
|
mov ecx,144
|
|
.nextb
|
|
mov dword[ebx],0FFFFFFFFh
|
|
add ebx,4
|
|
dec ecx
|
|
jnz .nextb
|
|
pop ebx
|
|
jmp .returninterp
|
|
.ignorehr
|
|
|
|
;srcPtr equ 8
|
|
;deltaPtr equ 12
|
|
;srcPitch equ 16
|
|
;width equ 20
|
|
;dstOffset equ 24
|
|
;dstPitch equ 28
|
|
;dstSegment equ 32
|
|
|
|
|
|
push ebx
|
|
mov eax,[NumBytesPerLine]
|
|
push eax
|
|
mov eax,edi ; destination offset
|
|
push eax
|
|
mov eax,256 ; width
|
|
push eax
|
|
mov eax,576 ; source pitch
|
|
push eax
|
|
push ebx
|
|
mov eax,esi ; source pointer
|
|
push eax
|
|
cmp byte[En2xSaI],2
|
|
je .supereagle
|
|
cmp byte[En2xSaI],3
|
|
je .super2xSaI
|
|
call _2xSaILineW
|
|
jmp .normal
|
|
.supereagle
|
|
call _2xSaISuperEagleLineW
|
|
jmp .normal
|
|
.super2xSaI
|
|
call _2xSaISuper2xSaILineW
|
|
.normal
|
|
add esp,24
|
|
pop ebx
|
|
add esi,576
|
|
add edi,[NumBytesPerLine]
|
|
add edi,[NumBytesPerLine]
|
|
add ebx,576
|
|
inc dword[InterPtr]
|
|
dec dword[lineleft]
|
|
jnz near .next
|
|
mov ecx,256
|
|
sub edi,[NumBytesPerLine]
|
|
.loop
|
|
mov dword[es:edi],0
|
|
add edi,4
|
|
dec ecx
|
|
jnz .loop
|
|
emms
|
|
popad
|
|
ret
|
|
.returninterp
|
|
add esi,64
|
|
inc dword[InterPtr]
|
|
add edi,[AddEndBytes]
|
|
add ebx,576
|
|
dec byte[lineleft]
|
|
jnz near .next
|
|
emms
|
|
popad
|
|
ret
|
|
|
|
MMXInterpolwin:
|
|
mov ebx,hirestiledat+1
|
|
cmp byte[GUIOn],1
|
|
je .loopab
|
|
cmp byte[newengen],0
|
|
je .loopab
|
|
mov ebx,SpecialLine+1
|
|
.loopab
|
|
|
|
mov dl,224
|
|
dec dl
|
|
dec dl
|
|
dec dl
|
|
movq mm2,[HalfTransC]
|
|
cmp byte[scanlines],1
|
|
je near .scanlines
|
|
cmp byte[scanlines],2
|
|
je near .scanlinesquart
|
|
cmp byte[scanlines],3
|
|
je near .scanlineshalf
|
|
inc ebx
|
|
mov [lineleft],dl
|
|
; do scanlines
|
|
mov edx,[spritetablea]
|
|
mov ecx,64
|
|
mov eax,[esi+510]
|
|
add edx,512
|
|
mov [esi+512],eax
|
|
.a2
|
|
movq mm0,[esi]
|
|
movq mm3,mm0
|
|
movq mm4,mm0
|
|
movq mm1,[esi+2]
|
|
pand mm3,mm1
|
|
pand mm0,mm2
|
|
pand mm1,mm2
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
paddd mm0,mm1
|
|
pand mm3,[HalfTransB]
|
|
paddw mm0,mm3
|
|
movq mm5,mm4
|
|
; mm4/mm5 contains original values, mm0 contains mixed values
|
|
punpcklwd mm4,mm0
|
|
punpckhwd mm5,mm0
|
|
movq [edi],mm4
|
|
movq [edi+8],mm5
|
|
movq [edx],mm4
|
|
movq [edx+8],mm5
|
|
add esi,8
|
|
add edi,16
|
|
add edx,16
|
|
dec ecx
|
|
jnz .a2
|
|
add esi,64
|
|
add edi,[AddEndBytes]
|
|
.a5
|
|
cmp byte[ebx],1
|
|
jbe .ignorehr
|
|
call HighResProc
|
|
movq mm2,[HalfTransC]
|
|
jmp .returninterp
|
|
.ignorehr
|
|
mov eax,[esi+510]
|
|
mov ecx,64
|
|
mov [esi+512],eax
|
|
mov edx,[spritetablea]
|
|
add edx,512
|
|
; Process next line
|
|
.a3
|
|
movq mm0,[esi]
|
|
movq mm3,mm0
|
|
movq mm4,mm0
|
|
movq mm1,[esi+2]
|
|
pand mm3,mm1
|
|
pand mm0,mm2
|
|
pand mm1,mm2
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
paddd mm0,mm1
|
|
pand mm3,[HalfTransB]
|
|
paddw mm0,mm3
|
|
movq mm5,mm4
|
|
; mm4/mm5 contains original values, mm0 contains mixed values
|
|
movq mm6,[edx]
|
|
movq mm7,[edx+8]
|
|
punpcklwd mm4,mm0
|
|
punpckhwd mm5,mm0
|
|
movq [edx],mm4
|
|
movq [edx+8],mm5
|
|
pand mm0,mm4
|
|
movq mm0,mm6
|
|
pand mm4,mm2
|
|
pand mm6,mm2
|
|
psrlw mm4,1
|
|
psrlw mm6,1
|
|
pand mm0,[HalfTransB]
|
|
paddd mm4,mm6
|
|
paddw mm4,mm0
|
|
movq mm0,mm5
|
|
pand mm0,mm7
|
|
pand mm5,mm2
|
|
pand mm7,mm2
|
|
psrlw mm5,1
|
|
pand mm0,[HalfTransB]
|
|
psrlw mm7,1
|
|
paddd mm5,mm7
|
|
paddw mm5,mm0
|
|
movq [edi],mm4
|
|
movq [edi+8],mm5
|
|
add esi,8
|
|
add edi,16
|
|
add edx,16
|
|
dec ecx
|
|
jnz near .a3
|
|
add edi,[AddEndBytes]
|
|
mov edx,[spritetablea]
|
|
add edx,512
|
|
mov ecx,64
|
|
.a4
|
|
movq mm0,[edx]
|
|
movq mm1,[edx+8]
|
|
movq [edi],mm0
|
|
movq [edi+8],mm1
|
|
add edi,16
|
|
add edx,16
|
|
dec ecx
|
|
jnz .a4
|
|
.returninterp
|
|
add esi,64
|
|
add edi,[AddEndBytes]
|
|
inc ebx
|
|
dec byte[lineleft]
|
|
jnz near .a5
|
|
emms
|
|
popad
|
|
ret
|
|
|
|
.scanlines
|
|
inc dl
|
|
mov [lineleft],dl
|
|
; do scanlines
|
|
mov eax,[esi+510]
|
|
mov ecx,64
|
|
mov [esi+512],eax
|
|
.asl
|
|
cmp byte[ebx],1
|
|
jbe .ignorehrs
|
|
call HighResProc
|
|
movq mm2,[HalfTrans]
|
|
jmp .returninterps
|
|
.ignorehrs
|
|
.a
|
|
movq mm0,[esi]
|
|
movq mm4,mm0
|
|
movq mm1,[esi+2]
|
|
pand mm0,mm2
|
|
pand mm1,mm2
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
paddd mm0,mm1
|
|
movq mm5,mm4
|
|
; mm4/mm5 contains original values, mm0 contains mixed values
|
|
punpcklwd mm4,mm0
|
|
punpckhwd mm5,mm0
|
|
movq [edi],mm4
|
|
movq [edi+8],mm5
|
|
add esi,8
|
|
add edi,16
|
|
dec ecx
|
|
jnz .a
|
|
.returninterps
|
|
add esi,64
|
|
add edi,[AddEndBytes]
|
|
mov ecx,256
|
|
.fslloop
|
|
mov dword[edi],0
|
|
add edi,4
|
|
dec ecx
|
|
jnz .fslloop
|
|
add edi,[AddEndBytes]
|
|
inc ebx
|
|
mov ecx,64
|
|
dec byte[lineleft]
|
|
jnz near .asl
|
|
emms
|
|
popad
|
|
ret
|
|
|
|
.scanlineshalf
|
|
inc dl
|
|
mov [lineleft],dl
|
|
; do scanlines
|
|
.ahb
|
|
cmp byte[ebx],1
|
|
jbe .ignorehrhs
|
|
call HighResProc
|
|
movq mm2,[HalfTrans]
|
|
jmp .returninterphs
|
|
.ignorehrhs
|
|
mov eax,[esi+510]
|
|
mov ecx,64
|
|
mov [esi+512],eax
|
|
mov edx,[spritetablea]
|
|
add edx,512
|
|
.ah
|
|
movq mm0,[esi]
|
|
movq mm4,mm0
|
|
movq mm1,[esi+2]
|
|
pand mm0,mm2
|
|
pand mm1,mm2
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
paddd mm0,mm1
|
|
movq mm5,mm4
|
|
; mm4/mm5 contains original values, mm0 contains mixed values
|
|
punpcklwd mm4,mm0
|
|
punpckhwd mm5,mm0
|
|
movq [edx],mm4
|
|
movq [edx+8],mm5
|
|
movq [edi],mm4
|
|
movq [edi+8],mm5
|
|
add esi,8
|
|
add edi,16
|
|
add edx,16
|
|
dec ecx
|
|
jnz .ah
|
|
add edi,[AddEndBytes]
|
|
sub edx,16*64
|
|
mov ecx,64
|
|
.ahc
|
|
movq mm0,[edx]
|
|
movq mm1,[edx+8]
|
|
pand mm0,mm2
|
|
pand mm1,mm2
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
movq [edi],mm0
|
|
movq [edi+8],mm1
|
|
add edi,16
|
|
add edx,16
|
|
dec ecx
|
|
jnz .ahc
|
|
.returninterphs
|
|
add edi,[AddEndBytes]
|
|
add esi,64
|
|
inc ebx
|
|
dec byte[lineleft]
|
|
jnz near .ahb
|
|
emms
|
|
popad
|
|
ret
|
|
|
|
.scanlinesquart
|
|
inc dl
|
|
mov [lineleft],dl
|
|
; do scanlines
|
|
.ahb2
|
|
cmp byte[ebx],1
|
|
jbe .ignorehrqs
|
|
call HighResProc
|
|
movq mm2,[HalfTransC]
|
|
jmp .returninterpqs
|
|
.ignorehrqs
|
|
mov eax,[esi+510]
|
|
mov ecx,64
|
|
mov [esi+512],eax
|
|
mov edx,[spritetablea]
|
|
add edx,512
|
|
.ah2
|
|
movq mm0,[esi]
|
|
movq mm3,mm0
|
|
movq mm4,mm0
|
|
movq mm1,[esi+2]
|
|
pand mm3,mm1
|
|
pand mm0,mm2
|
|
pand mm1,mm2
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
paddd mm0,mm1
|
|
pand mm3,[HalfTransB]
|
|
paddw mm0,mm3
|
|
movq mm5,mm4
|
|
; mm4/mm5 contains original values, mm0 contains mixed values
|
|
punpcklwd mm4,mm0
|
|
punpckhwd mm5,mm0
|
|
movq [edx],mm4
|
|
movq [edx+8],mm5
|
|
movq [edi],mm4
|
|
movq [edi+8],mm5
|
|
add esi,8
|
|
add edi,16
|
|
add edx,16
|
|
dec ecx
|
|
jnz .ah2
|
|
add edi,[AddEndBytes]
|
|
sub edx,16*64
|
|
mov ecx,64
|
|
movq mm3,mm2
|
|
.ahc2
|
|
movq mm0,[edx]
|
|
movq mm1,[edx+8]
|
|
pand mm0,mm2
|
|
pand mm1,mm2
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
movq mm4,mm0
|
|
movq mm5,mm1
|
|
pand mm4,mm2
|
|
pand mm5,mm2
|
|
psrlw mm4,1
|
|
psrlw mm5,1
|
|
paddd mm0,mm4
|
|
paddd mm1,mm5
|
|
movq [edi],mm0
|
|
movq [edi+8],mm1
|
|
add edi,16
|
|
add edx,16
|
|
dec ecx
|
|
jnz .ahc2
|
|
.returninterpqs
|
|
add esi,64
|
|
add edi,[AddEndBytes]
|
|
inc ebx
|
|
dec byte[lineleft]
|
|
jnz near .ahb2
|
|
emms
|
|
popad
|
|
ret
|
|
|
|
NEWSYM interpolate640x480x16bwin
|
|
cmp byte[MMXSupport],1
|
|
je near MMXInterpolwin
|
|
|
|
mov ebx,hirestiledat+1
|
|
cmp byte[GUIOn],1
|
|
je .loopabi
|
|
cmp byte[newengen],0
|
|
je .loopabi
|
|
mov ebx,SpecialLine+1
|
|
.loopabi
|
|
mov [InterPtr],ebx
|
|
|
|
mov dl,224
|
|
dec dl
|
|
dec dl
|
|
dec dl
|
|
cmp byte[scanlines],1
|
|
je near .scanlines
|
|
cmp byte[scanlines],2
|
|
je near .scanlinesquart
|
|
cmp byte[scanlines],3
|
|
je near .scanlineshalf
|
|
inc dword[InterPtr]
|
|
mov [lineleft],dl
|
|
; do first line
|
|
mov ecx,255
|
|
mov edx,[spritetablea]
|
|
.a
|
|
mov ax,[esi]
|
|
mov bx,[esi+2]
|
|
and ebx,[HalfTrans+6]
|
|
and eax,[HalfTrans+6]
|
|
add ebx,eax
|
|
shl ebx,15
|
|
mov bx,[esi]
|
|
mov [edi],ebx
|
|
mov [edx],ebx
|
|
add esi,2
|
|
add edi,4
|
|
add edx,4
|
|
dec ecx
|
|
jnz .a
|
|
add esi,66
|
|
add edi,[AddEndBytes]
|
|
add edi,4
|
|
.loopb
|
|
mov ebx,[InterPtr]
|
|
cmp byte[ebx],1
|
|
jbe .ignorehr
|
|
call HighResProc
|
|
jmp .returninterp
|
|
.ignorehr
|
|
mov ecx,255
|
|
mov edx,[spritetablea]
|
|
.c
|
|
mov ax,[esi]
|
|
mov bx,[esi+2]
|
|
and ebx,[HalfTrans+6]
|
|
and eax,[HalfTrans+6]
|
|
add ebx,eax
|
|
shl ebx,15
|
|
mov eax,[edx]
|
|
mov bx,[esi]
|
|
and eax,[HalfTrans]
|
|
mov [edx],ebx
|
|
and ebx,[HalfTrans]
|
|
shr eax,1
|
|
shr ebx,1
|
|
add eax,ebx
|
|
mov [edi],eax
|
|
add esi,2
|
|
add edi,4
|
|
add edx,4
|
|
dec ecx
|
|
jnz .c
|
|
add edi,4
|
|
add edi,[AddEndBytes]
|
|
mov edx,[spritetablea]
|
|
mov ecx,255
|
|
.d
|
|
mov eax,[edx]
|
|
mov [edi],eax
|
|
add edx,4
|
|
add edi,4
|
|
dec ecx
|
|
jnz .d
|
|
add esi,66
|
|
inc dword[InterPtr]
|
|
add edi,[AddEndBytes]
|
|
add edi,4
|
|
dec byte[lineleft]
|
|
jnz near .loopb
|
|
popad
|
|
ret
|
|
.returninterp
|
|
add esi,64
|
|
inc dword[InterPtr]
|
|
add edi,[AddEndBytes]
|
|
dec byte[lineleft]
|
|
jnz near .loopb
|
|
popad
|
|
ret
|
|
|
|
.scanlines
|
|
xor eax,eax
|
|
mov ebx,hirestiledat+1
|
|
cmp byte[GUIOn],1
|
|
je .loopabis
|
|
cmp byte[newengen],0
|
|
je .loopabis
|
|
mov ebx,SpecialLine+1
|
|
.loopabis
|
|
.loopab
|
|
mov ecx,255
|
|
cmp byte[ebx],1
|
|
jbe .ignorehrs
|
|
call HighResProc
|
|
jmp .returninterps
|
|
.ignorehrs
|
|
cmp byte[ebx],1
|
|
je near .yeshiresb
|
|
.ignorehrb
|
|
push ebx
|
|
.ab
|
|
mov ax,[esi]
|
|
mov bx,[esi+2]
|
|
and ebx,[HalfTrans+6]
|
|
and eax,[HalfTrans+6]
|
|
add ebx,eax
|
|
shl ebx,15
|
|
mov bx,[esi]
|
|
mov [edi],ebx
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .ab
|
|
pop ebx
|
|
.returnb
|
|
add esi,66
|
|
add edi,4
|
|
add edi,[AddEndBytes]
|
|
mov ecx,256
|
|
.fslloop
|
|
mov dword[edi],0
|
|
add edi,4
|
|
dec ecx
|
|
jnz .fslloop
|
|
add edi,[AddEndBytes]
|
|
inc ebx
|
|
dec dl
|
|
jnz .loopab
|
|
xor byte[res512switch],1
|
|
popad
|
|
ret
|
|
.yeshiresb
|
|
mov byte[ebx],0
|
|
test byte[res512switch],1
|
|
jnz .rightsideb
|
|
.bb
|
|
mov ax,[esi]
|
|
mov [edi],ax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .bb
|
|
jmp .returnb
|
|
.rightsideb
|
|
.cb
|
|
mov ax,[esi]
|
|
mov [edi+2],ax
|
|
add esi,2
|
|
add edi,4
|
|
dec ecx
|
|
jnz .cb
|
|
jmp .returnb
|
|
.returninterps
|
|
add esi,64
|
|
inc dword[InterPtr]
|
|
add edi,[AddEndBytes]
|
|
mov ecx,256
|
|
.fslloop2
|
|
mov dword[edi],0
|
|
add edi,4
|
|
dec ecx
|
|
jnz .fslloop2
|
|
add edi,[AddEndBytes]
|
|
dec byte[lineleft]
|
|
jnz near .loopab
|
|
popad
|
|
ret
|
|
|
|
.scanlineshalf
|
|
xor eax,eax
|
|
mov [lineleft],dl
|
|
.loopab2
|
|
mov ebx,[InterPtr]
|
|
cmp byte[ebx],1
|
|
jbe .ignorehrhs
|
|
call HighResProc
|
|
jmp .returninterphs
|
|
.ignorehrhs
|
|
mov ecx,255
|
|
mov edx,[spritetablea]
|
|
add edx,512
|
|
.ab2
|
|
mov ax,[esi]
|
|
mov bx,[esi+2]
|
|
and ebx,[HalfTrans+6]
|
|
and eax,[HalfTrans+6]
|
|
add ebx,eax
|
|
shl ebx,15
|
|
mov bx,[esi]
|
|
mov [edx],ebx
|
|
mov [edi],ebx
|
|
add esi,2
|
|
add edi,4
|
|
add edx,4
|
|
dec ecx
|
|
jnz .ab2
|
|
add edi,4
|
|
add edi,[AddEndBytes]
|
|
mov ecx,255
|
|
mov edx,[spritetablea]
|
|
add edx,512
|
|
.ab2b
|
|
mov eax,[edx]
|
|
and eax,[HalfTrans]
|
|
shr eax,1
|
|
mov [edi],eax
|
|
add edi,4
|
|
add edx,4
|
|
dec ecx
|
|
jnz .ab2b
|
|
inc dword[InterPtr]
|
|
add esi,66
|
|
add edi,4
|
|
add edi,[AddEndBytes]
|
|
dec byte[lineleft]
|
|
jnz near .loopab2
|
|
popad
|
|
ret
|
|
.returninterphs
|
|
add esi,64
|
|
inc dword[InterPtr]
|
|
add edi,[AddEndBytes]
|
|
dec byte[lineleft]
|
|
jnz near .loopab2
|
|
popad
|
|
ret
|
|
|
|
.scanlinesquart
|
|
xor eax,eax
|
|
mov [lineleft],dl
|
|
.loopab3
|
|
mov ebx,[InterPtr]
|
|
cmp byte[ebx],1
|
|
jbe .ignorehrqs
|
|
call HighResProc
|
|
jmp .returninterpqs
|
|
.ignorehrqs
|
|
mov ecx,255
|
|
mov edx,[spritetablea]
|
|
add edx,512
|
|
.ab3
|
|
mov ax,[esi]
|
|
mov bx,[esi+2]
|
|
and ebx,[HalfTrans+6]
|
|
and eax,[HalfTrans+6]
|
|
add ebx,eax
|
|
shl ebx,15
|
|
mov bx,[esi]
|
|
mov [edx],ebx
|
|
mov [edi],ebx
|
|
add esi,2
|
|
add edi,4
|
|
add edx,4
|
|
dec ecx
|
|
jnz .ab3
|
|
add edi,AddEndBytes
|
|
add edi,4
|
|
mov ecx,255
|
|
mov edx,[spritetablea]
|
|
add edx,512
|
|
.ab3b
|
|
mov eax,[edx]
|
|
and eax,[HalfTrans]
|
|
shr eax,1
|
|
mov ebx,eax
|
|
and ebx,[HalfTrans]
|
|
shr ebx,1
|
|
add eax,ebx
|
|
mov [edi],eax
|
|
add edi,4
|
|
add edx,4
|
|
dec ecx
|
|
jnz .ab3b
|
|
inc dword[InterPtr]
|
|
add esi,66
|
|
add edi,4
|
|
add edi,[AddEndBytes]
|
|
dec byte[lineleft]
|
|
jnz near .loopab3
|
|
popad
|
|
ret
|
|
.returninterpqs
|
|
add esi,64
|
|
inc dword[InterPtr]
|
|
add edi,[AddEndBytes]
|
|
dec byte[lineleft]
|
|
jnz near .loopab3
|
|
popad
|
|
ret
|
|
|
|
SECTION .data
|
|
InterPtr dd 0
|
|
SECTION .text
|