Finished moving video code to ASM

This commit is contained in:
pagefault
2003-02-23 16:02:05 +00:00
parent b2c28fedb0
commit a8a21b3943
2 changed files with 101 additions and 142 deletions

View File

@@ -24,6 +24,9 @@ ALIGN 32
EXTSYM SurfaceX,SurfaceY EXTSYM SurfaceX,SurfaceY
EXTSYM ScreenPtr,SurfBufD EXTSYM ScreenPtr,SurfBufD
EXTSYM pitch,MMXSupport,resolutn EXTSYM pitch,MMXSupport,resolutn
%ifdef __WIN32__
EXTSYM BitConv32Ptr
%endif
SECTION .text SECTION .text
@@ -46,7 +49,7 @@ NEWSYM ClearWin16
ret ret
NEWSYM ClearWin32 NEWSYM ClearWin32
push es pushad
mov ax,ds mov ax,ds
mov es,ax mov es,ax
xor eax,eax xor eax,eax
@@ -64,13 +67,13 @@ NEWSYM ClearWin32
add ebx,1 add ebx,1
cmp ebx, [SurfaceY] cmp ebx, [SurfaceY]
jne .Blank3 jne .Blank3
pop es popad
ret ret
NEWSYM DrawWin256x224x16 NEWSYM DrawWin256x224x16
pushad pushad
cmp byte[MMXSupport],0 cmp byte [MMXSupport],0
je .nommx je .noMMX
mov esi, [ScreenPtr] mov esi, [ScreenPtr]
mov edi, [SurfBufD] mov edi, [SurfBufD]
xor eax,eax xor eax,eax
@@ -101,7 +104,7 @@ NEWSYM DrawWin256x224x16
emms emms
popad popad
ret ret
.nommx .noMMX:
mov ax,ds mov ax,ds
mov es,ax mov es,ax
xor eax,eax xor eax,eax
@@ -122,15 +125,52 @@ NEWSYM DrawWin256x224x16
%else %else
cmp eax,223 cmp eax,223
%endif %endif
jne .Copying jne .Copying
xor eax,edx xor eax,edx
mov ecx,128 mov ecx,128
rep stosd rep stosd
popad popad
ret ret
NEWSYM DrawWin256x224x32
pushad
mov ax,ds
mov es,ax
xor eax,eax
mov ebx, [BitConv32Ptr]
mov esi, [ScreenPtr]
mov edi, [SurfBufD]
.Copying32b:
mov ecx,256
push eax
xor eax,eax
.CopyLoop32b:
mov ax,[esi]
add esi,2
mov edx,[ebx+eax*4]
mov [edi],edx
add edi,4
dec ecx
jnz .CopyLoop32b
pop eax
inc eax
add edi, [pitch]
sub edi,1024
sub esi,512
add esi,576
%ifdef __WIN32__
cmp eax,239
%else
cmp eax,223
%endif
jne .Copying32b
popad
ret
NEWSYM DrawWin320x240x16 NEWSYM DrawWin320x240x16
pushad pushad
cmp byte [MMXSupport],0
je near .noMMX
xor eax,eax xor eax,eax
xor ebx,ebx xor ebx,ebx
mov esi, [ScreenPtr] mov esi, [ScreenPtr]
@@ -174,10 +214,54 @@ NEWSYM DrawWin320x240x16
add edi, [pitch] add edi, [pitch]
sub edi,640 sub edi,640
add esi,64 add esi,64
cmp ebx,223 %ifdef __WIN32__
cmp eax,239
%else
cmp eax,223
%endif
jne .Copying2MMX jne .Copying2MMX
mov ecx,128 mov ecx,128
rep stosd rep stosd
emms emms
popad popad
ret ret
.noMMX:
mov ax,ds
mov es,ax
xor eax,eax
xor ebx,ebx
mov esi, [ScreenPtr]
mov edi, [SurfBufD]
movsx edx, word[resolutn]
sub edx,2
.Blank1:
xor eax,eax
mov ecx,160
rep stosd
sub edi,640
add edi, [pitch]
add ebx,1
cmp ebx,8
jne .Blank1
xor ebx,ebx
.Copying2:
xor eax,eax
mov ecx,16
rep stosd
mov ecx,128
rep movsd
xor eax,eax
mov ecx,16
rep stosd
inc ebx
add edi, [pitch]
sub edi,640
sub esi,512
add esi,576
cmp ebx,edx
jne .Copying2
xor eax,eax
mov ecx,128
rep stosd
popad
ret

