From 38e5d91e111a58d70b09aa544941da3f0eacb2b4 Mon Sep 17 00:00:00 2001 From: stainless <> Date: Tue, 9 Oct 2001 01:42:46 +0000 Subject: [PATCH] Cleaned up 320x480x8B VESA2 blitter in the DOS port. --- zsnes/src/dos/dosintrf.asm | 4 +- zsnes/src/video/copyvid.inc | 223 ++++++++++++++++++++++++++++-------- 2 files changed, 179 insertions(+), 48 deletions(-) diff --git a/zsnes/src/dos/dosintrf.asm b/zsnes/src/dos/dosintrf.asm index 60eb19a2..b47a52f6 100644 --- a/zsnes/src/dos/dosintrf.asm +++ b/zsnes/src/dos/dosintrf.asm @@ -1045,13 +1045,13 @@ NEWSYM GUIINVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 ; Interpolation NEWSYM GUIEAVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 ; Eagle NEWSYM GUIIEVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0 ; (Interp | Eagle) NEWSYM GUIFSVID, db 0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0 ; Full Screen -NEWSYM GUISSVID, db 0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0 ; Small Screen +NEWSYM GUISSVID, db 0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,0 ; Small Screen NEWSYM GUITBVID, db 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0 ; Triple Buffering NEWSYM GUIHSVID, db 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0 ; Half/Quarter Scanlines NEWSYM GUI2xVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 ; 2xSaI/Super Eagle Engines NEWSYM GUIWFVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; If Windows Full Screen NEWSYM GUII2VID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Interpolation -NEWSYM GUIM7VID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 ; Interpolation +NEWSYM GUIM7VID, db 0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0 ; Interpolation NEWSYM GUIBIFIL, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Bilinear Filtering NEWSYM GUITBWVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Triple Buffering (Win) SECTION .text diff --git a/zsnes/src/video/copyvid.inc b/zsnes/src/video/copyvid.inc index 00c33c4b..19d9f371 100644 --- a/zsnes/src/video/copyvid.inc +++ b/zsnes/src/video/copyvid.inc @@ -1044,6 +1044,7 @@ NEWSYM copyvesa2320x240x8b NEWSYM copyvesa2320x480x8bgui mov byte[CurrentGUIOn],1 jmp copyvesa2320x480x8b.nogui + NEWSYM copyvesa2320x480x8b mov byte[CurrentGUIOn],0 .nogui @@ -1066,62 +1067,115 @@ NEWSYM copyvesa2320x480x8b mov dl,[resolutn] dec dl dec dl + cmp byte[smallscreenon],1 + je near .smallscreen cmp byte[scanlines],1 - je near copyvesa2320x480x8bs - cmp byte[CurrentGUIOn],1 - je .loopa + je near .scanlines + ;cmp byte[CurrentGUIOn],1 + cmp byte[GUIOn],1 + je .loopa1 cmp byte[f3menuen],1 - je .loopa - cmp byte[ForceNewGfxOff],0 - jne .loopa - cmp byte[newengen],0 - jne near copyvesa2320x480x8ng -.loopa + je .loopa1 + cmp byte[ForceNewGfxOff],1 + je .loopa1 + cmp byte[newengen],1 + je near copyvesa2320x480x8ng + +.loopa1 + cmp byte[MMXSupport],1 + je .loopb +.loopa2 mov ecx,64 -.a - mov eax,[esi] - mov [es:edi],eax - add esi,4 - add edi,4 - dec ecx - jnz .a - mov ecx,64 - add edi,64 + rep movsd sub esi,256 -.a2r - mov eax,[esi] - mov [es:edi],eax - add esi,4 - add edi,4 - dec ecx - jnz .a2r -.returnloop - add esi,32 - add edi,64 - dec dl - jnz .loopa - pop es - ret - - -copyvesa2320x480x8bs -.loopa + add edi,32*2 mov ecx,64 -.a - mov eax,[esi] - mov [es:edi],eax - add esi,4 - add edi,4 - dec ecx - jnz .a -.returnloop + rep movsd add esi,32 - add edi,64+320 + add edi,32*2 dec dl - jnz .loopa + jnz .loopa2 + jmp .done +.loopb + mov ecx,16 + MMXStuff + sub esi,256 + add edi,32*2 + mov ecx,16 + MMXStuff + add esi,32 + add edi,32*2 + dec dl + jnz .loopb + emms + jmp .done + +.scanlines + cmp byte[MMXSupport],1 + je .sloopb +.sloopa + mov ecx,64 + rep movsd + add esi,32 + add edi,32+320+32 + dec dl + jnz .sloopa + jmp .done +.sloopb + mov ecx,16 + MMXStuff + add esi,32 + add edi,32+320+32 + dec dl + jnz .sloopb + emms + jmp .done + +.smallscreen + add edi,60*320 + cmp byte[MMXSupport],1 + je near .ssloopb +.ssloopa + mov ecx,64 + rep movsd + add esi,32 + add edi,32*2 + mov ecx,64 + rep movsd + sub esi,256 + add edi,32*2 + mov ecx,64 + rep movsd + add esi,32 + add edi,32*2 + dec dl + dec dl + jnz .ssloopa + jmp .done +.ssloopb + mov ecx,16 + MMXStuff + add esi,32 + add edi,32*2 + mov ecx,16 + MMXStuff + sub esi,256 + add edi,32*2 + mov ecx,16 + MMXStuff + add esi,32 + add edi,32*2 + dec dl + dec dl + jnz near .ssloopb + emms + jmp .done + +.done pop es ret + copyvesa2320x480x8ng: mov ebx,1 .loopa @@ -2447,6 +2501,8 @@ NEWSYM copyvesa2320x480x16bgui mov dl,[resolutn] dec dl dec dl + cmp byte[smallscreenon],1 + je near .smallscreen cmp byte[scanlines],3 je near .halfscanlines cmp byte[scanlines],2 @@ -2577,6 +2633,36 @@ NEWSYM copyvesa2320x480x16bgui jnz .loopabhq pop es ret + +.smallscreen + add edi,60*320*2 +.ssloopa + mov ecx,256 + call .ssloopa2 + add esi,32 + add edi,64*2*2 + mov ecx,256 + call .ssloopa2 + sub esi,256 + add edi,64*2*2 + mov ecx,256 + call .ssloopa2 + add esi,32 + add edi,64*2*2 + dec dl + dec dl + jnz .ssloopa + pop es + ret +.ssloopa2 + mov al,[esi] + inc esi + mov bx,[GUICPC+eax*2] + mov [es:edi],bx + add edi,2 + dec ecx + jnz .ssloopa2 + ret %endif NEWSYM ConvertToAFormat @@ -2692,6 +2778,8 @@ NEWSYM copyvesa2320x480x16b mov dl,[resolutn] dec dl dec dl + cmp byte[smallscreenon],1 + je near .smallscreen cmp byte[scanlines],1 je near .scanlines cmp byte[scanlines],3 @@ -2932,6 +3020,49 @@ NEWSYM copyvesa2320x480x16b jnz .mmxr2h2 jmp .returnbh2 +.smallscreen + add edi,60*320*2 + cmp byte[MMXSupport],1 + je near .ssloopb +.ssloopa + mov ecx,64*2 + rep movsd + add esi,32*2 + add edi,32*2*2 + mov ecx,64*2 + rep movsd + sub esi,256*2 + add edi,32*2*2 + mov ecx,64*2 + rep movsd + add esi,32*2 + add edi,32*2*2 + dec dl + dec dl + jnz .ssloopa + jmp .done +.ssloopb + mov ecx,16*2 + MMXStuff + add esi,32*2 + add edi,32*2*2 + mov ecx,16*2 + MMXStuff + sub esi,256*2 + add edi,32*2*2 + mov ecx,16*2 + MMXStuff + add esi,32*2 + add edi,32*2*2 + dec dl + dec dl + jnz near .ssloopb + emms + jmp .done +.done + pop es + ret + ;******************************************************* ; Copy VESA2 640x480x16b Copies buffer to 640x480x16bVB2 ;*******************************************************