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}/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 \
|
||||||
|
|||||||
@@ -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
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