;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. %include "macros.mac" EXTSYM bgcoloradder,bgofwptr,bgsubby,bshifter,curbgpr,curmosaicsz EXTSYM curvidoffset,cwinptr,domosaic16b,drawn,pal16b,scaddtype EXTSYM scrnon,temp,tempcach,temptile,tileleft16b,transpbuf,vcache2b EXTSYM vcache4b,vcache8b,winon,winptrref,xtravbuf,yadd,yadder EXTSYM yrevadder,draw16x816t,bgmode EXTSYM vcache2ba,vcache4ba,vcache8ba EXTSYM fulladdtab,pal16bcl EXTSYM pal16bxcl EXTSYM coadder16 EXTSYM a16x16xinc,a16x16yinc,curypos,yflipadd NEWSYM MV16TMSAsmStart %include "video/vidmacro.mac" ;******************************************************* ; Processes & Draws 8x8 tiles in 2, 4, & 8 bit mode ;******************************************************* %macro draw8x816tams 2 mov al,[ebx+%1] or al,al jz %%loop add al,dh mov ecx,[ebp+%2] mov eax,[pal16b+eax*4] mov [ebp+%2],ax test ecx,0FFFFh je %%noadd and eax,1111011111011110b ; [vesa2_clbit] and ecx,1111011111011110b ; [vesa2_clbit] add eax,ecx shr eax,1 %%noadd mov [esi+%2],ax xor eax,eax %%loop %endmacro %macro draw8x816tbms 2 mov al,[edi+%1] or al,al jz %%loop add al,dh mov ebx,[ebp+%2] mov ecx,[pal16bcl+eax*4] mov [ebp+%2],cx and ebx,1111011111011110b ; [vesa2_clbit] add ecx,ebx shr ecx,1 mov ecx,[fulladdtab+ecx*2] mov [esi+%2],cx %%loop %endmacro %macro draw8x816tcms 2 mov al,[edi+%1] or al,al jz %%loop add al,dh mov ebx,[ebp+%2] mov ecx,[pal16bxcl+eax*4] mov [ebp+%2],cx and ebx,1111011111011110b ; [vesa2_clbit] add ecx,ebx shr ecx,1 mov ecx,[fulladdtab+ecx*2] xor ecx,0FFFFh mov [esi+%2],cx %%loop %endmacro %macro draw8x816tawinonms 2 mov al,[ebx+%1] or al,al jz %%loop test byte[edx+%1],0FFh jnz %%loop add al,[coadder16] mov ecx,[ebp+%2] mov eax,[pal16b+eax*4] mov [ebp+%2],ax test ecx,0FFFFh je %%noadd and eax,1111011111011110b ; [vesa2_clbit] and ecx,1111011111011110b ; [vesa2_clbit] add eax,ecx shr eax,1 %%noadd mov [esi+%2],ax xor eax,eax %%loop %endmacro %macro draw8x816tbwinonms 2 mov al,[edi+%1] or al,al jz %%loop test byte[edx+%1],0FFh jnz %%loop add al,[coadder16] mov ebx,[ebp+%2] mov ecx,[pal16bcl+eax*4] mov [ebp+%2],cx and ebx,1111011111011110b ; [vesa2_clbit] add ecx,ebx shr ecx,1 mov ecx,[fulladdtab+ecx*2] mov [esi+%2],cx %%loop %endmacro %macro draw8x816tcwinonms 2 mov al,[edi+%1] or al,al jz %%loop test byte[edx+%1],0FFh jnz %%loop add al,[coadder16] mov ebx,[ebp+%2] mov ecx,[pal16bxcl+eax*4] mov [ebp+%2],cx and ebx,1111011111011110b ; [vesa2_clbit] add ecx,ebx shr ecx,1 mov ecx,[fulladdtab+ecx*2] xor ecx,0FFFFh mov [esi+%2],cx %%loop %endmacro %macro draw8x816tawinonbms 2 mov al,[ebx+%1] or al,al jz %%loop test byte[edx+7-%1],0FFh jnz %%loop add al,[coadder16] mov ecx,[ebp+%2] mov eax,[pal16b+eax*4] mov [ebp+%2],ax test ecx,0FFFFh je %%noadd and eax,1111011111011110b ; [vesa2_clbit] and ecx,1111011111011110b ; [vesa2_clbit] add eax,ecx shr eax,1 %%noadd mov [esi+%2],ax xor eax,eax %%loop %endmacro %macro draw8x816tbwinonbms 2 mov al,[edi+%1] or al,al jz %%loop test byte[edx+7-%1],0FFh jnz %%loop add al,[coadder16] mov ebx,[ebp+%2] mov ecx,[pal16bcl+eax*4] mov [ebp+%2],cx and ebx,1111011111011110b ; [vesa2_clbit] add ecx,ebx shr ecx,1 mov ecx,[fulladdtab+ecx*2] mov [esi+%2],cx %%loop %endmacro %macro draw8x816tcwinonbms 2 mov al,[edi+%1] or al,al jz %%loop test byte[edx+7-%1],0FFh jnz %%loop add al,[coadder16] mov ebx,[ebp+%2] mov ecx,[pal16bxcl+eax*4] mov [ebp+%2],cx and ebx,1111011111011110b ; [vesa2_clbit] add ecx,ebx shr ecx,1 mov ecx,[fulladdtab+ecx*2] xor ecx,0FFFFh mov [esi+%2],cx %%loop %endmacro NEWSYM draw8x816tms cmp byte[bgmode],5 je near draw16x816t mov [temp],al mov [bshifter],ah mov eax,esi mov [yadder],ecx mov [tempcach],ebx mov ebx,56 sub ebx,ecx mov [yrevadder],ebx ; esi = pointer to video buffer mov esi,[cwinptr] sub esi,eax mov [winptrref],esi mov esi,[curvidoffset] sub esi,eax ; esi = [vidbuffer] + curypos * 288 + 16 - HOfs sub esi,eax cmp byte[curmosaicsz],1 je .nomosaic mov esi,xtravbuf+32 mov ecx,128 .clearnext mov dword[esi],0 add esi,4 dec ecx jnz .clearnext mov esi,xtravbuf+32 sub esi,eax sub esi,eax .nomosaic mov [temptile],edx mov dword[bgofwptr],vcache2ba+262144 mov dword[bgsubby],262144 cmp dword[tempcach],vcache2ba+262144 jb .nobit mov dword[bgofwptr],vcache4ba+131072 mov dword[bgsubby],131072 cmp dword[tempcach],vcache4ba+131072 jb .nobit mov dword[bgofwptr],vcache8ba+65536 mov dword[bgsubby],65536 .nobit ; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value ; bit 10-12 = palette, 0-9=tile# cmp byte[curmosaicsz],1 jne .domosaic cmp byte[winon],0 jne near draw8x816twinonms .domosaic mov ebp,transpbuf+32 sub ebp,eax sub ebp,eax test byte[scaddtype],80h jnz near draw8x816tsms test byte[scaddtype],40h jz near draw8x8fulladdms cmp byte[scrnon+1],0 jz near draw8x8fulladdms mov byte[tileleft16b],33 mov byte[drawn],0 mov dl,[temp] .loopa mov ax,[edi] mov dh,ah add edi,2 xor dh,[curbgpr] test dh,20h jnz near .hprior inc byte[drawn] and eax,03FFh ; filter out tile # mov ebx,[tempcach] shl eax,6 add ebx,eax cmp ebx,[bgofwptr] jb .noclip sub ebx,[bgsubby] .noclip test dh,80h jz .normadd add ebx,[yrevadder] jmp .skipadd .normadd add ebx,[yadder] .skipadd test dh,40h jnz near .rloop ; Begin Normal Loop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx ; Start loop drawtilegrp draw8x816tams .hprior add esi,16 add ebp,16 inc dl cmp dl,20h jne .loopc2 mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa cmp byte[drawn],0 je .nodraw mov dh,byte[curmosaicsz] cmp dh,1 jne near domosaic16b .nodraw ret ; reversed loop .rloop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx drawtilegrpf draw8x816tams add esi,16 add ebp,16 inc dl cmp dl,20h jne .loopc mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa cmp byte[drawn],0 je .nodraw2 mov dh,byte[curmosaicsz] cmp dh,1 jne near domosaic16b .nodraw2 ret NEWSYM draw8x8fulladdms mov byte[tileleft16b],33 mov byte[drawn],0 mov dl,[temp] .loopa mov ax,[edi] mov dh,ah add edi,2 push edi xor dh,[curbgpr] test dh,20h jnz near .hprior inc byte[drawn] and eax,03FFh ; filter out tile # mov edi,[tempcach] shl eax,6 add edi,eax cmp edi,[bgofwptr] jb .noclip sub edi,[bgsubby] .noclip test dh,80h jz .normadd add edi,[yrevadder] jmp .skipadd .normadd add edi,[yadder] .skipadd test dh,40h jnz near .rloop ; Begin Normal Loop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx ; Start loop drawtilegrpfull draw8x816tbms .hprior pop edi add esi,16 add ebp,16 inc dl cmp dl,20h jne .loopc2 mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa cmp byte[drawn],0 je .nodraw mov dh,byte[curmosaicsz] cmp dh,1 jne near domosaic16b .nodraw ret ; reversed loop .rloop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx drawtilegrpfullf draw8x816tbms pop edi add esi,16 add ebp,16 inc dl cmp dl,20h jne .loopc mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa cmp byte[drawn],0 je .nodraw2 mov dh,byte[curmosaicsz] cmp dh,1 jne near domosaic16b .nodraw2 ret NEWSYM draw8x816tsms mov byte[tileleft16b],33 mov byte[drawn],0 mov dl,[temp] .loopa mov ax,[edi] mov dh,ah add edi,2 push edi xor dh,[curbgpr] test dh,20h jnz near .hprior inc byte[drawn] and eax,03FFh ; filter out tile # mov edi,[tempcach] shl eax,6 add edi,eax cmp edi,[bgofwptr] jb .noclip sub edi,[bgsubby] .noclip test dh,80h jz .normadd add edi,[yrevadder] jmp .skipadd .normadd add edi,[yadder] .skipadd test dh,40h jnz near .rloop ; Begin Normal Loop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx ; Start loop drawtilegrpfull draw8x816tcms .hprior pop edi add esi,16 add ebp,16 inc dl cmp dl,20h jne .loopc2 mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa ret ; reversed loop .rloop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx drawtilegrpfullf draw8x816tcms pop edi add esi,16 add ebp,16 inc dl cmp dl,20h jne .loopc mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa ret NEWSYM draw8x816twinonms mov ebp,transpbuf+32 sub ebp,eax sub ebp,eax test byte[scaddtype],80h jnz near draw8x816tswinonms test byte[scaddtype],40h jz near draw8x8fulladdwinonms cmp byte[scrnon+1],0 jz near draw8x8fulladdwinonms mov byte[tileleft16b],33 mov edx,[winptrref] mov byte[drawn],0 .loopa mov ax,[edi] mov cl,ah add edi,2 xor cl,[curbgpr] test cl,20h jnz near .hprior inc byte[drawn] and eax,03FFh ; filter out tile # mov ebx,[tempcach] shl eax,6 add ebx,eax cmp ebx,[bgofwptr] jb .noclip sub ebx,[bgsubby] .noclip test cl,80h jz .normadd add ebx,[yrevadder] jmp .skipadd .normadd add ebx,[yadder] .skipadd test cl,40h jnz near .rloop ; Begin Normal Loop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx ; Start loop drawtilegrp draw8x816tawinonms .hprior add esi,16 add edx,8 add ebp,16 inc byte[temp] cmp byte[temp],20h jne .loopc2 mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa ret ; reversed loop .rloop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx drawtilegrpf draw8x816tawinonbms add esi,16 add edx,8 add ebp,16 inc byte[temp] cmp byte[temp],20h jne .loopc mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa ret NEWSYM draw8x8fulladdwinonms mov byte[tileleft16b],33 mov edx,[winptrref] mov byte[drawn],0 .loopa mov ax,[edi] mov cl,ah add edi,2 push edi xor cl,[curbgpr] test cl,20h jnz near .hprior inc byte[drawn] and eax,03FFh ; filter out tile # mov edi,[tempcach] shl eax,6 add edi,eax cmp edi,[bgofwptr] jb .noclip sub edi,[bgsubby] .noclip test cl,80h jz .normadd add edi,[yrevadder] jmp .skipadd .normadd add edi,[yadder] .skipadd test cl,40h jnz near .rloop ; Begin Normal Loop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx ; Start loop drawtilegrpfull draw8x816tbwinonms .hprior pop edi add esi,16 add edx,8 add ebp,16 inc byte[temp] cmp byte[temp],20h jne .loopc2 mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa ret ; reversed loop .rloop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx drawtilegrpfullf draw8x816tbwinonbms pop edi add esi,16 add edx,8 add ebp,16 inc byte[temp] cmp byte[temp],20h jne .loopc mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa ret NEWSYM draw8x816tswinonms mov byte[tileleft16b],33 mov edx,[winptrref] mov byte[drawn],0 .loopa mov ax,[edi] mov cl,ah add edi,2 push edi xor cl,[curbgpr] test cl,20h jnz near .hprior inc byte[drawn] and eax,03FFh ; filter out tile # mov edi,[tempcach] shl eax,6 add edi,eax cmp edi,[bgofwptr] jb .noclip sub edi,[bgsubby] .noclip test cl,80h jz .normadd add edi,[yrevadder] jmp .skipadd .normadd add edi,[yadder] .skipadd test cl,40h jnz near .rloop ; Begin Normal Loop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx ; Start loop drawtilegrpfull draw8x816tcwinonms .hprior pop edi add esi,16 add edx,8 add ebp,16 inc byte[temp] cmp byte[temp],20h jne .loopc2 mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa ret ; reversed loop .rloop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx drawtilegrpfullf draw8x816tcwinonbms pop edi add esi,16 add edx,8 add ebp,16 inc byte[temp] cmp byte[temp],20h jne .loopc mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa ret ;******************************************************* ; Processes & Draws 16x16 tiles in 2, 4, & 8 bit mode ;******************************************************* NEWSYM draw16x1616tms mov byte[drawn],0 mov [temp],eax mov eax,esi mov [yadder],ecx mov [tempcach],ebx mov ebx,56 sub ebx,ecx mov [yrevadder],ebx xor ebx,ebx mov bl,[curypos] mov [temptile],edx ; set up y adders test byte[a16x16yinc],01h jz .noincrc mov word[yadd],16 mov word[yflipadd],0 jmp .yesincrc .noincrc mov word[yadd],0 mov word[yflipadd],16 .yesincrc ; esi = pointer to video buffer mov esi,[cwinptr] sub esi,eax mov [winptrref],esi mov esi,[curvidoffset] sub esi,eax ; esi = [vidbuffer] + curypos * 288 + 16 - HOfs sub esi,eax cmp byte[curmosaicsz],1 je .nomosaic mov esi,xtravbuf+32 mov ecx,128 .clearnext mov dword[esi],0 add esi,4 dec ecx jnz .clearnext mov esi,xtravbuf+32 sub esi,eax sub esi,eax .nomosaic mov dword[bgofwptr],vcache2ba+262144 mov dword[bgsubby],262144 cmp dword[tempcach],vcache2ba+262144 jb .nobit mov dword[bgofwptr],vcache4ba+131072 mov dword[bgsubby],131072 cmp dword[tempcach],vcache4ba+131072 jb .nobit mov dword[bgofwptr],vcache8ba+65536 mov dword[bgsubby],65536 .nobit cmp byte[curmosaicsz],1 jne .domosaic cmp byte[winon],0 jne near draw16x1616twinonms .domosaic mov ebp,transpbuf+32 sub ebp,eax sub ebp,eax test byte[scaddtype],80h jnz near draw16x1616tsms test byte[scaddtype],40h jz near draw16x16fulladdms cmp byte[scrnon+1],0 je near draw16x16fulladdms mov byte[tileleft16b],33 mov dl,[temp] .loopa mov ax,[edi] mov dh,ah xor byte[a16x16xinc],1 test dh,40h jnz .noxflip test byte[a16x16xinc],01h jnz .noincr2 inc ax add edi,2 .noincr2 jmp .yesxflip .noxflip test byte[a16x16xinc],01h jnz .noincr add edi,2 jmp .yesincr .noincr inc ax .yesincr .yesxflip xor dh,[curbgpr] test dh,20h jnz near .hprior inc byte[drawn] test dh,80h jnz .noyflip add ax,word[yadd] jmp .yesyflip .noyflip add ax,word[yflipadd] .yesyflip and ax,03FFh ; filter out tile # mov ebx,[tempcach] shl ax,6 add ebx,eax cmp ebx,[bgofwptr] jb .noclip sub ebx,[bgsubby] .noclip test dh,80h jz .normadd add ebx,[yrevadder] jmp .skipadd .normadd add ebx,[yadder] .skipadd test dh,40h jnz near .rloop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx ; Start loop drawtilegrp draw8x816tams .hprior add esi,16 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb2 inc dl .noincrb2 cmp dl,20h jne .loopc2 xor dl,dl mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa mov dh,byte[curmosaicsz] cmp dh,1 jne near domosaic16b ret ; reversed loop .rloop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx ; Start loop drawtilegrpf draw8x816tams .skiploop2b add esi,16 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb inc dl .noincrb cmp dl,20h jne .loopc xor dl,dl mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa mov dh,byte[curmosaicsz] cmp dh,1 jne near domosaic16b ret draw16x16fulladdms: mov byte[tileleft16b],33 mov dl,[temp] .loopa mov ax,[edi] mov dh,ah xor byte[a16x16xinc],1 test dh,40h jnz .noxflip test byte[a16x16xinc],01h jnz .noincr2 inc ax add edi,2 .noincr2 jmp .yesxflip .noxflip test byte[a16x16xinc],01h jnz .noincr add edi,2 jmp .yesincr .noincr inc ax .yesincr .yesxflip xor dh,[curbgpr] push edi test dh,20h jnz near .hprior inc byte[drawn] test dh,80h jnz .noyflip add ax,word[yadd] jmp .yesyflip .noyflip add ax,word[yflipadd] .yesyflip and ax,03FFh ; filter out tile # mov edi,[tempcach] shl ax,6 add edi,eax cmp edi,[bgofwptr] jb .noclip sub edi,[bgsubby] .noclip test dh,80h jz .normadd add edi,[yrevadder] jmp .skipadd .normadd add edi,[yadder] .skipadd test dh,40h jnz near .rloop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx ; Start loop drawtilegrpfull draw8x816tbms .hprior pop edi add esi,16 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb2 inc dl .noincrb2 cmp dl,20h jne .loopc2 xor dl,dl mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa mov dh,byte[curmosaicsz] cmp dh,1 jne near domosaic16b ret ; reversed loop .rloop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx drawtilegrpfullf draw8x816tbms pop edi add esi,16 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb inc dl .noincrb cmp dl,20h jne .loopc xor dl,dl mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa mov dh,byte[curmosaicsz] cmp dh,1 jne near domosaic16b ret NEWSYM draw16x1616tsms mov byte[tileleft16b],33 mov dl,[temp] .loopa mov ax,[edi] mov dh,ah xor byte[a16x16xinc],1 test dh,40h jnz .noxflip test byte[a16x16xinc],01h jnz .noincr2 inc ax add edi,2 .noincr2 jmp .yesxflip .noxflip test byte[a16x16xinc],01h jnz .noincr add edi,2 jmp .yesincr .noincr inc ax .yesincr .yesxflip xor dh,[curbgpr] push edi test dh,20h jnz near .hprior inc byte[drawn] test dh,80h jnz .noyflip add ax,word[yadd] jmp .yesyflip .noyflip add ax,word[yflipadd] .yesyflip and ax,03FFh ; filter out tile # mov edi,[tempcach] shl ax,6 add edi,eax cmp edi,[bgofwptr] jb .noclip sub edi,[bgsubby] .noclip test dh,80h jz .normadd add edi,[yrevadder] jmp .skipadd .normadd add edi,[yadder] .skipadd test dh,40h jnz near .rloop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx ; Start loop drawtilegrpfull draw8x816tcms .hprior pop edi add esi,16 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb2 inc dl .noincrb2 cmp dl,20h jne .loopc2 xor dl,dl mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa mov dh,byte[curmosaicsz] cmp dh,1 jne near domosaic16b ret ; reversed loop .rloop mov cl,[bshifter] and dh,1Ch shl dh,cl ; process palette # (bits 10-12) add dh,[bgcoloradder] xor eax,eax xor ecx,ecx drawtilegrpfullf draw8x816tcms pop edi add esi,16 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb inc dl .noincrb cmp dl,20h jne .loopc xor dl,dl mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa mov dh,byte[curmosaicsz] cmp dh,1 jne near domosaic16b ret NEWSYM draw16x1616twinonms mov ebp,transpbuf+32 sub ebp,eax sub ebp,eax test byte[scaddtype],80h jnz near draw16x1616tswinonms test byte[scaddtype],40h jz near draw16x16fulladdwinonms cmp byte[scrnon+1],0 je near draw16x16fulladdwinonms mov byte[tileleft16b],33 mov edx,[winptrref] .loopa mov ax,[edi] mov cl,ah xor byte[a16x16xinc],1 test cl,40h jnz .noxflip test byte[a16x16xinc],01h jnz .noincr2 inc ax add edi,2 .noincr2 jmp .yesxflip .noxflip test byte[a16x16xinc],01h jnz .noincr add edi,2 jmp .yesincr .noincr inc ax .yesincr .yesxflip xor cl,[curbgpr] test cl,20h jnz near .hprior inc byte[drawn] test cl,80h jnz .noyflip add ax,word[yadd] jmp .yesyflip .noyflip add ax,word[yflipadd] .yesyflip and ax,03FFh ; filter out tile # mov ebx,[tempcach] shl ax,6 add ebx,eax cmp ebx,[bgofwptr] jb .noclip sub ebx,[bgsubby] .noclip test cl,80h jz .normadd add ebx,[yrevadder] jmp .skipadd .normadd add ebx,[yadder] .skipadd test cl,40h jnz near .rloop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx ; Start loop drawtilegrp draw8x816tawinonms .hprior add esi,16 add edx,8 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb2 inc byte[temp] .noincrb2 cmp byte[temp],20h jne .loopc2 mov byte[temp],0 mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa ret ; reversed loop .rloop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx ; Start loop drawtilegrpf draw8x816tawinonbms .skiploop2b add esi,16 add edx,8 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb inc byte[temp] .noincrb cmp byte[temp],20h jne near .loopc2 mov byte[temp],0 mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa ret NEWSYM draw16x16fulladdwinonms mov byte[tileleft16b],33 mov edx,[winptrref] .loopa mov ax,[edi] mov cl,ah xor byte[a16x16xinc],1 test cl,40h jnz .noxflip test byte[a16x16xinc],01h jnz .noincr2 inc ax add edi,2 .noincr2 jmp .yesxflip .noxflip test byte[a16x16xinc],01h jnz .noincr add edi,2 jmp .yesincr .noincr inc ax .yesincr .yesxflip xor cl,[curbgpr] push edi test cl,20h jnz near .hprior inc byte[drawn] test cl,80h jnz .noyflip add ax,word[yadd] jmp .yesyflip .noyflip add ax,word[yflipadd] .yesyflip and ax,03FFh ; filter out tile # mov edi,[tempcach] shl ax,6 add edi,eax cmp edi,[bgofwptr] jb .noclip sub edi,[bgsubby] .noclip test cl,80h jz .normadd add edi,[yrevadder] jmp .skipadd .normadd add edi,[yadder] .skipadd test cl,40h jnz near .rloop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx ; Start loop drawtilegrpfull draw8x816tbwinonms .hprior pop edi add esi,16 add edx,8 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb2 inc byte[temp] .noincrb2 cmp byte[temp],20h jne .loopc2 mov byte[temp],0 mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa ret ; reversed loop .rloop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx drawtilegrpfullf draw8x816tbwinonbms pop edi add esi,16 add edx,8 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb inc byte[temp] .noincrb cmp byte[temp],20h jne near .loopc2 mov byte[temp],0 mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa ret NEWSYM draw16x1616tswinonms mov byte[tileleft16b],33 mov edx,[winptrref] .loopa mov ax,[edi] mov cl,ah xor byte[a16x16xinc],1 test cl,40h jnz .noxflip test byte[a16x16xinc],01h jnz .noincr2 inc ax add edi,2 .noincr2 jmp .yesxflip .noxflip test byte[a16x16xinc],01h jnz .noincr add edi,2 jmp .yesincr .noincr inc ax .yesincr .yesxflip xor cl,[curbgpr] push edi test cl,20h jnz near .hprior inc byte[drawn] test cl,80h jnz .noyflip add ax,word[yadd] jmp .yesyflip .noyflip add ax,word[yflipadd] .yesyflip and ax,03FFh ; filter out tile # mov edi,[tempcach] shl ax,6 add edi,eax cmp edi,[bgofwptr] jb .noclip sub edi,[bgsubby] .noclip test cl,80h jz .normadd add edi,[yrevadder] jmp .skipadd .normadd add edi,[yadder] .skipadd test cl,40h jnz near .rloop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx ; Start loop drawtilegrpfull draw8x816tcwinonms .hprior pop edi add esi,16 add edx,8 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb2 inc byte[temp] .noincrb2 cmp byte[temp],20h jne .loopc2 mov byte[temp],0 mov edi,[temptile] .loopc2 dec byte[tileleft16b] jnz near .loopa ret ; reversed loop .rloop mov al,cl mov cl,[bshifter] and al,1Ch shl al,cl ; process palette # (bits 10-12) add al,[bgcoloradder] mov [coadder16],al xor eax,eax xor ecx,ecx drawtilegrpfullf draw8x816tcwinonbms pop edi add esi,16 add edx,8 add ebp,16 test byte[a16x16xinc],01h jnz .noincrb inc byte[temp] .noincrb cmp byte[temp],20h jne near .loopc2 mov byte[temp],0 mov edi,[temptile] .loopc dec byte[tileleft16b] jnz near .loopa ret NEWSYM MV16TMSAsmEnd