;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. EXTSYM GUIOn,HalfTrans EXTSYM ClearScreen EXTSYM Mode7HiRes,mosenng,mosszng,intrlng,mode7hr ;,VESAAddr EXTSYM GUICPC, newgfx16b EXTSYM vesa2_clbitng,vesa2_clbitng2,vesa2_clbitng3 EXTSYM granadd EXTSYM SpecialLine EXTSYM vidbufferofsb EXTSYM Super2xSaI EXTSYM HalfTransB,HalfTransC %include "video/2xSaImmx.inc" SECTION .text %macro FlipCheck 0 cmp byte[FlipWait],0 je %%noflip mov dx,3DAh ;VGA status port in al,dx test al,8 jz %%noflip mov ax,4F07h mov bh,00h mov bl,00h xor cx,cx mov dx,[NextLineStart] mov [LastLineStart],dx int 10h mov byte[FlipWait],0 %%noflip %endmacro NEWSYM ResetTripleBuf mov byte[FlipWait],0 mov dword[VidStartDraw],0 mov byte[CVidStartAd],0 ret GUITripleBuffer: cmp byte[TriplebufTech],0 je near .tech2 cmp byte[ApplyStart],0 je .notstartedb mov byte[ApplyStart],0 cmp word[LastLineStart],0 je .notstartedb mov ax,4F07h mov bh,00h mov bl,00h xor ecx,ecx xor edx,edx int 10h .notstartedb mov byte[FlipWait],0 mov dword[VidStartDraw],0 mov byte[CVidStartAd],0 mov dword[LastLineStart],0 ret .tech2 xor ecx,ecx mov cl,[cvidmode] cmp byte[VidModeComp+ecx],0 je .notbuf cmp byte[Triplebufen],0 je .notbuf jmp .yestbuf .notbuf ret .yestbuf cmp byte[ApplyStart],0 je .notstarted mov ax,4F07h mov bh,00h mov bl,02h xor ecx,ecx xor edx,edx int 10h cmp byte[ApplyStart],4 jne .nocheck cmp al,4Fh jne .failed cmp ah,0 ja .failed .nocheck mov dword[VidStartDraw],0 mov byte[CVidStartAd],0 mov byte[ApplyStart],0 .notstarted ret .failed mov byte[TriplebufTech],1 ret PostTripleBuffer: xor ecx,ecx mov cl,[cvidmode] cmp byte[VidModeComp+ecx],0 je .notbuf cmp byte[Triplebufen],0 je .notbuf jmp .yestbuf .notbuf ret .yestbuf xor ecx,ecx cmp byte[CVidStartAd],2 je .nooffset0 mov cl,[cvidmode] mov ecx,[VidModeSize+ecx*4] cmp byte[CVidStartAd],0 je .nooffset0 add ecx,ecx .nooffset0 mov [VidStartDraw],ecx inc byte[CVidStartAd] cmp byte[CVidStartAd],3 jne .notof mov byte[CVidStartAd],0 .notof ret PreTripleBuffer2: cmp byte[TriplebufTech],0 je near PreTripleBuffer xor ecx,ecx mov cl,[cvidmode] cmp byte[VidModeComp+ecx],0 je .notbuf cmp byte[Triplebufen],0 jne .yestbuf .notbuf ret .yestbuf cmp byte[FlipWait],0 je .noflip mov dx,3DAh ;VGA status port .loop in al,dx test al,8 jz .loop mov ax,4F07h mov bh,00h mov bl,00h xor cx,cx mov dx,[NextLineStart] mov [LastLineStart],dx int 10h mov byte[FlipWait],0 .noflip xor ecx,ecx cmp byte[CVidStartAd],2 je .nooffset0 mov cl,[cvidmode] mov ecx,[VidModeLine+ecx*4] cmp byte[CVidStartAd],0 je .nooffset0 add ecx,ecx .nooffset0 mov [NextLineStart],ecx mov byte[ApplyStart],1 mov byte[FlipWait],1 ret PreTripleBuffer: xor ecx,ecx mov cl,[cvidmode] cmp byte[VidModeComp+ecx],0 je .notbuf cmp byte[Triplebufen],0 jne .yestbuf .notbuf ret .yestbuf cmp byte[ApplyStart],2 jne .noflip .notflipped ; *** I have no idea why this code doesn't work (freezes on NVidia cards) ; mov ax,4F07h ; mov bx,04h ; int 10h ; or ah,ah ; jnz .noflip ; or cx,cx ; jz .notflipped .noflip mov ax,4F07h mov bh,00h mov bl,02h xor ecx,ecx cmp byte[CVidStartAd],0 je .nooffset0 mov cl,[cvidmode] mov ecx,[VidModeSize+ecx*4] cmp byte[CVidStartAd],1 je .nooffset0 add ecx,ecx .nooffset0 xor edx,edx int 10h cmp byte[ApplyStart],4 jne .nocheck cmp al,4Fh jne .failed cmp ah,0 ja .failed mov byte[ApplyStart],0 .nocheck cmp byte[ApplyStart],2 je .skipcheckb inc byte[ApplyStart] .skipcheckb ret .failed mov byte[Triplebufen],0 ret VidModeSize dd 0,0,320*240,320*240*2,640*480,640*480*2,512*384,512*384*2 dd 0,320*480,320*480*2 VidModeLine dd 0,0,240,240,480,480,384,384 dd 0,480,480 NEWSYM VidStartDraw, dd 0 VidModeComp db 0,0,1,1,1,1,1,1,0,1,1 CVidStartAd db 0 ApplyStart db 4 NEWSYM NextLineStart, dd 0 NEWSYM LastLineStart, dd 0 NEWSYM FlipWait, db 0 NEWSYM TriplebufTech, db 0 NEWSYM DosDrawScreen cmp byte[curblank],40h je .nocopy call PreTripleBuffer2 call PostTripleBuffer .nocopy call ScreenShow FlipCheck ret NEWSYM DosDrawScreenB cmp byte[curblank],40h je .nocopy call GUITripleBuffer .nocopy call ScreenShow ret ScreenShow: cmp byte[debugdisble],0 je .debug cmp byte[cvidmode],1 je near copymodeq .debug cmp byte[cvidmode],2 je near copyvesa2320x240x8b cmp byte[cvidmode],3 je near copyvesa2320x240x16b cmp byte[cvidmode],4 je near copyvesa2640x480x8b cmp byte[cvidmode],5 je near copyvesa2640x480x16b cmp byte[cvidmode],6 je near copyvesa2512x384x8b cmp byte[cvidmode],7 je near copyvesa2512x384x16b cmp byte[cvidmode],8 je near copyvesa12640x480x16b cmp byte[cvidmode],9 je near copyvesa2320x480x8b cmp byte[cvidmode],10 je near copyvesa2320x480x16b cmp byte[cvidmode],0 je near copymodex cmp byte[curblank],40h je .startcopy inc byte[curfps2] ; call sounddisplay call hextestoutput .startcopy jmp copymodeq NEWSYM dosvidpastecopyscr cmp byte[curblank],40h je .nocopy call GUITripleBuffer .nocopy call ScreenShowGUI ret ScreenShowGUI: cmp byte[cvidmode],1 je near copymodeq cmp byte[cvidmode],2 je near copyvesa2320x240x8b cmp byte[cvidmode],3 je near copyvesa2320x240x16bgui cmp byte[cvidmode],4 je near copyvesa2640x480x8bgui cmp byte[cvidmode],5 je near copyvesa2640x480x16bgui cmp byte[cvidmode],6 je near copyvesa2512x384x8b cmp byte[cvidmode],7 je near copyvesa2512x384x16bgui cmp byte[cvidmode],8 je near copyvesa12640x480x16bgui cmp byte[cvidmode],9 je near copyvesa2320x480x8bgui cmp byte[cvidmode],10 je near copyvesa2320x480x16bgui cmp byte[cvidmode],0 je near copymodex jmp copymodeq ;******************************************************* ; CopyModeX Copies buffer into unchained 320x240 ;******************************************************* NEWSYM copymodex cmp byte[curblank],40h jne .startcopy ret .startcopy ; select plane 1 mov dx,03C4h mov ax,0102h ; set as plane 1 out dx,ax push es mov ax,[selcA000] mov es,ax mov esi,[vidbuffer] mov edi,8 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*80+8 .res239 add esi,16+256+32 cmp byte[whichpage],0 jne .pageb add edi,19200 .pageb mov [.startesi],esi mov [.startedi],edi mov dl,[resolutn] dec dl dec dl .loopa mov ecx,16 .loopb mov ah,[esi+12] mov al,[esi+8] shl eax,16 mov ah,[esi+4] mov al,[esi+0] mov [es:edi],eax add esi,16 add edi,4 dec ecx jnz .loopb add esi,32 add edi,16 dec dl jnz .loopa mov dx,03C4h mov ax,0202h ; set as plane 2 out dx,ax mov esi,[.startesi] inc esi mov edi,[.startedi] mov dl,[resolutn] dec dl dec dl .loopa2 mov ecx,16 .loopb2 mov ah,[esi+12] mov al,[esi+8] shl eax,16 mov ah,[esi+4] mov al,[esi+0] mov [es:edi],eax add esi,16 add edi,4 dec ecx jnz .loopb2 add esi,32 add edi,16 dec dl jnz .loopa2 mov dx,03C4h mov ax,0402h ; set as plane 3 out dx,ax mov esi,[.startesi] add esi,2 mov edi,[.startedi] mov dl,[resolutn] dec dl dec dl .loopa3 mov ecx,16 .loopb3 mov ah,[esi+12] mov al,[esi+8] shl eax,16 mov ah,[esi+4] mov al,[esi+0] mov [es:edi],eax add esi,16 add edi,4 dec ecx jnz .loopb3 add esi,32 add edi,16 dec dl jnz .loopa3 mov dx,03C4h mov ax,0802h ; set as plane 4 out dx,ax mov esi,[.startesi] add esi,3 mov edi,[.startedi] mov dl,[resolutn] dec dl dec dl .loopa4 mov ecx,16 .loopb4 mov ah,[esi+12] mov al,[esi+8] shl eax,16 mov ah,[esi+4] mov al,[esi+0] mov [es:edi],eax add esi,16 add edi,4 dec ecx jnz .loopb4 add esi,32 add edi,16 dec dl jnz .loopa4 pop es cmp byte[whichpage],0 jne .setpageb mov dx,03D4h mov al,0Ch out dx,al inc dx mov al,75 out dx,al dec dx mov al,0Dh out dx,al inc dx xor al,al out dx,al mov byte[whichpage],1 ret .setpageb mov dx,03D4h mov al,0Ch out dx,al inc dx xor al,al out dx,al dec dx mov al,0Dh out dx,al inc dx xor al,al out dx,al mov byte[whichpage],0 ret .startesi dd 0 .startedi dd 0 NEWSYM whichpage, db 0 ; active page and visual page locations ;******************************************************* ; CopyModeQ Copies buffer into chained 256x256 ;******************************************************* NEWSYM copymodeq cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov ax,[selcA000] mov es,ax mov esi,[vidbuffer] mov ebp,[vidbufferm] mov edi,9*256 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,17*256 .res239 add esi,16+256+32 add ebp,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[FPUCopy],2 je near .loopc .loopa mov ecx,64 rep movsd add esi,32 dec dl jnz .loopa pop es ret .loopc mov ecx,16 MMXStuff add esi,32 dec dl jnz .loopc emms pop es ret ;******************************************************* ; Copy VESA2 320x240x8b Copies buffer to 320x240x8bVBE2 ;******************************************************* ; Input: AX = 4F07h VBE Set/Get Display Start Control ; BH = 00h Reserved and must be 00h ; BL = 00h Set Display Start ; = 01h Get Display Start ; = 80h Set Display Start during Vertical ; Retrace ; CX = First Displayed Pixel In Scan Line ; (Set Display Start only) ; DX = First Displayed Scan Line (Set Display Start ; only) NEWSYM copyvesa2320x240x8b cmp byte[curblank],40h jne .startcopy ret .startcopy cmp byte[ScreenScale],1 je near .scalescreen push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320+32 .res239 add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[FPUCopy],1 je .loopb cmp byte[FPUCopy],2 je near .loopc .loopa mov ecx,64 rep movsd add esi,32 add edi,64 dec dl jnz .loopa pop es ret .loopb CopyFPU add esi,32 add edi,64 dec dl jnz near .loopa pop es ret .loopc mov ecx,16 MMXStuff add esi,32 add edi,64 dec dl jnz .loopc emms pop es ret .scalescreen push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] xor edi,edi cmp word[resolutn],224 jne .res239b mov edi,8*320 .res239b add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl .loopab mov ecx,64 .loopbbb mov eax,[esi] mov [es:edi],al mov [es:edi+1],eax add esi,4 add edi,5 dec ecx jnz .loopbbb add esi,32 dec dl jnz .loopab pop es ret ;******************************************************* ; Copy VESA2 320x480x8b Copies buffer to 320x480x8bVBE2 ;******************************************************* NEWSYM copyvesa2320x480x8bgui mov byte[CurrentGUIOn],1 jmp copyvesa2320x480x8b.nogui NEWSYM copyvesa2320x480x8b mov byte[CurrentGUIOn],0 .nogui cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320+32 .res239 add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[scanlines],1 je near copyvesa2320x480x8bs cmp byte[CurrentGUIOn],1 je .loopa cmp byte[f3menuen],1 je .loopa cmp byte[ForceNewGfxOff],0 jne .loopa cmp byte[newengen],0 jne near copyvesa2320x480x8ng .loopa 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 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 mov ecx,64 .a mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .a .returnloop add esi,32 add edi,64+320 dec dl jnz .loopa pop es ret copyvesa2320x480x8ng: mov ebx,1 .loopa cmp dword[ignor512],0 je .ignore test byte[intrlng+ebx],01h jnz near .interlaced .ignore cmp byte[Mode7HiRes],0 je .nomode7hires test byte[mosenng+ebx],1 jz .yesmode7hires cmp byte[mosszng+ebx],0 jne .nomode7hires .yesmode7hires test byte[intrlng+ebx],40h jnz .nomode7hires cmp byte[BGMA+ebx],7 jne .nomode7hires cmp byte[BGMA+ebx+1],7 je near .mode7hires .nomode7hires 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 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 inc ebx dec dl jnz near .loopa pop es ret .mode7hires mov ecx,64 .a7 mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .a7 mov ecx,64 add edi,64 add esi,75036-256 .a2r7 mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .a2r7 sub esi,75036 jmp .returnloop .interlaced test byte[cfield],1 jz .b add edi,320 .b mov ecx,64 .ai mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .ai test byte[cfield],1 jnz .bi add edi,320 .bi jmp .returnloop ;******************************************************* ; Copy VESA2 640x480x8b Copies buffer to 640x480x8bVBE2 ;******************************************************* ALIGN32 NEWSYM EagleHold, dd 0 NEWSYM smallscreenon, dd 0 NEWSYM smallscreence, dd 0 NEWSYM CurrentGUIOn, dd 0 vesavaland dd 0,0 mmxvalanda dd 11111111110000001111111111000000b,11111111110000001111111111000000b mmxvalandb dd 00000000000111110000000000011111b,00000000000111110000000000011111b NEWSYM copyvesa2640x480x8bgui mov byte[CurrentGUIOn],1 cmp byte[smallscreenon],1 je near smallscreen640x480x8b cmp byte[ScreenScale],1 je near smallscreen640x480x8b.fullscreen cmp byte[antienab],1 je near proceagle cmp byte[scanlines],1 je near copyvesa2640x480x8bs mov byte[res640],1 cmp byte[curblank],40h jne .startcopy ret .startcopy jmp copyvesa2640x480x8b.startcopy2 NEWSYM copyvesa2640x480x8b mov byte[CurrentGUIOn],0 cmp byte[smallscreenon],1 je near smallscreen640x480x8b cmp byte[ScreenScale],1 je near smallscreen640x480x8b.fullscreen cmp byte[antienab],1 je near proceagle cmp byte[scanlines],1 je near copyvesa2640x480x8bs mov byte[res640],1 cmp byte[curblank],40h jne .startcopy ret .startcopy cmp byte[f3menuen],1 je .startcopy2 cmp byte[ForceNewGfxOff],0 jne .startcopy2 cmp byte[newengen],0 jne near copyvesa2640x480x8ng .startcopy2 mov dword[ignor512],0 push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*640+32*2 .res239 add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov ebx,hirestiledat+1 mov dl,[resolutn] dec dl dec dl .loopa cmp byte[Triplebufen],1 je .ignorehr cmp byte[ebx],1 je near .yeshires .ignorehr mov ecx,128 .a mov al,[esi+1] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a mov ecx,128 add edi,64*2 sub esi,256 .a2r mov al,[esi+1] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a2r .returnloop add esi,32 add edi,64*2 inc ebx dec dl jnz .loopa pop es cmp byte[Triplebufen],1 je .ignorehr2 xor byte[res512switch],1 .ignorehr2 ret .yeshires mov byte[ebx],0 test byte[res512switch],1 jnz .rightside mov ecx,256 .b mov al,[esi] mov [es:edi],al mov [es:edi+640],al inc esi add edi,2 dec ecx jnz .b add edi,640 jmp .returnloop .rightside mov ecx,256 .b2 mov al,[esi] mov [es:edi+1],al mov [es:edi+641],al inc esi add edi,2 dec ecx jnz .b2 add edi,640 jmp .returnloop NEWSYM copyvesa2640x480x8ng push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*640+32*2 .res239 add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov ebx,1 mov dl,[resolutn] dec dl dec dl .loopa mov ecx,256 cmp dword[ignor512],0 je .ignore test byte[intrlng+ebx],01h jnz near .interlaced cmp byte[BGMA+ebx],5 je near .hires cmp byte[BGMA+ebx],6 je near .hires cmp byte[Mode7HiRes],0 je .nomode7hires test byte[mosenng+ebx],1 jz .yesmode7hires cmp byte[mosszng+ebx],0 jne .nomode7hires .yesmode7hires test byte[intrlng+ebx],40h jnz .nomode7hires cmp byte[BGMA+ebx],7 jne .nomode7hires cmp byte[BGMA+ebx+1],7 je near .mode7hires .nomode7hires .ignore mov ecx,128 .a mov al,[esi+1] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a mov ecx,128 add edi,64*2 sub esi,256 .a2r mov al,[esi+1] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a2r .returnloop add esi,32 add edi,64*2 ;+640 inc ebx dec dl jnz near .loopa mov dword[ignor512],0 pop es ret .hires mov ecx,128 .a3 mov al,[esi+1] mov ah,[esi+75037] shl eax,16 mov al,[esi] mov ah,[esi+75036] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a3 add edi,64*2 sub esi,256 mov ecx,128 .a6 mov al,[esi+1] mov ah,[esi+75037] shl eax,16 mov al,[esi] mov ah,[esi+75036] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a6 jmp .returnloop .interlaced mov ecx,128 cmp byte[BGMA+ebx],5 je .hiresi cmp byte[BGMA+ebx],6 je .hiresi test byte[cfield],1 jz .b add edi,640 .b .a2 mov al,[esi+1] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a2 test byte[cfield],1 jnz .bi add edi,640 .bi jmp .returnloop .hiresi test byte[cfield],1 jz .b2 add edi,640 .b2 .a4 mov al,[esi+1] mov ah,[esi+75037] shl eax,16 mov al,[esi] mov ah,[esi+75036] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a4 test byte[cfield],1 jnz .bi2 add edi,640 .bi2 jmp .returnloop .mode7hires cmp byte[mode7hr+ebx],1 je near .mode7hiresb mov ecx,128 .a7 mov al,[esi+1] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a7 mov ecx,128 add edi,64*2 add esi,75036-256 .a7r mov al,[esi+1] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a7r sub esi,75036 jmp .returnloop .mode7hiresb mov ecx,64 .a7hr mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .a7hr mov ecx,64 add esi,75036*2-256 .a7hrb mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .a7hrb sub esi,75036*2 add edi,64*2 add esi,75036-256 mov ecx,64 .a7hrr mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .a7hrr mov ecx,64 add esi,75036*2-256 .a7hrbr mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .a7hrbr sub esi,75036*3 jmp .returnloop NEWSYM smallscreen640x480x8b mov byte[res640],0 cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*640+32*2 .res239 add edi,[VidStartDraw] add edi,128+120*640 add esi,16+256+32 xor eax,eax mov ebx,hirestiledat+1 mov dl,[resolutn] dec dl dec dl .loopa mov ecx,64 rep movsd add esi,32 add edi,640-256 inc ebx dec dl jnz .loopa pop es ret .fullscreen cmp byte[curblank],40h jne .startcopy2 ret .startcopy2 push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] xor edi,edi cmp word[resolutn],224 jne .res239b mov edi,8*640 .res239b add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov ebx,hirestiledat+1 mov dl,[resolutn] dec dl dec dl cmp byte[scanlines],1 je near .scanlines .loopa3 mov ecx,128 .loopa2 mov al,[esi] mov [es:edi],al mov [es:edi+1],al mov [es:edi+640],al mov [es:edi+641],al mov al,[esi+1] mov [es:edi+2],al mov [es:edi+3],al mov [es:edi+4],al mov [es:edi+642],al mov [es:edi+643],al mov [es:edi+644],al add esi,2 add edi,5 dec ecx jnz .loopa2 add esi,32 add edi,640 inc ebx dec dl jnz .loopa3 pop es ret .scanlines .loopa5 mov ecx,128 .loopa4 mov al,[esi] mov [es:edi],al mov [es:edi+1],al mov al,[esi+1] mov [es:edi+2],al mov [es:edi+3],al mov [es:edi+4],al add esi,2 add edi,5 dec ecx jnz .loopa4 add esi,32 add edi,640 inc ebx dec dl jnz .loopa5 pop es ret NEWSYM copyvesa2640x480x8bs cmp byte[curblank],40h jne .startcopy ret .startcopy mov byte[res640],2 push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*640+32*2 .res239 add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov ebx,hirestiledat+1 mov dl,[resolutn] dec dl dec dl cmp byte[CurrentGUIOn],1 je .loopa cmp byte[ForceNewGfxOff],0 jne .loopa cmp byte[newengen],0 jne near copyvesa2640x480x8bsng .loopa cmp byte[Triplebufen],1 je .ignorehr cmp byte[ebx],1 je .yeshires .ignorehr mov ecx,256 .a mov al,[esi] mov [es:edi],al mov [es:edi+1],al inc esi add edi,2 dec ecx jnz .a .returnloop add esi,32 add edi,64*2+640 inc ebx dec dl jnz .loopa pop es cmp byte[Triplebufen],1 je .ignorehr2 xor byte[res512switch],1 .ignorehr2 ret .yeshires mov byte[ebx],0 test byte[res512switch],1 jnz .rightside mov ecx,256 .b mov al,[esi] mov [es:edi],al inc esi add edi,2 dec ecx jnz .b jmp .returnloop .rightside mov ecx,256 .b2 mov al,[esi] mov [es:edi+1],al inc esi add edi,2 dec ecx jnz .b2 jmp .returnloop copyvesa2640x480x8bsng: xor ebx,ebx .loopa cmp byte[BGMA+ebx],5 je near .hires cmp byte[BGMA+ebx],6 je near .hires mov ecx,128 .a mov al,[esi+1] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a .returnloop add esi,32 add edi,64*2+640 inc ebx dec dl jnz .loopa pop es xor byte[res512switch],1 ret .hires mov ecx,128 .a2 mov al,[esi+1] mov ah,[esi+75037] shl eax,16 mov al,[esi] mov ah,[esi+75036] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a2 jmp .returnloop NEWSYM proceagle mov byte[res640],0 cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] add esi,16+256+32 mov dl,237 mov edi,32*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*640+32*2 add edi,[VidStartDraw] mov dl,222 .res239 call draweagle pop es ret NEWSYM draweagle ; copies a buffer from esi to es:edi with dl # of lines ; This only works under vesa 2 640x480x8b mode mov [lineleft],dl ; copy the first line directly mov ecx,128 .drawnext mov al,[esi] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .drawnext dec byte[lineleft] add edi,128 ; 512 + 128 = 640 add esi,32 ; There are 32 extra pixels in the buffer used ; for clipping xor eax,eax xor ebx,ebx mov edx,[spritetablea] .drawloop ; process EAGLE on the bottom line ; process the first pixel ; copy to the left pixel mov al,[esi] mov [edx],al ; draw the right pixel depending on the pixels right & below mov al,[esi+1] mov ah,al mov bx,[esi+288] cmp ebx,eax je .matchf mov al,[esi] .matchf mov [edx+1],al inc esi add edx,2 ; Start drawing the in-between pixels mov ecx,256-2 mov bx,[esi+287] .lineloopd ; draw the left pixel depending on the pixels left & below mov al,[esi-1] mov ah,al cmp ebx,eax je .matchlp mov al,[esi] .matchlp mov [edx],al ; draw the right pixel depending on the pixels right & below mov al,[esi+1] mov ah,al mov bx,[esi+288] cmp ebx,eax je .matchrp mov al,[esi] .matchrp mov [edx+1],al ;increment the addresses add edx,2 inc esi dec ecx jnz .lineloopd ; process the last pixel ; draw the left pixel depending on the pixels left & below mov al,[esi-1] mov ah,al mov bx,[esi+287] cmp ebx,eax je .matchl mov al,[esi] .matchl mov [edx],al ; copy to the right pixel mov al,[esi] mov [edx+1],al inc esi sub edx,510 mov ecx,128 .copyloop mov eax,[edx] mov [es:edi],eax add edx,4 add edi,4 loop .copyloop xor eax,eax ; process EAGLE on the upper line add edi,128 add esi,32 mov edx,[spritetablea] ; process the first pixel ; copy to the left pixel mov al,[esi] mov [edx],al ; draw the right pixel depending on the pixels right & above mov al,[esi+1] mov ah,al mov bx,[esi-288] cmp ebx,eax je .matchf2 mov al,[esi] .matchf2 mov [edx+1],al inc esi add edx,2 ; Start drawing the in-between pixels mov ecx,256-2 mov bx,[esi-289] .lineloopd2 ; draw the left pixel depending on the pixels left & above mov al,[esi-1] mov ah,al cmp ebx,eax je .matchlp2 mov al,[esi] .matchlp2 mov [edx],al ; draw the right pixel depending on the pixels right & below mov al,[esi+1] mov ah,al mov bx,[esi-288] cmp ebx,eax je .matchrp2 mov al,[esi] .matchrp2 mov [edx+1],al ;increment the addresses add edx,2 inc esi dec ecx jnz .lineloopd2 ; process the last pixel ; draw the left pixel depending on the pixels left & above mov al,[esi-1] mov ah,al mov bx,[esi-289] cmp ebx,eax je .matchl2 mov al,[esi] .matchl2 mov [edx],al ; copy to the right pixel mov al,[esi] mov [edx+1],al inc esi sub edx,510 mov ecx,128 .copyloop2 mov eax,[edx] mov [es:edi],eax add edx,4 add edi,4 loop .copyloop2 xor eax,eax sub esi,256 ; move esi back to left side of the line add edi,128 dec byte[lineleft] jnz near .drawloop ; copy the last line directly mov ecx,128 .drawlast mov al,[esi] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .drawlast ret ;******************************************************* ; Copy VESA2 512x384x8b Copies buffer to 512x384x8bVBE2 ;******************************************************* NEWSYM copyvesa2512x384x8b cmp byte[curblank],40h jne .startcopy ret .startcopy cmp byte[ForceNewGfxOff],0 jne .nong16b cmp byte[newengen],0 jne near copyvesa2512x384x8ng .nong16b mov dword[ignor512],0 push es mov byte[.lastrep],0 mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov byte[.scratio],61 ; 60.6695 cmp word[resolutn],224 jne .res239 mov byte[.scratio],72 ; 72.4286 .res239 mov edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov ebx,hirestiledat+1 mov dl,[resolutn] dec dl dec dl xor dh,dh .loopa mov al,[ebx] mov [.p512],al cmp byte[Triplebufen],1 je .ignorehr cmp al,1 je .yeshires .ignorehr mov ecx,128 .a mov al,[esi+1] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a .returnloop cmp byte[.lastrep],1 je .no2 sub dh,[.scratio] jnc .no2 add dh,100 sub esi,256 mov al,[.p512] mov [ebx],al inc dl dec ebx mov byte[.lastrep],1 jmp .yes2 .no2 mov byte[.lastrep],0 add esi,32 .yes2 inc ebx dec dl jnz .loopa pop es cmp byte[Triplebufen],1 je .ignorehr2 xor byte[res512switch],1 .ignorehr2 ret .yeshires mov byte[ebx],0 test byte[res512switch],1 jnz .rightside mov ecx,256 .b mov al,[esi] mov [es:edi],al inc esi add edi,2 dec ecx jnz .b jmp .returnloop .rightside mov ecx,256 .b2 mov al,[esi] mov [es:edi+1],al inc esi add edi,2 dec ecx jnz .b2 jmp .returnloop .scratio db 0 .lastrep db 0 .p512 db 0 NEWSYM copyvesa2512x384x8ng push es mov byte[.lastrep],0 mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov byte[.scratio],61 ; 60.6695 cmp word[resolutn],224 jne .res239 mov byte[.scratio],72 ; 72.4286 .res239 mov edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov ebx,1 mov dl,[resolutn] dec dl dec dl xor dh,dh .loopa cmp dword[ignor512],0 je .a2 cmp byte[BGMA+ebx],5 je near .hires cmp byte[BGMA+ebx],6 je near .hires .a2 mov ecx,128 .a mov al,[esi+1] mov ah,al shl eax,16 mov al,[esi] mov ah,al mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a .returnloop cmp byte[.lastrep],1 je .no2 sub dh,[.scratio] jnc .no2 add dh,100 sub esi,256 mov al,[.p512] mov [ebx],al inc dl dec ebx mov byte[.lastrep],1 jmp .yes2 .no2 mov byte[.lastrep],0 add esi,32 .yes2 inc ebx dec dl jnz near .loopa pop es mov dword[ignor512],0 ret .hires mov ecx,256 .b mov al,[esi] mov ah,[esi+75036] mov [es:edi],ax inc esi add edi,2 dec ecx jnz .b jmp .returnloop .scratio db 0 .lastrep db 0 .p512 db 0 ;******************************************************* ; Copy VESA2 320x240x16b Copies buffer to 320x240x16bVB2 ;******************************************************* copyvesa2320x240x16bgui: cmp byte[curblank],40h jne .startcopy ret .startcopy cmp byte[ScreenScale],1 je near .scalescreen push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320*2+32*2 .res239 add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl .loopa mov ecx,256 xor eax,eax .loopa2 mov al,[esi] inc esi mov bx,[GUICPC+eax*2] mov [es:edi],bx add edi,2 dec ecx jnz .loopa2 add esi,32 add edi,128 dec dl jnz .loopa pop es ret .scalescreen push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] xor edi,edi cmp word[resolutn],224 jne .res239b mov edi,8*320*2 .res239b add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl .loopab mov ecx,64 xor eax,eax .loopbb mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx mov al,[esi+1] mov bx,[GUICPC+eax*2] mov [es:edi+4],bx mov al,[esi+2] mov bx,[GUICPC+eax*2] mov [es:edi+6],bx mov al,[esi+3] mov bx,[GUICPC+eax*2] mov [es:edi+8],bx add esi,4 add edi,10 dec ecx jnz .loopbb add esi,32 dec dl jnz .loopab pop es ret NEWSYM copyvesa2320x240x16b cmp byte[vesa2red10],1 jne .notbr call ConvertToAFormat .notbr ; je near copyvesa2320x240x16br cmp byte[curblank],40h jne .startcopy ret .startcopy cmp byte[ScreenScale],1 je near .scalescreen push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov ebp,[vidbufferm] mov edi,32*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320*2+32*2 .res239 add edi,[VidStartDraw] add esi,16*2+256*2+32*2 add ebp,16*2+256*2+32*2 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[FPUCopy],1 je .loopb cmp byte[FPUCopy],2 je near .loopc .loopa mov ecx,128 rep movsd add esi,64 add edi,128 dec dl jnz .loopa pop es ret .loopb CopyFPU CopyFPU add esi,64 add edi,128 dec dl jnz near .loopb pop es ret .loopc mov ecx,32 MMXStuff add esi,64 add edi,128 dec dl jnz .loopc emms pop es ret .scalescreen push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] xor edi,edi cmp word[resolutn],224 jne .res239b mov edi,8*320*2 .res239b add edi,[VidStartDraw] add esi,16*2+256*2+32*2 xor eax,eax mov dl,[resolutn] dec dl dec dl .loopab mov ecx,64 .loopbb mov eax,[esi] mov [es:edi],ax mov [es:edi+2],eax mov eax,[esi+4] mov [es:edi+6],eax add esi,8 add edi,10 dec ecx jnz .loopbb add esi,64 dec dl jnz .loopab pop es ret NEWSYM palresvalng, dd 0,0 NEWSYM palresvalngb, dd 0,0 %macro copya320x240 0 mov [es:edi],dx %endmacro %macro copyb320x240 0 mov [es:edi+2],dx %endmacro ALIGN32 NEWSYM rescompareng, dd 0 NEWSYM nextdrawallng, dd 0 NEWSYM prevcol0ng, dd 0 NEWSYM numbytelng, dd 0 NEWSYM lineleft, dd 0 NEWSYM lineleft2, dd 0 bankpos dd 0 ;******************************************************* ; Copy VESA2 320x480x16b Copies buffer to 320x480x16bVB2 ;******************************************************* NEWSYM copyvesa2320x480x16bgui cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320*2+32*2 .res239 add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[scanlines],3 je near .halfscanlines cmp byte[scanlines],2 je near .quarterscanlines cmp byte[scanlines],1 je near .scanlines .loopa mov ecx,256 xor eax,eax .a mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx inc esi add edi,2 dec ecx jnz .a sub esi,256 add edi,64*2 mov ecx,256 xor eax,eax .a2 mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx inc esi add edi,2 dec ecx jnz .a2 add esi,32 add edi,64*2 dec dl jnz .loopa pop es ret .scanlines .loopab mov ecx,256 xor eax,eax .ab mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx inc esi add edi,2 dec ecx jnz .ab .returnb add esi,32 add edi,64*2+320*2 dec dl jnz .loopab pop es ret .halfscanlines .loopabh mov ecx,256 xor eax,eax .abh mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx inc esi add edi,2 dec ecx jnz .abh add edi,64*2 mov ecx,128 sub esi,256 .abh2 mov al,[esi+1] mov bx,[GUICPC+eax*2] mov al,[esi] shl ebx,16 mov bx,[GUICPC+eax*2] and ebx,[vesa2_clbitng2] shr ebx,1 mov [es:edi],ebx add esi,2 add edi,4 dec ecx jnz .abh2 add esi,32 add edi,64*2 dec dl jnz .loopabh pop es ret .quarterscanlines .loopabhq mov ecx,256 xor eax,eax .abhq mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx inc esi add edi,2 dec ecx jnz .abhq add edi,64*2 mov ecx,128 sub esi,256 .abh2q mov al,[esi+1] mov bx,[GUICPC+eax*2] mov al,[esi] shl ebx,16 mov bx,[GUICPC+eax*2] and ebx,[vesa2_clbitng2] shr ebx,1 mov eax,ebx and eax,[vesa2_clbitng2] shr eax,1 add ebx,eax mov [es:edi],ebx xor eax,eax add esi,2 add edi,4 dec ecx jnz .abh2q add esi,32 add edi,64*2 dec dl jnz .loopabhq pop es ret NEWSYM ConvertToAFormat cmp byte[GUIOn],1 je .nonewgfx cmp byte[newengen],0 je .nonewgfx ret .nonewgfx mov eax,[vesa2_clbitng2] mov ebx,eax and eax,11111111110000001111111111000000b and ebx,00000000000111110000000000011111b or eax,ebx mov [vesavaland],eax mov [vesavaland+4],eax mov esi,[vidbuffer] add esi,16*2+256*2+32*2 mov dl,[resolutn] dec dl dec dl cmp byte[FPUCopy],2 je near .mmxconv .crgbloop mov ecx,128 .crgbloop2 mov eax,[esi] mov ebx,eax and eax,11111111110000001111111111000000b and ebx,00000000000111110000000000011111b shr eax,1 or ebx,eax mov [esi],ebx add esi,4 loop .crgbloop2 add esi,64 dec dl jnz .crgbloop jmp .nocopyvesa2r .mmxconv .crgbloopm mov ecx,64 movq mm6,[mmxvalanda] movq mm7,[mmxvalandb] .crgbloop2m movq mm0,[esi] movq mm1,mm0 pand mm0,mm6 pand mm1,mm7 psrlw mm0,1 por mm0,mm1 movq [esi],mm0 add esi,8 loop .crgbloop2m add esi,64 dec dl jnz .crgbloopm emms .nocopyvesa2r ret NEWSYM UnConvertToAFormat mov esi,[vidbuffer] add esi,16*2+256*2+32*2 mov dl,[resolutn] dec dl dec dl .crgbloop mov ecx,128 .crgbloop2 mov eax,[esi] mov ebx,eax and eax,01111111111000000111111111100000b and ebx,00000000000111110000000000011111b shl eax,1 or ebx,eax mov [esi],ebx add esi,4 loop .crgbloop2 add esi,64 dec dl jnz .crgbloop ret NEWSYM copyvesa2320x480x16b cmp byte[curblank],40h jne .startcopy ret .startcopy mov eax,[vesa2_clbitng2] mov [vesavaland],eax mov [vesavaland+4],eax cmp byte[vesa2red10],1 jne .nocopyvesa2r call ConvertToAFormat .nocopyvesa2r push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320*2+32*2 .res239 add edi,[VidStartDraw] add esi,16*2+256*2+32*2 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[scanlines],1 je near .scanlines cmp byte[scanlines],3 je near .halfscanlines cmp byte[scanlines],2 je near .quartscanlines .loopa mov ecx,128 cmp byte[FPUCopy],2 je near .mmx rep movsd sub esi,256*2 add edi,64*2 mov ecx,128 rep movsd .return add esi,64 add edi,64*2 inc ebx dec dl jnz .loopa pop es cmp byte[FPUCopy],2 je .mmx2 ret .mmx2 emms ret .mmx mov ecx,32 .mmxr movq mm0,[esi] movq mm1,[esi+8] movq [es:edi],mm0 movq [es:edi+8],mm1 add esi,16 add edi,16 dec ecx jnz .mmxr sub esi,16*32 add edi,64*2 mov ecx,32 .mmxr2 movq mm0,[esi] movq mm1,[esi+8] movq [es:edi],mm0 movq [es:edi+8],mm1 add esi,16 add edi,16 dec ecx jnz .mmxr2 jmp .return .scanlines .loopab mov ecx,128 cmp byte[FPUCopy],2 je near .mmxsl .ab mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .ab .returnb add esi,64 add edi,64*2+320*2 inc ebx dec dl jnz .loopab pop es cmp byte[FPUCopy],2 je near .mmx2 ret .mmxsl mov ecx,32 .mmxrsl movq mm0,[esi] movq mm1,[esi+8] movq [es:edi],mm0 movq [es:edi+8],mm1 add esi,16 add edi,16 dec ecx jnz .mmxrsl jmp .returnb .halfscanlines .loopabh cmp byte[FPUCopy],2 je near .mmxslh mov ecx,128 .abh mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .abh mov ecx,128 sub esi,512 add edi,64*2 .abhs mov eax,[esi] and eax,[vesavaland] shr eax,1 mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .abhs .returnbh add esi,64 add edi,64*2 inc ebx dec dl jnz .loopabh pop es cmp byte[FPUCopy],2 je near .mmx2 ret .mmxslh mov ecx,32 add eax,512 .mmxrslh movq mm0,[esi] movq mm1,[esi+8] movq [es:edi],mm0 movq [es:edi+8],mm1 add esi,16 add edi,16 dec ecx jnz .mmxrslh mov ecx,16 sub esi,512 add eax,512 add edi,64*2 movq mm4,[vesavaland] .mmxr2h movq mm0,[esi] movq mm1,[esi+8] movq mm2,[esi+16] movq mm3,[esi+24] pand mm0,mm4 pand mm1,mm4 pand mm2,mm4 pand mm3,mm4 psrlw mm0,1 psrlw mm1,1 psrlw mm2,1 psrlw mm3,1 movq [es:edi],mm0 movq [es:edi+8],mm1 movq [es:edi+16],mm2 movq [es:edi+24],mm3 add esi,32 add edi,32 dec ecx jnz .mmxr2h jmp .returnbh .quartscanlines mov [lineleft],dl .loopabh2 cmp byte[FPUCopy],2 je near .mmxslh2 mov ecx,128 .abh2 mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .abh2 mov ecx,128 sub esi,512 add edi,64*2 .abhs2 mov eax,[esi] and eax,[vesavaland] shr eax,1 mov edx,eax and edx,[vesavaland] shr edx,1 add eax,edx mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .abhs2 .returnbh2 add esi,64 add edi,64*2 inc ebx dec byte[lineleft] jnz near .loopabh2 pop es cmp byte[FPUCopy],2 je near .mmx2 ret .mmxslh2 mov ecx,32 add eax,512 .mmxrslh2 movq mm0,[esi] movq mm1,[esi+8] movq [es:edi],mm0 movq [es:edi+8],mm1 add esi,16 add edi,16 dec ecx jnz .mmxrslh2 mov ecx,32 sub esi,512 add edi,64*2 movq mm4,[vesavaland] .mmxr2h2 movq mm0,[esi] movq mm1,[esi+8] pand mm0,mm4 pand mm1,mm4 psrlw mm0,1 psrlw mm1,1 movq mm2,mm0 movq mm3,mm1 pand mm2,mm4 pand mm3,mm4 psrlw mm2,1 psrlw mm3,1 paddd mm0,mm2 paddd mm1,mm3 movq [es:edi],mm0 movq [es:edi+8],mm1 add esi,16 add edi,16 dec ecx jnz .mmxr2h2 jmp .returnbh2 ;******************************************************* ; Copy VESA2 640x480x16b Copies buffer to 640x480x16bVB2 ;******************************************************* %macro copya640x480 0 mov [es:edi],dx mov [es:edi+2],dx mov [es:edi+640*2],dx mov [es:edi+640*2+2],dx %endmacro %macro copyb640x480 0 mov [es:edi+4],dx mov [es:edi+6],dx mov [es:edi+640*2+4],dx mov [es:edi+640*2+6],dx %endmacro %macro copya640x480sl 0 mov [es:edi],dx mov [es:edi+2],dx %endmacro %macro copyb640x480sl 0 mov [es:edi+4],dx mov [es:edi+6],dx %endmacro %macro precheckvesa12 1 cmp edx,%1 ja %%a mov ecx,edx %%a %endmacro %macro postcheckvesa12 4 cmp edx,%3 ja %%a call VESA12Bankswitch mov ecx,%3 sub ecx,edx add edx,%4 or ecx,ecx jz %%a jmp %1 %%a sub edx,%3 sub edx,%2 jg %%nobankswitch add edx,%4 call VESA12Bankswitch %%nobankswitch %endmacro NEWSYM copyvesa12640x480x16bgui cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov word[bankpos],0 call VESA12Bankswitch mov ax,[selcA000] mov es,ax mov esi,[vidbuffer] mov edi,32*2*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320*2*2+32*2*2 .res239 add esi,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl mov [lineleft],dl mov edx,65536 sub edx,edi shr edx,2 cmp byte[smallscreenon],1 je near .smallscreen cmp byte[scanlines],1 je near .scanlines .loopa mov ecx,256 xor eax,eax precheckvesa12 256 .a mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx inc esi add edi,4 dec ecx jnz .a postcheckvesa12 .a,64,256,16384 sub esi,256 add edi,128*2 mov ecx,256 xor eax,eax precheckvesa12 256 .a2 mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx inc esi add edi,4 dec ecx jnz .a2 postcheckvesa12 .a2,64,256,16384 add esi,32 add edi,128*2 dec byte[lineleft] jnz near .loopa pop es ret .scanlines .loopa2 mov ecx,256 xor eax,eax precheckvesa12 256 .ab mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx inc esi add edi,4 dec ecx jnz .ab postcheckvesa12 .ab,64+320,256,16384 add esi,32 add edi,128*2+640*2 dec byte[lineleft] jnz near .loopa2 pop es ret .smallscreen add edx,edx .loopa3 mov ecx,256 xor eax,eax precheckvesa12 256 .ac mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx inc esi add edi,2 dec ecx jnz .ac postcheckvesa12 .ac,128+256,256,32768 add esi,32 add edi,128*2+256*2 dec byte[lineleft] jnz near .loopa3 pop es ret VESA12Bankswitch: pushad mov ax,4F05h mov bx,0 mov dx,[bankpos] int 10h mov ax,[granadd] add word[bankpos],ax popad sub edi,65536 ret NEWSYM copyvesa2640x480x16bgui je near smallscreen640x480x16bgui.fullscreen cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320*2*2+32*2*2 .res239 add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[scanlines],3 je near .halfscanlines cmp byte[scanlines],2 je near .quarterscanlines cmp byte[scanlines],1 je near .scanlines .loopa mov ecx,256 xor eax,eax .a mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx inc esi add edi,4 dec ecx jnz .a sub esi,256 add edi,128*2 mov ecx,256 xor eax,eax .a2 mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx inc esi add edi,4 dec ecx jnz .a2 add esi,32 add edi,128*2 dec dl jnz .loopa pop es ret .scanlines .loopab mov ecx,256 xor eax,eax .ab mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx inc esi add edi,4 dec ecx jnz .ab .returnb add esi,32 add edi,128*2+640*2 dec dl jnz .loopab pop es ret .halfscanlines .loopabh mov ecx,256 xor eax,eax .abh mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx inc esi add edi,4 dec ecx jnz .abh add edi,128*2 mov ecx,256 sub esi,256 .abh2 mov al,[esi] mov bx,[GUICPC+eax*2] shl ebx,16 mov bx,[GUICPC+eax*2] and ebx,[vesa2_clbitng2] shr ebx,1 mov [es:edi],ebx inc esi add edi,4 dec ecx jnz .abh2 add esi,32 add edi,128*2 dec dl jnz .loopabh pop es ret .quarterscanlines .loopabhq mov ecx,256 xor eax,eax .abhq mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx inc esi add edi,4 dec ecx jnz .abhq add edi,128*2 mov ecx,256 sub esi,256 .abh2q mov al,[esi] mov bx,[GUICPC+eax*2] shl ebx,16 mov bx,[GUICPC+eax*2] and ebx,[vesa2_clbitng2] shr ebx,1 mov eax,ebx and eax,[vesa2_clbitng2] shr eax,1 add ebx,eax mov [es:edi],ebx xor eax,eax inc esi add edi,4 dec ecx jnz .abh2q add esi,32 add edi,128*2 dec dl jnz .loopabhq pop es ret NEWSYM smallscreen640x480x16bgui cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*640*2+32*2*2 .res239 add edi,[VidStartDraw] add edi,128*2+120*640*2 add esi,16+256+32 xor eax,eax mov ebx,hirestiledat+1 mov dl,[resolutn] dec dl dec dl .loopa mov ecx,256 xor eax,eax .a3 mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx inc esi add edi,2 dec ecx jnz .a3 add esi,32 add edi,640*2-256*2 inc ebx dec dl jnz .loopa pop es ret .fullscreen cmp byte[curblank],40h jne .startcopy2 ret .startcopy2 push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] xor edi,edi cmp word[resolutn],224 jne .res239b mov edi,8*320*2*2 .res239b add edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[scanlines],1 je near .scanlines .loopa2 mov ecx,128 xor eax,eax .a mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx mov al,[esi+1] mov bx,[GUICPC+eax*2] mov [es:edi+4],bx mov [es:edi+6],bx mov [es:edi+8],bx add esi,2 add edi,10 dec ecx jnz .a sub esi,256 mov ecx,128 .a2 mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx mov al,[esi+1] mov bx,[GUICPC+eax*2] mov [es:edi+4],bx mov [es:edi+6],bx mov [es:edi+8],bx add esi,2 add edi,10 dec ecx jnz .a2 add esi,32 dec dl jnz near .loopa2 pop es ret .scanlines .loopab mov ecx,128 xor eax,eax .ab mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx mov al,[esi+1] mov bx,[GUICPC+eax*2] mov [es:edi+4],bx mov [es:edi+6],bx mov [es:edi+8],bx add esi,2 add edi,10 dec ecx jnz .ab add esi,32 add edi,640*2 dec dl jnz .loopab pop es ret NEWSYM copyvesa2640x480x16b ; cmp byte[vesa2red10],1 ; je near copyvesa2640x480x16br cmp byte[vesa2red10],1 jne .notbr call ConvertToAFormat ; call UnConvertToAFormat .notbr cmp byte[smallscreenon],1 je near smallscreen640x480x16b cmp byte[ScreenScale],1 je near smallscreen640x480x16b.fullscreen cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320*2*2+32*2*2 .res239 add edi,[VidStartDraw] add esi,16*2+256*2+32*2 xor eax,eax ; Check if interpolation mode cmp byte[GUIOn],1 je .nointerp cmp byte[FPUCopy],2 jne .nommx cmp byte[newgfx16b],0 je .nommx cmp byte[En2xSaI],0 jne near Process2xSaI .nommx cmp byte[antienab],1 je near interpolate640x480x16b .nointerp mov dl,[resolutn] dec dl dec dl cmp byte[scanlines],1 je near .scanlines cmp byte[scanlines],3 je near .halfscanlines cmp byte[scanlines],2 je near .quartscanlines mov ebx,hirestiledat+1 cmp byte[newengen],0 je .loopa mov ebx,SpecialLine+1 .loopa mov ecx,256 cmp byte[Triplebufen],1 je .ignorehr cmp byte[ebx],1 je near .yeshires cmp byte[GUIOn],1 je .ignorehr cmp byte[ebx],1 ja near .yeshiresng .ignorehr cmp byte[FPUCopy],2 je near .mmx .a mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a sub esi,256*2 add edi,128*2 mov ecx,256 .a2 mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a2 .return add esi,64 add edi,128*2 inc ebx dec dl jnz near .loopa pop es cmp byte[Triplebufen],1 je .ignorehr2 xor byte[res512switch],1 .ignorehr2 cmp byte[FPUCopy],2 je .mmx2 ret .mmx2 emms ret .yeshires mov byte[ebx],0 test byte[res512switch],1 jnz .rightside .b mov ax,[esi] mov [es:edi],ax mov [es:edi+1280],ax add esi,2 add edi,4 dec ecx jnz .b add edi,640*2 jmp .return .rightside .c mov ax,[esi] mov [es:edi+2],ax mov [es:edi+1282],ax add esi,2 add edi,4 dec ecx jnz .c add edi,640*2 jmp .return .mmx mov eax,[spritetablea] mov ecx,64 add eax,512 .mmxr movq mm0,[esi] movq mm1,mm0 punpcklwd mm0,mm1 movq [es:edi],mm0 punpckhwd mm1,mm1 movq [es:edi+8],mm1 movq [eax],mm0 movq [eax+8],mm1 add esi,8 add edi,16 add eax,16 dec ecx jnz .mmxr .nextmmx mov eax,[spritetablea] mov ecx,32 add eax,512 add edi,128*2 .mmxr2 movq mm0,[eax] movq [es:edi],mm0 movq mm1,[eax+8] movq [es:edi+8],mm1 movq mm2,[eax+16] movq [es:edi+16],mm2 movq mm3,[eax+24] movq [es:edi+24],mm3 add eax,32 add edi,32 dec ecx jnz .mmxr2 jmp .return .yeshiresng call HighResProc jmp .return .scanlines mov ebx,hirestiledat+1 cmp byte[GUIOn],1 je .loopab cmp byte[newengen],0 je .loopab mov ebx,SpecialLine+1 .loopab mov ecx,256 cmp byte[Triplebufen],1 je .ignorehrb cmp byte[ebx],1 je .yeshiresb cmp byte[ebx],1 jbe .ignorehrb call HighResProc jmp .returnb .ignorehrb cmp byte[FPUCopy],2 je near .mmxsl .ab mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .ab .returnb add esi,64 add edi,128*2+640*2 inc ebx dec dl jnz .loopab pop es cmp byte[Triplebufen],1 je .ignorehr2b xor byte[res512switch],1 .ignorehr2b cmp byte[FPUCopy],2 je near .mmx2 ret .yeshiresb mov byte[ebx],0 test byte[res512switch],1 jnz .rightsideb .bb mov ax,[esi] mov [es:edi],ax add esi,2 add edi,4 dec ecx jnz .bb jmp .returnb .rightsideb .cb mov ax,[esi] mov [es:edi+2],ax add esi,2 add edi,4 dec ecx jnz .cb jmp .returnb .mmxsl mov ecx,64 .mmxrsl movq mm0,[esi] movq mm1,mm0 punpcklwd mm0,mm1 punpckhwd mm1,mm1 movq [es:edi],mm0 movq [es:edi+8],mm1 add esi,8 add edi,16 add eax,16 dec ecx jnz .mmxrsl jmp .returnb .halfscanlines mov ebx,hirestiledat+1 cmp byte[GUIOn],1 je .loopabh cmp byte[newengen],0 je .loopabh mov ebx,SpecialLine+1 .loopabh cmp byte[ebx],1 jbe .ignorehrbh call HighResProc jmp .returnbh .ignorehrbh cmp byte[FPUCopy],2 je near .mmxslh mov ecx,256 .abh mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .abh mov ecx,256 sub esi,512 add edi,128*2 .abhs mov ax,[esi] shl eax,16 mov ax,[esi] and eax,[vesa2_clbitng2] shr eax,1 mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .abhs .returnbh add esi,64 add edi,128*2 inc ebx dec dl jnz near .loopabh pop es cmp byte[FPUCopy],2 je near .mmx2 ret .mmxslh mov eax,[spritetablea] mov ecx,64 add eax,512 .mmxrslh movq mm0,[esi] movq mm1,mm0 punpcklwd mm0,mm1 punpckhwd mm1,mm1 movq [es:edi],mm0 movq [es:edi+8],mm1 movq [eax],mm0 movq [eax+8],mm1 add esi,8 add edi,16 add eax,16 dec ecx jnz .mmxrslh mov eax,[spritetablea] mov ecx,32 add eax,512 add edi,128*2 movq mm4,[vesa2_clbitng2] .mmxr2h movq mm0,[eax] movq mm1,[eax+8] movq mm2,[eax+16] movq mm3,[eax+24] pand mm0,mm4 pand mm1,mm4 pand mm2,mm4 pand mm3,mm4 psrlw mm0,1 psrlw mm1,1 psrlw mm2,1 psrlw mm3,1 movq [es:edi],mm0 movq [es:edi+8],mm1 movq [es:edi+16],mm2 movq [es:edi+24],mm3 add eax,32 add edi,32 dec ecx jnz .mmxr2h jmp .returnbh .quartscanlines mov [lineleft],dl mov ebx,hirestiledat+1 cmp byte[GUIOn],1 je .loopabh2 cmp byte[newengen],0 je .loopabh2 mov ebx,SpecialLine+1 .loopabh2 cmp byte[ebx],1 jbe .ignorehrbh2 call HighResProc jmp .returnbh2 .ignorehrbh2 cmp byte[FPUCopy],2 je near .mmxslh2 mov ecx,256 .abh2 mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .abh2 mov ecx,256 sub esi,512 add edi,128*2 .abhs2 mov ax,[esi] shl eax,16 mov ax,[esi] and eax,[vesa2_clbitng2] shr eax,1 mov edx,eax and edx,[vesa2_clbitng2] shr edx,1 add eax,edx mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .abhs2 .returnbh2 add esi,64 add edi,128*2 inc ebx dec byte[lineleft] jnz near .loopabh2 pop es cmp byte[FPUCopy],2 je near .mmx2 ret .mmxslh2 mov eax,[spritetablea] mov ecx,64 add eax,512 .mmxrslh2 movq mm0,[esi] movq mm1,mm0 punpcklwd mm0,mm1 punpckhwd mm1,mm1 movq [es:edi],mm0 movq [es:edi+8],mm1 movq [eax],mm0 movq [eax+8],mm1 add esi,8 add edi,16 add eax,16 dec ecx jnz .mmxrslh2 mov eax,[spritetablea] mov ecx,64 add eax,512 add edi,128*2 movq mm4,[vesa2_clbitng2] .mmxr2h2 movq mm0,[eax] movq mm1,[eax+8] pand mm0,mm4 pand mm1,mm4 psrlw mm0,1 psrlw mm1,1 movq mm2,mm0 movq mm3,mm1 pand mm2,mm4 pand mm3,mm4 psrlw mm2,1 psrlw mm3,1 paddd mm0,mm2 paddd mm1,mm3 movq [es:edi],mm0 movq [es:edi+8],mm1 add eax,16 add edi,16 dec ecx jnz .mmxr2h2 jmp .returnbh2 HighResProc: mov ecx,256 cmp byte[ebx],3 je near .hiresmode7 cmp byte[ebx],7 je near .hiresmode7 test byte[ebx],4 jz .nofield cmp byte[scanlines],0 jne .nofield test byte[cfield],1 jz .nofield add edi,640*2 .nofield test byte[ebx],3 jnz near .hires .a mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a cmp byte[scanlines],0 jne .nofield test byte[cfield],1 jnz .nofielde add edi,640*2 .nofielde ret .hiresmode7 cmp byte[FPUCopy],2 je .yeshiresngmmxmode7 .a2 mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a2 add edi,128*2 sub esi,512 mov ecx,256 add esi,75036*4 .a2b mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a2b sub esi,75036*4 ret .yeshiresngmmxmode7 mov ecx,64 .mmxr movq mm0,[esi] movq mm1,mm0 punpcklwd mm0,mm1 movq [es:edi],mm0 punpckhwd mm1,mm1 movq [es:edi+8],mm1 add esi,8 add edi,16 add eax,16 dec ecx jnz .mmxr add edi,128*2 sub esi,512 add esi,75036*4 mov ecx,64 .mmxrb movq mm0,[esi] movq mm1,mm0 punpcklwd mm0,mm1 movq [es:edi],mm0 punpckhwd mm1,mm1 movq [es:edi+8],mm1 add esi,8 add edi,16 add eax,16 dec ecx jnz .mmxrb sub esi,75036*4 ret .hires cmp byte[FPUCopy],2 je near .yeshiresngmmx .bng mov eax,[esi+75036*4-2] mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .bng test byte[ebx],4 jz .nofieldb cmp byte[scanlines],0 jne .nofieldb test byte[cfield],1 jnz .lowerfield add edi,640*2 .lowerfield ret .nofieldb cmp byte[scanlines],1 je near .scanlines cmp byte[scanlines],3 je near .halfscanlines cmp byte[scanlines],2 je near .quartscanlines add edi,128*2 sub esi,256*2 mov ecx,256 .bngb mov eax,[esi+75036*4-2] mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .bngb ret .scanlines ret .yeshiresngmmx mov eax,[spritetablea] mov ecx,64 add eax,512 .ngal movq mm0,[esi] movq mm1,[esi+75036*4] movq mm2,mm0 punpcklwd mm0,mm1 movq [es:edi],mm0 punpckhwd mm2,mm1 movq [es:edi+8],mm2 movq [eax],mm0 movq [eax+8],mm2 add esi,8 add edi,16 add eax,16 dec ecx jnz .ngal test byte[ebx],4 jz .nofieldc cmp byte[scanlines],0 jne .nofieldc test byte[cfield],1 jnz .lowerfieldb add edi,640*2 .lowerfieldb ret .nofieldc cmp byte[scanlines],1 je near .scanlines cmp byte[scanlines],3 je near .halfscanlinesmmx cmp byte[scanlines],2 je near .quartscanlinesmmx test byte[ebx+1],3 jz .noaa cmp byte[En2xSaI],0 jne near .antialias cmp byte[antienab],0 jne near .antialias .noaa add edi,128*2 mov eax,[spritetablea] mov ecx,32 add eax,512 .mmxr2 movq mm0,[eax] movq [es:edi],mm0 movq mm1,[eax+8] movq [es:edi+8],mm1 movq mm2,[eax+16] movq [es:edi+16],mm2 movq mm3,[eax+24] movq [es:edi+24],mm3 add eax,32 add edi,32 dec ecx jnz .mmxr2 ret .antialias add edi,128*2 mov eax,[spritetablea] mov ecx,64 add eax,512 movq mm4,[vesa2_clbitng2] sub esi,256*2 .mmxr2aa movq mm0,[esi+288*2] movq mm1,[esi+288*2+75036*4] movq mm2,mm0 punpcklwd mm0,mm1 punpckhwd mm2,mm1 movq mm1,[eax] movq mm3,[eax+8] pand mm0,mm4 pand mm1,mm4 pand mm2,mm4 pand mm3,mm4 psrlw mm0,1 psrlw mm1,1 psrlw mm2,1 psrlw mm3,1 paddd mm0,mm1 paddd mm2,mm3 movq [es:edi],mm0 movq [es:edi+8],mm2 add eax,16 add edi,16 add esi,8 dec ecx jnz .mmxr2aa ret .halfscanlines add edi,128*2 sub esi,256*2 mov ecx,256 .abhs mov eax,[esi+75036*4-2] mov ax,[esi] and eax,[vesa2_clbitng2] shr eax,1 mov edx,eax mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .abhs ret .quartscanlines add edi,128*2 sub esi,256*2 mov ecx,256 .abhs2 mov eax,[esi+75036*4-2] mov ax,[esi] and eax,[vesa2_clbitng2] shr eax,1 mov edx,eax and edx,[vesa2_clbitng2] shr edx,1 add eax,edx mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .abhs2 ret .halfscanlinesmmx mov eax,[spritetablea] mov ecx,32 add eax,512 add edi,128*2 movq mm4,[vesa2_clbitng2] .mmxr2h movq mm0,[eax] movq mm1,[eax+8] movq mm2,[eax+16] movq mm3,[eax+24] pand mm0,mm4 pand mm1,mm4 pand mm2,mm4 pand mm3,mm4 psrlw mm0,1 psrlw mm1,1 psrlw mm2,1 psrlw mm3,1 movq [es:edi],mm0 movq [es:edi+8],mm1 movq [es:edi+16],mm2 movq [es:edi+24],mm3 add eax,32 add edi,32 dec ecx jnz .mmxr2h ret .quartscanlinesmmx mov eax,[spritetablea] mov ecx,64 add eax,512 add edi,128*2 movq mm4,[HalfTransC] .mmxr2h2 movq mm0,[eax] movq mm1,[eax+8] pand mm0,mm4 pand mm1,mm4 psrlw mm0,1 psrlw mm1,1 movq mm2,mm0 movq mm3,mm1 pand mm2,mm4 pand mm3,mm4 psrlw mm2,1 psrlw mm3,1 paddd mm0,mm2 paddd mm1,mm3 movq [es:edi],mm0 movq [es:edi+8],mm1 add eax,16 add edi,16 dec ecx jnz .mmxr2h2 ret Process2xSaI: mov ebx,hirestiledat+1 cmp byte[GUIOn],1 je .loopabi cmp byte[newengen],0 je .loopabi mov ebx,SpecialLine+1 .loopabi mov [InterPtr],ebx ; add edi,[VESAAddr] mov dl,[resolutn] sub dl,2 ; Compensate for top/bottom line + 2 lines in 2xSaI mov byte[lineleft],dl mov dword[esi+512],0 mov dword[esi+512+576*2],0 mov ebx,[vidbufferofsb] add ebx,288*2 .next mov dword[esi+512+576*3],0 mov eax,[InterPtr] cmp byte[eax],1 jbe .ignorehr push ebx mov ebx,[InterPtr] call HighResProc pop ebx push ebx mov ecx,144 .nextb mov dword[ebx],0FFFFFFFFh add ebx,4 loop .nextb pop ebx jmp .returninterp .ignorehr ;srcPtr equ 8 ;deltaPtr equ 12 ;srcPitch equ 16 ;width equ 20 ;dstOffset equ 24 ;dstPitch equ 28 ;dstSegment equ 32 cmp byte[En2xSaI],3 je .super2xsai mov eax,1280 ; destination pitch push eax mov eax,edi ; destination offset push eax mov eax,256 ; width push eax mov eax,576 ; source pitch push eax push ebx mov eax,esi ; source pointer push eax cmp byte[En2xSaI],2 je .supereagle call _2xSaILine jmp .normal .supereagle call _2xSaISuperEagleLine jmp .normal .super2xsai pushad mov eax,1280 ; destination pitch push eax mov eax,[spritetablea] ; destination offset add eax,512 push eax mov eax,256 ; width push eax mov eax,576 ; source pitch push eax push ebx mov eax,esi ; source pointer push eax call Super2xSaI add esp,24 popad ; blit to screen mov eax,edi mov edx,[spritetablea] add edx,512 mov ecx,128 .s2xsailoop movq mm0,[edx] movq [es:eax],mm0 add edx,8 add eax,8 loop .s2xsailoop mov edx,[spritetablea] add edx,512+1280 add eax,128*2 mov ecx,128 .s2xsailoop2 movq mm0,[edx] movq [es:eax],mm0 add edx,8 add eax,8 loop .s2xsailoop2 jmp .dones2xsai .normal add esp,24 .dones2xsai add esi,576 inc dword[InterPtr] add edi,1280*2 add ebx,576 dec dword[lineleft] jnz near .next mov ecx,256 sub edi,640*2 .loop mov dword[es:edi],0 add edi,4 loop .loop emms pop es ret .returninterp add esi,64 inc dword[InterPtr] add edi,128*2 dec byte[lineleft] jnz near .next emms pop es ret NEWSYM smallscreen640x480x16b cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,32*2*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*640*2+32*2*2 .res239 add edi,[VidStartDraw] add edi,128*2+120*640*2 add esi,16*2+256*2+32*2 xor eax,eax mov ebx,hirestiledat+1 mov dl,[resolutn] dec dl dec dl .loopa mov ecx,128 rep movsd add esi,32*2 add edi,640*2-256*2 inc ebx dec dl jnz .loopa pop es ret .fullscreen cmp byte[curblank],40h jne .startcopy2 ret .startcopy2 cmp byte[GUIOn],1 je .nointerpolat cmp byte[antienab],1 jne .nointerpolat cmp byte[FPUCopy],2 je near MMXInterpolFS .nointerpolat push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] xor edi,edi cmp word[resolutn],224 jne .res239b mov edi,8*320*2*2 .res239b add edi,[VidStartDraw] add esi,16*2+256*2+32*2 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[scanlines],1 je near .scanlines .loopa2 mov ecx,128 .a mov ax,[esi] mov [es:edi],ax mov [es:edi+2],ax mov ax,[esi+2] mov [es:edi+4],ax mov [es:edi+6],ax mov [es:edi+8],ax add esi,4 add edi,10 dec ecx jnz .a sub esi,256*2 mov ecx,128 .a2 mov ax,[esi] mov [es:edi],ax mov [es:edi+2],ax mov ax,[esi+2] mov [es:edi+4],ax mov [es:edi+6],ax mov [es:edi+8],ax add esi,4 add edi,10 dec ecx jnz .a2 add esi,64 inc ebx dec dl jnz .loopa2 pop es ret .scanlines .loopab mov ecx,128 .ab mov ax,[esi] mov [es:edi],ax mov [es:edi+2],ax mov ax,[esi+2] mov [es:edi+4],ax mov [es:edi+6],ax mov [es:edi+8],ax add esi,4 add edi,10 dec ecx jnz .ab add esi,64 add edi,640*2 inc ebx dec dl jnz .loopab pop es ret MMXInterpolFS: push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] add esi,16*2+256*2+32*2 xor edi,edi add edi,[VidStartDraw] mov dword[lineleft2],0FFFFh cmp word[resolutn],224 jne .res239 mov dword[lineleft2],14 .res239 mov dl,[resolutn] dec dl dec dl dec dl movq mm2,[HalfTrans] mov [lineleft],dl mov edx,[spritetablea] mov ecx,64 mov eax,[esi+510] add edx,512 mov [esi+512],eax .a2 movq mm0,[esi] movq mm4,mm0 movq mm1,[esi+2] pand mm0,mm2 pand mm1,mm2 psrlw mm0,1 psrlw mm1,1 paddd mm0,mm1 movq mm5,mm4 ; mm4/mm5 contains original values, mm0 contains mixed values punpcklwd mm4,mm0 punpckhwd mm5,mm0 ; movq [es:edi],mm4 ; movq [es:edi+8],mm5 movq [edx],mm4 movq [edx+8],mm5 add esi,8 add edi,16 add edx,16 dec ecx jnz .a2 add esi,64 add edi,128*2 .a5 mov eax,[esi+510] mov ecx,32 mov [esi+512],eax mov edx,[spritetablea] add edx,512 ; Process next line .a3 ; aaaa/abbb/bbcc/cccd/dddd/ ; aaaa/bbbA/ccBb/dCcc/Dddd/ ; a / a >> 48, b << 16 / b >> 48, b >> 32 & 0xFFFF0000, c << 32 / ; c >> 32, c >> 16 & 0xFFFF00000000, d << 48 / d >> 16, d &0xFFFF000000000000 movq mm0,[esi] movq mm4,mm0 movq mm1,[esi+2] pand mm0,mm2 pand mm1,mm2 psrlw mm0,1 psrlw mm1,1 paddd mm0,mm1 movq mm5,mm4 punpcklwd mm4,mm0 punpckhwd mm5,mm0 movq mm6,[edx] movq mm7,[edx+8] movq [edx],mm4 movq [edx+8],mm5 pand mm6,mm2 pand mm7,mm2 pand mm4,mm2 pand mm5,mm2 psrlw mm6,1 psrlw mm7,1 psrlw mm4,1 psrlw mm5,1 paddd mm4,mm6 paddd mm5,mm7 movq [es:edi],mm4 movq [.interpspad],mm4 movq [.interpspad+8],mm5 movq mm4,[.interpspad+6] movq [es:edi+8],mm4 movq [.interpspad+6],mm5 movq mm0,[esi+8] movq mm4,mm0 movq mm1,[esi+10] pand mm0,mm2 pand mm1,mm2 psrlw mm0,1 psrlw mm1,1 paddd mm0,mm1 movq mm5,mm4 punpcklwd mm4,mm0 punpckhwd mm5,mm0 movq mm6,[edx+16] movq mm7,[edx+24] movq [edx+16],mm4 movq [edx+24],mm5 pand mm6,mm2 pand mm7,mm2 pand mm4,mm2 pand mm5,mm2 psrlw mm6,1 psrlw mm7,1 psrlw mm4,1 psrlw mm5,1 paddd mm4,mm6 paddd mm5,mm7 movq [.interpspad+16],mm4 movq mm7,[.interpspad+12] movq [es:edi+16],mm7 movq [.interpspad+14],mm4 movq [.interpspad+24],mm5 movq mm7,[.interpspad+18] movq [es:edi+24],mm7 movq [.interpspad+22],mm5 movq mm7,[.interpspad+24] movq [es:edi+32],mm7 add esi,16 add edi,40 add edx,32 dec ecx jnz near .a3 ; add edi,128*2 mov edx,[spritetablea] add edx,512 mov ecx,32 .a4 movq mm4,[edx] movq mm5,[edx+8] movq [es:edi],mm4 movq [.interpspad],mm4 movq [.interpspad+8],mm5 movq mm4,[.interpspad+6] movq [es:edi+8],mm4 movq [.interpspad+6],mm5 movq mm4,[edx+16] movq mm5,[edx+24] movq [.interpspad+16],mm4 movq mm7,[.interpspad+12] movq [es:edi+16],mm7 movq [.interpspad+14],mm4 movq [.interpspad+24],mm5 movq mm7,[.interpspad+18] movq [es:edi+24],mm7 movq [.interpspad+22],mm5 movq mm7,[.interpspad+24] movq [es:edi+32],mm7 add edi,40 add edx,32 dec ecx jnz near .a4 add esi,64 ; add edi,128*2 dec dword[lineleft2] cmp dword[lineleft2],0 jne near .norepeat mov dword[lineleft2],14 mov edx,[spritetablea] add edx,512 mov ecx,32 .a6 movq mm4,[edx] movq mm5,[edx+8] movq [es:edi],mm4 movq [.interpspad],mm4 movq [.interpspad+8],mm5 movq mm4,[.interpspad+6] movq [es:edi+8],mm4 movq [.interpspad+6],mm5 movq mm4,[edx+16] movq mm5,[edx+24] movq [.interpspad+16],mm4 movq mm7,[.interpspad+12] movq [es:edi+16],mm7 movq [.interpspad+14],mm4 movq [.interpspad+24],mm5 movq mm7,[.interpspad+18] movq [es:edi+24],mm7 movq [.interpspad+22],mm5 movq mm7,[.interpspad+24] movq [es:edi+32],mm7 add edi,40 add edx,32 dec ecx jnz near .a6 ; add edi,128*2 .norepeat dec byte[lineleft] jnz near .a5 emms pop es ret ALIGN32 .interpspad dd 0,0,0,0,0,0,0,0 MMXInterpol: mov dl,[resolutn] dec dl dec dl dec dl movq mm2,[HalfTransC] mov ebx,hirestiledat+1 cmp byte[GUIOn],1 je .loopab cmp byte[newengen],0 je .loopab mov ebx,SpecialLine+1 .loopab cmp byte[scanlines],1 je near .scanlines cmp byte[scanlines],2 je near .scanlinesquart cmp byte[scanlines],3 je near .scanlineshalf inc ebx mov [lineleft],dl ; do scanlines mov edx,[spritetablea] mov ecx,64 mov eax,[esi+510] add edx,512 mov [esi+512],eax .a2 movq mm0,[esi] movq mm3,mm0 movq mm4,mm0 movq mm1,[esi+2] pand mm3,mm1 pand mm0,mm2 pand mm1,mm2 psrlw mm0,1 psrlw mm1,1 paddd mm0,mm1 pand mm3,[HalfTransB] paddw mm0,mm3 movq mm5,mm4 ; mm4/mm5 contains original values, mm0 contains mixed values punpcklwd mm4,mm0 punpckhwd mm5,mm0 movq [es:edi],mm4 movq [es:edi+8],mm5 movq [edx],mm4 movq [edx+8],mm5 add esi,8 add edi,16 add edx,16 dec ecx jnz .a2 add esi,64 add edi,128*2 .a5 cmp byte[ebx],1 jbe .ignorehr call HighResProc movq mm2,[HalfTransC] .nothrcopy jmp .returninterp .ignorehr mov eax,[esi+510] mov ecx,64 mov [esi+512],eax mov edx,[spritetablea] add edx,512 ; Process next line .a3 movq mm0,[esi] movq mm3,mm0 movq mm4,mm0 movq mm1,[esi+2] pand mm3,mm1 pand mm0,mm2 pand mm1,mm2 psrlw mm0,1 psrlw mm1,1 paddd mm0,mm1 pand mm3,[HalfTransB] paddw mm0,mm3 movq mm5,mm4 ; mm4/mm5 contains original values, mm0 contains mixed values movq mm6,[edx] movq mm7,[edx+8] punpcklwd mm4,mm0 punpckhwd mm5,mm0 movq [edx],mm4 movq [edx+8],mm5 pand mm0,mm4 movq mm0,mm6 pand mm4,mm2 pand mm6,mm2 psrlw mm4,1 psrlw mm6,1 pand mm0,[HalfTransB] paddd mm4,mm6 paddw mm4,mm0 movq mm0,mm5 pand mm0,mm7 pand mm5,mm2 pand mm7,mm2 psrlw mm5,1 pand mm0,[HalfTransB] psrlw mm7,1 paddd mm5,mm7 paddw mm5,mm0 movq [es:edi],mm4 movq [es:edi+8],mm5 add esi,8 add edi,16 add edx,16 dec ecx jnz near .a3 add edi,128*2 mov edx,[spritetablea] add edx,512 mov ecx,64 .a4 movq mm0,[edx] movq mm1,[edx+8] movq [es:edi],mm0 movq [es:edi+8],mm1 add edi,16 add edx,16 dec ecx jnz .a4 .returninterp add esi,64 add edi,128*2 inc ebx dec byte[lineleft] jnz near .a5 emms pop es ret .blank dd 0,0 .scanlines inc dl mov [lineleft],dl ; do scanlines mov eax,[esi+510] mov ecx,64 mov [esi+512],eax .asl cmp byte[ebx],1 jbe .ignorehrs call HighResProc movq mm2,[HalfTrans] jmp .returninterps .ignorehrs .a movq mm0,[esi] movq mm4,mm0 movq mm1,[esi+2] pand mm0,mm2 pand mm1,mm2 psrlw mm0,1 psrlw mm1,1 paddd mm0,mm1 movq mm5,mm4 ; mm4/mm5 contains original values, mm0 contains mixed values punpcklwd mm4,mm0 punpckhwd mm5,mm0 movq [es:edi],mm4 movq [es:edi+8],mm5 add esi,8 add edi,16 dec ecx jnz .a mov eax,[esi+510+64] mov [esi+512+64],eax .returninterps add esi,64 add edi,128*2 add edi,640*2 inc ebx mov ecx,64 dec byte[lineleft] jnz near .asl emms pop es ret .scanlineshalf inc dl mov [lineleft],dl ; do scanlines .ahb cmp byte[ebx],1 jbe .ignorehrhs call HighResProc movq mm2,[HalfTrans] jmp .returninterphs .ignorehrhs mov eax,[esi+510] mov ecx,64 mov [esi+512],eax mov edx,[spritetablea] add edx,512 .ah movq mm0,[esi] movq mm4,mm0 movq mm1,[esi+2] pand mm0,mm2 pand mm1,mm2 psrlw mm0,1 psrlw mm1,1 paddd mm0,mm1 movq mm5,mm4 ; mm4/mm5 contains original values, mm0 contains mixed values punpcklwd mm4,mm0 punpckhwd mm5,mm0 movq [edx],mm4 movq [edx+8],mm5 movq [es:edi],mm4 movq [es:edi+8],mm5 add esi,8 add edi,16 add edx,16 dec ecx jnz .ah add edi,128*2 sub edx,16*64 mov ecx,64 .ahc movq mm0,[edx] movq mm1,[edx+8] pand mm0,mm2 pand mm1,mm2 psrlw mm0,1 psrlw mm1,1 movq [es:edi],mm0 movq [es:edi+8],mm1 add edi,16 add edx,16 dec ecx jnz .ahc .returninterphs add edi,128*2 add esi,64 inc ebx dec byte[lineleft] jnz near .ahb emms pop es ret .scanlinesquart inc dl mov [lineleft],dl ; do scanlines .ahb2 cmp byte[ebx],1 jbe .ignorehrqs call HighResProc movq mm2,[HalfTransC] jmp .returninterpqs .ignorehrqs mov eax,[esi+510] mov ecx,64 mov [esi+512],eax mov edx,[spritetablea] add edx,512 .ah2 movq mm0,[esi] movq mm3,mm0 movq mm4,mm0 movq mm1,[esi+2] pand mm3,mm1 pand mm0,mm2 pand mm1,mm2 psrlw mm0,1 psrlw mm1,1 paddd mm0,mm1 pand mm3,[HalfTransB] paddw mm0,mm3 movq mm5,mm4 ; mm4/mm5 contains original values, mm0 contains mixed values punpcklwd mm4,mm0 punpckhwd mm5,mm0 movq [edx],mm4 movq [edx+8],mm5 movq [es:edi],mm4 movq [es:edi+8],mm5 add esi,8 add edi,16 add edx,16 dec ecx jnz .ah2 add edi,128*2 sub edx,16*64 mov ecx,64 .ahc2 movq mm0,[edx] movq mm1,[edx+8] pand mm0,mm2 pand mm1,mm2 psrlw mm0,1 psrlw mm1,1 movq mm4,mm0 movq mm5,mm1 pand mm4,mm2 pand mm5,mm2 psrlw mm4,1 psrlw mm5,1 paddd mm0,mm4 paddd mm1,mm5 movq [es:edi],mm0 movq [es:edi+8],mm1 add edi,16 add edx,16 dec ecx jnz .ahc2 .returninterpqs add esi,64 add edi,128*2 inc ebx dec byte[lineleft] jnz near .ahb2 emms pop es ret ALIGN32 NEWSYM InterPtr, dd 0 NEWSYM interpolate640x480x16b cmp byte[FPUCopy],2 je near MMXInterpol mov byte[FPUCopy],0 mov ebx,hirestiledat+1 cmp byte[GUIOn],1 je .loopabi cmp byte[newengen],0 je .loopabi mov ebx,SpecialLine+1 .loopabi mov [InterPtr],ebx mov dl,[resolutn] dec dl dec dl dec dl cmp byte[scanlines],1 je near .scanlines cmp byte[scanlines],2 je near .scanlinesquart cmp byte[scanlines],3 je near .scanlineshalf inc dword[InterPtr] mov [lineleft],dl ; do first line mov ecx,255 mov edx,[spritetablea] .a mov ax,[esi] mov bx,[esi+2] and ebx,[HalfTrans+6] and eax,[HalfTrans+6] add ebx,eax shl ebx,15 mov bx,[esi] mov [es:edi],ebx mov [edx],ebx add esi,2 add edi,4 add edx,4 loop .a add esi,66 add edi,130*2 .loopb mov ebx,[InterPtr] cmp byte[ebx],1 jbe .ignorehr call HighResProc jmp .returninterp .ignorehr mov ecx,255 mov edx,[spritetablea] .c mov ax,[esi] mov bx,[esi+2] and ebx,[HalfTrans+6] and eax,[HalfTrans+6] add ebx,eax shl ebx,15 mov eax,[edx] mov bx,[esi] and eax,[HalfTrans] mov [edx],ebx and ebx,[HalfTrans] shr eax,1 shr ebx,1 add eax,ebx mov [es:edi],eax add esi,2 add edi,4 add edx,4 loop .c add edi,130*2 mov edx,[spritetablea] mov ecx,255 .d mov eax,[edx] mov [es:edi],eax add edx,4 add edi,4 loop .d inc dword[InterPtr] add esi,66 add edi,130*2 dec byte[lineleft] jnz near .loopb pop es ret .returninterp inc dword[InterPtr] add esi,64 add edi,128*2 dec byte[lineleft] jnz near .loopb pop es ret .scanlines xor eax,eax mov ebx,hirestiledat+1 cmp byte[GUIOn],1 je .loopabis cmp byte[newengen],0 je .loopabis mov ebx,SpecialLine+1 .loopabis .loopab mov ecx,255 cmp byte[Triplebufen],1 je .ignorehrb cmp byte[ebx],1 jbe .ignorehrs call HighResProc jmp .returninterps .ignorehrs cmp byte[ebx],1 je .yeshiresb .ignorehrb push ebx .ab mov ax,[esi] mov bx,[esi+2] and ebx,[HalfTrans+6] and eax,[HalfTrans+6] add ebx,eax shl ebx,15 mov bx,[esi] mov [es:edi],ebx add esi,2 add edi,4 dec ecx jnz .ab pop ebx .returnb add esi,66 add edi,130*2+640*2 inc ebx dec dl jnz .loopab pop es cmp byte[Triplebufen],1 je .ignorehr2b xor byte[res512switch],1 .ignorehr2b ret .yeshiresb mov byte[ebx],0 test byte[res512switch],1 jnz .rightsideb .bb mov ax,[esi] mov [es:edi],ax add esi,2 add edi,4 dec ecx jnz .bb jmp .returnb .rightsideb .cb mov ax,[esi] mov [es:edi+2],ax add esi,2 add edi,4 dec ecx jnz .cb jmp .returnb .returninterps add esi,64 inc dword[InterPtr] add edi,128*2+640*2 inc ebx dec byte[lineleft] jnz near .loopab pop es ret .scanlineshalf xor eax,eax mov [lineleft],dl .loopab2 mov ebx,[InterPtr] cmp byte[ebx],1 jbe .ignorehrhs call HighResProc jmp .returninterphs .ignorehrhs mov ecx,255 mov edx,[spritetablea] add edx,512 .ab2 mov ax,[esi] mov bx,[esi+2] and ebx,[HalfTrans+6] and eax,[HalfTrans+6] add ebx,eax shl ebx,15 mov bx,[esi] mov [edx],ebx mov [es:edi],ebx add esi,2 add edi,4 add edx,4 dec ecx jnz .ab2 add edi,130*2 mov ecx,255 mov edx,[spritetablea] add edx,512 .ab2b mov eax,[edx] and eax,[HalfTrans] shr eax,1 mov [es:edi],eax add edi,4 add edx,4 dec ecx jnz .ab2b inc dword[InterPtr] add esi,66 add edi,130*2 dec byte[lineleft] jnz near .loopab2 pop es ret .returninterphs add esi,64 inc dword[InterPtr] add edi,128*2 dec byte[lineleft] jnz near .loopab2 pop es ret .scanlinesquart xor eax,eax mov [lineleft],dl .loopab3 mov ebx,[InterPtr] cmp byte[ebx],1 jbe .ignorehrqs call HighResProc jmp .returninterpqs .ignorehrqs mov ecx,255 mov edx,[spritetablea] add edx,512 .ab3 mov ax,[esi] mov bx,[esi+2] and ebx,[HalfTrans+6] and eax,[HalfTrans+6] add ebx,eax shl ebx,15 mov bx,[esi] mov [edx],ebx mov [es:edi],ebx add esi,2 add edi,4 add edx,4 dec ecx jnz .ab3 add edi,130*2 mov ecx,255 mov edx,[spritetablea] add edx,512 .ab3b mov eax,[edx] and eax,[HalfTrans] shr eax,1 mov ebx,eax and ebx,[HalfTrans] shr ebx,1 add eax,ebx mov [es:edi],eax add edi,4 add edx,4 dec ecx jnz .ab3b inc dword[InterPtr] add esi,66 add edi,130*2 dec byte[lineleft] jnz near .loopab3 pop es ret .returninterpqs add esi,64 inc dword[InterPtr] add edi,128*2 dec byte[lineleft] jnz near .loopab2 pop es ret ;******************************************************* ; Copy VESA2 640x480x16b, bit setting 1:5:5:5 ;******************************************************* ALIGN32 .interpspad dd 0,0,0,0,0,0,0,0 ;******************************************************* ; Copy VESA2 512x384x16b Copies buffer to 512x384x16bV2 ;******************************************************* NEWSYM copyvesa2512x384x16bgui cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov byte[.lastrep],0 mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov byte[.scratio],61 ; 60.6695 cmp word[resolutn],224 jne .res239 mov byte[.scratio],72 ; 72.4286 .res239 mov edi,[VidStartDraw] add esi,16+256+32 xor eax,eax mov dl,[resolutn] dec dl dec dl xor dh,dh .loopa mov ecx,256 xor eax,eax .a mov al,[esi] mov bx,[GUICPC+eax*2] mov [es:edi],bx mov [es:edi+2],bx inc esi add edi,4 dec ecx jnz .a cmp byte[.lastrep],1 je .no2 sub dh,[.scratio] jnc .no2 add dh,100 sub esi,256 inc dl dec ebx mov byte[.lastrep],1 jmp .yes2 .no2 mov byte[.lastrep],0 add esi,32 .yes2 dec dl jnz .loopa pop es ret .scratio db 0 .lastrep db 0 NEWSYM copyvesa2512x384x16b cmp byte[vesa2red10],1 jne .noconvertr call ConvertToAFormat .noconvertr cmp byte[curblank],40h jne .startcopy ret .startcopy push es mov byte[.lastrep],0 mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov byte[.scratio],61 ; 60.6695 cmp word[resolutn],224 jne .res239 mov byte[.scratio],72 ; 72.4286 .res239 mov edi,[VidStartDraw] add esi,16*2+256*2+32*2 xor eax,eax mov ebx,hirestiledat+1 mov dl,[resolutn] dec dl dec dl xor dh,dh .loopa mov al,[ebx] mov [.p512],al cmp byte[Triplebufen],1 je .ignorehr cmp al,1 je .yeshires .ignorehr mov ecx,256 .a mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a .returnloop cmp byte[.lastrep],1 je .no2 sub dh,[.scratio] jnc .no2 add dh,100 sub esi,512 inc dl mov al,[.p512] mov [ebx],al dec ebx mov byte[.lastrep],1 jmp .yes2 .no2 mov byte[.lastrep],0 add esi,64 .yes2 inc ebx dec dl jnz .loopa pop es cmp byte[Triplebufen],1 je .ignorehr2 xor byte[res512switch],1 .ignorehr2 ret .yeshires mov byte[ebx],0 test byte[res512switch],1 jnz .rightside mov ecx,256 .b mov ax,[esi] mov [es:edi],ax add esi,2 add edi,4 dec ecx jnz .b jmp .returnloop .rightside mov ecx,256 .b2 mov ax,[esi] mov [es:edi+2],ax add esi,2 add edi,4 dec ecx jnz .b2 jmp .returnloop .scratio db 0 .lastrep db 0 .p512 db 0 ; Temporary NEWSYM tempcopy cmp byte[pressed+12],1 jne .nocolch mov byte[pressed+12],2 add byte[.cocol],16 .nocolch cmp byte[pressed+13],1 jne .nocolch2 mov byte[pressed+13],2 add dword[.startbuf],512*64 cmp dword[.startbuf],512*64*4 jne .nores mov dword[.startbuf],0 .nores .nocolch2 ; cache all sprites call allcache pusha ; copy [vcache4b]+bg1objptr*2 into xor ebx,ebx mov bx,[objptr] shl ebx,1 add ebx,[vcache4b] add ebx,[.startbuf] mov edi,[vidbuffer] add edi,16 mov esi,edi mov dh,16 .loopd mov dl,32 .loopc mov ch,8 .loopb mov cl,8 .loopa mov al,[ebx] add al,[.cocol] mov [edi],al inc edi inc ebx dec cl jnz .loopa add edi,248+32 dec ch jnz .loopb add esi,8 mov edi,esi dec dl jnz .loopc add esi,288*8-32*8 mov edi,esi dec dh jnz .loopd popa ret .cocol db 0 .startbuf dd 0 NEWSYM allcache pushad mov esi,[vram] mov edi,[vcache4b] mov ecx,2048 .nextcache ; convert from [esi] to [edi] ; use ah = color 0, bl = color 1, bh = color 2, cl = color 3 ; ch = color 4, dl = color 5, dh = color 6, .a = color 7 push edi push esi push ecx mov byte[.rowleft],8 .donext xor ah,ah xor ebx,ebx xor ecx,ecx xor edx,edx mov byte[.a],0 mov al,[esi] ; bitplane 0 cmp al,0 je .skipconva test al,01h jz .skipa0 or ah,01h .skipa0 test al,02h jz .skipa1 or bl,01h .skipa1 test al,04h jz .skipa2 or bh,01h .skipa2 test al,08h jz .skipa3 or cl,01h .skipa3 test al,10h jz .skipa4 or ch,01h .skipa4 test al,20h jz .skipa5 or dl,01h .skipa5 test al,40h jz .skipa6 or dh,01h .skipa6 test al,80h jz .skipa7 or byte[.a],01h .skipa7 .skipconva mov al,[esi+1] ; bitplane 1 cmp al,0 je .skipconvb test al,01h jz .skipb0 or ah,02h .skipb0 test al,02h jz .skipb1 or bl,02h .skipb1 test al,04h jz .skipb2 or bh,02h .skipb2 test al,08h jz .skipb3 or cl,02h .skipb3 test al,10h jz .skipb4 or ch,02h .skipb4 test al,20h jz .skipb5 or dl,02h .skipb5 test al,40h jz .skipb6 or dh,02h .skipb6 test al,80h jz .skipb7 or byte[.a],02h .skipb7 .skipconvb mov al,[esi+16] ; bitplane 2 cmp al,0 je .skipconvc test al,01h jz .skipc0 or ah,04h .skipc0 test al,02h jz .skipc1 or bl,04h .skipc1 test al,04h jz .skipc2 or bh,04h .skipc2 test al,08h jz .skipc3 or cl,04h .skipc3 test al,10h jz .skipc4 or ch,04h .skipc4 test al,20h jz .skipc5 or dl,04h .skipc5 test al,40h jz .skipc6 or dh,04h .skipc6 test al,80h jz .skipc7 or byte[.a],04h .skipc7 .skipconvc mov al,[esi+17] ; bitplane 3 cmp al,0 je .skipconvd test al,01h jz .skipd0 or ah,08h .skipd0 test al,02h jz .skipd1 or bl,08h .skipd1 test al,04h jz .skipd2 or bh,08h .skipd2 test al,08h jz .skipd3 or cl,08h .skipd3 test al,10h jz .skipd4 or ch,08h .skipd4 test al,20h jz .skipd5 or dl,08h .skipd5 test al,40h jz .skipd6 or dh,08h .skipd6 test al,80h jz .skipd7 or byte[.a],08h .skipd7 .skipconvd ; move all bytes into [edi] mov [edi+7],ah mov [edi+6],bl mov [edi+5],bh mov [edi+4],cl mov [edi+3],ch mov [edi+2],dl mov [edi+1],dh mov al,[.a] mov [edi],al add edi,8 add esi,2 dec byte[.rowleft] jnz near .donext pop ecx pop esi pop edi add esi,32 add edi,64 dec cx jnz near .nextcache popad ret .nbg dw 0 .a db 0 .rowleft db 0 ;******************************************************* ; Copy VESA1.2 640x480x16b ;******************************************************* NEWSYM copyvesa12640x480x16b cmp byte[curblank],40h jne .startcopy ret .startcopy cmp byte[vesa2red10],1 jne .nocopyvesa2r call ConvertToAFormat .nocopyvesa2r push es mov word[bankpos],0 call VESA12Bankswitch mov ax,[selcA000] mov es,ax mov esi,[vidbuffer] mov edi,32*2*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320*2*2+32*2*2 .res239 add esi,16*2+256*2+32*2 xor eax,eax ; Check if interpolation mode .nommx mov dl,[resolutn] dec dl dec dl mov [lineleft],dl mov edx,65536 sub edx,edi shr edx,2 cmp byte[smallscreenon],1 je near .smallscreen cmp byte[scanlines],1 je near .scanlines .loopa mov ecx,256 precheckvesa12 256 .a mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a postcheckvesa12 .a,64,256,16384 sub esi,256*2 add edi,128*2 mov ecx,256 precheckvesa12 256 .a2 mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .a2 postcheckvesa12 .a2,64,256,16384 add esi,64 add edi,128*2 inc ebx dec byte[lineleft] jnz near .loopa pop es ret .scanlines .loopab mov ecx,256 precheckvesa12 256 .ab mov ax,[esi] shl eax,16 mov ax,[esi] mov [es:edi],eax add esi,2 add edi,4 dec ecx jnz .ab postcheckvesa12 .ab,64+320,256,16384 mov ecx,256 add esi,64 add edi,128*2+640*2 inc ebx dec byte[lineleft] jnz near .loopab pop es ret .smallscreen .loopac mov ecx,128 precheckvesa12 128 .ac mov eax,[esi] mov [es:edi],eax add esi,4 add edi,4 dec ecx jnz .ac postcheckvesa12 .ac,64+128,128,16384 mov ecx,128 add esi,64 add edi,128*2+256*2 inc ebx dec byte[lineleft] jnz near .loopac pop es ret ;******************************************************* ; Clear Screen ;******************************************************* NEWSYM DOSClearScreen cmp byte[cvidmode],1 je near cscopymodeq cmp byte[cvidmode],2 je near cscopyvesa2320x240x8b cmp byte[cvidmode],3 je near cscopyvesa2320x240x16b cmp byte[cvidmode],4 je near cscopyvesa2640x480x8b cmp byte[cvidmode],5 je near cscopyvesa2640x480x16b cmp byte[cvidmode],6 je near cscopyvesa2512x384x8b cmp byte[cvidmode],7 je near cscopyvesa2512x384x16b cmp byte[cvidmode],8 je near cscopyvesa12640x480x16b cmp byte[cvidmode],9 je near cscopyvesa2320x480x8b cmp byte[cvidmode],10 je near cscopyvesa2320x480x16b cmp byte[cvidmode],0 je near cscopymodex ret %macro TripleBufferClear 0 cmp byte[Triplebufen],0 je %%noclear push ebx mov ebx,ecx add ecx,ebx add ecx,ebx pop ebx %%noclear %endmacro NEWSYM cscopymodeq push es mov ax,[selcA000] mov es,ax xor eax,eax mov ecx,16384 xor edi,edi rep stosd pop es ret NEWSYM cscopymodex ; select all planes mov dx,03C4h mov ax,0F02h out dx,ax push es mov ax,[selcA000] mov es,ax xor edi,edi mov ecx,65536/4 xor eax,eax rep stosd pop es ret NEWSYM cscopyvesa2320x240x8b push es mov ax,[vesa2selec] mov es,ax mov edi,[VidStartDraw] mov ecx,320*240 TripleBufferClear .loop mov byte[es:edi],0 inc edi dec ecx jnz .loop pop es ret NEWSYM cscopyvesa2320x240x16b push es mov ax,[vesa2selec] mov es,ax mov edi,[VidStartDraw] mov ecx,320*240*2 TripleBufferClear .loop mov byte[es:edi],0 inc edi dec ecx jnz .loop pop es ret NEWSYM cscopyvesa2640x480x8b push es mov ax,[vesa2selec] mov es,ax mov edi,[VidStartDraw] mov ecx,640*480 TripleBufferClear .loopb mov byte[es:edi],0 inc edi dec ecx jnz .loopb pop es ret NEWSYM cscopyvesa2640x480x16b push es mov ax,[vesa2selec] mov es,ax mov edi,[VidStartDraw] mov ecx,640*480*2 TripleBufferClear .loopb mov byte[es:edi],0 inc edi dec ecx jnz .loopb pop es ret NEWSYM cscopyvesa2320x480x8b push es mov ax,[vesa2selec] mov es,ax mov edi,[VidStartDraw] mov ecx,320*480 TripleBufferClear .loopb mov byte[es:edi],0 inc edi dec ecx jnz .loopb pop es ret NEWSYM cscopyvesa2320x480x16b push es mov ax,[vesa2selec] mov es,ax mov edi,[VidStartDraw] mov ecx,320*480*2 TripleBufferClear .loopb mov byte[es:edi],0 inc edi dec ecx jnz .loopb pop es ret NEWSYM cscopyvesa2512x384x8b push es mov ax,[vesa2selec] mov es,ax mov edi,[VidStartDraw] mov ecx,512*384 TripleBufferClear .loopb mov byte[es:edi],0 inc edi dec ecx jnz .loopb pop es ret NEWSYM cscopyvesa2512x384x16b push es mov ax,[vesa2selec] mov es,ax mov edi,[VidStartDraw] mov ecx,512*384*2 TripleBufferClear .loopb mov byte[es:edi],0 inc edi dec ecx jnz .loopb pop es ret NEWSYM GetScreen cmp byte[OSPort],1 jbe .getscreen ret .getscreen cmp byte[cvidmode],3 je near getcopyvesa2320x240x16b cmp byte[cvidmode],5 ; je near getcopyvesa2640x480x16b cmp byte[cvidmode],7 ; je near getcopyvesa2512x384x16b ret NEWSYM getcopyvesa2320x240x16b push es mov ax,[vesa2selec] mov es,ax mov edi,32*2 ; Draw @ Y from 9 to 247 cmp word[resolutn],224 jne .res239 mov edi,8*320*2+32*2 .res239 add edi,[VidStartDraw] xor ebx,ebx mov bx,word[resolutn] mov esi,[vidbuffer] add esi,32+288*2 mov ecx,256 .loop mov ax,[es:edi] mov [esi],ax add edi,2 add esi,2 loop .loop add edi,128 add esi,64 mov ecx,256 dec ebx jnz .loop pop es cmp byte[vesa2red10],0 jne .redvalue ret .redvalue call ConvertImageDatared10 ret ConvertImageDatared10: xor ebx,ebx mov bx,word[resolutn] mov esi,[vidbuffer] add esi,32+288*2 mov ecx,256 .loop mov ax,[esi] mov dx,ax and ax,0000000000011111b and dx,0111111111100000b shl dx,1 or ax,dx mov [esi],ax add esi,2 loop .loop add esi,64 mov ecx,256 dec ebx jnz .loop ret NEWSYM cscopyvesa12640x480x16b push es mov word[bankpos],0 call VESA12Bankswitch mov ax,[selcA000] mov es,ax mov edi,32*2*2 ; Draw @ Y from 9 to 247 xor eax,eax mov dl,239 dec dl dec dl mov [lineleft],dl mov edx,65536 sub edx,edi shr edx,2 .loopa mov ecx,256 precheckvesa12 256 xor eax,eax .a mov [es:edi],eax add edi,4 dec ecx jnz .a postcheckvesa12 .a,64,256,16384 add edi,128*2 mov ecx,256 precheckvesa12 256 xor eax,eax .a2 mov [es:edi],eax add edi,4 dec ecx jnz .a2 postcheckvesa12 .a2,64,256,16384 add edi,128*2 inc ebx dec byte[lineleft] jnz near .loopa pop es ret NEWSYM Clear2xSaIBuffer mov ebx,[vidbufferofsb] add ebx,288*2 mov ecx,144*239 .nextb mov dword[ebx],0FFFFFFFFh add ebx,4 loop .nextb ret