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

367 lines
8.7 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 cwinptr
EXTSYM coladdr,curmosaicsz,curvidoffset,domosaic16b,mode7A,drawmode7dcolor
EXTSYM mode7B,mode7C,mode7D,mode7X0,mode7Y0,mode7set,mode7tab,DoTransp
EXTSYM pal16b,pal16bcl,pal16bxcl,scaddtype,scrnon,transpbuf,drawmode716b
EXTSYM vesa2_clbit,vram,vrama,winon,xtravbuf,winptrref,scaddset
EXTSYM fulladdtab
NEWSYM Mode716TAsmStart
%include "video/mode7.mac"
;*******************************************************
; Processes & Draws Mode 7
;*******************************************************
%macro mode7halfadd 0
or dl,dl
jz %%nodraw
mov ecx,[ebp]
mov edx,[pal16bcl+edx*4]
or cx,cx
jz %%noadd
and edx,[vesa2_clbit]
and ecx,[vesa2_clbit]
add edx,ecx
shr edx,1
%%noadd
mov [esi],dx
xor ecx,ecx
xor edx,edx
%%nodraw
add esi,2
add ebp,2
%endmacro
%macro mode7fulladd 0
or dl,dl
jz %%nodraw
mov ecx,[ebp]
mov edx,[pal16bcl+edx*4]
and ecx,[vesa2_clbit]
add edx,ecx
shr edx,1
mov edx,[fulladdtab+edx*2]
mov [esi],dx
xor edx,edx
%%nodraw
add esi,2
add ebp,2
%endmacro
%macro mode7fullsub 0
or dl,dl
jz %%nodraw
mov ecx,[ebp]
mov edx,[pal16bxcl+edx*4]
and ecx,[vesa2_clbit]
add edx,ecx
shr edx,1
mov edx,[fulladdtab+edx*2]
xor edx,0FFFFh
mov [esi],dx
xor edx,edx
%%nodraw
add esi,2
add ebp,2
%endmacro
%macro mode7mainsub 0
or dl,dl
jz %%nodraw
mov ecx,[pal16b+edx*4]
mov [esi],cx
mov [ebp],cx
%%nodraw
add esi,2
add ebp,2
%endmacro
%macro mode7halfaddwinon 0
mov ecx,[cwinptr2]
or dl,dl
jz %%nodraw
test byte[ecx],0FFh
jnz %%nodraw
mov ecx,[ebp]
mov edx,[pal16bcl+edx*4]
or cx,cx
je %%noadd
and edx,[vesa2_clbit]
and ecx,[vesa2_clbit]
add edx,ecx
shr edx,1
%%noadd
mov [esi],dx
xor edx,edx
%%nodraw
xor ecx,ecx
inc dword[cwinptr2]
add esi,2
add ebp,2
%endmacro
%macro mode7fulladdwinon 0
mov ecx,[cwinptr2]
or dl,dl
jz %%nodraw
test byte[ecx],0FFh
jnz %%nodraw
mov ecx,[ebp]
mov edx,[pal16bcl+edx*4]
and ecx,[vesa2_clbit]
add edx,ecx
shr edx,1
mov edx,[fulladdtab+edx*2]
mov [esi],dx
xor edx,edx
%%nodraw
inc dword[cwinptr2]
xor ecx,ecx
add esi,2
add ebp,2
%endmacro
%macro mode7fullsubwinon 0
mov ecx,[cwinptr2]
or dl,dl
jz %%nodraw
test byte[ecx],0FFh
jnz %%nodraw
mov ecx,[ebp]
mov edx,[pal16bxcl+edx*4]
and ecx,[vesa2_clbit]
add edx,ecx
shr edx,1
mov edx,[fulladdtab+edx*2]
xor edx,0FFFFh
mov [esi],dx
xor edx,edx
%%nodraw
xor ecx,ecx
inc dword[cwinptr2]
add esi,2
add ebp,2
%endmacro
%macro mode7mainsubwinon 0
mov ecx,[cwinptr2]
or dl,dl
jz %%nodraw
test byte[ecx],0FFh
jnz %%nodraw
mov ecx,[pal16b+edx*4]
mov [esi],cx
mov [ebp],cx
%%nodraw
inc dword[cwinptr2]
xor ecx,ecx
add esi,2
add ebp,2
%endmacro
%macro mode716tmacro 2
Mode7Calculate
mov ebp,transpbuf+32
; esi = pointer to video buffer
mov esi,[curvidoffset] ; esi = [vidbuffer] + curypos * 288 + 16
mov edi,[vram]
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
.nomosaic
; esi = pointer to video buffer
; edi = pointer to vram
; [.mode7xadder] = dword value to add to x value (decimal between 7 & 8bit)
; [.mode7yadder] = dword value to add to y value (decimal between 7 & 8bit)
; [.mode7xpos] = dword value of x position, decimal between 7 & 8bit
; [.mode7xpos+1] = word value of x position
; [.mode7ypos] = dword value of y position, decimal between 7 & 8bit
; [.mode7ypos+1] = word value of y position
xor ebx,ebx
xor edx,edx
xor ecx,ecx
mov dword[.mode7xadd2],800h
mov byte[.mode7xinc],2
mov byte[.mode7xincc],0
test dword[.mode7xadder],80000000h
jz .noneg
mov dword[.mode7xadd2],-800h
mov byte[.mode7xinc],-2
mov byte[.mode7xincc],0FEh
.noneg
mov dword[.mode7yadd2],800h
mov byte[.mode7yinc],1
test dword[.mode7yadder],80000000h
jz .noneg2
mov dword[.mode7yadd2],-800h
mov byte[.mode7yinc],-1
.noneg2
mov edi,[vram]
cmp dword[.mode7xadder],7F0h
jg near .nextval3
cmp dword[.mode7xadder],-7F0h
jl near .nextval3
cmp dword[.mode7yadder],7F0h
jg near .nextval3
cmp dword[.mode7yadder],-7F0h
jl near .nextval3
cmp byte[curmosaicsz],1
jne .domosaic
cmp byte[winon],0
jne near .drawmode7win
.domosaic
mov edi,[vram]
cmp dword[.mode7xadder],7F0h
jg near .nextval3
cmp dword[.mode7xadder],-7F0h
jl near .nextval3
cmp dword[.mode7yadder],7F0h
jg near .nextval3
cmp dword[.mode7yadder],-7F0h
jl near .nextval3
Mode7Process %1, domosaic16b, 2
.nextval3
Mode7ProcessB %1, domosaic16b, 2
ALIGN32
.temp dd 0 ; for byte move left
.mode7xpos dd 0 ; x position
.tempa2 dd 0 ; keep this blank!
.mode7xrpos dd 0 ; x position
.tempa dd 0 ; keep this blank!
.mode7ypos dd 0 ; y position
.tempb2 dd 0 ; keep this blank!
.mode7yrpos dd 0 ; y position
.tempb dd 0 ; keep this blank!
.mode7xadder dd 0 ; number to add for x
.tempc2 dd 0 ; keep this blank!
.mode7xadd2 dd 0 ; number to add for x
.tempc dd 0 ; keep this blank!
.mode7yadder dd 0 ; number to add for y
.tempd2 dd 0 ; keep this blank!
.mode7yadd2 dd 0 ; number to add for y
.tempd dd 0 ; keep this blank!
.mode7ptr dd 0 ; pointer value
.mode7xinc dd 0 ; number to add for x
.mode7xincc dd 0 ; range check for x
.mode7yinc dd 0 ; number to add for y
.mode7xsloc dd 0 ; which screen x
.mode7ysloc dd 0 ; which screen y
.mode7xsrl dd 0 ; which relative screen x
.mode7ysrl dd 0 ; which relative screen y
.cxloc dw 0 ; cx location
.cyloc dw 0 ; cy location
.m7xaddofa dd 0
.m7xaddof2a dd 0
.m7yaddofa dd 0
.m7yaddof2a dd 0
.drawmode7win
.domosaicw
mov edi,[vram]
cmp dword[.mode7xadder],7F0h
jg near .nextval3w
cmp dword[.mode7xadder],-7F0h
jl near .nextval3w
cmp dword[.mode7yadder],7F0h
jg near .nextval3w
cmp dword[.mode7yadder],-7F0h
jl near .nextval3w
Mode7Process %2, domosaic16b, 2
.nextval3w
Mode7ProcessB %2, domosaic16b, 2
%endmacro
;*******************************************************
; Processes & Draws Mode 7 half Addition
;*******************************************************
NEWSYM drawmode716t
test byte[scaddset],1
jnz near drawmode7dcolor
cmp byte[DoTransp],1
jne .transpfull
jmp drawmode716b
.transpfull
mov esi,[cwinptr]
mov [winptrref],esi
mov [cwinptr2],esi
test byte[scaddtype],80h
jnz near drawmode716tsub
test byte[scaddtype],40h
jz near drawmode716tfulladd
cmp byte[scrnon+1],0
je near drawmode716tfulladd
cmp dword[coladdr],0
jnz near drawmode716tfulladd
; cmp byte[scrnon+1],10h
; je near drawmode716tfulladd
;.n
mode716tmacro mode7halfadd,mode7halfaddwinon
;*******************************************************
; Processes & Draws Mode 7 Full Addition
;*******************************************************
NEWSYM drawmode716tfulladd
mode716tmacro mode7fulladd,mode7fulladdwinon
;**********************************************************
; Processes and draws Mode 7 subtract
;**********************************************************
drawmode716tsub:
mode716tmacro mode7fullsub,mode7fullsubwinon
;**********************************************************
; Mode 7, main & sub mode
;**********************************************************
NEWSYM drawmode716tb
mov esi,[cwinptr]
mov [winptrref],esi
mov [cwinptr2],esi
mode716tmacro mode7mainsub,mode7mainsubwinon
cwinptr2 dd 0
NEWSYM Mode716TAsmEnd