2586 lines
58 KiB
NASM
2586 lines
58 KiB
NASM
;Copyright (C) 1997-2006 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
|
|
;
|
|
;http://www.zsnes.com
|
|
;http://sourceforge.net/projects/zsnes
|
|
;
|
|
;This program is free software; you can redistribute it and/or
|
|
;modify it under the terms of the GNU General Public License
|
|
;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 DosExit,UpdateDevices,Makemode7Table,MusicRelVol,MusicVol,makesprprtable
|
|
EXTSYM romloadskip,start65816,startdebugger,SfxR0,showinfogui,inittable
|
|
EXTSYM SA1inittable,MessageOn,Msgptr,MsgCount,sndrot,SnowTimer,inittableb
|
|
EXTSYM inittablec,newgfx16b,cfgreinittime,Open_File,Read_File,Write_File
|
|
EXTSYM Close_File,Output_Text,Change_Dir,Create_File,SPCDisable,osm2dis
|
|
EXTSYM BackupSystemVars,SnowData,SnowVelDist,cvidmode,newengen,cfgnewgfx
|
|
EXTSYM GUI16VID,NewEngEnForce,TextFile,Setper2exec,JoyRead,pressed,pl3Ak,pl3Bk
|
|
EXTSYM pl3Lk,pl3Rk,pl3Xk,pl3Yk,pl3contrl,pl3downk,pl3leftk,pl3rightk,pl3selk
|
|
EXTSYM pl3startk,pl3upk,pl4Ak,pl4Bk,pl4Lk,pl4Rk,pl4Xk,pl4Yk,pl4contrl,pl4downk
|
|
EXTSYM pl4leftk,pl4rightk,pl4selk,pl4startk,pl4upk,mousebuttons,mousexdir,pl5Ak
|
|
EXTSYM pl5Bk,pl5Lk,pl5Rk,pl5Xk,pl5Yk,pl5contrl,pl5downk,pl5leftk,pl5rightk
|
|
EXTSYM pl5selk,pl5startk,pl5upk,mouseydir,mousexpos,mouseypos,sram
|
|
EXTSYM ssautosw,GUIDelayB,pl12s34,pl1Xtk,pl1Ytk,pl1Atk,pl1Btk
|
|
EXTSYM pl2Xtk,pl2Ytk,pl2Atk,pl2Btk,pl3Xtk,pl3Ytk,pl3Atk,pl3Btk,pl4Xtk,pl4Ytk
|
|
EXTSYM pl4Atk,pl4Btk,pl1ULk,pl1URk,pl1DLk,pl1DRk,pl2ULk,pl2URk,pl2DLk,pl2DRk
|
|
EXTSYM pl3ULk,pl3URk,pl3DLk,pl3DRk,pl4ULk,pl4URk,pl4DLk,pl4DRk,pl5ULk,pl5URk
|
|
EXTSYM pl5DLk,pl5DRk,pl5Xtk,pl5Ytk,pl5Atk,pl5Btk,pl1Ltk,pl1Rtk,pl2Ltk,pl2Rtk
|
|
EXTSYM pl3Ltk,pl3Rtk,pl4Ltk,pl4Rtk,pl5Ltk,pl5Rtk,Turbo30hz,NumComboLocl
|
|
EXTSYM ComboBlHeader,ComboHeader,CombinDataLocl,CombinDataGlob,NumCombo
|
|
EXTSYM GUIComboGameSpec,mousexloc,mouseyloc,extlatch,FIRTAPVal0,FIRTAPVal1
|
|
EXTSYM FIRTAPVal2,FIRTAPVal3,FIRTAPVal4,FIRTAPVal5,FIRTAPVal6,FIRTAPVal7,INTEnab
|
|
EXTSYM JoyAPos,JoyBPos,NMIEnab,SPCROM,VIRQLoc,coladdb,coladdg,coladdr,doirqnext
|
|
EXTSYM forceblnk,nmiprevaddrh,nmiprevaddrl,nmiprevline,nmirept,nmistatus
|
|
EXTSYM opexec268,opexec268b,opexec268cph,opexec268cphb,opexec358,opexec358b
|
|
EXTSYM opexec358cph,spcextraram,opexec358cphb,prevoamptr,reg1read,reg2read
|
|
EXTSYM reg3read,reg4read,resolutn,romdata,scrndis,spcP,SPCRAM,spcnumread
|
|
EXTSYM tableD,timeron,vidbright,SPC700read,SPC700write,spc700read
|
|
EXTSYM GUIReset,InitC4,SA1Reset,SetAddressingModesSA1,SDD1BankA,SPC7110init
|
|
EXTSYM RTCinit,InitOBC,memaccessspc7110r8,memaccessspc7110r16,memaccessspc7110w8
|
|
EXTSYM memaccessspc7110w16,ram7f,snesmap2,snesmmap,MultiTap,memaccessbankr848mb
|
|
EXTSYM memaccessbankr1648mb,procexecloop,ram7fa,wramdata,wramdataa,fname,fnames
|
|
EXTSYM GetCurDir,SRAMChdir,cfgloadsdir,fnamest,statefileloc,InitDir,InitDrive
|
|
EXTSYM curromspace,infoloc,patchfile,romispal,initregr,initregw,memtabler16
|
|
EXTSYM memtabler8,memtablew16,memtablew8,sfxramdata,wramreadptr
|
|
EXTSYM wramwriteptr,loadstate2,CMovieExt,MoviePlay,MovieDumpRaw,AllowUDLR
|
|
EXTSYM device1,device2,processmouse1,processmouse2
|
|
|
|
;initc.c
|
|
EXTSYM clearmem,clearSPCRAM,PatchUsingIPS,ZOpenFileName,loadROM,SPC7110IndexSize
|
|
EXTSYM SPC7PackIndexLoad,IntlEHi,C4Enable,SPC7110Enable,RTCEnable,SA1Enable
|
|
EXTSYM SDD1Enable,OBCEnable,SFXEnable,BSEnable,clearvidsound,headerhack,SetupROM
|
|
|
|
%ifdef __UNIXSDL__
|
|
EXTSYM LoadDir,popdir,pushdir
|
|
%endif
|
|
|
|
; Initiation
|
|
|
|
SECTION .data
|
|
NEWSYM regsbackup, times 3019 db 0
|
|
NEWSYM forceromtype, db 0
|
|
NEWSYM loadedfromgui, db 0
|
|
NEWSYM SnowOn, db 0
|
|
NEWSYM bgfixer, db 0
|
|
NEWSYM bgfixer2, db 0
|
|
NEWSYM ReInitLength, dd 0
|
|
NEWSYM ForceNewGfxOff, dd 0
|
|
NEWSYM SfxAC, db 0
|
|
blah times 450 db 0
|
|
; FIX STATMAT
|
|
NEWSYM autoloadstate, db 0 ; auto load state slot number
|
|
NEWSYM autoloadmovie, db 0
|
|
NEWSYM ZMVRawDump, db 0
|
|
|
|
NEWSYM EndMessage
|
|
db ' ',13,10,0
|
|
|
|
SECTION .text
|
|
|
|
EXTSYM cpalval
|
|
NEWSYM init
|
|
; prevents a crash if cpalval gets accessed before initializing
|
|
mov eax,cpalval
|
|
mov ecx,256
|
|
.looppal
|
|
mov dword[eax],cpalval
|
|
add eax,4
|
|
dec ecx
|
|
jnz .looppal
|
|
|
|
; Initialize snow stuff
|
|
mov ecx,400
|
|
xor edx,edx
|
|
.snowloop
|
|
shl word[SnowData+edx*2],8
|
|
and byte[SnowVelDist+edx],0F7h
|
|
cmp dword[SnowTimer],0
|
|
jne .skip
|
|
or byte[SnowVelDist+edx],08h
|
|
.skip
|
|
inc edx
|
|
dec ecx
|
|
jnz .snowloop
|
|
|
|
pushad
|
|
call BackupSystemVars
|
|
popad
|
|
|
|
xor eax,eax
|
|
mov al,[cfgreinittime]
|
|
mov ebx,50
|
|
mul ebx
|
|
mov [ReInitLength],eax
|
|
|
|
xor eax,eax
|
|
mov al,[romtype]
|
|
mov [forceromtype],al
|
|
mov byte[romtype],0
|
|
mov ax,ds
|
|
mov es,ax
|
|
mov eax,regsbackup
|
|
mov ebx,sndrot
|
|
mov ecx,3019
|
|
.rbackupl
|
|
mov dl,[ebx]
|
|
mov [eax],dl
|
|
inc ebx
|
|
inc eax
|
|
dec ecx
|
|
jnz .rbackupl
|
|
mov byte[virqnodisable],0
|
|
pushad
|
|
call clearmem
|
|
popad
|
|
call inittable
|
|
call inittableb
|
|
call inittablec
|
|
call SA1inittable
|
|
; SPC Init
|
|
pushad
|
|
call procexecloop
|
|
popad
|
|
; SNES Init
|
|
pushad
|
|
call Setper2exec
|
|
popad
|
|
call Makemode7Table
|
|
call makesprprtable
|
|
cmp byte[fname],0
|
|
jne .found
|
|
cmp byte[romloadskip],1
|
|
je .noloadfile
|
|
.found
|
|
mov byte[romloadskip],0
|
|
call loadfile
|
|
pushad
|
|
call SetupROM
|
|
call showinfogui
|
|
popad
|
|
.noloadfile
|
|
call UpdateDevices
|
|
call init65816
|
|
call initregr
|
|
call initregw
|
|
call initsnes
|
|
|
|
; Initialize volume
|
|
xor eax,eax
|
|
xor edx,edx
|
|
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
|
|
|
|
; FIX STATMAT
|
|
; Here's the auto-load ZST file stuff
|
|
cmp byte[autoloadstate],1
|
|
jl .noautoloadstate
|
|
je .enddigits
|
|
mov ebx,[statefileloc]
|
|
sub byte[autoloadstate],1
|
|
cmp byte[autoloadstate],10
|
|
jge .2digits
|
|
mov al,[autoloadstate]
|
|
add al,48
|
|
mov [fnamest+ebx],al
|
|
jmp .enddigits
|
|
.2digits
|
|
xor eax,eax
|
|
mov al,[autoloadstate]
|
|
mov dl,10
|
|
div dl
|
|
add al,48
|
|
add ah,48
|
|
mov [fnamest+ebx-1],al
|
|
mov [fnamest+ebx],ah
|
|
.enddigits
|
|
|
|
; Load the specified state file
|
|
pushad
|
|
call loadstate2
|
|
popad
|
|
|
|
; Just skip the extension re-setup below if we don't need to do it
|
|
cmp byte[autoloadstate],9
|
|
jbe .noautoloadstate
|
|
|
|
; Put back the 'ST' on the end of the extension as we changed it
|
|
; above (by placing two digits in the extension). This is so
|
|
; as not to break any other code later on which depends
|
|
; on it being present.
|
|
mov ebx,[statefileloc]
|
|
%ifdef __UNIXSDL__
|
|
mov word[fnamest+ebx-1],'st'
|
|
%else
|
|
mov word[fnamest+ebx-1],'ST'
|
|
%endif
|
|
|
|
.noautoloadstate
|
|
|
|
cmp byte[autoloadmovie],1
|
|
jb .noautloadmovie
|
|
cmp byte[autoloadmovie],10
|
|
ja .noautloadmovie
|
|
mov al,[autoloadmovie]
|
|
add al,'0'-1
|
|
cmp al,'0'
|
|
jne .notzero1
|
|
mov al,'v'
|
|
.notzero1
|
|
mov [CMovieExt],al
|
|
|
|
pushad
|
|
cmp byte[ZMVRawDump],1
|
|
jne .norawdump
|
|
call MovieDumpRaw
|
|
jmp .aftermovieplay
|
|
.norawdump
|
|
call MoviePlay
|
|
.aftermovieplay
|
|
popad
|
|
|
|
.noautloadmovie
|
|
|
|
xor eax,eax
|
|
mov al,[cvidmode]
|
|
cmp byte[GUI16VID+eax],1
|
|
je .yes16b
|
|
mov byte[newengen],1
|
|
mov byte[cfgnewgfx],1
|
|
.yes16b
|
|
cmp byte[NewEngEnForce],1
|
|
jne .noforce
|
|
mov byte[NewEngEnForce],0
|
|
mov byte[newengen],1
|
|
mov byte[cfgnewgfx],1
|
|
.noforce
|
|
mov ebx,ebm
|
|
mov eax,EndMessage
|
|
mov dh,17h
|
|
mov ch,67
|
|
mov cl,1
|
|
.loopen
|
|
mov dl,[ebx]
|
|
rol dl,cl
|
|
xor dl,dh
|
|
mov [eax],dl
|
|
rol dh,1
|
|
inc cl
|
|
or cl,cl
|
|
jne .notzero
|
|
inc cl
|
|
.notzero
|
|
and cl,07h
|
|
inc eax
|
|
inc ebx
|
|
dec ch
|
|
jnz .loopen
|
|
|
|
cmp byte[yesoutofmemory],1
|
|
jne .noout
|
|
call outofmemfix
|
|
.noout
|
|
cmp byte[debugger],0
|
|
je near start65816
|
|
cmp byte[romloadskip],1
|
|
je near start65816
|
|
jmp startdebugger
|
|
|
|
EndMessageB
|
|
|
|
; global variables
|
|
|
|
SECTION .data
|
|
|
|
; Controls
|
|
;FIXME: define pl3contrl, pl4contrl and pl5contrl here?
|
|
;Christophe 2001/03/10
|
|
NEWSYM numjoy, db 0 ; number of joysticks (1 = 1, 2 = 2)
|
|
; 0 = Disable, 1 = Keyboard, 2 = Joystick, 3 = Gamepad
|
|
; 4 = 4-button 5 = 6-button 6 = sidewinder
|
|
NEWSYM pl1contrl, db 1 ; player 1 device
|
|
NEWSYM pl1keya, dd 0
|
|
NEWSYM pl1keyb, dd 0
|
|
%ifdef __MSDOS__
|
|
NEWSYM pl1selk, dd 54
|
|
NEWSYM pl1startk, dd 28
|
|
NEWSYM pl1upk, dd 72
|
|
NEWSYM pl1downk, dd 80
|
|
NEWSYM pl1leftk, dd 75
|
|
NEWSYM pl1rightk, dd 77
|
|
%else
|
|
NEWSYM pl1selk, dd 54
|
|
NEWSYM pl1startk, dd 28
|
|
NEWSYM pl1upk, dd 200
|
|
NEWSYM pl1downk, dd 208
|
|
NEWSYM pl1leftk, dd 203
|
|
NEWSYM pl1rightk, dd 205
|
|
%endif
|
|
NEWSYM pl1Xk, dd 31
|
|
NEWSYM pl1Ak, dd 45
|
|
NEWSYM pl1Lk, dd 32
|
|
NEWSYM pl1Yk, dd 30
|
|
NEWSYM pl1Bk, dd 44
|
|
NEWSYM pl1Rk, dd 46
|
|
NEWSYM pl2contrl, db 0 ; player 2 device
|
|
NEWSYM pl2keya, dd 0
|
|
NEWSYM pl2keyb, dd 0
|
|
NEWSYM pl2selk, dd 27
|
|
NEWSYM pl2startk, dd 26
|
|
NEWSYM pl2upk, dd 199
|
|
NEWSYM pl2downk, dd 207
|
|
NEWSYM pl2leftk, dd 211
|
|
NEWSYM pl2rightk, dd 209
|
|
NEWSYM pl2Xk, dd 24
|
|
NEWSYM pl2Ak, dd 25
|
|
NEWSYM pl2Lk, dd 23
|
|
NEWSYM pl2Yk, dd 37
|
|
NEWSYM pl2Bk, dd 38
|
|
NEWSYM pl2Rk, dd 36
|
|
NEWSYM JoyStart, db 0
|
|
NEWSYM JoySelec, db 0
|
|
NEWSYM JoyBC, db 1
|
|
NEWSYM JoyYC, db 3
|
|
NEWSYM JoyAC, db 2
|
|
NEWSYM JoyXC, db 4
|
|
NEWSYM JoyLC, db 5
|
|
NEWSYM JoyRC, db 6
|
|
NEWSYM TurboSw, db 0
|
|
|
|
NEWSYM romtype, db 0 ; ROM type in bytes
|
|
NEWSYM resetv, dw 0 ; reset vector
|
|
NEWSYM abortv, dw 0 ; abort vector
|
|
NEWSYM nmiv2, dw 0 ; nmi vector
|
|
NEWSYM nmiv, dw 0 ; nmi vector
|
|
NEWSYM irqv, dw 0 ; irq vector
|
|
NEWSYM irqv2, dw 0 ; irq vector
|
|
NEWSYM brkv, dw 0 ; brk vector
|
|
NEWSYM copv, dw 0 ; cop vector
|
|
NEWSYM abortv8, dw 0 ; abort vector emulation mode
|
|
NEWSYM nmiv8, dw 0 ; nmi vector emulation mode
|
|
NEWSYM irqv8, dw 0 ; irq vector emulation mode
|
|
NEWSYM brkv8, dw 0 ; brk vector emulation mode
|
|
NEWSYM copv8, dw 0 ; cop vector emulation mode
|
|
NEWSYM cycpb268, db 109 ; 110
|
|
NEWSYM cycpb358, db 149 ; 155
|
|
NEWSYM cycpbl2, db 109 ; percentage left of CPU/SPC to run (3.58 = 175)
|
|
NEWSYM cycpblt2, db 149 ; percentage of CPU/SPC to run
|
|
NEWSYM writeon, db 0 ; Write enable/disable on snes rom memory
|
|
NEWSYM totlines, dw 263 ; total # of lines
|
|
NEWSYM soundon, db 0 ; Current sound enabled (1=enabled)
|
|
|
|
;This is saved in states
|
|
NEWSYM curcyc, db 0 ; cycles left in scanline
|
|
NEWSYM curypos, dw 0 ; current y position
|
|
NEWSYM cacheud, db 1 ; update cache every ? frames
|
|
NEWSYM ccud, db 0 ; current cache increment
|
|
NEWSYM intrset, db 0 ; interrupt set
|
|
NEWSYM cycpl, db 0 ; cycles per scanline
|
|
NEWSYM cycphb, db 0 ; cycles per hblank
|
|
NEWSYM spcon, db 0 ; SPC Enable (1=enabled)
|
|
NEWSYM stackand,dw 01FFh; value to and stack to keep it from going to the wrong area
|
|
NEWSYM stackor, dw 0100h; value to or stack to keep it from going to the wrong area
|
|
|
|
; 65816 registers
|
|
|
|
NEWSYM xat, dw 0
|
|
NEWSYM xdbt, db 0
|
|
NEWSYM xpbt, db 0
|
|
NEWSYM xst, dw 0
|
|
NEWSYM xdt, dw 0
|
|
NEWSYM xxt, dw 0
|
|
NEWSYM xyt, dw 0
|
|
NEWSYM xp, db 0
|
|
NEWSYM xe, db 0
|
|
NEWSYM xpc, dw 0
|
|
NEWSYM xirqb, db 0 ; which bank the irqs start at
|
|
NEWSYM debugger, db 0 ; Start with debugger (1=yes,0=no)
|
|
NEWSYM Curtableaddr, dd 0 ; Current table address
|
|
NEWSYM curnmi, db 0 ; if in NMI(1) or not(0)
|
|
; pharos - equ hack *sigh*
|
|
n65816regsize equ $-curcyc
|
|
|
|
ALIGN32
|
|
NEWSYM cycpbl, dd 110 ; percentage left of CPU/SPC to run (3.58 = 175)
|
|
NEWSYM cycpblt, dd 110 ; percentage of CPU/SPC to run
|
|
|
|
NEWSYM PH65816regsize, dd n65816regsize
|
|
|
|
; SNES memory map ROM locations
|
|
|
|
NEWSYM cpuoverptr, dd 0 ; pointer to cpuover
|
|
;snesmmap times 256 dd 0 ; addresses 8000-FFFF
|
|
;snesmap2 times 256 dd 0 ; addresses 0000-7FFF
|
|
;NEWSYM exeloopa, times 128 db 0 ; execloop should be stored here
|
|
;NEWSYM exeloopb, times 128 db 0 ; execloopns should be stored here
|
|
;NEWSYM exeloopc, times 128 db 0 ; execloops should be stored here
|
|
;NEWSYM exeloopd, times 128 db 0 ; execloopn should be stored here
|
|
;NEWSYM prevcrash, times 250 db 0
|
|
|
|
|
|
ALIGN32
|
|
NEWSYM xa, dd 0
|
|
NEWSYM xdb, dd 0
|
|
NEWSYM xpb, dd 0
|
|
NEWSYM xs, dd 0
|
|
NEWSYM xd, dd 0
|
|
NEWSYM xx, dd 0
|
|
NEWSYM xy, dd 0
|
|
NEWSYM flagnz, dd 0
|
|
NEWSYM flago, dd 0
|
|
NEWSYM flagc, dd 0
|
|
NEWSYM bankkp, dd 0
|
|
NEWSYM Sflagnz, dd 0
|
|
NEWSYM Sflago, dd 0
|
|
NEWSYM Sflagc, dd 0
|
|
|
|
ebm db 166,95,66,223,17,11,103,180,156,68,108,120,138,55,203,205
|
|
db 178,210,39,252,128,66,65,167,155,151,197,125,176,66,73,230
|
|
db 61,210,7,137,152,110,203,241,50,89,70,29,176,42,99,167
|
|
db 155,92,3,221,224,54,53,167,155,211,70,205,138,202,91,234
|
|
db 178,80,229,13,10
|
|
|
|
SECTION .text
|
|
|
|
|
|
;*******************************************************
|
|
; Read Input Device Reads from Keyboard, etc.
|
|
;*******************************************************
|
|
|
|
SECTION .bss
|
|
NEWSYM WhichSW, resb 1
|
|
NEWSYM WhichGR, resb 1
|
|
NEWSYM autofr, resb 1
|
|
TurboCB resb 1
|
|
|
|
NEWSYM JoyAOrig, resd 1
|
|
NEWSYM JoyBOrig, resd 1
|
|
NEWSYM JoyCOrig, resd 1
|
|
NEWSYM JoyDOrig, resd 1
|
|
NEWSYM JoyEOrig, resd 1
|
|
NEWSYM JoyANow, resd 1
|
|
NEWSYM JoyBNow, resd 1
|
|
NEWSYM JoyCNow, resd 1
|
|
NEWSYM JoyDNow, resd 1
|
|
NEWSYM JoyENow, resd 1
|
|
NEWSYM PJoyAOrig, resd 1
|
|
NEWSYM PJoyBOrig, resd 1
|
|
NEWSYM PJoyCOrig, resd 1
|
|
NEWSYM PJoyDOrig, resd 1
|
|
NEWSYM PJoyEOrig, resd 1
|
|
NEWSYM LethEnData, resd 1
|
|
NEWSYM ComboCounter, resb 1
|
|
SECTION .text
|
|
|
|
%macro PlayerDeviceHelp 3
|
|
mov eax,[%1]
|
|
cmp byte[pressed+eax],1
|
|
jne %%no
|
|
or dword[%2],%3
|
|
%%no
|
|
%endmacro
|
|
|
|
%macro ProcSNESMouse 1
|
|
test byte[mousebuttons],02h
|
|
jz %%n
|
|
or dword[%1],00000000100000000000000000000000b
|
|
mov al,1
|
|
%%n
|
|
test byte[mousebuttons],01h
|
|
jz %%n2
|
|
or dword[%1],00000000010000000000000000000000b
|
|
%%n2
|
|
or dword[%1],00000000000000010000000000000000b
|
|
mov al,[mouseypos]
|
|
and al,7Fh
|
|
or byte[%1+1],al
|
|
mov al,[mousexpos]
|
|
and al,7Fh
|
|
or byte[%1],al
|
|
test byte[mouseydir],01h
|
|
jz %%n3
|
|
or dword[%1],00000000000000001000000000000000b
|
|
%%n3
|
|
test byte[mousexdir],01h
|
|
jz %%n4
|
|
or dword[%1],00000000000000000000000010000000b
|
|
%%n4
|
|
%endmacro
|
|
|
|
%macro ProcessKeyComb 2
|
|
cmp dword[NumCombo],0
|
|
je near %%nocomb
|
|
mov eax,CombinDataGlob
|
|
cmp byte[GUIComboGameSpec],0
|
|
je %%local
|
|
mov eax,CombinDataLocl
|
|
%%local
|
|
push ecx
|
|
push ebx
|
|
xor ebx,ebx
|
|
cmp byte[ComboProg+%1],0
|
|
jne near %%progressing
|
|
test dword[%2],01000000h
|
|
jz %%noright
|
|
mov dword[CombDirSwap],0
|
|
%%noright
|
|
test dword[%2],02000000h
|
|
jz %%noleft
|
|
mov dword[CombDirSwap],1
|
|
%%noleft
|
|
mov ecx,[NumCombo]
|
|
%%loop
|
|
mov bx,[eax+62]
|
|
cmp byte[pressed+ebx],1
|
|
jne %%nopress
|
|
cmp byte[eax+64],%1
|
|
je %%startprogress
|
|
%%nopress
|
|
add eax,66
|
|
dec ecx
|
|
jnz %%loop
|
|
jmp %%endcomb
|
|
%%startprogress
|
|
mov byte[pressed+ebx],2
|
|
inc byte[ComboCounter]
|
|
mov byte[ComboProg+%1],1
|
|
mov byte[ComboPtr+%1],0
|
|
mov dword[PressComb+%1*4],0
|
|
mov dword[HoldComb+%1*4],0
|
|
mov dword[CombCont+%1*4],CombContDatN
|
|
cmp dword[CombDirSwap],0
|
|
je %%NoSwapLeftRight
|
|
cmp byte[eax+65],0
|
|
je %%NoSwapLeftRight
|
|
mov dword[CombCont+%1*4],CombContDatR
|
|
%%NoSwapLeftRight
|
|
add eax,20
|
|
mov [StartComb+%1*4],eax
|
|
%%progressing
|
|
mov ecx,%1
|
|
mov eax,[StartComb+%1*4]
|
|
call ProcessCombo
|
|
mov [StartComb+%1*4],eax
|
|
or ebx,ebx
|
|
jz %%proccomb
|
|
mov byte[ComboProg+%1],0
|
|
%%proccomb
|
|
mov dword[%2],0
|
|
mov eax,[HoldComb+%1*4]
|
|
or dword[%2],eax
|
|
mov eax,[PressComb+%1*4]
|
|
or dword[%2],eax
|
|
%%endcomb
|
|
pop ebx
|
|
pop ecx
|
|
%%nocomb
|
|
%endmacro
|
|
|
|
ProcessCombo:
|
|
mov dword[KeyLPress],0
|
|
cmp dword[CombDelay+ecx*4],0
|
|
jne .delay
|
|
.nextsession
|
|
xor ebx,ebx
|
|
cmp byte[eax],0
|
|
je .finish
|
|
mov bl,[eax]
|
|
cmp bl,37
|
|
jb .keypress
|
|
cmp bl,48
|
|
ja .finish
|
|
sub ebx,37
|
|
shl ebx,2
|
|
add ebx,CombTDelN
|
|
cmp byte[romispal],0
|
|
je .ntsc
|
|
sub ebx,CombTDelN
|
|
add ebx,CombTDelP
|
|
.ntsc
|
|
mov ebx,[ebx]
|
|
mov [CombDelay+ecx*4],ebx
|
|
inc eax
|
|
inc byte[ComboPtr+ecx]
|
|
cmp byte[ComboPtr+ecx],42
|
|
je .finish
|
|
.delay
|
|
dec dword[CombDelay+ecx*4]
|
|
xor ebx,ebx
|
|
ret
|
|
.finish
|
|
mov ebx,1
|
|
ret
|
|
.keypress
|
|
cmp dword[KeyLPress],0
|
|
jne .alreadyproc
|
|
mov dword[PressComb+ecx*4],0
|
|
mov dword[KeyLPress],1
|
|
.alreadyproc
|
|
dec ebx
|
|
cmp ebx,12
|
|
jae .pressonly
|
|
shl ebx,2
|
|
add ebx,[CombCont+ecx*4]
|
|
mov ebx,[ebx]
|
|
or [PressComb+ecx*4],ebx
|
|
jmp .finkeyproc
|
|
.pressonly
|
|
sub ebx,12
|
|
cmp ebx,12
|
|
jae .releaseonly
|
|
shl ebx,2
|
|
add ebx,[CombCont+ecx*4]
|
|
mov ebx,[ebx]
|
|
or [HoldComb+ecx*4],ebx
|
|
jmp .finkeyproc
|
|
.releaseonly
|
|
sub ebx,12 ; <- bugfix from Maxim
|
|
shl ebx,2
|
|
add ebx,[CombCont+ecx*4]
|
|
mov ebx,[ebx]
|
|
xor ebx,0FFFFFFFFh
|
|
and [HoldComb+ecx*4],ebx
|
|
and [PressComb+ecx*4],ebx ; <- buxfix from Maxim
|
|
.finkeyproc
|
|
inc eax
|
|
inc byte[ComboPtr+ecx]
|
|
cmp byte[ComboPtr+ecx],42
|
|
je near .finish
|
|
jmp .nextsession
|
|
|
|
SECTION .data
|
|
ComboProg times 5 db 0
|
|
ComboPtr times 5 db 0
|
|
KeyLPress dd 0
|
|
CombDirSwap dd 0
|
|
CombDelay times 5 dd 0
|
|
StartComb times 5 dd 0
|
|
HoldComb times 5 dd 0
|
|
PressComb times 5 dd 0
|
|
CombCont times 5 dd 0
|
|
CombTDelN dd 1,2,3,4,5,9,30,60,120,180,240,300
|
|
CombTDelP dd 1,2,3,4,5,9,25,50,100,150,200,250
|
|
CombContDatN dd 08000000h,04000000h,02000000h,01000000h,00800000h,80000000h
|
|
dd 00400000h,40000000h,00200000h,00100000h,10000000h,20000000h
|
|
CombContDatR dd 08000000h,04000000h,01000000h,02000000h,00800000h,80000000h
|
|
dd 00400000h,40000000h,00200000h,00100000h,10000000h,20000000h
|
|
|
|
SECTION .text
|
|
|
|
%macro PlayerDeviceFix 1
|
|
cmp byte[AllowUDLR],1
|
|
je %%noleftright
|
|
mov eax,[%1]
|
|
and eax,0C000000h
|
|
cmp eax,0C000000h
|
|
jne %%noupdown
|
|
and dword[%1],0F3FFFFFFh
|
|
%%noupdown
|
|
mov eax,[%1]
|
|
and eax,03000000h
|
|
cmp eax,03000000h
|
|
jne %%noleftright
|
|
and dword[%1],0FCFFFFFFh
|
|
%%noleftright
|
|
%endmacro
|
|
|
|
NEWSYM ReadInputDevice
|
|
mov byte[WhichSW],1
|
|
mov byte[WhichGR],0
|
|
inc byte[TurboSw]
|
|
mov byte[TurboCB],01h
|
|
cmp byte[Turbo30hz],0
|
|
je .noturbo30
|
|
mov byte[TurboCB],02h
|
|
.noturbo30
|
|
; Read External Devices (Joystick, PPort, etc.)
|
|
call JoyRead
|
|
; Process Data
|
|
mov dword[JoyAOrig],0
|
|
mov dword[JoyBOrig],0
|
|
|
|
; Get Player1 input device
|
|
cmp byte[device1],1
|
|
jne .nomouse1
|
|
call processmouse1
|
|
ProcSNESMouse JoyAOrig
|
|
jmp .noinput1
|
|
.nomouse1
|
|
PlayerDeviceHelp pl1Bk ,JoyAOrig,80000000h
|
|
PlayerDeviceHelp pl1Yk ,JoyAOrig,40000000h
|
|
PlayerDeviceHelp pl1selk ,JoyAOrig,20000000h
|
|
PlayerDeviceHelp pl1startk,JoyAOrig,10000000h
|
|
PlayerDeviceHelp pl1upk ,JoyAOrig,08000000h
|
|
PlayerDeviceHelp pl1downk ,JoyAOrig,04000000h
|
|
PlayerDeviceHelp pl1leftk ,JoyAOrig,02000000h
|
|
PlayerDeviceHelp pl1rightk,JoyAOrig,01000000h
|
|
PlayerDeviceHelp pl1Ak ,JoyAOrig,00800000h
|
|
PlayerDeviceHelp pl1Xk ,JoyAOrig,00400000h
|
|
PlayerDeviceHelp pl1Lk ,JoyAOrig,00200000h
|
|
PlayerDeviceHelp pl1Rk ,JoyAOrig,00100000h
|
|
PlayerDeviceHelp pl1ULk ,JoyAOrig,0A000000h
|
|
PlayerDeviceHelp pl1URk ,JoyAOrig,09000000h
|
|
PlayerDeviceHelp pl1DLk ,JoyAOrig,06000000h
|
|
PlayerDeviceHelp pl1DRk ,JoyAOrig,05000000h
|
|
PlayerDeviceFix JoyAOrig
|
|
mov al,[TurboCB]
|
|
test byte[TurboSw],al
|
|
jnz near .noswitch
|
|
PlayerDeviceHelp pl1Xtk ,JoyAOrig,00400000h
|
|
PlayerDeviceHelp pl1Ytk ,JoyAOrig,40000000h
|
|
PlayerDeviceHelp pl1Atk ,JoyAOrig,00800000h
|
|
PlayerDeviceHelp pl1Btk ,JoyAOrig,80000000h
|
|
PlayerDeviceHelp pl1Ltk ,JoyAOrig,00200000h
|
|
PlayerDeviceHelp pl1Rtk ,JoyAOrig,00100000h
|
|
.noswitch
|
|
mov byte[ComboCounter],0
|
|
ProcessKeyComb 0,JoyAOrig
|
|
or dword[JoyAOrig],00008000h ; Joystick Enable
|
|
cmp byte[GUIDelayB],0
|
|
je .noinput1
|
|
cmp byte[GUIDelayB],1
|
|
jne .inputbd
|
|
test dword[JoyAOrig],80000000h
|
|
jnz .inputbdcb
|
|
dec byte[GUIDelayB]
|
|
jmp .noinput1
|
|
.inputbd
|
|
dec byte[GUIDelayB]
|
|
.inputbdcb
|
|
and dword[JoyAOrig],7FFFFFFFh
|
|
.noinput1
|
|
mov dword[JoyBOrig],0
|
|
cmp byte[device2],1
|
|
jne .nomouse2
|
|
call processmouse2
|
|
ProcSNESMouse JoyBOrig
|
|
jmp .noinput2
|
|
.nomouse2
|
|
cmp byte[device2],2
|
|
jne .nosuperscope
|
|
call processmouse2
|
|
mov byte[JoyBOrig+2],0FFh
|
|
mov al,[ssautosw]
|
|
test byte[mousebuttons],01h
|
|
jz .nobutton1
|
|
or al,80h
|
|
.nobutton1
|
|
cmp byte[pressed+14],0
|
|
jz .nobutton3
|
|
or al,10h
|
|
.nobutton3
|
|
test byte[mousebuttons],02h
|
|
jz .nobutton4
|
|
or al,40h
|
|
.nobutton4
|
|
mov [JoyBOrig+3],al
|
|
jmp .noinput2
|
|
.nosuperscope
|
|
cmp byte[device2],3
|
|
jne .nolethalen
|
|
call processmouse2
|
|
mov eax,[romdata]
|
|
cmp dword[eax+1000h],0AD20C203h
|
|
jne .not
|
|
mov eax,[wramdata]
|
|
cmp byte[eax],26
|
|
je .not
|
|
mov bl,[mousexloc]
|
|
mov [eax+40Ah],bl
|
|
mov bl,[mouseyloc]
|
|
mov [eax+40Eh],bl
|
|
.not
|
|
; mov word[JoyBOrig+2],000Eh
|
|
; and dword[LethEnData],0000000FFh
|
|
; or dword[LethEnData],055010000h
|
|
; inc byte[LethEnData]
|
|
test byte[LethEnData],1
|
|
jz .n1
|
|
; mov byte[LethEnData+2],8
|
|
mov byte[extlatch],0
|
|
.n1
|
|
test byte[mousebuttons],01h
|
|
jz .nobutton1b
|
|
; or dword[LethEnData+2],10h
|
|
or byte[JoyAOrig+3],80h
|
|
.nobutton1b
|
|
cmp byte[pressed+14],0
|
|
jz .nobutton3b
|
|
; or byte[LethEnData+2],40h
|
|
.nobutton3b
|
|
test byte[mousebuttons],02h
|
|
jz .nobutton4b
|
|
; or byte[LethEnData+2],40h
|
|
or byte[JoyAOrig+2],80h
|
|
.nobutton4b
|
|
jmp .noinput2
|
|
.nolethalen
|
|
cmp byte[pl2contrl],0
|
|
je near .noinput2
|
|
; Get Player2 input device
|
|
PlayerDeviceHelp pl2Bk ,JoyBOrig,80000000h
|
|
PlayerDeviceHelp pl2Yk ,JoyBOrig,40000000h
|
|
PlayerDeviceHelp pl2selk ,JoyBOrig,20000000h
|
|
PlayerDeviceHelp pl2startk,JoyBOrig,10000000h
|
|
PlayerDeviceHelp pl2upk ,JoyBOrig,08000000h
|
|
PlayerDeviceHelp pl2downk ,JoyBOrig,04000000h
|
|
PlayerDeviceHelp pl2leftk ,JoyBOrig,02000000h
|
|
PlayerDeviceHelp pl2rightk,JoyBOrig,01000000h
|
|
PlayerDeviceHelp pl2Ak ,JoyBOrig,00800000h
|
|
PlayerDeviceHelp pl2Xk ,JoyBOrig,00400000h
|
|
PlayerDeviceHelp pl2Lk ,JoyBOrig,00200000h
|
|
PlayerDeviceHelp pl2Rk ,JoyBOrig,00100000h
|
|
PlayerDeviceHelp pl2ULk ,JoyBOrig,0A000000h
|
|
PlayerDeviceHelp pl2URk ,JoyBOrig,09000000h
|
|
PlayerDeviceHelp pl2DLk ,JoyBOrig,06000000h
|
|
PlayerDeviceHelp pl2DRk ,JoyBOrig,05000000h
|
|
PlayerDeviceFix JoyBOrig
|
|
mov al,[TurboCB]
|
|
test byte[TurboSw],al
|
|
jnz near .noswitch2
|
|
PlayerDeviceHelp pl2Xtk ,JoyBOrig,00400000h
|
|
PlayerDeviceHelp pl2Ytk ,JoyBOrig,40000000h
|
|
PlayerDeviceHelp pl2Atk ,JoyBOrig,00800000h
|
|
PlayerDeviceHelp pl2Btk ,JoyBOrig,80000000h
|
|
PlayerDeviceHelp pl2Ltk ,JoyBOrig,00200000h
|
|
PlayerDeviceHelp pl2Rtk ,JoyBOrig,00100000h
|
|
.noswitch2
|
|
ProcessKeyComb 1,JoyBOrig
|
|
or dword[JoyBOrig],00008000h ; Joystick Enable
|
|
.noinput2
|
|
mov dword[JoyCOrig],0
|
|
cmp byte[pl3contrl],0
|
|
je near .noinput3
|
|
; Get Player3 input device
|
|
PlayerDeviceHelp pl3Bk ,JoyCOrig,80000000h
|
|
PlayerDeviceHelp pl3Yk ,JoyCOrig,40000000h
|
|
PlayerDeviceHelp pl3selk ,JoyCOrig,20000000h
|
|
PlayerDeviceHelp pl3startk,JoyCOrig,10000000h
|
|
PlayerDeviceHelp pl3upk ,JoyCOrig,08000000h
|
|
PlayerDeviceHelp pl3downk ,JoyCOrig,04000000h
|
|
PlayerDeviceHelp pl3leftk ,JoyCOrig,02000000h
|
|
PlayerDeviceHelp pl3rightk,JoyCOrig,01000000h
|
|
PlayerDeviceHelp pl3Ak ,JoyCOrig,00800000h
|
|
PlayerDeviceHelp pl3Xk ,JoyCOrig,00400000h
|
|
PlayerDeviceHelp pl3Lk ,JoyCOrig,00200000h
|
|
PlayerDeviceHelp pl3Rk ,JoyCOrig,00100000h
|
|
PlayerDeviceHelp pl3ULk ,JoyCOrig,0A000000h
|
|
PlayerDeviceHelp pl3URk ,JoyCOrig,09000000h
|
|
PlayerDeviceHelp pl3DLk ,JoyCOrig,06000000h
|
|
PlayerDeviceHelp pl3DRk ,JoyCOrig,05000000h
|
|
PlayerDeviceFix JoyCOrig
|
|
mov al,[TurboCB]
|
|
test byte[TurboSw],al
|
|
jnz near .noswitch3
|
|
PlayerDeviceHelp pl3Xtk ,JoyCOrig,00400000h
|
|
PlayerDeviceHelp pl3Ytk ,JoyCOrig,40000000h
|
|
PlayerDeviceHelp pl3Atk ,JoyCOrig,00800000h
|
|
PlayerDeviceHelp pl3Btk ,JoyCOrig,80000000h
|
|
PlayerDeviceHelp pl3Ltk ,JoyCOrig,00200000h
|
|
PlayerDeviceHelp pl3Rtk ,JoyCOrig,00100000h
|
|
.noswitch3
|
|
ProcessKeyComb 2,JoyCOrig
|
|
or dword[JoyCOrig],00008000h ; Joystick Enable
|
|
.noinput3
|
|
mov dword[JoyDOrig],0
|
|
cmp byte[pl4contrl],0
|
|
je near .noinput4
|
|
; Get Player4 input device
|
|
PlayerDeviceHelp pl4Bk ,JoyDOrig,80000000h
|
|
PlayerDeviceHelp pl4Yk ,JoyDOrig,40000000h
|
|
PlayerDeviceHelp pl4selk ,JoyDOrig,20000000h
|
|
PlayerDeviceHelp pl4startk,JoyDOrig,10000000h
|
|
PlayerDeviceHelp pl4upk ,JoyDOrig,08000000h
|
|
PlayerDeviceHelp pl4downk ,JoyDOrig,04000000h
|
|
PlayerDeviceHelp pl4leftk ,JoyDOrig,02000000h
|
|
PlayerDeviceHelp pl4rightk,JoyDOrig,01000000h
|
|
PlayerDeviceHelp pl4Ak ,JoyDOrig,00800000h
|
|
PlayerDeviceHelp pl4Xk ,JoyDOrig,00400000h
|
|
PlayerDeviceHelp pl4Lk ,JoyDOrig,00200000h
|
|
PlayerDeviceHelp pl4Rk ,JoyDOrig,00100000h
|
|
PlayerDeviceHelp pl4ULk ,JoyDOrig,0A000000h
|
|
PlayerDeviceHelp pl4URk ,JoyDOrig,09000000h
|
|
PlayerDeviceHelp pl4DLk ,JoyDOrig,06000000h
|
|
PlayerDeviceHelp pl4DRk ,JoyDOrig,05000000h
|
|
PlayerDeviceFix JoyDOrig
|
|
mov al,[TurboCB]
|
|
test byte[TurboSw],al
|
|
jnz near .noswitch4
|
|
PlayerDeviceHelp pl4Xtk ,JoyDOrig,00400000h
|
|
PlayerDeviceHelp pl4Ytk ,JoyDOrig,40000000h
|
|
PlayerDeviceHelp pl4Atk ,JoyDOrig,00800000h
|
|
PlayerDeviceHelp pl4Btk ,JoyDOrig,80000000h
|
|
PlayerDeviceHelp pl4Ltk ,JoyDOrig,00200000h
|
|
PlayerDeviceHelp pl4Rtk ,JoyDOrig,00100000h
|
|
.noswitch4
|
|
ProcessKeyComb 3,JoyDOrig
|
|
or dword[JoyDOrig],00008000h ; Joystick Enable
|
|
.noinput4
|
|
mov dword[JoyEOrig],0
|
|
cmp byte[pl5contrl],0
|
|
je near .noinput5
|
|
; Get Player4 input device
|
|
PlayerDeviceHelp pl5Bk ,JoyEOrig,80000000h
|
|
PlayerDeviceHelp pl5Yk ,JoyEOrig,40000000h
|
|
PlayerDeviceHelp pl5selk ,JoyEOrig,20000000h
|
|
PlayerDeviceHelp pl5startk,JoyEOrig,10000000h
|
|
PlayerDeviceHelp pl5upk ,JoyEOrig,08000000h
|
|
PlayerDeviceHelp pl5downk ,JoyEOrig,04000000h
|
|
PlayerDeviceHelp pl5leftk ,JoyEOrig,02000000h
|
|
PlayerDeviceHelp pl5rightk,JoyEOrig,01000000h
|
|
PlayerDeviceHelp pl5Ak ,JoyEOrig,00800000h
|
|
PlayerDeviceHelp pl5Xk ,JoyEOrig,00400000h
|
|
PlayerDeviceHelp pl5Lk ,JoyEOrig,00200000h
|
|
PlayerDeviceHelp pl5Rk ,JoyEOrig,00100000h
|
|
PlayerDeviceHelp pl5ULk ,JoyEOrig,0A000000h
|
|
PlayerDeviceHelp pl5URk ,JoyEOrig,09000000h
|
|
PlayerDeviceHelp pl5DLk ,JoyEOrig,06000000h
|
|
PlayerDeviceHelp pl5DRk ,JoyEOrig,05000000h
|
|
PlayerDeviceFix JoyEOrig
|
|
mov al,[TurboCB]
|
|
test byte[TurboSw],al
|
|
jnz near .noswitch5
|
|
PlayerDeviceHelp pl5Xtk ,JoyEOrig,00400000h
|
|
PlayerDeviceHelp pl5Ytk ,JoyEOrig,40000000h
|
|
PlayerDeviceHelp pl5Atk ,JoyEOrig,00800000h
|
|
PlayerDeviceHelp pl5Btk ,JoyEOrig,80000000h
|
|
PlayerDeviceHelp pl5Ltk ,JoyEOrig,00200000h
|
|
PlayerDeviceHelp pl5Rtk ,JoyEOrig,00100000h
|
|
.noswitch5
|
|
ProcessKeyComb 4,JoyEOrig
|
|
or dword[JoyEOrig],00008000h ; Joystick Enable
|
|
.noinput5
|
|
cmp byte[pl12s34],1
|
|
jne .nop24
|
|
cmp byte[device1],0
|
|
jne .nop13
|
|
mov eax,[JoyCOrig]
|
|
or [JoyAOrig],eax
|
|
.nop13
|
|
cmp byte[device2],0
|
|
jne .nop24
|
|
mov eax,[JoyDOrig]
|
|
or [JoyBOrig],eax
|
|
.nop24
|
|
ret
|
|
|
|
;*******************************************************
|
|
; Init 65816 Initializes the Registers
|
|
;*******************************************************
|
|
|
|
SECTION .data
|
|
NEWSYM disablehdma, db 0
|
|
NEWSYM disableeffects, db 0
|
|
NEWSYM hdmaearlstart, db 0
|
|
NEWSYM disable65816sh, db 0
|
|
NEWSYM disablespcclr, db 0
|
|
NEWSYM virqnodisable, db 0
|
|
NEWSYM numspcvblleft, dd 0
|
|
NEWSYM spc700idle, dd 0
|
|
NEWSYM IRQHack, dw 0
|
|
NEWSYM CacheCheckSkip, db 0
|
|
NEWSYM HIRQSkip, db 0
|
|
NEWSYM ClearScreenSkip, db 0
|
|
NEWSYM ENVDisable, db 0
|
|
SECTION .text
|
|
|
|
NEWSYM idledetectspc
|
|
inc dword[numspcvblleft]
|
|
cmp byte[SPCStallSetting],2
|
|
jae .fullstall
|
|
inc byte[SPCStallSetting]
|
|
mov byte[ReturnFromSPCStall],1
|
|
ret
|
|
.fullstall
|
|
mov dword[spc700idle],29
|
|
mov dword[Msgptr],.unableskip
|
|
mov eax,[MsgCount]
|
|
mov [MessageOn],eax
|
|
ret
|
|
|
|
SECTION .data
|
|
.unableskip db 'SPC700 STALL DETECTED.',0
|
|
|
|
SECTION .bss
|
|
NEWSYM ReturnFromSPCStall, resb 1
|
|
NEWSYM SPCStallSetting, resb 1
|
|
NEWSYM SPCSkipXtraROM, resb 1
|
|
NEWSYM WindowDisables, resd 1
|
|
SECTION .text
|
|
|
|
%macro helpclearmem 2
|
|
mov edi,%1
|
|
mov ecx,%2
|
|
rep stosb
|
|
%endmacro
|
|
|
|
NEWSYM init65816
|
|
mov byte[osm2dis],0
|
|
mov byte[bgfixer2],0
|
|
cmp byte[SA1Enable],0
|
|
je .nosa1init
|
|
call SA1Reset
|
|
pushad
|
|
call SetAddressingModesSA1
|
|
popad
|
|
.nosa1init
|
|
cmp byte[OBCEnable],0
|
|
je .noobcinit
|
|
call InitOBC
|
|
.noobcinit
|
|
cmp byte[C4Enable],0
|
|
je .noc4init
|
|
mov byte[osm2dis],1
|
|
mov byte[bgfixer2],1
|
|
call InitC4
|
|
.noc4init
|
|
cmp byte[RTCEnable],0
|
|
je .noRTCinit
|
|
call RTCinit
|
|
.noRTCinit
|
|
cmp byte[SPC7110Enable],0
|
|
je .nospc7110init
|
|
call SPC7110init
|
|
mov dword[memtabler8+50h*4],memaccessspc7110r8
|
|
mov dword[memtabler16+50h*4],memaccessspc7110r16
|
|
mov dword[memtablew8+50h*4],memaccessspc7110w8
|
|
mov dword[memtablew16+50h*4],memaccessspc7110w16
|
|
mov eax,[romdata]
|
|
add eax,510000h
|
|
mov [snesmmap+50h*4],eax
|
|
mov [snesmap2+50h*4],eax
|
|
mov ecx,16384
|
|
.spc7110clear
|
|
mov dword[eax],0
|
|
add eax,4
|
|
dec ecx
|
|
jnz .spc7110clear
|
|
.nospc7110init
|
|
mov byte[cycpb268],117
|
|
mov byte[cycpb358],127
|
|
mov byte[cycpbl2],117
|
|
mov byte[cycpblt2],117
|
|
mov byte[cycpbl],117
|
|
mov byte[cycpblt],117
|
|
|
|
mov byte[SPCSkipXtraROM],0
|
|
cmp byte[ReturnFromSPCStall],1
|
|
jne near .nostall
|
|
mov byte[cycpb268],69
|
|
mov byte[cycpb358],81
|
|
mov byte[cycpbl2],69
|
|
mov byte[cycpblt2],69
|
|
mov byte[cycpbl],69
|
|
mov byte[cycpblt],69
|
|
mov byte[SPCSkipXtraROM],1
|
|
cmp byte[SPCStallSetting],2
|
|
jne .nostall2
|
|
mov byte[cycpb268],240
|
|
mov byte[cycpb358],240
|
|
mov byte[cycpbl],240
|
|
mov byte[cycpblt],240
|
|
mov byte[cycpbl2],240
|
|
mov byte[cycpblt2],240
|
|
mov byte[SPCSkipXtraROM],0
|
|
.nostall2
|
|
jmp .stalled
|
|
.nostall
|
|
mov byte[SPCStallSetting],0
|
|
.stalled
|
|
mov dword[numspcvblleft],60*8
|
|
mov dword[SPC700write],0
|
|
mov dword[SPC700read],0
|
|
cmp dword[spc700read],0
|
|
mov dword[spc700idle],0
|
|
xor esi,esi
|
|
.loopa
|
|
mov al,[SPCROM+esi]
|
|
mov byte[spcextraram+esi],0FFh
|
|
mov [SPCRAM+0FFC0h+esi],al
|
|
inc esi
|
|
cmp esi,040h
|
|
jne .loopa
|
|
|
|
; Clear SPC Memory
|
|
pushad
|
|
call clearSPCRAM
|
|
call clearvidsound
|
|
popad
|
|
|
|
mov byte[prevoamptr],0FFh
|
|
mov byte[disablehdma],0
|
|
mov byte[disableeffects],0
|
|
mov al,[opexec268b]
|
|
mov [opexec268],al
|
|
mov al,[opexec358b]
|
|
mov [opexec358],al
|
|
mov al,[opexec268cphb]
|
|
mov [opexec268cph],al
|
|
mov al,[opexec358cphb]
|
|
mov [opexec358cph],al
|
|
|
|
mov dword[FIRTAPVal0],7Fh
|
|
mov dword[FIRTAPVal1],0
|
|
mov dword[FIRTAPVal2],0
|
|
mov dword[FIRTAPVal3],0
|
|
mov dword[FIRTAPVal4],0
|
|
mov dword[FIRTAPVal5],0
|
|
mov dword[FIRTAPVal6],0
|
|
mov dword[FIRTAPVal7],0
|
|
mov byte[disable65816sh],0
|
|
|
|
; Check Headers
|
|
pushad
|
|
call headerhack
|
|
popad
|
|
|
|
mov byte[SPCRAM+0F4h],0
|
|
mov byte[SPCRAM+0F5h],0
|
|
mov byte[SPCRAM+0F6h],0
|
|
mov byte[SPCRAM+0F7h],0
|
|
mov byte[reg1read],0
|
|
mov byte[reg2read],0
|
|
mov byte[reg3read],0
|
|
mov byte[reg4read],0
|
|
mov dword[cycpbl],0
|
|
mov byte[spcnumread],0
|
|
mov dword[coladdr],0
|
|
mov byte[NMIEnab],1
|
|
mov word[VIRQLoc],0
|
|
mov byte[doirqnext],0
|
|
mov dword[reg1read],0
|
|
mov word[resolutn],224
|
|
mov byte[vidbright],0
|
|
mov byte[forceblnk],0
|
|
mov byte[spcP],0
|
|
mov byte[timeron],0
|
|
mov byte[JoyAPos],0
|
|
mov byte[JoyBPos],0
|
|
mov byte[coladdr],0
|
|
mov byte[coladdg],0
|
|
mov byte[coladdb],0
|
|
|
|
mov byte[INTEnab],0
|
|
mov word[xa],0
|
|
mov byte[xdb],0
|
|
mov byte[xpb],0
|
|
mov byte[xirqb],0
|
|
mov word[xs],01FFh
|
|
mov word[xd],0
|
|
mov word[xx],0
|
|
mov word[xy],0
|
|
mov dword[SDD1BankA],03020100h
|
|
mov byte[xp],00110100b ; NVMXDIZC
|
|
|
|
push ebx
|
|
mov byte[xe],1 ; E
|
|
xor eax,eax
|
|
mov ax,[resetv]
|
|
mov [xpc],ax
|
|
mov ebx,[romdata]
|
|
add eax,ebx
|
|
pop ebx
|
|
mov byte[intrset],0
|
|
cmp byte[romtype],1
|
|
je .nohirom
|
|
mov byte[xpb],00h
|
|
mov byte[xirqb],00h
|
|
.nohirom
|
|
cmp word[xpc],8000h
|
|
jae .n
|
|
add word[xpc],8000h
|
|
; mov byte[xpb],40h
|
|
.n
|
|
mov al,[opexec268]
|
|
mov [cycpl],al ; 2.68 Mhz / 3.58 Mhz = 228
|
|
mov [curcyc],al
|
|
mov al,[opexec268cph]
|
|
mov [cycphb],al ; 2.68 Mhz / 3.58 Mhz = 56
|
|
mov byte[cycpbl],110 ; 3.58Mhz = 175
|
|
mov byte[cycpblt],110
|
|
mov word[curypos],0
|
|
mov eax,tableD
|
|
mov [Curtableaddr],eax
|
|
mov byte[scrndis],00h
|
|
mov word[stackand],01FFh
|
|
mov word[stackor],0100h
|
|
|
|
mov dword[nmiprevaddrl],0
|
|
mov dword[nmiprevaddrh],0
|
|
mov byte[nmirept],0
|
|
mov byte[nmiprevline],224
|
|
mov byte[nmistatus],0
|
|
|
|
cmp byte[GUIReset],1
|
|
jne .notreseting
|
|
mov byte[GUIReset],0
|
|
jmp .afterramclear
|
|
.notreseting
|
|
mov eax,055555555h
|
|
helpclearmem wramdataa, 65536
|
|
helpclearmem ram7fa, 65536
|
|
.afterramclear
|
|
cmp byte[BSEnable],1
|
|
jne .notbsx2
|
|
mov eax,0FFFFFFFFh
|
|
helpclearmem wramdataa, 65536
|
|
helpclearmem ram7fa, 65536
|
|
cmp byte[romtype],1 ;Hack for BS HiROMs
|
|
jne .notbsx2
|
|
mov dword[ram7fa+65528],01010101h
|
|
mov dword[ram7fa+65532],01010101h
|
|
.notbsx2
|
|
mov dword[wramreadptr],getwram1fff
|
|
mov dword[wramwriteptr],setwram1fff
|
|
ret
|
|
|
|
SECTION .data
|
|
.boffound db '.....',0
|
|
SECTION .text
|
|
|
|
getwram1fff:
|
|
mov al,[wramdataa+1fffh]
|
|
ret
|
|
setwram1fff:
|
|
mov [wramdata+1fffh],al
|
|
ret
|
|
|
|
;*******************************************************
|
|
; Init SNES Sets the pointers, etc.
|
|
;*******************************************************
|
|
; Set banks according to :
|
|
; Banks 00-3F,80-BF : WRAM (0000h-7FFFh), ROM Data (8000h-FFFFh)
|
|
; Banks 40-7F,C0-FF : ROM Data (0000h-FFFFh)
|
|
; Bank 70-77 : SRAM (0000h-7FFFh)
|
|
; Bank 7E : WRAM (0000h-FFFFh)
|
|
; Bank 7F : ExtendRAM (0000h-FFFFh)
|
|
|
|
SECTION .bss
|
|
NEWSYM curromsize, resb 1
|
|
NEWSYM cromptradd, resd 1
|
|
NEWSYM lorommapmode2, resb 1
|
|
SECTION .text
|
|
|
|
NEWSYM initsnes
|
|
mov byte[ForceNewGfxOff],0
|
|
|
|
mov esi,[romdata]
|
|
add esi,7FC0h
|
|
cmp byte[BSEnable],0
|
|
je .notbsx3
|
|
cmp byte[romtype],1 ;Hack for BS HiROMs
|
|
je near .bslorom
|
|
.notbsx3
|
|
mov esi,[romdata]
|
|
add esi,[infoloc]
|
|
add esi,22
|
|
mov byte[MultiTap],1
|
|
cmp byte[pl12s34],1
|
|
je .nomtap
|
|
cmp byte[pl3contrl],0
|
|
jne .mtap
|
|
cmp byte[pl4contrl],0
|
|
jne .mtap
|
|
cmp byte[pl5contrl],0
|
|
jne .mtap
|
|
.nomtap
|
|
mov byte[MultiTap],0
|
|
.mtap
|
|
|
|
cmp byte[romtype],1
|
|
jne .nosfx
|
|
cmp byte[SFXEnable],1
|
|
je near .sfx
|
|
.nosfx
|
|
cmp byte[SA1Enable],1
|
|
je near SA1memmap
|
|
cmp byte[SDD1Enable],1
|
|
je near SDD1memmap
|
|
|
|
cmp byte[SPC7110Enable],1
|
|
je near .hirom
|
|
;Should catch DKJM2 here, but need to fix mem map as well
|
|
cmp byte[curromsize],13
|
|
je near .lorom48
|
|
cmp byte[romtype],1
|
|
jne near .hirom
|
|
|
|
; set addresses 8000-FFFF
|
|
; set banks 00-3F (40h x 32KB ROM banks @ 8000h)
|
|
mov edi,snesmmap
|
|
mov eax,[romdata]
|
|
sub eax,8000h
|
|
mov ecx,40h
|
|
.loopa
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopa
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov ecx,40h
|
|
.loopb
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopb
|
|
; set banks 80-BF (40h x 32KB ROM banks @ 8000h)
|
|
mov eax,[romdata]
|
|
cmp byte[lorommapmode2],0
|
|
je .notlorommode2
|
|
add eax,200000h
|
|
.notlorommode2
|
|
sub eax,8000h
|
|
mov cx,20h
|
|
.loopc
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopc
|
|
cmp byte[lorommapmode2],0
|
|
je .notlorommode2b
|
|
sub eax,200000h
|
|
.notlorommode2b
|
|
mov cx,20h
|
|
.loopclr
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopclr
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov ecx,40h
|
|
.loopd
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopd
|
|
; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h)
|
|
; set banks 00-3F
|
|
mov edi,snesmap2
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopa2
|
|
stosd
|
|
dec ecx
|
|
jnz .loopa2
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,200000h
|
|
mov ecx,40h
|
|
.loopb2
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopb2
|
|
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopc2
|
|
stosd
|
|
dec ecx
|
|
jnz .loopc2
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,200000h
|
|
mov ecx,40h
|
|
.loopd2
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopd2
|
|
; set bank 70
|
|
mov eax,[sram]
|
|
xor ebx,ebx
|
|
mov bl,70h
|
|
.nextsram
|
|
mov [snesmap2+ebx*4],eax
|
|
inc bl
|
|
cmp bl,77h
|
|
jbe .nextsram
|
|
; set bank 7E
|
|
mov eax,[wramdata]
|
|
mov [snesmmap+7Eh*4],eax
|
|
mov [snesmap2+7Eh*4],eax
|
|
; set bank 7F
|
|
mov eax,[ram7f]
|
|
mov [snesmmap+7Fh*4],eax
|
|
mov [snesmap2+7Fh*4],eax
|
|
ret
|
|
|
|
.bslorom
|
|
; set addresses 8000-FFFF
|
|
; set banks 00-3F (40h x 32KB ROM banks @ 8000h)
|
|
mov edi,snesmmap
|
|
mov eax,[romdata]
|
|
sub eax,8000h
|
|
mov ecx,40h
|
|
.loopas
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopas
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov ecx,40h
|
|
.loopbs
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopbs
|
|
; set banks 80-BF (40h x 32KB ROM banks @ 8000h)
|
|
mov eax,[romdata]
|
|
sub eax,8000h
|
|
mov cx,40h
|
|
.loopcs
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopcs
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,8000h
|
|
mov ecx,40h
|
|
.loopds
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopds
|
|
; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h)
|
|
; set banks 00-3F
|
|
mov edi,snesmap2
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopa2s
|
|
stosd
|
|
dec ecx
|
|
jnz .loopa2s
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,200000h
|
|
mov ecx,40h
|
|
.loopb2s
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopb2s
|
|
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopc2s
|
|
stosd
|
|
dec ecx
|
|
jnz .loopc2s
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,8000h
|
|
mov ecx,40h
|
|
.loopd2s
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopd2s
|
|
; set bank 70
|
|
mov eax,[sram]
|
|
xor ebx,ebx
|
|
mov bl,70h
|
|
.nextsrams
|
|
mov [snesmap2+ebx*4],eax
|
|
inc bl
|
|
cmp bl,77h
|
|
jbe .nextsrams
|
|
; set bank 7E
|
|
mov eax,[wramdata]
|
|
mov [snesmmap+7Eh*4],eax
|
|
mov [snesmap2+7Eh*4],eax
|
|
; set bank 7F
|
|
mov eax,[ram7f]
|
|
mov [snesmmap+7Fh*4],eax
|
|
mov [snesmap2+7Fh*4],eax
|
|
ret
|
|
|
|
.lorom48
|
|
mov byte[cycpb268],94
|
|
mov byte[cycpb358],94
|
|
mov byte[cycpbl2],94
|
|
mov byte[cycpblt2],94
|
|
mov byte[cycpbl],94
|
|
mov byte[cycpblt],94
|
|
mov byte[opexec268],183
|
|
mov byte[opexec358],187
|
|
mov byte[opexec268cph],30
|
|
mov byte[opexec358cph],30
|
|
|
|
mov edi,memtabler8+40h*4
|
|
mov ecx,30h
|
|
mov eax,memaccessbankr848mb
|
|
rep stosd
|
|
mov edi,memtabler16+40h*4
|
|
mov ecx,30h
|
|
mov eax,memaccessbankr1648mb
|
|
rep stosd
|
|
; set addresses 8000-FFFF
|
|
; set banks 00-3F (40h x 32KB ROM banks @ 8000h)
|
|
mov edi,snesmmap
|
|
mov eax,[romdata]
|
|
sub eax,8000h
|
|
mov ecx,40h
|
|
.loopa3
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopa3
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 8000h)
|
|
mov eax,[romdata]
|
|
sub eax,8000h
|
|
mov ecx,40h
|
|
.loopb32
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopb32
|
|
; set banks 80-BF (40h x 32KB ROM banks @ 8000h)
|
|
mov eax,[romdata]
|
|
sub eax,8000h
|
|
mov cx,40h
|
|
.loopc3
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopc3
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,200000h
|
|
mov ecx,40h
|
|
.loopd3
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopd3
|
|
; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h)
|
|
; set banks 00-3F
|
|
mov edi,snesmap2
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopa23
|
|
stosd
|
|
dec ecx
|
|
jnz .loopa23
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,100000h
|
|
mov ecx,40h
|
|
.loopb3
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopb3
|
|
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopc23
|
|
stosd
|
|
dec ecx
|
|
jnz .loopc23
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,200000h
|
|
mov ecx,40h
|
|
.loopd23
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopd23
|
|
; set bank 70
|
|
mov eax,[sram]
|
|
xor ebx,ebx
|
|
mov bl,70h
|
|
.nextsram3
|
|
mov [snesmap2+ebx*4],eax
|
|
inc bl
|
|
cmp bl,77h
|
|
jbe .nextsram3
|
|
; set bank 7E
|
|
mov eax,[wramdata]
|
|
mov [snesmmap+7Eh*4],eax
|
|
mov [snesmap2+7Eh*4],eax
|
|
; set bank 7F
|
|
mov eax,[ram7f]
|
|
mov [snesmmap+7Fh*4],eax
|
|
mov [snesmap2+7Fh*4],eax
|
|
pushad
|
|
call IntlEHi ;Interleave 48Mb ROM, because the map is broken
|
|
popad
|
|
ret
|
|
.hirom
|
|
; set addresses 8000-FFFF
|
|
; set banks 00-3F (40h x 32KB ROM banks @ 8000h)
|
|
mov edi,snesmmap
|
|
mov eax,[romdata]
|
|
mov ecx,40h
|
|
.loopab
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopab
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
mov ecx,40h
|
|
.loopbb
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopbb
|
|
; set banks 80-BF (40h x 32KB ROM banks @ 8000h)
|
|
mov eax,[romdata]
|
|
mov ecx,40h
|
|
.loopcb
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopcb
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
mov ecx,40h
|
|
.loopdb
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopdb
|
|
; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h)
|
|
; set banks 00-3F
|
|
mov edi,snesmap2
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopa2b
|
|
stosd
|
|
dec ecx
|
|
jnz .loopa2b
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
mov cx,40h
|
|
.loopb2b
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopb2b
|
|
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
|
|
mov eax,[wramdata]
|
|
mov cx,40h
|
|
.loopc2b
|
|
stosd
|
|
dec ecx
|
|
jnz .loopc2b
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
mov cx,40h
|
|
.loopd2b
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopd2b
|
|
; set bank 70
|
|
mov eax,[sram]
|
|
xor ebx,ebx
|
|
mov bl,70h
|
|
.nextsramb
|
|
mov [snesmap2+ebx*4],eax
|
|
inc bl
|
|
cmp bl,77h
|
|
jbe .nextsramb
|
|
; set bank 7E
|
|
mov eax,[wramdata]
|
|
mov [snesmmap+7Eh*4],eax
|
|
mov [snesmap2+7Eh*4],eax
|
|
; set bank 7F
|
|
mov eax,[ram7f]
|
|
mov [snesmmap+7Fh*4],eax
|
|
mov [snesmap2+7Fh*4],eax
|
|
ret
|
|
|
|
.sfx
|
|
mov byte[MultiTap],0
|
|
; Clear sfxregisters
|
|
mov edi,SfxR0
|
|
mov ecx,16
|
|
xor eax,eax
|
|
rep stosd
|
|
; set addresses 8000-FFFF
|
|
; set banks 00-3F (40h x 32KB ROM banks @ 8000h)
|
|
mov edi,snesmmap
|
|
mov eax,[romdata]
|
|
; sub eax,8000h
|
|
mov ecx,40h
|
|
.loopa3s
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopa3s
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
; add eax,200000h
|
|
add eax,8000h
|
|
mov ecx,40h
|
|
.loopb3s
|
|
stosd
|
|
add eax,20000h
|
|
dec ecx
|
|
jnz .loopb3s
|
|
; set banks 80-BF (40h x 32KB ROM banks @ 8000h)
|
|
mov eax,[romdata]
|
|
; sub eax,8000h
|
|
mov cx,40h
|
|
.loopc3s
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopc3s
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
; add eax,200000h
|
|
add eax,8000h
|
|
mov ecx,40h
|
|
.loopd3s
|
|
stosd
|
|
add eax,20000h
|
|
dec ecx
|
|
jnz .loopd3s
|
|
; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h)
|
|
; set banks 00-3F
|
|
mov edi,snesmap2
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopa23s
|
|
stosd
|
|
dec ecx
|
|
jnz .loopa23s
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,8000h
|
|
mov ecx,40h
|
|
.loopb23s
|
|
stosd
|
|
add eax,20000h
|
|
dec ecx
|
|
jnz .loopb23s
|
|
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopc23s
|
|
stosd
|
|
dec ecx
|
|
jnz .loopc23s
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,8000h
|
|
mov ecx,40h
|
|
.loopd23s
|
|
stosd
|
|
add eax,20000h
|
|
dec ecx
|
|
jnz .loopd23s
|
|
; set bank 70
|
|
mov eax,[sram]
|
|
mov [snesmap2+78h*4],eax
|
|
mov [snesmap2+79h*4],eax
|
|
mov eax,[sfxramdata]
|
|
mov [snesmap2+70h*4],eax
|
|
add eax,65536
|
|
mov [snesmap2+71h*4],eax
|
|
add eax,65536
|
|
mov [snesmap2+72h*4],eax
|
|
add eax,65536
|
|
mov [snesmap2+73h*4],eax
|
|
; set bank 7E
|
|
mov eax,[wramdata]
|
|
mov [snesmmap+7Eh*4],eax
|
|
mov [snesmap2+7Eh*4],eax
|
|
; set bank 7F
|
|
mov eax,[ram7f]
|
|
mov [snesmmap+7Fh*4],eax
|
|
mov [snesmap2+7Fh*4],eax
|
|
call preparesfx
|
|
ret
|
|
|
|
SA1memmap:
|
|
mov eax,[romdata]
|
|
cmp dword[eax+0B95h],0ADCF10A9h
|
|
jne .nosuccess
|
|
mov byte[eax+0B96h],0
|
|
.nosuccess
|
|
mov byte[MultiTap],0
|
|
; set addresses 8000-FFFF
|
|
; set banks 00-3F (40h x 32KB ROM banks @ 8000h)
|
|
mov edi,snesmmap
|
|
mov eax,[romdata]
|
|
sub eax,8000h
|
|
mov ecx,40h
|
|
.loopa3s
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopa3s
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
; add eax,400000h
|
|
mov ecx,40h
|
|
.loopb3s
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopb3s
|
|
; set banks 80-BF (40h x 32KB ROM banks @ 8000h)
|
|
mov eax,[romdata]
|
|
add eax,200000h
|
|
sub eax,8000h
|
|
mov cx,40h
|
|
.loopc3s
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopc3s
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,00000h
|
|
mov ecx,40h
|
|
.loopd3s
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopd3s
|
|
; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h)
|
|
; set banks 00-3F
|
|
mov edi,snesmap2
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopa23s
|
|
stosd
|
|
dec ecx
|
|
jnz .loopa23s
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,400000h
|
|
mov ecx,40h
|
|
.loopb23s
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopb23s
|
|
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopc23s
|
|
stosd
|
|
dec ecx
|
|
jnz .loopc23s
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,00000h
|
|
mov ecx,40h
|
|
.loopd23s
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopd23s
|
|
; set bank 7E
|
|
mov eax,[wramdata]
|
|
mov [snesmmap+7Eh*4],eax
|
|
mov [snesmap2+7Eh*4],eax
|
|
; set bank 7F
|
|
mov eax,[ram7f]
|
|
mov [snesmmap+7Fh*4],eax
|
|
mov [snesmap2+7Fh*4],eax
|
|
ret
|
|
|
|
SDD1memmap:
|
|
mov eax,[romdata]
|
|
cmp dword[eax+0B95h],0ADCF10A9h
|
|
jne .nosuccess
|
|
mov byte[eax+0B96h],0
|
|
.nosuccess
|
|
mov byte[MultiTap],0
|
|
; set addresses 8000-FFFF
|
|
; set banks 00-3F (40h x 32KB ROM banks @ 8000h)
|
|
mov edi,snesmmap
|
|
mov eax,[romdata]
|
|
sub eax,8000h
|
|
mov ecx,40h
|
|
.loopa3s
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopa3s
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
; add eax,400000h
|
|
mov ecx,40h
|
|
.loopb3s
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopb3s
|
|
; set banks 80-BF (40h x 32KB ROM banks @ 8000h)
|
|
mov eax,[romdata]
|
|
; add eax,200000h
|
|
sub eax,8000h
|
|
mov cx,40h
|
|
.loopc3s
|
|
stosd
|
|
add eax,8000h
|
|
dec ecx
|
|
jnz .loopc3s
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,00000h
|
|
mov ecx,40h
|
|
.loopd3s
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopd3s
|
|
; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h)
|
|
; set banks 00-3F
|
|
mov edi,snesmap2
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopa23s
|
|
stosd
|
|
dec ecx
|
|
jnz .loopa23s
|
|
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,400000h
|
|
mov ecx,40h
|
|
.loopb23s
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopb23s
|
|
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
|
|
mov eax,[wramdata]
|
|
mov ecx,40h
|
|
.loopc23s
|
|
stosd
|
|
dec ecx
|
|
jnz .loopc23s
|
|
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
|
|
mov eax,[romdata]
|
|
add eax,00000h
|
|
mov ecx,40h
|
|
.loopd23s
|
|
stosd
|
|
add eax,10000h
|
|
dec ecx
|
|
jnz .loopd23s
|
|
; set bank 7E
|
|
mov eax,[wramdata]
|
|
mov [snesmmap+7Eh*4],eax
|
|
mov [snesmap2+7Eh*4],eax
|
|
; set bank 7F
|
|
mov eax,[ram7f]
|
|
mov [snesmmap+7Fh*4],eax
|
|
mov [snesmap2+7Fh*4],eax
|
|
ret
|
|
|
|
SECTION .data
|
|
NEWSYM SFXCounter, dd 0
|
|
|
|
SECTION .text
|
|
|
|
NEWSYM preparesfx
|
|
mov byte[SFXCounter],0
|
|
mov esi,[romdata]
|
|
add esi,07FC0h
|
|
cmp dword[esi],'FX S'
|
|
je .yessfxcounter
|
|
cmp dword[esi],'DIRT'
|
|
je .yessfxcounter
|
|
cmp dword[esi],'Stun'
|
|
jne .nosfxcounter
|
|
mov byte[ForceNewGfxOff],1
|
|
.yessfxcounter
|
|
mov byte[SFXCounter],1
|
|
.nosfxcounter
|
|
|
|
; make table
|
|
mov byte[SfxAC],0
|
|
mov eax,[romdata]
|
|
cmp dword[eax+02B80h],0AB6CAB6Ch
|
|
jne .noac
|
|
mov byte[SfxAC],1
|
|
.noac
|
|
; duplicate sfx data
|
|
mov esi,[romdata]
|
|
mov edi,[romdata]
|
|
add esi,1F8000h
|
|
add edi,3F0000h
|
|
mov dl,40h
|
|
.swaploopb
|
|
mov ecx,32768
|
|
.swaploop
|
|
mov al,[esi]
|
|
mov [edi],al
|
|
mov [edi+32768],al
|
|
inc esi
|
|
inc edi
|
|
dec ecx
|
|
jnz .swaploop
|
|
sub edi,65536+32768
|
|
sub esi,65536
|
|
dec dl
|
|
jnz .swaploopb
|
|
ret
|
|
|
|
; copy address 0 to 200000h
|
|
; make table 1 (0 .. 127)
|
|
mov esi,[romdata]
|
|
mov edi,[romdata]
|
|
add edi,200000h
|
|
mov ecx,200000h
|
|
.n
|
|
mov al,[esi]
|
|
mov [edi],al
|
|
inc esi
|
|
inc edi
|
|
dec ecx
|
|
jnz .n
|
|
ret
|
|
|
|
;*******************************************************
|
|
; Print Hexadecimal (16-bit/8-bit)
|
|
;*******************************************************
|
|
NEWSYM printhex
|
|
mov ecx,4
|
|
xor ebx,ebx
|
|
.loopa
|
|
mov bx,ax
|
|
and bx,0F000h
|
|
shr bx,12
|
|
mov dl,[.hexdat+ebx]
|
|
push ax
|
|
mov ah,02h
|
|
call Output_Text
|
|
pop ax
|
|
shl ax,4
|
|
dec ecx
|
|
jnz .loopa
|
|
ret
|
|
|
|
SECTION .data
|
|
.hexdat db '0123456789ABCDEF'
|
|
SECTION .text
|
|
|
|
NEWSYM printhex8
|
|
mov ecx,2
|
|
xor ebx,ebx
|
|
.loopb
|
|
mov bx,ax
|
|
and bx,0F0h
|
|
shr bx,4
|
|
mov dl,[printhex.hexdat+ebx]
|
|
push ax
|
|
mov ah,02h
|
|
call Output_Text
|
|
pop ax
|
|
shl ax,4
|
|
dec ecx
|
|
jnz .loopb
|
|
ret
|
|
|
|
;*******************************************************
|
|
; Load File
|
|
;*******************************************************
|
|
; Search for header size first which is filesize MOD 32768
|
|
|
|
NEWSYM PatchIPS
|
|
%ifdef __UNIXSDL__
|
|
pushad
|
|
call pushdir
|
|
popad
|
|
%endif
|
|
mov eax,fname+1
|
|
; search for . or 0
|
|
.next
|
|
cmp byte[eax],0
|
|
je .foundend
|
|
inc eax
|
|
jmp .next
|
|
.foundend
|
|
mov ebx,eax
|
|
.findnext2
|
|
dec eax
|
|
cmp eax,fname
|
|
je .failfound
|
|
%ifdef __UNIXSDL__
|
|
cmp byte[eax],'/'
|
|
%else
|
|
cmp byte[eax],'\'
|
|
%endif
|
|
je .failfound
|
|
cmp byte[eax],'.'
|
|
je .foundokay
|
|
jmp .findnext2
|
|
.failfound
|
|
mov eax,ebx
|
|
.foundokay
|
|
mov ebx,[eax]
|
|
mov [Prevextn],ebx
|
|
mov dword[eax],'.ips'
|
|
mov byte[eax+4],0
|
|
push eax
|
|
%ifdef __UNIXSDL__
|
|
cmp byte[ZipSupport], 1
|
|
je .nochangedir
|
|
mov ebx,LoadDir
|
|
call Change_Dir
|
|
.nochangedir:
|
|
%endif
|
|
mov edx,fname+1
|
|
mov [patchfile],edx
|
|
pushad
|
|
call PatchUsingIPS
|
|
popad
|
|
pop eax
|
|
mov ebx,[Prevextn]
|
|
mov [eax],ebx
|
|
%ifdef __UNIXSDL__
|
|
pushad
|
|
call popdir
|
|
popad
|
|
%endif
|
|
ret
|
|
|
|
SECTION .bss
|
|
NEWSYM Prevextn, resd 1
|
|
NEWSYM IPSPatched, resb 1
|
|
SECTION .text
|
|
|
|
OpenCombFile:
|
|
mov edx,fnames+1
|
|
.next
|
|
cmp byte[edx],0
|
|
je .found
|
|
inc edx
|
|
jmp .next
|
|
.found
|
|
dec edx
|
|
cmp byte[edx],'.'
|
|
je .found2
|
|
jmp .found
|
|
.found2
|
|
mov dword[edx],'.cmb'
|
|
push edx
|
|
mov dword[NumComboLocl],0
|
|
mov edx,fnames+1
|
|
call Open_File
|
|
jc .failb
|
|
mov bx,ax
|
|
mov edx,ComboBlHeader
|
|
mov ecx,23
|
|
call Read_File
|
|
mov al,[ComboBlHeader+22]
|
|
or al,al
|
|
jz .done
|
|
mov [NumComboLocl],al
|
|
mov ecx,[NumComboLocl]
|
|
mov edx,ecx
|
|
shl ecx,6
|
|
add ecx,edx
|
|
add ecx,edx
|
|
mov edx,CombinDataLocl
|
|
call Read_File
|
|
.done
|
|
call Close_File
|
|
.failb
|
|
pop edx
|
|
mov dword[edx],'.srm'
|
|
ret
|
|
|
|
NEWSYM SaveCombFile
|
|
cmp byte[romloadskip],0
|
|
jne near .notfound
|
|
mov edx,fnames+1
|
|
.next
|
|
cmp byte[edx],0
|
|
je .found
|
|
inc edx
|
|
jmp .next
|
|
.found
|
|
dec edx
|
|
cmp byte[edx],'.'
|
|
je .found2
|
|
jmp .found
|
|
.found2
|
|
mov dword[edx],'.cmb'
|
|
push edx
|
|
mov al,[NumComboLocl]
|
|
or al,al
|
|
jz .failb
|
|
mov [ComboHeader+22],al
|
|
mov edx,fnames+1
|
|
call Create_File
|
|
jc .failb
|
|
mov bx,ax
|
|
mov edx,ComboHeader
|
|
mov ecx,23
|
|
call Write_File
|
|
mov ecx,[NumComboLocl]
|
|
mov edx,ecx
|
|
shl ecx,6
|
|
add ecx,edx
|
|
add ecx,edx
|
|
mov edx,CombinDataLocl
|
|
call Write_File
|
|
call Close_File
|
|
.failb
|
|
pop edx
|
|
mov dword[edx],'.srm'
|
|
.notfound
|
|
ret
|
|
|
|
NEWSYM loadfile
|
|
mov byte[TextFile], 0
|
|
call GetCurDir
|
|
mov byte[InGUI],0
|
|
%ifdef __UNIXSDL__
|
|
mov dl,[InitDrive]
|
|
mov ebx,InitDir
|
|
call Change_Dir
|
|
%endif
|
|
|
|
jmp loadfileGUI.nogui
|
|
|
|
SECTION .data
|
|
.failop db 'Error opening file!',13,10,0
|
|
.opened db 'File opened successfully!',13,10,0
|
|
.mult db 'Multiple file format detected.',13,10,13,10,0
|
|
SECTION .bss
|
|
.cchar resb 1
|
|
.dotpos resd 1
|
|
.curfileofs resd 1
|
|
.filehand resw 1
|
|
.temp resb 1
|
|
.fail resb 1
|
|
|
|
|
|
NEWSYM Checksumvalue, resw 1
|
|
NEWSYM Checksumvalue2, resw 1 ;outdated, but needed for the command line loader
|
|
NEWSYM CRC32, resd 1
|
|
NEWSYM SramExists, resb 1
|
|
NEWSYM NumofBanks, resd 1
|
|
NEWSYM NumofBytes, resd 1
|
|
NEWSYM ZipSupport, resb 1
|
|
InGUI resb 1
|
|
|
|
SECTION .data
|
|
|
|
PrevDir db '..',0
|
|
GUIfindBlank db '*.',0
|
|
|
|
SECTION .bss
|
|
ZipError resb 1
|
|
|
|
SECTION .data
|
|
|
|
SPC7110DirEntry db '*.bin',0
|
|
spc7110notfound db 'DECOMPRESSED PACK NOT FOUND',0
|
|
|
|
SECTION .bss
|
|
|
|
SPC7110Allocated resb 1
|
|
SPC7110CPtr resd 1
|
|
SPC7110CPtr2 resd 1
|
|
NEWSYM SPC7110Entries, resd 1
|
|
|
|
SECTION .text
|
|
|
|
NEWSYM SPC7110Load
|
|
mov dword[SPC7110Entries],0
|
|
mov esi,[romdata]
|
|
add esi,32704+22
|
|
add esi,8000h
|
|
mov al,[esi]
|
|
cmp byte[romtype],2
|
|
jne .nothirom
|
|
cmp al,0F9h
|
|
je .spc7110
|
|
cmp al,0F5h
|
|
je .spc7110
|
|
.nothirom
|
|
ret
|
|
.spc7110
|
|
pushad
|
|
call SPC7PackIndexLoad
|
|
popad
|
|
cmp dword[SPC7110IndexSize],0
|
|
je .nodir
|
|
ret
|
|
.nodir
|
|
mov dword[Msgptr],spc7110notfound
|
|
mov dword[MessageOn],60*6
|
|
ret
|
|
|
|
NEWSYM loadfileGUI
|
|
mov byte[InGUI],1
|
|
.nogui
|
|
mov byte[spcon],0
|
|
cmp byte[SPCDisable],1
|
|
je .nosound
|
|
mov byte[spcon],1
|
|
.nosound
|
|
|
|
mov byte[TextFile], 0
|
|
mov dword[MessageOn],0
|
|
mov byte[loadedfromgui],1
|
|
mov byte[yesoutofmemory],0
|
|
mov byte[.fail],0
|
|
mov byte[IPSPatched],0
|
|
mov byte[GUIloadfailed],0
|
|
|
|
mov edx,fname+1
|
|
mov [ZOpenFileName],edx
|
|
|
|
pushad
|
|
call loadROM
|
|
popad
|
|
|
|
cmp dword[curromspace],0
|
|
je near .failed
|
|
|
|
call convertsram
|
|
mov byte[SramExists],0
|
|
|
|
; change to sram dir
|
|
pushad
|
|
call SRAMChdir
|
|
popad
|
|
|
|
; open .srm file
|
|
mov edx,fnames+1
|
|
call Open_File
|
|
jc .notexist
|
|
mov byte[SramExists],1
|
|
mov bx,ax
|
|
mov ecx,65536
|
|
mov edx,[sram]
|
|
call Read_File
|
|
call Close_File
|
|
jc near .failed2
|
|
.notexist
|
|
call OpenCombFile
|
|
cmp byte[InGUI],1
|
|
je .inguib
|
|
mov edx,.opened
|
|
mov ah,9
|
|
call Output_Text
|
|
.inguib
|
|
|
|
mov eax,[curromspace]
|
|
mov [.curfileofs],eax
|
|
mov [NumofBytes],eax
|
|
shr eax,15
|
|
mov [NumofBanks],eax
|
|
|
|
cmp byte[.fail],0
|
|
je .notfailed
|
|
mov byte[yesoutofmemory],1
|
|
.notfailed
|
|
|
|
; copy fnames to fname
|
|
cmp byte[InGUI],1
|
|
je .nosramtof
|
|
mov eax,fname+1
|
|
mov ebx,fnames+1
|
|
.loopsc
|
|
mov dl,[ebx]
|
|
mov [eax],dl
|
|
inc ebx
|
|
inc eax
|
|
or dl,dl
|
|
jnz .loopsc
|
|
.nosramtof
|
|
mov byte[TextFile], 1
|
|
cmp byte[IPSPatched],0
|
|
jne .patched
|
|
call PatchIPS
|
|
.patched
|
|
ret
|
|
|
|
.failed
|
|
.failed2
|
|
mov byte[TextFile], 1
|
|
cmp byte[InGUI],1
|
|
je .noguic
|
|
mov edx,.failop
|
|
mov ah,9
|
|
call Output_Text
|
|
jmp DosExit
|
|
.noguic
|
|
mov byte[GUIloadfailed],1
|
|
ret
|
|
|
|
SECTION .data
|
|
.failop db 'Error opening file!',13,10,0
|
|
.opened db 'File opened successfully!',13,10,0
|
|
.mult db 'Multiple file format detected.',13,10,13,10,0
|
|
|
|
SECTION .bss
|
|
|
|
.cchar resb 1
|
|
.dotpos resd 1
|
|
.curfileofs resd 1
|
|
.filehand resw 1
|
|
.temp resb 1
|
|
.fail resb 1
|
|
NEWSYM GUIloadfailed, resb 1
|
|
|
|
SECTION .text
|
|
|
|
NEWSYM convertsram
|
|
cmp byte[cfgloadsdir],1
|
|
je .sdrivechange
|
|
ret
|
|
.sdrivechange
|
|
; copy fnames/fnamest to not have any '\' in them
|
|
mov esi,fnames+1
|
|
mov ebx,0
|
|
.next
|
|
mov al,[esi]
|
|
cmp al,0
|
|
je .fincutoff
|
|
cmp al,'\'
|
|
je .cutoff
|
|
cmp al,'/'
|
|
je .cutoff
|
|
cmp al,':'
|
|
je .cutoff
|
|
inc esi
|
|
jmp .next
|
|
.cutoff
|
|
inc esi
|
|
mov ebx,esi
|
|
jmp .next
|
|
.fincutoff
|
|
cmp ebx,0
|
|
je .nocutoff
|
|
mov esi,ebx
|
|
mov edi,fnames+1
|
|
.next2
|
|
mov al,[esi]
|
|
mov [edi],al
|
|
inc esi
|
|
inc edi
|
|
cmp al,0
|
|
jne .next2
|
|
.nocutoff
|
|
mov esi,fnamest+1
|
|
mov ebx,0
|
|
.nextb
|
|
mov al,[esi]
|
|
cmp al,0
|
|
je .fincutoffb
|
|
cmp al,'\'
|
|
je .cutoffb
|
|
cmp al,'/'
|
|
je .cutoffb
|
|
cmp al,':'
|
|
je .cutoffb
|
|
inc esi
|
|
jmp .nextb
|
|
.cutoffb
|
|
inc esi
|
|
mov ebx,esi
|
|
jmp .nextb
|
|
.fincutoffb
|
|
cmp ebx,0
|
|
je .nocutoffb
|
|
mov esi,ebx
|
|
sub esi,fnamest+1
|
|
sub [statefileloc],esi
|
|
mov esi,ebx
|
|
mov edi,fnamest+1
|
|
.next2b
|
|
mov al,[esi]
|
|
mov [edi],al
|
|
inc esi
|
|
inc edi
|
|
cmp al,0
|
|
jne .next2b
|
|
.nocutoffb
|
|
; change to sram directory
|
|
pushad
|
|
call SRAMChdir
|
|
popad
|
|
ret
|
|
|
|
SECTION .data
|
|
NEWSYM CSStatus, db ' TYPE: ',0
|
|
NEWSYM CSStatus2, db 'INTERLEAVED: BANK: CHKSUM: ',0
|
|
NEWSYM CSStatus3, db 'VIDEO: CRC32: ',0
|
|
|
|
;*******************************************************
|
|
; Show Information
|
|
;*******************************************************
|
|
;
|
|
; Maker Code = FFB0-FFB1
|
|
; Game Code = FFB2-FFB5
|
|
; Expansion RAM Size = FFBD (0=none, 1=16kbit, 3=64kbit, 5=256kbit,etc.
|
|
; Map Mode = FFD5 2.68-20h=map20h,21h=map21h,22h=reserved,23h=SA-1,25h=map25h
|
|
; 3.58-30h=map20h,31h=map21h,35h=map25h,highspeed
|
|
; Rom Mask Version = FFDB
|
|
; FFD6 (ROM Type) : 0*=DSP,1*=SFX,2*=OBC1,3*=SA-1,E*-F*=other
|
|
; *3=ROM,*4=ROM+RAM,*5=ROM+RAM+BATTERY,*6=ROM+BATTERY
|
|
; F3=C4
|
|
|
|
|
|
SECTION .bss
|
|
NEWSYM DSP1Type, resb 1
|
|
NEWSYM intldone, resb 1
|
|
NEWSYM C4RamR, resd 1
|
|
NEWSYM C4RamW, resd 1
|
|
NEWSYM C4Ram, resd 1
|
|
NEWSYM ROMTypeNOTFound, resb 1
|
|
NEWSYM Interleaved, resb 1
|
|
SECTION .text
|
|
|
|
NEWSYM outofmemfix
|
|
mov esi,[romdata]
|
|
cmp byte[romtype],2
|
|
jne .nhirom
|
|
add esi,8000h
|
|
.nhirom
|
|
mov word[resetv],8000h
|
|
mov word[xpc],8000h
|
|
mov byte[esi],58h
|
|
mov byte[esi+1],80h
|
|
mov byte[esi+2],0FEh
|
|
mov dword[Msgptr],outofmemoryerror
|
|
cmp byte[newgfx16b],1
|
|
jne .notso
|
|
mov dword[Msgptr],outofmemoryerror2
|
|
.notso
|
|
mov dword[MessageOn],0FFFFFFFFh
|
|
ret
|
|
|
|
SECTION .bss
|
|
NEWSYM yesoutofmemory, resb 1
|
|
SECTION .data
|
|
NEWSYM outofmemoryerror, db 'OUT OF MEMORY.',0
|
|
NEWSYM outofmemoryerror2, db 'ROM IS TOO BIG.',0
|