3610 lines
74 KiB
NASM
3610 lines
74 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 BG116x16t,BG1SXl,BG1SYl,BG216x16t,BG2SXl,BG2SYl,BG316x16t,BG3PRI
|
|
EXTSYM BG3SXl,BG3SYl,BG416x16t,BG4SXl,BG4SYl,BGFB,BGMA,BGMS1,BGOPT1
|
|
EXTSYM BGOPT2,BGOPT3,BGOPT4,BGPT1,BGPT1X,BGPT1Y,BGPT2,BGPT2X,BGPT2Y,BGPT3
|
|
EXTSYM BGPT3X,BGPT3Y,BGPT4,BGPT4X,BGPT4Y,bg1drwng,bg1objptr,bg1ptr,bg1ptrx
|
|
EXTSYM bg1ptry,bg1scrolx,bg1scroly,bg1totng,bg2drwng,bg2objptr,bg2ptr
|
|
EXTSYM bg2ptrx,bg2ptry,bg2scrolx,bg2scroly,bg2totng,bg3drwng,bg3highst
|
|
EXTSYM bg3objptr,bg3ptr,bg3ptrx,bg3ptry,bg3scrolx,bg3scroly,bg3totng
|
|
EXTSYM bg4drwng,bg4objptr,bg4ptr,bg4ptrx,bg4ptry,bg4scrolx,bg4scroly
|
|
EXTSYM bg4totng,bgcmsung,bgmode,bgtxad,bgtxadd,cachesingle2bng
|
|
EXTSYM cachesingle8bng,cfieldad,cgfxmod,cgmod,cgram,coladdb
|
|
EXTSYM coladdg,coladdr,colleft16b,colormodedef,cpalval,csprbit,csprival
|
|
EXTSYM curmosaicsz,curvidoffset,curypos,firstdrawn
|
|
EXTSYM flipyposng,forceblnk,interlval,intrlng,maxbr,mode0add,mode0ads,mode7A
|
|
EXTSYM mode7C,mode7X0,mode7ab,mode7cd,mode7set,mode7st,mode7xy,modeused
|
|
EXTSYM mosaicon,mosaicsz,mosenng,mosszng,ngceax,ngcedi,ngpalcon2b,ngpalcon4b
|
|
EXTSYM ngpalcon8b,ngptrdat,pesimpng,prdata,prdatb,prdatc,prevbright
|
|
;EXTSYM ngpalcon8b,pesimpng,prdata,prdatb,prdatc,prevbright
|
|
EXTSYM prevpal,reslbyl,resolutn,scaddset,scaddtype,scadsng,scadtng,scbcong
|
|
EXTSYM scfbl,scrndis,scrnon,spritetablea,sprleftpr,sprlefttot,sprprdrn
|
|
EXTSYM sprpriodata,sprtbng,sprtlng,switch16x16,t16x161,t16x162,t16x163
|
|
EXTSYM t16x164,taddfy16x16,taddnfy16x16,tleftn,tleftnb,tltype2b,tltype4b
|
|
EXTSYM tltype8b,vcache2b,vcache4b,vcache8b,vesa2_bposng,vesa2_clbitng,vesa2_gposng
|
|
EXTSYM vesa2_rposng,vidbright,vidbuffer,vidmemch2,vidmemch4,drawsprng
|
|
EXTSYM vidmemch8,vrama,winon,xtravbuf,yposng,vbufdptr,preparesprpr
|
|
EXTSYM drawtileng2b16b,drawtileng4b16b,drawtileng8b16b
|
|
EXTSYM drawtileng16x162b16b,drawtileng16x164b16b,drawtileng16x168b16b
|
|
EXTSYM drawlineng2b16b,drawlineng4b16b,drawlineng8b16b,BuildWindow
|
|
EXTSYM drawlineng16x162b16b,drawlineng16x164b16b,drawlineng16x168b16b
|
|
EXTSYM ngextbg,bgwinchange,disableeffects,winbg1en,winenabs,winenabm
|
|
EXTSYM winl1,winbg1enval,winbg1envalm
|
|
EXTSYM winlogica,winlogicaval,winboundary,winobjen,winlogicb,nglogicval
|
|
EXTSYM ngwintable,winbg2enval,winbg3enval,winbg4enval,winbgobjenval
|
|
EXTSYM Mode7HiRes16b,res640,hiresstuff,Mode7BackA,Mode7BackC,Mode7BackX0
|
|
EXTSYM Mode7BackSet,drawmode7win16b,processmode7hires,ngwinen
|
|
EXTSYM drawlineng16x84b16b,drawlineng16x82b16b,ofsmcyps,vram,ofsmcptr
|
|
EXTSYM ofsmady,ofsmadx,ofsmtptr,yposngom,flipyposngom,ofsmmptr
|
|
EXTSYM ofsmval,ofsmvalh,hdmaearlstart,ofsmvalh,cbgval,drawlinengom4b16b
|
|
EXTSYM drawsprngw,ignor512,winbg1envals,FillSubScr,scanlines
|
|
EXTSYM drawmode7win16bd,SpecialLine,vidmemch2s
|
|
EXTSYM smallscreenon,ScreenScale,SA1Enable,drawlinengom16x164b16b
|
|
EXTSYM doveg,V8Mode
|
|
EXTSYM bgallchange,bg1change,bg2change,bg3change,bg4change
|
|
EXTSYM ngwinptr,objwlrpos,objwen,objclineptr,CSprWinPtr
|
|
EXTSYM BuildWindow2
|
|
EXTSYM NGNumSpr
|
|
EXTSYM fulladdtab
|
|
EXTSYM FPUCopy
|
|
|
|
NEWSYM NewGfx16AsmStart
|
|
|
|
%include "video/vidmacro.mac"
|
|
%include "video/newgfx16.mac"
|
|
%include "video/newg162.mac"
|
|
|
|
|
|
|
|
|
|
|
|
; mov ebp,[cpalval+ebx*4]
|
|
; 75036*2
|
|
; Different routines for:
|
|
; Normal (just one screen)
|
|
; Transparency
|
|
; No Transparency
|
|
|
|
; Sub+Main:
|
|
; Different Window Modes for each:
|
|
; SubWin+MainWin
|
|
; Sub+MainWin
|
|
; SubWin+Main
|
|
|
|
|
|
|
|
|
|
; cgfxmod :
|
|
; 0 = No addition whatsoever
|
|
; 1 = Addition in the back area only
|
|
; 2 = All of subscreen added to all of mainscreen
|
|
; 3 = All of subscreen added to specific mainscreens
|
|
; 4 = Add+Sub enabled
|
|
|
|
NEWSYM setpalallng
|
|
|
|
mov dword[palchanged],1
|
|
mov byte[cgmod],0
|
|
push esi
|
|
push eax
|
|
push edx
|
|
push ebp
|
|
mov esi,[cpalptrng]
|
|
mov byte[colleft16b],0
|
|
add esi,1024
|
|
xor ebp,ebp
|
|
and esi,255*1024
|
|
mov dword[cpalptrng],esi
|
|
|
|
add esi,[vbufdptr]
|
|
|
|
.loopa
|
|
mov dx,[cgram+ebp]
|
|
mov [prevpal2+ebp],dx
|
|
mov ax,dx
|
|
and al,01Fh
|
|
mov cl,[vidbright]
|
|
mul cl
|
|
mov cl,15
|
|
div cl
|
|
xor ah,ah
|
|
mov cl,[ngrposng]
|
|
xor ebx,ebx
|
|
shl ax,cl
|
|
add bx,ax
|
|
mov ax,dx
|
|
shr ax,5
|
|
and al,01Fh
|
|
mov cl,[vidbright]
|
|
mul cl
|
|
mov cl,15
|
|
div cl
|
|
xor ah,ah
|
|
mov cl,[nggposng]
|
|
shl ax,cl
|
|
add bx,ax
|
|
mov ax,dx
|
|
shr ax,10
|
|
and al,01Fh
|
|
mov cl,[vidbright]
|
|
mul cl
|
|
mov cl,15
|
|
div cl
|
|
xor ah,ah
|
|
mov cl,[ngbposng]
|
|
shl ax,cl
|
|
add bx,ax
|
|
mov ax,bx
|
|
mov [esi],bx ; standard
|
|
or bx,[UnusedBit]
|
|
mov [esi+512],bx ; standard
|
|
add esi,2
|
|
add ebp,2
|
|
inc byte[colleft16b]
|
|
jnz near .loopa
|
|
mov al,[vidbright]
|
|
mov [prevbright],al
|
|
pop ebp
|
|
pop edx
|
|
pop eax
|
|
pop esi
|
|
xor ecx,ecx
|
|
ret
|
|
|
|
NEWSYM setpalette16bng
|
|
cmp byte[V8Mode],1
|
|
jne .noveg
|
|
call doveg
|
|
.noveg
|
|
mov bl,[vidbright]
|
|
cmp bl,[prevbright]
|
|
jne near setpalallng
|
|
cmp byte[cgmod],0
|
|
je near .skipall
|
|
push esi
|
|
push edi
|
|
push eax
|
|
push edx
|
|
push ebp
|
|
mov byte[cgmod],0
|
|
xor ebp,ebp
|
|
mov esi,[cpalptrng]
|
|
mov edi,esi
|
|
add esi,1024
|
|
and esi,255*1024
|
|
mov dword[cpalptrng],esi
|
|
|
|
add esi,[vbufdptr]
|
|
add edi,[vbufdptr]
|
|
|
|
mov byte[colleft16b],0
|
|
jmp .loopa
|
|
.skipa
|
|
mov bx,[edi]
|
|
mov [esi],bx
|
|
mov bx,[edi+512]
|
|
mov [esi+512],bx
|
|
add edi,2
|
|
add esi,2
|
|
add ebp,2
|
|
inc byte[colleft16b]
|
|
jz near .endpal
|
|
.loopa
|
|
mov dx,[cgram+ebp]
|
|
cmp [prevpal2+ebp],dx
|
|
je .skipa
|
|
mov [prevpal2+ebp],dx
|
|
cmp byte[colleft16b],0
|
|
je .notchanged
|
|
mov dword[palchanged],1
|
|
.notchanged
|
|
mov ax,dx
|
|
and al,01Fh
|
|
mov cl,[vidbright]
|
|
mul cl
|
|
mov cl,15
|
|
div cl
|
|
xor ah,ah
|
|
mov cl,[ngrposng]
|
|
xor ebx,ebx
|
|
shl ax,cl
|
|
add bx,ax
|
|
mov ax,dx
|
|
shr ax,5
|
|
and al,01Fh
|
|
mov cl,[vidbright]
|
|
mul cl
|
|
mov cl,15
|
|
div cl
|
|
xor ah,ah
|
|
mov cl,[nggposng]
|
|
shl ax,cl
|
|
add bx,ax
|
|
mov ax,dx
|
|
shr ax,10
|
|
and al,01Fh
|
|
mov cl,[vidbright]
|
|
mul cl
|
|
mov cl,15
|
|
div cl
|
|
xor ah,ah
|
|
mov cl,[ngbposng]
|
|
shl ax,cl
|
|
add bx,ax
|
|
mov [esi],bx ; standard
|
|
or bx,[UnusedBit]
|
|
mov [esi+512],bx ; standard
|
|
add edi,2
|
|
add esi,2
|
|
add ebp,2
|
|
inc byte[colleft16b]
|
|
jnz near .loopa
|
|
.endpal
|
|
pop ebp
|
|
pop edx
|
|
pop eax
|
|
pop edi
|
|
pop esi
|
|
xor ecx,ecx
|
|
.skipall
|
|
ret
|
|
|
|
prevpal2 times 256 dw 0F00Fh
|
|
|
|
%macro WinBGCheck 1
|
|
mov bl,[winbg1en+%1]
|
|
mov bh,bl
|
|
test bl,0Ah
|
|
jz %%disable
|
|
|
|
test byte[scrnon],1 << %1
|
|
jz %%nomainbg
|
|
test byte[scrnon+1],1 << %1
|
|
jnz %%bg
|
|
xor bh,bh
|
|
jmp %%bg
|
|
%%nomainbg
|
|
xor bl,bl
|
|
test byte[scrnon+1],1 << %1
|
|
jnz %%bg
|
|
xor bh,bh
|
|
jmp %%skip
|
|
%%disable
|
|
xor bl,bl
|
|
xor bh,bh
|
|
jmp %%skip
|
|
%%bg
|
|
test byte[winenabs],1 << %1
|
|
jnz %%nbgs
|
|
xor bh,bh
|
|
%%nbgs
|
|
test byte[winenabm],1 << %1
|
|
jnz %%nbgm
|
|
xor bl,bl
|
|
%%nbgm
|
|
jmp %%skip
|
|
mov cl,bl
|
|
or cl,bh
|
|
and cl,0Ah
|
|
cmp cl,0Ah
|
|
je %%skip
|
|
mov ch,bl
|
|
or ch,bh
|
|
mov edx,[winl1]
|
|
cmp cl,02h
|
|
je %%bg1
|
|
shr ch,2
|
|
shr edx,16
|
|
%%bg1
|
|
test ch,01h
|
|
jnz %%outside
|
|
cmp dl,dh
|
|
jbe %%skip
|
|
xor bl,bl
|
|
xor bh,bh
|
|
jmp %%skip
|
|
%%outside
|
|
cmp dl,0
|
|
ja %%skip
|
|
cmp dh,255
|
|
jb %%skip
|
|
xor bl,bl
|
|
xor bh,bh
|
|
%%skip
|
|
mov [winbg1envalm+eax+%1*256],bl
|
|
mov [winbg1envals+eax+%1*256],bh
|
|
or bl,bh
|
|
mov [winbg1enval+eax+%1*256],bl
|
|
%endmacro
|
|
|
|
%macro WinBGCheckb 1
|
|
mov bl,[winbg1en+%1]
|
|
test bl,0Ah
|
|
jz %%disable
|
|
test byte[scrnon],1 << %1
|
|
jnz %%nbgen
|
|
test byte[winenabs],1 << %1
|
|
jnz %%bg
|
|
jmp %%disable
|
|
%%nbgen
|
|
test byte[winenabm],1 << %1
|
|
jnz %%bg
|
|
%%disable
|
|
xor bl,bl
|
|
jmp %%skip
|
|
%%bg
|
|
mov cl,bl
|
|
and cl,0Ah
|
|
cmp cl,0Ah
|
|
je %%skip
|
|
; jne %%notskip
|
|
; and bl,03h
|
|
; and cl,03h
|
|
;%%notskip
|
|
mov ch,bl
|
|
mov edx,[winl1]
|
|
cmp cl,02h
|
|
je %%bg1
|
|
shr ch,2
|
|
shr edx,16
|
|
%%bg1
|
|
test ch,01h
|
|
jnz %%outside
|
|
cmp dl,dh
|
|
jbe %%skip
|
|
xor bl,bl
|
|
jmp %%skip
|
|
%%outside
|
|
cmp dl,0
|
|
ja %%skip
|
|
cmp dh,255
|
|
jb %%skip
|
|
xor bl,bl
|
|
%%skip
|
|
mov [winbg1enval+eax+%1*256],bl
|
|
mov [winbg1envalm+eax+%1*256],bl
|
|
mov [winbg1envals+eax+%1*256],bl
|
|
%endmacro
|
|
|
|
%macro WinBGCheck2 1
|
|
mov bl,[winbg1en+%1]
|
|
test bl,0Ah
|
|
jnz %%nodisable
|
|
xor bl,bl
|
|
jmp %%skip
|
|
%%nodisable
|
|
mov cl,bl
|
|
or cl,bh
|
|
and cl,0Ah
|
|
cmp cl,0Ah
|
|
je %%skip
|
|
mov ch,bl
|
|
or ch,bh
|
|
mov edx,[winl1]
|
|
cmp cl,02h
|
|
je %%bg1
|
|
shr ch,2
|
|
shr edx,16
|
|
%%bg1
|
|
test ch,01h
|
|
jnz %%outside
|
|
cmp dl,dh
|
|
jbe %%skip
|
|
xor bl,bl
|
|
jmp %%skip
|
|
%%outside
|
|
cmp dl,0
|
|
ja %%skip
|
|
cmp dh,255
|
|
jb %%skip
|
|
xor bl,bl
|
|
%%skip
|
|
mov [winbg1enval+eax+%1*256],bl
|
|
%endmacro
|
|
|
|
BackAreaAdd dd 0
|
|
BackAreaUnFillCol dd 0
|
|
BackAreaFillCol dd 0
|
|
clinemainsub dd 0
|
|
|
|
BackAreaFill:
|
|
cmp byte[winbg1enval+eax+5*256],0
|
|
je near .nowindowb
|
|
mov ebx,[BackAreaFillCol]
|
|
cmp ebx,[BackAreaUnFillCol]
|
|
je near .nowindowb
|
|
push ecx
|
|
push edx
|
|
push eax
|
|
push edi
|
|
|
|
mov ebx,eax
|
|
mov ecx,[vidbuffer]
|
|
add ecx,16*2
|
|
shl eax,9
|
|
add ecx,eax
|
|
mov eax,ebx
|
|
shl eax,6
|
|
add ecx,eax
|
|
add ecx,[BackAreaAdd]
|
|
|
|
; Construct Window in ecx
|
|
mov edi,ngwintable
|
|
sub ecx,2
|
|
mov eax,256
|
|
.procnotemptyb
|
|
mov edx,[edi]
|
|
add edi,4
|
|
or edx,edx
|
|
jz .procemptyb
|
|
dec edx
|
|
mov ebx,[BackAreaUnFillCol]
|
|
.swloopb
|
|
mov dword[ecx],ebx
|
|
mov dword[ecx+4],ebx
|
|
add ecx,8
|
|
sub eax,4
|
|
jc .doneb
|
|
sub edx,4
|
|
jnc .swloopb
|
|
sub eax,edx
|
|
add ecx,edx
|
|
add ecx,edx
|
|
dec eax
|
|
add ecx,2
|
|
.procemptyb
|
|
mov edx,[edi]
|
|
dec edx
|
|
add edi,4
|
|
mov ebx,[BackAreaFillCol]
|
|
.swloop2b
|
|
mov dword[ecx],ebx
|
|
mov dword[ecx+4],ebx
|
|
add ecx,8
|
|
sub eax,4
|
|
jc .doneb
|
|
sub edx,4
|
|
jnc .swloop2b
|
|
sub eax,edx
|
|
add ecx,edx
|
|
add ecx,edx
|
|
dec eax
|
|
add ecx,2
|
|
jmp .procnotemptyb
|
|
.doneb
|
|
pop edi
|
|
pop eax
|
|
pop edx
|
|
pop ecx
|
|
jmp .yeswindowb
|
|
.nowindowb
|
|
push eax
|
|
push ecx
|
|
mov ebx,eax
|
|
mov ecx,[vidbuffer]
|
|
mov eax,ebx
|
|
add ecx,16*2
|
|
shl eax,9
|
|
add ecx,eax
|
|
mov eax,ebx
|
|
shl eax,6
|
|
add ecx,eax
|
|
add ecx,[BackAreaAdd]
|
|
mov ebx,[BackAreaUnFillCol]
|
|
mov eax,128
|
|
.nowinloop
|
|
mov [ecx],ebx
|
|
add ecx,4
|
|
dec eax
|
|
jnz .nowinloop
|
|
pop ecx
|
|
pop eax
|
|
.yeswindowb
|
|
ret
|
|
|
|
NEWSYM newengine16b
|
|
; store line by line data
|
|
; BGMode, BGxScrollX, BGxScrollY, both BGPtrs
|
|
mov eax,[curypos]
|
|
and eax,0FFh
|
|
|
|
cmp eax,1
|
|
jne .noclearcache
|
|
push eax
|
|
push ecx
|
|
mov ebx,vidmemch2s
|
|
mov ecx,1024+512+256
|
|
mov eax,0FFFFFFFFh
|
|
.loopcc
|
|
mov dword[ebx],eax
|
|
add ebx,4
|
|
loop .loopcc
|
|
pop ecx
|
|
pop eax
|
|
mov dword[startlinet],0
|
|
mov dword[endlinet],255
|
|
xor ebx,ebx
|
|
.noclearcache
|
|
|
|
mov byte[bgallchange+eax],0
|
|
mov byte[bgallchange+eax+1],0FFh
|
|
mov byte[bg1change+eax],0
|
|
mov byte[bg2change+eax],0
|
|
mov byte[bg3change+eax],0
|
|
mov byte[bg4change+eax],0
|
|
mov dword[palchanged],0
|
|
|
|
; BG3 Priority
|
|
mov bl,[bg3highst]
|
|
mov [BG3PRI+eax],bl
|
|
cmp [BG3PRI+eax-1],bl
|
|
je .nosbg3pr
|
|
mov byte[bgallchange+eax],1
|
|
.nosbg3pr
|
|
|
|
; Main/Sub Screen
|
|
cmp byte[SA1Enable],0
|
|
je .noscrnona
|
|
cmp word[scrnon],1317h
|
|
jne .noscrnona
|
|
cmp byte[scaddtype],0
|
|
jne .noscrnona
|
|
mov word[scrnon],1317h
|
|
mov byte[scaddtype],44h
|
|
mov byte[scaddset],02h
|
|
.noscrnona
|
|
mov ebx,[scrnon]
|
|
; clear
|
|
push ecx
|
|
mov cl,[scrnon]
|
|
and cl,1Fh
|
|
or cl,20h
|
|
and cl,[scaddtype]
|
|
and cl,3Fh
|
|
mov byte[FillSubScr+eax],1
|
|
or cl,cl
|
|
jnz .yessub
|
|
xor bh,bh
|
|
mov byte[FillSubScr+eax],0
|
|
.yessub
|
|
pop ecx
|
|
test byte[scaddset],2
|
|
jnz .subscrnon
|
|
xor bh,bh
|
|
.subscrnon
|
|
or [bgcmsung],ebx
|
|
mov [BGMS1+eax*2],ebx
|
|
cmp [BGMS1+eax*2-2],bx
|
|
je .nosbgms1
|
|
mov byte[bgallchange+eax],1
|
|
.nosbgms1
|
|
|
|
; if palette[0] = 0 and transparency is just add to back area,
|
|
; set ngmsdraw to 1
|
|
mov byte[clinemainsub],0
|
|
cmp word[cgram],0
|
|
jne .ngmsdraw0
|
|
mov bl,[scrnon]
|
|
and bl,1Fh
|
|
or bl,0E0h
|
|
and bl,[scaddtype]
|
|
cmp bl,20h
|
|
jne .ngmsdraw0
|
|
mov byte[ngmsdraw],1
|
|
mov byte[FillSubScr+eax],0
|
|
mov byte[clinemainsub],1
|
|
.ngmsdraw0
|
|
|
|
; Scroll Values
|
|
mov bx,[bg1scrolx]
|
|
mov [BG1SXl+eax*2],bx
|
|
cmp [BG1SXl+eax*2-2],bx
|
|
je .nosbgx1
|
|
mov byte[bg1change+eax],1
|
|
.nosbgx1
|
|
mov bx,[bg2scrolx]
|
|
mov [BG2SXl+eax*2],bx
|
|
cmp [BG2SXl+eax*2-2],bx
|
|
je .nosbgx2
|
|
mov byte[bg2change+eax],1
|
|
.nosbgx2
|
|
mov bx,[bg3scrolx]
|
|
mov [BG3SXl+eax*2],bx
|
|
cmp [BG3SXl+eax*2-2],bx
|
|
je .nosbgx3
|
|
mov byte[bg3change+eax],1
|
|
.nosbgx3
|
|
mov bx,[bg4scrolx]
|
|
mov [BG4SXl+eax*2],bx
|
|
cmp [BG4SXl+eax*2-2],bx
|
|
je .nosbgx4
|
|
mov byte[bg4change+eax],1
|
|
.nosbgx4
|
|
|
|
mov bx,[bg1scroly]
|
|
mov [BG1SYl+eax*2],bx
|
|
cmp [BG1SYl+eax*2-2],bx
|
|
je .nosbgy1
|
|
mov byte[bg1change+eax],1
|
|
.nosbgy1
|
|
mov bx,[bg2scroly]
|
|
mov [BG2SYl+eax*2],bx
|
|
cmp [BG2SYl+eax*2-2],bx
|
|
je .nosbgy2
|
|
mov byte[bg2change+eax],1
|
|
.nosbgy2
|
|
mov bx,[bg3scroly]
|
|
mov [BG3SYl+eax*2],bx
|
|
cmp [BG3SYl+eax*2-2],bx
|
|
je .nosbgy3
|
|
mov byte[bg3change+eax],1
|
|
.nosbgy3
|
|
mov bx,[bg4scroly]
|
|
mov [BG4SYl+eax*2],bx
|
|
cmp [BG4SYl+eax*2-2],bx
|
|
je .nosbgy4
|
|
mov byte[bg1change+eax],1
|
|
.nosbgy4
|
|
|
|
; Background Mode
|
|
mov bl,[bgmode]
|
|
and bl,07h
|
|
mov [BGMA+eax],bl
|
|
cmp [BGMA+eax-1],bl
|
|
je .nobgma
|
|
mov byte[bgallchange+eax],1
|
|
.nobgma
|
|
|
|
; new graphics fix, thanks to TRAC
|
|
and ebx,07h
|
|
mov byte[modeused+ebx],1
|
|
|
|
; Pointer to OBJ tile data
|
|
mov ebx,[bg1objptr]
|
|
mov [BGOPT1+eax*2],ebx
|
|
cmp [BGOPT1+eax*2-2],bx
|
|
je .nosbgo1
|
|
mov byte[bg1change+eax],1
|
|
.nosbgo1
|
|
mov ebx,[bg2objptr]
|
|
mov [BGOPT2+eax*2],ebx
|
|
cmp [BGOPT2+eax*2-2],bx
|
|
je .nosbgo2
|
|
mov byte[bg2change+eax],1
|
|
.nosbgo2
|
|
mov ebx,[bg3objptr]
|
|
mov [BGOPT3+eax*2],ebx
|
|
cmp [BGOPT3+eax*2-2],bx
|
|
je .nosbgo3
|
|
mov byte[bg3change+eax],1
|
|
.nosbgo3
|
|
mov ebx,[bg4objptr]
|
|
mov [BGOPT4+eax*2],ebx
|
|
cmp [BGOPT4+eax*2-2],bx
|
|
je .nosbgo4
|
|
mov byte[bg4change+eax],1
|
|
.nosbgo4
|
|
|
|
; Pointer to tile status data
|
|
mov ebx,[bg1ptr]
|
|
mov [BGPT1+eax*2],ebx
|
|
cmp [BGPT1+eax*2-2],bx
|
|
je .nosbgp1
|
|
mov byte[bg1change+eax],1
|
|
.nosbgp1
|
|
mov ebx,[bg2ptr]
|
|
mov [BGPT2+eax*2],ebx
|
|
cmp [BGPT2+eax*2-2],bx
|
|
je .nosbgp2
|
|
mov byte[bg2change+eax],1
|
|
.nosbgp2
|
|
mov ebx,[bg3ptr]
|
|
mov [BGPT3+eax*2],ebx
|
|
cmp [BGPT3+eax*2-2],bx
|
|
je .nosbgp3
|
|
mov byte[bg3change+eax],1
|
|
.nosbgp3
|
|
mov ebx,[bg4ptr]
|
|
mov [BGPT4+eax*2],ebx
|
|
cmp [BGPT4+eax*2-2],bx
|
|
je .nosbgp4
|
|
mov byte[bg4change+eax],1
|
|
.nosbgp4
|
|
|
|
mov ebx,[bg1ptrx]
|
|
mov [BGPT1X+eax*2],ebx
|
|
cmp [BGPT1X+eax*2-2],bx
|
|
je .nosbgpx1
|
|
mov byte[bg1change+eax],1
|
|
.nosbgpx1
|
|
mov ebx,[bg2ptrx]
|
|
mov [BGPT2X+eax*2],ebx
|
|
cmp [BGPT2X+eax*2-2],bx
|
|
je .nosbgpx2
|
|
mov byte[bg2change+eax],1
|
|
.nosbgpx2
|
|
mov ebx,[bg3ptrx]
|
|
mov [BGPT3X+eax*2],ebx
|
|
cmp [BGPT3X+eax*2-2],bx
|
|
je .nosbgpx3
|
|
mov byte[bg3change+eax],1
|
|
.nosbgpx3
|
|
mov ebx,[bg4ptrx]
|
|
mov [BGPT4X+eax*2],ebx
|
|
cmp [BGPT4X+eax*2-2],bx
|
|
je .nosbgpx4
|
|
mov byte[bg4change+eax],1
|
|
.nosbgpx4
|
|
|
|
mov ebx,[bg1ptry]
|
|
mov [BGPT1Y+eax*2],ebx
|
|
cmp [BGPT1Y+eax*2-2],bx
|
|
je .nosbgpy1
|
|
mov byte[bg1change+eax],1
|
|
.nosbgpy1
|
|
mov ebx,[bg2ptry]
|
|
mov [BGPT2Y+eax*2],ebx
|
|
cmp [BGPT2Y+eax*2-2],bx
|
|
je .nosbgpy2
|
|
mov byte[bg2change+eax],1
|
|
.nosbgpy2
|
|
mov ebx,[bg3ptry]
|
|
mov [BGPT3Y+eax*2],ebx
|
|
cmp [BGPT3Y+eax*2-2],bx
|
|
je .nosbgpy3
|
|
mov byte[bg3change+eax],1
|
|
.nosbgpy3
|
|
mov ebx,[bg4ptry]
|
|
mov [BGPT4Y+eax*2],ebx
|
|
cmp [BGPT4Y+eax*2-2],bx
|
|
je .nosbgpy4
|
|
mov byte[bg4change+eax],1
|
|
.nosbgpy4
|
|
mov ebx,[forceblnk]
|
|
or bl,bl
|
|
jne .dontdraw
|
|
mov dword[scfbl],0
|
|
.dontdraw
|
|
; Variable size write error fix [TRAC]
|
|
mov [BGFB+eax],bl
|
|
cmp [BGFB+eax-1],bl
|
|
je .nosbgfb
|
|
mov byte[bgallchange+eax],1
|
|
.nosbgfb
|
|
|
|
mov ebx,[mode7A]
|
|
mov [mode7ab+eax*4],ebx
|
|
mov ebx,[mode7C]
|
|
mov [mode7cd+eax*4],ebx
|
|
mov ebx,[mode7X0]
|
|
mov [mode7xy+eax*4],ebx
|
|
mov ebx,[mode7set]
|
|
mov [mode7st+eax],ebx
|
|
|
|
; 16x16 tiles
|
|
mov ebx,[BG116x16t]
|
|
mov [t16x161+eax],ebx
|
|
cmp [t16x161+eax-1],bl
|
|
je .not16x161
|
|
mov byte[bg1change+eax],1
|
|
.not16x161
|
|
mov ebx,[BG216x16t]
|
|
mov [t16x162+eax],ebx
|
|
cmp [t16x162+eax-1],bl
|
|
je .not16x162
|
|
mov byte[bg2change+eax],1
|
|
.not16x162
|
|
mov ebx,[BG316x16t]
|
|
mov [t16x163+eax],ebx
|
|
cmp [t16x163+eax-1],bl
|
|
je .not16x163
|
|
mov byte[bg3change+eax],1
|
|
.not16x163
|
|
mov ebx,[BG416x16t]
|
|
mov [t16x164+eax],ebx
|
|
cmp [t16x164+eax-1],bl
|
|
je .not16x164
|
|
mov byte[bg4change+eax],1
|
|
.not16x164
|
|
|
|
; mov byte[mode7hr+eax],0
|
|
cmp byte[bgmode],7
|
|
jne .noextbg
|
|
; cmp byte[res640],0
|
|
; je .nomode7512
|
|
; mov byte[mode7hr+eax],1
|
|
;.nomode7512
|
|
test byte[interlval],40h
|
|
jz .noextbg
|
|
mov byte[ngextbg],1
|
|
.noextbg
|
|
|
|
; mosaic
|
|
mov ebx,[mosaicon]
|
|
mov [mosenng+eax],ebx
|
|
mov ebx,[mosaicsz]
|
|
mov [mosszng+eax],ebx
|
|
|
|
; Interlaced
|
|
mov ebx,[interlval]
|
|
mov [intrlng+eax],ebx
|
|
|
|
; Set palette
|
|
call setpalette16bng
|
|
|
|
cmp dword[palchanged],1
|
|
jne .notpchanged
|
|
cmp eax,112
|
|
jae .endl
|
|
mov dword[startlinet],eax
|
|
jmp .notpchanged
|
|
.endl
|
|
cmp dword[endlinet],255
|
|
jb .notpchanged
|
|
mov dword[endlinet],eax
|
|
.notpchanged
|
|
|
|
mov ebx,[cpalptrng]
|
|
add ebx,[vbufdptr]
|
|
mov [cpalval+eax*4],ebx
|
|
|
|
; Set Transparency
|
|
mov bl,[scaddtype]
|
|
mov [scadtng+eax],bl
|
|
cmp [scadtng+eax-1],bl
|
|
je .noscadt
|
|
mov byte[bgallchange+eax],1
|
|
.noscadt
|
|
|
|
mov bl,[scaddset]
|
|
mov [scadsng+eax],bl
|
|
cmp [scadsng+eax-1],bl
|
|
je .noscads
|
|
mov byte[bgallchange+eax],1
|
|
.noscads
|
|
|
|
; Windowing Stuff
|
|
;NEWSYM winl1, db 0 ; window 1 left position
|
|
;NEWSYM winr1, db 0 ; window 1 right position
|
|
;NEWSYM winl2, db 0 ; window 2 left position
|
|
;NEWSYM winr2, db 0 ; window 2 right position
|
|
;NEWSYM winbg1en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG1
|
|
;NEWSYM winbg2en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG2
|
|
;NEWSYM winbg3en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG3
|
|
;NEWSYM winbg4en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG4
|
|
;NEWSYM winobjen, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on sprites
|
|
;NEWSYM wincolen, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on backarea
|
|
;NEWSYM winlogica, db 0 ; Window logic type for BG1 to 4
|
|
;NEWSYM winlogicb, db 0 ; Window logic type for Sprites and Backarea
|
|
;NEWSYM winenabm, db 0 ; Window logic enable for main screen
|
|
;NEWSYM winenabs, db 0 ; Window logic enable for sub screen
|
|
|
|
;NEWSYM winboundary, times 256 dd 0
|
|
;NEWSYM winbg1enval, times 256 db 0
|
|
;NEWSYM winbg2enval, times 256 db 0
|
|
;NEWSYM winbg3enval, times 256 db 0
|
|
;NEWSYM winbg4enval, times 256 db 0
|
|
;NEWSYM winbgobjenval, times 256 db 0
|
|
;NEWSYM winlogicaval, times 256 dw 0
|
|
mov byte[bgwinchange+eax],0
|
|
cmp byte[disableeffects],1
|
|
je near .finishwin
|
|
push ecx
|
|
push edx
|
|
WinBGCheck 0
|
|
WinBGCheck 1
|
|
WinBGCheck 2
|
|
WinBGCheck 3
|
|
WinBGCheck 4
|
|
WinBGCheck2 5
|
|
|
|
mov ebx,[winlogica]
|
|
mov [winlogicaval+eax*2],ebx
|
|
cmp [winlogicaval+eax*2-2],bx
|
|
je .winnchangedb
|
|
mov byte[bgwinchange+eax],1
|
|
.winnchangedb
|
|
mov ebx,[winl1]
|
|
mov [winboundary+eax*4],ebx
|
|
cmp [winboundary+eax*4-4],ebx
|
|
je .winnchanged
|
|
mov byte[bgwinchange+eax],1
|
|
.winnchanged
|
|
|
|
; generate sprite window
|
|
cmp byte[winbg1enval+eax+4*256],0
|
|
je near .skipobjw
|
|
|
|
mov ebx,[winl1]
|
|
mov dl,[winobjen]
|
|
mov dh,[winlogicb]
|
|
and dh,03h
|
|
; Same as previous line?
|
|
cmp [objwlrpos+eax*4-4],ebx
|
|
jne .changedb
|
|
cmp [objwen+eax*2-2],dx
|
|
je near .notchanged
|
|
.changedb
|
|
cmp [objwlrpos+eax*4],ebx
|
|
jne .changed
|
|
cmp [objwen+eax*2],dx
|
|
jne .changed
|
|
mov ecx,[CSprWinPtr]
|
|
cmp [objclineptr+eax*4],ecx
|
|
ja near .usecurrent
|
|
.changed
|
|
mov [objwlrpos+eax*4],ebx
|
|
mov [objwen+eax*2],dx
|
|
|
|
mov bl,[winlogicb]
|
|
and bl,03h
|
|
mov [nglogicval],bl
|
|
mov ebx,4*256
|
|
add ebx,eax
|
|
mov dword[ngwinen],0
|
|
call BuildWindow2
|
|
cmp dword[ngwinen],0
|
|
je near .disablesprwin
|
|
mov ecx,[CSprWinPtr]
|
|
add ecx,260
|
|
mov [CSprWinPtr],ecx
|
|
mov [objclineptr+eax*4],ecx
|
|
add ecx,[ngwinptr]
|
|
; Construct Window in ecx
|
|
push eax
|
|
mov ebx,ngwintable
|
|
dec ecx
|
|
mov eax,256
|
|
.procnotempty
|
|
mov edx,[ebx]
|
|
add ebx,4
|
|
or edx,edx
|
|
jz .procempty
|
|
dec edx
|
|
.swloop
|
|
mov dword[ecx],0
|
|
add ecx,4
|
|
sub eax,4
|
|
jc .done
|
|
sub edx,4
|
|
jnc .swloop
|
|
sub eax,edx
|
|
add ecx,edx
|
|
dec eax
|
|
inc ecx
|
|
.procempty
|
|
mov edx,[ebx]
|
|
dec edx
|
|
add ebx,4
|
|
.swloop2
|
|
mov dword[ecx],01010101h
|
|
add ecx,4
|
|
sub eax,4
|
|
jc .done
|
|
sub edx,4
|
|
jnc .swloop2
|
|
sub eax,edx
|
|
add ecx,edx
|
|
dec eax
|
|
inc ecx
|
|
jmp .procnotempty
|
|
.done
|
|
pop eax
|
|
;NEWSYM objwlrpos , times 256 dd 0
|
|
;NEWSYM objwen , times 256 dw 0 ; en,log
|
|
;NEWSYM objclineptr, times 256 dd 0 ; l1,r1,l2,r2,en,log,ptr
|
|
jmp .skipobjw
|
|
.usecurrent
|
|
mov ecx,[objclineptr+eax*4]
|
|
mov [CSprWinPtr],ecx
|
|
cmp ecx,0FFFFFFFFh
|
|
jnz .skipobjw
|
|
jmp .disablesprwin
|
|
; copy over if it's the same
|
|
.notchanged
|
|
mov [objwlrpos+eax*4],ebx
|
|
mov [objwen+eax*2],dx
|
|
mov ebx,[objclineptr+eax*4-4]
|
|
mov [objclineptr+eax*4],ebx
|
|
cmp ebx,0FFFFFFFFh
|
|
je .disablesprwin
|
|
.skipobjw
|
|
pop edx
|
|
pop ecx
|
|
jmp .okaywin
|
|
.disablesprwin
|
|
mov dword[objclineptr+eax*4],0FFFFFFFFh
|
|
mov byte[winbg1enval+eax+4*256],0
|
|
mov byte[winbg1envals+eax+4*256],0
|
|
mov byte[winbg1envalm+eax+4*256],0
|
|
pop edx
|
|
pop ecx
|
|
jmp .okaywin
|
|
.finishwin
|
|
mov byte[winbg1enval+eax],0
|
|
mov byte[winbg2enval+eax],0
|
|
mov byte[winbg3enval+eax],0
|
|
mov byte[winbg4enval+eax],0
|
|
mov byte[winbgobjenval+eax],0
|
|
.okaywin
|
|
xor ebx,ebx
|
|
|
|
mov ebx,[coladdr-1]
|
|
mov bl,[vidbright]
|
|
cmp [Prevcoladdr],ebx
|
|
je .samecolor
|
|
mov [Prevcoladdr],ebx
|
|
push ecx
|
|
push eax
|
|
mov al,[coladdr]
|
|
mov cl,[vidbright]
|
|
mul cl
|
|
mov cl,15
|
|
div cl
|
|
xor ah,ah
|
|
mov cl,[ngrposng]
|
|
xor ebx,ebx
|
|
shl ax,cl
|
|
add bx,ax
|
|
mov al,[coladdg]
|
|
mov cl,[vidbright]
|
|
mul cl
|
|
mov cl,15
|
|
div cl
|
|
xor ah,ah
|
|
mov cl,[nggposng]
|
|
shl ax,cl
|
|
add bx,ax
|
|
mov al,[coladdb]
|
|
mov cl,[vidbright]
|
|
mul cl
|
|
mov cl,15
|
|
div cl
|
|
xor ah,ah
|
|
mov cl,[ngbposng]
|
|
shl ax,cl
|
|
add bx,ax
|
|
mov [ColResult],bx
|
|
mov [ColResult+2],bx
|
|
pop eax
|
|
pop ecx
|
|
.samecolor
|
|
cmp word[ColResult],0
|
|
je .black
|
|
cmp byte[FillSubScr+eax],0
|
|
je .notblack
|
|
or byte[FillSubScr+eax],2
|
|
jmp .notblack
|
|
.black
|
|
cmp byte[scrnon+1],0
|
|
jne .notblack
|
|
; mov byte[clinemainsub],1
|
|
; mov byte[scadtng+eax],0
|
|
; mov byte[FillSubScr+eax],0
|
|
.notblack
|
|
|
|
|
|
; fill back area
|
|
; get back window settings
|
|
mov dword[ngwinen],0
|
|
push ecx
|
|
push edx
|
|
cmp byte[winbg1enval+eax+5*256],0
|
|
je .nowindowb
|
|
mov bl,[winlogicb]
|
|
shr bl,2
|
|
and bl,03h
|
|
mov [nglogicval],bl
|
|
mov ebx,5*256
|
|
add ebx,eax
|
|
call BuildWindow2
|
|
.nowindowb
|
|
mov dword[BackAreaAdd],0
|
|
|
|
cmp byte[clinemainsub],1
|
|
jne near .domainscreen
|
|
mov ebx,[ColResult]
|
|
or ebx,[UnusedBit]
|
|
mov edx,[UnusedBit]
|
|
mov cl,[scaddset]
|
|
.filledscreen
|
|
; get sub-screen colors
|
|
test cl,10h
|
|
jnz .inside
|
|
test cl,20h
|
|
jnz .outside
|
|
.insideb
|
|
mov dword[BackAreaUnFillCol],ebx
|
|
mov dword[BackAreaFillCol],ebx
|
|
jmp .donesubscreen
|
|
.inside
|
|
test cl,20h
|
|
jnz .filled
|
|
mov dword[BackAreaUnFillCol],edx
|
|
mov [BackAreaFillCol],ebx
|
|
jmp .donesubscreen
|
|
.outside
|
|
mov [BackAreaUnFillCol],ebx
|
|
mov dword[BackAreaFillCol],edx
|
|
jmp .donesubscreen
|
|
.filled
|
|
xor ebx,ebx
|
|
mov [BackAreaUnFillCol],edx
|
|
mov [BackAreaFillCol],edx
|
|
jmp .donesubscreen
|
|
.domainscreen
|
|
mov ebx,[vbufdptr]
|
|
add ebx,dword[cpalptrng]
|
|
xor edx,edx
|
|
mov cx,[ebx]
|
|
shl ecx,16
|
|
mov cx,[ebx]
|
|
mov ebx,ecx
|
|
mov cl,[scaddset]
|
|
shr cl,2
|
|
test byte[scaddtype],20h
|
|
jz .notaddbackub
|
|
or ebx,[UnusedBit]
|
|
mov edx,[UnusedBit]
|
|
.notaddbackub
|
|
jmp .filledscreen
|
|
.donesubscreen
|
|
cmp dword[ngwinen],0
|
|
jne .nowinsc2
|
|
mov edx,[BackAreaUnFillCol]
|
|
mov [BackAreaFillCol],edx
|
|
.nowinsc2
|
|
cmp byte[forceblnk],0
|
|
je .notforceblanked
|
|
mov dword[BackAreaUnFillCol],0
|
|
mov dword[BackAreaFillCol],0
|
|
.notforceblanked
|
|
call BackAreaFill
|
|
test byte[FillSubScr+eax],1
|
|
jz near .nosubscreen2
|
|
mov dword[BackAreaAdd],75036*2
|
|
mov ebx,[ColResult]
|
|
mov edx,[UnusedBit]
|
|
test byte[scaddset],02h
|
|
jz .notbackfixed
|
|
or ebx,[UnusedBit]
|
|
.notbackfixed
|
|
mov cl,[scaddset]
|
|
; get sub-screen colors
|
|
test cl,10h
|
|
jnz .inside2
|
|
test cl,20h
|
|
jnz .outside2
|
|
.inside2b
|
|
mov dword[BackAreaUnFillCol],ebx
|
|
mov dword[BackAreaFillCol],ebx
|
|
jmp .donesubscreen2
|
|
.inside2
|
|
test cl,20h
|
|
jnz .filled2
|
|
mov dword[BackAreaUnFillCol],edx
|
|
mov [BackAreaFillCol],ebx
|
|
jmp .donesubscreen2
|
|
.outside2
|
|
mov [BackAreaUnFillCol],ebx
|
|
mov dword[BackAreaFillCol],edx
|
|
jmp .donesubscreen2
|
|
.filled2
|
|
xor ebx,ebx
|
|
mov [BackAreaUnFillCol],edx
|
|
mov [BackAreaFillCol],edx
|
|
.donesubscreen2
|
|
cmp dword[ngwinen],0
|
|
jne .nowinsc
|
|
mov edx,[BackAreaUnFillCol]
|
|
mov [BackAreaFillCol],edx
|
|
.nowinsc
|
|
call BackAreaFill
|
|
.nosubscreen2
|
|
pop edx
|
|
pop ecx
|
|
|
|
mov byte[SpecialLine+eax],0
|
|
cmp byte[smallscreenon],1
|
|
je .nomode7hr
|
|
cmp byte[ScreenScale],1
|
|
je .nomode7hr
|
|
cmp byte[scanlines],0
|
|
jne .nomode7hr
|
|
cmp byte[bgmode],7
|
|
jb .hrstuff
|
|
test byte[interlval],40h
|
|
jnz .nomode7hr
|
|
cmp byte[Mode7HiRes16b],1
|
|
jne .nomode7hr
|
|
jmp .hrstuff
|
|
.nomode7hr
|
|
jmp .no512
|
|
.hrstuff
|
|
cmp byte[res640],0
|
|
je near .no512
|
|
cmp byte[bgmode],5
|
|
jb .no512
|
|
mov byte[SpecialLine+eax],3
|
|
cmp byte[bgmode],7
|
|
je .hires
|
|
mov byte[SpecialLine+eax],2
|
|
.hires
|
|
mov byte[hiresstuff],1
|
|
push edi
|
|
push esi
|
|
push eax
|
|
push ecx
|
|
push eax
|
|
mov ebx,eax
|
|
mov edi,[vidbuffer]
|
|
add edi,16*2
|
|
shl eax,9
|
|
add edi,eax
|
|
mov eax,ebx
|
|
shl eax,6
|
|
add edi,eax
|
|
mov esi,edi
|
|
add edi,75036*4
|
|
push esi
|
|
mov ecx,128
|
|
rep movsd
|
|
pop esi
|
|
pop eax
|
|
test byte[FillSubScr+eax],1
|
|
jz .nosubscreenhires
|
|
add esi,75036*2
|
|
mov edi,esi
|
|
add edi,75036*4
|
|
mov ecx,128
|
|
rep movsd
|
|
.nosubscreenhires
|
|
pop ecx
|
|
pop eax
|
|
pop esi
|
|
pop edi
|
|
.no512
|
|
|
|
cmp byte[scanlines],0
|
|
jne .notinterl
|
|
test byte[interlval],1
|
|
jz .notinterl
|
|
or byte[SpecialLine+eax],4
|
|
.notinterl
|
|
|
|
mov ebx,dword[sprleftpr+eax*4]
|
|
cmp ebx,00000001h
|
|
je .single
|
|
cmp ebx,00000100h
|
|
je .single
|
|
cmp ebx,00010000h
|
|
je .single
|
|
cmp ebx,01000000h
|
|
je .single
|
|
or [sprprdrn],ebx
|
|
xor ebx,ebx
|
|
ret
|
|
.single
|
|
or [sprprdrn],ebx
|
|
or dword[sprleftpr+eax*4],80000000h
|
|
xor ebx,ebx
|
|
ret
|
|
|
|
ALIGN32
|
|
NEWSYM ngwinenval, dd 0
|
|
NEWSYM cdrawbuffer, dd 0
|
|
NEWSYM draw16bnng, dd 0
|
|
NEWSYM scaddsngb, dd 0
|
|
NEWSYM scaddtngb, dd 0
|
|
NEWSYM scaddtngbx, dd 0
|
|
NEWSYM prevbcolng, dd 0
|
|
NEWSYM bcolvalng, dd 0
|
|
NEWSYM cebppos, dd 0
|
|
NEWSYM subscreenonng, dd 0
|
|
NEWSYM cdrawmeth, dd 0
|
|
NEWSYM cpalptrng, dd 0
|
|
NEWSYM prevcoladdrng, dd 0
|
|
NEWSYM prevcolvalng, dd 0
|
|
NEWSYM cbackofsaddr, dd 0
|
|
NEWSYM cbackofsaddrs, dd 0
|
|
NEWSYM cbackofsaddrm, dd 0
|
|
NEWSYM subscrng, dd 0
|
|
NEWSYM ngmsdraw, dd 0
|
|
NEWSYM CMainWinScr, dd 0
|
|
NEWSYM CSubWinScr, dd 0
|
|
NEWSYM Prevcoladdr, dd 0
|
|
NEWSYM ColResult, dd 0
|
|
NEWSYM CPalPtrng, dd 0
|
|
NEWSYM WindowRedraw, dd 0
|
|
NEWSYM mostranspval, dd 0
|
|
NEWSYM mosclineval, dd 0
|
|
NEWSYM startlinet, dd 0
|
|
NEWSYM endlinet, dd 0
|
|
NEWSYM palchanged, dd 0
|
|
|
|
NEWSYM ng16bbgval, dd 0 ; bg # (mov dword[ng16bbgval],%1)
|
|
NEWSYM ng16bprval, dd 0 ; 0 = pr0, 2000h = pr1
|
|
|
|
NEWSYM mosjmptab16b, times 15 dd 0
|
|
NEWSYM mosjmptab16bt, times 15 dd 0
|
|
NEWSYM mosjmptab16btms, times 15 dd 0
|
|
NEWSYM mosjmptab16bntms, times 15 dd 0
|
|
|
|
NEWSYM StartDrawNewGfx16b
|
|
push edx
|
|
push esi
|
|
push edi
|
|
push ebp
|
|
mov byte[WindowRedraw],1
|
|
sub dword[endlinet],8
|
|
|
|
; Clear video memory
|
|
; mov edi,[vidbuffer]
|
|
; xor eax,eax
|
|
; add edi,32
|
|
; mov dl,[resolutn]
|
|
;.loopa
|
|
; mov ecx,128
|
|
; rep stosd
|
|
; add edi,64
|
|
; dec dl
|
|
; jnz .loopa
|
|
|
|
cmp dword[scfbl],0
|
|
jne near .dontdraw
|
|
|
|
; Sprite Layering :
|
|
; Mode 0/1 - BG4/BG3pr0 * BG4/BG3pr1 * BG2/BG1pr0 * BG2/BG1pr0 * BG3pr1
|
|
; Mode 2-6 - BG2pr0 * BG1pr0 * BG2pr1 * BG1pr1 *
|
|
; Mode 7 - * BG1pr0 * BG1pr1 * *
|
|
|
|
; Copy data to sprite table
|
|
mov ecx,256
|
|
mov eax,[spritetablea]
|
|
mov ebx,sprlefttot
|
|
mov edi,sprtbng
|
|
.loop
|
|
mov [edi],eax
|
|
add eax,512
|
|
inc ebx
|
|
add edi,4
|
|
dec ecx
|
|
jnz .loop
|
|
|
|
xor eax,eax
|
|
mov edi,sprtlng
|
|
mov ecx,64
|
|
rep stosd
|
|
|
|
mov byte[firstdrawn],1
|
|
mov dword[bg1totng],0
|
|
mov dword[bg2totng],0
|
|
mov dword[bg3totng],0
|
|
mov dword[bg4totng],0
|
|
mov dword[bg1drwng],0
|
|
mov dword[bg2drwng],0
|
|
mov dword[bg3drwng],0
|
|
mov dword[bg4drwng],0
|
|
|
|
cmp byte[ngmsdraw],0
|
|
je near .skipallsub
|
|
|
|
mov dword[CMainWinScr],winbg1envals
|
|
mov dword[CSubWinScr],winbg1envals
|
|
mov dword[subscrng],1
|
|
|
|
; Draw SubScreens
|
|
test byte[scrndis],8h
|
|
jnz near .nodobg4s
|
|
test dword[bgcmsung],800h
|
|
jz near .nodobg4s
|
|
mov dword[mode0ads],60606060h
|
|
Procbgpr016b 3, drawbg4line16b, drawbg4tile16b, ngsub, 8h
|
|
.nodobg4s
|
|
test byte[scrndis],4h
|
|
jnz near .nodobg3s
|
|
test dword[bgcmsung],400h
|
|
jz near .nodobg3s
|
|
mov dword[mode0ads],40404040h
|
|
Procbg3pr016b 2, drawbg3line16b, drawbg3tile16b, ngsub, 4h
|
|
.nodobg3s
|
|
|
|
; draw sprites mode 0-1
|
|
test byte[scrndis],10h
|
|
jnz near .nosprpra
|
|
test dword[modeused],00000101h
|
|
jz near .nosprpra
|
|
test dword[bgcmsung],1000h
|
|
jz near .nosprpra
|
|
Procsprng0116b ngsub, 10h
|
|
.nosprpra
|
|
|
|
test byte[scrndis],8h
|
|
jnz near .nodobg4sb
|
|
test dword[bgcmsung],800h
|
|
jz near .nodobg4sb
|
|
mov eax,[bg4totng]
|
|
cmp eax,[bg4drwng]
|
|
je near .nodobg4sb
|
|
mov dword[mode0ads],60606060h
|
|
Procbgpr116b 3, drawbg4linepr116b, drawbg4tilepr116b, prdata, ngsub, 8h
|
|
.nodobg4sb
|
|
test byte[scrndis],4h
|
|
jnz near .nodobg3sb
|
|
test dword[bgcmsung],400h
|
|
jz near .nodobg3sb
|
|
mov eax,[bg3totng]
|
|
cmp eax,[bg3drwng]
|
|
je near .nodobg3sb
|
|
mov dword[mode0ads],40404040h
|
|
Procbg3pr116b 2, drawbg3linepr116b, drawbg3tilepr116b, prdatc, ngsub, 4h
|
|
.nodobg3sb
|
|
|
|
; draw sprites mode 0-1
|
|
test byte[scrndis],10h
|
|
jnz near .nosprprb
|
|
test dword[modeused],00000101h
|
|
jz near .nosprprb
|
|
test dword[bgcmsung],1000h
|
|
jz near .nosprprb
|
|
Procsprng0116b ngsub, 10h
|
|
.nosprprb
|
|
|
|
test byte[scrndis],2h
|
|
jnz near .nodobg2s
|
|
test dword[bgcmsung],200h
|
|
jz near .nodobg2s
|
|
mov dword[mode0ads],20202020h
|
|
Procbgpr016b 1, drawbg2line16b, drawbg2tile16b, ngsub, 2h
|
|
.nodobg2s
|
|
|
|
; draw mode 7 extbg pr 0
|
|
cmp byte[ngextbg],0
|
|
je near .noextbgsc
|
|
test dword[bgcmsung],300h
|
|
jz near .noextbgsc
|
|
ProcMode7ngextbg16b ngsub, 1h
|
|
.noextbgsc
|
|
|
|
; draw sprites mode 2-7
|
|
test byte[scrndis],10h
|
|
jnz near .nosprprc
|
|
test dword[modeused],01010000h
|
|
jnz near .yessprprc
|
|
test dword[modeused+4],01010101h
|
|
jz near .nosprprc
|
|
.yessprprc
|
|
test dword[bgcmsung],1000h
|
|
jz near .nosprprc
|
|
Procsprng23456716b ngsub, 10h
|
|
.nosprprc
|
|
|
|
test byte[scrndis],1h
|
|
jnz near .nodobg1s
|
|
test dword[bgcmsung],100h
|
|
jz near .nodobg1s
|
|
mov dword[mode0ads],00000000h
|
|
Procbgpr016b 0, drawbg1line16b, drawbg1tile16b, ngsub, 1h
|
|
.nodobg1s
|
|
|
|
; draw mode 7, priority 0
|
|
cmp byte[modeused+7],0
|
|
je near .nomode7
|
|
test dword[bgcmsung],300h
|
|
jz near .nomode7
|
|
ProcMode7ng16b ngsub, 1h
|
|
.nomode7
|
|
|
|
; draw sprites mode 0-7
|
|
test byte[scrndis],10h
|
|
jnz near .nosprprd
|
|
test dword[bgcmsung],1000h
|
|
jz near .nosprprd
|
|
Procsprng16b ngsub, 10h
|
|
.nosprprd
|
|
|
|
test byte[scrndis],2h
|
|
jnz near .nodobg2sb
|
|
test dword[bgcmsung],200h
|
|
jz near .nodobg2sb
|
|
mov eax,[bg2totng]
|
|
cmp eax,[bg2drwng]
|
|
je near .nodobg2sb
|
|
mov dword[mode0ads],20202020h
|
|
Procbgpr116b 1, drawbg2linepr116b, drawbg2tilepr116b, prdata, ngsub, 2h
|
|
.nodobg2sb
|
|
|
|
; draw mode 7 extbg pr 1
|
|
cmp byte[ngextbg],0
|
|
je near .noextbgscb
|
|
test dword[bgcmsung],300h
|
|
jz near .noextbgscb
|
|
ProcMode7ngextbg216b ngsub, 2h
|
|
.noextbgscb
|
|
|
|
; draw sprites mode 2-7
|
|
test byte[scrndis],10h
|
|
jnz near .nosprpre
|
|
test dword[modeused],01010000h
|
|
jnz near .yessprpre
|
|
test dword[modeused+4],01010101h
|
|
jz near .nosprpre
|
|
.yessprpre
|
|
test dword[bgcmsung],1000h
|
|
jz near .nosprpre
|
|
Procsprng23456716b ngsub, 10h
|
|
.nosprpre
|
|
|
|
test byte[scrndis],1h
|
|
jnz near .nodobg1sb
|
|
test dword[bgcmsung],100h
|
|
jz near .nodobg1sb
|
|
mov eax,[bg1totng]
|
|
cmp eax,[bg1drwng]
|
|
je near .nodobg1sb
|
|
mov dword[mode0ads],00000000h
|
|
Procbgpr116b 0, drawbg1linepr116b, drawbg1tilepr116b, prdatb, ngsub, 1h
|
|
.nodobg1sb
|
|
|
|
; draw sprites mode 0-7
|
|
test byte[scrndis],10h
|
|
jnz near .nosprprf
|
|
test dword[bgcmsung],1000h
|
|
jz near .nosprprf
|
|
Procsprng16b ngsub, 10h
|
|
.nosprprf
|
|
|
|
test byte[scrndis],4h
|
|
jnz near .nodobg3sb2
|
|
cmp byte[modeused+1],0
|
|
je near .nodobg3sb2
|
|
test dword[bgcmsung],400h
|
|
jz near .nodobg3sb2
|
|
mov eax,[bg3totng]
|
|
cmp eax,[bg3drwng]
|
|
je near .nodobg3sb2
|
|
mov dword[mode0ads],40404040h
|
|
Procbg3pr1b16b 2, drawbg3linepr116b, drawbg3tilepr116b, prdatc, ngsub, 4h
|
|
.nodobg3sb2
|
|
|
|
mov dword[bg1totng],0
|
|
mov dword[bg2totng],0
|
|
mov dword[bg3totng],0
|
|
mov dword[bg4totng],0
|
|
mov dword[bg1drwng],0
|
|
mov dword[bg2drwng],0
|
|
mov dword[bg3drwng],0
|
|
mov dword[bg4drwng],0
|
|
|
|
.skipallsub
|
|
mov dword[CMainWinScr],winbg1envalm
|
|
mov dword[CSubWinScr],winbg1envals
|
|
mov dword[subscrng],0
|
|
|
|
; Draw MainScreens
|
|
test byte[scrndis],8h
|
|
jnz near .nodobg4m
|
|
test dword[bgcmsung],808h
|
|
jz near .nodobg4m
|
|
mov dword[mode0ads],60606060h
|
|
Procbgpr016b 3, drawbg4line16b, drawbg4tile16b, ngmain, 8h
|
|
.nodobg4m
|
|
test byte[scrndis],4h
|
|
jnz near .nodobg3m
|
|
test dword[bgcmsung],404h
|
|
jz near .nodobg3m
|
|
mov dword[mode0ads],40404040h
|
|
Procbg3pr016b 2, drawbg3line16b, drawbg3tile16b, ngmain, 4h
|
|
.nodobg3m
|
|
|
|
; draw sprites mode 0-1
|
|
test byte[scrndis],10h
|
|
jnz near .nosprprma
|
|
test dword[modeused],00000101h
|
|
jz near .nosprprma
|
|
test dword[bgcmsung],1010h
|
|
jz near .nosprprma
|
|
Procsprng0116b ngmain, 10h
|
|
.nosprprma
|
|
|
|
test byte[scrndis],8h
|
|
jnz near .nodobg4mb
|
|
test dword[bgcmsung],808h
|
|
jz near .nodobg4mb
|
|
mov eax,[bg4totng]
|
|
cmp eax,[bg4drwng]
|
|
je near .nodobg4mb
|
|
mov dword[mode0ads],60606060h
|
|
Procbgpr116b 3, drawbg4linepr116b, drawbg4tilepr116b, prdata, ngmain, 8h
|
|
.nodobg4mb
|
|
test byte[scrndis],4h
|
|
jnz near .nodobg3mb
|
|
test dword[bgcmsung],4h
|
|
jz near .nodobg3mb
|
|
mov eax,[bg3totng]
|
|
cmp eax,[bg3drwng]
|
|
je near .nodobg3mb
|
|
mov dword[mode0ads],40404040h
|
|
Procbg3pr116b 2, drawbg3linepr116b, drawbg3tilepr116b, prdatc, ngmain, 4h
|
|
.nodobg3mb
|
|
|
|
; draw sprites mode 0-1
|
|
test byte[scrndis],10h
|
|
jnz near .nosprprmb
|
|
test dword[modeused],00000101h
|
|
jz near .nosprprmb
|
|
test dword[bgcmsung],1010h
|
|
jz near .nosprprmb
|
|
Procsprng0116b ngmain, 10h
|
|
.nosprprmb
|
|
|
|
test byte[scrndis],2h
|
|
jnz near .nodobg2m
|
|
test dword[bgcmsung],202h
|
|
jz near .nodobg2m
|
|
mov dword[mode0ads],20202020h
|
|
Procbgpr016b 1, drawbg2line16b, drawbg2tile16b, ngmain, 2h
|
|
.nodobg2m
|
|
|
|
; draw mode 7 extbg pr 0
|
|
cmp byte[ngextbg],0
|
|
je near .noextbgmn
|
|
test dword[bgcmsung],101h
|
|
jz near .noextbgmn
|
|
ProcMode7ngextbg16b ngmain ,1h
|
|
.noextbgmn
|
|
|
|
; draw sprites mode 2-7
|
|
test byte[scrndis],10h
|
|
jnz near .nosprprmc
|
|
test dword[modeused],01010000h
|
|
jnz near .yessprprmc
|
|
test dword[modeused+4],01010101h
|
|
jz near .nosprprmc
|
|
.yessprprmc
|
|
test dword[bgcmsung],1010h
|
|
jz near .nosprprmc
|
|
Procsprng23456716b ngmain ,10h
|
|
.nosprprmc
|
|
|
|
test byte[scrndis],1h
|
|
jnz near .nodobg1m
|
|
test dword[bgcmsung],101h
|
|
jz near .nodobg1m
|
|
mov dword[mode0ads],00000000h
|
|
Procbgpr016b 0, drawbg1line16b, drawbg1tile16b, ngmain, 1h
|
|
.nodobg1m
|
|
|
|
; draw mode 7, priority 0
|
|
cmp byte[modeused+7],0
|
|
je near .nomode7m
|
|
test dword[bgcmsung],101h
|
|
jz near .nomode7m
|
|
ProcMode7ng16b ngmain ,1h
|
|
.nomode7m
|
|
|
|
; draw sprites mode 0-7
|
|
test byte[scrndis],10h
|
|
jnz near .nosprprmd
|
|
test dword[bgcmsung],1010h
|
|
jz near .nosprprmd
|
|
Procsprng16b ngmain ,10h
|
|
.nosprprmd
|
|
|
|
; draw mode 7 extbg pr 1
|
|
cmp byte[ngextbg],0
|
|
je near .noextbgmn2
|
|
test dword[bgcmsung],303h
|
|
jz near .noextbgmn2
|
|
ProcMode7ngextbg216b ngmain ,2h
|
|
.noextbgmn2
|
|
|
|
test byte[scrndis],2h
|
|
jnz near .nodobg2mb
|
|
test dword[bgcmsung],202h
|
|
jz near .nodobg2mb
|
|
mov eax,[bg2totng]
|
|
cmp eax,[bg2drwng]
|
|
je near .nodobg2mb
|
|
mov dword[mode0ads],20202020h
|
|
Procbgpr116b 1, drawbg2linepr116b, drawbg2tilepr116b, prdata, ngmain, 2h
|
|
.nodobg2mb
|
|
|
|
; draw sprites mode 2-7
|
|
test byte[scrndis],10h
|
|
jnz near .nosprprme
|
|
test dword[modeused],01010000h
|
|
jnz near .yessprprme
|
|
test dword[modeused+4],01010101h
|
|
jz near .nosprprme
|
|
.yessprprme
|
|
test dword[bgcmsung],1010h
|
|
jz near .nosprprme
|
|
Procsprng23456716b ngmain ,10h
|
|
.nosprprme
|
|
|
|
test byte[scrndis],1h
|
|
jnz near .nodobg1mb
|
|
test dword[bgcmsung],101h
|
|
jz near .nodobg1mb
|
|
mov eax,[bg1totng]
|
|
cmp eax,[bg1drwng]
|
|
je near .nodobg1mb
|
|
mov dword[mode0ads],00000000h
|
|
Procbgpr116b 0, drawbg1linepr116b, drawbg1tilepr116b, prdatb, ngmain, 1h
|
|
.nodobg1mb
|
|
|
|
; draw sprites mode 0-7
|
|
test byte[scrndis],10h
|
|
jnz near .nosprprmf
|
|
test dword[bgcmsung],1010h
|
|
jz near .nosprprmf
|
|
Procsprng16b ngmain, 10h
|
|
.nosprprmf
|
|
|
|
test byte[scrndis],4h
|
|
jnz near .nodobg3mb2
|
|
cmp byte[modeused+1],0
|
|
je near .nodobg3mb2
|
|
test dword[bgcmsung],404h
|
|
jz near .nodobg3mb2
|
|
mov eax,[bg3totng]
|
|
cmp eax,[bg3drwng]
|
|
je near .nodobg3mb2
|
|
mov dword[mode0ads],40404040h
|
|
Procbg3pr1b16b 2, drawbg3linepr116b, drawbg3tilepr116b, prdatc, ngmain, 4h
|
|
.nodobg3mb2
|
|
call MainScreenClip
|
|
call ProcessTransparencies
|
|
.dontdraw
|
|
xor ebx,ebx
|
|
xor ecx,ecx
|
|
xor eax,eax
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop edx
|
|
ret
|
|
|
|
|
|
NEWSYM domosaicng16b
|
|
mov esi,[pesimpng]
|
|
xor eax,eax
|
|
mov edi,xtravbuf+32
|
|
mov al,[curmosaicsz]
|
|
cmp al,16
|
|
ja .notokay
|
|
cmp al,1
|
|
jbe .notokay
|
|
push esi
|
|
push ebx
|
|
mov ebx,[mosclineval]
|
|
mov cl,[mostranspval]
|
|
test byte[BGMS1+ebx*2],cl
|
|
jz .nosubmain
|
|
test byte[FillSubScr+ebx],1
|
|
jnz .transpstuff
|
|
jmp .main
|
|
.nosubmain
|
|
test byte[FillSubScr+ebx],1
|
|
jz .main
|
|
add esi,75036*2
|
|
.main
|
|
pop ebx
|
|
jmp [mosjmptab16b+eax*4-8]
|
|
pop esi
|
|
.notokay
|
|
ret
|
|
.transpstuff
|
|
test byte[BGMS1+ebx*2+1],cl
|
|
jnz near .mosaicms
|
|
test byte[scadtng+ebx],cl
|
|
jz near .main
|
|
pop ebx
|
|
jmp [mosjmptab16bt+eax*4-8]
|
|
pop esi
|
|
ret
|
|
.mosaicms
|
|
test byte[scadtng+ebx],cl
|
|
jz near .mosaicmsnt
|
|
pop ebx
|
|
jmp [mosjmptab16btms+eax*4-8]
|
|
pop esi
|
|
ret
|
|
.mosaicmsnt
|
|
pop ebx
|
|
jmp [mosjmptab16bntms+eax*4-8]
|
|
pop esi
|
|
ret
|
|
|
|
%macro mosaic2 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
%endmacro
|
|
%macro mosaic3 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
%endmacro
|
|
%macro mosaic4 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
%endmacro
|
|
%macro mosaic5 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
%endmacro
|
|
%macro mosaic6 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
%endmacro
|
|
%macro mosaic7 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
mov [esi+%1+12],ax
|
|
%endmacro
|
|
%macro mosaic8 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
mov [esi+%1+12],ax
|
|
mov [esi+%1+14],ax
|
|
%endmacro
|
|
%macro mosaic9 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
mov [esi+%1+12],ax
|
|
mov [esi+%1+14],ax
|
|
mov [esi+%1+16],ax
|
|
%endmacro
|
|
%macro mosaic10 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
mov [esi+%1+12],ax
|
|
mov [esi+%1+14],ax
|
|
mov [esi+%1+16],ax
|
|
mov [esi+%1+18],ax
|
|
%endmacro
|
|
%macro mosaic11 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
mov [esi+%1+12],ax
|
|
mov [esi+%1+14],ax
|
|
mov [esi+%1+16],ax
|
|
mov [esi+%1+18],ax
|
|
mov [esi+%1+20],ax
|
|
%endmacro
|
|
%macro mosaic12 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
mov [esi+%1+12],ax
|
|
mov [esi+%1+14],ax
|
|
mov [esi+%1+16],ax
|
|
mov [esi+%1+18],ax
|
|
mov [esi+%1+20],ax
|
|
mov [esi+%1+22],ax
|
|
%endmacro
|
|
%macro mosaic13 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
mov [esi+%1+12],ax
|
|
mov [esi+%1+14],ax
|
|
mov [esi+%1+16],ax
|
|
mov [esi+%1+18],ax
|
|
mov [esi+%1+20],ax
|
|
mov [esi+%1+22],ax
|
|
mov [esi+%1+24],ax
|
|
%endmacro
|
|
%macro mosaic14 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
mov [esi+%1+12],ax
|
|
mov [esi+%1+14],ax
|
|
mov [esi+%1+16],ax
|
|
mov [esi+%1+18],ax
|
|
mov [esi+%1+20],ax
|
|
mov [esi+%1+22],ax
|
|
mov [esi+%1+24],ax
|
|
mov [esi+%1+26],ax
|
|
%endmacro
|
|
%macro mosaic15 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
mov [esi+%1+12],ax
|
|
mov [esi+%1+14],ax
|
|
mov [esi+%1+16],ax
|
|
mov [esi+%1+18],ax
|
|
mov [esi+%1+20],ax
|
|
mov [esi+%1+22],ax
|
|
mov [esi+%1+24],ax
|
|
mov [esi+%1+26],ax
|
|
mov [esi+%1+28],ax
|
|
%endmacro
|
|
%macro mosaic16 1
|
|
mov [esi+%1],ax
|
|
mov [esi+%1+2],ax
|
|
mov [esi+%1+4],ax
|
|
mov [esi+%1+6],ax
|
|
mov [esi+%1+8],ax
|
|
mov [esi+%1+10],ax
|
|
mov [esi+%1+12],ax
|
|
mov [esi+%1+14],ax
|
|
mov [esi+%1+16],ax
|
|
mov [esi+%1+18],ax
|
|
mov [esi+%1+20],ax
|
|
mov [esi+%1+22],ax
|
|
mov [esi+%1+24],ax
|
|
mov [esi+%1+26],ax
|
|
mov [esi+%1+28],ax
|
|
mov [esi+%1+30],ax
|
|
%endmacro
|
|
|
|
%macro mosaicproc 3
|
|
mov ecx,%1
|
|
.next
|
|
mov ax,[edi]
|
|
cmp ax,0FFFFh
|
|
je .nodraw
|
|
%2 0
|
|
mosender %3
|
|
%endmacro
|
|
|
|
%macro mosaicproct 3
|
|
mov ecx,%1
|
|
.next
|
|
mov ax,[edi]
|
|
cmp ax,0FFFFh
|
|
je .nodraw
|
|
or ax,[UnusedBit]
|
|
%2 0
|
|
mosender %3
|
|
%endmacro
|
|
|
|
%macro mosaicprocntms 3
|
|
mov ecx,%1
|
|
.next
|
|
mov ax,[edi]
|
|
cmp ax,0FFFFh
|
|
je near .nodraw
|
|
%2 0
|
|
%2 75036*2
|
|
mosender %3
|
|
%endmacro
|
|
|
|
%macro mosaicproctms 3
|
|
mov ecx,%1
|
|
.next
|
|
mov ax,[edi]
|
|
cmp ax,0FFFFh
|
|
je near .nodraw
|
|
or ax,[UnusedBit]
|
|
%2 0
|
|
and ax,[UnusedBit]
|
|
%2 75036*2
|
|
mosender %3
|
|
%endmacro
|
|
|
|
NEWSYM mosdraw216b
|
|
mosaicproc 128,mosaic2,2
|
|
NEWSYM mosdraw316b
|
|
mosaicproc 86,mosaic3,3
|
|
NEWSYM mosdraw416b
|
|
mosaicproc 64,mosaic4,4
|
|
NEWSYM mosdraw516b
|
|
mosaicproc 52,mosaic5,5
|
|
NEWSYM mosdraw616b
|
|
mosaicproc 43,mosaic6,6
|
|
NEWSYM mosdraw716b
|
|
mosaicproc 37,mosaic7,7
|
|
NEWSYM mosdraw816b
|
|
mosaicproc 32,mosaic8,8
|
|
NEWSYM mosdraw916b
|
|
mosaicproc 29,mosaic9,9
|
|
NEWSYM mosdraw1016b
|
|
mosaicproc 26,mosaic10,10
|
|
NEWSYM mosdraw1116b
|
|
mosaicproc 24,mosaic11,11
|
|
NEWSYM mosdraw1216b
|
|
mosaicproc 22,mosaic12,12
|
|
NEWSYM mosdraw1316b
|
|
mosaicproc 20,mosaic13,13
|
|
NEWSYM mosdraw1416b
|
|
mosaicproc 19,mosaic14,14
|
|
NEWSYM mosdraw1516b
|
|
mosaicproc 18,mosaic15,15
|
|
NEWSYM mosdraw1616b
|
|
mosaicproc 16,mosaic16,16
|
|
|
|
NEWSYM mosdraw216bt
|
|
mosaicproct 128,mosaic2,2
|
|
NEWSYM mosdraw316bt
|
|
mosaicproct 86,mosaic3,3
|
|
NEWSYM mosdraw416bt
|
|
mosaicproct 64,mosaic4,4
|
|
NEWSYM mosdraw516bt
|
|
mosaicproct 52,mosaic5,5
|
|
NEWSYM mosdraw616bt
|
|
mosaicproct 43,mosaic6,6
|
|
NEWSYM mosdraw716bt
|
|
mosaicproct 37,mosaic7,7
|
|
NEWSYM mosdraw816bt
|
|
mosaicproct 32,mosaic8,8
|
|
NEWSYM mosdraw916bt
|
|
mosaicproct 29,mosaic9,9
|
|
NEWSYM mosdraw1016bt
|
|
mosaicproct 26,mosaic10,10
|
|
NEWSYM mosdraw1116bt
|
|
mosaicproct 24,mosaic11,11
|
|
NEWSYM mosdraw1216bt
|
|
mosaicproct 22,mosaic12,12
|
|
NEWSYM mosdraw1316bt
|
|
mosaicproct 20,mosaic13,13
|
|
NEWSYM mosdraw1416bt
|
|
mosaicproct 19,mosaic14,14
|
|
NEWSYM mosdraw1516bt
|
|
mosaicproct 18,mosaic15,15
|
|
NEWSYM mosdraw1616bt
|
|
mosaicproct 16,mosaic16,16
|
|
|
|
NEWSYM mosdraw216btms
|
|
mosaicproctms 128,mosaic2,2
|
|
NEWSYM mosdraw316btms
|
|
mosaicproctms 86,mosaic3,3
|
|
NEWSYM mosdraw416btms
|
|
mosaicproctms 64,mosaic4,4
|
|
NEWSYM mosdraw516btms
|
|
mosaicproctms 52,mosaic5,5
|
|
NEWSYM mosdraw616btms
|
|
mosaicproctms 43,mosaic6,6
|
|
NEWSYM mosdraw716btms
|
|
mosaicproctms 37,mosaic7,7
|
|
NEWSYM mosdraw816btms
|
|
mosaicproctms 32,mosaic8,8
|
|
NEWSYM mosdraw916btms
|
|
mosaicproctms 29,mosaic9,9
|
|
NEWSYM mosdraw1016btms
|
|
mosaicproctms 26,mosaic10,10
|
|
NEWSYM mosdraw1116btms
|
|
mosaicproctms 24,mosaic11,11
|
|
NEWSYM mosdraw1216btms
|
|
mosaicproctms 22,mosaic12,12
|
|
NEWSYM mosdraw1316btms
|
|
mosaicproctms 20,mosaic13,13
|
|
NEWSYM mosdraw1416btms
|
|
mosaicproctms 19,mosaic14,14
|
|
NEWSYM mosdraw1516btms
|
|
mosaicproctms 18,mosaic15,15
|
|
NEWSYM mosdraw1616btms
|
|
mosaicproctms 16,mosaic16,16
|
|
|
|
NEWSYM mosdraw216bntms
|
|
mosaicprocntms 128,mosaic2,2
|
|
NEWSYM mosdraw316bntms
|
|
mosaicprocntms 86,mosaic3,3
|
|
NEWSYM mosdraw416bntms
|
|
mosaicprocntms 64,mosaic4,4
|
|
NEWSYM mosdraw516bntms
|
|
mosaicprocntms 52,mosaic5,5
|
|
NEWSYM mosdraw616bntms
|
|
mosaicprocntms 43,mosaic6,6
|
|
NEWSYM mosdraw716bntms
|
|
mosaicprocntms 37,mosaic7,7
|
|
NEWSYM mosdraw816bntms
|
|
mosaicprocntms 32,mosaic8,8
|
|
NEWSYM mosdraw916bntms
|
|
mosaicprocntms 29,mosaic9,9
|
|
NEWSYM mosdraw1016bntms
|
|
mosaicprocntms 26,mosaic10,10
|
|
NEWSYM mosdraw1116bntms
|
|
mosaicprocntms 24,mosaic11,11
|
|
NEWSYM mosdraw1216bntms
|
|
mosaicprocntms 22,mosaic12,12
|
|
NEWSYM mosdraw1316bntms
|
|
mosaicprocntms 20,mosaic13,13
|
|
NEWSYM mosdraw1416bntms
|
|
mosaicprocntms 19,mosaic14,14
|
|
NEWSYM mosdraw1516bntms
|
|
mosaicprocntms 18,mosaic15,15
|
|
NEWSYM mosdraw1616bntms
|
|
mosaicprocntms 16,mosaic16,16
|
|
|
|
|
|
NEWSYM drawbg1tile16b
|
|
mov byte[prdatb+ebx],1
|
|
drawbgtileng16b 0,0
|
|
ret
|
|
|
|
NEWSYM drawbg2tile16b
|
|
mov byte[prdata+ebx],1
|
|
drawbgtileng16b 1,1
|
|
ret
|
|
|
|
NEWSYM drawbg3tile16b
|
|
mov byte[prdatc+ebx],1
|
|
drawbgtileng16b 2,2
|
|
ret
|
|
|
|
NEWSYM drawbg4tile16b
|
|
mov byte[prdata+ebx],1
|
|
drawbgtileng16b 3,1
|
|
ret
|
|
|
|
NEWSYM drawbg1tilepr116b
|
|
drawbgtilengpr116b 0,0
|
|
ret
|
|
|
|
NEWSYM drawbg2tilepr116b
|
|
drawbgtilengpr116b 1,1
|
|
ret
|
|
|
|
NEWSYM drawbg3tilepr116b
|
|
drawbgtilengpr116b 2,2
|
|
ret
|
|
|
|
NEWSYM drawbg4tilepr116b
|
|
drawbgtilengpr116b 3,1
|
|
ret
|
|
|
|
NEWSYM drawbg1line16b
|
|
mov byte[prdatb+ebx],0
|
|
drawbglineng16b 0,0
|
|
|
|
NEWSYM drawbg2line16b
|
|
mov byte[prdata+ebx],0
|
|
drawbglineng16b 1,1
|
|
|
|
NEWSYM drawbg3line16b
|
|
mov byte[prdatc+ebx],0
|
|
drawbglineng16b 2,2
|
|
|
|
NEWSYM drawbg4line16b
|
|
mov byte[prdata+ebx],0
|
|
drawbglineng16b 3,1
|
|
|
|
NEWSYM drawbg1linepr116b
|
|
drawbglinengpr116b 0,0
|
|
|
|
NEWSYM drawbg2linepr116b
|
|
drawbglinengpr116b 1,1
|
|
|
|
NEWSYM drawbg3linepr116b
|
|
drawbglinengpr116b 2,2
|
|
|
|
NEWSYM drawbg4linepr116b
|
|
drawbglinengpr116b 3,1
|
|
|
|
%macro normalsprng16b 2
|
|
test dword[sprleftpr+ebx*4],80000000h
|
|
jnz near .drawsingle
|
|
push esi
|
|
push ebx
|
|
add edi,esi
|
|
mov esi,[sprtbng+ebx*4]
|
|
mov edx,esi
|
|
xor ebx,ebx
|
|
.loopobj
|
|
test byte[esi+7],20h
|
|
jnz near .drawspriteflipx
|
|
mov bx,[esi]
|
|
push edx
|
|
mov ch,[esi+6]
|
|
mov dl,[esi+7]
|
|
and edx,03h
|
|
cmp edx,[csprival]
|
|
jne near .notprio
|
|
mov esi,[esi+2]
|
|
mov dl,[csprbit]
|
|
sprdrawa16b %1
|
|
pop edx
|
|
.nodrawspr
|
|
add edx,8
|
|
mov esi,edx
|
|
dec cl
|
|
jnz near .loopobj
|
|
rol byte[csprbit],1
|
|
cmp byte[csprbit],1
|
|
je near .clearcsprmem
|
|
pop ebx
|
|
pop esi
|
|
ret
|
|
.notprio
|
|
mov esi,[esi+2]
|
|
mov dl,[csprbit]
|
|
sprdrawa sprdrawpra2
|
|
pop edx
|
|
add edx,8
|
|
mov esi,edx
|
|
dec cl
|
|
jnz near .loopobj
|
|
rol byte[csprbit],1
|
|
cmp byte[csprbit],1
|
|
je near .clearcsprmem
|
|
pop ebx
|
|
pop esi
|
|
ret
|
|
.drawspriteflipx
|
|
mov bx,[esi]
|
|
push edx
|
|
mov ch,[esi+6]
|
|
mov dl,[esi+7]
|
|
and edx,03h
|
|
cmp edx,[csprival]
|
|
jne near .notpriof
|
|
mov esi,[esi+2]
|
|
mov dl,[csprbit]
|
|
sprdrawaf16b %1
|
|
pop edx
|
|
add edx,8
|
|
mov esi,edx
|
|
dec cl
|
|
jnz near .loopobj
|
|
rol byte[csprbit],1
|
|
cmp byte[csprbit],1
|
|
je near .clearcsprmem
|
|
.endobj
|
|
pop ebx
|
|
pop esi
|
|
ret
|
|
.notpriof
|
|
mov esi,[esi+2]
|
|
mov dl,[csprbit]
|
|
sprdrawaf sprdrawpra2
|
|
pop edx
|
|
add edx,8
|
|
mov esi,edx
|
|
dec cl
|
|
jnz near .loopobj
|
|
rol byte[csprbit],1
|
|
cmp byte[csprbit],1
|
|
je near .clearcsprmem
|
|
pop ebx
|
|
pop esi
|
|
ret
|
|
.clearcsprmem
|
|
xor eax,eax
|
|
mov ecx,64
|
|
mov edi,sprpriodata+16
|
|
rep stosd
|
|
pop ebx
|
|
pop esi
|
|
ret
|
|
|
|
.drawsingle
|
|
push esi
|
|
push ebx
|
|
mov edi,esi
|
|
mov esi,[sprtbng+ebx*4]
|
|
mov edx,ecx
|
|
and edx,0FFh
|
|
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]
|
|
mov ch,[esi+6]
|
|
mov esi,[esi+2]
|
|
sprdrawa16b %2
|
|
sub edx,8
|
|
mov esi,edx
|
|
dec cl
|
|
jnz near .loopobj2
|
|
pop ebx
|
|
pop esi
|
|
ret
|
|
.drawspriteflipx2
|
|
mov bx,[esi]
|
|
mov ch,[esi+6]
|
|
mov esi,[esi+2]
|
|
sprdrawaf16b %2
|
|
sub edx,8
|
|
mov esi,edx
|
|
dec cl
|
|
jnz near .loopobj2
|
|
pop ebx
|
|
pop esi
|
|
ret
|
|
%endmacro
|
|
|
|
|
|
%macro normalwsprng16b 2
|
|
; cmp byte[winbg1enval+eax+4*256],0
|
|
; je near .skipobjw
|
|
;NEWSYM objclineptr, times 256 dd 0 ; l1,r1,l2,r2,en,log,ptr
|
|
xor eax,eax
|
|
mov [NGNumSpr],cl
|
|
mov ecx,[objclineptr+ebx*4]
|
|
add ecx,[ngwinptr]
|
|
test dword[sprleftpr+ebx*4],80000000h
|
|
jnz near .drawsingle
|
|
push esi
|
|
push ebx
|
|
add edi,esi
|
|
mov esi,[sprtbng+ebx*4]
|
|
mov edx,esi
|
|
xor ebx,ebx
|
|
.loopobj
|
|
test byte[esi+7],20h
|
|
jnz near .drawspriteflipx
|
|
mov bx,[esi]
|
|
push edx
|
|
mov dl,[esi+7]
|
|
and edx,03h
|
|
cmp edx,[csprival]
|
|
jne near .notprio
|
|
mov dh,[esi+6]
|
|
mov esi,[esi+2]
|
|
mov dl,[csprbit]
|
|
sprdrawa16b %1
|
|
pop edx
|
|
.nodrawspr
|
|
add edx,8
|
|
mov esi,edx
|
|
dec byte[NGNumSpr]
|
|
jnz near .loopobj
|
|
rol byte[csprbit],1
|
|
cmp byte[csprbit],1
|
|
je near .clearcsprmem
|
|
pop ebx
|
|
pop esi
|
|
xor ecx,ecx
|
|
ret
|
|
.notprio
|
|
mov esi,[esi+2]
|
|
mov dl,[csprbit]
|
|
sprdrawa sprdrawpra2
|
|
pop edx
|
|
add edx,8
|
|
mov esi,edx
|
|
dec byte[NGNumSpr]
|
|
jnz near .loopobj
|
|
rol byte[csprbit],1
|
|
cmp byte[csprbit],1
|
|
je near .clearcsprmem
|
|
pop ebx
|
|
pop esi
|
|
xor ecx,ecx
|
|
ret
|
|
.drawspriteflipx
|
|
mov bx,[esi]
|
|
push edx
|
|
mov dl,[esi+7]
|
|
and edx,03h
|
|
cmp edx,[csprival]
|
|
jne near .notpriof
|
|
mov dh,[esi+6]
|
|
mov esi,[esi+2]
|
|
mov dl,[csprbit]
|
|
sprdrawaf16b %1
|
|
pop edx
|
|
add edx,8
|
|
mov esi,edx
|
|
dec byte[NGNumSpr]
|
|
jnz near .loopobj
|
|
rol byte[csprbit],1
|
|
cmp byte[csprbit],1
|
|
je near .clearcsprmem
|
|
.endobj
|
|
pop ebx
|
|
pop esi
|
|
xor ecx,ecx
|
|
ret
|
|
.notpriof
|
|
mov esi,[esi+2]
|
|
mov dl,[csprbit]
|
|
sprdrawaf sprdrawpra2
|
|
pop edx
|
|
add edx,8
|
|
mov esi,edx
|
|
dec byte[NGNumSpr]
|
|
jnz near .loopobj
|
|
rol byte[csprbit],1
|
|
cmp byte[csprbit],1
|
|
je near .clearcsprmem
|
|
pop ebx
|
|
pop esi
|
|
xor ecx,ecx
|
|
xor ecx,ecx
|
|
ret
|
|
.clearcsprmem
|
|
xor eax,eax
|
|
mov ecx,64
|
|
mov edi,sprpriodata+16
|
|
rep stosd
|
|
pop ebx
|
|
pop esi
|
|
ret
|
|
|
|
.drawsingle
|
|
push esi
|
|
push ebx
|
|
mov edi,esi
|
|
mov esi,[sprtbng+ebx*4]
|
|
xor edx,edx
|
|
mov dl,[NGNumSpr]
|
|
and edx,0FFh
|
|
shl edx,3
|
|
sub edx,8
|
|
add edx,esi
|
|
mov esi,edx
|
|
xor ebx,ebx
|
|
.loopobj2
|
|
test byte[esi+7],20h
|
|
jnz near .drawspriteflipx2
|
|
push edx
|
|
mov bx,[esi]
|
|
mov dh,[esi+6]
|
|
mov esi,[esi+2]
|
|
sprdrawa16b %2
|
|
pop edx
|
|
sub edx,8
|
|
mov esi,edx
|
|
dec byte[NGNumSpr]
|
|
jnz near .loopobj2
|
|
pop ebx
|
|
pop esi
|
|
xor ecx,ecx
|
|
ret
|
|
.drawspriteflipx2
|
|
push edx
|
|
mov bx,[esi]
|
|
mov dh,[esi+6]
|
|
mov esi,[esi+2]
|
|
sprdrawaf16b %2
|
|
pop edx
|
|
sub edx,8
|
|
mov esi,edx
|
|
dec byte[NGNumSpr]
|
|
jnz near .loopobj2
|
|
pop ebx
|
|
pop esi
|
|
xor ecx,ecx
|
|
ret
|
|
%endmacro
|
|
|
|
; FillSubScr bit 0 sets to 1 if there is no subscreen present
|
|
; ms,wms,wm,ws
|
|
; FillSubScr scadtng
|
|
NEWSYM drawsprng16b
|
|
test byte[BGMS1+ebx*2],10h
|
|
jz .nosubmain
|
|
test byte[FillSubScr+ebx],1
|
|
jnz near drawsprng16bt
|
|
.nosubmain
|
|
mov ebp,[cpalval+ebx*4]
|
|
xor eax,eax
|
|
mov edi,[CMainWinScr]
|
|
test byte[FillSubScr+ebx],1
|
|
jz .main2
|
|
test byte[BGMS1+ebx*2],10h
|
|
jnz .main2
|
|
mov edi,[CSubWinScr]
|
|
.main2
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16b
|
|
test byte[FillSubScr+ebx],1
|
|
jz .main
|
|
test byte[BGMS1+ebx*2],10h
|
|
jnz .main
|
|
add esi,75036*2
|
|
.main
|
|
xor edi,edi
|
|
normalsprng16b sprdrawpra16bng,sprdrawprb16bng
|
|
NEWSYM drawsprngw16b
|
|
xor edi,edi
|
|
test byte[FillSubScr+ebx],1
|
|
jz .main
|
|
test byte[BGMS1+ebx*2],10h
|
|
jnz .main
|
|
add esi,75036*2
|
|
.main
|
|
normalwsprng16b sprdrawprawb16bng,sprdrawprbwb16bng
|
|
|
|
drawsprng16bt:
|
|
test byte[scadtng+ebx],10h
|
|
jz near drawsprng16bnt
|
|
mov ebp,[cpalval+ebx*4]
|
|
xor eax,eax
|
|
test byte[BGMS1+ebx*2+1],10h
|
|
jnz near drawsprng16bmst
|
|
mov edi,[CMainWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bt
|
|
xor edi,edi
|
|
normalsprng16b sprdrawpra16bngt,sprdrawprb16bngt
|
|
NEWSYM drawsprngw16bt
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngt,sprdrawprbwb16bngt
|
|
drawsprng16bmst:
|
|
mov edi,[CMainWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bmt
|
|
mov edi,[CSubWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bst
|
|
xor edi,edi
|
|
normalsprng16b sprdrawpra16bngmst,sprdrawprb16bngmst
|
|
drawsprngw16bst:
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngst,sprdrawprbwb16bngst
|
|
drawsprngw16bmt:
|
|
mov edi,[CSubWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bmst
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngmt,sprdrawprbwb16bngmt
|
|
drawsprngw16bmst:
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngmst,sprdrawprbwb16bngmst
|
|
|
|
drawsprng16bnt:
|
|
mov ebp,[cpalval+ebx*4]
|
|
xor eax,eax
|
|
test byte[BGMS1+ebx*2+1],10h
|
|
jnz near drawsprng16bmsnt
|
|
mov edi,[CMainWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16b
|
|
xor edi,edi
|
|
normalsprng16b sprdrawpra16bngnt,sprdrawprb16bngnt
|
|
drawsprngw16bnt
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngnt,sprdrawprbwb16bngnt
|
|
drawsprng16bmsnt:
|
|
mov edi,[CMainWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bmnt
|
|
mov edi,[CSubWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bsnt
|
|
xor edi,edi
|
|
normalsprng16b sprdrawpra16bngmsnt,sprdrawprb16bngmsnt
|
|
drawsprngw16bsnt:
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngsnt,sprdrawprbwb16bngsnt
|
|
drawsprngw16bmnt:
|
|
mov edi,[CSubWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bmsnt
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngmnt,sprdrawprbwb16bngmnt
|
|
drawsprngw16bmsnt:
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngmsnt,sprdrawprbwb16bngmsnt
|
|
|
|
NEWSYM drawsprng16bhr
|
|
test byte[BGMS1+ebx*2],10h
|
|
jz .nosubmain
|
|
test byte[FillSubScr+ebx],1
|
|
jnz near drawsprng16bthr
|
|
.nosubmain
|
|
mov ebp,[cpalval+ebx*4]
|
|
xor eax,eax
|
|
mov edi,[CMainWinScr]
|
|
test byte[FillSubScr+ebx],1
|
|
jz .main2
|
|
test byte[BGMS1+ebx*2],10h
|
|
jnz .main2
|
|
mov edi,[CSubWinScr]
|
|
.main2
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bhr
|
|
test byte[FillSubScr+ebx],1
|
|
jz .main
|
|
test byte[BGMS1+ebx*2],10h
|
|
jnz .main
|
|
add esi,75036*2
|
|
.main
|
|
xor edi,edi
|
|
normalsprng16b sprdrawpra16bnghr,sprdrawprb16bnghr
|
|
NEWSYM drawsprngw16bhr
|
|
xor edi,edi
|
|
test byte[FillSubScr+ebx],1
|
|
jz .main
|
|
test byte[BGMS1+ebx*2],10h
|
|
jnz .main
|
|
add esi,75036*2
|
|
.main
|
|
normalwsprng16b sprdrawprawb16bnghr,sprdrawprbwb16bnghr
|
|
drawsprng16bthr:
|
|
test byte[scadtng+ebx],10h
|
|
jz near drawsprng16bnthr
|
|
mov ebp,[cpalval+ebx*4]
|
|
xor eax,eax
|
|
test byte[BGMS1+ebx*2+1],10h
|
|
jnz near drawsprng16bmsthr
|
|
mov edi,[CMainWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bthr
|
|
xor edi,edi
|
|
normalsprng16b sprdrawpra16bngthr,sprdrawprb16bngthr
|
|
NEWSYM drawsprngw16bthr
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngthr,sprdrawprbwb16bngthr
|
|
drawsprng16bmsthr:
|
|
mov edi,[CMainWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bmthr
|
|
mov edi,[CSubWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bsthr
|
|
xor edi,edi
|
|
normalsprng16b sprdrawpra16bngmsthr,sprdrawprb16bngmsthr
|
|
drawsprngw16bsthr:
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngsthr,sprdrawprbwb16bngsthr
|
|
drawsprngw16bmthr:
|
|
mov edi,[CSubWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bmsthr
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngmthr,sprdrawprbwb16bngmthr
|
|
drawsprngw16bmsthr:
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngmsthr,sprdrawprbwb16bngmsthr
|
|
drawsprng16bnthr:
|
|
mov ebp,[cpalval+ebx*4]
|
|
xor eax,eax
|
|
test byte[BGMS1+ebx*2+1],10h
|
|
jnz near drawsprng16bmsnthr
|
|
mov edi,[CMainWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bhr
|
|
xor edi,edi
|
|
normalsprng16b sprdrawpra16bngnthr,sprdrawprb16bngnthr
|
|
drawsprngw16bnthr
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngnthr,sprdrawprbwb16bngnthr
|
|
drawsprng16bmsnthr:
|
|
mov edi,[CMainWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bmnthr
|
|
mov edi,[CSubWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bsnthr
|
|
xor edi,edi
|
|
normalsprng16b sprdrawpra16bngmsnthr,sprdrawprb16bngmsnthr
|
|
drawsprngw16bsnthr:
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngsnthr,sprdrawprbwb16bngsnthr
|
|
drawsprngw16bmnthr:
|
|
mov edi,[CSubWinScr]
|
|
cmp byte[edi+ebx+4*256],0
|
|
jne near drawsprngw16bmsnthr
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngmnthr,sprdrawprbwb16bngmnthr
|
|
drawsprngw16bmsnthr:
|
|
xor edi,edi
|
|
normalwsprng16b sprdrawprawb16bngmsnthr,sprdrawprbwb16bngmsnthr
|
|
|
|
|
|
ProcessTransparencies:
|
|
cmp byte[NGNoTransp],0
|
|
je .yestransp
|
|
ret
|
|
.yestransp
|
|
cmp byte[FPUCopy],2
|
|
je near ProcessTransparenciesMMX
|
|
mov esi,[vidbuffer]
|
|
add esi,16*2+288*2
|
|
mov ebx,1
|
|
.nextline
|
|
test byte[FillSubScr+ebx],1
|
|
jz near .notransp
|
|
mov dword[HiResDone],0
|
|
.againtransp
|
|
test byte[scadtng+ebx],40h
|
|
jz near .fulltransp
|
|
test byte[scadtng+ebx],80h
|
|
jnz near .subtract
|
|
|
|
; Half Add
|
|
push esi
|
|
push ebx
|
|
; filter out all fixed color sub-screen
|
|
test byte[FillSubScr+ebx],2
|
|
jnz .halfaddcomb
|
|
mov ecx,256
|
|
mov ebx,[UnusedBit]
|
|
mov edi,[HalfTrans]
|
|
xor eax,eax
|
|
jmp .next2
|
|
.notranspha
|
|
add esi,2
|
|
dec ecx
|
|
jz .done
|
|
.next2
|
|
mov ax,[esi]
|
|
test ax,bx
|
|
jz .notranspha
|
|
mov dx,[esi+75036*2]
|
|
test dx,bx
|
|
jnz .notranspha
|
|
and eax,edi
|
|
and edx,edi
|
|
add eax,edx
|
|
shr eax,1
|
|
mov [esi],ax
|
|
add esi,2
|
|
loop .next2
|
|
.done
|
|
pop ebx
|
|
pop esi
|
|
jmp .donetransp
|
|
.halfaddcomb
|
|
mov ecx,256
|
|
mov ebx,[UnusedBit]
|
|
mov edi,[HalfTrans]
|
|
xor eax,eax
|
|
xor edx,edx
|
|
jmp .next2c
|
|
.notransphac
|
|
add esi,2
|
|
dec ecx
|
|
jz .donec
|
|
.next2c
|
|
mov ax,[esi]
|
|
test ax,bx
|
|
jz .notransphac
|
|
mov dx,[esi+75036*2]
|
|
test dx,bx
|
|
jnz .fulladdtranspc
|
|
and eax,edi
|
|
and edx,edi
|
|
add eax,edx
|
|
shr eax,1
|
|
mov [esi],ax
|
|
add esi,2
|
|
loop .next2c
|
|
.donec
|
|
pop ebx
|
|
pop esi
|
|
jmp .donetransp
|
|
.fulladdtranspc
|
|
and eax,edi
|
|
and edx,edi
|
|
add eax,edx
|
|
shr eax,1
|
|
mov ax,[fulladdtab+eax*2]
|
|
mov [esi],ax
|
|
add esi,2
|
|
loop .next2c
|
|
pop ebx
|
|
pop esi
|
|
jmp .donetransp
|
|
|
|
.subtract
|
|
push ebx
|
|
push esi
|
|
; half adder
|
|
mov ecx,256
|
|
mov ebp,[HalfTrans]
|
|
xor edx,edx
|
|
mov bx,[UnusedBit]
|
|
.nextfshs
|
|
mov ax,[esi]
|
|
test ax,bx
|
|
je .notranspfshs
|
|
mov dx,[esi+75036*2]
|
|
xor ax,0FFFFh
|
|
and edx,ebp
|
|
and eax,ebp
|
|
add edx,eax
|
|
shr edx,1
|
|
mov dx,[fulladdtab+edx*2]
|
|
xor dx,0FFFFh
|
|
test word[esi+75036*2],bx
|
|
jnz .nothalfhs
|
|
and edx,ebp
|
|
shr edx,1
|
|
.nothalfhs
|
|
mov [esi],dx
|
|
.notranspfshs
|
|
add esi,2
|
|
loop .nextfshs
|
|
pop esi
|
|
pop ebx
|
|
jmp .donetransp
|
|
.fulltransp
|
|
test byte[scadtng+ebx],80h
|
|
jnz near .fullsubtract
|
|
push ebx
|
|
push esi
|
|
mov ecx,256
|
|
mov ebp,[HalfTrans]
|
|
xor edx,edx
|
|
xor eax,eax
|
|
mov bx,[UnusedBit]
|
|
.nextfa
|
|
mov ax,[esi]
|
|
test ax,bx
|
|
jz .notranspfa
|
|
mov dx,[esi+75036*2]
|
|
and eax,ebp
|
|
and edx,ebp
|
|
add edx,eax
|
|
shr edx,1
|
|
mov dx,[fulladdtab+edx*2]
|
|
mov [esi],dx
|
|
.notranspfa
|
|
add esi,2
|
|
loop .nextfa
|
|
pop esi
|
|
pop ebx
|
|
jmp .donetransp
|
|
.fullsubtract
|
|
push ebx
|
|
push esi
|
|
; half adder
|
|
mov ecx,256
|
|
mov ebp,[HalfTrans]
|
|
xor edx,edx
|
|
xor eax,eax
|
|
mov bx,[UnusedBit]
|
|
.nextfs
|
|
mov ax,[esi]
|
|
test ax,bx
|
|
jz .notranspfs
|
|
mov dx,[esi+75036*2]
|
|
xor ax,0FFFFh
|
|
and edx,ebp
|
|
and eax,ebp
|
|
add edx,eax
|
|
shr edx,1
|
|
mov dx,[fulladdtab+edx*2]
|
|
xor dx,0FFFFh
|
|
mov [esi],dx
|
|
.notranspfs
|
|
add esi,2
|
|
loop .nextfs
|
|
pop esi
|
|
pop ebx
|
|
.donetransp
|
|
test byte[SpecialLine+ebx],3
|
|
jz .notransp
|
|
xor dword[HiResDone],1
|
|
cmp dword[HiResDone],0
|
|
je .okaytransp
|
|
add esi,75036*4
|
|
jmp .againtransp
|
|
.okaytransp
|
|
sub esi,75036*4
|
|
.notransp
|
|
inc ebx
|
|
add esi,288*2
|
|
cmp [resolutn],bx
|
|
jne near .nextline
|
|
ret
|
|
|
|
%macro TranspMMX 3
|
|
mov esi,[vidbuffer]
|
|
add esi,16*2+288*2
|
|
mov ebx,1
|
|
.nextline
|
|
test byte[FillSubScr+ebx],1
|
|
jz near .notransp
|
|
mov dword[HiResDone],0
|
|
.againtransp
|
|
test byte[scadtng+ebx],40h
|
|
jz near .fulltransp
|
|
test byte[scadtng+ebx],80h
|
|
jnz near .subtract
|
|
|
|
; Half Add
|
|
push esi
|
|
push ebx
|
|
; filter out all fixed color sub-screen
|
|
mov ecx,64
|
|
mov eax,[UnusedBit]
|
|
.faddl2h
|
|
test dword[esi],eax
|
|
jnz near .faddloopbh
|
|
test dword[esi+4],eax
|
|
jnz near .faddloopbh
|
|
add esi,8
|
|
loop .faddl2h
|
|
jmp .faddloopdoneh
|
|
.prochalfadd
|
|
test dword[esi+75036*2],eax
|
|
jnz near .faddloopbh
|
|
test dword[esi+75036*2+4],eax
|
|
jnz near .faddloopbh
|
|
mov ebx,[esi]
|
|
and ebx,eax
|
|
cmp ebx,eax
|
|
jne near .faddlooph
|
|
mov ebx,[esi+4]
|
|
and ebx,eax
|
|
cmp ebx,eax
|
|
jne near .faddlooph
|
|
.prochalfadddo
|
|
movq mm0,[esi]
|
|
movq mm1,[esi+75036*2]
|
|
pand mm0,[HalfTrans]
|
|
pand mm1,[HalfTrans]
|
|
psrlw mm0,1
|
|
psrlw mm1,1
|
|
paddw mm0,mm1
|
|
movq [esi],mm0
|
|
add esi,8
|
|
loop .prochalfadd
|
|
jmp .faddloopdoneh
|
|
.procfulladd
|
|
mov ebx,[esi]
|
|
and ebx,eax
|
|
cmp ebx,eax
|
|
jne near .faddlooph
|
|
mov ebx,[esi+4]
|
|
and ebx,eax
|
|
cmp ebx,eax
|
|
jne near .faddlooph
|
|
mov ebx,[esi+75036*2]
|
|
and ebx,eax
|
|
cmp ebx,eax
|
|
jne near .faddlooph
|
|
mov ebx,[esi+75036*2+4]
|
|
and ebx,eax
|
|
cmp ebx,eax
|
|
jne near .faddlooph
|
|
.procfulladddo
|
|
movq mm0,[esi]
|
|
movq mm1,[esi+75036*2]
|
|
pand mm0,[UnusedBitXor]
|
|
movq mm2,mm0
|
|
movq mm4,mm1
|
|
movq mm3,mm0
|
|
%if %1>0
|
|
psllw mm0,%1
|
|
psllw mm1,%1
|
|
%endif
|
|
paddusw mm0,mm1
|
|
pand mm0,[FullBitAnd]
|
|
movq mm1,mm4
|
|
%if %1>0
|
|
psrlw mm0,%1
|
|
%endif
|
|
psllw mm2,%2
|
|
psllw mm1,%2
|
|
paddusw mm2,mm1
|
|
pand mm2,[FullBitAnd]
|
|
psrlw mm2,%2
|
|
psllw mm3,%3
|
|
psllw mm4,%3
|
|
paddusw mm3,mm4
|
|
pand mm3,[FullBitAnd]
|
|
psrlw mm3,%3
|
|
por mm0,mm3
|
|
por mm0,mm2
|
|
movq [esi],mm0
|
|
add esi,8
|
|
dec ecx
|
|
jnz near .procfulladd
|
|
jmp .faddloopdoneh
|
|
.faddlooph
|
|
mov ebx,dword[esi]
|
|
test ebx,eax
|
|
jz near .faddl2h
|
|
and ebx,eax
|
|
cmp ebx,eax
|
|
jne .faddloopbh
|
|
mov ebx,dword[esi+4]
|
|
and ebx,eax
|
|
cmp ebx,eax
|
|
jne .faddloopbh
|
|
mov ebx,[esi+75036*2]
|
|
and ebx,eax
|
|
or ebx,ebx
|
|
jz .faddla
|
|
cmp ebx,eax
|
|
jne .faddloopbh
|
|
mov ebx,[esi+75036*2+4]
|
|
and ebx,eax
|
|
cmp ebx,eax
|
|
jne .faddloopbh
|
|
jmp .procfulladddo
|
|
.faddla
|
|
test dword[esi+75036*2+4],eax
|
|
jz near .prochalfadddo
|
|
.faddloopbh
|
|
movq mm0,[esi]
|
|
movq mm5,mm0
|
|
movq mm6,mm0
|
|
pand mm5,[UnusedBitXor]
|
|
movq mm1,[esi+75036*2]
|
|
movq mm7,mm1
|
|
movq mm2,mm0
|
|
pand mm1,[UnusedBitXor]
|
|
movq mm3,mm0
|
|
movq mm4,mm1
|
|
%if %1>0
|
|
psllw mm0,%1
|
|
psllw mm1,%1
|
|
%endif
|
|
paddusw mm0,mm1
|
|
pand mm0,[FullBitAnd]
|
|
movq mm1,mm4
|
|
%if %1>0
|
|
psrlw mm0,%1
|
|
%endif
|
|
psllw mm2,%2
|
|
psllw mm1,%2
|
|
paddusw mm2,mm1
|
|
pand mm2,[FullBitAnd]
|
|
movq mm1,mm4
|
|
psrlw mm2,%2
|
|
psllw mm3,%3
|
|
psllw mm1,%3
|
|
paddusw mm3,mm1
|
|
pand mm3,[FullBitAnd]
|
|
psrlw mm3,%3
|
|
por mm0,mm3
|
|
por mm0,mm2
|
|
pand mm6,[UnusedBit]
|
|
pcmpeqw mm6,[UnusedBit]
|
|
pand mm0,mm6
|
|
movq mm1,mm5
|
|
pand mm1,mm6
|
|
pand mm4,mm6
|
|
pxor mm6,[UnusedBitXor]
|
|
pand mm5,mm6
|
|
pand mm7,[UnusedBit]
|
|
pand mm4,[HalfTrans]
|
|
pand mm1,[HalfTrans]
|
|
psrlw mm1,1
|
|
psrlw mm4,1
|
|
paddw mm1,mm4
|
|
pcmpeqw mm7,[UnusedBit]
|
|
pand mm0,mm7
|
|
pxor mm7,[UnusedBitXor]
|
|
pand mm1,mm7
|
|
por mm0,mm1
|
|
por mm0,mm5
|
|
movq [esi],mm0
|
|
add esi,8
|
|
dec ecx
|
|
jnz near .faddlooph
|
|
.faddloopdoneh
|
|
pop ebx
|
|
pop esi
|
|
jmp .donetransp
|
|
|
|
.subtract
|
|
push ebx
|
|
push esi
|
|
mov ecx,64
|
|
mov eax,[UnusedBit]
|
|
.fsubl2h
|
|
test dword[esi],eax
|
|
jnz .fsubloopbh
|
|
test dword[esi+4],eax
|
|
jnz .fsubloopbh
|
|
add esi,8
|
|
loop .fsubl2h
|
|
jmp .fsubloopdoneh
|
|
.fsublooph
|
|
test dword[esi],eax
|
|
jz .fsubl2h
|
|
.fsubloopbh
|
|
movq mm0,[esi]
|
|
movq mm5,mm0
|
|
movq mm6,mm0
|
|
pxor mm0,[UnusedBitXor]
|
|
pand mm5,[UnusedBitXor]
|
|
movq mm1,[esi+75036*2]
|
|
movq mm7,mm1
|
|
movq mm2,mm0
|
|
pand mm1,[UnusedBitXor]
|
|
movq mm3,mm0
|
|
movq mm4,mm1
|
|
%if %1>0
|
|
psllw mm0,%1
|
|
psllw mm1,%1
|
|
%endif
|
|
paddusw mm0,mm1
|
|
pand mm0,[FullBitAnd]
|
|
movq mm1,mm4
|
|
%if %1>0
|
|
psrlw mm0,%1
|
|
%endif
|
|
psllw mm2,%2
|
|
psllw mm1,%2
|
|
paddusw mm2,mm1
|
|
pand mm2,[FullBitAnd]
|
|
psrlw mm2,%2
|
|
psllw mm3,%3
|
|
psllw mm4,%3
|
|
paddusw mm3,mm4
|
|
pand mm3,[FullBitAnd]
|
|
psrlw mm3,%3
|
|
por mm0,mm3
|
|
por mm0,mm2
|
|
pand mm6,[UnusedBit]
|
|
pxor mm0,[UnusedBitXor]
|
|
pcmpeqw mm6,[UnusedBit]
|
|
pand mm0,mm6
|
|
pxor mm6,[UnusedBitXor]
|
|
pand mm5,mm6
|
|
pand mm7,[UnusedBit]
|
|
movq mm1,mm0
|
|
pand mm1,[HalfTrans]
|
|
psrlw mm1,1
|
|
pcmpeqw mm7,[UnusedBit]
|
|
pand mm0,mm7
|
|
pxor mm7,[UnusedBitXor]
|
|
pand mm1,mm7
|
|
por mm0,mm1
|
|
por mm0,mm5
|
|
movq [esi],mm0
|
|
add esi,8
|
|
dec ecx
|
|
jnz near .fsublooph
|
|
.fsubloopdoneh
|
|
pop esi
|
|
pop ebx
|
|
jmp .donetransp
|
|
|
|
.fulltransp
|
|
test byte[scadtng+ebx],80h
|
|
jnz near .fullsubtract
|
|
push ebx
|
|
push esi
|
|
mov ecx,64
|
|
mov eax,[UnusedBit]
|
|
.faddl2
|
|
test dword[esi],eax
|
|
jnz .faddloopb
|
|
test dword[esi+4],eax
|
|
jnz .faddloopb
|
|
add esi,8
|
|
loop .faddl2
|
|
jmp .faddloopdone
|
|
.faddloop
|
|
test dword[esi],eax
|
|
jz .faddl2
|
|
.faddloopb
|
|
movq mm0,[esi]
|
|
movq mm1,[esi+75036*2]
|
|
movq mm6,mm0
|
|
pand mm0,[UnusedBitXor]
|
|
movq mm2,mm0
|
|
movq mm4,mm1
|
|
movq mm3,mm0
|
|
movq mm5,mm0
|
|
%if %1>0
|
|
psllw mm0,%1
|
|
psllw mm1,%1
|
|
%endif
|
|
paddusw mm0,mm1
|
|
pand mm0,[FullBitAnd]
|
|
movq mm1,mm4
|
|
%if %1>0
|
|
psrlw mm0,%1
|
|
%endif
|
|
psllw mm2,%2
|
|
psllw mm1,%2
|
|
paddusw mm2,mm1
|
|
pand mm2,[FullBitAnd]
|
|
psrlw mm2,%2
|
|
psllw mm3,%3
|
|
psllw mm4,%3
|
|
paddusw mm3,mm4
|
|
pand mm3,[FullBitAnd]
|
|
psrlw mm3,%3
|
|
por mm0,mm3
|
|
por mm0,mm2
|
|
pand mm6,[UnusedBit]
|
|
pcmpeqw mm6,[UnusedBit]
|
|
pand mm0,mm6
|
|
pxor mm6,[UnusedBitXor]
|
|
pand mm5,mm6
|
|
por mm0,mm5
|
|
movq [esi],mm0
|
|
add esi,8
|
|
dec ecx
|
|
jnz near .faddloop
|
|
.faddloopdone
|
|
pop esi
|
|
pop ebx
|
|
jmp .donetransp
|
|
.fullsubtract
|
|
push ebx
|
|
push esi
|
|
mov ecx,64
|
|
mov eax,[UnusedBit]
|
|
.fsubl2
|
|
test dword[esi],eax
|
|
jnz .fsubloopb
|
|
test dword[esi+4],eax
|
|
jnz .fsubloopb
|
|
add esi,8
|
|
loop .fsubl2
|
|
jmp .fsubloopdone
|
|
.fsubloop
|
|
test dword[esi],eax
|
|
jz .fsubl2
|
|
.fsubloopb
|
|
movq mm0,[esi]
|
|
movq mm5,mm0
|
|
movq mm6,mm0
|
|
pxor mm0,[UnusedBitXor]
|
|
pand mm5,[UnusedBitXor]
|
|
movq mm1,[esi+75036*2]
|
|
movq mm2,mm0
|
|
pand mm1,[UnusedBitXor]
|
|
movq mm3,mm0
|
|
movq mm4,mm1
|
|
%if %1>0
|
|
psllw mm0,%1
|
|
psllw mm1,%1
|
|
%endif
|
|
paddusw mm0,mm1
|
|
pand mm0,[FullBitAnd]
|
|
movq mm1,mm4
|
|
%if %1>0
|
|
psrlw mm0,%1
|
|
%endif
|
|
psllw mm2,%2
|
|
psllw mm1,%2
|
|
paddusw mm2,mm1
|
|
pand mm2,[FullBitAnd]
|
|
psrlw mm2,%2
|
|
psllw mm3,%3
|
|
psllw mm4,%3
|
|
paddusw mm3,mm4
|
|
pand mm3,[FullBitAnd]
|
|
psrlw mm3,%3
|
|
por mm0,mm3
|
|
por mm0,mm2
|
|
pand mm6,[UnusedBit]
|
|
pxor mm0,[UnusedBitXor]
|
|
pcmpeqw mm6,[UnusedBit]
|
|
pand mm0,mm6
|
|
pxor mm6,[UnusedBitXor]
|
|
pand mm5,mm6
|
|
por mm0,mm5
|
|
movq [esi],mm0
|
|
add esi,8
|
|
dec ecx
|
|
jnz near .fsubloop
|
|
.fsubloopdone
|
|
pop esi
|
|
pop ebx
|
|
.donetransp
|
|
test byte[SpecialLine+ebx],3
|
|
jz .notransp
|
|
xor dword[HiResDone],1
|
|
cmp dword[HiResDone],0
|
|
je .okaytransp
|
|
add esi,75036*4
|
|
jmp .againtransp
|
|
.okaytransp
|
|
sub esi,75036*4
|
|
.notransp
|
|
inc ebx
|
|
add esi,288*2
|
|
cmp [resolutn],bx
|
|
jne near .nextline
|
|
emms
|
|
ret
|
|
%endmacro
|
|
|
|
ProcessTransparenciesMMX:
|
|
cmp byte[ngrposng],10
|
|
je near ProcessTransparenciesMMXargb
|
|
TranspMMX 0,5,11
|
|
ProcessTransparenciesMMXargb
|
|
TranspMMX 1,6,11
|
|
|
|
; movq mm0,[esi]
|
|
; movq mm1,[esi+75036*2]
|
|
; movq mm2,mm0
|
|
; movq mm4,mm1
|
|
; movq mm3,mm0
|
|
; movq mm5,mm0
|
|
; movq mm6,mm0
|
|
; ;psllw mm0,0
|
|
; ;psllw mm1,0
|
|
; paddusw mm0,mm1
|
|
; pand mm6,[UnusedBitXor]
|
|
; pand mm0,[FullBitAnd]
|
|
; movq mm1,mm4
|
|
; ;psrlw mm0,0
|
|
; psllw mm2,5
|
|
; psllw mm1,5
|
|
; paddusw mm2,mm1
|
|
; pand mm2,[FullBitAnd]
|
|
; psrlw mm2,5
|
|
; psllw mm3,11
|
|
; psllw mm4,11
|
|
; paddusw mm3,mm4
|
|
; pand mm3,[FullBitAnd]
|
|
; psrlw mm3,11
|
|
; por mm0,mm3
|
|
; por mm0,mm2
|
|
; pand mm6,[UnusedBit]
|
|
; pcmpeqw mm6,[UnusedBit]
|
|
; pand mm0,mm6
|
|
; pxor mm6,[UnusedBitXor]
|
|
; pand mm5,mm6
|
|
; por mm0,mm5
|
|
; movq [esi],mm0
|
|
|
|
; PADDUSW - Add Unsigned with Saturation on Word
|
|
; PAND (source can be a memory location)
|
|
; PANDN - bitwise AND NOT
|
|
; PCMPEQW - packed compare for equal, word
|
|
; PSLLW - Shift Left, Logical, Word
|
|
; PSRLW - Shirt Right, Logical
|
|
; POR
|
|
|
|
ALIGN32
|
|
NEWSYM UnusedBit, dd 00000000001000000000000000100000b,00000000001000000000000000100000b
|
|
NEWSYM HalfTrans, dd 11110111110111101111011111011110b,11110111110111101111011111011110b,0,0
|
|
NEWSYM UnusedBitXor, dd 11111111110111111111111111011111b,11111111110111111111111111011111b
|
|
NEWSYM ngrposng, dd 11,0
|
|
NEWSYM nggposng, dd 6,0
|
|
NEWSYM ngbposng, dd 0,0
|
|
NEWSYM HiResDone, dd 0,0
|
|
NEWSYM FullBitAnd, dd 0F800F800h,0F800F800h
|
|
NEWSYM HalfTransB, dd 00001000010000010000100001000001b,00001000010000010000100001000001b
|
|
NEWSYM HalfTransC, dd 11110111100111101111011110011110b,11110111100111101111011110011110b
|
|
NEWSYM NGNoTransp, dd 0
|
|
NEWSYM NewGfx16AsmEnd
|
|
|
|
MainScreenClip:
|
|
mov esi,[vidbuffer]
|
|
add esi,16*2+288*2
|
|
mov ebx,1
|
|
.nextline
|
|
mov al,byte[scadsng+ebx]
|
|
test al,0C0h
|
|
jz near .notthisone
|
|
push esi
|
|
push ebx
|
|
and al,0C0h
|
|
cmp al,0C0h
|
|
jne .notentire
|
|
mov ebx,[UnusedBit]
|
|
mov ecx,256
|
|
mov edx,256
|
|
jmp .startclipping
|
|
.notentire
|
|
|
|
mov dword[ngwinen],0
|
|
test byte[winbg1enval+ebx+5*256],0Ah
|
|
jz .nowindowing
|
|
push eax
|
|
push ebx
|
|
mov al,[winlogicaval+ebx*2+1]
|
|
shr al,2
|
|
and al,03h
|
|
mov [nglogicval],al
|
|
mov eax,ebx
|
|
add ebx,5*256
|
|
call BuildWindow
|
|
;ngwintable
|
|
pop ebx
|
|
pop eax
|
|
.nowindowing
|
|
|
|
mov ebx,[UnusedBit]
|
|
mov edx,256
|
|
cmp dword[ngwinen],0
|
|
jne .windowenabled
|
|
cmp al,80h
|
|
je near .finclipping
|
|
mov ecx,256
|
|
jmp .startclipping
|
|
.windowenabled
|
|
cmp al,80h
|
|
je near .outsideclipping
|
|
mov edi,ngwintable
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
or ecx,ecx
|
|
jnz near .startclipping
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
jmp .noclipping
|
|
.outsideclipping
|
|
mov edi,ngwintable
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
or ecx,ecx
|
|
jnz .noclipping
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
jmp .startclipping
|
|
|
|
.startclipping
|
|
and word[esi],bx
|
|
or word[esi+75036*2],bx
|
|
add esi,2
|
|
dec edx
|
|
jz .finclipping
|
|
dec ecx
|
|
jnz .startclipping
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
.noclipping
|
|
sub edx,ecx
|
|
jz .finclipping
|
|
jc .finclipping
|
|
add ecx,ecx
|
|
add esi,ecx
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
jmp .startclipping
|
|
|
|
.finclipping
|
|
pop ebx
|
|
pop esi
|
|
.notthisone
|
|
inc ebx
|
|
add esi,288*2
|
|
cmp [resolutn],bx
|
|
jne near .nextline
|
|
|
|
SubScreenClip:
|
|
mov esi,[vidbuffer]
|
|
add esi,16*2+288*2
|
|
mov ebx,1
|
|
.nextline
|
|
mov al,byte[scadsng+ebx]
|
|
shl al,2
|
|
test al,0C0h
|
|
jz near .notthisone
|
|
push esi
|
|
push ebx
|
|
and al,0C0h
|
|
cmp al,0C0h
|
|
jne .notentire
|
|
mov ebx,[UnusedBit]
|
|
xor ebx,0FFFFFFFFh
|
|
mov ecx,256
|
|
mov edx,256
|
|
jmp .startclipping
|
|
.notentire
|
|
|
|
mov dword[ngwinen],0
|
|
test byte[winbg1enval+ebx+5*256],0Ah
|
|
jz .nowindowing
|
|
push eax
|
|
push ebx
|
|
mov al,[winlogicaval+ebx*2+1]
|
|
shr al,2
|
|
and al,03h
|
|
mov [nglogicval],al
|
|
mov eax,ebx
|
|
add ebx,5*256
|
|
call BuildWindow
|
|
;ngwintable
|
|
pop ebx
|
|
pop eax
|
|
.nowindowing
|
|
|
|
mov ebx,[UnusedBit]
|
|
xor ebx,0FFFFFFFFh
|
|
mov edx,256
|
|
cmp dword[ngwinen],0
|
|
jne .windowenabled
|
|
cmp al,80h
|
|
je near .finclipping
|
|
mov ecx,256
|
|
jmp .startclipping
|
|
.windowenabled
|
|
cmp al,80h
|
|
je near .outsideclipping
|
|
mov edi,ngwintable
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
or ecx,ecx
|
|
jnz near .startclipping
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
jmp .noclipping
|
|
.outsideclipping
|
|
mov edi,ngwintable
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
or ecx,ecx
|
|
jnz .noclipping
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
jmp .startclipping
|
|
|
|
.startclipping
|
|
and word[esi],bx
|
|
add esi,2
|
|
dec edx
|
|
jz .finclipping
|
|
dec ecx
|
|
jnz .startclipping
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
.noclipping
|
|
sub edx,ecx
|
|
jz .finclipping
|
|
jc .finclipping
|
|
add ecx,ecx
|
|
add esi,ecx
|
|
mov ecx,[edi]
|
|
add edi,4
|
|
jmp .startclipping
|
|
|
|
.finclipping
|
|
pop ebx
|
|
pop esi
|
|
.notthisone
|
|
inc ebx
|
|
add esi,288*2
|
|
cmp [resolutn],bx
|
|
jne near .nextline
|
|
ret
|
|
|
|
|