Rest of the OpenBSD commits, removes inline assembly from linux/sw_draw.c

This commit is contained in:
theoddone33
2002-05-22 04:24:21 +00:00
parent 61ece9f2d6
commit 2f13e5f8d4
3 changed files with 146 additions and 159 deletions

View File

@@ -41,7 +41,7 @@ VIDEOBJ=${VIDEODIR}/makev16b.o ${VIDEODIR}/makev16t.o ${VIDEODIR}/makevid.o\
${VIDEODIR}/mode7ext.o ${VIDEODIR}/mv16tms.o ${VIDEODIR}/newg162.o\ ${VIDEODIR}/mode7ext.o ${VIDEODIR}/mv16tms.o ${VIDEODIR}/newg162.o\
${VIDEODIR}/newgfx16.o ${VIDEODIR}/newgfx2.o ${VIDEODIR}/newgfx.o\ ${VIDEODIR}/newgfx16.o ${VIDEODIR}/newgfx2.o ${VIDEODIR}/newgfx.o\
${VIDEODIR}/m716text.o ${VIDEODIR}/2xsaiw.o\ ${VIDEODIR}/m716text.o ${VIDEODIR}/2xsaiw.o\
${VIDEODIR}/procvid.o ${VIDEODIR}/procvid.o ${VIDEODIR}/sw_draw.o
WINOBJ=${WINDIR}/copyvwin.o ${WINDIR}/sdlintrf.o ${WINDIR}/sdllink.o \ WINOBJ=${WINDIR}/copyvwin.o ${WINDIR}/sdlintrf.o ${WINDIR}/sdllink.o \
@GL_DRAW@ ${WINDIR}/sw_draw.o \ @GL_DRAW@ ${WINDIR}/sw_draw.o \

View File

