quickdev16/tools/zsnes/src/vcache.asm
2009-04-22 20:04:28 +02:00

3972 lines
77 KiB
NASM

;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;https://zsnes.bountysource.com
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;version 2 as published by the Free Software Foundation.
;
;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 MessageOn,MsgCount,Msgptr,Voice0Disable,Voice0Status,Voice1Disable
EXTSYM Voice1Status,Voice2Disable,Voice2Status,Voice3Disable,Voice3Status
EXTSYM Voice4Disable,Voice4Status,Voice5Disable,Voice5Status,Voice6Disable
EXTSYM Voice6Status,Voice7Disable,Voice7Status,bgcmsung,bgmode
EXTSYM cgmod,disableeffects,frameskip,frskipper,current_zst
EXTSYM maxbr,modeused,mousexloc,mouseyloc,newengen,KeyRTRCycle
EXTSYM nextdrawallng,pal16b,pal16bxcl,pressed,prevbright,prevpal
EXTSYM scaddsngb,scaddtngb,scaddtngbx,scfbl,scrndis,sprprdrn,t1cc
EXTSYM vidbright,vidbuffer,vidbufferofsa,vidmemch2,MZTForceRTR
EXTSYM GUIRClick,MousePRClick,ngmsdraw,cvidmode,fulladdtab
EXTSYM KeyDisableSC0,KeyDisableSC1,KeyDisableSC2,KeyDisableSC3,KeyDisableSC4
EXTSYM KeyDisableSC5,KeyDisableSC6,KeyDisableSC7,KeyFastFrwrd,SRAMSave5Sec
EXTSYM KeyBGDisble0,KeyBGDisble1,KeyBGDisble2,KeyBGDisble3,KeySprDisble
EXTSYM KeyResetAll,KeyWinDisble,KeyNewGfxSwt,KeyOffsetMSw
EXTSYM KeyStateSlc0,KeyStateSlc1,KeyStateSlc2,KeyStateSlc3,KeyStateSlc4
EXTSYM KeyStateSlc5,KeyStateSlc6,KeyStateSlc7,KeyStateSlc8,KeyStateSlc9
EXTSYM KeyIncStateSlot,KeyDecStateSlot,KeyUsePlayer1234,maxskip,DSPMem
EXTSYM FastFwdToggle,SaveSramData,ngextbg,Mode7HiRes,Check60hz
EXTSYM Get_MouseData,Get_MousePositionDisplacement,scanlines
EXTSYM romispal,MusicRelVol,MusicVol,WDSPReg0C,WDSPReg1C,KeySlowDown
EXTSYM KeyFRateDown,KeyFRateUp,KeyVolUp,KeyVolDown,KeyDisplayFPS
EXTSYM FPSOn,pl12s34,bg1ptr,bg2ptr,bg3ptr,bg4ptr,cachebg1,resolutn,curypos
EXTSYM oamram,objhipr,objptr,objptrn,objsize1,objsize2,spritetablea,sprleftpr
EXTSYM sprlefttot,vcache4b,objadds1,objadds2,objmovs1,objmovs2,tltype4b
EXTSYM vidmemch4,vram,bgptr,bgptrc,bgptrd,curtileptr,vcache2b,vcache8b,vidmemch8
EXTSYM offsetmshl,NextLineCache,tltype2b,tltype8b,objwlrpos
EXTSYM EmuSpeed,SDRatio,FFRatio,DisplayBatteryStatus,lhguimouse,SwapMouseButtons
EXTSYM KeyResetSpeed,KeyEmuSpeedUp,KeyEmuSpeedDown,KeyDisplayBatt,EMUPause
EXTSYM device1,device2,snesinputdefault1,snesinputdefault2
EXTSYM KeyExtraEnab1,KeyExtraEnab2,cycleinputdevice1,cycleinputdevice2,MouseDis
EXTSYM KeyIncreaseGamma,KeyDecreaseGamma,gammalevel,gammalevel16b
EXTSYM RawDumpInProgress
%ifndef NO_DEBUGGER
EXTSYM debuggeron
%else
EXTSYM SPCSave
%endif
; Process stuff & Cache sprites
SECTION .data
ALIGN32
NEWSYM fskipped, db 0
NEWSYM sprprifix, db 1
NEWSYM OMBGTestVal, dd 0
NEWSYM ngptrdat2, dd 0
NEWSYM ofshvaladd, dd 0
NEWSYM ofsmtptrs, dd 0
NEWSYM ofsmcptr2, dd 0
NEWSYM sramb4save, dd 0
NEWSYM hiresstuff, dd 0
NEWSYM overalltimer, dd 0
SECTION .text
%macro stateselcomp 2
mov eax,[%1]
test byte[pressed+eax],1
je %%nostsl
mov byte[pressed+eax],2
mov eax,[current_zst]
mov cl,10
div cl
mov ah,%2
add al,'0'
add ah,'0'
mov [sselm+11],ax
sub al,'0'
mul cl
add al,%2
mov [current_zst],eax
mov dword[Msgptr],sselm
mov eax,[MsgCount]
mov [MessageOn],eax
%%nostsl
%endmacro
%macro soundselcomp 4
mov eax,[%1]
test byte[pressed+eax],1
je %%nosdis
xor byte[%2],01h
mov byte[%3],0
mov byte[pressed+eax],2
mov byte[sndchena+9],%4
mov byte[sndchdis+9],%4
mov dword[Msgptr],sndchena
test byte[%2],01h
jnz %%sen
mov dword[Msgptr],sndchdis
%%sen
mov eax,[MsgCount]
mov [MessageOn],eax
%%nosdis
%endmacro
UpdateVolume:
pushad
xor eax,eax
mov al,[MusicRelVol]
shl eax,7
mov ebx,0A3D70A3Dh
mul ebx
shr edx,6
cmp dl,127
jb .noof
mov dl,127
.noof
mov [MusicVol],dl
mov al,[DSPMem+0Ch]
call WDSPReg0C
mov al,[DSPMem+1Ch]
call WDSPReg1C
mov dword[vollv+14],20202020h
mov edx,vollv+15
mov al,[MusicRelVol]
cmp al,100
jne .no100
mov byte[edx],49
mov byte[edx+1],48
sub al,100
add edx,2
.no100
xor ah,ah
mov bl,10
div bl
cmp al,0
je .no10
add al,48
mov [edx],al
inc edx
.no10
add ah,48
mov [edx],ah
mov dword[Msgptr],vollv
mov eax,[MsgCount]
mov [MessageOn],eax
popad
ret
ClockCounter:
inc dword[overalltimer]
cmp byte[romispal],0
jne .dopal
cmp dword[overalltimer],60
jne .notimer
sub dword[overalltimer],60
jmp .notimer
.dopal
cmp dword[overalltimer],50
jne .notimer
sub dword[overalltimer],50
.notimer
test byte[pressed+2Eh],1
jz .noclear
mov dword[overalltimer],0
.noclear
ret
SECTION .bss
NEWSYM FastForwardLock, resb 1
NEWSYM SlowDownLock, resb 1
NEWSYM CSprWinPtr, resd 1
NEWSYM SloMo, resb 1 ; number of extra times to draw a frame
section .text
NEWSYM cachevideo
mov byte[NextLineCache],0
mov dword[objwlrpos],0FFFFFFFFh
mov dword[CSprWinPtr],0
mov byte[pressed],0
mov dword[bgcmsung],0
mov dword[modeused],0
mov dword[modeused+4],0
mov dword[scaddsngb],0
mov dword[scaddtngb],0
mov dword[sprprdrn],0
mov dword[ngmsdraw],0
mov dword[ngextbg],0
mov dword[scaddtngbx],0FFFFFFFFh
mov byte[hiresstuff],0
mov byte[Mode7HiRes],0
call ClockCounter
cmp byte[scanlines],1
je .nohires
cmp byte[cvidmode],9
je .yeshires
cmp byte[cvidmode],15
jne .nohires
.yeshires
mov byte[Mode7HiRes],1
.nohires
mov dword[scfbl],1
mov al,[vidbright]
mov [maxbr],al
mov byte[cgmod],1
xor al,al
mov [curblank],al
%ifndef NO_DEBUGGER
cmp byte[debuggeron],0
je .nodebugger
mov byte[curblank],40h
mov al,40h
jmp .nofrskip
.nodebugger
%else
cmp byte[SPCSave],1
jne .nospcsave
mov byte[curblank],40h
mov al,40h
jmp .nofrskip
.nospcsave
%endif
cmp dword[sramb4save],0
je .nofocussave
cmp byte[SRAMSave5Sec],0
je .nofocussaveb
dec dword[sramb4save]
cmp dword[sramb4save],1
jne .nofocussave
pushad
call SaveSramData
popad
jmp .nofocussave
.nofocussaveb
mov dword[sramb4save],0
.nofocussave
; if emulation paused, don't alter timing
mov ax,1
cmp byte[EMUPause],1
je near .ttldone
; fast forward goes over all other throttles
; don't fast forward while dumping a movie
cmp byte[RawDumpInProgress],1
je .ffskip
cmp byte[FastFwdToggle],0
jne .ffmode2
mov eax,[KeyFastFrwrd]
test byte[pressed+eax],1
jnz near .fastfor
jmp .ffskip
.ffmode2
mov eax,[KeyFastFrwrd]
test byte[pressed+eax],1
jz .nofastfor
mov byte[pressed+eax],2
xor byte[FastForwardLock],1
.nofastfor
cmp byte[FastForwardLock],1
je near .fastfor
.ffskip
; next up, check for slowdown
cmp byte[FastFwdToggle],0
jne .sdmode2
mov eax,[KeySlowDown]
test byte[pressed+eax],1
jnz near .slowdwn
jmp .sdskip
.sdmode2
mov eax,[KeySlowDown]
test byte[pressed+eax],1
jz .noslowdwn
mov byte[pressed+eax],2
xor byte[SlowDownLock],1
.noslowdwn
cmp byte[SlowDownLock],1
je near .slowdwn
jmp .sdskip
.slowdwn
mov al,[SDRatio] ; 0-28
inc al ; 1-29
mov [SloMo],al ; /2-/30 slowmotion
jmp .throttleskip
.sdskip
; now we can look at emuspeed
cmp byte[EmuSpeed],30 ; 0-28 slow, 29 normal, 30-58 skip
jb .noskipping
inc byte[frskipper]
push ebx
mov bl,[EmuSpeed]
sub bl,29 ; 30-58 -> 1-29 frames to skip, 2x-30x speed
jmp .fastforb
.noskipping
mov byte[SloMo],29
mov al,[EmuSpeed]
sub byte[SloMo],al ; 0-29 -> repeat 29-0 times, /30-1x speed
.throttleskip
mov ax,[SloMo]
inc ax ; total times frame is drawn
.ttldone
cmp byte[frameskip],0
jne near .frameskip
cmp word[t1cc],ax
jae .skipt1ccc
.noskip
push eax
call Check60hz
pop eax
cmp word[t1cc],ax
jb .noskip
.skipt1ccc
sub word[t1cc],ax
cmp word[t1cc],ax
jb .noskip2
mov byte[curblank],40h
inc byte[fskipped]
mov cl,[maxskip]
cmp byte[fskipped],cl
jbe near .nofrskip
mov word[t1cc],0
mov byte[curblank],0
.noskip2
mov byte[fskipped],0
jmp .nofrskip
.fastfor
inc byte[frskipper]
push ebx
mov bl,[FFRatio] ; 0-28
inc bl ; 1-29, 2x-30x fastmotion
jmp .fastforb
.frameskip
inc byte[frskipper]
push ebx
mov bl,[frameskip]
.fastforb
cmp byte[frskipper],bl
pop ebx
jae .nofrskip
mov byte[curblank],40h
jmp .frskip
.nofrskip
mov byte[frskipper],0
.frskip
push ebx
push esi
push edi
push edx
cmp byte[MouseDis],1
je .noclick
cmp byte[GUIRClick],0
je .noclick
cmp byte[device1],0
jne .noclick
cmp byte[device2],0
jne .noclick
call Get_MouseData
cmp byte[lhguimouse],1
jne .notlefthanded
call SwapMouseButtons
.notlefthanded
test bx,02h
jz .norclick
cmp byte[MousePRClick],0
jne .noclick
mov byte[pressed+1],1
.norclick
mov byte[MousePRClick],0
.noclick
; disable all necessary backgrounds
mov eax,[KeyBGDisble0]
test byte[pressed+eax],1
je .nodis1
xor byte[scrndis],01h
mov byte[pressed+eax],2
mov dword[Msgptr],bg1layena
test byte[scrndis],01h
jz .en1
mov dword[Msgptr],bg1laydis
.en1
mov eax,[MsgCount]
mov [MessageOn],eax
.nodis1
mov eax,[KeyBGDisble1]
test byte[pressed+eax],1
je .nodis2
xor byte[scrndis],02h
mov byte[pressed+eax],2
mov dword[Msgptr],bg2layena
test byte[scrndis],02h
jz .en2
mov dword[Msgptr],bg2laydis
.en2
mov eax,[MsgCount]
mov [MessageOn],eax
.nodis2
mov eax,[KeyBGDisble2]
test byte[pressed+eax],1
je .nodis3
xor byte[scrndis],04h
mov byte[pressed+eax],2
mov dword[Msgptr],bg3layena
test byte[scrndis],04h
jz .en3
mov dword[Msgptr],bg3laydis
.en3
mov eax,[MsgCount]
mov [MessageOn],eax
.nodis3
mov eax,[KeyBGDisble3]
test byte[pressed+eax],1
je .nodis4
xor byte[scrndis],08h
mov byte[pressed+eax],2
mov dword[Msgptr],bg4layena
test byte[scrndis],08h
jz .en4
mov dword[Msgptr],bg4laydis
.en4
mov eax,[MsgCount]
mov [MessageOn],eax
.nodis4
mov eax,[KeySprDisble]
test byte[pressed+eax],1
je .nodis5
xor byte[scrndis],10h
mov byte[pressed+eax],2
mov dword[Msgptr],sprlayena
test byte[scrndis],10h
jz .en5
mov dword[Msgptr],sprlaydis
.en5
mov eax,[MsgCount]
mov [MessageOn],eax
.nodis5
mov eax,[KeyEmuSpeedDown]
test byte[pressed+eax],1
jz .nospeeddown
mov byte[pressed+eax],2
cmp byte[EmuSpeed],0
je .nospeeddown
dec byte[EmuSpeed]
.nospeeddown
mov eax,[KeyEmuSpeedUp]
test byte[pressed+eax],1
jz .nospeedup
mov byte[pressed+eax],2
cmp byte[EmuSpeed],58
je .nospeedup
inc byte[EmuSpeed]
.nospeedup
mov eax,[KeyResetSpeed]
test byte[pressed+eax],1
jz .nospeedreset
mov byte[pressed+eax],2
mov byte[EmuSpeed],29
.nospeedreset
mov eax,[KeyResetAll]
test byte[pressed+eax],1
je near .nodis6
mov byte[pressed+eax],2
mov byte[Voice0Disable],1
mov byte[Voice1Disable],1
mov byte[Voice2Disable],1
mov byte[Voice3Disable],1
mov byte[Voice4Disable],1
mov byte[Voice5Disable],1
mov byte[Voice6Disable],1
mov byte[Voice7Disable],1
mov byte[scrndis],0
mov byte[disableeffects],0
mov byte[osm2dis],0
mov byte[EmuSpeed],29
mov al,[snesinputdefault1]
mov [device1],al
mov al,[snesinputdefault2]
mov [device2],al
mov dword[Msgptr],panickeyp
mov eax,[MsgCount]
mov [MessageOn],eax
.nodis6
mov eax,[KeyRTRCycle]
test byte[pressed+eax],1
je near .nortrcycle
mov byte[pressed+eax],2
inc byte[MZTForceRTR]
cmp byte[MZTForceRTR],3
jne .notrtrwrap
mov byte[MZTForceRTR],0
mov dword[Msgptr],mztrtr0
jmp .mztrtrmesg
.notrtrwrap
cmp byte[MZTForceRTR],1
jne .nomztrtr1
mov dword[Msgptr],mztrtr1
jmp .mztrtrmesg
.nomztrtr1
mov dword[Msgptr],mztrtr2
.mztrtrmesg
mov eax,[MsgCount]
mov [MessageOn],eax
.nortrcycle
mov eax,[KeyExtraEnab1]
test byte[pressed+eax],1
je near .nodisd1
mov byte[pressed+eax],2
pushad
call cycleinputdevice1
popad
mov dword[Msgptr],snesmousep0
cmp byte[device1],1
jne .nom11
mov dword[Msgptr],snesmousep1
.nom11
mov eax,[MsgCount]
mov [MessageOn],eax
call Get_MousePositionDisplacement
.nodisd1
mov eax,[KeyExtraEnab2]
test byte[pressed+eax],1
je near .nodisd2
mov byte[pressed+eax],2
pushad
call cycleinputdevice2
popad
mov dword[Msgptr],snesmousep0
cmp byte[device2],1
jne .nom21
mov dword[Msgptr],snesmousep2
.nom21
cmp byte[device2],2
jne .nom22
mov dword[Msgptr],snesss
mov word[mousexloc],128
mov word[mouseyloc],112
.nom22
cmp byte[device2],3
jne .nom23
mov dword[Msgptr],snesle1
.nom23
cmp byte[device2],4
jne .nom24
mov dword[Msgptr],snesle2
.nom24
mov eax,[MsgCount]
mov [MessageOn],eax
call Get_MousePositionDisplacement
.nodisd2
mov eax,[KeyNewGfxSwt]
test byte[pressed+eax],1
je near .nodis8
mov byte[pressed+eax],2
mov byte[prevbright],16
xor byte[newengen],1
mov dword[Msgptr],ngena
cmp byte[newengen],1
je .disng
mov dword[Msgptr],ngdis
.disng
mov eax,[MsgCount]
mov [MessageOn],eax
mov dword[nextdrawallng],1
mov edi,vidmemch2
mov ecx,1024*3
mov eax,01010101h
rep stosd
mov edi,pal16b
mov ecx,256
xor eax,eax
rep stosd
mov edi,prevpal
mov ecx,128
rep stosd
mov eax,0FFFFh
cmp byte[newengen],1
jne .noneweng
mov eax,0FFFFFFFFh
.noneweng
mov edi,pal16bxcl
mov ecx,256
rep stosd
pushad
call genfulladdtab
popad
.yesng
.disng2
.nodis8
mov eax,[KeyWinDisble]
test byte[pressed+eax],1
je .nodis9
mov byte[pressed+eax],2
xor byte[disableeffects],1
mov dword[Msgptr],windissw
cmp byte[disableeffects],1
je .disablew
mov dword[Msgptr],winenasw
.disablew
mov eax,[MsgCount]
mov [MessageOn],eax
.nodis9
mov eax,[KeyOffsetMSw]
test byte[pressed+eax],1
je .nodis10
mov byte[pressed+eax],2
xor byte[osm2dis],1
mov dword[Msgptr],ofsdissw
cmp byte[osm2dis],1
je .disableom
mov dword[Msgptr],ofsenasw
.disableom
mov eax,[MsgCount]
mov [MessageOn],eax
.nodis10
mov eax,[KeyVolUp]
test byte[pressed+eax],1
je .novolup
cmp byte[MusicRelVol],100
jae .novolup
inc byte[MusicRelVol]
call UpdateVolume
.novolup
mov eax,[KeyVolDown]
test byte[pressed+eax],1
je .novoldown
cmp byte[MusicRelVol],0
je .novoldown
dec byte[MusicRelVol]
call UpdateVolume
.novoldown
mov eax,[KeyFRateUp]
test byte[pressed+eax],1
je .nofrup
mov byte[pressed+eax],2
cmp byte[frameskip],10
je .nofrup
mov byte[FPSOn],0
inc byte[frameskip]
mov al,[frameskip]
add al,47
mov [frlev+18],al
mov dword[Msgptr],frlev
mov eax,[MsgCount]
mov [MessageOn],eax
.nofrup
mov eax,[KeyFRateDown]
test byte[pressed+eax],1
je .nofrdown
mov byte[pressed+eax],2
cmp byte[frameskip],0
je .nofrdown
dec byte[frameskip]
cmp byte[frameskip],0
je .min
mov al,[frameskip]
add al,47
mov [frlev+18],al
mov dword[Msgptr],frlev
jmp .nomin
.min
mov dword[Msgptr],frlv0
mov word[t1cc],0
.nomin
mov eax,[MsgCount]
mov [MessageOn],eax
.nofrdown
mov eax,[KeyDisplayBatt]
test byte[pressed+eax],1
je .nodisplaybatt
mov byte[pressed+eax],2
pushad
call DisplayBatteryStatus
popad
.nodisplaybatt
mov eax,[KeyIncreaseGamma]
test byte[pressed+eax],1
je .noincgamma
mov byte[pressed+eax],2
cmp byte[gammalevel],15
jge .noincgamma
inc byte[gammalevel]
mov al,[gammalevel]
mov [gammalevel16b],al
shr byte[gammalevel16b],1
cmp byte[gammalevel],10
jl .gammanot10
mov byte[gammamsg+13],'1'
sub al,10
jmp .postgamma
.gammanot10
mov byte[gammamsg+13],' '
.postgamma
add al,'0'
mov [gammamsg+14],al
mov dword[Msgptr],gammamsg
mov eax,[MsgCount]
mov [MessageOn],eax
.noincgamma
mov eax,[KeyDecreaseGamma]
test byte[pressed+eax],1
je .nodecgamma
mov byte[pressed+eax],2
cmp byte [gammalevel],0
je .nodecgamma
dec byte[gammalevel]
mov eax,[gammalevel]
mov [gammalevel16b],eax
shr byte[gammalevel16b],1
cmp byte[gammalevel],10
jl .gamma2not10
mov byte[gammamsg+13],'1'
sub al,10
jmp .postgamma2
.gamma2not10
mov byte[gammamsg+13],' '
.postgamma2
add al,'0'
mov [gammamsg+14],al
mov dword[Msgptr],gammamsg
mov eax,[MsgCount]
mov [MessageOn],eax
.nodecgamma
mov eax,[KeyDisplayFPS]
test byte[pressed+eax],1
je .nodisplayfps
mov byte[pressed+eax],2
cmp byte[frameskip],0
jne .nodisplayfps
xor byte[FPSOn],1
.nodisplayfps
; do state selects
stateselcomp KeyStateSlc0,0
stateselcomp KeyStateSlc1,1
stateselcomp KeyStateSlc2,2
stateselcomp KeyStateSlc3,3
stateselcomp KeyStateSlc4,4
stateselcomp KeyStateSlc5,5
stateselcomp KeyStateSlc6,6
stateselcomp KeyStateSlc7,7
stateselcomp KeyStateSlc8,8
stateselcomp KeyStateSlc9,9
mov eax,[KeyStateSlc0]
test byte[pressed+eax],1
je .nostsl0
mov byte[pressed+eax],2
mov byte[sselm+11],'0'
mov dword[Msgptr],sselm
mov eax,[MsgCount]
mov [MessageOn],eax
.nostsl0
mov eax,[KeyIncStateSlot]
test byte[pressed+eax],1
je near .noincstateslot
mov byte[pressed+eax],2
mov eax,[current_zst]
inc eax
cmp eax,100
jne .notend
xor eax,eax
.notend
mov [current_zst],eax
mov dl,10
div dl
add ah,'0'
add al,'0'
mov [sselm+11],ax
mov dword[Msgptr],sselm
mov eax,[MsgCount]
mov [MessageOn],eax
xor dx,dx
.noincstateslot
mov eax,[KeyDecStateSlot]
test byte[pressed+eax],1
je near .nodecstateslot
mov byte[pressed+eax],2
mov eax,[current_zst]
cmp eax,0
jne .notstart
mov eax,100
.notstart
dec eax
mov [current_zst],eax
mov dl,10
div dl
add ah,'0'
add al,'0'
mov [sselm+11],ax
mov dword[Msgptr],sselm
mov eax,[MsgCount]
mov [MessageOn],eax
xor dx,dx
.nodecstateslot
mov eax,[KeyUsePlayer1234]
test byte[pressed+eax],1
je .nousepl1234
mov byte[pressed+eax],2
xor byte[pl12s34],1
mov dword[Msgptr],pluse1234en
cmp byte[pl12s34],1
je .usepl1234
mov dword[Msgptr],pluse1234dis
.usepl1234
mov eax,[MsgCount]
mov [MessageOn],eax
.nousepl1234
; do sound disables
soundselcomp KeyDisableSC0,Voice0Disable,Voice0Status,'1'
soundselcomp KeyDisableSC1,Voice1Disable,Voice1Status,'2'
soundselcomp KeyDisableSC2,Voice2Disable,Voice2Status,'3'
soundselcomp KeyDisableSC3,Voice3Disable,Voice3Status,'4'
soundselcomp KeyDisableSC4,Voice4Disable,Voice4Status,'5'
soundselcomp KeyDisableSC5,Voice5Disable,Voice5Status,'6'
soundselcomp KeyDisableSC6,Voice6Disable,Voice6Status,'7'
soundselcomp KeyDisableSC7,Voice7Disable,Voice7Status,'8'
cmp byte[curblank],0h
jne near yesblank
; Swap video addresses
; mov ebx,[vidbuffer]
; cmp ebx,[vidbufferofsa]
; je .useb
mov ebx,[vidbufferofsa]
mov [vidbuffer],ebx
NEWSYM docache
xor ebx,ebx
mov bl,[bgmode]
shl bl,2
add ebx,colormodedef
mov [colormodeofs],ebx
xor ebx,ebx
mov bl,[bgmode]
mov al,[colormodedef+ebx*4]
mov [curcolbg1],al
mov ah,[colormodedef+ebx*4+1]
mov [curcolbg2],ah
mov al,[colormodedef+ebx*4]
mov [curcolbg3],al
mov ah,[colormodedef+ebx*4+1]
mov [curcolbg4],ah
mov ax,[bg1ptr]
mov [curbgofs1],ax
mov ax,[bg2ptr]
mov [curbgofs2],ax
mov ax,[bg3ptr]
mov [curbgofs3],ax
mov ax,[bg4ptr]
mov [curbgofs4],ax
push es
mov ax,ds
mov es,ax
; clear # of sprites & bg cache
mov edi,cachebg1
mov ecx,64*5+16*4
xor eax,eax
rep stosd
; cmp byte[sprprifix],0
; je .nosprfix
; mov edi,sprlefttotb
; mov ecx,64*3
; xor eax,eax
; rep stosd
;.nosprfix
; do sprites
; test word[scrnon],1010h
; jz .nosprites
test byte[scrndis],10h
jnz .nosprites
call cachesprites
call processsprites
; mov byte[sprprncache],0
; cmp byte[sprprifix],0
; je .nosprites
; call processspritesb
.nosprites
; fill background with 0's unless 16-bit/new graphics engine mode is on
xor ecx,ecx
pop es
NEWSYM yesblank
pop edx
pop edi
pop esi
pop ebx
ret
SECTION .data
NEWSYM osm2dis, db 0
NEWSYM colormodedef, db 1,1,1,1, 2,2,1,0, 2,2,0,0, 3,2,0,0,
db 3,1,0,0, 2,1,0,0, 2,0,0,0, 0,0,0,0
NEWSYM colormodeofs, dd 0
NEWSYM curblank, db 80h ; current blank state (40h = skip fill)
NEWSYM addr2add, dd 0
;cachebg1 times 64 db 0
;cachebg2 times 64 db 0
;cachebg3 times 64 db 0
;cachebg4 times 64 db 0
;sprlefttot times 256 db 0 ; total sprites left
;sprleftpr times 256 db 0 ; sprites left for priority 0
;sprleftpr1 times 256 db 0 ; sprites left for priority 1
;sprleftpr2 times 256 db 0 ; sprites left for priority 2
;sprleftpr3 times 256 db 0 ; sprites left for priority 3
;spritetable times 256*512 db 0 ; sprite table (flip/pal/xloc/vbufptr)38*7
NEWSYM curbgofs1, dw 0
NEWSYM curbgofs2, dw 0
NEWSYM curbgofs3, dw 0
NEWSYM curbgofs4, dw 0
NEWSYM curcolbg1, db 0
NEWSYM curcolbg2, db 0
NEWSYM curcolbg3, db 0
NEWSYM curcolbg4, db 0
NEWSYM panickeyp, db 'ALL SWITCHES NORMAL',0
NEWSYM mztrtr0, db 'LOAD MZT MODE - OFF',0
NEWSYM mztrtr1, db 'LOAD MZT MODE - RECORD',0
NEWSYM mztrtr2, db 'LOAD MZT MODE - REPLAY',0
NEWSYM snesmousep0, db 'EXTRA DEVICES DISABLED',0
NEWSYM snesmousep1, db 'MOUSE ENABLED IN PORT 1',0
NEWSYM snesmousep2, db 'MOUSE ENABLED IN PORT 2',0
NEWSYM snesss, db 'SUPER SCOPE ENABLED',0
NEWSYM snesle1, db '1 JUSTIFIER ENABLED',0
NEWSYM snesle2, db '2 JUSTIFIERS ENABLED',0
NEWSYM windissw, db 'WINDOWING DISABLED',0
NEWSYM winenasw, db 'WINDOWING ENABLED',0
NEWSYM ofsdissw, db 'OFFSET MODE DISABLED',0
NEWSYM ofsenasw, db 'OFFSET MODE ENABLED',0
NEWSYM ngena, db 'NEW GFX ENGINE ENABLED',0
NEWSYM ngdis, db 'NEW GFX ENGINE DISABLED',0
NEWSYM sselm, db 'STATE SLOT 0 SELECTED',0
NEWSYM vollv, db 'VOLUME LEVEL : ',0
NEWSYM frlev, db 'FRAME SKIP SET TO ',0
NEWSYM frlv0, db 'AUTO FRAMERATE ENABLED',0
NEWSYM pluse1234en, db 'USE PLAYER 1/2 with 3/4 ON',0
NEWSYM pluse1234dis, db 'USE PLAYER 1/2 with 3/4 OFF',0
sndchena db 'SOUND CH ENABLED',0
sndchdis db 'SOUND CH DISABLED',0
bg1layena db 'BG1 LAYER ENABLED',0
bg2layena db 'BG2 LAYER ENABLED',0
bg3layena db 'BG3 LAYER ENABLED',0
bg4layena db 'BG4 LAYER ENABLED',0
sprlayena db 'SPRITE LAYER ENABLED',0
bg1laydis db 'BG1 LAYER DISABLED',0
bg2laydis db 'BG2 LAYER DISABLED',0
bg3laydis db 'BG3 LAYER DISABLED',0
bg4laydis db 'BG4 LAYER DISABLED',0
sprlaydis db 'SPRITE LAYER DISABLED',0
gammamsg db 'GAMMA LEVEL: ',0
section .text
;*******************************************************
; Process Sprites
;*******************************************************
; Use oamram for object table
NEWSYM processsprites
; cmp byte[cbitmode],1
; je .skipnewspr
; cmp byte[newengen],1
; je .skipnewspr
cmp byte[sprprifix],0
jne near processspritesb
.skipnewspr
; set obj pointers
cmp byte[objsize1],1
jne .16dot1
mov ebx,.process8x8sprite
mov [.size1ptr],ebx
jmp .fin1
.16dot1
cmp byte[objsize1],4
jne .32dot1
mov ebx,.process16x16sprite
mov [.size1ptr],ebx
jmp .fin1
.32dot1
cmp byte[objsize1],16
jne .64dot1
mov ebx,.process32x32sprite
mov [.size1ptr],ebx
jmp .fin1
.64dot1
mov ebx,.process64x64sprite
mov [.size1ptr],ebx
.fin1
cmp byte[objsize2],1
jne .16dot2
mov ebx,.process8x8sprite
mov [.size2ptr],ebx
jmp .fin2
.16dot2
cmp byte[objsize2],4
jne .32dot2
mov ebx,.process16x16sprite
mov [.size2ptr],ebx
jmp .fin2
.32dot2
cmp byte[objsize2],16
jne .64dot2
mov ebx,.process32x32sprite
mov [.size2ptr],ebx
jmp .fin2
.64dot2
mov ebx,.process64x64sprite
mov [.size2ptr],ebx
.fin2
; set pointer adder
xor eax,eax
xor ebx,ebx
mov al,[objhipr]
shl ax,2
mov ebx,eax
sub bx,4
and bx,01FCh
mov dword[addr2add],0
mov byte[.prileft],4
mov byte[.curpri],0
; do 1st priority
mov ecx,[objptr]
shl ecx,1
mov [.objvramloc],ecx
mov ecx,[objptrn]
sub ecx,[objptr]
shl ecx,1
mov [.objvramloc2],ecx
push ebp
mov ebp,[spritetablea]
.startobject
mov byte[.objleft],128
.objloop
xor ecx,ecx
mov cx,[oamram+ebx+2]
mov dl,ch
shr dl,4
and dl,03h
cmp dl,[.curpri]
jne near .nextobj
; get object information
push ebx
mov dl,[oamram+ebx+1] ; y
inc dl
; set up pointer to esi
mov dh,ch
and ch,01h
shr dh,1
shl ecx,6
add ecx,[.objvramloc]
test byte[oamram+ebx+3],01h
jz .noloc2
add ecx,[.objvramloc2]
.noloc2
and ecx,01FFFFh
add ecx,[vcache4b]
mov esi,ecx
; get x
mov al,[oamram+ebx] ; x
; get double bits
mov cl,bl
shr ebx,4 ; /16
shr cl,1
and cl,06h
mov ah,[oamram+ebx+512]
shr ah,cl
and ah,03h
mov ch,ah
and ch,01h
mov cl,al
; process object
; esi = pointer to 8-bit object, dh = stats (1 shifted to right)
; cx = x position, dl = y position
cmp cx,384
jb .noadder
add cx,65535-511
.noadder
cmp cx,256
jge .returnfromptr
cmp cx,-64
jle .returnfromptr
test ah,02h
jz .size1
jmp dword near [.size2ptr]
.size1
jmp dword near [.size1ptr]
.returnfromptr
pop ebx
; next object
.nextobj
sub bx,4
and bx,01FCh
dec byte[.objleft]
jnz near .objloop
add dword[addr2add],256
inc byte[.curpri]
dec byte[.prileft]
jnz near .startobject
pop ebp
ret
SECTION .bss
.objvramloc resd 1
.objvramloc2 resd 1
.curpri resd 1
.trypri resd 1
.objleft resd 1
.prileft resd 1
.size1ptr resd 1
.size2ptr resd 1
SECTION .text
.reprocesssprite
cmp cx,-8
jle .next
cmp cx,256
jge .next
add cx,8
.reprocessspriteb
cmp dl,[resolutn]
jae .overflow
xor ebx,ebx
mov bl,dl
xor eax,eax
cmp bx,[curypos]
jb .overflow
mov al,[sprlefttot+ebx]
cmp al,45
ja near .overflow
inc byte[sprlefttot+ebx]
add ebx,[addr2add]
inc byte[sprleftpr+ebx]
sub ebx,[addr2add]
shl ebx,9
shl eax,3
add ebx,eax
mov [ebp+ebx],cx
mov [ebp+ebx+2],esi
mov al,[.statusbit]
mov [ebp+ebx+6],dh
mov [ebp+ebx+7],al
.overflow
inc dl
add esi,8
dec byte[.numleft2do]
jnz .reprocessspriteb
sub cx,8
ret
.next
add dl,8
add esi,64
ret
.reprocessspriteflipy
cmp cx,-8
jle .nextb
cmp cx,256
jge .nextb
add cx,8
.reprocessspriteflipyb
cmp dl,[resolutn]
jae .overflow2
xor ebx,ebx
xor eax,eax
mov bl,dl
cmp bx,[curypos]
jb .overflow2
mov al,[sprlefttot+ebx]
cmp al,45
ja near .overflow2
inc byte[sprlefttot+ebx]
add ebx,[addr2add]
inc byte[sprleftpr+ebx]
sub ebx,[addr2add]
shl ebx,9
shl eax,3
add ebx,eax
mov [ebp+ebx],cx
mov [ebp+ebx+2],esi
mov al,[.statusbit]
mov [ebp+ebx+6],dh
mov [ebp+ebx+7],al
.overflow2
inc dl
sub esi,8
dec byte[.numleft2do]
jnz .reprocessspriteflipyb
sub cx,8
ret
.nextb
add dl,8
sub esi,64
ret
section .bss
.statusbit resb 1
section .text
.process8x8sprite:
test dh,40h
jnz .8x8flipy
mov [.statusbit],dh
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
call .reprocesssprite
jmp .returnfromptr
.8x8flipy
mov [.statusbit],dh
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add esi,56
call .reprocessspriteflipy
jmp .returnfromptr
section .bss
.numleft2do resb 1
section .text
.process16x16sprite:
mov [.statusbit],dh
test dh,20h
jnz near .16x16flipx
test dh,40h
jnz .16x16flipy
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
call .reprocesssprite
sub dl,8
add cx,8
mov byte[.numleft2do],8
call .reprocesssprite
sub cx,8
add esi,64*14
mov byte[.numleft2do],8
call .reprocesssprite
sub dl,8
add cx,8
mov byte[.numleft2do],8
call .reprocesssprite
jmp .returnfromptr
.16x16flipy
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add dl,8
add esi,56
call .reprocessspriteflipy
add esi,128
sub dl,8
add cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
add esi,128
sub dl,16
sub cx,8
add esi,64*14
mov byte[.numleft2do],8
call .reprocessspriteflipy
add esi,128
sub dl,8
add cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
jmp .returnfromptr
.16x16flipx
test dh,40h
jnz .16x16flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,8
call .reprocesssprite
sub dl,8
sub cx,8
mov byte[.numleft2do],8
call .reprocesssprite
add esi,64*14
add cx,8
mov byte[.numleft2do],8
call .reprocesssprite
sub dl,8
sub cx,8
mov byte[.numleft2do],8
call .reprocesssprite
jmp .returnfromptr
.16x16flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,8
add dl,8
add esi,56
call .reprocessspriteflipy
add esi,128
sub dl,8
sub cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
add esi,128
add esi,64*14
sub dl,16
add cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
add esi,128
sub dl,8
sub cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
jmp .returnfromptr
;*******************************************************
; Sprite increment/draw macros
;*******************************************************
%macro nextsprite2right 0
sub dl,8
add cx,8
mov byte[.numleft2do],8
call .reprocesssprite
%endmacro
%macro nextsprite2rightflipy 0
add esi,128
sub dl,8
add cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
%endmacro
%macro nextsprite2rightflipx 0
sub dl,8
sub cx,8
mov byte[.numleft2do],8
call .reprocesssprite
%endmacro
%macro nextsprite2rightflipyx 0
add esi,128
sub dl,8
sub cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
%endmacro
;*******************************************************
; 32x32 sprites routines
;*******************************************************
%macro nextline32x32 0
sub cx,24
add esi,64*12
mov byte[.numleft2do],8
call .reprocesssprite
nextsprite2right
nextsprite2right
nextsprite2right
%endmacro
.process32x32sprite:
mov [.statusbit],dh
test dh,20h
jnz near .32x32flipx
test dh,40h
jnz near .32x32flipy
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
call .reprocesssprite
nextsprite2right
nextsprite2right
nextsprite2right
nextline32x32
nextline32x32
nextline32x32
jmp .returnfromptr
%macro nextline32x32flipy 0
sub cx,24
add esi,64*12+128
sub dl,16
mov byte[.numleft2do],8
call .reprocessspriteflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
%endmacro
.32x32flipy
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add dl,24
add esi,56
call .reprocessspriteflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextline32x32flipy
nextline32x32flipy
nextline32x32flipy
jmp .returnfromptr
%macro nextline32x32flipx 0
add cx,24
add esi,64*12
mov byte[.numleft2do],8
call .reprocesssprite
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
%endmacro
.32x32flipx
test dh,40h
jnz near .32x32flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,24
call .reprocesssprite
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextline32x32flipx
nextline32x32flipx
nextline32x32flipx
jmp .returnfromptr
%macro nextline32x32flipyx 0
add cx,24
add esi,64*12+128
sub dl,16
mov byte[.numleft2do],8
call .reprocessspriteflipy
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
%endmacro
.32x32flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,24
add dl,24
add esi,56
call .reprocessspriteflipy
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextline32x32flipyx
nextline32x32flipyx
nextline32x32flipyx
jmp .returnfromptr
;*******************************************************
; 64x64 sprites routines
;*******************************************************
%macro nextline64x64 0
sub cx,56
add esi,64*8
mov byte[.numleft2do],8
call .reprocesssprite
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
%endmacro
.process64x64sprite:
mov [.statusbit],dh
test dh,20h
jnz near .64x64flipx
test dh,40h
jnz near .64x64flipy
mov [.statusbit],dh
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
call .reprocesssprite
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextline64x64
nextline64x64
nextline64x64
nextline64x64
nextline64x64
nextline64x64
nextline64x64
jmp .returnfromptr
%macro nextline64x64flipy 0
sub cx,56
add esi,64*8+128
sub dl,16
mov byte[.numleft2do],8
call .reprocessspriteflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
%endmacro
.64x64flipy
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add dl,56
add esi,56
call .reprocessspriteflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextline64x64flipy
nextline64x64flipy
nextline64x64flipy
nextline64x64flipy
nextline64x64flipy
nextline64x64flipy
nextline64x64flipy
jmp .returnfromptr
%macro nextline64x64flipx 0
add cx,56
add esi,64*8
mov byte[.numleft2do],8
call .reprocesssprite
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
%endmacro
.64x64flipx
test dh,40h
jnz near .64x64flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,56
call .reprocesssprite
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextline64x64flipx
nextline64x64flipx
nextline64x64flipx
nextline64x64flipx
nextline64x64flipx
nextline64x64flipx
nextline64x64flipx
jmp .returnfromptr
%macro nextline64x64flipyx 0
add cx,56
add esi,64*8+128
sub dl,16
mov byte[.numleft2do],8
call .reprocessspriteflipy
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
%endmacro
.64x64flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,56
add dl,56
add esi,56
call .reprocessspriteflipy
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextline64x64flipyx
nextline64x64flipyx
nextline64x64flipyx
nextline64x64flipyx
nextline64x64flipyx
nextline64x64flipyx
nextline64x64flipyx
jmp .returnfromptr
;*******************************************************
; Process Sprites B - Process
;*******************************************************
; Use oamram for object table
NEWSYM processspritesb
; set obj pointers
cmp byte[objsize1],1
jne .16dot1
mov ebx,.process8x8sprite
mov [.size1ptr],ebx
jmp .fin1
.16dot1
cmp byte[objsize1],4
jne .32dot1
mov ebx,.process16x16sprite
mov [.size1ptr],ebx
jmp .fin1
.32dot1
cmp byte[objsize1],16
jne .64dot1
mov ebx,.process32x32sprite
mov [.size1ptr],ebx
jmp .fin1
.64dot1
mov ebx,.process64x64sprite
mov [.size1ptr],ebx
.fin1
cmp byte[objsize2],1
jne .16dot2
mov ebx,.process8x8sprite
mov [.size2ptr],ebx
jmp .fin2
.16dot2
cmp byte[objsize2],4
jne .32dot2
mov ebx,.process16x16sprite
mov [.size2ptr],ebx
jmp .fin2
.32dot2
cmp byte[objsize2],16
jne .64dot2
mov ebx,.process32x32sprite
mov [.size2ptr],ebx
jmp .fin2
.64dot2
mov ebx,.process64x64sprite
mov [.size2ptr],ebx
.fin2
; set pointer adder
xor eax,eax
xor ebx,ebx
mov al,[objhipr]
shl ax,2
mov ebx,eax
and bx,01FCh
mov dword[addr2add],0
; do 1st priority
mov ecx,[objptr]
shl ecx,1
mov [.objvramloc],ecx
mov ecx,[objptrn]
sub ecx,[objptr]
shl ecx,1
mov [.objvramloc2],ecx
push ebp
mov ebp,[spritetablea]
.startobject
mov byte[.objleft],128
.objloop
xor ecx,ecx
mov cx,[oamram+ebx+2]
mov dl,ch
shr dl,4
and edx,03h
mov [.cpri],dl
; get object information
push ebx
mov dl,[oamram+ebx+1] ; y
inc dl
; set up pointer to esi
mov dh,ch
and ch,01h
shr dh,1
shl ecx,6
add ecx,[.objvramloc]
test byte[oamram+ebx+3],01h
jz .noloc2
add ecx,[.objvramloc2]
.noloc2
and ecx,01FFFFh
add ecx,[vcache4b]
mov esi,ecx
; get x
mov al,[oamram+ebx] ; x
; get double bits
mov cl,bl
shr ebx,4 ; /16
shr cl,1
and cl,06h
mov ah,[oamram+ebx+512]
shr ah,cl
and ah,03h
mov ch,ah
and ch,01h
mov cl,al
; process object
; esi = pointer to 8-bit object, dh = stats (1 shifted to right)
; cx = x position, dl = y position
cmp cx,384
jb .noadder
add cx,65535-511
.noadder
cmp cx,256
jge .returnfromptr
cmp cx,-64
jle .returnfromptr
test ah,02h
jz .size1
jmp dword near [.size2ptr]
.size1
jmp dword near [.size1ptr]
.returnfromptr
pop ebx
; next object
.nextobj
add bx,4
and bx,01FCh
dec byte[.objleft]
jnz near .objloop
pop ebp
ret
SECTION .bss
.objvramloc resd 1
.objvramloc2 resd 1
.curpri resd 1
.trypri resd 1
.objleft resd 1
.prileft resd 1
.size1ptr resd 1
.size2ptr resd 1
.cpri resd 1
SECTION .text
.reprocesssprite
cmp cx,-8
jle near .next
cmp cx,256
jge .next
add cx,8
.reprocessspriteb
cmp dl,[resolutn]
jae .overflow
xor ebx,ebx
xor eax,eax
mov bl,dl
cmp bx,[curypos]
jb .overflow
mov al,[sprlefttot+ebx]
cmp al,45
ja near .overflow
inc byte[sprlefttot+ebx]
mov edi,[.cpri]
mov byte[sprleftpr+ebx*4+edi],1
shl ebx,9
shl eax,3
add ebx,eax
mov [ebp+ebx],cx
mov [ebp+ebx+2],esi
mov al,[.statusbit]
and al,0F8h
or al,[.cpri]
mov [ebp+ebx+6],dh
mov [ebp+ebx+7],al
.overflow
inc dl
add esi,8
dec byte[.numleft2do]
jnz .reprocessspriteb
sub cx,8
ret
.next
add dl,8
add esi,64
ret
.reprocessspriteflipy
cmp cx,-8
jle near .nextb
cmp cx,256
jge .nextb
add cx,8
.reprocessspriteflipyb
cmp dl,[resolutn]
jae .overflow2
xor ebx,ebx
xor eax,eax
mov bl,dl
cmp bx,[curypos]
jb .overflow
mov al,[sprlefttot+ebx]
cmp al,45
ja near .overflow2
inc byte[sprlefttot+ebx]
mov edi,[.cpri]
mov byte[sprleftpr+ebx*4+edi],1
shl ebx,9
shl eax,3
add ebx,eax
mov [ebp+ebx],cx
mov [ebp+ebx+2],esi
mov al,[.statusbit]
and al,0F8h
or al,[.cpri]
mov [ebp+ebx+6],dh
mov [ebp+ebx+7],al
.overflow2
inc dl
sub esi,8
dec byte[.numleft2do]
jnz .reprocessspriteflipyb
sub cx,8
ret
.nextb
add dl,8
sub esi,64
ret
section .bss
.statusbit resb 1
section .text
.process8x8sprite:
test dh,40h
jnz .8x8flipy
mov [.statusbit],dh
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
call .reprocesssprite
jmp .returnfromptr
.8x8flipy
mov [.statusbit],dh
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add esi,56
call .reprocessspriteflipy
jmp .returnfromptr
section .bss
.numleft2do resb 1
section .text
.process16x16sprite:
mov [.statusbit],dh
test dh,20h
jnz near .16x16flipx
test dh,40h
jnz .16x16flipy
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
call .reprocesssprite
sub dl,8
add cx,8
mov byte[.numleft2do],8
call .reprocesssprite
sub cx,8
add esi,64*14
mov byte[.numleft2do],8
call .reprocesssprite
sub dl,8
add cx,8
mov byte[.numleft2do],8
call .reprocesssprite
jmp .returnfromptr
.16x16flipy
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add dl,8
add esi,56
call .reprocessspriteflipy
add esi,128
sub dl,8
add cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
add esi,128
sub dl,16
sub cx,8
add esi,64*14
mov byte[.numleft2do],8
call .reprocessspriteflipy
add esi,128
sub dl,8
add cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
jmp .returnfromptr
.16x16flipx
test dh,40h
jnz .16x16flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,8
call .reprocesssprite
sub dl,8
sub cx,8
mov byte[.numleft2do],8
call .reprocesssprite
add esi,64*14
add cx,8
mov byte[.numleft2do],8
call .reprocesssprite
sub dl,8
sub cx,8
mov byte[.numleft2do],8
call .reprocesssprite
jmp .returnfromptr
.16x16flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,8
add dl,8
add esi,56
call .reprocessspriteflipy
add esi,128
sub dl,8
sub cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
add esi,128
add esi,64*14
sub dl,16
add cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
add esi,128
sub dl,8
sub cx,8
mov byte[.numleft2do],8
call .reprocessspriteflipy
jmp .returnfromptr
;*******************************************************
; 32x32 sprites routines
;*******************************************************
.process32x32sprite:
mov [.statusbit],dh
test dh,20h
jnz near .32x32flipx
test dh,40h
jnz near .32x32flipy
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
call .reprocesssprite
nextsprite2right
nextsprite2right
nextsprite2right
nextline32x32
nextline32x32
nextline32x32
jmp .returnfromptr
.32x32flipy
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add dl,24
add esi,56
call .reprocessspriteflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextline32x32flipy
nextline32x32flipy
nextline32x32flipy
jmp .returnfromptr
.32x32flipx
test dh,40h
jnz near .32x32flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,24
call .reprocesssprite
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextline32x32flipx
nextline32x32flipx
nextline32x32flipx
jmp .returnfromptr
.32x32flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,24
add dl,24
add esi,56
call .reprocessspriteflipy
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextline32x32flipyx
nextline32x32flipyx
nextline32x32flipyx
jmp .returnfromptr
;*******************************************************
; 64x64 sprites routines
;*******************************************************
.process64x64sprite:
mov [.statusbit],dh
test dh,20h
jnz near .64x64flipx
test dh,40h
jnz near .64x64flipy
mov [.statusbit],dh
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
call .reprocesssprite
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextsprite2right
nextline64x64
nextline64x64
nextline64x64
nextline64x64
nextline64x64
nextline64x64
nextline64x64
jmp .returnfromptr
.64x64flipy
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add dl,56
add esi,56
call .reprocessspriteflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextsprite2rightflipy
nextline64x64flipy
nextline64x64flipy
nextline64x64flipy
nextline64x64flipy
nextline64x64flipy
nextline64x64flipy
nextline64x64flipy
jmp .returnfromptr
.64x64flipx
test dh,40h
jnz near .64x64flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,56
call .reprocesssprite
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextsprite2rightflipx
nextline64x64flipx
nextline64x64flipx
nextline64x64flipx
nextline64x64flipx
nextline64x64flipx
nextline64x64flipx
nextline64x64flipx
jmp .returnfromptr
.64x64flipyx
and dh,07h
mov byte[.numleft2do],8
shl dh,4
add dh,128
add cx,56
add dl,56
add esi,56
call .reprocessspriteflipy
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextsprite2rightflipyx
nextline64x64flipyx
nextline64x64flipyx
nextline64x64flipyx
nextline64x64flipyx
nextline64x64flipyx
nextline64x64flipyx
nextline64x64flipyx
jmp .returnfromptr
;*******************************************************
; Cache Process Macros, info from Nerlaska!
;*******************************************************
%macro processcache2b 1
xor al,al
add ch,ch
adc al,al
add cl,cl
adc al,al
mov [edi+%1],al
%endmacro
%macro processcache4b 1
xor al,al
add dh,dh
adc al,al
add dl,dl
adc al,al
add ch,ch
adc al,al
add cl,cl
adc al,al
mov [edi+%1],al
%endmacro
;*******************************************************
; Cache Sprites
;*******************************************************
; Use oamram for object table, copy from vram -> vcache4b
; 16x16 sprite, to move = 2, to add = 14, 32x32 = 4,12, 64x64 = 8,8
%macro processcache4bs 1
xor al,al
add dh,dh
adc al,al
add dl,dl
adc al,al
add ch,ch
adc al,al
add cl,cl
adc al,al
mov [edi+%1],al
or al,al
jz %%zeroed
and byte[tiletypec],1
jmp %%nozeroed
%%zeroed
and byte[tiletypec],2
%%nozeroed
%endmacro
NEWSYM cachesprites
; initialize obj size cache
mov dword[.objptr],oamram
add dword[.objptr],512
mov esi,[.objptr]
mov al,[esi]
mov [.curobjtype],al
mov byte[.objleftinbyte],4
; Initialize oamram pointer
mov esi,oamram
add esi,2
; process pointers (.objptra = source, .objptrb = dest)
.trynextgroup
xor ebx,ebx
mov bx,[objptr]
mov ecx,ebx
shr ecx,4
mov [.nbg],cx
mov edi,[vram]
add edi,ebx
mov [.objptra],edi
shl ebx,1
add ebx,[vcache4b]
mov [.objptrb],ebx
xor ebx,ebx
mov bx,[objptrn]
mov ecx,ebx
shr ecx,4
mov [.nbg2],cx
mov edi,[vram]
add edi,ebx
mov [.objptra2],edi
shl ebx,1
add ebx,[vcache4b]
mov [.objptrb2],ebx
xor ebx,ebx
; process objects
mov dword[.sprnum],3
mov byte[.objleft],128
.nextobj
; process sprite sizes
test byte[.curobjtype],02h
jz .dosprsize1
mov al,[objsize2]
mov [.num2do],al
mov ax,[objadds2]
mov [.byte2add],ax
mov al,[objmovs2]
mov [.byte2move],al
mov [.byteb4add],al
jmp .exitsprsize
.dosprsize1
mov al,[objsize1]
mov [.num2do],al
mov ax,[objadds1]
mov [.byte2add],ax
mov al,[objmovs1]
mov [.byte2move],al
mov [.byteb4add],al
.exitsprsize
shr byte[.curobjtype],2
dec byte[.objleftinbyte]
jnz .skipobjproc
mov byte[.objleftinbyte],4
inc dword[.objptr]
mov ebx,[.objptr]
mov al,[ebx]
mov [.curobjtype],al
.skipobjproc
mov bx,[esi]
and bh,1h
mov [.curobj],bx
.nextobject
mov ebx,[.sprnum]
mov cl,[oamram+ebx-2]
mov ch,[curypos]
dec ch
cmp cl,ch
jb near .nocache
test byte[oamram+ebx],01h
jnz .namebase
xor ebx,ebx
mov bx,[.curobj]
mov cx,bx
add bx,bx
add bx,[.nbg]
and bx,4095
test word[vidmemch4+ebx],0101h
jz near .nocache
mov word[vidmemch4+ebx],0000h
mov [.sprfillpl],ebx
push esi
shl bx,4
mov esi,[vram]
add esi,ebx
add ebx,ebx
mov edi,[vcache4b]
add edi,ebx
jmp .nonamebase
.namebase
xor ebx,ebx
mov bx,[.curobj]
mov cx,bx
shl bx,1
add bx,[.nbg2]
and bx,4095
test word[vidmemch4+ebx],0101h
jz near .nocache
mov word[vidmemch4+ebx],0000h
mov [.sprfillpl],ebx
push esi
shl bx,4
mov esi,[vram]
add esi,ebx
add ebx,ebx
mov edi,[vcache4b]
add edi,ebx
.nonamebase
; convert from [esi] to [edi]
mov byte[.rowleft],8
mov byte[tiletypec],3
.donext
mov cx,[esi]
mov dx,[esi+16]
processcache4bs 0
processcache4bs 1
processcache4bs 2
processcache4bs 3
processcache4bs 4
processcache4bs 5
processcache4bs 6
processcache4bs 7
add edi,8
add esi,2
dec byte[.rowleft]
jnz near .donext
mov ebx,[.sprfillpl]
mov al,[tiletypec]
shr ebx,1
pop esi
mov [tltype4b+ebx],al
.nocache
inc word[.curobj]
dec byte[.byteb4add]
jnz .skipbyteadd
mov ax,[.byte2add]
add word[.curobj],ax
mov al,[.byte2move]
mov [.byteb4add],al
.skipbyteadd
dec byte[.num2do]
jnz near .nextobject
add esi,4
add dword[.sprnum],4
dec byte[.objleft]
jnz near .nextobj
ret
SECTION .data
.num2do dd 1
.byteb4add dd 2
SECTION .bss
.objptra resd 1
.objptrb resd 1
.nbg resd 1
.objptra2 resd 1
.objptrb2 resd 1
.nbg2 resd 1
.objleft resb 1
.rowleft resb 1
.a resd 1
.objptr resd 1
.objleftinbyte resd 1
.curobjtype resd 1
.curobj resd 1
.byte2move resd 1
.byte2add resd 1
.sprnum resd 1
.sprcheck resd 1
.sprfillpl resd 1
section .text
;*******************************************************
; Cache 2-Bit
;*******************************************************
NEWSYM cachetile2b
; Keep high word ecx 0
push eax
xor ecx,ecx
push edx
mov byte[.nextar],1
push ebx
; get tile info location
test al,20h
jnz .highptr
shl eax,6 ; x 64 for each line
add ax,[bgptr]
jmp .loptr
.highptr
and al,1Fh
shl eax,6 ; x 64 for each line
add ax,[bgptrc]
.loptr
add eax,[vram]
mov bx,[curtileptr]
shr bx,4
mov byte[.count],32
mov [.nbg],bx
; do loop
.cacheloop
mov si,[eax]
and esi,03FFh
add si,[.nbg]
and esi,4095
test byte[vidmemch2+esi],01h
jz near .nocache
mov byte[vidmemch2+esi],00h
mov edi,esi
shl esi,4
shl edi,6
add esi,[vram]
add edi,[vcache2b]
push eax
mov byte[.rowleft],8
.donext
mov cx,[esi]
processcache2b 0
processcache2b 1
processcache2b 2
processcache2b 3
processcache2b 4
processcache2b 5
processcache2b 6
processcache2b 7
add edi,8
add esi,2
dec byte[.rowleft]
jnz near .donext
pop eax
.nocache
add eax,2
dec byte[.count]
jnz near .cacheloop
cmp byte[.nextar],0
je .skipall
mov bx,[bgptrc]
cmp [bgptrd],bx
je .skipall
add eax,2048-64
mov byte[.count],32
mov byte[.nextar],0
jmp .cacheloop
.skipall
pop ebx
pop edx
pop eax
ret
section .bss
.nbg resw 1
.count resb 1
.a resb 1
.rowleft resb 1
.nextar resb 1
section .text
NEWSYM cache2bit
ret
;*******************************************************
; Cache 4-Bit
;*******************************************************
; esi = pointer to tile location vram
; edi = pointer to graphics data (cache & non-cache)
; ebx = external pointer
; tile value : bit 15 = flipy, bit 14 = flipx, bit 10-12 = palette, 0-9=tile#
NEWSYM cachetile4b
; Keep high word ecx 0
push eax
xor ecx,ecx
push edx
mov byte[.nextar],1
push ebx
; get tile info location
test al,20h
jnz .highptr
shl eax,6 ; x 64 for each line
add ax,[bgptr]
jmp .loptr
.highptr
and al,1Fh
shl eax,6 ; x 64 for each line
add ax,[bgptrc]
.loptr
add eax,[vram]
mov bx,[curtileptr]
shr bx,5
mov byte[.count],32
mov [.nbg],bx
; do loop
.cacheloop
mov si,[eax]
and esi,03FFh
add si,[.nbg]
shl esi,1
and esi,4095
test word[vidmemch4+esi],0101h
jz near .nocache
mov word[vidmemch4+esi],0000h
mov edi,esi
shl esi,4
shl edi,5
add esi,[vram]
add edi,[vcache4b]
push eax
mov byte[.rowleft],8
.donext
mov cx,[esi]
mov dx,[esi+16]
processcache4b 0
processcache4b 1
processcache4b 2
processcache4b 3
processcache4b 4
processcache4b 5
processcache4b 6
processcache4b 7
add edi,8
add esi,2
dec byte[.rowleft]
jnz near .donext
pop eax
.nocache
add eax,2
dec byte[.count]
jnz near .cacheloop
cmp byte[.nextar],0
je .skipall
mov bx,[bgptrc]
cmp [bgptrd],bx
je .skipall
add eax,2048-64
mov byte[.count],32
mov byte[.nextar],0
jmp .cacheloop
.skipall
pop ebx
pop edx
pop eax
ret
section .bss
.nbg resw 1
.count resb 1
.rowleft resb 1
.nextar resb 1
section .text
NEWSYM cache4bit
ret
;*******************************************************
; Cache 8-Bit
;*******************************************************
; tile value : bit 15 = flipy, bit 14 = flipx, bit 10-12 = palette, 0-9=tile#
NEWSYM cachetile8b
; Keep high word ecx 0
push eax
xor ecx,ecx
push edx
mov byte[.nextar],1
push ebx
; get tile info location
test al,20h
jnz .highptr
shl eax,6 ; x 64 for each line
add ax,[bgptr]
jmp .loptr
.highptr
and al,1Fh
shl eax,6 ; x 64 for each line
add ax,[bgptrc]
.loptr
add eax,[vram]
mov bx,[curtileptr]
shr bx,6
mov byte[.count],32
mov [.nbg],bx
; do loop
.cacheloop
mov si,[eax]
and esi,03FFh
add si,[.nbg]
shl esi,2
and esi,4095
test dword[vidmemch8+esi],01010101h
jz near .nocache
mov dword[vidmemch8+esi],00000000h
mov edi,esi
shl esi,4
shl edi,4
add esi,[vram]
add edi,[vcache8b]
push eax
mov byte[.rowleft],8
.donext
xor ah,ah
xor ebx,ebx
xor ecx,ecx
xor edx,edx
mov byte[.a],0
mov al,[esi] ; bitplane 0
cmp al,0
je .skipconva
test al,01h
jz .skipa0
or ah,01h
.skipa0
test al,02h
jz .skipa1
or bl,01h
.skipa1
test al,04h
jz .skipa2
or bh,01h
.skipa2
test al,08h
jz .skipa3
or cl,01h
.skipa3
test al,10h
jz .skipa4
or ch,01h
.skipa4
test al,20h
jz .skipa5
or dl,01h
.skipa5
test al,40h
jz .skipa6
or dh,01h
.skipa6
test al,80h
jz .skipa7
or byte[.a],01h
.skipa7
.skipconva
mov al,[esi+1] ; bitplane 1
cmp al,0
je .skipconvb
test al,01h
jz .skipb0
or ah,02h
.skipb0
test al,02h
jz .skipb1
or bl,02h
.skipb1
test al,04h
jz .skipb2
or bh,02h
.skipb2
test al,08h
jz .skipb3
or cl,02h
.skipb3
test al,10h
jz .skipb4
or ch,02h
.skipb4
test al,20h
jz .skipb5
or dl,02h
.skipb5
test al,40h
jz .skipb6
or dh,02h
.skipb6
test al,80h
jz .skipb7
or byte[.a],02h
.skipb7
.skipconvb
mov al,[esi+16] ; bitplane 2
cmp al,0
je .skipconvc
test al,01h
jz .skipc0
or ah,04h
.skipc0
test al,02h
jz .skipc1
or bl,04h
.skipc1
test al,04h
jz .skipc2
or bh,04h
.skipc2
test al,08h
jz .skipc3
or cl,04h
.skipc3
test al,10h
jz .skipc4
or ch,04h
.skipc4
test al,20h
jz .skipc5
or dl,04h
.skipc5
test al,40h
jz .skipc6
or dh,04h
.skipc6
test al,80h
jz .skipc7
or byte[.a],04h
.skipc7
.skipconvc
mov al,[esi+17] ; bitplane 3
cmp al,0
je .skipconvd
test al,01h
jz .skipd0
or ah,08h
.skipd0
test al,02h
jz .skipd1
or bl,08h
.skipd1
test al,04h
jz .skipd2
or bh,08h
.skipd2
test al,08h
jz .skipd3
or cl,08h
.skipd3
test al,10h
jz .skipd4
or ch,08h
.skipd4
test al,20h
jz .skipd5
or dl,08h
.skipd5
test al,40h
jz .skipd6
or dh,08h
.skipd6
test al,80h
jz .skipd7
or byte[.a],08h
.skipd7
.skipconvd
mov al,[esi+32] ; bitplane 4
cmp al,0
je .skipconve
test al,01h
jz .skipe0
or ah,10h
.skipe0
test al,02h
jz .skipe1
or bl,10h
.skipe1
test al,04h
jz .skipe2
or bh,10h
.skipe2
test al,08h
jz .skipe3
or cl,10h
.skipe3
test al,10h
jz .skipe4
or ch,10h
.skipe4
test al,20h
jz .skipe5
or dl,10h
.skipe5
test al,40h
jz .skipe6
or dh,10h
.skipe6
test al,80h
jz .skipe7
or byte[.a],10h
.skipe7
.skipconve
mov al,[esi+33] ; bitplane 5
cmp al,0
je .skipconvf
test al,01h
jz .skipf0
or ah,20h
.skipf0
test al,02h
jz .skipf1
or bl,20h
.skipf1
test al,04h
jz .skipf2
or bh,20h
.skipf2
test al,08h
jz .skipf3
or cl,20h
.skipf3
test al,10h
jz .skipf4
or ch,20h
.skipf4
test al,20h
jz .skipf5
or dl,20h
.skipf5
test al,40h
jz .skipf6
or dh,20h
.skipf6
test al,80h
jz .skipf7
or byte[.a],20h
.skipf7
.skipconvf
mov al,[esi+48] ; bitplane 6
cmp al,0
je .skipconvg
test al,01h
jz .skipg0
or ah,40h
.skipg0
test al,02h
jz .skipg1
or bl,40h
.skipg1
test al,04h
jz .skipg2
or bh,40h
.skipg2
test al,08h
jz .skipg3
or cl,40h
.skipg3
test al,10h
jz .skipg4
or ch,40h
.skipg4
test al,20h
jz .skipg5
or dl,40h
.skipg5
test al,40h
jz .skipg6
or dh,40h
.skipg6
test al,80h
jz .skipg7
or byte[.a],40h
.skipg7
.skipconvg
mov al,[esi+49] ; bitplane 7
cmp al,0
je .skipconvh
test al,01h
jz .skiph0
or ah,80h
.skiph0
test al,02h
jz .skiph1
or bl,80h
.skiph1
test al,04h
jz .skiph2
or bh,80h
.skiph2
test al,08h
jz .skiph3
or cl,80h
.skiph3
test al,10h
jz .skiph4
or ch,80h
.skiph4
test al,20h
jz .skiph5
or dl,80h
.skiph5
test al,40h
jz .skiph6
or dh,80h
.skiph6
test al,80h
jz .skiph7
or byte[.a],80h
.skiph7
.skipconvh
; move all bytes into [edi]
mov [edi+7],ah
mov [edi+6],bl
mov [edi+5],bh
mov [edi+4],cl
mov [edi+3],ch
mov [edi+2],dl
mov [edi+1],dh
mov al,[.a]
mov [edi],al
add edi,8
add esi,2
dec byte[.rowleft]
jnz near .donext
pop eax
.nocache
add eax,2
dec byte[.count]
jnz near .cacheloop
cmp byte[.nextar],0
je .skipall
mov bx,[bgptrc]
cmp [bgptrd],bx
je .skipall
add eax,2048-64
mov byte[.count],32
mov byte[.nextar],0
jmp .cacheloop
.skipall
pop ebx
pop edx
pop eax
ret
section .bss
.nbg resw 1
.count resb 1
.a resb 1
.rowleft resb 1
.nextar resb 1
section .text
NEWSYM cache8bit
ret
;*******************************************************
; Cache 2-Bit 16x16 tiles
;*******************************************************
NEWSYM cachetile2b16x16
; Keep high word ecx 0
push eax
xor ecx,ecx
push edx
mov byte[.nextar],1
push ebx
; get tile info location
test al,20h
jnz .highptr
shl eax,6 ; x 64 for each line
add ax,[bgptr]
jmp .loptr
.highptr
and al,1Fh
shl eax,6 ; x 64 for each line
add ax,[bgptrc]
.loptr
add eax,[vram]
mov bx,[curtileptr]
shr bx,4
mov byte[.count],32
mov [.nbg],bx
; do loop
.cacheloop
mov si,[eax]
and esi,03FFh
add si,[.nbg]
mov byte[.tileleft],4
.nextof4
and esi,4095
test byte[vidmemch2+esi],01h
jz near .nocache
mov byte[vidmemch2+esi],00h
push esi
mov edi,esi
shl esi,4
shl edi,6
add esi,[vram]
add edi,[vcache2b]
push eax
mov byte[.rowleft],8
.donext
mov cx,[esi]
processcache2b 0
processcache2b 1
processcache2b 2
processcache2b 3
processcache2b 4
processcache2b 5
processcache2b 6
processcache2b 7
add edi,8
add esi,2
dec byte[.rowleft]
jnz near .donext
pop eax
pop esi
.nocache
inc esi
cmp byte[.tileleft],3
jne .noadd
add esi,14
.noadd
dec byte[.tileleft]
jnz near .nextof4
add eax,2
dec byte[.count]
jnz near .cacheloop
cmp byte[.nextar],0
je .skipall
mov bx,[bgptrc]
cmp [bgptrd],bx
je .skipall
add eax,2048-64
mov byte[.count],32
mov byte[.nextar],0
jmp .cacheloop
.skipall
pop ebx
pop edx
pop eax
ret
section .bss
.nbg resw 1
.count resb 1
.a resb 1
.rowleft resb 1
.nextar resb 1
.tileleft resb 1
section .text
NEWSYM cache2bit16x16
ret
;*******************************************************
; Cache 4-Bit 16x16 tiles
;*******************************************************
NEWSYM cachetile4b16x16
; Keep high word ecx 0
push eax
xor ecx,ecx
push edx
mov byte[.nextar],1
push ebx
; get tile info location
test al,20h
jnz .highptr
shl eax,6 ; x 64 for each line
add ax,[bgptr]
jmp .loptr
.highptr
and al,1Fh
shl eax,6 ; x 64 for each line
add ax,[bgptrc]
.loptr
add eax,[vram]
mov bx,[curtileptr]
shr bx,5
mov byte[.count],32
mov [.nbg],bx
; do loop
.cacheloop
mov si,[eax]
and esi,03FFh
add si,[.nbg]
shl esi,1
mov byte[.tileleft],4
.nextof4
and esi,4095
test word[vidmemch4+esi],0101h
jz near .nocache
mov word[vidmemch4+esi],0000h
push esi
mov edi,esi
shl esi,4
shl edi,5
add esi,[vram]
add edi,[vcache4b]
push eax
mov byte[.rowleft],8
.donext
mov cx,[esi]
mov dx,[esi+16]
processcache4b 0
processcache4b 1
processcache4b 2
processcache4b 3
processcache4b 4
processcache4b 5
processcache4b 6
processcache4b 7
add edi,8
add esi,2
dec byte[.rowleft]
jnz near .donext
pop eax
pop esi
.nocache
add esi,2
cmp byte[.tileleft],3
jne .noadd
add esi,28
.noadd
dec byte[.tileleft]
jnz near .nextof4
add eax,2
dec byte[.count]
jnz near .cacheloop
cmp byte[.nextar],0
je .skipall
mov bx,[bgptrc]
cmp [bgptrd],bx
je .skipall
add eax,2048-64
mov byte[.count],32
mov byte[.nextar],0
jmp .cacheloop
.skipall
pop ebx
pop edx
pop eax
ret
section .bss
.nbg resw 1
.count resb 1
.rowleft resb 1
.nextar resb 1
.tileleft resb 1
section .text
NEWSYM cache4bit16x16
ret
;*******************************************************
; Cache 8-Bit 16x16 tiles
;*******************************************************
NEWSYM cachetile8b16x16
; Keep high word ecx 0
push eax
xor ecx,ecx
push edx
mov byte[.nextar],1
push ebx
; get tile info location
test al,20h
jnz .highptr
shl eax,6 ; x 64 for each line
add ax,[bgptr]
jmp .loptr
.highptr
and al,1Fh
shl eax,6 ; x 64 for each line
add ax,[bgptrc]
.loptr
add eax,[vram]
mov bx,[curtileptr]
shr bx,6
mov byte[.count],32
mov [.nbg],bx
; do loop
.cacheloop
mov si,[eax]
and esi,03FFh
add si,[.nbg]
shl esi,2
mov byte[.tileleft],4
.nextof4
and esi,4095
test dword[vidmemch8+esi],01010101h
jz near .nocache
mov dword[vidmemch8+esi],00000000h
push esi
mov edi,esi
shl esi,4
shl edi,4
add esi,[vram]
add edi,[vcache8b]
push eax
mov byte[.rowleft],8
.donext
xor ah,ah
xor ebx,ebx
xor ecx,ecx
xor edx,edx
mov byte[.a],0
mov al,[esi] ; bitplane 0
cmp al,0
je .skipconva
test al,01h
jz .skipa0
or ah,01h
.skipa0
test al,02h
jz .skipa1
or bl,01h
.skipa1
test al,04h
jz .skipa2
or bh,01h
.skipa2
test al,08h
jz .skipa3
or cl,01h
.skipa3
test al,10h
jz .skipa4
or ch,01h
.skipa4
test al,20h
jz .skipa5
or dl,01h
.skipa5
test al,40h
jz .skipa6
or dh,01h
.skipa6
test al,80h
jz .skipa7
or byte[.a],01h
.skipa7
.skipconva
mov al,[esi+1] ; bitplane 1
cmp al,0
je .skipconvb
test al,01h
jz .skipb0
or ah,02h
.skipb0
test al,02h
jz .skipb1
or bl,02h
.skipb1
test al,04h
jz .skipb2
or bh,02h
.skipb2
test al,08h
jz .skipb3
or cl,02h
.skipb3
test al,10h
jz .skipb4
or ch,02h
.skipb4
test al,20h
jz .skipb5
or dl,02h
.skipb5
test al,40h
jz .skipb6
or dh,02h
.skipb6
test al,80h
jz .skipb7
or byte[.a],02h
.skipb7
.skipconvb
mov al,[esi+16] ; bitplane 2
cmp al,0
je .skipconvc
test al,01h
jz .skipc0
or ah,04h
.skipc0
test al,02h
jz .skipc1
or bl,04h
.skipc1
test al,04h
jz .skipc2
or bh,04h
.skipc2
test al,08h
jz .skipc3
or cl,04h
.skipc3
test al,10h
jz .skipc4
or ch,04h
.skipc4
test al,20h
jz .skipc5
or dl,04h
.skipc5
test al,40h
jz .skipc6
or dh,04h
.skipc6
test al,80h
jz .skipc7
or byte[.a],04h
.skipc7
.skipconvc
mov al,[esi+17] ; bitplane 3
cmp al,0
je .skipconvd
test al,01h
jz .skipd0
or ah,08h
.skipd0
test al,02h
jz .skipd1
or bl,08h
.skipd1
test al,04h
jz .skipd2
or bh,08h
.skipd2
test al,08h
jz .skipd3
or cl,08h
.skipd3
test al,10h
jz .skipd4
or ch,08h
.skipd4
test al,20h
jz .skipd5
or dl,08h
.skipd5
test al,40h
jz .skipd6
or dh,08h
.skipd6
test al,80h
jz .skipd7
or byte[.a],08h
.skipd7
.skipconvd
mov al,[esi+32] ; bitplane 4
cmp al,0
je .skipconve
test al,01h
jz .skipe0
or ah,10h
.skipe0
test al,02h
jz .skipe1
or bl,10h
.skipe1
test al,04h
jz .skipe2
or bh,10h
.skipe2
test al,08h
jz .skipe3
or cl,10h
.skipe3
test al,10h
jz .skipe4
or ch,10h
.skipe4
test al,20h
jz .skipe5
or dl,10h
.skipe5
test al,40h
jz .skipe6
or dh,10h
.skipe6
test al,80h
jz .skipe7
or byte[.a],10h
.skipe7
.skipconve
mov al,[esi+33] ; bitplane 5
cmp al,0
je .skipconvf
test al,01h
jz .skipf0
or ah,20h
.skipf0
test al,02h
jz .skipf1
or bl,20h
.skipf1
test al,04h
jz .skipf2
or bh,20h
.skipf2
test al,08h
jz .skipf3
or cl,20h
.skipf3
test al,10h
jz .skipf4
or ch,20h
.skipf4
test al,20h
jz .skipf5
or dl,20h
.skipf5
test al,40h
jz .skipf6
or dh,20h
.skipf6
test al,80h
jz .skipf7
or byte[.a],20h
.skipf7
.skipconvf
mov al,[esi+48] ; bitplane 6
cmp al,0
je .skipconvg
test al,01h
jz .skipg0
or ah,40h
.skipg0
test al,02h
jz .skipg1
or bl,40h
.skipg1
test al,04h
jz .skipg2
or bh,40h
.skipg2
test al,08h
jz .skipg3
or cl,40h
.skipg3
test al,10h
jz .skipg4
or ch,40h
.skipg4
test al,20h
jz .skipg5
or dl,40h
.skipg5
test al,40h
jz .skipg6
or dh,40h
.skipg6
test al,80h
jz .skipg7
or byte[.a],40h
.skipg7
.skipconvg
mov al,[esi+49] ; bitplane 7
cmp al,0
je .skipconvh
test al,01h
jz .skiph0
or ah,80h
.skiph0
test al,02h
jz .skiph1
or bl,80h
.skiph1
test al,04h
jz .skiph2
or bh,80h
.skiph2
test al,08h
jz .skiph3
or cl,80h
.skiph3
test al,10h
jz .skiph4
or ch,80h
.skiph4
test al,20h
jz .skiph5
or dl,80h
.skiph5
test al,40h
jz .skiph6
or dh,80h
.skiph6
test al,80h
jz .skiph7
or byte[.a],80h
.skiph7
.skipconvh
; move all bytes into [edi]
mov [edi+7],ah
mov [edi+6],bl
mov [edi+5],bh
mov [edi+4],cl
mov [edi+3],ch
mov [edi+2],dl
mov [edi+1],dh
mov al,[.a]
mov [edi],al
add edi,8
add esi,2
dec byte[.rowleft]
jnz near .donext
pop eax
pop esi
.nocache
add esi,4
cmp byte[.tileleft],3
jne .noadd
add esi,56
.noadd
dec byte[.tileleft]
jnz near .nextof4
add eax,2
dec byte[.count]
jnz near .cacheloop
cmp byte[.nextar],0
je .skipall
mov bx,[bgptrc]
cmp [bgptrd],bx
je .skipall
add eax,2048-64
mov byte[.count],32
mov byte[.nextar],0
jmp .cacheloop
.skipall
pop ebx
pop edx
pop eax
ret
section .bss
.nbg resw 1
.count resb 1
.a resb 1
.rowleft resb 1
.nextar resb 1
.tileleft resb 1
section .text
NEWSYM cache8bit16x16
ret
NEWSYM cachesingle
cmp byte[offsetmshl],1
je near cachesingle4b
cmp byte[offsetmshl],2
je near cachesingle2b
ret
%macro processcache4b2 1
xor al,al
add dh,dh
adc al,al
add dl,dl
adc al,al
add ch,ch
adc al,al
add cl,cl
adc al,al
mov [edi+%1],al
%endmacro
NEWSYM cachesingle4b
mov word[ebx],0
sub ebx,vidmemch4
push edi
mov edi,ebx
shl edi,5 ; cached ram
shl ebx,4 ; vram
add edi,[vcache4b]
add ebx,[vram]
push eax
push edx
mov byte[scacheloop],8
.nextline
mov cx,[ebx]
mov dx,[ebx+16]
processcache4b2 0
processcache4b2 1
processcache4b2 2
processcache4b2 3
processcache4b2 4
processcache4b2 5
processcache4b2 6
processcache4b2 7
add ebx,2
add edi,8
dec byte[scacheloop]
jnz near .nextline
pop edx
pop eax
pop edi
ret
NEWSYM cachesingle2b
ret
section .bss
NEWSYM scacheloop, resb 1
NEWSYM tiletypec, resb 1
section .text
%macro processcache4b3 1
xor al,al
add dh,dh
adc al,al
add dl,dl
adc al,al
add bh,bh
adc al,al
add bl,bl
adc al,al
mov [edi+%1],al
or al,al
jz %%zeroed
and byte[tiletypec],1
jmp %%nozeroed
%%zeroed
and byte[tiletypec],2
%%nozeroed
%endmacro
NEWSYM cachesingle4bng
mov word[vidmemch4+ecx*2],0
mov byte[tiletypec],3
push edi
push eax
push ecx
push ebx
push edx
mov edi,ecx
shl edi,6 ; cached ram
shl ecx,5 ; vram
add edi,[vcache4b]
add ecx,[vram]
mov byte[scacheloop],8
.nextline
mov bx,[ecx]
mov dx,[ecx+16]
processcache4b3 0
processcache4b3 1
processcache4b3 2
processcache4b3 3
processcache4b3 4
processcache4b3 5
processcache4b3 6
processcache4b3 7
add ecx,2
add edi,8
dec byte[scacheloop]
jnz near .nextline
pop edx
pop ebx
pop ecx
mov al,[tiletypec]
mov [tltype4b+ecx],al
pop eax
pop edi
ret
%macro processcache2b3 1
xor al,al
add bh,bh
adc al,al
add bl,bl
adc al,al
mov [edi+%1],al
or al,al
jz %%zeroed
and byte[tiletypec],1
jmp %%nozeroed
%%zeroed
and byte[tiletypec],2
%%nozeroed
%endmacro
NEWSYM cachesingle2bng
mov byte[vidmemch2+ecx],0
mov byte[tiletypec],3
push edi
push eax
push ecx
push ebx
push edx
mov edi,ecx
shl edi,6 ; cached ram
shl ecx,4 ; vram
add edi,[vcache2b]
add ecx,[vram]
mov byte[scacheloop],8
.nextline
mov bx,[ecx]
processcache2b3 0
processcache2b3 1
processcache2b3 2
processcache2b3 3
processcache2b3 4
processcache2b3 5
processcache2b3 6
processcache2b3 7
add ecx,2
add edi,8
dec byte[scacheloop]
jnz near .nextline
pop edx
pop ebx
pop ecx
mov al,[tiletypec]
mov [tltype2b+ecx],al
pop eax
pop edi
ret
%macro processcache8b3 1
xor esi,esi
add ch,ch
adc esi,esi
add cl,cl
adc esi,esi
add dh,dh
adc esi,esi
add dl,dl
adc esi,esi
add ah,ah
adc esi,esi
add al,al
adc esi,esi
add bh,bh
adc esi,esi
add bl,bl
adc esi,esi
push eax
mov eax,esi
mov [edi+%1],al
or al,al
jz %%zeroed
and byte[tiletypec],1
jmp %%nozeroed
%%zeroed
and byte[tiletypec],2
%%nozeroed
pop eax
%endmacro
NEWSYM cachesingle8bng
mov dword[vidmemch8+ecx*4],0
mov byte[tiletypec],3
push esi
push edi
push eax
push ecx
push ebx
push edx
mov edi,ecx
shl edi,6 ; cached ram
shl ecx,6 ; vram
add edi,[vcache8b]
add ecx,[vram]
mov byte[scacheloop],8
.nextline
mov bx,[ecx]
mov ax,[ecx+16]
mov dx,[ecx+32]
push ecx
mov cx,[ecx+48]
processcache8b3 0
processcache8b3 1
processcache8b3 2
processcache8b3 3
processcache8b3 4
processcache8b3 5
processcache8b3 6
processcache8b3 7
pop ecx
add ecx,2
add edi,8
dec byte[scacheloop]
jnz near .nextline
pop edx
pop ebx
pop ecx
mov al,[tiletypec]
mov [tltype8b+ecx],al
pop eax
pop edi
pop esi
ret
SECTION .bss
NEWSYM dcolortab, resd 256
SECTION .data
NEWSYM ExitFromGUI, db 0
NEWSYM videotroub, dd 0
NEWSYM TripBufAvail, db 0
NEWSYM vesa2_clbit, dd 0 ; clear all bit 0's if AND is used
NEWSYM vesa2_rpos, dd 0 ; Red bit position
NEWSYM vesa2_gpos, dd 0 ; Green bit position
NEWSYM vesa2_bpos, dd 0 ; Blue bit position
NEWSYM vesa2_clbitng, dd 0 ; clear all bit 0's if AND is used
NEWSYM vesa2_clbitng2, dd 0,0 ; clear all bit 0's if AND is used
NEWSYM vesa2_clbitng3, dd 0 ; clear all bit 0's if AND is used
NEWSYM vesa2red10, dd 0 ; red position at bit 10
NEWSYM vesa2_rtrcl, dd 0 ; red transparency clear (bit+4)
NEWSYM vesa2_rtrcla, dd 0 ; red transparency (AND) clear (not(bit+4))
NEWSYM vesa2_rfull, dd 0 ; red max (or bit*1Fh)
NEWSYM vesa2_gtrcl, dd 0 ; red transparency clear (bit+4)
NEWSYM vesa2_gtrcla, dd 0 ; red transparency (AND) clear (not(bit+4))
NEWSYM vesa2_gfull, dd 0 ; red max (or bit*1Fh)
NEWSYM vesa2_btrcl, dd 0 ; red transparency clear (bit+4)
NEWSYM vesa2_btrcla, dd 0 ; red transparency (AND) clear (not(bit+4))
NEWSYM vesa2_bfull, dd 0 ; red max (or bit*1Fh)
NEWSYM vesa2_x, dd 320 ; Desired screen width
NEWSYM vesa2_y, dd 240 ; Height
NEWSYM vesa2_bits, dd 8 ; Bits per pixel
NEWSYM vesa2_rposng, dd 0 ; Red bit position
NEWSYM vesa2_gposng, dd 0 ; Green bit position
NEWSYM vesa2_bposng, dd 0 ; Blue bit position
NEWSYM vesa2_usbit, dd 0 ; Unused bit in proper bit location
NEWSYM ErrorPointer, dd 0
SECTION .text
NEWSYM genfulladdtab
; Write to buffer
cmp byte[newengen],1
jne .notneweng
cmp byte[vesa2red10],0
jne near genfulladdtabred
.notneweng
xor ecx,ecx
.loopers
mov ax,cx
test [vesa2_rtrcl],cx
jz .nor
and ax,[vesa2_rtrcla]
or ax,[vesa2_rfull]
.nor
test [vesa2_gtrcl],cx
jz .nog
and ax,[vesa2_gtrcla]
or ax,[vesa2_gfull]
.nog
test [vesa2_btrcl],cx
jz .nob
and ax,[vesa2_btrcla]
or ax,[vesa2_bfull]
.nob
shl ax,1
mov [fulladdtab+ecx*2],ax
dec cx
jnz .loopers
ret
NEWSYM genfulladdtabred
NEWSYM genfulladdtabng
; Write to buffer
xor ecx,ecx
.loopers
mov ax,cx
test cx,0100000000000000b
jz .nor
and ax,1011111111111111b
or ax, 0011110000000000b
.nor
test cx,0000001000000000b
jz .nog
and ax,1111110111111111b
or ax, 0000000111100000b
.nog
test cx,0000000000010000b
jz .nob
and ax,1111111111101111b
or ax, 0000000000001111b
.nob
shl ax,1
mov [fulladdtab+ecx*2],ax
dec cx
jnz .loopers
ret