Files
ZSNES/zsnes/src/video/vidmacro.mac

1790 lines
32 KiB
Plaintext

;Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;
;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 OMBGTestVal,ngptrdat2,cachesingle4bng,ofshvaladd,ofsmtptrs,ofsmcptr2
EXTSYM Testval
; makev16t macros
%macro procwindowback 0
mov byte[winon],0
mov bl,[wincolen]
and bl,00001010b
cmp bl,00001010b
je near .dualwin
mov bl,[scaddset]
shr bl,4
and bl,00000011b
cmp bl,0
je near .finishwin
cmp bl,3
je near .clearwin
test byte[wincolen],00001010b
jz near .finishwin
mov al,[wincolen]
and al,00000101b
mov esi,windowdata
mov byte[winon],1
mov byte[numwin],0
mov cl,[winl2]
mov ch,[winr2]
test byte[wincolen],00000010b
jz .nowin1
mov cl,[winl1]
mov ch,[winr1]
shl al,2
.nowin1
cmp ch,255
je .noinc
inc ch
.noinc
test al,04h
jnz near .wininside
cmp cl,ch
jae .noinsidemask
mov byte[esi],0
mov byte[esi+1],01h
mov [esi+2],cl
mov byte[esi+3],0FFh
mov [esi+4],ch
mov byte[esi+5],01h
mov byte[numwin],3
jmp .finishwin
.noinsidemask
mov byte[winon],2
jmp .finishwin
.wininside
cmp cl,ch
ja .nooutsidemask
.nonotoutside
cmp ch,254
jb .skipnodraw
cmp cl,1
jbe .noinsidemask
.skipnodraw
mov [esi],cl
mov byte[esi+1],01h
mov [esi+2],ch
mov byte[esi+3],0FFh
mov byte[numwin],2
jmp .finishwin
.nooutsidemask
mov byte[winon],5
jmp .finishwin
.dualwin
mov al,[wincolen]
mov bl,[scaddset]
and bl,30h
cmp bl,30h
je .clearwin
cmp bl,00h
je .finishwin
call makedualwincol
mov byte[winon],3
jmp .finishwin
.clearwin
mov byte[winon],4
.finishwin
%endmacro
%macro procwindowback2 0
mov byte[winon],0
mov al,[wincolen]
test al,00001010b
jz near .finishwin
mov esi,windowdata
mov bl,al
mov byte[winon],1
and bl,00001010b
and al,00000101b
mov byte[numwin],0
cmp bl,00001010b
je near .multiwin
test bl,00000010b
jnz .win1
mov cl,[winl2]
mov ch,[winr2]
shr al,2
jmp .okaywin
.win1
mov cl,[winl1]
mov ch,[winr1]
and al,01h
.okaywin
test al,01h
jz near .wininside
cmp cl,ch
jae .noinsidemask
mov byte[esi],0
mov byte[esi+1],01h
mov [esi+2],cl
mov byte[esi+3],0FFh
mov [esi+4],ch
mov byte[esi+5],01h
mov byte[numwin],3
jmp .finishwin
.noinsidemask
mov byte[esi],0
mov byte[esi+1],01h
mov byte[numwin],1
jmp .finishwin
.wininside
cmp cl,ch
ja .nooutsidemask
.nonotoutside
cmp ch,254
jb .skipnodraw
cmp cl,1
jbe .noinsidemask
.skipnodraw
mov [esi],cl
mov byte[esi+1],01h
mov [esi+2],ch
mov byte[esi+3],0FFh
mov byte[numwin],2
jmp .finishwin
.nooutsidemask
mov byte[winon],0
jmp .finishwin
.multiwin
mov byte[esi],0
mov byte[esi+1],01h
mov byte[numwin],1
.finishwin
%endmacro
;*******************************************************
; Processes & Draws 4-bit sprites for both main & sub
;*******************************************************
%macro drawspr16bt 2
mov al,[esi+%1]
test al,0Fh
jz %%skip
add al,ch
mov edx,[pal16b+eax*4]
mov [edi-%2],dx
mov [ebp-%2],dx
%%skip
%endmacro
%macro drawspr16btwo 3
mov al,[esi+%1]
test al,0Fh
jz %%skip
cmp byte[winspdata+ebx-8+%3+16],0
jne %%skip
add al,ch
mov edx,[pal16b+eax*4]
mov [edi-%2],dx
mov [ebp-%2],dx
%%skip
%endmacro
%macro sprpriorityinit 1
cmp byte[sprclprio+ebp],0
je near .endobj
test byte[cwinenabm],10h
jz .drawnowin
cmp byte[winonsp],0
jne near %1
.drawnowin
%endmacro
%macro sprprioritydrawbt 2
cmp dword[sprsingle],1
je near .drawsingle
mov [csprprlft],cl
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
push esi
mov ch,[esi+6]
mov dl,[esi+7]
xor eax,eax
and edx,03h
cmp edx,ebp
jne near .notprio
mov esi,[esi+2]
mov cl,[csprbit]
sprdrawa16b %1
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.notprio
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawa sprdrawpra2
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.drawspriteflipx
mov bx,[esi]
push esi
mov ch,[esi+6]
mov dl,[esi+7]
xor eax,eax
and edx,03h
cmp edx,ebp
jne near .notpriof
mov esi,[esi+2]
mov cl,[csprbit]
sprdrawaf16b %1
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
.endobj
ret
.notpriof
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawaf sprdrawpra2
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.clearcsprmem
xor eax,eax
mov ecx,64
mov edi,sprpriodata+16
rep stosd
ret
.drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,ecx
and edx,0FFh
xor eax,eax
shl edx,3
sub edx,8
add edx,esi
mov esi,edx
xor ebx,ebx
.loopobj2
test byte[esi+7],20h
jnz near .drawspriteflipx2
mov bx,[esi]
push esi
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawa16b %2
pop esi
sub esi,8
dec cl
jnz near .loopobj2
ret
.drawspriteflipx2
mov bx,[esi]
push esi
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawaf16b %2
pop esi
sub esi,8
dec cl
jnz near .loopobj2
ret
%endmacro
%macro sprdrawpra16bt 1
or eax,eax
jz %%skip
test byte[sprpriodata+ebx-%1+16],cl
jnz %%skip
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-%1*2],dx
mov [transpbuf+32+ebx*2-%1*2],dx
or byte[sprpriodata+ebx-%1+16],cl
%%skip
%endmacro
%macro sprdrawprb16bt 1
or eax,eax
jz %%skip
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-%1*2],dx
mov [transpbuf+32+ebx*2-%1*2],dx
%%skip
%endmacro
;*******************************************************
; Processes & Draws 4-bit sprites w/ transparency
;*******************************************************
%macro drawspr16ta 2
mov al,[esi+%1]
or al,al
jz %%skip
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx-%2],dx
%%skip
%endmacro
%macro drawspr16tb 2
mov al,[esi+%1]
or al,al
jz %%skip
add al,ch
mov ebx,[ebp-%2]
mov edx,[pal16b+eax*4]
cmp bx,0
je %%noadd
and edx,[vesa2_clbit]
and ebx,[vesa2_clbit]
add edx,ebx
shr edx,1
%%noadd
mov [edi-%2],dx
%%skip
%endmacro
%macro drawspr16tc 2
mov al,[esi+%1]
or al,al
jz %%skip
add al,ch
mov ebx,[ebp-%2]
mov edx,[pal16bcl+eax*4]
and ebx,[vesa2_clbit]
add edx,ebx
shr edx,1
mov edx,[fulladdtab+edx*2]
mov [edi-%2],dx
%%skip
%endmacro
%macro drawspr16td 2
mov al,[esi+%1]
or al,al
jz %%skip
add al,ch
mov ebx,[ebp-%2]
mov edx,[pal16bxcl+eax*4]
and ebx,[vesa2_clbit]
add edx,ebx
shr edx,1
mov edx,[fulladdtab+edx*2]
xor edx,0FFFFh
mov [edi-%2],dx
%%skip
%endmacro
%macro drawspr16tawinon 3
mov al,[esi+%1]
or al,al
jz %%skip
cmp byte[winspdata+ebx-8+%3+16],0
jne %%skip
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-%2],dx
%%skip
%endmacro
%macro drawspr16tbwinon 3
mov al,[esi+%1]
or al,al
jz %%skip
cmp byte[winspdata+ebx-8+%3+16],0
jne %%skip
add al,ch
mov edx,[ebp-%2]
mov eax,[pal16b+eax*4]
cmp dx,0
je %%noadd
and eax,[vesa2_clbit]
and edx,[vesa2_clbit]
add eax,edx
shr eax,1
%%noadd
mov [edi-%2],ax
xor eax,eax
%%skip
%endmacro
%macro drawspr16tcwinon 3
mov al,[esi+%1]
or al,al
jz %%skip
cmp byte[winspdata+ebx-8+%3+16],0
jne %%skip
add al,ch
mov edx,[ebp-%2]
mov eax,[pal16bcl+eax*4]
and edx,[vesa2_clbit]
add eax,edx
shr eax,1
mov eax,[fulladdtab+eax*2]
mov [edi-%2],ax
xor eax,eax
%%skip
%endmacro
%macro drawspr16tdwinon 3
mov al,[esi+%1]
or al,al
jz %%skip
cmp byte[winspdata+ebx-8+%3+16],0
jne %%skip
add al,ch
mov edx,[ebp-%2]
mov eax,[pal16bxcl+eax*4]
and edx,[vesa2_clbit]
add eax,edx
shr eax,1
mov eax,[fulladdtab+eax*2]
xor eax,0FFFFh
mov [edi-%2],ax
xor eax,eax
%%skip
%endmacro
%macro drawsprgrp 1
%1 0, 16
%1 1, 14
%1 2, 12
%1 3, 10
%1 4, 8
%1 5, 6
%1 6, 4
%1 7, 2
%endmacro
%macro drawsprgrpf 1
%1 7, 16
%1 6, 14
%1 5, 12
%1 4, 10
%1 3, 8
%1 2, 6
%1 1, 4
%1 0, 2
%endmacro
%macro drawsprgrpwin 1
%1 0, 16, 0
%1 1, 14, 1
%1 2, 12, 2
%1 3, 10, 3
%1 4, 8, 4
%1 5, 6, 5
%1 6, 4, 6
%1 7, 2, 7
%endmacro
%macro drawsprgrpfwin 1
%1 7, 16, 0
%1 6, 14, 1
%1 5, 12, 2
%1 4, 10, 3
%1 3, 8, 4
%1 2, 6, 5
%1 1, 4, 6
%1 0, 2, 7
%endmacro
%macro sprprioritydrawt16b 4
cmp dword[sprsingle],1
je near .drawsingle
mov [csprprlft],cl
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
push esi
mov ch,[esi+6]
mov dl,[esi+7]
xor eax,eax
and edx,03h
cmp edx,ebp
jne near .notprio
cmp ch,12*16
jae near .transpobj
mov esi,[esi+2]
mov cl,[csprbit]
sprdrawa16b %3
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.transpobj
mov esi,[esi+2]
mov cl,[csprbit]
sprdrawa16b %1
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.notprio
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawa sprdrawpra2
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.drawspriteflipx
mov bx,[esi]
push esi
mov ch,[esi+6]
mov dl,[esi+7]
xor eax,eax
and edx,03h
cmp edx,ebp
jne near .notpriof
cmp ch,12*16
jae near .transpobjf
mov esi,[esi+2]
mov cl,[csprbit]
sprdrawaf16b %3
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
.endobj
ret
.transpobjf
mov esi,[esi+2]
mov cl,[csprbit]
sprdrawaf16b %1
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.notpriof
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawaf sprdrawpra2
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.clearcsprmem
xor eax,eax
mov ecx,64
mov edi,sprpriodata+16
rep stosd
ret
.drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,ecx
and edx,0FFh
xor eax,eax
shl edx,3
sub edx,8
add edx,esi
mov esi,edx
xor ebx,ebx
.loopobj2
test byte[esi+7],20h
jnz near .drawspriteflipx2
mov bx,[esi]
push esi
mov ch,[esi+6]
mov esi,[esi+2]
cmp ch,12*16
jae near .transpobj2
sprdrawa16b %4
pop esi
sub esi,8
dec cl
jnz near .loopobj2
ret
.transpobj2
sprdrawa16b %2
pop esi
sub esi,8
dec cl
jnz near .loopobj2
ret
.drawspriteflipx2
mov bx,[esi]
push esi
mov ch,[esi+6]
mov esi,[esi+2]
cmp ch,12*16
jae near .transpobj2f
sprdrawaf16b %4
pop esi
sub esi,8
dec cl
jnz near .loopobj2
ret
.transpobj2f
sprdrawaf16b %2
pop esi
sub esi,8
dec cl
jnz near .loopobj2
ret
%endmacro
%macro sprdrawpra16bha 1
or eax,eax
jz %%skip
test byte[sprpriodata+ebx-%1+16],cl
jnz %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16b+eax*4]
cmp dx,0
je %%noadd
and edx,[vesa2_clbit]
and eax,[vesa2_clbit]
add eax,edx
shr eax,1
%%noadd
mov [edi+ebx*2-%1*2],ax
or byte[sprpriodata+ebx-%1+16],cl
xor eax,eax
%%skip
%endmacro
%macro sprdrawprb16bha 1
or eax,eax
jz %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16b+eax*4]
cmp dx,0
je %%noadd
and edx,[vesa2_clbit]
and eax,[vesa2_clbit]
add eax,edx
shr eax,1
%%noadd
mov [edi+ebx*2-%1*2],ax
xor eax,eax
%%skip
%endmacro
%macro sprdrawpraw16bha 1
or eax,eax
jz %%skip
test byte[sprpriodata+ebx-%1+16],cl
jnz %%skip
cmp byte[winspdata+ebx-%1+16],0
jne %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16b+eax*4]
cmp dx,0
je %%noadd
and edx,[vesa2_clbit]
and eax,[vesa2_clbit]
add eax,edx
shr eax,1
%%noadd
mov [edi+ebx*2-%1*2],ax
or byte[sprpriodata+ebx-%1+16],cl
xor eax,eax
%%skip
%endmacro
%macro sprdrawprbw16bha 1
or eax,eax
jz %%skip
cmp byte[winspdata+ebx-%1+16],0
jne %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16b+eax*4]
cmp dx,0
je %%noadd
and edx,[vesa2_clbit]
and eax,[vesa2_clbit]
add eax,edx
shr eax,1
%%noadd
mov [edi+ebx*2-%1*2],ax
xor eax,eax
%%skip
%endmacro
%macro sprdrawpra16bfa 1
or eax,eax
jz %%skip
test byte[sprpriodata+ebx-%1+16],cl
jnz %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16bcl+eax*4]
and edx,[vesa2_clbit]
add edx,eax
shr edx,1
xor eax,eax
mov edx,[fulladdtab+edx*2]
mov [edi+ebx*2-%1*2],dx
or byte[sprpriodata+ebx-%1+16],cl
%%skip
%endmacro
%macro sprdrawprb16bfa 1
or eax,eax
jz %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16bcl+eax*4]
and edx,[vesa2_clbit]
add edx,eax
shr edx,1
xor eax,eax
mov edx,[fulladdtab+edx*2]
mov [edi+ebx*2-%1*2],dx
%%skip
%endmacro
%macro sprdrawpraw16bfa 1
or eax,eax
jz %%skip
test byte[sprpriodata+ebx-%1+16],cl
jnz %%skip
cmp byte[winspdata+ebx-%1+16],0
jne %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16bcl+eax*4]
and edx,[vesa2_clbit]
add edx,eax
shr edx,1
xor eax,eax
mov edx,[fulladdtab+edx*2]
mov [edi+ebx*2-%1*2],dx
or byte[sprpriodata+ebx-%1+16],cl
%%skip
%endmacro
%macro sprdrawprbw16bfa 1
or eax,eax
jz %%skip
cmp byte[winspdata+ebx-%1+16],0
jne %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16bcl+eax*4]
and edx,[vesa2_clbit]
add edx,eax
shr edx,1
xor eax,eax
mov edx,[fulladdtab+edx*2]
mov [edi+ebx*2-%1*2],dx
%%skip
%endmacro
%macro sprdrawpra16bfs 1
or eax,eax
jz %%skip
test byte[sprpriodata+ebx-%1+16],cl
jnz %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16bxcl+eax*4]
and edx,[vesa2_clbit]
add edx,eax
shr edx,1
xor eax,eax
mov edx,[fulladdtab+edx*2]
xor edx,0FFFFh
mov [edi+ebx*2-%1*2],dx
or byte[sprpriodata+ebx-%1+16],cl
%%skip
%endmacro
%macro sprdrawprb16bfs 1
or eax,eax
jz %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16bxcl+eax*4]
and edx,[vesa2_clbit]
add edx,eax
shr edx,1
xor eax,eax
mov edx,[fulladdtab+edx*2]
xor edx,0FFFFh
mov [edi+ebx*2-%1*2],dx
%%skip
%endmacro
%macro sprdrawpraw16bfs 1
or eax,eax
jz %%skip
test byte[sprpriodata+ebx-%1+16],cl
jnz %%skip
cmp byte[winspdata+ebx-%1+16],0
jne %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16bxcl+eax*4]
and edx,[vesa2_clbit]
add edx,eax
shr edx,1
xor eax,eax
mov edx,[fulladdtab+edx*2]
xor edx,0FFFFh
mov [edi+ebx*2-%1*2],dx
or byte[sprpriodata+ebx-%1+16],cl
%%skip
%endmacro
%macro sprdrawprbw16bfs 1
or eax,eax
jz %%skip
cmp byte[winspdata+ebx-%1+16],0
jne %%skip
add al,ch
mov edx,[transpbuf+32+ebx*2-%1*2]
mov eax,[pal16bxcl+eax*4]
and edx,[vesa2_clbit]
add edx,eax
shr edx,1
xor eax,eax
mov edx,[fulladdtab+edx*2]
xor edx,0FFFFh
mov [edi+ebx*2-%1*2],dx
%%skip
%endmacro
;*******************************************************
; Processes & Draws 8x8 tiles for both main & sub screen
;*******************************************************
%macro draw8x816bta 2
mov al,[ebx+%1]
or al,al
jz %%loop
add al,dh
mov ecx,[pal16b+eax*4]
mov [esi+%2],cx
mov [ebp+%2],cx
%%loop
%endmacro
%macro draw8x816btawinon 2
mov al,[ebx+%1]
or al,al
jz %%loop
test byte[ecx+%1],0FFh
jnz %%loop
add al,dh
mov eax,[pal16b+eax*4]
mov [esi+%2],ax
mov [ebp+%2],ax
xor eax,eax
%%loop
%endmacro
%macro draw8x816btawinonb 2
mov al,[ebx+%1]
or al,al
jz %%loop
test byte[ecx+7-%1],0FFh
jnz %%loop
add al,dh
mov eax,[pal16b+eax*4]
mov [esi+%2],ax
mov [ebp+%2],ax
xor eax,eax
%%loop
%endmacro
%macro drawtilegrp 1
cmp dword[ebx],0
je near %%loop
%1 0, 0
%1 1, 2
%1 2, 4
%1 3, 6
%%loop
cmp dword[ebx+4],0
je near %%loop2
%1 4, 8
%1 5, 10
%1 6, 12
%1 7, 14
%%loop2
%endmacro
%macro drawtilegrpf 1
cmp dword[ebx+4],0
je near %%loop
%1 7, 0
%1 6, 2
%1 5, 4
%1 4, 6
%%loop
cmp dword[ebx],0
je near %%loop2
%1 3, 8
%1 2, 10
%1 1, 12
%1 0, 14
%%loop2
%endmacro
%macro drawtilegrpfull 1
cmp dword[edi],0
je near %%loop
%1 0, 0
%1 1, 2
%1 2, 4
%1 3, 6
%%loop
cmp dword[edi+4],0
je near %%loop2
%1 4, 8
%1 5, 10
%1 6, 12
%1 7, 14
%%loop2
%endmacro
%macro drawtilegrpfullf 1
cmp dword[edi+4],0
je near %%loop
%1 7, 0
%1 6, 2
%1 5, 4
%1 4, 6
%%loop
cmp dword[edi],0
je near %%loop2
%1 3, 8
%1 2, 10
%1 1, 12
%1 0, 14
%%loop2
%endmacro
;*******************************************************
; Processes & Draws 8x8 tiles in 2, 4, & 8 bit mode
;*******************************************************
%macro draw8x816ta 2
mov al,[ebx+%1]
or al,al
jz %%loop
add al,dh
mov ecx,[ebp+%2]
mov eax,[pal16b+eax*4]
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 draw8x816ta2 2
mov al,[edi+%1]
or al,al
jz %%loop
add al,dh
mov ebx,[ebp+%2]
mov ecx,[pal16b+eax*4]
test ebx,0FFFFh
je %%noadd
and ecx,1111011111011110b ; [vesa2_clbit]
and ebx,1111011111011110b ; [vesa2_clbit]
add ecx,ebx
shr ecx,1
%%noadd
mov [esi+%2],cx
%%loop
%endmacro
%macro draw8x816tb 2
mov al,[edi+%1]
or al,al
jz %%loop
add al,dh
mov ebx,[ebp+%2]
mov ecx,[pal16bcl+eax*4]
and ebx,1111011111011110b ; [vesa2_clbit]
add ecx,ebx
shr ecx,1
mov ecx,[fulladdtab+ecx*2]
mov [esi+%2],cx
%%loop
%endmacro
%macro draw8x816tc 2
mov al,[edi+%1]
or al,al
jz %%loop
add al,dh
mov ebx,[ebp+%2]
mov ecx,[pal16bxcl+eax*4]
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 draw8x816tawinon 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]
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 draw8x816tbwinon 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]
and ebx,1111011111011110b ; [vesa2_clbit]
add ecx,ebx
shr ecx,1
mov ecx,[fulladdtab+ecx*2]
mov [esi+%2],cx
%%loop
%endmacro
%macro draw8x816tcwinon 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]
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 draw8x816tawinon2 3
mov al,[edi+%1]
or al,al
jz %%loop
test byte[edx+%3],0FFh
jnz %%loop
add al,[coadder16]
mov ecx,[ebp+%2]
mov ebx,[pal16b+eax*4]
test ecx,0FFFFh
je %%noadd
and ebx,1111011111011110b ; [vesa2_clbit]
and ecx,1111011111011110b ; [vesa2_clbit]
add ebx,ecx
shr ebx,1
%%noadd
mov [esi+%2],bx
%%loop
%endmacro
%macro draw8x816tbwinon2 3
mov al,[edi+%1]
or al,al
jz %%loop
test byte[edx+%3],0FFh
jnz %%loop
add al,[coadder16]
mov ebx,[ebp+%2]
mov ecx,[pal16bcl+eax*4]
and ebx,1111011111011110b ; [vesa2_clbit]
add ecx,ebx
shr ecx,1
mov ecx,[fulladdtab+ecx*2]
mov [esi+%2],cx
%%loop
%endmacro
%macro draw8x816tcwinon2 3
mov al,[edi+%1]
or al,al
jz %%loop
test byte[edx+%3],0FFh
jnz %%loop
add al,[coadder16]
mov ebx,[ebp+%2]
mov ecx,[pal16bxcl+eax*4]
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 draw8x816tawinonb 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]
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 draw8x816tbwinonb 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]
and ebx,1111011111011110b ; [vesa2_clbit]
add ecx,ebx
shr ecx,1
mov ecx,[fulladdtab+ecx*2]
mov [esi+%2],cx
%%loop
%endmacro
%macro draw8x816tcwinonb 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]
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
; end makev16t
; ****************************************************
; ****************************************************
%macro Draw16x1616bwin 3
mov al,[ebx+%1]
test al,0FFh
jz %%loop
test byte[ebp+%3],0FFh
jnz %%loop
add al,dh
mov ecx,[pal16b+eax*4]
mov [esi+%2],cx
%%loop
%endmacro
;*******************************************************
; Processes & Draws 16x16 tiles in 2, 4, & 8 bit mode
;*******************************************************
%macro Draw16x1616b 2
mov al,[ebx+%1]
test al,0FFh
jz %%loop
add al,dh
mov ecx,[pal16b+eax*4]
mov [esi+%2],cx
%%loop
%endmacro
%macro drawpixel16b8x8winon 4
mov al,[ebx+%1]
test al,0FFh
jz %2
test byte[ebp+%4],0FFh
jnz %2
add al,dh
mov ecx,[pal16b+eax*4]
mov [esi+%3],cx
%2
%endmacro
%macro drawpixel16b8x8 3
mov al,[ebx+%1]
test al,0FFh
jz %2
add al,dh
mov ecx,[pal16b+eax*4]
mov [esi+%3],cx
%2
%endmacro
%macro Draw8x816bwinmacro 1
mov al,[ebx+%1]
or al,al
jz %%loop
test byte[ebp+%1],0FFh
jnz %%loop
add al,dh
mov ecx,[pal16b+eax*4]
mov [esi+%1*2],cx
%%loop
%endmacro
%macro Draw8x816bwinflipmacro 1
mov al,[ebx+7-%1]
or al,al
jz %%loop
test byte[ebp+%1],0FFh
jnz %%loop
add al,dh
mov ecx,[pal16b+eax*4]
mov [esi+%1*2],cx
%%loop
%endmacro
;*******************************************************
; DrawLine 16bit Draws the current line
;*******************************************************
; use curypos+bg1scroly for y location and bg1scrolx for x location
; use bg1ptr(b,c,d) for the pointer to the tile number contents
; use bg1objptr for the pointer to the object tile contents
%macro procmode716b 3
xor eax,eax
xor edx,edx
mov ax,[curypos]
test byte[mode7set],02h
jz .noflip
mov ax,261
sub ax,[curypos]
dec ax
.noflip
mov byte[curmosaicsz],1
test byte[mosaicon],%3
jz .nomos
mov bl,[mosaicsz]
cmp bl,0
je .nomos
inc bl
mov [curmosaicsz],bl
xor bh,bh
div bx
xor edx,edx
mul bx
.nomos
add ax,%1
mov dx,%2
call drawmode716b
%endmacro
%macro sprdrawpra16b 1
or eax,eax
jz %%skip
test byte[sprpriodata+ebx-%1+16],cl
jnz %%skip
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-%1*2],dx
or byte[sprpriodata+ebx-%1+16],cl
%%skip
%endmacro
%macro sprdrawprb16b 1
or eax,eax
jz %%skip
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-%1*2],dx
%%skip
%endmacro
%macro sprdrawpraw16b 1
or eax,eax
jz %%skip
test byte[sprpriodata+ebx-%1+16],cl
jnz %%skip
cmp byte[winspdata+ebx-%1+16],0
jne %%skip
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-%1*2],dx
or byte[sprpriodata+ebx-%1+16],cl
%%skip
%endmacro
%macro sprdrawprbw16b 1
or eax,eax
jz %%skip
cmp byte[winspdata+ebx-%1+16],0
jne %%skip
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-%1*2],dx
%%skip
%endmacro
;*******************************************************
; Processes & Draws 8x8 tiles in 2, 4, & 8 bit mode
;*******************************************************
%macro Draw8x816bmacro 1
mov al,[ebx+%1]
or al,al
jz %%loop
add al,dh
mov ecx,[pal16b+eax*4]
mov [esi+%1*2],cx
%%loop
%endmacro
%macro Draw8x816bflipmacro 1
mov al,[ebx+7-%1]
or al,al
jz %%loop
add al,dh
mov ecx,[pal16b+eax*4]
mov [esi+%1*2],cx
%%loop
%endmacro
%macro sprdrawa16b 1
xor eax,eax
mov al,[esi]
%1 8
mov al,[esi+1]
%1 7
mov al,[esi+2]
%1 6
mov al,[esi+3]
%1 5
mov al,[esi+4]
%1 4
mov al,[esi+5]
%1 3
mov al,[esi+6]
%1 2
mov al,[esi+7]
%1 1
%endmacro
%macro sprdrawaf16b 1
xor eax,eax
mov al,[esi]
%1 1
mov al,[esi+1]
%1 2
mov al,[esi+2]
%1 3
mov al,[esi+3]
%1 4
mov al,[esi+4]
%1 5
mov al,[esi+5]
%1 6
mov al,[esi+6]
%1 7
mov al,[esi+7]
%1 8
%endmacro
%macro sprdrawa 1
mov ax,[esi]
%1 8, al
%1 7, ah
mov ax,[esi+2]
%1 6, al
%1 5, ah
mov ax,[esi+4]
%1 4, al
%1 3, ah
mov ax,[esi+6]
%1 2, al
%1 1, ah
%endmacro
%macro sprdrawpra 2
or %2,%2
jz %%skip
test byte[sprpriodata+ebx-%1+16],dl
jnz %%skip
add %2,ch
mov [edi+ebx-%1],%2
or byte[sprpriodata+ebx-%1+16],dl
%%skip
%endmacro
%macro sprdrawprawb 2
or %2,%2
jz %%skip
test byte[sprpriodata+ebx-%1+16],dl
jnz %%skip
cmp byte[ecx+ebx-%1],1
je %%skip
add %2,dh
mov [edi+ebx-%1],%2
or byte[sprpriodata+ebx-%1+16],dl
%%skip
%endmacro
%macro sprdrawprb 2
or %2,%2
jz %%skip
add %2,ch
mov [edi+ebx-%1],%2
%%skip
%endmacro
%macro sprdrawprbwb 2
or %2,%2
jz %%skip
add %2,dh
cmp byte[ecx+ebx-%1],1
je %%skip
mov [edi+ebx-%1],%2
%%skip
%endmacro
%macro sprdrawpra2 2
or %2,%2
jz %%skip
or byte[sprpriodata+ebx-%1+16],dl
%%skip
%endmacro
%macro sprdrawpraw 2
or %2,%2
jz %%skip
test byte[sprpriodata+ebx-%1+16],dl
jnz %%skip
cmp byte[winspdata+ebx-%1+16],0
jne %%skip
add %2,ch
mov [edi+ebx-%1],%2
or byte[sprpriodata+ebx-%1+16],dl
%%skip
%endmacro
%macro sprdrawprbw 2
or %2,%2
jz %%skip
cmp byte[winspdata+ebx-%1+16],0
jne %%skip
add %2,ch
mov [edi+ebx-%1],%2
%%skip
%endmacro
%macro sprdrawaf 1
mov ax,[esi]
%1 1, al
%1 2, ah
mov ax,[esi+2]
%1 3, al
%1 4, ah
mov ax,[esi+4]
%1 5, al
%1 6, ah
mov ax,[esi+6]
%1 7, al
%1 8, ah
%endmacro
%macro procoffsetmode 0
push ebx
push edx
add word[ofsmmptr],2
add word[ofsmtptr],2
mov ebx,[yposngom]
mov eax,[flipyposngom]
mov [yadder],ebx
mov [yrevadder],eax
mov ax,[ofsmmptr]
test eax,03Fh
jnz %%next
mov bx,[bgtxadd]
add ax,bx
add [ofsmmptr],bx
add [ofsmtptr],bx
%%next
add eax,[vram]
mov edi,eax
mov ebx,[ofsmcptr]
add ebx,[ofsmcptr2]
mov eax,[OMBGTestVal]
test dword[ebx],eax
jz %%noofsm
mov ebx,[ebx]
mov ax,[ofsmtptr]
and ebx,3FFh
add ebx,[ofsmcyps]
test ebx,100h
jz %%noupper
add ax,[ofsmady]
%%noupper
and ebx,0FFh
mov edx,ebx
shr ebx,3
and edx,07h
shl ebx,6
shl edx,3
add ax,bx
mov [yadder],edx
xor edx,38h
mov [yrevadder],edx
add eax,[vram]
mov edi,eax
%%noofsm
mov ebx,[ofsmcptr]
add ebx,[ofsmcptr2]
add dword[ofshvaladd],8
mov eax,[OMBGTestVal]
add dword[ofsmcptr2],2
and dword[ofsmcptr2],3Fh
test dword[ebx-40h],eax
jz %%noofsmh
mov eax,edi
sub eax,[vram]
mov ebx,[ebx-40h]
sub ax,[ofsmtptr]
add ax,[ofsmtptrs]
add ebx,[ofshvaladd]
test ebx,100h
jz %%noleft
add ax,[ofsmadx]
%%noleft
and ebx,0F8h
shr ebx,2
add ax,bx
add eax,[vram]
mov edi,eax
%%noofsmh
pop edx
pop ebx
%endmacro
;*******************************************************
; Processes & Draws 8x8 offset mode in Mode 2/4
;*******************************************************
%macro initoffsetmode 0
push ebx
push ecx
mov ebx,2000h
mov ecx,ebp
shl ebx,cl
mov [OMBGTestVal],ebx
mov ecx,[bg1scroly+ebp*2]
and ecx,0FFFFh
add ecx,ebx
push eax
push edx
xor edx,edx
mov dx,[bg3scroly]
; and dx,0F8h
shr edx,3
shl edx,6
xor eax,eax
mov ax,[bg3ptr]
add ax,dx
xor edx,edx
mov dx,[bg3scrolx]
and dx,0F8h
xor ebx,ebx
mov ebx,[curypos]
mov [ofsmcyps],ebx
shr edx,3
shl edx,1
add ax,dx
mov dx,[bg3scrolx]
test dx,8000h
jz .nooma
and dx,0F000h
shr dx,5
add ax,dx
.nooma
add eax,40h
mov edx,eax
mov [Testval],edx
and edx,0FFFFFFC0h
add edx,[vram]
mov [ofsmcptr],edx
and eax,3Fh
mov [ofsmcptr2],eax
mov eax,[bg1ptry+ebp*4]
mov [ofsmady],eax
mov eax,[bg1ptrx+ebp*4]
mov [ofsmadx],eax
mov eax,[bg1ptr+ebp*2]
mov [ofsmtptr],eax
mov [ofsmtptrs],eax
test ecx,100h
jz .noyincd
add eax,[bg1ptry+ebp*4]
.noyincd
lea ecx,[ecx*8]
and ecx,07C0h ; 1Fh*40h
add eax,ecx
mov edx,[yadder]
mov [yposngom],edx
mov edx,[yrevadder]
mov [flipyposngom],edx
mov ecx,[bg1scrolx+ebp*2]
mov edx,[bg1ptrx+ebp*4]
test ecx,100h
jz .noxincd
add eax,edx
add [ofsmtptr],edx
neg dx
.noxincd
sub dx,64
and ecx,0F8h
and eax,0FFFFh
shr ecx,2
mov [bgtxadd],edx
add eax,ecx
add [ofsmtptr],ecx
mov [ofsmmptr],eax
xor eax,eax
mov ax,[bg1objptr+ebp*2]
shr eax,5
mov [ngptrdat2],eax
mov eax,edi
sub eax,[vram]
mov [ofsmmptr],eax
mov dword[ofshvaladd],0
pop edx
pop eax
pop ecx
pop ebx
%endmacro
%macro offsetmcachechk 0
; Cache check
push ecx
mov ecx,eax
add ecx,[ngptrdat2]
and ecx,2047
cmp word[vidmemch4+ecx*2],0
je %%nocache
call cachesingle4bng
%%nocache
pop ecx
%endmacro