@@ -101,16 +101,17 @@ static void UnlockSurface(void)
extern DWORD AddEndBytes; extern DWORD AddEndBytes;
extern DWORD NumBytesPerLine; extern DWORD NumBytesPerLine;
extern unsigned char *WinVidMemStart; extern unsigned char *WinVidMemStart;
extern unsigned char MMXSupport;
extern unsigned char NGNoTransp; extern unsigned char NGNoTransp;
extern unsigned char newengen; extern unsigned char newengen;
extern unsigned short resolutn; extern unsigned short resolutn;
extern void copy640x480x16bwin(void); extern void copy640x480x16bwin(void);
extern void ClearWin16 (void);
extern void DrawWin256x224x16(void);
extern void DrawWin320x240x16(void);
/* FIXME: Figure out how to make these locals */ DWORD ScreenPtr;
static DWORD ScreenPtr; DWORD SurfBufD;
static DWORD SurfBufD; DWORD pitch;
static DWORD pitch;
void sw_clearwin() void sw_clearwin()
{ {
@@ -118,22 +119,7 @@ void sw_clearwin()
SurfBufD = (DWORD) surface->pixels; SurfBufD = (DWORD) surface->pixels;
LockSurface(); LockSurface();
__asm__ __volatile__ ( ClearWin16();
" xorl %%eax, %%eax\n" \
" xorl %%ebx, %%ebx\n" \
"Blank2:\n" \
" movl %1, %%ecx\n" \
" rep\n" \
" stosw\n" \
" movl %1, %%edx\n" \
" addl %0, %%edi\n" \
" shll $1, %%edx\n" \
" addl $1, %%ebx\n" \
" subl %%edx, %%edi\n" \
" cmpl %2, %%ebx\n" \
" jne Blank2\n" \
: : "g" (pitch), "g" (SurfaceX), "g" (SurfaceY), "D" (SurfBufD)
: "cc", "memory", "eax", "ebx", "edx", "ecx");
UnlockSurface(); UnlockSurface();
} }
@@ -165,144 +151,9 @@ void sw_drawwin()
} }
if (SurfaceX == 256 && SurfaceY == 224) { if (SurfaceX == 256 && SurfaceY == 224) {
if (MMXSupport){ DrawWin256x224x16();
__asm__ __volatile__ (
" xorl %%eax, %%eax\n" \
"Copying3:\n" \
" movl $32, %%ecx\n" \
"CopyLoop:\n" \
" movq (%%esi), %%mm0\n" \
" movq 8(%%esi), %%mm1\n" \
" movq %%mm0, (%%edi)\n" \
" movq %%mm1, 8(%%edi)\n" \
" addl $16, %%esi\n" \
" addl $16, %%edi\n" \
" decl %%ecx\n" \
" jnz CopyLoop\n" \
" incl %%eax\n" \
" addl %0, %%edi\n" \
" subl $512, %%edi\n" \
" addl $64, %%esi\n" \
" cmpl $223, %%eax\n" \
" jne Copying3\n" \
" xorl %%eax, %%eax\n" \
" movl $128, %%ecx\n" \
" rep\n" \
" stosl\n" \
" emms\n" \
: : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD) : "cc", "memory", "eax", "ecx");
} else {
__asm__ __volatile__ (
" xorl %%eax, %%eax\n" \
"Copying:\n" \
" movl $128, %%ecx\n" \
" rep\n" \
" movsl\n" \
" incl %%eax\n" \
" addl %0, %%edi\n" \
" subl $512, %%edi\n" \
" addl $64, %%esi\n" \
" cmpl $223, %%eax\n" \
" jne Copying\n" \
" xorl %%eax, %%eax\n" \
" movl $128, %%ecx\n" \
" rep\n" \
" stosl\n" \
: : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD)
: "cc", "memory", "eax", "ecx");
}
} else if (SurfaceX == 320 && SurfaceY == 240) { } else if (SurfaceX == 320 && SurfaceY == 240) {
if (MMXSupport) { DrawWin320x240x16();
__asm__ __volatile__ (
" xor %%eax, %%eax\n" \
" xor %%ebx, %%ebx\n" \
"Blank1MMX:\n" \
" mov $160, %%ecx\n" \
" rep\n" \
" stosl\n" \
" subl $160, %%edi\n" \
" addl %0, %%edi\n" \
" addl $1, %%ebx\n" \
" cmpl $8, %%ebx\n" \
" jne Blank1MMX\n" \
" xor %%ebx, %%ebx\n" \
" pxor %%mm0, %%mm0\n" \
"Copying2MMX:\n" \
" mov $4, %%ecx\n" \
"MMXLoopA:\n" \
" movq %%mm0, 0(%%edi)\n" \
" movq %%mm0, 8(%%edi)\n" \
" addl $16, %%edi\n" \
" dec %%ecx\n" \
" jnz MMXLoopA\n" \
" mov $32, %%ecx\n" \
"MMXLoopB:\n" \
" movq 0(%%esi), %%mm1\n" \
" movq 8(%%esi), %%mm2\n" \
" movq %%mm1, 0(%%edi)\n" \
" movq %%mm2, 8(%%edi)\n" \
" addl $16, %%esi\n" \
" addl $16, %%edi\n" \
" decl %%ecx\n" \
" jnz MMXLoopB\n" \
" mov $4, %%ecx\n" \
"MMXLoopC:\n" \
" movq %%mm0, 0(%%edi)\n" \
" movq %%mm0, 8(%%edi)\n" \
" addl $16, %%edi\n" \
" decl %%ecx\n" \
" jnz MMXLoopC\n" \
" incl %%ebx\n" \
" addl %0, %%edi\n" \
" subl $640, %%edi\n" \
" addl $64, %%esi\n" \
" cmpl $223, %%ebx\n" \
" jne Copying2MMX\n" \
" movl $128, %%ecx\n" \
" rep\n" \
" stosl\n" \
" emms\n" \
: : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD)
: "cc", "memory", "eax", "ebx", "ecx");
} else {
__asm__ __volatile__ (
" xorl %%eax, %%eax\n" \
" xorl %%ebx, %%ebx\n" \
"Blank1:\n" \
" movl $160, %%ecx\n" \
" rep\n" \
" stosl\n" \
" subl $640, %%edi\n" \
" addl %0, %%edi\n" \
" addl $1, %%ebx\n" \
" cmpl $8, %%ebx\n" \
"jne Blank1\n" \
" xor %%ebx, %%ebx\n" \
"Copying2:\n" \
" movl $16, %%ecx\n" \
" rep\n" \
" stosl\n" \
" movl $128, %%ecx\n" \
" rep\n" \
" movsl\n" \
" movl $16, %%ecx\n" \
" rep\n" \
" stosl\n" \
" incl %%ebx\n" \
" addl %0, %%edi\n" \
" subl $640, %%edi\n" \
" addl $64, %%esi\n" \
" cmpl $223, %%ebx\n" \
" jne Copying2\n" \
" movl $128, %%ecx\n" \
" rep\n" \
" stosl\n" \
: : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD)
: "cc", "memory", "eax", "ebx", "ecx");
}
} else if(SurfaceX == 512 && SurfaceY == 448) { } else if(SurfaceX == 512 && SurfaceY == 448) {
AddEndBytes = pitch-1024; AddEndBytes = pitch-1024;
NumBytesPerLine = pitch; NumBytesPerLine = pitch;

136
zsnes/src/video/sw_draw.asm Normal file
View File

@@ -0,0 +1,136 @@
;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.
; This file compiles to zero if not OpenBSD, thus it can be
; left in the Makefile.
%include "macros.mac"
ALIGN 32
EXTSYM SurfaceX,SurfaceY
EXTSYM ScreenPtr,SurfBufD
EXTSYM pitch
SECTION .text
NEWSYM ClearWin16
pushad
xor eax,eax
mov edi, [SurfBufD]
xor ebx,ebx
.Blank2:
mov ecx, [SurfaceX]
rep stosw
mov edx, [SurfaceX]
add edi, [pitch]
shl edx,1
add ebx,1
sub edi,edx
cmp ebx, [SurfaceY]
jne .Blank2
popad
ret
NEWSYM DrawWin256x224x16
pushad
push es
mov ax,ds
mov es,ax
xor eax,eax
mov esi, [ScreenPtr]
mov edi, [SurfBufD]
.Copying3:
mov ecx,32
.CopyLoop:
movq mm0,[esi]
movq mm1,[esi+8]
movq [edi],mm0
movq [edi+8],mm1
add esi,16
add edi,16
dec ecx
jnz .CopyLoop
inc eax
add edi, [pitch]
sub edi,512
add esi,64
cmp eax,223
jne .Copying3
xor eax,eax
mov ecx,128
rep stosd
pop es
emms
popad
ret
NEWSYM DrawWin320x240x16
pushad
push es
mov ax,ds
mov es,ax
xor eax,eax
xor ebx,ebx
mov esi, [ScreenPtr]
mov edi, [SurfBufD]
.Blank1MMX:
mov ecx,160
rep stosd
sub edi,160
add edi, [pitch]
add ebx,1
cmp ebx,8
jne .Blank1MMX
xor ebx,ebx
pxor mm0,mm0
.Copying2MMX:
mov ecx,4
.MMXLoopA:
movq [edi+0],mm0
movq [edi+8],mm0
add edi,16
dec ecx
jnz .MMXLoopA
mov ecx,32
.MMXLoopB:
movq mm1,[esi+0]
movq mm2,[esi+8]
movq [edi+0],mm1
movq [edi+8],mm2
add esi,16
add edi,16
dec ecx
jnz .MMXLoopB
mov ecx,4
.MMXLoopC:
movq [edi+0],mm0
movq [edi+8],mm0
add edi,16
dec ecx
jnz .MMXLoopC
inc ebx
add edi, [pitch]
sub edi,640
add esi,64
cmp ebx,223
jne .Copying2MMX
mov ecx,128
rep stosd
pop es
emms
popad
ret