View File

@@ -2044,6 +2044,7 @@ void clearwin()
extern void DrawWin256x224x16(); extern void DrawWin256x224x16();
extern void DrawWin256x224x32(); extern void DrawWin256x224x32();
extern void DrawWin320x240x16();
void drawscreenwin(void) void drawscreenwin(void)
{ {
@@ -2098,40 +2099,14 @@ void drawscreenwin(void)
{ {
case 16: case 16:
{ {
DrawWin256x224x16(); DrawWin256x224x16();
}
break; break;
}
case 32: case 32:
_asm { {
push es DrawWin256x224x32();
mov ax,ds break;
mov es,ax }
xor eax,eax
mov ebx,BitConv32Ptr
mov esi,ScreenPtr
mov edi,SurfBufD
Copying32b:
mov ecx,256
push eax
xor eax,eax
CopyLoop32b:
mov ax,[esi]
add esi,2
mov edx,[ebx+eax*4]
mov [edi],edx
add edi,4
dec ecx
jnz CopyLoop32b
pop eax
inc eax
add edi,pitch
sub edi,1024
sub esi,512
add esi,576
cmp eax,239
jne Copying32b
pop es
}
SURFDW=(DWORD *) &SurfBuf[(resolutn-1)*pitch]; SURFDW=(DWORD *) &SurfBuf[(resolutn-1)*pitch];
color32=0x7F000000; color32=0x7F000000;
@@ -2172,110 +2147,10 @@ void drawscreenwin(void)
switch (BitDepth) switch (BitDepth)
{ {
case 16: case 16:
if (MMXSupport == 1) { {
_asm { DrawWin320x240x16();
push es
mov ax,ds
mov es,ax
xor eax,eax
xor ebx,ebx
mov esi,ScreenPtr
mov edi,SurfBufD
movsx edx,resolutn
sub edx,2
Blank1MMX:
xor eax,eax
mov ecx,160
rep stosd
sub edi,640
add edi,pitch
add ebx,1
cmp ebx,8
jne Blank1MMX
xor ebx,ebx
pxor mm0,mm0
Copying2MMX:
mov ecx,4
MMXLoopA:
movq [edi],mm0
movq [edi+8],mm0
add edi,16
dec ecx
jnz MMXLoopA
mov ecx,32
MMXLoopB:
movq mm1,[esi]
movq mm2,[esi+8]
movq [edi],mm1
movq [edi+8],mm2
add esi,16
add edi,16
dec ecx
jnz MMXLoopB
mov ecx,4
MMXLoopC:
movq [edi],mm0
movq [edi+8],mm0
add edi,16
dec ecx
jnz MMXLoopC
inc ebx
add edi,pitch
sub edi,640
sub esi,512
add esi,576
cmp ebx,edx
jne Copying2MMX
xor eax,eax
mov ecx,128
rep stosd
pop es
emms
}
} else {
_asm {
push es
mov ax,ds
mov es,ax
xor eax,eax
xor ebx,ebx
mov esi,ScreenPtr
mov edi,SurfBufD
movsx edx,resolutn
sub edx,2
Blank1:
xor eax,eax
mov ecx,160
rep stosd
sub edi,640
add edi,pitch
add ebx,1
cmp ebx,8
jne Blank1
xor ebx,ebx
Copying2:
xor eax,eax
mov ecx,16
rep stosd
mov ecx,128
rep movsd
xor eax,eax
mov ecx,16
rep stosd
inc ebx
add edi,pitch
sub edi,640
sub esi,512
add esi,576
cmp ebx,edx
jne Copying2
xor eax,eax
mov ecx,128
rep stosd
pop es
}
}
break; break;
}
case 32: case 32:
for(j=0;j<8;j++) for(j=0;j<8;j++)
{ {