Rest of the OpenBSD commits, removes inline assembly from linux/sw_draw.c
This commit is contained in:
@@ -41,7 +41,7 @@ VIDEOBJ=${VIDEODIR}/makev16b.o ${VIDEODIR}/makev16t.o ${VIDEODIR}/makevid.o\
|
||||
${VIDEODIR}/mode7ext.o ${VIDEODIR}/mv16tms.o ${VIDEODIR}/newg162.o\
|
||||
${VIDEODIR}/newgfx16.o ${VIDEODIR}/newgfx2.o ${VIDEODIR}/newgfx.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 \
|
||||
@GL_DRAW@ ${WINDIR}/sw_draw.o \
|
||||
|
||||
@@ -101,16 +101,17 @@ static void UnlockSurface(void)
|
||||
extern DWORD AddEndBytes;
|
||||
extern DWORD NumBytesPerLine;
|
||||
extern unsigned char *WinVidMemStart;
|
||||
extern unsigned char MMXSupport;
|
||||
extern unsigned char NGNoTransp;
|
||||
extern unsigned char newengen;
|
||||
extern unsigned short resolutn;
|
||||
extern void copy640x480x16bwin(void);
|
||||
extern void ClearWin16 (void);
|
||||
extern void DrawWin256x224x16(void);
|
||||
extern void DrawWin320x240x16(void);
|
||||
|
||||
/* FIXME: Figure out how to make these locals */
|
||||
static DWORD ScreenPtr;
|
||||
static DWORD SurfBufD;
|
||||
static DWORD pitch;
|
||||
DWORD ScreenPtr;
|
||||
DWORD SurfBufD;
|
||||
DWORD pitch;
|
||||
|
||||
void sw_clearwin()
|
||||
{
|
||||
@@ -118,22 +119,7 @@ void sw_clearwin()
|
||||
SurfBufD = (DWORD) surface->pixels;
|
||||
|
||||
LockSurface();
|
||||
__asm__ __volatile__ (
|
||||
" 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");
|
||||
ClearWin16();
|
||||
UnlockSurface();
|
||||
}
|
||||
|
||||
@@ -165,144 +151,9 @@ void sw_drawwin()
|
||||
}
|
||||
|
||||
if (SurfaceX == 256 && SurfaceY == 224) {
|
||||
if (MMXSupport){
|
||||
__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");
|
||||
}
|
||||
DrawWin256x224x16();
|
||||
} else if (SurfaceX == 320 && SurfaceY == 240) {
|
||||
if (MMXSupport) {
|
||||
__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");
|
||||
}
|
||||
DrawWin320x240x16();
|
||||
} else if(SurfaceX == 512 && SurfaceY == 448) {
|
||||
AddEndBytes = pitch-1024;
|
||||
NumBytesPerLine = pitch;
|
||||
|
||||
136
zsnes/src/video/sw_draw.asm
Normal file
136
zsnes/src/video/sw_draw.asm
Normal 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
|
||||
Reference in New Issue
Block a user