AxibugEmuOnline/References/VirtuaNESex_src_191105/Render32bpp.h
2024-08-05 17:58:53 +08:00

954 lines
18 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 32bit Normal
//
void CDirectDraw::Render32bpp_Normal( LPBYTE lpRdr, LPBYTE lpDlt, DDSURFACEDESC2& ddsd, BOOL bForceWrite )
{
LPBYTE pScn = lpRdr;
LPBYTE pDst = (LPBYTE)ddsd.lpSurface;
LPBYTE pDlt = (LPBYTE)lpDlt;
LPBYTE pPal;
DWORD width;
DWORD pitch = ddsd.lPitch;
for( INT i = 0; i < SCREEN_HEIGHT; i++ ) {
if( !(m_LineColormode[i]&0x80) ) {
pPal = (LPBYTE)m_cnPalette[m_LineColormode[i]&0x07];
} else {
pPal = (LPBYTE)m_mnPalette[m_LineColormode[i]&0x07];
}
BOOL bFWrite = FALSE;
if( bForceWrite || *pDlt != m_LineColormode[i] ) {
bFWrite = TRUE;
*pDlt = m_LineColormode[i];
}
pDlt += 4;
width = SCREEN_WIDTH;
if( bFWrite ) {
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPal
mov edi, pDst
_r32bn_loop_fw:
mov edx, [eax+0]
mov [ebx+0], edx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 4], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+ 8], ecx
mov [edi+12], edx
mov edx, [eax+4]
mov [ebx+4], edx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+16], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+20], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+24], ecx
mov [edi+28], edx
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+32]
sub width, 8
jg _r32bn_loop_fw
}
pScn += RENDER_WIDTH;
pDlt += SCREEN_WIDTH;
pDst += pitch;
} else {
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPal
mov edi, pDst
_r32bn_loop:
// check previous!!
mov edx, [eax+0]
cmp edx, [ebx+0]
je _r32bn_skip1
mov [ebx+0], edx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 4], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+ 8], ecx
mov [edi+12], edx
_r32bn_skip1:
// check previous!!
mov edx, [eax+4]
cmp edx, [ebx+4]
je _r32bn_skip2
mov [ebx+4], edx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+16], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+20], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+24], ecx
mov [edi+28], edx
_r32bn_skip2:
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+32]
sub width, 8
jg _r32bn_loop
}
pScn += RENDER_WIDTH;
pDlt += SCREEN_WIDTH;
pDst += pitch;
}
}
}
//
// 32bit Scanline
//
void CDirectDraw::Render32bpp_Scanline( LPBYTE lpRdr, LPBYTE lpDlt, DDSURFACEDESC2& ddsd, BOOL bForceWrite )
{
LPBYTE pScn = lpRdr;
LPBYTE pDst = (LPBYTE)ddsd.lpSurface;
LPBYTE pDlt = (LPBYTE)lpDlt;
LPBYTE pPal, pPalScan;
DWORD width = SCREEN_WIDTH;
DWORD pitch = ddsd.lPitch;
for( INT i = 0; i < SCREEN_HEIGHT; i++ ) {
if( !(m_LineColormode[i]&0x80) ) {
pPal = (LPBYTE)m_cnPalette[m_LineColormode[i]&0x07];
pPalScan = (LPBYTE)m_csPalette[m_LineColormode[i]&0x07];
} else {
pPal = (LPBYTE)m_mnPalette[m_LineColormode[i]&0x07];
pPalScan = (LPBYTE)m_msPalette[m_LineColormode[i]&0x07];
}
BOOL bFWrite = FALSE;
if( bForceWrite || *pDlt != m_LineColormode[i] ) {
bFWrite = TRUE;
*pDlt = m_LineColormode[i];
}
pDlt += 4;
width = SCREEN_WIDTH;
if( bFWrite ) {
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPal
mov edi, pDst
_r32bs_loop_fw:
mov edx, [eax+0]
mov [ebx+0], edx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 4], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+ 8], ecx
mov [edi+12], edx
mov edx, [eax+4]
mov [ebx+4], edx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+16], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+20], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+24], ecx
mov [edi+28], edx
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+32]
sub width, 8
jg _r32bs_loop_fw
}
width = SCREEN_WIDTH;
pDst += pitch;
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPalScan
mov edi, pDst
_r32bs_loop2_fw:
mov edx, [eax+0]
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 4], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+ 8], ecx
mov [edi+12], edx
mov edx, [eax+4]
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+16], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+20], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+24], ecx
mov [edi+28], edx
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+32]
sub width, 8
jg _r32bs_loop2_fw
}
pScn += RENDER_WIDTH;
pDlt += SCREEN_WIDTH;
pDst += pitch;
} else {
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPal
mov edi, pDst
_r32bs_loop:
// check previous!!
mov edx, [eax+0]
cmp edx, [ebx+0]
je _r32bs_skip1
// mov [ebx+0], edx // 1<><31><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂Ȃ<DC82>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 4], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+ 8], ecx
mov [edi+12], edx
_r32bs_skip1:
// check previous!!
mov edx, [eax+4]
cmp edx, [ebx+4]
je _r32bs_skip2
// mov [ebx+4], edx // 1<><31><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂Ȃ<DC82>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+16], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+20], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+24], ecx
mov [edi+28], edx
_r32bs_skip2:
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+32]
sub width, 8
jg _r32bs_loop
}
width = SCREEN_WIDTH;
pDst += pitch;
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPalScan
mov edi, pDst
_r32bs_loop2:
// check previous!!
mov edx, [eax+0]
cmp edx, [ebx+0]
je _r32bs_skip3
mov [ebx+0], edx // 2<><32><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 4], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+ 8], ecx
mov [edi+12], edx
_r32bs_skip3:
// check previous!!
mov edx, [eax+4]
cmp edx, [ebx+4]
je _r32bs_skip4
mov [ebx+4], edx // 2<><32><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+16], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+20], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+24], ecx
mov [edi+28], edx
_r32bs_skip4:
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+32]
sub width, 8
jg _r32bs_loop2
}
pScn += RENDER_WIDTH;
pDlt += SCREEN_WIDTH;
pDst += pitch;
}
}
}
//
// 32bit Double
//
void CDirectDraw::Render32bpp_Double( LPBYTE lpRdr, LPBYTE lpDlt, DDSURFACEDESC2& ddsd, BOOL bForceWrite )
{
LPBYTE pScn = lpRdr;
LPBYTE pDst = (LPBYTE)ddsd.lpSurface;
LPBYTE pDlt = (LPBYTE)lpDlt;
LPBYTE pPal;
DWORD width;
DWORD pitch = ddsd.lPitch;
for( INT i = 0; i < SCREEN_HEIGHT; i++ ) {
if( !(m_LineColormode[i]&0x80) ) {
pPal = (LPBYTE)m_cnPalette[m_LineColormode[i]&0x07];
} else {
pPal = (LPBYTE)m_mnPalette[m_LineColormode[i]&0x07];
}
BOOL bFWrite = FALSE;
if( bForceWrite || *pDlt != m_LineColormode[i] ) {
bFWrite = TRUE;
*pDlt = m_LineColormode[i];
}
pDlt += 4;
width = SCREEN_WIDTH;
if( bFWrite ) {
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPal
mov edi, pDst
_r32bs_d_loop_fw:
mov edx, [eax+0]
mov [ebx+0], edx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
mov [edi+ 4], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 8], ecx
mov [edi+12], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+16], ecx
mov [edi+20], ecx
mov [edi+24], edx
mov [edi+28], edx
mov edx, [eax+4]
mov [ebx+4], edx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+32], ecx
mov [edi+36], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+40], ecx
mov [edi+44], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+48], ecx
mov [edi+52], ecx
mov [edi+56], edx
mov [edi+60], edx
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+64]
sub width, 8
jg _r32bs_d_loop_fw
}
width = SCREEN_WIDTH;
pDst += pitch;
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPal
mov edi, pDst
_r32bs_d_loop2_fw:
mov edx, [eax+0]
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
mov [edi+ 4], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 8], ecx
mov [edi+12], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+16], ecx
mov [edi+20], ecx
mov [edi+24], edx
mov [edi+28], edx
mov edx, [eax+4]
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+32], ecx
mov [edi+36], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+40], ecx
mov [edi+44], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+48], ecx
mov [edi+52], ecx
mov [edi+56], edx
mov [edi+60], edx
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+64]
sub width, 8
jg _r32bs_d_loop2_fw
}
pScn += RENDER_WIDTH;
pDlt += SCREEN_WIDTH;
pDst += pitch;
} else {
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPal
mov edi, pDst
_r32bs_d_loop:
// check previous!!
mov edx, [eax+0]
cmp edx, [ebx+0]
je _r32bs_d_skip1
// mov [ebx+0], edx // 1<><31><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂Ȃ<DC82>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
mov [edi+ 4], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 8], ecx
mov [edi+12], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+16], ecx
mov [edi+20], ecx
mov [edi+24], edx
mov [edi+28], edx
_r32bs_d_skip1:
// check previous!!
mov edx, [eax+4]
cmp edx, [ebx+4]
je _r32bs_d_skip2
// mov [ebx+4], edx // 1<><31><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂Ȃ<DC82>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+32], ecx
mov [edi+36], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+40], ecx
mov [edi+44], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+48], ecx
mov [edi+52], ecx
mov [edi+56], edx
mov [edi+60], edx
_r32bs_d_skip2:
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+64]
sub width, 8
jg _r32bs_d_loop
}
width = SCREEN_WIDTH;
pDst += pitch;
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPal
mov edi, pDst
_r32bs_d_loop2:
// check previous!!
mov edx, [eax+0]
cmp edx, [ebx+0]
je _r32bs_d_skip3
mov [ebx+0], edx // 2<><32><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
mov [edi+ 4], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 8], ecx
mov [edi+12], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+16], ecx
mov [edi+20], ecx
mov [edi+24], edx
mov [edi+28], edx
_r32bs_d_skip3:
// check previous!!
mov edx, [eax+4]
cmp edx, [ebx+4]
je _r32bs_d_skip4
mov [ebx+4], edx // 2<><32><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+32], ecx
mov [edi+36], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+40], ecx
mov [edi+44], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+48], ecx
mov [edi+52], ecx
mov [edi+56], edx
mov [edi+60], edx
_r32bs_d_skip4:
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+64]
sub width, 8
jg _r32bs_d_loop2
}
pScn += RENDER_WIDTH;
pDlt += SCREEN_WIDTH;
pDst += pitch;
}
}
}
//
// 32bit Double Scanline
//
void CDirectDraw::Render32bpp_DoubleScanline( LPBYTE lpRdr, LPBYTE lpDlt, DDSURFACEDESC2& ddsd, BOOL bForceWrite )
{
LPBYTE pScn = lpRdr;
LPBYTE pDst = (LPBYTE)ddsd.lpSurface;
LPBYTE pDlt = (LPBYTE)lpDlt;
LPBYTE pPal, pPalScan;
DWORD width;
DWORD pitch = ddsd.lPitch;
for( INT i = 0; i < SCREEN_HEIGHT; i++ ) {
if( !(m_LineColormode[i]&0x80) ) {
pPal = (LPBYTE)m_cnPalette[m_LineColormode[i]&0x07];
pPalScan = (LPBYTE)m_csPalette[m_LineColormode[i]&0x07];
} else {
pPal = (LPBYTE)m_mnPalette[m_LineColormode[i]&0x07];
pPalScan = (LPBYTE)m_msPalette[m_LineColormode[i]&0x07];
}
BOOL bFWrite = FALSE;
if( bForceWrite || *pDlt != m_LineColormode[i] ) {
bFWrite = TRUE;
*pDlt = m_LineColormode[i];
}
pDlt += 4;
width = SCREEN_WIDTH;
if( bFWrite ) {
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPal
mov edi, pDst
_r32bn_d_loop_fw:
mov edx, [eax+0]
mov [ebx+0], edx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
mov [edi+ 4], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 8], ecx
mov [edi+12], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+16], ecx
mov [edi+20], ecx
mov [edi+24], edx
mov [edi+28], edx
mov edx, [eax+4]
mov [ebx+4], edx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+32], ecx
mov [edi+36], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+40], ecx
mov [edi+44], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+48], ecx
mov [edi+52], ecx
mov [edi+56], edx
mov [edi+60], edx
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+64]
sub width, 8
jg _r32bn_d_loop_fw
}
width = SCREEN_WIDTH;
pDst += pitch;
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPalScan
mov edi, pDst
_r32bn_d_loop2_fw:
mov edx, [eax+0]
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
mov [edi+ 4], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 8], ecx
mov [edi+12], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+16], ecx
mov [edi+20], ecx
mov [edi+24], edx
mov [edi+28], edx
mov edx, [eax+4]
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+32], ecx
mov [edi+36], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+40], ecx
mov [edi+44], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+48], ecx
mov [edi+52], ecx
mov [edi+56], edx
mov [edi+60], edx
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+64]
sub width, 8
jg _r32bn_d_loop2_fw
}
pScn += RENDER_WIDTH;
pDlt += SCREEN_WIDTH;
pDst += pitch;
} else {
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPal
mov edi, pDst
_r32bn_d_loop:
// check previous!!
mov edx, [eax+0]
cmp edx, [ebx+0]
je _r32bn_d_skip1
// mov [ebx+0], edx // 1<><31><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂Ȃ<DC82>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
mov [edi+ 4], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 8], ecx
mov [edi+12], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+16], ecx
mov [edi+20], ecx
mov [edi+24], edx
mov [edi+28], edx
_r32bn_d_skip1:
// check previous!!
mov edx, [eax+4]
cmp edx, [ebx+4]
je _r32bn_d_skip2
// mov [ebx+4], edx // 1<><31><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂Ȃ<DC82>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+32], ecx
mov [edi+36], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+40], ecx
mov [edi+44], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+48], ecx
mov [edi+52], ecx
mov [edi+56], edx
mov [edi+60], edx
_r32bn_d_skip2:
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+64]
sub width, 8
jg _r32bn_d_loop
}
width = SCREEN_WIDTH;
pDst += pitch;
__asm {
mov eax, pScn
mov ebx, pDlt
mov esi, pPalScan
mov edi, pDst
_r32bn_d_loop2:
// check previous!!
mov edx, [eax+0]
cmp edx, [ebx+0]
je _r32bn_d_skip3
mov [ebx+0], edx // 2<><32><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 0], ecx
mov [edi+ 4], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+ 8], ecx
mov [edi+12], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+16], ecx
mov [edi+20], ecx
mov [edi+24], edx
mov [edi+28], edx
_r32bn_d_skip3:
// check previous!!
mov edx, [eax+4]
cmp edx, [ebx+4]
je _r32bn_d_skip4
mov [ebx+4], edx // 2<><32><EFBFBD>ڂ͏<DA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+32], ecx
mov [edi+36], ecx
movzx ecx, dl
mov ecx, [esi+ecx*4]
shr edx, 8
mov [edi+40], ecx
mov [edi+44], ecx
movzx ecx, dl
shr edx, 8
mov ecx, [esi+ecx*4]
mov edx, [esi+edx*4]
mov [edi+48], ecx
mov [edi+52], ecx
mov [edi+56], edx
mov [edi+60], edx
_r32bn_d_skip4:
lea eax, [eax+ 8]
lea ebx, [ebx+ 8]
lea edi, [edi+64]
sub width, 8
jg _r32bn_d_loop2
}
pScn += RENDER_WIDTH;
pDlt += SCREEN_WIDTH;
pDst += pitch;
}
}
}