Files
ZSNES/zsnes/src/video/makevid.asm

4404 lines
84 KiB
NASM

;Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either
;version 2 of the License, or (at your option) any later
;version.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
%include "macros.mac"
EXTSYM disableeffects,winl1,winl2,winbgdata,winr1,winr2,winspdata,winlogica
EXTSYM winenabm,winobjen,winlogicb,scrndis,scrnon,bgmode,bgtilesz,winbg1en
EXTSYM winenabs,bg1objptr,bg1ptr,bg1ptrb,bg1ptrc,bg1ptrd,bg1scrolx,bg1scroly
EXTSYM cachebg1,curbgofs1,curcolbg1,vcache2b,vcache4b,vcache8b,vcache2ba
EXTSYM vcache4ba,vcache8ba,vidbuffer,bg3highst,cbitmode,colormodedef
EXTSYM colormodeofs,drawline16b,forceblnk,newengine8b,preparesprpr,scaddset
EXTSYM spritetablea,sprleftpr,vidbright,ForceNewGfxOff,curypos,drawmode7
EXTSYM mode7set,mosaicon,mosaicsz,sprleftpr1,sprleftpr2,sprleftpr3,sprlefttot
EXTSYM sprprifix,drawmode7extbg,interlval,drawmode7extbg2,sprclprio,sprpriodata
EXTSYM sprsingle,cachetile2b,cachetile4b,cachetile8b,vram,CacheCheckSkip
EXTSYM cachetile2b16x16,cachetile4b16x16,cachetile8b16x16,osm2dis,xtravbuf
EXTSYM bg3ptr,bg3scrolx,bg3scroly,vidmemch4,ofsmcptr,ofsmady,ofsmadx,yposngom
EXTSYM flipyposngom,ofsmtptr,ofsmmptr,ofsmcyps,bgtxadd,bg1ptrx,bg1ptry
%include "video/vidmacro.mac"
;drawspritesprio
SECTION .bss
NEWSYM bgcoloradder, resb 1
NEWSYM res512switch, resb 1
SECTION .text
; mov cl,[bshifter]
;*******************************************************
; DrawLine Draws the current line
;*******************************************************
; use curypos+bg1scroly for y location and bg1scrolx for x location
; use bg1ptr(b,c,d) for the pointer to the tile number contents
; use bg1objptr for the pointer to the object tile contents
%macro decideonmode 0
cmp bl,2
je .yes4bit
cmp bl,1
je .yes2bit
mov byte[bshifter],6
mov edx,[vcache8b]
jmp .skipbits
.yes4bit
mov byte[bshifter],2
mov edx,[vcache4b]
shl eax,1
jmp .skipbits
.yes2bit
mov byte[bshifter],0
shl eax,2
mov edx,[vcache2b]
.skipbits
%endmacro
%macro procmode7 3
xor eax,eax
xor edx,edx
mov ax,[curypos]
test byte[mode7set],02h
jz %%noflip
mov ax,261
sub ax,[curypos]
%%noflip
mov byte[curmosaicsz],1
test byte[mosaicon],%3
jz %%nomos
mov bl,[mosaicsz]
cmp bl,0
je %%nomos
inc bl
mov [curmosaicsz],bl
xor edx,edx
xor bh,bh
div bx
xor edx,edx
mul bx
xor edx,edx
mov dl,[mosaicsz]
add ax,[MosaicYAdder+edx*2]
%%nomos
add ax,%1
mov dx,%2
call drawmode7
%endmacro
%macro procmode7extbg 3
xor eax,eax
xor edx,edx
mov ax,[curypos]
test byte[mode7set],02h
jz %%noflip
mov ax,261
sub ax,[curypos]
%%noflip
mov byte[curmosaicsz],1
test byte[mosaicon],%3
jz %%nomos
mov bl,[mosaicsz]
cmp bl,0
je %%nomos
inc bl
mov [curmosaicsz],bl
xor edx,edx
xor bh,bh
div bx
xor edx,edx
mul bx
xor edx,edx
mov dl,[mosaicsz]
add ax,[MosaicYAdder+edx*2]
%%nomos
add ax,%1
mov dx,%2
call drawmode7extbg
%endmacro
%macro procmode7extbg2 3
xor eax,eax
xor edx,edx
mov ax,[curypos]
test byte[mode7set],02h
jz %%noflip
mov ax,261
sub ax,[curypos]
%%noflip
mov byte[curmosaicsz],1
test byte[mosaicon],%3
jz %%nomos
mov bl,[mosaicsz]
cmp bl,0
je %%nomos
inc bl
mov [curmosaicsz],bl
xor edx,edx
xor bh,bh
div bx
xor edx,edx
mul bx
xor edx,edx
mov dl,[mosaicsz]
add ax,[MosaicYAdder+edx*2]
%%nomos
add ax,%1
mov dx,%2
call drawmode7extbg2
%endmacro
SECTION .data
NEWSYM MosaicYAdder, dw 0,0,0,1,0,2,1,0,0,4,2,2,3,1,0,7
NEWSYM cwinptr, dd winbgdata
SECTION .bss
NEWSYM pwinbgenab, resb 1
NEWSYM pwinbgtype, resd 1
NEWSYM winonbtype, resb 1
NEWSYM dualwinbg, resb 1
NEWSYM pwinspenab, resb 1
NEWSYM pwinsptype, resd 1
NEWSYM winonstype, resb 1
NEWSYM dualwinsp, resb 1
NEWSYM dwinptrproc, resd 1
SECTION .text
; is this macro even used?
%macro ClearWindowData 0
mov edi,winbgdata+16
xor eax,eax
mov ecx,64
rep stosd
%endmacro
NEWSYM makewindow
; upon entry, al = win enable bits
cmp byte[disableeffects],1
je near .finishwin
mov bl,al
and bl,00001010b
cmp bl,00001010b
je near makedualwin
cmp bl,0
je near .finishwin
mov byte[winon],1
mov ebx,[winl1]
; check if data matches previous sprite data
cmp al,[pwinspenab]
jne .skipsprcheck
cmp ebx,[pwinsptype]
jne .skipsprcheck
mov dword[cwinptr],winspdata+16
mov al,[winonstype]
mov [winon],al
ret
.skipsprcheck
; check if data matches previous data
cmp al,[pwinbgenab]
jne .skipenab
cmp ebx,[pwinbgtype]
jne .skipenab2
mov dword[cwinptr],winbgdata+16
mov al,[winonbtype]
mov [winon],al
ret
.skipenab
mov [pwinbgenab],al
mov ebx,[winl1]
.skipenab2
mov [pwinbgtype],ebx
mov dl,[winl1]
mov dh,[winr1]
test al,00000010b
jnz .win1
mov dl,[winl2]
mov dh,[winr2]
shr al,2
.win1
test al,01h
jnz near .outside
cmp dl,254
je .clipped
cmp dl,dh
jb .clip
.clipped
mov byte[winon],0
mov byte[winonbtype],0
ret
.clip
mov edi,winbgdata+16
xor eax,eax
; start drawing 1's from 0 to left
cmp dl,0
je .nextdot2
.nextdot
mov byte[edi+eax],0
inc al
cmp al,dl
jb .nextdot ; blah
.nextdot2
mov byte[edi+eax],1
inc al
cmp al,dh
jb .nextdot2
mov byte[edi+eax],1
cmp dh,255
je .nextdot4
; start drawing 1's from right to 255
.nextdot3
mov byte[edi+eax],0
inc al
jnz .nextdot3
.nextdot4
mov byte[winon],1
mov byte[winonbtype],1
mov dword[cwinptr],winbgdata+16
ret
.outside
cmp dl,dh
jb .clip2
mov byte[winon],0FFh
mov byte[winonbtype],0FFh
mov dword[cwinptr],winbgdata+16
ret
.clip2
cmp dl,1
ja .nooutclip
cmp dh,254
jae near .clipped
.nooutclip
mov edi,winbgdata+16
xor eax,eax
; start drawing 1's from 0 to left
.nextdoti
mov byte[edi+eax],1
inc al
cmp al,dl
jb .nextdoti
.nextdot2i
mov byte[edi+eax],0
inc al
cmp al,dh
jb .nextdot2i
mov byte[edi+eax],0
cmp al,255
je .nextdot4i
inc al
; start drawing 1's from right to 255
.nextdot3i
mov byte[edi+eax],1
inc al
jnz .nextdot3i
.nextdot4i
mov byte[winon],1
mov byte[winonbtype],1
mov dword[cwinptr],winbgdata+16
ret
.finishwin
ret
NEWSYM makedualwin
mov ecx,ebp
shl cl,1
mov dl,[winlogica]
shr dl,cl
and dl,03h
mov cl,dl
mov byte[winon],1
mov ebx,[winl1]
; check if data matches previous sprite data
cmp cl,[dualwinsp]
jne .skipsprcheck
cmp al,[pwinspenab]
jne .skipsprcheck
cmp ebx,[pwinsptype]
jne .skipsprcheck
mov dword[cwinptr],winspdata+16
mov al,[winonstype]
mov [winon],al
ret
.skipsprcheck
; check if data matches previous data
cmp cl,[dualwinbg]
jne .skipenab3
cmp al,[pwinbgenab]
jne .skipenab
cmp ebx,[pwinbgtype]
jne .skipenab2
mov dword[cwinptr],winbgdata+16
mov al,[winonbtype]
mov [winon],al
ret
.skipenab3
mov [dualwinbg],cl
.skipenab
mov [pwinbgenab],al
mov ebx,[winl1]
.skipenab2
mov [pwinbgtype],ebx
mov dword[dwinptrproc],winbgdata+16
mov dword[cwinptr],winbgdata+16
mov byte[winon],1
mov byte[winonbtype],1
NEWSYM dualstartprocess
mov dl,[winl1]
mov dh,[winr1]
push eax
push ecx
test al,01h
jnz near .outside
cmp dl,254
je .clipped
cmp dl,dh
jb .clip
.clipped
mov edi,[dwinptrproc]
xor eax,eax
mov ecx,64
rep stosd
jmp .donextwin
.clip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
cmp dl,0
je .nextdot2
.nextdot
mov byte[edi+eax],0
inc al
cmp al,dl
jbe .nextdot
.nextdot2
mov byte[edi+eax],1
inc al
cmp al,dh
jb .nextdot2
mov byte[edi+eax],1
cmp dh,255
je .nextdot4
; start drawing 1's from right to 255
.nextdot3
mov byte[edi+eax],0
inc al
jnz .nextdot3
.nextdot4
jmp .donextwin
.outside
cmp dl,dh
jb .clip2
mov edi,[dwinptrproc]
mov eax,01010101h
mov ecx,64
rep stosd
jmp .donextwin
.clip2
cmp dl,1
ja .nooutclip
cmp dh,254
jae near .clipped
.nooutclip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
.nextdoti
mov byte[edi+eax],1
inc al
cmp al,dl
jb .nextdoti
.nextdot2i
mov byte[edi+eax],0
inc al
cmp al,dh
jb .nextdot2i
mov byte[edi+eax],0
cmp al,255
je .nextdot4i
inc al
; start drawing 1's from right to 255
.nextdot3i
mov byte[edi+eax],1
inc al
jnz .nextdot3i
.nextdot4i
.donextwin
pop ecx
pop eax
cmp cl,0
je near dualwinor
cmp cl,2
je near dualwinxor
cmp cl,3
je near dualwinxnor
NEWSYM dualwinand
mov dl,[winl2]
mov dh,[winr2]
test al,04h
jnz near .outside
cmp dl,254
je .clipped
cmp dl,dh
jb .clip
.clipped
mov edi,[dwinptrproc]
xor eax,eax
mov ecx,64
rep stosd
jmp .donextwin
.clip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
cmp dl,0
je .nextdot2
.nextdot
mov byte[edi+eax],0
inc al
cmp al,dl
jbe .nextdot
.nextdot2
and byte[edi+eax],1
inc al
cmp al,dh
jb .nextdot2
and byte[edi+eax],1
cmp dh,255
je .nextdot4
; start drawing 1's from right to 255
.nextdot3
mov byte[edi+eax],0
inc al
jnz .nextdot3
.nextdot4
jmp .donextwin
.outside
cmp dl,dh
jb .clip2
jmp .donextwin
.clip2
cmp dl,1
ja .nooutclip
cmp dh,254
jae near .clipped
.nooutclip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
.nextdoti
and byte[edi+eax],1
inc al
cmp al,dl
jb .nextdoti
.nextdot2i
mov byte[edi+eax],0
inc al
cmp al,dh
jb .nextdot2i
mov byte[edi+eax],0
cmp al,255
je .nextdot4i
inc al
; start drawing 1's from right to 255
.nextdot3i
and byte[edi+eax],1
inc al
jnz .nextdot3i
.nextdot4i
.donextwin
ret
NEWSYM dualwinor
mov dl,[winl2]
mov dh,[winr2]
test al,04h
jnz near .outside
cmp dl,254
je .clipped
cmp dl,dh
jb .clip
.clipped
jmp .donextwin
.clip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
cmp dl,0
je .nextdot2
mov al,dl
inc al
.nextdot2
mov byte[edi+eax],1
inc al
cmp al,dh
jb .nextdot2
mov byte[edi+eax],1
jmp .donextwin
.outside
cmp dl,dh
jb .clip2
mov edi,[dwinptrproc]
mov eax,01010101h
mov ecx,64
rep stosd
jmp .donextwin
.clip2
cmp dl,1
ja .nooutclip
cmp dh,254
jae near .clipped
.nooutclip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
.nextdoti
mov byte[edi+eax],1
inc al
cmp al,dl
jb .nextdoti
mov al,dh
cmp al,255
je .nextdot4i
inc al
; start drawing 1's from right to 255
.nextdot3i
mov byte[edi+eax],1
inc al
jnz .nextdot3i
.nextdot4i
.donextwin
ret
NEWSYM dualwinxor
mov dl,[winl2]
mov dh,[winr2]
test al,04h
jnz near .outside
cmp dl,254
je .clipped
cmp dl,dh
jb .clip
.clipped
jmp .donextwin
.clip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
cmp dl,0
je .nextdot2
mov al,dl
inc al
.nextdot2
xor byte[edi+eax],1
inc al
cmp al,dh
jb .nextdot2
xor byte[edi+eax],1
jmp .donextwin
.outside
cmp dl,dh
jb .clip2
mov edi,[dwinptrproc]
mov ecx,64
.loopxor
xor dword[edi],01010101h
add edi,4
dec ecx
jnz .loopxor
jmp .donextwin
.clip2
cmp dl,1
ja .nooutclip
cmp dh,254
jae near .clipped
.nooutclip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
.nextdoti
xor byte[edi+eax],1
inc al
cmp al,dl
jb .nextdoti
mov al,dh
cmp al,255
je .nextdot4i
inc al
; start drawing 1's from right to 255
.nextdot3i
xor byte[edi+eax],1
inc al
jnz .nextdot3i
.nextdot4i
.donextwin
ret
NEWSYM dualwinxnor
mov dl,[winl2]
mov dh,[winr2]
test al,04h
jnz near .outside
cmp dl,254
je .clipped
cmp dl,dh
jb .clip
.clipped
jmp .donextwin
.clip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
cmp dl,0
je .nextdot2
mov al,dl
inc al
.nextdot2
xor byte[edi+eax],1
inc al
cmp al,dh
jb .nextdot2
xor byte[edi+eax],1
jmp .donextwin
.outside
cmp dl,dh
jb .clip2
mov edi,[dwinptrproc]
mov ecx,64
.loopxor
xor dword[edi],01010101h
add edi,4
dec ecx
jnz .loopxor
jmp .donextwin
.clip2
cmp dl,1
ja .nooutclip
cmp dh,254
jae near .clipped
.nooutclip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
.nextdoti
xor byte[edi+eax],1
inc al
cmp al,dl
jb .nextdoti
mov al,dh
cmp al,255
je .nextdot4i
inc al
; start drawing 1's from right to 255
.nextdot3i
xor byte[edi+eax],1
inc al
jnz .nextdot3i
.nextdot4i
.donextwin
mov edi,[dwinptrproc]
mov ecx,64
.loopxor2
xor dword[edi],01010101h
add edi,4
dec ecx
jnz .loopxor2
ret
SECTION .bss
NEWSYM winonsp, resb 1
SECTION .text
NEWSYM makewindowsp
mov al,[winobjen]
mov byte[winonsp],0
test dword[winenabm],1010h
jz near .finishwin
; upon entry, al = win enable bits
cmp byte[disableeffects],1
je near .finishwin
mov bl,al
and bl,00001010b
cmp bl,00001010b
je near makedualwinsp
cmp bl,0
je near .finishwin
mov byte[winonsp],1
; check if data matches previous data
cmp al,[pwinspenab]
jne .skipenab
mov ebx,[winl1]
cmp ebx,[pwinsptype]
jne .skipenab2
mov dword[cwinptr],winspdata+16
mov al,[winonstype]
mov [winonsp],al
ret
.skipenab
mov [pwinspenab],al
mov ebx,[winl1]
.skipenab2
mov [pwinsptype],ebx
mov dl,[winl1]
mov dh,[winr1]
test al,00000010b
jnz .win1
mov dl,[winl2]
mov dh,[winr2]
shr al,2
.win1
test al,01h
jnz near .outside
cmp dl,254
je .clipped
cmp dl,dh
jb .clip
.clipped
mov byte[winonsp],0
mov byte[winonstype],0
ret
.clip
mov edi,winspdata+16
xor eax,eax
; start drawing 1's from 0 to left
cmp dl,0
je .nextdot2
.nextdot
mov byte[edi+eax],0
inc al
cmp al,dl
jbe .nextdot
.nextdot2
mov byte[edi+eax],1
inc al
cmp al,dh
jb .nextdot2
mov byte[edi+eax],1
cmp dh,255
je .nextdot4
; start drawing 1's from right to 255
.nextdot3
mov byte[edi+eax],0
inc al
jnz .nextdot3
.nextdot4
mov byte[winonsp],1
mov byte[winonstype],1
mov dword[cwinptr],winspdata+16
ret
.outside
cmp dl,dh
jb .clip2
mov byte[winonsp],0FFh
mov byte[winonstype],0FFh
mov dword[cwinptr],winspdata+16
ret
.clip2
cmp dl,1
ja .nooutclip
cmp dh,254
jae near .clipped
.nooutclip
mov edi,winspdata+16
xor eax,eax
; start drawing 1's from 0 to left
.nextdoti
mov byte[edi+eax],1
inc al
cmp al,dl
jb .nextdoti
.nextdot2i
mov byte[edi+eax],0
inc al
cmp al,dh
jb .nextdot2i
mov byte[edi+eax],0
cmp al,255
je .nextdot4i
inc al
; start drawing 1's from right to 255
.nextdot3i
mov byte[edi+eax],1
inc al
jnz .nextdot3i
.nextdot4i
mov byte[winonsp],1
mov byte[winonstype],1
mov dword[cwinptr],winspdata+16
ret
.finishwin
ret
NEWSYM makedualwinsp
mov ecx,ebp
shl cl,1
mov dl,[winlogicb]
and dl,03h
mov cl,dl
mov byte[winonsp],1
; check if data matches previous data
cmp cl,[dualwinsp]
jne .skipenab3
cmp al,[pwinspenab]
jne .skipenab
mov ebx,[winl1]
cmp ebx,[pwinsptype]
jne .skipenab2
mov dword[cwinptr],winspdata+16
mov al,[winonstype]
mov [winonsp],al
ret
.skipenab3
mov [dualwinsp],cl
.skipenab
mov [pwinspenab],al
mov ebx,[winl1]
.skipenab2
mov [pwinsptype],ebx
mov dword[dwinptrproc],winspdata+16
mov dword[cwinptr],winspdata+16
mov byte[winonsp],1
mov byte[winonstype],1
jmp dualstartprocess
; window logic data
SECTION .bss
NEWSYM windowdata, resb 16
NEWSYM numwin, resb 1
NEWSYM multiwin, resb 1
NEWSYM multiclip, resb 1
NEWSYM multitype, resb 1
SECTION .text
; jmp .finishwin
%macro procwindow 1
cmp byte[disableeffects],1
je near .finishwin
mov al,%1
test al,00001010b
jz near .finishwin
mov esi,windowdata
mov bl,al
mov byte[winon],1
and bl,00001010b
and al,00000101b
mov byte[numwin],0
cmp bl,00001010b
je near .multiwin
mov byte[multiwin],0
test bl,00000010b
jnz .win1
mov cl,[winl2]
mov ch,[winr2]
shr al,2
jmp .okaywin
.win1
mov cl,[winl1]
mov ch,[winr1]
and al,01h
.okaywin
cmp ch,255
je .noinc
inc ch
.noinc
test al,01h
jnz .wininside
cmp cl,ch
jae .noinsidemask
mov [esi],cl
mov byte[esi+1],01h
mov [esi+2],ch
mov byte[esi+3],0FFh
mov byte[numwin],2
jmp .finishwin
.noinsidemask
mov byte[winon],0
jmp .finishwin
.wininside
cmp cl,ch
ja .nooutsidemask
.nonotoutside
cmp ch,254
jb .skipnodraw
cmp cl,1
jbe .noinsidemask
.skipnodraw
mov byte[esi],0
mov byte[esi+1],01h
mov byte[esi+2],cl
mov byte[esi+3],0FFh
mov byte[esi+4],ch
mov byte[esi+5],01h
mov byte[numwin],3
jmp .finishwin
.nooutsidemask
mov byte[esi],0
mov byte[esi+1],01h
mov byte[numwin],1
jmp .finishwin
; **************
; *Multiwindows*
; **************
.multiwin
mov byte[winon],0
mov byte[multiwin],0
mov byte[multiclip],al
mov al,[winlogica]
mov ecx,ebp
shl ecx,1
shr al,cl
and al,3h
mov byte[multitype],al
mov cl,[winl1]
mov ch,[winr1]
mov esi,windowdata
cmp ch,255
je .noinc2
inc ch
.noinc2
test byte[multiclip],01h
jnz .wininside2
cmp cl,ch
jae .nowina
mov [esi],cl
mov byte[esi+1],01h
mov [esi+2],ch
mov byte[esi+3],0FFh
add esi,4
mov byte[numwin],2
jmp .secondwin
.nowina
mov cl,[winl2]
mov ch,[winr2]
mov al,[multiclip]
shr al,2
jmp .okaywin
.wininside2
cmp cl,ch
ja .nooutsidemask2
cmp ch,254
jb .skipnodraw2
cmp cl,1
jbe .nooutsidemask2
.skipnodraw2
mov byte[esi],0
mov byte[esi+1],01h
mov byte[esi+2],cl
mov byte[esi+3],0FFh
mov byte[esi+4],ch
mov byte[esi+5],01h
mov byte[numwin],3
jmp .secondwin
.nooutsidemask2
mov byte[esi],0
mov byte[esi+1],01h
mov byte[numwin],1
.secondwin
mov byte[multiwin],1
mov byte[winon],1
.finishwin
%endmacro
NEWSYM procspritessub
test byte[scrndis],10h
jnz .nosprites
test byte[scrnon+1],10h
jz .nosprites
test byte[scrnon],10h
jnz .nosprites
cmp byte[winonsp],0FFh
je .nosprites
xor ebx,ebx
mov bl,[curypos]
add ebx,[cursprloc]
mov cl,[ebx]
cmp byte[sprprifix],0
jne .sprprio
add dword[cursprloc],256
.sprprio
or cl,cl
jz .nosprites
call drawsprites
.nosprites
ret
NEWSYM procspritesmain
test byte[scrndis],10h
jnz .nosprites
test byte[scrnon],10h
jz .nosprites
cmp byte[winonsp],0FFh
je .nosprites
xor ebx,ebx
mov bl,[curypos]
add ebx,[cursprloc]
mov cl,[ebx]
cmp byte[sprprifix],0
jne .sprprio
add dword[cursprloc],256
.sprprio
or cl,cl
jz .nosprites
call drawsprites
.nosprites
ret
SECTION .bss
NEWSYM curbgnum, resb 1
SECTION .text
NEWSYM drawbackgrndsub
mov esi,[colormodeofs]
mov bl,[esi+ebp]
cmp bl,0
je near .noback
mov al,[curbgnum]
test byte[scrnon+1],al
jz near .noback
test byte[scrnon],al
jnz near .noback
test byte[alreadydrawn],al
jnz near .noback
test byte[scrndis],al
jnz near .noback
mov byte[winon],0
test byte[winenabs],al
jz near .nobackwin
; procwindow [winbg1en+ebp]
mov al,[winbg1en+ebp]
call makewindow
cmp byte[winon],0FFh
je near .noback
.nobackwin
mov bl,[curbgnum]
mov byte[curmosaicsz],1
test byte[mosaicon],bl
jz .nomos
mov bl,[mosaicsz]
cmp bl,0
je .nomos
inc bl
mov [curmosaicsz],bl
.nomos
mov byte[bgcoloradder],0
cmp byte[bgmode],0
jne .nomode0
mov eax,ebp
shl eax,5
mov byte[bgcoloradder],al
.nomode0
mov esi,[bg1vbufloc+ebp*4]
mov edi,[bg1tdatloc+ebp*4]
mov edx,[bg1tdabloc+ebp*4]
mov ebx,[bg1cachloc+ebp*4]
mov eax,[bg1xposloc+ebp*4]
mov cl,[curbgnum]
test byte[bgtilesz],cl
jnz .16x16
mov ecx,[bg1yaddval+ebp*4]
call draw8x8
cmp byte[drawn],33
jne .notalldrawn
mov al,[curbgnum]
or [alreadydrawn],al
.notalldrawn
jmp .noback
.16x16
mov ecx,[bg1yaddval+ebp*4]
call draw16x16
cmp byte[drawn],33
jne .notalldrawnb
mov al,[curbgnum]
or [alreadydrawn],al
.notalldrawnb
.noback
ret
NEWSYM drawbackgrndmain
mov esi,[colormodeofs]
mov bl,[esi+ebp]
cmp bl,0
je near .noback
mov al,[curbgnum]
test byte[scrnon],al
jz near .noback
test byte[alreadydrawn],al
jnz near .noback
test byte[scrndis],al
jnz near .noback
mov byte[winon],0
test byte[winenabm],al
jz near .nobackwin
; procwindow [winbg1en+ebp]
mov al,[winbg1en+ebp]
call makewindow
cmp byte[winon],0FFh
je near .noback
.nobackwin
mov bl,[curbgnum]
mov byte[curmosaicsz],1
test byte[mosaicon],bl
jz .nomos
mov bl,[mosaicsz]
cmp bl,0
je .nomos
inc bl
mov [curmosaicsz],bl
.nomos
mov byte[bgcoloradder],0
cmp byte[bgmode],0
jne .nomode0
mov eax,ebp
shl eax,5
mov byte[bgcoloradder],al
.nomode0
mov esi,[bg1vbufloc+ebp*4]
mov edi,[bg1tdatloc+ebp*4]
mov edx,[bg1tdabloc+ebp*4]
mov ebx,[bg1cachloc+ebp*4]
mov eax,[bg1xposloc+ebp*4]
mov cl,[curbgnum]
test byte[bgtilesz],cl
jnz .16x16
mov ecx,[bg1yaddval+ebp*4]
call draw8x8
cmp byte[drawn],33
jne .notalldrawn
mov al,[curbgnum]
or [alreadydrawn],al
.notalldrawn
jmp .noback
.16x16
mov ecx,[bg1yaddval+ebp*4]
call draw16x16
cmp byte[drawn],33
jne .notalldrawnb
mov al,[curbgnum]
or [alreadydrawn],al
.notalldrawnb
.noback
ret
NEWSYM procbackgrnd
mov esi,[colormodeofs]
mov bl,[esi+ebp]
cmp bl,0
je near .noback
mov al,[curbgnum]
mov ah,al
test byte[scrndis],al
jnz near .noback
test [scrnon],ax
jz near .noback
push ebp
shl ebp,6
mov edi,cachebg1
add edi,ebp
pop ebp
cmp bl,[curcolbg1+ebp]
je .skipclearcache
mov [curcolbg1+ebp],bl
mov ax,[bg1ptr+ebp*2]
mov [curbgofs1+ebp*2],ax
call fillwithnothing
.skipclearcache
xor eax,eax
mov [curcolor],bl
mov ax,[bg1objptr+ebp*2]
decideonmode
add edx,eax
xor eax,eax
mov [tempcach],edx
xor edx,edx
mov ax,[bg1objptr+ebp*2]
mov [curtileptr],ax
mov ax,[bg1ptr+ebp*2]
mov [bgptr],ax
cmp ax,[curbgofs1+ebp*2]
je .skipclearcacheb
mov [curbgofs1+ebp*2],ax
call fillwithnothing
.skipclearcacheb
mov ax,[bg1ptrb+ebp*2]
mov [bgptrb],ax
mov ax,[bg1ptrc+ebp*2]
mov [bgptrc],ax
mov ax,[bg1ptrd+ebp*2]
mov [bgptrd],ax
mov bl,[curbgnum]
mov ax,[curypos]
mov byte[curmosaicsz],1
test byte[mosaicon],bl
jz .nomos
mov bl,[mosaicsz]
cmp bl,0
je .nomos
inc bl
mov [curmosaicsz],bl
xor edx,edx
xor bh,bh
div bx
xor edx,edx
mul bx
xor edx,edx
mov dl,[mosaicsz]
add ax,[MosaicYAdder+edx*2]
.nomos
add ax,[bg1scroly+ebp*2]
mov dx,[bg1scrolx+ebp*2]
mov cl,[curbgnum]
test byte[bgtilesz],cl
jnz .16x16
call proc8x8
mov [bg1vbufloc+ebp*4],esi
mov [bg1tdatloc+ebp*4],edi
mov [bg1tdabloc+ebp*4],edx
mov [bg1cachloc+ebp*4],ebx
mov [bg1yaddval+ebp*4],ecx
mov [bg1xposloc+ebp*4],eax
ret
.16x16
call proc16x16
mov [bg1vbufloc+ebp*4],esi
mov [bg1tdatloc+ebp*4],edi
mov [bg1tdabloc+ebp*4],edx
mov [bg1cachloc+ebp*4],ebx
mov [bg1yaddval+ebp*4],ecx
mov [bg1xposloc+ebp*4],eax
.noback
ret
SECTION .bss
NEWSYM nextprimode, resb 1
NEWSYM cursprloc, resd 1
NEWSYM curcolor, resb 1
NEWSYM curtileptr, resw 1
; esi = pointer to video buffer
; edi = pointer to tile data
; ebx = cached memory
; al = current x position
NEWSYM bg1vbufloc, resd 1
NEWSYM bg2vbufloc, resd 1
NEWSYM bg3vbufloc, resd 1
NEWSYM bg4vbufloc, resd 1
NEWSYM bg1tdatloc, resd 1
NEWSYM bg2tdatloc, resd 1
NEWSYM bg3tdatloc, resd 1
NEWSYM bg4tdatloc, resd 1
NEWSYM bg1tdabloc, resd 1
NEWSYM bg2tdabloc, resd 1
NEWSYM bg3tdabloc, resd 1
NEWSYM bg4tdabloc, resd 1
NEWSYM bg1cachloc, resd 1
NEWSYM bg2cachloc, resd 1
NEWSYM bg3cachloc, resd 1
NEWSYM bg4cachloc, resd 1
NEWSYM bg1yaddval, resd 1
NEWSYM bg2yaddval, resd 1
NEWSYM bg3yaddval, resd 1
NEWSYM bg4yaddval, resd 1
NEWSYM bg1xposloc, resd 1
NEWSYM bg2xposloc, resd 1
NEWSYM bg3xposloc, resd 1
NEWSYM bg4xposloc, resd 1
NEWSYM alreadydrawn, resb 1
SECTION .text
NEWSYM fillwithnothing
push edi
xor eax,eax
mov ecx,16
.loop
mov [edi],eax
add edi,4
dec ecx
jnz .loop
pop edi
ret
SECTION .bss
NEWSYM bg3draw, resb 1
NEWSYM maxbr, resb 1
SECTION .text
NEWSYM blanker
; calculate current video offset
push ebx
push esi
xor ebx,ebx
mov bx,[curypos]
mov esi,ebx
shl esi,8
shl ebx,5
add esi,ebx
add esi,16
add esi,[vidbuffer]
mov bl,64
.next
mov dword[esi],0
add esi,4
dec bl
jnz .next
pop esi
pop ebx
ret
ALIGN32
SECTION .bss
NEWSYM bg3high2, resd 1
NEWSYM newengen, resd 1
NEWSYM cwinenabm, resd 1
SECTION .text
NEWSYM drawline
mov al,[winenabs]
mov [cwinenabm],al
mov byte[bg3high2],0
cmp byte[bgmode],1
jne .nohigh
mov al,[bg3highst]
mov [bg3high2],al
.nohigh
cmp byte[cbitmode],1
je near drawline16b
mov al,[vidbright]
cmp al,[maxbr]
jbe .nochange
mov [maxbr],al
.nochange
cmp byte[ForceNewGfxOff],0
jne .nonewgfx
cmp byte[newengen],1
je near newengine8b
.nonewgfx
cmp byte[forceblnk],0
jne near blanker
mov byte[alreadydrawn],0
; cmp byte[curypos],70
; jne .no
; push ebx
; mov bl,[winlogica]
; mov [bg1sx],bl
; pop ebx
;.no
push ebx
xor ebx,ebx
mov bl,[bgmode]
shl bl,2
add ebx,colormodedef
mov [colormodeofs],ebx
pop ebx
cmp byte[bgmode],7
je near processmode7
mov al,[scrnon]
test [scrnon+1],al
jz .nomainsub
test byte[scrnon],10h
jnz .nomainsub
test byte[scrnon+1],10h
jz .nomainsub
mov al,[scrnon+1]
xor al,0FFh
and [scrnon],al
.nomainsub
push esi
push edi
push ebx
push edx
push ebp
; calculate current video offset
xor ebx,ebx
mov bx,[curypos]
mov esi,ebx
shl esi,8
shl ebx,5
add esi,ebx
add esi,16
add esi,[vidbuffer]
mov [curvidoffset],esi
; clear video buffer
mov edi,esi
mov ecx,64
xor eax,eax
rep stosd
; do sprite windowing
call makewindowsp
; get current sprite table
xor ebx,ebx
mov bl,[curypos]
shl ebx,9
add ebx,[spritetablea]
mov [currentobjptr],ebx
mov dword[cursprloc],sprleftpr
; setup priorities
cmp byte[sprprifix],0
je .nosprprio
mov dword[cursprloc],sprlefttot
call preparesprpr
.nosprprio
; clear registers
xor eax,eax
xor ecx,ecx
; process backgrounds
; do background 2
mov byte[curbgnum],02h
mov ebp,01h
call procbackgrnd
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call procbackgrnd
; do background 4
mov byte[curbgnum],08h
mov ebp,03h
call procbackgrnd
; do background 3
mov byte[curbgnum],04h
mov ebp,02h
call procbackgrnd
cmp byte[bgmode],1
ja near priority2
test byte[scaddset],02h
jz near .nosubsc
; draw backgrounds
mov byte[curbgpr],0h
; do background 4
mov byte[curbgnum],08h
mov ebp,03h
call drawbackgrndsub
; do background 3
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndsub
mov ebp,0
call procspritessub
mov byte[curbgpr],20h
; do background 4
mov byte[curbgnum],08h
mov ebp,03h
call drawbackgrndsub
; do background 3
cmp byte[bg3high2],1
je .bg3nothigh
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndsub
.bg3nothigh
mov ebp,1
call procspritessub
; do background 2
mov byte[curbgpr],0h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndsub
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndsub
mov ebp,2
call procspritessub
; do background 2
mov byte[curbgpr],20h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndsub
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndsub
mov ebp,3
call procspritessub
cmp byte[bg3high2],1
jne .bg3high
; do background 3
mov byte[curbgpr],20h
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndsub
.bg3high
.nosubsc
mov al,[winenabm]
mov [cwinenabm],al
mov byte[curbgpr],0h
; do background 4
mov byte[curbgnum],08h
mov ebp,03h
call drawbackgrndmain
; do background 3
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndmain
mov ebp,0
call procspritesmain
mov byte[curbgpr],20h
; do background 4
mov byte[curbgnum],08h
mov ebp,03h
call drawbackgrndmain
; do background 3
cmp byte[bg3high2],1
je .bg3nothighb
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndmain
.bg3nothighb
mov ebp,1
call procspritesmain
; do background 2
mov byte[curbgpr],0h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndmain
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndmain
mov ebp,2
call procspritesmain
; do background 2
mov byte[curbgpr],20h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndmain
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndmain
mov ebp,3
call procspritesmain
cmp byte[bg3high2],1
jne .bg3highb
; do background 3
mov byte[curbgpr],20h
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndmain
.bg3highb
pop ebp
pop edx
pop ebx
pop edi
pop esi
xor eax,eax
xor ecx,ecx
NEWSYM nodrawline
ret
NEWSYM priority2
test byte[scaddset],02h
jz near .nosubsc
; do background 2
mov byte[curbgpr],0h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndsub
mov ebp,0
call procspritessub
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndsub
mov ebp,1
call procspritessub
; do background 2
mov byte[curbgpr],20h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndsub
mov ebp,2
call procspritessub
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndsub
mov ebp,3
call procspritessub
.nosubsc
mov al,[winenabm]
mov [cwinenabm],al
; do background 2
mov byte[curbgpr],0h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndmain
mov ebp,0
call procspritesmain
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndmain
mov ebp,1
call procspritesmain
; do background 2
mov byte[curbgpr],20h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndmain
mov ebp,2
call procspritesmain
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndmain
mov ebp,3
call procspritesmain
pop ebp
pop edx
pop ebx
pop edi
pop esi
xor eax,eax
xor ecx,ecx
ret
ALIGN32
SECTION .bss
NEWSYM tempbuffer, resd 33
NEWSYM currentobjptr, resd 1
NEWSYM curmosaicsz, resd 1
NEWSYM extbgdone, resb 1
SECTION .text
NEWSYM processmode7
mov al,[winenabm]
mov [cwinenabm],al
push esi
push edi
push ebx
push edx
push ebp
; get current sprite table
xor ebx,ebx
mov bl,[curypos]
shl ebx,9
add ebx,[spritetablea]
mov [currentobjptr],ebx
; setup priorities
cmp byte[sprprifix],0
je .nosprprio
mov dword[cursprloc],sprlefttot
call preparesprpr
.nosprprio
; calculate current video offset
xor ebx,ebx
mov bx,[curypos]
mov esi,ebx
shl esi,8
shl ebx,5
add esi,ebx
add esi,16
add esi,[vidbuffer]
mov [curvidoffset],esi
; clear video buffer
mov edi,esi
mov ecx,64
xor eax,eax
rep stosd
; do sprite windowing
call makewindowsp
; clear registers
xor eax,eax
xor ecx,ecx
mov byte[extbgdone],0
test byte[interlval],40h
jz near .noback0
test byte[scrndis],02h
jnz near .noback0
; do background 1, extbg pr 0
test word[scrnon],0202h
jz near .noback0
mov byte[winon],0
test word[winenabm],0001h
jz near .nobackwin0
test word[winenabm],0100h
jnz near .nobackwin0
mov ebp,0
mov al,[winbg1en]
call makewindow
cmp byte[winon],0FFh
je near .noback0
.nobackwin0
mov byte[extbgdone],1
procmode7extbg [bg1scroly],[bg1scrolx],1
.noback0
; do objects
test byte[scrndis],10h
jnz near .nosprites1
test word[scrnon],1010h
jz near .nosprites1
cmp byte[winonsp],0FFh
je .nosprites1
xor ebx,ebx
mov bl,[curypos]
mov cl,[sprleftpr+ebx]
cmp byte[sprprifix],0
je .nosprprio2
mov cl,[sprlefttot+ebx]
.nosprprio2
cmp cl,0
je .nosprites1
mov ebp,0
call drawsprites
.nosprites1
; display mode7
test byte[interlval],40h
jnz near .noback1
test byte[scrndis],01h
jnz near .noback1
; do background 1
test word[scrnon],0101h
jz near .noback1
mov byte[winon],0
test word[winenabm],0001h
jz near .nobackwin1
test word[winenabm],0100h
jnz near .nobackwin1
mov ebp,0
mov al,[winbg1en]
call makewindow
cmp byte[winon],0FFh
je near .noback1
.nobackwin1
procmode7 [bg1scroly],[bg1scrolx],1
.noback1
; do objects
test byte[scrndis],10h
jnz near .nosprites2
test word[scrnon],1010h
jz near .nosprites2
cmp byte[winonsp],0FFh
je .nosprites2
xor ebx,ebx
mov bl,[curypos]
mov cl,[sprleftpr1+ebx]
cmp byte[sprprifix],0
je .nosprprio3
mov cl,[sprlefttot+ebx]
.nosprprio3
cmp cl,0
je .nosprites2
mov ebp,1
call drawsprites
.nosprites2
test byte[interlval],40h
jz near .noback0b
cmp byte[extbgdone],0
jne near .noback0b
test byte[scrndis],02h
jnz near .noback0b
; do background 1, extbg pr 0
test word[scrnon],0101h
jz near .noback0b
mov byte[winon],0
test word[winenabm],0001h
jz near .nobackwin0b
test word[winenabm],0100h
jnz near .nobackwin0b
mov ebp,0
mov al,[winbg1en]
call makewindow
cmp byte[winon],0FFh
je near .noback0b
.nobackwin0b
mov byte[extbgdone],1
procmode7extbg [bg1scroly],[bg1scrolx],1
.noback0b
test byte[interlval],40h
jz near .noback2
cmp byte[extbgdone],1
jne near .noback2
mov byte[winon],0
test word[winenabm],0001h
jz near .nobackwin2
test word[winenabm],0100h
jnz near .nobackwin2
mov ebp,0
mov al,[winbg1en]
call makewindow
cmp byte[winon],0FFh
je near .noback2
.nobackwin2
procmode7extbg2 [bg1scroly],[bg1scrolx],1
.noback2
; do objects
test byte[scrndis],10h
jnz near .nosprites3
test word[scrnon],1010h
jz near .nosprites3
cmp byte[winonsp],0FFh
je .nosprites3
xor ebx,ebx
mov bl,[curypos]
mov cl,[sprleftpr2+ebx]
cmp byte[sprprifix],0
je .nosprprio4
mov cl,[sprlefttot+ebx]
.nosprprio4
cmp cl,0
je .nosprites3
mov ebp,2
call drawsprites
.nosprites3
; do objects
test byte[scrndis],10h
jnz near .nosprites4
test word[scrnon],1010h
jz near .nosprites4
cmp byte[winonsp],0FFh
je .nosprites4
xor ebx,ebx
mov bl,[curypos]
mov cl,[sprleftpr3+ebx]
cmp byte[sprprifix],0
je .nosprprio5
mov cl,[sprlefttot+ebx]
.nosprprio5
cmp cl,0
je .nosprites4
mov ebp,3
call drawsprites
.nosprites4
pop ebp
pop edx
pop ebx
pop edi
pop esi
ret
;*******************************************************
; Processes & Draws 4-bit sprites
;*******************************************************
NEWSYM drawsprites
cmp byte[sprprifix],1
je near drawspritesprio
.returnfrompr
test byte[cwinenabm],10h
jz .drawnowin
cmp byte[winonsp],0
jne near drawspriteswinon
.drawnowin
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
mov eax,[esi]
test al,0Fh
jz .skipa
add al,ch
mov [edi+ebx-8],al
.skipa
test ah,0Fh
jz .skipb
add ah,ch
mov [edi+ebx-7],ah
.skipb
shr eax,16
test al,0Fh
jz .skipc
add al,ch
mov [edi+ebx-6],al
.skipc
test ah,0Fh
jz .skipd
add ah,ch
mov [edi+ebx-5],ah
.skipd
mov eax,[esi+4]
test al,0Fh
jz .skipe
add al,ch
mov [edi+ebx-4],al
.skipe
test ah,0Fh
jz .skipf
add ah,ch
mov [edi+ebx-3],ah
.skipf
shr eax,16
test al,0Fh
jz .skipg
add al,ch
mov [edi+ebx-2],al
.skipg
test ah,0Fh
jz .skiph
add ah,ch
mov [edi+ebx-1],ah
.skiph
add edx,8
mov esi,edx
dec cl
jnz .loopobj
mov [currentobjptr],esi
ret
.drawspriteflipx
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
mov eax,[esi]
test al,0Fh
jz .skipa2
add al,ch
mov [edi+ebx-1],al
.skipa2
test ah,0Fh
jz .skipb2
add ah,ch
mov [edi+ebx-2],ah
.skipb2
shr eax,16
test al,0Fh
jz .skipc2
add al,ch
mov [edi+ebx-3],al
.skipc2
test ah,0Fh
jz .skipd2
add ah,ch
mov [edi+ebx-4],ah
.skipd2
mov eax,[esi+4]
test al,0Fh
jz .skipe2
add al,ch
mov [edi+ebx-5],al
.skipe2
test ah,0Fh
jz .skipf2
add ah,ch
mov [edi+ebx-6],ah
.skipf2
shr eax,16
test al,0Fh
jz .skipg2
add al,ch
mov [edi+ebx-7],al
.skipg2
test ah,0Fh
jz .skiph2
add ah,ch
mov [edi+ebx-8],ah
.skiph2
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
NEWSYM drawspriteswinon
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
mov eax,[esi]
test al,0Fh
jz .skipa
cmp byte[winspdata+ebx-8+16],0
jne .skipa
add al,ch
mov [edi+ebx-8],al
.skipa
test ah,0Fh
jz .skipb
cmp byte[winspdata+ebx-7+16],0
jne .skipb
add ah,ch
mov [edi+ebx-7],ah
.skipb
shr eax,16
test al,0Fh
jz .skipc
cmp byte[winspdata+ebx-6+16],0
jne .skipc
add al,ch
mov [edi+ebx-6],al
.skipc
test ah,0Fh
jz .skipd
cmp byte[winspdata+ebx-5+16],0
jne .skipd
add ah,ch
mov [edi+ebx-5],ah
.skipd
mov eax,[esi+4]
test al,0Fh
jz .skipe
cmp byte[winspdata+ebx-4+16],0
jne .skipe
add al,ch
mov [edi+ebx-4],al
.skipe
test ah,0Fh
jz .skipf
cmp byte[winspdata+ebx-3+16],0
jne .skipf
add ah,ch
mov [edi+ebx-3],ah
.skipf
shr eax,16
test al,0Fh
jz .skipg
cmp byte[winspdata+ebx-2+16],0
jne .skipg
add al,ch
mov [edi+ebx-2],al
.skipg
test ah,0Fh
jz .skiph
cmp byte[winspdata+ebx-1+16],0
jne .skiph
add ah,ch
mov [edi+ebx-1],ah
.skiph
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.drawspriteflipx
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
mov eax,[esi]
test al,0Fh
jz .skipa2
cmp byte[winspdata+ebx-1+16],0
jne .skipa2
add al,ch
mov [edi+ebx-1],al
.skipa2
test ah,0Fh
jz .skipb2
cmp byte[winspdata+ebx-2+16],0
jne .skipb2
add ah,ch
mov [edi+ebx-2],ah
.skipb2
shr eax,16
test al,0Fh
jz .skipc2
cmp byte[winspdata+ebx-3+16],0
jne .skipc2
add al,ch
mov [edi+ebx-3],al
.skipc2
test ah,0Fh
jz .skipd2
cmp byte[winspdata+ebx-4+16],0
jne .skipd2
add ah,ch
mov [edi+ebx-4],ah
.skipd2
mov eax,[esi+4]
test al,0Fh
jz .skipe2
cmp byte[winspdata+ebx-5+16],0
jne .skipe2
add al,ch
mov [edi+ebx-5],al
.skipe2
test ah,0Fh
jz .skipf2
cmp byte[winspdata+ebx-6+16],0
jne .skipf2
add ah,ch
mov [edi+ebx-6],ah
.skipf2
shr eax,16
test al,0Fh
jz .skipg2
cmp byte[winspdata+ebx-7+16],0
jne .skipg2
add al,ch
mov [edi+ebx-7],al
.skipg2
test ah,0Fh
jz .skiph2
cmp byte[winspdata+ebx-8+16],0
jne .skiph2
add ah,ch
mov [edi+ebx-8],ah
.skiph2
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
NEWSYM drawspritesprio
cmp byte[sprclprio+ebp],0
je near .endobj
test byte[cwinenabm],10h
jz .drawnowin
cmp byte[winonsp],0
jne near drawspritespriowinon
.drawnowin
cmp dword[sprsingle],1
je near .drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
push edx
mov ch,[esi+6]
mov dl,[esi+7]
and edx,03h
cmp edx,ebp
jne near .notprio
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawa sprdrawpra
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
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
ret
.drawspriteflipx
mov bx,[esi]
push edx
mov ch,[esi+6]
mov dl,[esi+7]
and edx,03h
cmp edx,ebp
jne near .notpriof
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawaf sprdrawpra
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
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
ret
.clearcsprmem
xor eax,eax
mov ecx,64
mov edi,sprpriodata+16
rep stosd
ret
.drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,ecx
and edx,0FFh
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]
sprdrawa sprdrawprb
sub edx,8
mov esi,edx
dec cl
jnz near .loopobj2
ret
.drawspriteflipx2
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawaf sprdrawprb
sub edx,8
mov esi,edx
dec cl
jnz near .loopobj2
ret
NEWSYM drawspritespriowinon
cmp dword[sprsingle],1
je near .drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
push edx
mov ch,[esi+6]
mov dl,[esi+7]
and edx,03h
cmp edx,ebp
jne near .notprio
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawa sprdrawpraw
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
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
ret
.drawspriteflipx
mov bx,[esi]
push edx
mov ch,[esi+6]
mov dl,[esi+7]
and edx,03h
cmp edx,ebp
jne near .notpriof
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawaf sprdrawpraw
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
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
ret
.clearcsprmem
xor eax,eax
mov ecx,64
mov edi,sprpriodata+16
rep stosd
ret
.drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,ecx
and edx,0FFh
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]
sprdrawa sprdrawprbw
sub edx,8
mov esi,edx
dec cl
jnz near .loopobj2
ret
.drawspriteflipx2
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawaf sprdrawprbw
sub edx,8
mov esi,edx
dec cl
jnz near .loopobj2
ret
SECTION .data
NEWSYM prfixobjl, db 0
NEWSYM csprbit, db 1
NEWSYM csprprlft, db 0
SECTION .text
;*******************************************************
; Processes & Draws 8x8 tiles in 2, 4, & 8 bit mode
;*******************************************************
NEWSYM proc8x8
cmp byte[bgmode],5
je near proc16x8
; ax = # of rows down
mov ebx,eax
shr eax,3
and eax,63
and ebx,07h
cmp byte[CacheCheckSkip],1
je .docache
cmp byte[edi+eax],0
jne .nocachereq
.docache
; cmp byte[ccud],0
; jne .nocachereq
mov byte[edi+eax],1
cmp byte[curcolor],2
jne .no4b
; cache 4-bit
call cachetile4b
jmp .nocachereq
.no4b
cmp byte[curcolor],1
je .2b
; cache 8-bit
call cachetile8b
jmp .nocachereq
.2b
; cache 2-bit
call cachetile2b
.nocachereq
test edx,0100h
jz .tilexa
test al,20h
jz .tileya
; bgptrd/bgptrc
mov ecx,[bgptrd]
mov [bgptrx1],ecx
mov ecx,[bgptrc]
mov [bgptrx2],ecx
jmp .skiptile
.tileya
; bgptrb/bgptra
mov ecx,[bgptrb]
mov [bgptrx1],ecx
mov ecx,[bgptr]
mov [bgptrx2],ecx
jmp .skiptile
.tilexa
test al,20h
jz .tileya2
; bgptrc/bgptrd
mov ecx,[bgptrc]
mov [bgptrx1],ecx
mov ecx,[bgptrd]
mov [bgptrx2],ecx
jmp .skiptile
.tileya2
; bgptra/bgptrb
mov ecx,[bgptr]
mov [bgptrx1],ecx
mov ecx,[bgptrb]
mov [bgptrx2],ecx
.skiptile
; set up edi & yadder to point to tile data
shl ebx,3
mov [yadder],ebx
and al,1Fh
mov edi,[vram]
mov ebx,eax
shl ebx,6
mov eax,[bgptrx1]
add edi,ebx
mov [temptile],edi
add edi,eax
; dx = # of columns right
; cx = bgxlim
mov eax,edx
shr edx,3
mov bl,[curypos]
and edx,1Fh
mov [temp],dl
and eax,07h
add dl,dl
add edi,edx
mov esi,eax
mov ebx,[tempcach]
mov edx,[temptile]
mov eax,[bgptrx2]
and eax,0FFFFh
add edx,eax
mov al,[temp]
mov ecx,[yadder]
mov ah,[bshifter]
; fill up tempbuffer with pointer #s that point to cached video mem
; to calculate pointer, get first byte
; esi = pointer to video buffer
; edi = pointer to tile data
; ebx = cached memory
; ecx = y adder
; edx = secondary tile pointer
; al = current x position
ret
NEWSYM proc16x8
; ax = # of rows down
mov ebx,eax
shr eax,3
and ebx,07h
and eax,63
cmp byte[edi+eax],0
jne .nocachereq
; cmp byte[ccud],0
; jne .nocachereq
mov byte[edi+eax],1
cmp byte[curcolor],2
jne .no4b
; cache 4-bit
call cachetile4b16x16
jmp .nocachereq
.no4b
cmp byte[curcolor],1
je .2b
; cache 8-bit
call cachetile8b16x16
jmp .nocachereq
.2b
; cache 2-bit
call cachetile2b16x16
.nocachereq
test edx,0100h
jz .tilexa
test al,20h
jz .tileya
; bgptrd/bgptrc
mov ecx,[bgptrd]
mov [bgptrx1],ecx
mov ecx,[bgptrc]
mov [bgptrx2],ecx
jmp .skiptile
.tileya
; bgptrb/bgptra
mov ecx,[bgptrb]
mov [bgptrx1],ecx
mov ecx,[bgptr]
mov [bgptrx2],ecx
jmp .skiptile
.tilexa
test al,20h
jz .tileya2
; bgptrc/bgptrd
mov ecx,[bgptrc]
mov [bgptrx1],ecx
mov ecx,[bgptrd]
mov [bgptrx2],ecx
jmp .skiptile
.tileya2
; bgptra/bgptrb
mov ecx,[bgptr]
mov [bgptrx1],ecx
mov ecx,[bgptrb]
mov [bgptrx2],ecx
.skiptile
; set up edi & yadder to point to tile data
shl ebx,3
mov [yadder],ebx
and al,1Fh
mov edi,[vram]
mov ebx,eax
shl ebx,6
mov eax,[bgptrx1]
add edi,ebx
mov [temptile],edi
add edi,eax
; dx = # of columns right
; cx = bgxlim
mov eax,edx
shr edx,3
mov bl,[curypos]
and edx,1Fh
mov [temp],dl
and eax,07h
add dl,dl
add edi,edx
mov esi,eax
mov ebx,[tempcach]
mov edx,[temptile]
mov eax,[bgptrx2]
and eax,0FFFFh
add edx,eax
mov al,[temp]
mov ecx,[yadder]
mov ah,[bshifter]
; fill up tempbuffer with pointer #s that point to cached video mem
; to calculate pointer, get first byte
; esi = pointer to video buffer
; edi = pointer to tile data
; ebx = cached memory
; ecx = y adder
; edx = secondary tile pointer
; al = current x position
ret
SECTION .bss
NEWSYM drawn, resb 1
NEWSYM curbgpr, resb 1 ; 00h = low priority, 20h = high priority
SECTION .text
%macro drawpixel8b8x8 3
or %1,%1
jz %2
add %1,dh
mov [esi+%3],%1
%2
%endmacro
%macro drawpixel8b8x8win 3
or %1,%1
jz %2
test byte[ebp+%3],0FFh
jnz %2
add %1,dh
mov [esi+%3],%1
%2
%endmacro
SECTION .bss
NEWSYM winptrref, resd 1
SECTION .text
NEWSYM draw8x8
cmp byte[osm2dis],1
je .osm2dis
cmp byte[bgmode],2
je near draw8x8offset
.osm2dis
cmp byte[bgmode],5
jae near draw16x8
mov [temp],al
mov [bshifter],ah
mov eax,esi
mov [yadder],ecx
mov [tempcach],ebx
mov ebx,56
sub ebx,ecx
mov [yrevadder],ebx
.retfromoffset
; esi = pointer to video buffer
mov esi,[cwinptr]
sub esi,eax
mov [winptrref],esi
mov esi,[curvidoffset]
sub esi,eax ; esi = [vidbuffer] + curypos * 288 + 16 - HOfs
cmp byte[curmosaicsz],1
je .nomosaic
mov esi,xtravbuf+16
mov ecx,64
.clearnext
mov dword[esi],0
add esi,4
dec ecx
jnz .clearnext
mov esi,xtravbuf+16
sub esi,eax
.nomosaic
mov [temptile],edx
mov dword[bgofwptr],vcache2ba+262144
mov dword[bgsubby],262144
cmp dword[tempcach],vcache2ba+262144
jb .nobit
mov dword[bgofwptr],vcache4ba+131072
mov dword[bgsubby],131072
cmp dword[tempcach],vcache4ba+131072
jb .nobit
mov dword[bgofwptr],vcache8ba+65536
mov dword[bgsubby],65536
.nobit
; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value
; bit 10-12 = palette, 0-9=tile#
cmp byte[curmosaicsz],1
jne .domosaic
cmp byte[winon],0
jne near draw8x8winon
.domosaic
mov ch,33
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1
drawpixel8b8x8 al, .loopd1, 0
drawpixel8b8x8 ah, .loopd2, 1
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3, 2
drawpixel8b8x8 ah, .loopd4, 3
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8 al, .loopd5, 4
drawpixel8b8x8 ah, .loopd6, 5
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7, 6
drawpixel8b8x8 ah, .loopd8, 7
.skiploop2
.hprior
add esi,8
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
.nodraw
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1b
drawpixel8b8x8 al, .loopd1b, 7
drawpixel8b8x8 ah, .loopd2b, 6
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3b, 5
drawpixel8b8x8 ah, .loopd4b, 4
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8 al, .loopd5b, 3
drawpixel8b8x8 ah, .loopd6b, 2
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7b, 1
drawpixel8b8x8 ah, .loopd8b, 0
.skiploop2b
add esi,8
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw2
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
.nodraw2
ret
NEWSYM draw8x8winon
mov ch,33
mov byte[drawn],0
mov ebp,[winptrref]
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1
drawpixel8b8x8win al, .loopd1, 0
drawpixel8b8x8win ah, .loopd2, 1
mov eax,[ebx+2]
drawpixel8b8x8win al, .loopd3, 2
drawpixel8b8x8win ah, .loopd4, 3
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8win al, .loopd5, 4
drawpixel8b8x8win ah, .loopd6, 5
mov eax,[ebx+6]
drawpixel8b8x8win al, .loopd7, 6
drawpixel8b8x8win ah, .loopd8, 7
.skiploop2
.hprior
add esi,8
add ebp,8
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1b
drawpixel8b8x8win al, .loopd1b, 7
drawpixel8b8x8win ah, .loopd2b, 6
mov eax,[ebx+2]
drawpixel8b8x8win al, .loopd3b, 5
drawpixel8b8x8win ah, .loopd4b, 4
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8win al, .loopd5b, 3
drawpixel8b8x8win ah, .loopd6b, 2
mov eax,[ebx+6]
drawpixel8b8x8win al, .loopd7b, 1
drawpixel8b8x8win ah, .loopd8b, 0
.skiploop2b
add esi,8
add ebp,8
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
ret
SECTION .bss
NEWSYM alttile, resb 1
NEWSYM hirestiledat, resb 256
SECTION .text
NEWSYM draw16x8
push eax
xor eax,eax
mov al,[curypos]
mov byte[hirestiledat+eax],1
pop eax
mov [temp],al
mov [bshifter],ah
mov eax,esi
mov [yadder],ecx
mov [tempcach],ebx
mov ebx,56
sub ebx,ecx
mov [yrevadder],ebx
; esi = pointer to video buffer
mov esi,[cwinptr]
sub esi,eax
mov [winptrref],esi
mov esi,[curvidoffset]
sub esi,eax ; esi = [vidbuffer] + curypos * 288 + 16 - HOfs
cmp byte[curmosaicsz],1
je .nomosaic
mov esi,xtravbuf+16
mov ecx,64
.clearnext
mov dword[esi],0
add esi,4
dec ecx
jnz .clearnext
mov esi,xtravbuf+16
sub esi,eax
.nomosaic
mov [temptile],edx
mov dword[bgofwptr],vcache2ba+262144
mov dword[bgsubby],262144
cmp dword[tempcach],vcache2ba+262144
jb .nobit
mov dword[bgofwptr],vcache4ba+131072
mov dword[bgsubby],131072
cmp dword[tempcach],vcache4ba+131072
jb .nobit
mov dword[bgofwptr],vcache8ba+65536
mov dword[bgsubby],65536
.nobit
; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value
; bit 10-12 = palette, 0-9=tile#
cmp byte[curmosaicsz],1
jne .domosaic
cmp byte[winon],0
jne near draw16x8winon
.domosaic
cmp byte[res512switch],0
jne near draw16x8b
mov ch,33
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1
drawpixel8b8x8 al, .loopd1, 0
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3, 1
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8 al, .loopd5, 2
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7, 3
.skiploop2
add ebx,64
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1c
drawpixel8b8x8 al, .loopd1c, 4
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3c, 5
.skiploop1c
mov eax,[ebx+4]
or eax,eax
je .skiploop2c
drawpixel8b8x8 al, .loopd5c, 6
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7c, 7
.skiploop2c
.hprior
add esi,8
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
.nodraw
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
mov eax,[ebx]
or eax,eax
je .skiploop1b
drawpixel8b8x8 ah, .loopd1b, 7
mov eax,[ebx+2]
drawpixel8b8x8 ah, .loopd3b, 6
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8 ah, .loopd5b, 5
mov eax,[ebx+6]
drawpixel8b8x8 ah, .loopd7b, 4
.skiploop2b
add ebx,64
mov eax,[ebx]
or eax,eax
je .skiploop1d
drawpixel8b8x8 ah, .loopd1d, 3
mov eax,[ebx+2]
drawpixel8b8x8 ah, .loopd3d, 2
.skiploop1d
mov eax,[ebx+4]
or eax,eax
je .skiploop2d
drawpixel8b8x8 ah, .loopd5d, 1
mov eax,[ebx+6]
drawpixel8b8x8 ah, .loopd7d, 0
.skiploop2d
add esi,8
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw2
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
cmp byte[winon],0
jne near dowindow
.nodraw2
ret
NEWSYM draw16x8b
mov ch,33
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1
drawpixel8b8x8 ah, .loopd1, 0
mov eax,[ebx+2]
drawpixel8b8x8 ah, .loopd3, 1
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8 ah, .loopd5, 2
mov eax,[ebx+6]
drawpixel8b8x8 ah, .loopd7, 3
.skiploop2
add ebx,64
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1c
drawpixel8b8x8 ah, .loopd1c, 4
mov eax,[ebx+2]
drawpixel8b8x8 ah, .loopd3c, 5
.skiploop1c
mov eax,[ebx+4]
or eax,eax
je .skiploop2c
drawpixel8b8x8 ah, .loopd5c, 6
mov eax,[ebx+6]
drawpixel8b8x8 ah, .loopd7c, 7
.skiploop2c
.hprior
add esi,8
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
.nodraw
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
mov eax,[ebx]
or eax,eax
je .skiploop1b
drawpixel8b8x8 al, .loopd2b, 7
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd4b, 6
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8 al, .loopd5b, 5
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7b, 4
.skiploop2b
add ebx,64
mov eax,[ebx]
or eax,eax
je .skiploop1d
drawpixel8b8x8 al, .loopd1d, 3
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3d, 2
.skiploop1d
mov eax,[ebx+4]
or eax,eax
je .skiploop2d
drawpixel8b8x8 al, .loopd5d, 1
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7d, 0
.skiploop2d
add esi,8
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw2
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
.nodraw2
ret
NEWSYM draw16x8winon
cmp byte[res512switch],0
jne near draw16x8bwinon
mov ch,33
mov ebp,[winptrref]
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1
drawpixel8b8x8win al, .loopd1, 0
mov eax,[ebx+2]
drawpixel8b8x8win al, .loopd3, 1
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8win al, .loopd5, 2
mov eax,[ebx+6]
drawpixel8b8x8win al, .loopd7, 3
.skiploop2
add ebx,64
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1c
drawpixel8b8x8win al, .loopd1c, 4
mov eax,[ebx+2]
drawpixel8b8x8win al, .loopd3c, 5
.skiploop1c
mov eax,[ebx+4]
or eax,eax
je .skiploop2c
drawpixel8b8x8win al, .loopd5c, 6
mov eax,[ebx+6]
drawpixel8b8x8win al, .loopd7c, 7
.skiploop2c
.hprior
add ebp,8
add esi,8
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
mov eax,[ebx]
or eax,eax
je .skiploop1b
drawpixel8b8x8win ah, .loopd1b, 7
mov eax,[ebx+2]
drawpixel8b8x8win ah, .loopd3b, 6
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8win ah, .loopd5b, 5
mov eax,[ebx+6]
drawpixel8b8x8win ah, .loopd7b, 4
.skiploop2b
add ebx,64
mov eax,[ebx]
or eax,eax
je .skiploop1d
drawpixel8b8x8win ah, .loopd1d, 3
mov eax,[ebx+2]
drawpixel8b8x8win ah, .loopd3d, 2
.skiploop1d
mov eax,[ebx+4]
or eax,eax
je .skiploop2d
drawpixel8b8x8win ah, .loopd5d, 1
mov eax,[ebx+6]
drawpixel8b8x8win ah, .loopd7d, 0
.skiploop2d
add ebp,8
add esi,8
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
ret
NEWSYM draw16x8bwinon
mov ch,33
mov ebp,[winptrref]
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1
drawpixel8b8x8win ah, .loopd1, 0
mov eax,[ebx+2]
drawpixel8b8x8win ah, .loopd3, 1
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8win ah, .loopd5, 2
mov eax,[ebx+6]
drawpixel8b8x8win ah, .loopd7, 3
.skiploop2
add ebx,64
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1c
drawpixel8b8x8win ah, .loopd1c, 4
mov eax,[ebx+2]
drawpixel8b8x8win ah, .loopd3c, 5
.skiploop1c
mov eax,[ebx+4]
or eax,eax
je .skiploop2c
drawpixel8b8x8win ah, .loopd5c, 6
mov eax,[ebx+6]
drawpixel8b8x8win ah, .loopd7c, 7
.skiploop2c
.hprior
add ebp,8
add esi,8
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
mov eax,[ebx]
or eax,eax
je .skiploop1b
drawpixel8b8x8win al, .loopd2b, 7
mov eax,[ebx+2]
drawpixel8b8x8win al, .loopd4b, 6
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8win al, .loopd5b, 5
mov eax,[ebx+6]
drawpixel8b8x8win al, .loopd7b, 4
.skiploop2b
add ebx,64
mov eax,[ebx]
or eax,eax
je .skiploop1d
drawpixel8b8x8win al, .loopd1d, 3
mov eax,[ebx+2]
drawpixel8b8x8win al, .loopd3d, 2
.skiploop1d
mov eax,[ebx+4]
or eax,eax
je .skiploop2d
drawpixel8b8x8win al, .loopd5d, 1
mov eax,[ebx+6]
drawpixel8b8x8win al, .loopd7d, 0
.skiploop2d
add ebp,8
add esi,8
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
ret
SECTION .data
NEWSYM extraleft, db 0,0,0,1,0,1,2,2,0,2,3,1,2,4,2,1
SECTION .text
NEWSYM domosaic
mov esi,xtravbuf+16
mov edi,[curvidoffset]
xor ecx,ecx
mov cl,dh
mov dl,dh
sub dl,[extraleft+ecx]
mov ecx,256
mov al,[esi]
cmp byte[winon],0
jne near domosaicwin
test al,0FFh
jz .zeroloop
.loopm
mov [edi],al
inc esi
inc edi
dec ecx
jz .doneloop
dec dl
jnz .loopm
mov al,[esi]
mov dl,dh
test al,0FFh
jnz .loopm
.zeroloop
inc esi
inc edi
dec ecx
jz .doneloop
dec dl
jnz .zeroloop
mov al,[esi]
mov dl,dh
test al,0FFh
jnz .loopm
jmp .zeroloop
.doneloop
ret
NEWSYM domosaicwin
mov ebp,[winptrref]
test al,0FFh
jz .zeroloop
.loopm
cmp byte[ebp],0
jne .nozero2
mov [edi],al
.nozero2
inc esi
inc edi
inc ebp
dec ecx
jz .doneloop
dec dl
jnz .loopm
mov al,[esi]
mov dl,dh
test al,0FFh
jnz .loopm
.zeroloop
inc esi
inc edi
inc ebp
dec ecx
jz .doneloop
dec dl
jnz .zeroloop
mov al,[esi]
mov dl,dh
test al,0FFh
jnz .loopm
jmp .zeroloop
.doneloop
ret
NEWSYM dowindow
mov ebx,windowdata
mov esi,xtravbuf+16
mov edi,[curvidoffset]
xor edx,edx
xor ch,ch
.getnext
mov cl,[ebx]
cmp dl,cl
je .procnext
.dorest
sub cl,dl
cmp ch,0
ja .nodraw
.loopa
mov eax,[esi+edx]
test al,0FFh
jz .nocopy
mov [edi+edx],al
.nocopy
inc dl
dec cl
jz .procnext
test ah,0FFh
jz .nocopyb
mov [edi+edx],ah
.nocopyb
inc dl
dec cl
jz .procnext
shr eax,16
test al,0FFh
jz .nocopyc
mov [edi+edx],al
.nocopyc
inc dl
dec cl
jz .procnext
test ah,0FFh
jz .nocopyd
mov [edi+edx],ah
.nocopyd
inc dl
dec cl
jnz .loopa
.procnext
add ch,[ebx+1]
add ebx,2
test byte[numwin],0FFh
jz .finishwin
dec byte[numwin]
jnz .getnext
xor cl,cl
jmp .dorest
.nodraw
add dl,cl
jmp .procnext
.finishwin
xor eax,eax
ret
ALIGN32
SECTION .bss
NEWSYM yadder, resd 1
NEWSYM yrevadder, resd 1
NEWSYM tempcach, resd 1 ; points to cached memory
NEWSYM temptile, resd 1 ; points to the secondary video pointer
NEWSYM bgptr, resd 1
NEWSYM bgptrb, resd 1
NEWSYM bgptrc, resd 1
NEWSYM bgptrd, resd 1
NEWSYM bgptrx1, resd 1
NEWSYM bgptrx2, resd 1
NEWSYM curvidoffset, resd 1
NEWSYM winon, resd 1
NEWSYM bgofwptr, resd 1
NEWSYM bgsubby, resd 1
SECTION .text
NEWSYM draw8x8offset
mov [temp],al
mov [bshifter],ah
mov eax,esi
mov [yadder],ecx
mov [tempcach],ebx
mov ebx,56
sub ebx,ecx
mov [yrevadder],ebx
initoffsetmode
; esi = pointer to video buffer
mov esi,[cwinptr]
sub esi,eax
mov [winptrref],esi
mov esi,[curvidoffset]
sub esi,eax ; esi = [vidbuffer] + curypos * 288 + 16 - HOfs
cmp byte[curmosaicsz],1
je .nomosaic
mov esi,xtravbuf+16
mov ecx,64
.clearnext
mov dword[esi],0
add esi,4
dec ecx
jnz .clearnext
mov esi,xtravbuf+16
sub esi,eax
.nomosaic
mov [temptile],edx
mov dword[bgofwptr],vcache2ba+262144
mov dword[bgsubby],262144
cmp dword[tempcach],vcache2ba+262144
jb .nobit
mov dword[bgofwptr],vcache4ba+131072
mov dword[bgsubby],131072
cmp dword[tempcach],vcache4ba+131072
jb .nobit
mov dword[bgofwptr],vcache8ba+65536
mov dword[bgsubby],65536
.nobit
; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value
; bit 10-12 = palette, 0-9=tile#
cmp byte[curmosaicsz],1
jne .domosaic
cmp byte[winon],0
jne near draw8x8winon
.domosaic
mov byte[offsettilel],33
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
; add dword[offsetptrb],2
; add dword[offsetcedi],2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
offsetmcachechk
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1
drawpixel8b8x8 al, .loopd1, 0
drawpixel8b8x8 ah, .loopd2, 1
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3, 2
drawpixel8b8x8 ah, .loopd4, 3
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8 al, .loopd5, 4
drawpixel8b8x8 ah, .loopd6, 5
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7, 6
drawpixel8b8x8 ah, .loopd8, 7
.skiploop2
.hprior
procoffsetmode
add esi,8
dec byte[offsettilel]
jnz near .loopa
cmp byte[drawn],0
je .nodraw
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
.nodraw
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1b
drawpixel8b8x8 al, .loopd1b, 7
drawpixel8b8x8 ah, .loopd2b, 6
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3b, 5
drawpixel8b8x8 ah, .loopd4b, 4
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8 al, .loopd5b, 3
drawpixel8b8x8 ah, .loopd6b, 2
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7b, 1
drawpixel8b8x8 ah, .loopd8b, 0
.skiploop2b
procoffsetmode
add esi,8
dec byte[offsettilel]
jnz near .loopa
xor eax,eax
cmp byte[drawn],0
je .nodraw2
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
.nodraw2
ret
NEWSYM draw8x8winonoffset
mov ch,33
mov byte[drawn],0
mov ebp,[winptrref]
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
offsetmcachechk
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1
drawpixel8b8x8win al, .loopd1, 0
drawpixel8b8x8win ah, .loopd2, 1
mov eax,[ebx+2]
drawpixel8b8x8win al, .loopd3, 2
drawpixel8b8x8win ah, .loopd4, 3
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8win al, .loopd5, 4
drawpixel8b8x8win ah, .loopd6, 5
mov eax,[ebx+6]
drawpixel8b8x8win al, .loopd7, 6
drawpixel8b8x8win ah, .loopd8, 7
.skiploop2
.hprior
procoffsetmode
add esi,8
add ebp,8
dec ch
jnz near .loopa
xor eax,eax
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1b
drawpixel8b8x8win al, .loopd1b, 7
drawpixel8b8x8win ah, .loopd2b, 6
mov eax,[ebx+2]
drawpixel8b8x8win al, .loopd3b, 5
drawpixel8b8x8win ah, .loopd4b, 4
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8win al, .loopd5b, 3
drawpixel8b8x8win ah, .loopd6b, 2
mov eax,[ebx+6]
drawpixel8b8x8win al, .loopd7b, 1
drawpixel8b8x8win ah, .loopd8b, 0
.skiploop2b
procoffsetmode
add esi,8
add ebp,8
dec ch
jnz near .loopa
xor eax,eax
ret
ALIGN32
SECTION .bss
NEWSYM offsetmodeptr, resd 1
NEWSYM offsetptra, resd 1
NEWSYM offsetptrb, resd 1
NEWSYM prevtempcache, resd 1
NEWSYM prevoffsetdat, resd 1
NEWSYM offsetenab, resd 1
NEWSYM offsettilel, resd 1
NEWSYM offsetrevval, resd 1
NEWSYM posyscroll, resd 1
NEWSYM offsetmcol, resd 1
NEWSYM offsetmshl, resd 1
NEWSYM offsetmptr, resd 1
NEWSYM offsetmtst, resd 1
NEWSYM offsetmclr, resd 1
NEWSYM offsetcedi, resd 1
SECTION .text
;*******************************************************
; Processes & Draws 16x16 tiles in 2, 4, & 8 bit mode
;*******************************************************
NEWSYM proc16x16
; ax = # of rows down
xor ebx,ebx
mov ebx,eax
and ebx,07h
mov byte[a16x16yinc],0
test eax,08h
jz .noincb
mov byte[a16x16yinc],1
.noincb
shr eax,4
and eax,63
cmp byte[edi+eax],0
jne .nocachereq
mov byte[edi+eax],1
cmp byte[curcolor],2
jne .no4b
; cache 4-bit
call cachetile4b16x16
jmp .nocachereq
.no4b
cmp byte[curcolor],1
je .2b
; cache 8-bit
call cachetile8b16x16
jmp .nocachereq
.2b
; cache 2-bit
call cachetile2b16x16
.nocachereq
test edx,0200h
jz .tilexa
test eax,20h
jz .tileya
; bgptrd/bgptrc
mov ecx,[bgptrd]
mov [bgptrx1],ecx
mov ecx,[bgptrc]
mov [bgptrx2],ecx
jmp .skiptile
.tileya
; bgptrb/bgptra
mov ecx,[bgptrb]
mov [bgptrx1],ecx
mov ecx,[bgptr]
mov [bgptrx2],ecx
jmp .skiptile
.tilexa
test ax,20h
jz .tileya2
; bgptrc/bgptrd
mov ecx,[bgptrc]
mov [bgptrx1],ecx
mov ecx,[bgptrd]
mov [bgptrx2],ecx
jmp .skiptile
.tileya2
; bgptra/bgptrb
mov ecx,[bgptr]
mov [bgptrx1],ecx
mov ecx,[bgptrb]
mov [bgptrx2],ecx
.skiptile
and eax,1Fh
shl ebx,3
mov [yadder],ebx
; set up edi to point to tile data
mov edi,[vram]
mov ebx,eax
shl ebx,6
mov ax,[bgptrx1]
add edi,ebx
mov [temptile],edi
add edi,eax
; dx = # of columns right
; cx = bgxlim
mov eax,edx
mov byte[a16x16xinc],0
test edx,08h
jz .noincd
mov byte[a16x16xinc],1
.noincd
shr edx,4
and edx,1Fh
mov [temp],dl
and eax,07h
shl dl,1
xor ebx,ebx
add edi,edx
mov esi,eax
mov ebx,[tempcach]
xor eax,eax
mov edx,[temptile]
mov ax,[bgptrx2]
add edx,eax
mov ecx,[yadder]
mov eax,[temp]
; fill up tempbuffer with pointer #s that point to cached video mem
; to calculate pointer, get first byte
; esi = pointer to video buffer
; edi = pointer to tile data
; ebx = cached memory
; ecx = y adder
; edx = secondary tile pointer
; al = current x position
ret
NEWSYM draw16x16
mov byte[drawn],0
mov [temp],eax
mov eax,esi
mov [yadder],ecx
mov [tempcach],ebx
mov ebx,56
sub ebx,ecx
mov [yrevadder],ebx
xor ebx,ebx
mov bl,[curypos]
mov [temptile],edx
mov dword[bgofwptr],vcache2ba+262144
mov dword[bgsubby],262144
cmp dword[tempcach],vcache2ba+262144
jb .nobit
mov dword[bgofwptr],vcache4ba+131072
mov dword[bgsubby],131072
cmp dword[tempcach],vcache4ba+131072
jb .nobit
mov dword[bgofwptr],vcache8ba+65536
mov dword[bgsubby],65536
.nobit
; set up y adders
test byte[a16x16yinc],01h
jz .noincrc
mov word[.yadd],16
mov word[.yflipadd],0
jmp .yesincrc
.noincrc
mov word[.yadd],0
mov word[.yflipadd],16
.yesincrc
; esi = pointer to video buffer
mov esi,[cwinptr]
sub esi,eax
mov [winptrref],esi
mov esi,[curvidoffset]
sub esi,eax ; esi = [vidbuffer] + curypos * 288 + 16 - HOfs
cmp byte[curmosaicsz],1
je .nomosaic
mov esi,xtravbuf+16
mov ecx,64
.clearnext
mov dword[esi],0
add esi,4
dec ecx
jnz .clearnext
mov esi,xtravbuf+16
sub esi,eax
.nomosaic
cmp byte[curmosaicsz],1
jne .domosaic
cmp byte[winon],0
jne near draw16x16winon
.domosaic
mov ch,33
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
xor byte[a16x16xinc],1
test dh,40h
jnz .noxflip
test byte[a16x16xinc],01h
jnz .noincr2
inc ax
add edi,2
.noincr2
jmp .yesxflip
.noxflip
test byte[a16x16xinc],01h
jnz .noincr
add edi,2
jmp .yesincr
.noincr
inc ax
.yesincr
.yesxflip
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
test dh,80h
jnz .noyflip
add ax,word[.yadd]
jmp .yesyflip
.noyflip
add ax,word[.yflipadd]
.yesyflip
and ax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl ax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
cmp eax,0
je .skiploop1
drawpixel8b8x8 al, .loopd1, 0
drawpixel8b8x8 ah, .loopd2, 1
shr eax,16
drawpixel8b8x8 al, .loopd3, 2
drawpixel8b8x8 ah, .loopd4, 3
.skiploop1
mov eax,[ebx+4]
cmp eax,0
je .skiploop2
drawpixel8b8x8 al, .loopd5, 4
drawpixel8b8x8 ah, .loopd6, 5
shr eax,16
drawpixel8b8x8 al, .loopd7, 6
drawpixel8b8x8 ah, .loopd8, 7
.skiploop2
.hprior
add esi,8
test byte[a16x16xinc],01h
jnz .noincrb2
inc dl
.noincrb2
cmp dl,20h
jne .loopc2
xor dl,dl
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
cmp eax,0
je .skiploop1b
drawpixel8b8x8 al, .loopd1b, 7
drawpixel8b8x8 ah, .loopd2b, 6
shr eax,16
drawpixel8b8x8 al, .loopd3b, 5
drawpixel8b8x8 ah, .loopd4b, 4
.skiploop1b
mov eax,[ebx+4]
cmp eax,0
je .skiploop2b
drawpixel8b8x8 al, .loopd5b, 3
drawpixel8b8x8 ah, .loopd6b, 2
shr eax,16
drawpixel8b8x8 al, .loopd7b, 1
drawpixel8b8x8 ah, .loopd8b, 0
.skiploop2b
add esi,8
test byte[a16x16xinc],01h
jnz .noincrb
inc dl
.noincrb
cmp dl,20h
jne .loopc
xor dl,dl
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
ret
SECTION .bss
.yadd resw 1
.yflipadd resw 1
SECTION .text
NEWSYM draw16x16winon
.domosaic
mov ch,33
mov ebp,[winptrref]
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
xor byte[a16x16xinc],1
test dh,40h
jnz .noxflip
test byte[a16x16xinc],01h
jnz .noincr2
inc ax
add edi,2
.noincr2
jmp .yesxflip
.noxflip
test byte[a16x16xinc],01h
jnz .noincr
add edi,2
jmp .yesincr
.noincr
inc ax
.yesincr
.yesxflip
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
test dh,80h
jnz .noyflip
add ax,word[draw16x16.yadd]
jmp .yesyflip
.noyflip
add ax,word[draw16x16.yflipadd]
.yesyflip
and ax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl ax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
cmp eax,0
je .skiploop1
drawpixel8b8x8win al, .loopd1, 0
drawpixel8b8x8win ah, .loopd2, 1
shr eax,16
drawpixel8b8x8win al, .loopd3, 2
drawpixel8b8x8win ah, .loopd4, 3
.skiploop1
mov eax,[ebx+4]
cmp eax,0
je .skiploop2
drawpixel8b8x8win al, .loopd5, 4
drawpixel8b8x8win ah, .loopd6, 5
shr eax,16
drawpixel8b8x8win al, .loopd7, 6
drawpixel8b8x8win ah, .loopd8, 7
.skiploop2
.hprior
add ebp,8
add esi,8
test byte[a16x16xinc],01h
jnz .noincrb2
inc dl
.noincrb2
cmp dl,20h
jne .loopc2
xor dl,dl
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
cmp eax,0
je .skiploop1b
drawpixel8b8x8win al, .loopd1b, 7
drawpixel8b8x8win ah, .loopd2b, 6
shr eax,16
drawpixel8b8x8win al, .loopd3b, 5
drawpixel8b8x8win ah, .loopd4b, 4
.skiploop1b
mov eax,[ebx+4]
cmp eax,0
je .skiploop2b
drawpixel8b8x8win al, .loopd5b, 3
drawpixel8b8x8win ah, .loopd6b, 2
shr eax,16
drawpixel8b8x8win al, .loopd7b, 1
drawpixel8b8x8win ah, .loopd8b, 0
.skiploop2b
add ebp,8
add esi,8
test byte[a16x16xinc],01h
jnz .noincrb
inc dl
.noincrb
cmp dl,20h
jne .loopc
xor dl,dl
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
ret
SECTION .bss
NEWSYM temp, resb 1
NEWSYM bshifter, resb 1
NEWSYM a16x16xinc, resb 1
NEWSYM a16x16yinc, resb 1
SECTION .text