📄 copyvwin.asm
字号:
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
;
;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 vesa2selec,vidbuffer,GUIOn,FPUCopy,resolutn,En2xSaI,antienab,scanlines
EXTSYM hirestiledat,res512switch,curblank,spritetablea
EXTSYM lineleft,_2xSaILineW,_2xSaISuperEagleLineW, _2xSaISuper2xSaILineW
EXTSYM newengen,cfield,HalfTrans
EXTSYM GUIOn2,FilteredGUI
EXTSYM SpecialLine
EXTSYM vidbufferofsb
EXTSYM HalfTransB,HalfTransC
NEWSYM CopyVWinAsmStart
NEWSYM AddEndBytes, dd 0 ; Number of bytes between each line
NEWSYM NumBytesPerLine, dd 0 ; Total number of bytes per line (1024+AddEndBytes)
NEWSYM WinVidMemStart, dd 0
NEWSYM copy640x480x16bwin
cmp byte[curblank],40h
jne .startcopy
ret
.startcopy
push es
mov ax,ds
mov es,ax
mov esi,[vidbuffer]
mov edi,[WinVidMemStart]
add esi,16*2+256*2+32*2
xor eax,eax
; Check if interpolation mode
cmp byte[FilteredGUI],0
jne .yi
cmp byte[GUIOn2],1
je .nointerp
.yi
cmp byte[FPUCopy],2
jne .nommx
cmp byte[En2xSaI],0
jne near Process2xSaIwin
.nommx
cmp byte[antienab],1
je near interpolate640x480x16bwin
.nointerp
mov dl,[resolutn]
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[FPUCopy],2
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
pop es
xor byte[res512switch],1
cmp byte[FPUCopy],2
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 .yeshiresb
cmp byte[ebx],1
jbe .ignorehrb
call HighResProc
jmp .returnb
.ignorehrb
cmp byte[FPUCopy],2
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
loop .fslloop
add edi,[AddEndBytes]
inc ebx
dec dl
jnz .loopab
pop es
xor byte[res512switch],1
cmp byte[FPUCopy],2
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[FPUCopy],2
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
pop es
cmp byte[FPUCopy],2
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[FPUCopy],2
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
pop es
cmp byte[FPUCopy],2
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[FPUCopy],2
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[FPUCopy],2
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -