Files
ZSNES/zsnes/src/video/mv16tms.asm
2001-04-10 04:28:44 +00:00

1505 lines
29 KiB
NASM

;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