Files
ZSNES/zsnes/src/video/mode716.asm
2006-01-01 13:47:21 +00:00

688 lines
15 KiB
NASM

;Copyright (C) 1997-2006 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.
%include "macros.mac"
EXTSYM mode7tab,winptrref,nglogicval,winlogicaval,curmosaicsz,curvidoffset
EXTSYM cwinptr,mode7A,mode7B,mode7C,mode7D,mode7X0,mode7Y0,mode7set,vram,vrama
EXTSYM xtravbuf,ngwleft,ngwleftb,mode7xpos,mode7ypos,mode7xrpos,mode7yrpos
EXTSYM mode7xadder,mode7yadder,mode7hr,dcolortab,UnusedBitXor,UnusedBit,scrndis
EXTSYM vidbright,prevbrightdc,Gendcolortable,mode7ab,mode7cd,BGMA,BG1SXl,BG1SYl
%include "video/mode716.mac"
;*******************************************************
; Processes & Draws Mode 7
;*******************************************************
%macro Mode7Normal 0
or dl,dl
jz %%nodrawb
mov dx,[ebp+edx*2]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Normalnt 0
or dl,dl
jz %%nodrawb
mov dx,[ebp+edx*2]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Normalt 0
or dl,dl
jz %%nodrawb
mov dx,[ebp+edx*2+512]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Normalmsnt 0
or dl,dl
jz %%nodrawb
mov dx,[ebp+edx*2]
mov [esi],dx
mov [esi+75036*2],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Normalmst 0
or dl,dl
jz %%nodrawb
mov dx,[ebp+edx*2+512]
mov [esi],dx
and dx,[UnusedBitXor]
mov [esi+75036*2],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Normalsnt 0
or dl,dl
jz %%nodrawb
mov dx,[ebp+edx*2]
mov [esi+75036*2],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Normalst 0
or dl,dl
jz %%nodrawb
mov dx,[ebp+edx*2]
mov [esi+75036*2],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Direct 0
or dl,dl
jz %%nodrawb
mov dx,[dcolortab+edx*4]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Directnt 0
or dl,dl
jz %%nodrawb
mov dx,[dcolortab+edx*4]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Directt 0
or dl,dl
jz %%nodrawb
mov dx,[dcolortab+edx*4]
or dx,[UnusedBit]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Directmsnt 0
or dl,dl
jz %%nodrawb
mov dx,[dcolortab+edx*4]
mov [esi],dx
mov [esi+75036*2],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Directmst 0
or dl,dl
jz %%nodrawb
mov dx,[dcolortab+edx*4]
mov [esi+75036*2],dx
or dx,[UnusedBit]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Directsnt 0
or dl,dl
jz %%nodrawb
mov dx,[dcolortab+edx*4]
mov [esi+75036*2],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7Directst 0
or dl,dl
jz %%nodrawb
mov dx,[dcolortab+edx*4]
mov [esi+75036*2],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7ExtBG 0
mov [esi+75036*8],dl
or dl,dl
jz %%nodrawb
test dl,80h
jnz %%nodrawb
mov dx,[ebp+edx*2]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7ExtBGnt 0
mov [esi+75036*8],dl
or dl,dl
jz %%nodrawb
test dl,80h
jnz %%nodrawb
mov dx,[ebp+edx*2]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7ExtBGt 0
mov [esi+75036*8],dl
or dl,dl
jz %%nodrawb
test dl,80h
jnz %%nodrawb
mov dx,[ebp+edx*2+512]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7ExtBGmsnt 0
mov [esi+75036*8],dl
or dl,dl
jz %%nodrawb
test dl,80h
jnz %%nodrawb
mov dx,[ebp+edx*2]
mov [esi],dx
mov [esi+75036*2],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7ExtBGmst 0
mov [esi+75036*8],dl
or dl,dl
jz %%nodrawb
test dl,80h
jnz %%nodrawb
mov dx,[ebp+edx*2+512]
mov [esi+75036*2],dx
or dx,[UnusedBit]
mov [esi],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7ExtBGsnt 0
mov [esi+75036*8],dl
or dl,dl
jz %%nodrawb
test dl,80h
jnz %%nodrawb
mov dx,[ebp+edx*2]
mov [esi+75036*2],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
%macro Mode7ExtBGst 0
mov [esi+75036*8],dl
or dl,dl
jz %%nodrawb
test dl,80h
jnz %%nodrawb
mov dx,[ebp+edx*2]
mov [esi+75036*2],dx
xor edx,edx
%%nodrawb
add esi,2
%endmacro
SECTION .text
NEWSYM drawmode7win16b
test byte[scrndis],1
jz .notdisabled
ret
.notdisabled
CheckTransparency 01h,drawmode7win16bt
normal
Mode7NonMainSub Mode7Normal
drawmode7win16bt
test byte[scadtng+ebx],1h
jz near drawmode7win16bnt
test byte[BGMS1+ebx*2+1],1h
jnz near drawmode716bmst
Mode7NonMainSub Mode7Normalt
drawmode716bmst:
mov edi,[CMainWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmt
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bst
drawmode7w16bmst
Mode7NonMainSub Mode7Normalmst
drawmode7w16bmt
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmst
Mode7MainSub Mode7Normalmst,Mode7Normalst
drawmode7w16bst
Mode7MainSub Mode7Normalmst,Mode7Normalt
drawmode7win16bnt:
test byte[BGMS1+ebx*2+1],1h
jnz near drawsprngm716bmsnt
Mode7NonMainSub Mode7Normalnt
drawsprngm716bmsnt:
cmp dword[ngwinen],0
je drawmode7w16bmsnt
mov edi,[CMainWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmnt
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bsnt
drawmode7w16bmsnt
Mode7NonMainSub Mode7Normalmsnt
drawmode7w16bmnt
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmsnt
Mode7MainSub Mode7Normalmsnt,Mode7Normalsnt
drawmode7w16bsnt
Mode7MainSub Mode7Normalmsnt,Mode7Normalnt
NEWSYM drawmode7win16bd
test byte[scrndis],1
jz .notdisabled
ret
.notdisabled
mov bl,[vidbright]
cmp bl,[prevbrightdc]
je .nodcchange
mov [prevbrightdc],bl
call Gendcolortable
.nodcchange
CheckTransparency 01h,drawmode7win16btd
Mode7NonMainSub Mode7Direct
drawmode7win16btd
test byte[scadtng+ebx],1h
jz near drawmode7win16bntd
test byte[BGMS1+ebx*2+1],1h
jnz near drawmode716bmstd
Mode7NonMainSub Mode7Directt
drawmode716bmstd:
mov edi,[CMainWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmtd
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bstd
drawmode7w16bmstd
Mode7NonMainSub Mode7Directmst
drawmode7w16bmtd
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmstd
Mode7MainSub Mode7Directmst,Mode7Directst
drawmode7w16bstd
Mode7MainSub Mode7Directmst,Mode7Directt
drawmode7win16bntd:
test byte[BGMS1+ebx*2+1],1h
jnz near drawsprngm716bmsntd
Mode7NonMainSub Mode7Directnt
drawsprngm716bmsntd:
cmp dword[ngwinen],0
je drawmode7w16bmsntd
mov edi,[CMainWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmntd
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bsntd
drawmode7w16bmsntd
Mode7NonMainSub Mode7Directmsnt
drawmode7w16bmntd
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmsntd
Mode7MainSub Mode7Directmsnt,Mode7Directsnt
drawmode7w16bsntd
Mode7MainSub Mode7Directmsnt,Mode7Directnt
NEWSYM drawmode7ngextbg16b
test byte[scrndis],1
jz .notdisabled
ret
.notdisabled
mov byte[curmosaicsz],1
push ecx
mov esi,[curvidoffset] ; esi = [vidbuffer] + curypos * 288 + 16
mov ecx,256
.loop
mov byte[esi+75036*8],0
add esi,2
dec ecx
jnz .loop
pop ecx
cmp byte[mode7hr+ebx],1
; je near drawmode7winextbghr16e
CheckTransparency 02h,drawmode7win16bte
mov esi,[cwinptr]
mov [winptrref],esi
mov esi,[curvidoffset]
Mode7NonMainSube Mode7ExtBG
drawmode7win16bte
test byte[scadtng+ebx],1h
jz near drawmode7win16bnte
test byte[BGMS1+ebx*2+1],1h
jnz near drawmode716bmste
Mode7NonMainSube Mode7ExtBGt
drawmode716bmste:
mov edi,[CMainWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmte
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bste
drawmode7w16bmste
Mode7NonMainSube Mode7ExtBGmst
drawmode7w16bmte
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmste
Mode7MainSube Mode7ExtBGmst,Mode7ExtBGst
drawmode7w16bste
Mode7MainSube Mode7ExtBGmst,Mode7ExtBGt
drawmode7win16bnte:
test byte[BGMS1+ebx*2+1],1h
jnz near drawsprngm716bmsnte
Mode7NonMainSube Mode7ExtBGnt
drawsprngm716bmsnte:
cmp dword[ngwinen],0
je drawmode7w16bmsnte
mov edi,[CMainWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmnte
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bsnte
drawmode7w16bmsnte
Mode7NonMainSube Mode7ExtBGmsnt
drawmode7w16bmnte
mov edi,[CSubWinScr]
cmp byte[edi+ebx],0
jne near drawmode7w16bmsnte
Mode7MainSube Mode7ExtBGmsnt,Mode7ExtBGsnt
drawmode7w16bsnte
Mode7MainSube Mode7ExtBGmsnt,Mode7ExtBGnt
%macro ExtBG2 1
mov esi,[curvidoffset] ; esi = [vidbuffer] + curypos * 288 + 16
mov ecx,256
xor eax,eax
.loop
mov al,[esi+75036*8]
test al,80h
jz .nopr2
and al,7Fh
%1
.nopr2
add esi,2
dec ecx
jnz .loop
xor eax,eax
ret
%endmacro
%macro ExtBGNormal 0
mov dx,[ebp+eax*2]
mov [esi],dx
%endmacro
%macro ExtBGNormalt 0
mov dx,[ebp+eax*2+512]
mov [esi],dx
%endmacro
%macro ExtBGNormalnt 0
mov dx,[ebp+eax*2]
mov [esi],dx
%endmacro
%macro ExtBGNormalst 0
mov dx,[ebp+eax*2]
mov [esi+75036*2],dx
%endmacro
%macro ExtBGNormalsnt 0
mov dx,[ebp+eax*2]
mov [esi+75036*2],dx
%endmacro
%macro ExtBGNormalmst 0
mov dx,[ebp+eax*2+512]
mov [esi],dx
and dx,[UnusedBitXor]
mov [esi+75036*2],dx
%endmacro
%macro ExtBGNormalmsnt 0
mov dx,[ebp+eax*2]
mov [esi],dx
mov [esi+75036*2],dx
%endmacro
NEWSYM drawmode7ngextbg216b
test byte[scrndis],1
jz .notdisabled
ret
.notdisabled
cmp byte[mode7hr+ebx],1
; je near drawmode7winextbg2hr16b
; esi = pointer to video buffer
CheckTransparency 01h,drawmode7ngextbg216bt
test byte[FillSubScr+ebx],1
jz .main
test byte[BGMS1+ebx*2],01h
jnz .main
add esi,75036*2
.main
ExtBG2 ExtBGNormal
drawmode7ngextbg216bt:
test byte[scadtng+ebx],1h
jz near drawmode7ngextbg216bnt
test byte[BGMS1+ebx*2+1],1h
jnz near drawmode7ngextbg216bmst
ExtBG2 ExtBGNormalt
drawmode7ngextbg216bmst
test byte[BGMS1+ebx*2],1h
jz near drawmode7ngextbg216bst
ExtBG2 ExtBGNormalmst
drawmode7ngextbg216bst:
ExtBG2 ExtBGNormalst
drawmode7ngextbg216bnt:
test byte[BGMS1+ebx*2+1],1h
jnz near drawmode7ngextbg216bmsnt
ExtBG2 ExtBGNormalnt
drawmode7ngextbg216bmsnt
test byte[BGMS1+ebx*2],1h
jz near drawmode7ngextbg216bsnt
ExtBG2 ExtBGNormalmsnt
drawmode7ngextbg216bsnt:
ExtBG2 ExtBGNormalsnt
ALIGN32
SECTION .bss
mtemp resd 1 ; for byte move left
mmode7xpos resd 1 ; x position
mtempa2 resd 1 ; keep this blank!
mmode7xrpos resd 1 ; x position
mtempa resd 1 ; keep this blank!
mmode7ypos resd 1 ; y position
mtempb2 resd 1 ; keep this blank!
mmode7yrpos resd 1 ; y position
mtempb resd 1 ; keep this blank!
mmode7xadder resd 1 ; number to add for x
mtempc2 resd 1 ; keep this blank!
mmode7xadd2 resd 1 ; number to add for x
mtempc resd 1 ; keep this blank!
mmode7yadder resd 1 ; number to add for y
mtempd2 resd 1 ; keep this blank!
mmode7yadd2 resd 1 ; number to add for y
mtempd resd 1 ; keep this blank!
mmode7ptr resd 1 ; pointer value
mmode7xinc resd 1 ; number to add for x
mmode7xincc resd 1 ; range check for x
mmode7yinc resd 1 ; number to add for y
mmode7xsloc resd 1 ; which screen x
mmode7ysloc resd 1 ; which screen y
mmode7xsrl resd 1 ; which relative screen x
mmode7ysrl resd 1 ; which relative screen y
mcxloc resw 1 ; cx location
mcyloc resw 1 ; cy location
M7HROn resd 1 ; High Resolution On
switchtorep3 resd 1
m7xaddof resd 1
m7xaddof2 resd 1
m7yaddof resd 1
m7yaddof2 resd 1
pixelsleft resd 1
mm7xaddof resd 1
mm7xaddof2 resd 1
mm7yaddof resd 1
mm7yaddof2 resd 1
SECTION .text
%macro newvaluepred 2
mov dx,[%1+ebx*4+8]
cmp dx,word[%1+ebx*4]
je %%nodivide
cmp byte[BGMA+ebx+2],7
je %%mode7scaleb
%%nodivide
movsx edx,word[%1+ebx*4+4]
movsx ecx,word[%1+ebx*4]
add ecx,edx
sar ecx,1
mov [%2],cx
jmp %%mode7scalend
%%mode7scaleb
mov esi,ebx
movsx ebx,word[%1+esi*4+8]
movsx edx,word[%1+esi*4]
sub ebx,edx
movsx ecx,word[%1+esi*4+4]
sub ecx,edx
mov eax,ecx
imul ecx
idiv ebx
add ax,word[%1+esi*4]
mov ebx,esi
mov [%2],ax
%%mode7scalend
%endmacro
CalculateNewValues:
; predict new values
push eax
push edx
push ebx
push esi
newvaluepred mode7ab,mode7A
newvaluepred mode7ab+2,mode7B
newvaluepred mode7cd,mode7C
newvaluepred mode7cd+2,mode7D
pop esi
pop ebx
pop edx
pop eax
mov ecx,edx
xor edx,edx
mov dx,[BG1SXl+ebx*2+2]
add edx,ecx
shr edx,1
mov ecx,eax
mov eax,ebx
inc eax
test byte[mode7set],02h
jz .noflip
mov eax,261
sub eax,ebx
.noflip
add ax,[BG1SYl+ebx*2+2]
add eax,ecx
sub ax,[ScrDispl]
sub ax,[ScrDispl]
ret
NEWSYM processmode7hires16b
cmp byte[BGMA+ebx+1],7
jne near .nogo
push esi
push ebx
call CalculateNewValues
add esi,75036*4
mov [curvidoffset],esi
mov dword[M7HROn],1
call drawmode7win16b
mov dword[M7HROn],0
pop ebx
pop esi
.nogo
ret
NEWSYM processmode7hires16bd
cmp byte[BGMA+ebx+1],7
jne near .nogo
push esi
push ebx
call CalculateNewValues
add esi,75036*4
mov [curvidoffset],esi
mov dword[M7HROn],1
call drawmode7win16bd
mov dword[M7HROn],0
pop ebx
pop esi
.nogo
ret