;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 disableeffects,winl1,winl2,winbgdata,winr1,winr2,winspdata EXTSYM winlogica EXTSYM winenabm,winobjen EXTSYM winlogicb EXTSYM scrndis,scrnon EXTSYM bgmode,bgtilesz,winbg1en,winenabs EXTSYM bg1objptr,bg1ptr,bg1ptrb,bg1ptrc,bg1ptrd,bg1scrolx,bg1scroly EXTSYM cachebg1,curbgofs1,curcolbg1,vcache2b,vcache4b,vcache8b EXTSYM vcache2ba,vcache4ba,vcache8ba EXTSYM vidbuffer EXTSYM bg3highst,cbitmode,colormodedef,colormodeofs,drawline16b EXTSYM forceblnk,newengine8b,preparesprpr,scaddset,spritetablea EXTSYM sprleftpr,vidbright,ForceNewGfxOff EXTSYM curypos,drawmode7,mode7set,mosaicon,mosaicsz,sprleftpr1,sprleftpr2 EXTSYM sprleftpr3,sprlefttot,sprprifix,drawmode7extbg,interlval,drawmode7extbg2 EXTSYM sprclprio,sprpriodata,sprsingle EXTSYM cachetile2b,cachetile4b,cachetile8b,vram,CacheCheckSkip EXTSYM cachetile2b16x16,cachetile4b16x16,cachetile8b16x16 EXTSYM osm2dis,xtravbuf EXTSYM bg3ptr,bg3scrolx,bg3scroly,cachesingle,colormoded2 EXTSYM tempoffset,vidmemch2,vidmemch4,vidmemch8 EXTSYM ofsmcptr,ofsmady,ofsmadx,yposng,yposngom,flipyposng,flipyposngom EXTSYM ofsmtptr,ofsmmptr,ofsmcyps,bgtxadd,bg1ptrx,bg1ptry NEWSYM MakeVidAsmStart %include "video/vidmacro.mac" ;drawspritesprio NEWSYM bgcoloradder, db 0 NEWSYM res512switch, db 0 ; 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 NEWSYM MosaicYAdder, dw 0,0,0,1,0,2,1,0,0,4,2,2,3,1,0,7 NEWSYM pwinbgenab, db 0 NEWSYM pwinbgtype, dd 0 NEWSYM winonbtype, db 0 NEWSYM dualwinbg, db 0 NEWSYM pwinspenab, db 0 NEWSYM pwinsptype, dd 0 NEWSYM winonstype, db 0 NEWSYM dualwinsp, db 0 NEWSYM cwinptr, dd winbgdata NEWSYM dwinptrproc, dd 0 ; 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 ;pwinspenab db 0 ;pwinsptype dd 0 ;winonstype db 0 ;dualwinsp db 0 NEWSYM winonsp, db 0 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 NEWSYM windowdata, times 16 db 0 NEWSYM numwin, db 0 NEWSYM multiwin, db 0 NEWSYM multiclip, db 0 NEWSYM multitype, db 0 ; 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 NEWSYM curbgnum, db 0 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 NEWSYM nextprimode, db 0 NEWSYM cursprloc, dd 0 NEWSYM curcolor, db 0 NEWSYM curtileptr, dw 0 ; esi = pointer to video buffer ; edi = pointer to tile data ; ebx = cached memory ; al = current x position NEWSYM bg1vbufloc, dd 0 NEWSYM bg2vbufloc, dd 0 NEWSYM bg3vbufloc, dd 0 NEWSYM bg4vbufloc, dd 0 NEWSYM bg1tdatloc, dd 0 NEWSYM bg2tdatloc, dd 0 NEWSYM bg3tdatloc, dd 0 NEWSYM bg4tdatloc, dd 0 NEWSYM bg1tdabloc, dd 0 NEWSYM bg2tdabloc, dd 0 NEWSYM bg3tdabloc, dd 0 NEWSYM bg4tdabloc, dd 0 NEWSYM bg1cachloc, dd 0 NEWSYM bg2cachloc, dd 0 NEWSYM bg3cachloc, dd 0 NEWSYM bg4cachloc, dd 0 NEWSYM bg1yaddval, dd 0 NEWSYM bg2yaddval, dd 0 NEWSYM bg3yaddval, dd 0 NEWSYM bg4yaddval, dd 0 NEWSYM bg1xposloc, dd 0 NEWSYM bg2xposloc, dd 0 NEWSYM bg3xposloc, dd 0 NEWSYM bg4xposloc, dd 0 NEWSYM alreadydrawn, db 0 NEWSYM fillwithnothing push edi xor eax,eax mov ecx,16 .loop mov [edi],eax add edi,4 dec ecx jnz .loop pop edi ret NEWSYM bg3draw, db 0 NEWSYM maxbr, db 0 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 NEWSYM bg3high2, dd 0 NEWSYM newengen, dd 0 NEWSYM cwinenabm, dd 0 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 NEWSYM tempbuffer, times 33 dd 0 NEWSYM currentobjptr, dd 0 NEWSYM curmosaicsz, dd 0 NEWSYM extbgdone, db 0 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 NEWSYM prfixobjl, db 0 NEWSYM csprbit, db 1 NEWSYM csprprlft, db 0 ;******************************************************* ; 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 NEWSYM drawn, db 0 NEWSYM curbgpr, db 0 ; 00h = low priority, 20h = high priority %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 NEWSYM winptrref, dd 0 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 NEWSYM alttile, db 0 NEWSYM hirestiledat, times 256 db 0 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 NEWSYM extraleft, db 0,0,0,1,0,1,2,2,0,2,3,1,2,4,2,1 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 ;windowdata times 16 db 0 ;numwin db 0 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 ;xtravbuf times 576 db 0 ; bytes to add to match y coordinates ALIGN32 NEWSYM yadder, dd 0 NEWSYM yrevadder, dd 0 NEWSYM tempcach, dd 0 ; points to cached memory NEWSYM temptile, dd 0 ; points to the secondary video pointer NEWSYM bgptr, dd 0 NEWSYM bgptrb, dd 0 NEWSYM bgptrc, dd 0 NEWSYM bgptrd, dd 0 NEWSYM bgptrx1, dd 0 NEWSYM bgptrx2, dd 0 NEWSYM curvidoffset, dd 0 NEWSYM winon, dd 0 NEWSYM bgofwptr, dd 0 NEWSYM bgsubby, dd 0 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 NEWSYM offsetmodeptr, dd 0 NEWSYM offsetptra, dd 0 NEWSYM offsetptrb, dd 0 NEWSYM prevtempcache, dd 0 NEWSYM prevoffsetdat, dd 0 NEWSYM offsetenab, dd 0 NEWSYM offsettilel, dd 0 NEWSYM offsetrevval, dd 0 NEWSYM posyscroll, dd 0 NEWSYM offsetmcol, dd 0 NEWSYM offsetmshl, dd 0 NEWSYM offsetmptr, dd 0 NEWSYM offsetmtst, dd 0 NEWSYM offsetmclr, dd 0 NEWSYM offsetcedi, dd 0 ;******************************************************* ; 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 .yadd dw 0 .yflipadd dw 0 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 NEWSYM temp, db 0 NEWSYM bshifter, db 0 NEWSYM a16x16xinc, db 0 NEWSYM a16x16yinc, db 0 NEWSYM MakeVidAsmEnd