Jump to content

Screen Compare - NES vs. WII vs. XBOX


PhilExile

Recommended Posts

/*void Scanlines(u8 *srcPtr, u32 srcPitch, u8 *,
		   u8 *dstPtr, u32 dstPitch, int width, int height)
{
__asm {
	mov			eax, width;
	mov			edx, srcPitch;
	shr			eax, 2;
	shl			eax, 3;
	sub			edx, eax;
	mov			srcPitch, edx;
	shr			eax, 3;
	mov			width, eax;
	mov			esi, srcPtr;
	mov			edi, dstPtr;
	mov			edx, edi;
	add			edx, dstPitch;
	mov			ecx, height;
	pxor		mm2, mm2;
	align 4;
label0:
	mov			eax, width;
	align 4;
label1:
	movq		mm0, qword ptr [esi];
	movq		mm1, mm0;
	punpcklwd	mm0, qword ptr [esi];
	punpckhwd	mm1, qword ptr [esi];
	movq		qword ptr [edi], mm0;
	movq		qword ptr [edx], mm2;
	movq		qword ptr [edi + 8], mm1;
	movq		qword ptr [edx + 8], mm2;

	add			esi, 8;
	add			edi, 16;
	add			edx, 16;
	dec			eax;
	jnz			label1;

	add			esi, srcPitch;
	add			edi, dstPitch;
	add			edx, dstPitch;

	dec			ecx;
	jnz			label0;

	;emms;
}
}*/

#define RGB_LOW_BITS_MASK 0x0821

__int64 colorMask = ~((__int64)RGB_LOW_BITS_MASK |
				 ((__int64)RGB_LOW_BITS_MASK << 16) |
				 ((__int64)RGB_LOW_BITS_MASK << 32) |
				 ((__int64)RGB_LOW_BITS_MASK << 48));

void ScanlinesTV(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
			 u8 *dstPtr, u32 dstPitch, int width, int height)
{
__asm {
	mov			esi, srcPtr;
	mov			edi, dstPtr;
	mov			edx, edi;
	add			edx, dstPitch;
	mov			ecx, height;
	movq		mm7, colorMask;

	;fix tiger heli and others
	mov         ebx,srcPitch;
	shl         ebx,1;
	mov         eax,dstPitch;
	sub         eax,ebx;
	add         dstPitch,eax;

	mov			eax, width;              
	mov			ebx, srcPitch;
	shl			eax, 1;                //width *2
	sub			ebx, eax;              // srcpitch - width*2
	mov			srcPitch, ebx;          
	shr			eax, 3;                 // width /4
	mov			width, eax;

	align 4;
label2:
	mov			eax, width;
	mov			ebx, dword ptr[esi];
	align 4;
label3:
	movq		mm0, qword ptr [esi];
	movq		mm1, mm0;
	movq		mm2, mm0;
	psllq		mm1, 16;
	pand		mm2, mm7;
	pinsrw		mm1, ebx, 0;
	psrlw		mm2, 1;
	pand		mm1, mm7;
	pextrw		ebx, mm0, 3;
	psrlw		mm1, 1;
	paddw		mm1, mm2;
	movq		mm0, mm1;
	punpckhwd	mm1, qword ptr [esi];
	punpcklwd	mm0, qword ptr [esi];
	movq		mm3, mm1;
	movq		mm2, mm0;
	pand		mm3, mm7;
	pand		mm2, mm7;
	psrlw		mm3, 1;
	psrlw		mm2, 1;
	movq		mm5, mm3;
	movq		mm4, mm2;
	pand		mm5, mm7;
	pand		mm4, mm7;
	psrlw		mm5, 1;
	psrlw		mm4, 1;
	paddw		mm3, mm5;
	paddw		mm2, mm4;

	movq qword ptr [edi], mm0;
	movq qword ptr [edx], mm2;
	movq qword ptr [edi + 8], mm1;
	movq qword ptr [edx + 8], mm3;

	add esi, 8;
	add edi, 16;
	add edx, 16;
	dec eax;
	jnz label3;

	add esi, srcPitch;
	add edi, dstPitch;
	add edx, dstPitch;

	dec ecx;
	jnz label2;

	;emms;
}
}

 

Looks like ASM to me... :P Notice the first one is commented out.

 

The one used by Zsnes.. copy640x480x16bwin

 

ALIGN 32

%include "macros.mac"

EXTSYM vesa2selec,vidbuffer,GUIOn,MMXSupport,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

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

Link to comment
Share on other sites

Thanks bunch, this is great stuff!

 

SDTV Setup

- Buy an Extron Emotia | See here for more details: http://scanlines.hazard-city.de/

- Buy either a Frosty VGA cable, YUV -> VGA converter, or build your own VGA cable

- Set your dash/emulator to 480p

- Set your emulator to 'perfect pixel' size - i.e. 512x448

- Once everything is hooked up, stretch the horizontal size of the picture to the maximum on the Emotia

- Flip the interlacing switch on the front of the Emotia to activate 240p

 

 

I thought that 480p was ED, not SD but I'm known to be an idiot with this stuff.. I get some scan lines from the cheepo 480i SD TV I bought super cheep. I wonder how that compares to adding the Extron in the mix.

Edited by sharpfork
Link to comment
Share on other sites

The Extron Emotia takes the 480p signal and converts it to 240p. If you are getting scanlines from the XBOX under 480i, its because the image is interlaced and the TV is refreshing a bit slowly. 240p is a stable signal, unlike interlaced. Check out this site for more information:

 

http://scanlines.hazard-city.de/

 

Its explained very well there. :P

 

 

Thanks bunch, this is great stuff!

 

SDTV Setup

- Buy an Extron Emotia | See here for more details: http://scanlines.hazard-city.de/

- Buy either a Frosty VGA cable, YUV -> VGA converter, or build your own VGA cable

- Set your dash/emulator to 480p

- Set your emulator to 'perfect pixel' size - i.e. 512x448

- Once everything is hooked up, stretch the horizontal size of the picture to the maximum on the Emotia

- Flip the interlacing switch on the front of the Emotia to activate 240p

 

 

I thought that 480p was ED, not SD but I'm known to be an idiot with this stuff.. I get some scan lines from the cheepo 480i SD TV I bought super cheep. I wonder how that compares to adding the Extron in the mix.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...