Files
ZSNES/zsnes/src/init.asm

5411 lines
115 KiB
NASM

;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either
;version 2 of the License, or (at your option) any later
;version.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
%include "macros.mac"
EXTSYM DosExit,UpdateDevices,InitSPC,Makemode7Table,MusicRelVol,MusicVol
EXTSYM makesprprtable,romloadskip,start65816,startdebugger,SfxR0
EXTSYM MovieProcessing
EXTSYM MovieFileHand,filefound,inittable,SA1inittable
EXTSYM MessageOn,Msgptr,MsgCount,sndrot,GenerateBank0Table,SnowTimer
EXTSYM inittableb,inittablec,FPUCopy,newgfx16b,cfgreinittime,EndMessage
EXTSYM Open_File,Read_File,Write_File,Close_File,Output_Text,Get_Key,CNetType
EXTSYM Delete_File,Get_First_Entry,Get_Next_Entry,Change_Dir,Get_Dir,InitDSP
EXTSYM Remove_Dir,Change_Single_Dir,Create_Dir,Get_Memfree,OSPort,Create_File
EXTSYM SPCDisable,osm2dis,CurRecv,BackupSystemVars
EXTSYM SnowData,SnowVelDist
EXTSYM cvidmode, newengen, cfgnewgfx, GUI16VID
EXTSYM NewEngEnForce
EXTSYM PrintChar
EXTSYM TextFile
EXTSYM mode7tab
EXTSYM per2exec
EXTSYM MovieCounter
EXTSYM chaton
EXTSYM JoyRead,JoyReadControl,joy4218,joy4219
EXTSYM joy421A,joy421B,pressed
EXTSYM pl3Ak,pl3Bk,pl3Lk,pl3Rk,pl3Xk,pl1p209,pl2p209,pl3p209,pl4p209
EXTSYM pl3Yk,pl3contrl,pl3downk,pl3leftk,pl3rightk,pl3selk,pl3startk
EXTSYM pl3upk,pl4Ak,pl4Bk,pl4Lk,pl4Rk,pl4Xk,pl4Yk,pl4contrl,pl4downk
EXTSYM pl4leftk,pl4rightk,pl4selk,pl4startk,pl4upk,mousebuttons,mousexdir
EXTSYM pl5Ak,pl5Bk,pl5Lk,pl5Rk,pl5Xk,pl5Yk,pl5contrl,pl5downk
EXTSYM pl5leftk,pl5rightk,pl5selk,pl5startk,pl5upk
EXTSYM mouseydir,mousexpos,mouseypos,snesmouse,processmouse,ssautosw
EXTSYM GUIDelayB,pl12s34
EXTSYM pl1Xtk,pl1Ytk,pl1Atk,pl1Btk,pl2Xtk,pl2Ytk,pl2Atk,pl2Btk
EXTSYM pl3Xtk,pl3Ytk,pl3Atk,pl3Btk,pl4Xtk,pl4Ytk,pl4Atk,pl4Btk
EXTSYM pl1ULk,pl1URk,pl1DLk,pl1DRk,pl2ULk,pl2URk,pl2DLk,pl2DRk
EXTSYM pl3ULk,pl3URk,pl3DLk,pl3DRk,pl4ULk,pl4URk,pl4DLk,pl4DRk
EXTSYM pl5ULk,pl5URk,pl5DLk,pl5DRk,pl5Xtk,pl5Ytk,pl5Atk,pl5Btk
EXTSYM Turbo30hz,RepeatFrame,nojoystickpoll
EXTSYM NumComboLocl,ComboBlHeader,ComboHeader,CombinDataLocl
EXTSYM CombinDataGlob,NumCombo,GUIComboGameSpec
EXTSYM mousexloc,mouseyloc
EXTSYM extlatch
EXTSYM BackState
EXTSYM FIRTAPVal0,FIRTAPVal1,FIRTAPVal2,FIRTAPVal3,FIRTAPVal4
EXTSYM FIRTAPVal5,FIRTAPVal6,FIRTAPVal7,INTEnab,JoyAPos,JoyBPos
EXTSYM NMIEnab,SPCROM,VIRQLoc,coladdb,coladdg,coladdr,doirqnext
EXTSYM echobuf,forceblnk,nmiprevaddrh,nmiprevaddrl,nmiprevline
EXTSYM nmirept,nmistatus,opexec268,opexec268b,opexec268cph
EXTSYM opexec268cphb,opexec358,opexec358b,opexec358cph,spcextraram
EXTSYM opexec358cphb,prevoamptr,reg1read,reg2read,reg3read
EXTSYM reg4read,resolutn,romdata,scrndis,spcBuffera,spcP,spcRam
EXTSYM spcnumread,tableD,timeron,vidbright,DSPMem,OldGfxMode2
EXTSYM SPC700read,SPC700write,GUIDoReset,spc700read
EXTSYM InitC4,SA1Reset,SetAddressingModesSA1,SetAddressingModes,SDD1BankA,SPC7110init
EXTSYM RTCinit
EXTSYM memaccessspc7110r8,memaccessspc7110r16,memaccessspc7110w8
EXTSYM memaccessspc7110w16
EXTSYM ram7f,snesmap2,snesmmap,sram,MultiTap
EXTSYM memaccessbankr848mb,memaccessbankr1648mb
EXTSYM cpuover,execloop
;EXTSYM execloopn,execloopns,execloops
;EXTSYM PHsizeofexecloop,PHsizeofexecloopn,PHsizeofexecloopns
;EXTSYM PHsizeofexecloops
EXTSYM curexecstate
EXTSYM debugdisble,vidbuffer
EXTSYM Sup16mbit,Sup48mbit,debugbufa,pal16b,pal16bcl,pal16bclha
EXTSYM pal16bxcl,ram7fa,regptra,regptwa,srama,vidmemch2,vidmemch4
EXTSYM vidmemch8,vcache2b,vcache4b,vcache8b,vram,wramdata
EXTSYM wramdataa
EXTSYM fname,fnames,GetCurDir
EXTSYM GUIcurrentdir,extractzip,PrintStr
;STUB DDOI
;EXTSYM GUIcurrentdir, PrintStr
EXTSYM GUIsmcfind,GUIsfcfind,GUIswcfind,GUIfigfind,GUIfind058,GUIfind078,GUIfindBIN
;EXTSYM GUIfindUSA,GUIfindJAP,GUIfindZIP,GUIfind1,DTALoc,GUIfindall,ZipError
EXTSYM GUIfindUSA,GUIfindJAP,GUIfindZIP,GUIfind1,DTALoc,GUIfindall
EXTSYM spc7110romptr,allocspc7110
EXTSYM SRAMDir,SRAMDrive,cfgloadsdir,fnamest,statefileloc
EXTSYM ForcePal,InitDir,InitDrive,enterpress,frameskip
EXTSYM gotoroot,headdata,printnum,romispal
EXTSYM InitFxTables,SFXSRAM,SfxR1,SfxR2,SfxSCMR,SfxSFR,finterleave
EXTSYM initregr,initregw,memtabler16,DSP1Read16b3F,memaccessbankr16
EXTSYM memtabler8,DSP1Read8b3F,memaccessbankr8,memtablew16,DSP1Write16b
EXTSYM memaccessbankw16,memtablew8,DSP1Write8b,memaccessbankw8,DSP1Write16b3F
EXTSYM regaccessbankr16,regaccessbankr8,regaccessbankw16,regaccessbankw8
EXTSYM sfxaccessbankr16,sfxaccessbankr16b,sfxaccessbankr16c,DSP1Write8b3F
EXTSYM sfxaccessbankr16d,sfxaccessbankr8,sfxaccessbankr8b,sfxaccessbankr8c
EXTSYM sfxaccessbankr8d,sfxaccessbankw16,sfxaccessbankw16b
EXTSYM sfxaccessbankw16c,sfxaccessbankw16d,sfxaccessbankw8
EXTSYM sfxaccessbankw8b,sfxaccessbankw8c,sfxaccessbankw8d,sfxramdata
EXTSYM sramaccessbankr16,sramaccessbankr16s,sramaccessbankr8
EXTSYM sramaccessbankr8s,sramaccessbankw16,sramaccessbankw16s
EXTSYM sramaccessbankw8,sramaccessbankw8s,GenerateBank0TableSA1
EXTSYM ScrDispl
NEWSYM InitAsmStart
; 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
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
loop .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
loop .snowloop
call BackupSystemVars
xor eax,eax
mov al,[cfgreinittime]
mov ebx,50
mul ebx
mov [ReInitLength],eax
xor eax,eax
mov al,byte[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
loop .rbackupl
mov byte[virqnodisable],0
call clearmem
call inittable
call inittableb
call inittablec
call SA1inittable
; SPC Init
call copyexecloop
call procexecloop
; SNES Init
call Setper2exec
call Makemode7Table
call makesprprtable
cmp byte[fname],0
jne .found
cmp byte[romloadskip],1
je .noloadfile
.found
mov byte[romloadskip],0
call loadfile
call showinfo
.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,100
div ebx
cmp al,127
jb .noof
mov al,127
.noof
mov [MusicVol],al
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
NEWSYM pl1selk, dd 54 ; 1SELECT = SHIFT
NEWSYM pl1startk, dd 28 ; 1START = ENTER
NEWSYM pl1upk, dd 72 ; 1UP = up
NEWSYM pl1downk, dd 80 ; 1DOWN = down
NEWSYM pl1leftk, dd 75 ; 1LEFT = left
NEWSYM pl1rightk, dd 77 ; 1RIGHT = right
NEWSYM pl1Xk, dd 82 ; 1X = INS
NEWSYM pl1Ak, dd 71 ; 1A = HOME
NEWSYM pl1Lk, dd 73 ; 1L = PAGE UP
NEWSYM pl1Yk, dd 83 ; 1Y = DELETE
NEWSYM pl1Bk, dd 79 ; 1B = END
NEWSYM pl1Rk, dd 81 ; 1R = PAGE DOWN
NEWSYM pl2contrl, db 0 ; player 2 device
NEWSYM pl2keya, dd 0
NEWSYM pl2keyb, dd 0
NEWSYM pl2selk, dd 56 ; 2SELECT = alt
NEWSYM pl2startk, dd 29 ; 2START = ctrl
NEWSYM pl2upk, dd 37 ; 2UP = k
NEWSYM pl2downk, dd 50 ; 2DOWN = m
NEWSYM pl2leftk, dd 49 ; 2LEFT = n
NEWSYM pl2rightk, dd 51 ; 2RIGHT = ,
NEWSYM pl2Xk, dd 31 ; 2X = S
NEWSYM pl2Ak, dd 32 ; 2A = D
NEWSYM pl2Lk, dd 33 ; 2L = F
NEWSYM pl2Yk, dd 44 ; 2Y = Z
NEWSYM pl2Bk, dd 45 ; 2B = X
NEWSYM pl2Rk, dd 46 ; 2R = C
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 ramsize, dd 0 ; RAM size in bytes
NEWSYM ramsizeand, dd 0 ; RAM size in bytes (used to and)
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 262 ; total # of lines
NEWSYM soundon, db 0 ; Current sound enabled (1=enabled)
NEWSYM zsmesg, db 'ZSNES Save State File V0.6',26
NEWSYM versn, db 60 ; version #/100
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*
num2writecpureg equ $-zsmesg
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 PHnum2writecpureg, dd num2writecpureg
; 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,178,210,39,252,128,66
db 65,167,155,151,197,125,176,66,73,230,61,210,7,137,152,110,203,241,50,89,70,29,176
db 42,99,167,155,92,3,221,224,54,53,167,155,211,70,205,138,202,91,234,178,80,229,13,10
SECTION .text
;*******************************************************
; Timing check
;*******************************************************
NEWSYM Timecheck
in al,61h
and al,10h
mov ah,al
.loopa
in al,61h
and al,10h
cmp al,ah
jz .loopa
mov ah,al
mov esi,mode7tab
mov ecx,2000
.loopc
xor ebx,ebx
.loopb
in al,61h
and al,10h
inc ebx
cmp al,ah
jz .loopb
.loopd
in al,61h
and al,10h
inc ebx
cmp al,ah
jnz .loopd
.loope
in al,61h
and al,10h
inc ebx
cmp al,ah
jz .loope
mov ah,al
mov [esi],ebx
add esi,4
dec ecx
jnz .loopc
mov eax,[mode7tab+16]
call printnum
ret
;*******************************************************
; Set percent to execute
;*******************************************************
NEWSYM Setper2exec
cmp byte[per2exec],100
jne .not100
mov byte[per2exec],99
.not100
; Decrease standard % of execution by 5% to replace branch and 16bit
; cycle deductions
xor ax,ax
mov al,[opexec268]
mov bl,95
mul bl
mov bl,100
div bl
mov bl,[per2exec]
mul bl
mov bl,100
div bl
mov [opexec268b],al
xor ax,ax
mov al,[opexec358]
mov bl,87 ;82
mul bl
mov bl,100
div bl
mov bl,[per2exec]
mul bl
mov bl,100
div bl
mov [opexec358b],al
xor ax,ax
mov al,[opexec268cph]
mov bl,95
mul bl
mov bl,100
div bl
mov bl,[per2exec]
mul bl
mov bl,100
div bl
mov [opexec268cphb],al
xor ax,ax
mov al,[opexec358cph]
mov bl,87 ;82
mul bl
mov bl,100
div bl
mov bl,[per2exec]
mul bl
mov bl,100
div bl
mov [opexec358cphb],al
ret
;*******************************************************
; Read Input Device Reads from Keyboard, etc.
;*******************************************************
SECTION .data
NEWSYM WhichSW, db 0
NEWSYM WhichGR, db 0
NEWSYM autofr, db 0
TurboCB db 0
NEWSYM MovieTemp, db 0
NEWSYM JoyAOrig, dd 0
NEWSYM JoyBOrig, dd 0
NEWSYM JoyCOrig, dd 0
NEWSYM JoyDOrig, dd 0
NEWSYM JoyEOrig, dd 0
NEWSYM JoyANow, dd 0
NEWSYM JoyBNow, dd 0
NEWSYM JoyCNow, dd 0
NEWSYM JoyDNow, dd 0
NEWSYM JoyENow, dd 0
NEWSYM PJoyAOrig, dd 0
NEWSYM PJoyBOrig, dd 0
NEWSYM PJoyCOrig, dd 0
NEWSYM PJoyDOrig, dd 0
NEWSYM PJoyEOrig, dd 0
NEWSYM LethEnData, dd 0
SECTION .text
%macro PlayerDeviceHelp 3
mov eax,[%1]
cmp byte[chaton],0
je %%okay
cmp eax,40h
jb %%no
%%okay
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,byte[mouseypos]
and al,7Fh
or byte[%1+1],al
mov al,byte[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
cmp byte[CNetType],20
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
loop %%loop
jmp %%endcomb
%%startprogress
mov byte[pressed+ebx],2
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 dword[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 dd 0
ComboPtr dd 0
KeyLPress dd 0
CombDirSwap dd 0
CombDelay times 4 dd 0
StartComb times 4 dd 0
HoldComb times 4 dd 0
PressComb times 4 dd 0
CombCont times 4 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
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.)
mov byte[nojoystickpoll],1
call JoyRead
mov byte[nojoystickpoll],0
; Process Data
mov dword[JoyAOrig],0
; Get Player1 input device
cmp byte[snesmouse],1
jne .nomouse1
call processmouse
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,byte[TurboCB]
test byte[TurboSw],al
jnz near .noswitch
PlayerDeviceHelp pl1Xtk ,JoyAOrig,00400000h
PlayerDeviceHelp pl1Ytk ,JoyAOrig,40000000h
PlayerDeviceHelp pl1Atk ,JoyAOrig,00800000h
PlayerDeviceHelp pl1Btk ,JoyAOrig,80000000h
.noswitch
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[snesmouse],2
jne .nomouse2
call processmouse
ProcSNESMouse JoyBOrig
jmp .noinput2
.nomouse2
cmp byte[snesmouse],3
jne .nosuperscope
call processmouse
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[snesmouse],4
jne .nolethalen
call processmouse
mov eax,[romdata]
cmp dword[eax+1000h],0AD20C203h
jne .not
mov eax,[wramdata]
cmp byte[eax],26
je .not
mov bl,[mousexloc]
mov byte[eax+40Ah],bl
mov bl,[mouseyloc]
mov byte[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,byte[TurboCB]
test byte[TurboSw],al
jnz near .noswitch2
PlayerDeviceHelp pl2Xtk ,JoyBOrig,00400000h
PlayerDeviceHelp pl2Ytk ,JoyBOrig,40000000h
PlayerDeviceHelp pl2Atk ,JoyBOrig,00800000h
PlayerDeviceHelp pl2Btk ,JoyBOrig,80000000h
.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,byte[TurboCB]
test byte[TurboSw],al
jnz near .noswitch3
PlayerDeviceHelp pl3Xtk ,JoyCOrig,00400000h
PlayerDeviceHelp pl3Ytk ,JoyCOrig,40000000h
PlayerDeviceHelp pl3Atk ,JoyCOrig,00800000h
PlayerDeviceHelp pl3Btk ,JoyCOrig,80000000h
.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,byte[TurboCB]
test byte[TurboSw],al
jnz near .noswitch4
PlayerDeviceHelp pl4Xtk ,JoyDOrig,00400000h
PlayerDeviceHelp pl4Ytk ,JoyDOrig,40000000h
PlayerDeviceHelp pl4Atk ,JoyDOrig,00800000h
PlayerDeviceHelp pl4Btk ,JoyDOrig,80000000h
.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,byte[TurboCB]
test byte[TurboSw],al
jnz near .noswitch5
PlayerDeviceHelp pl5Xtk ,JoyEOrig,00400000h
PlayerDeviceHelp pl5Ytk ,JoyEOrig,40000000h
PlayerDeviceHelp pl5Atk ,JoyEOrig,00800000h
PlayerDeviceHelp pl5Btk ,JoyEOrig,80000000h
.noswitch5
ProcessKeyComb 3,JoyEOrig
or dword[JoyEOrig],00008000h ; Joystick Enable
.noinput5
cmp byte[pl12s34],1
je .pl1234
.nopl1234
ret
.pl1234
cmp byte[snesmouse],4
je .nopl1234
cmp byte[snesmouse],1
je .nopl13
mov eax,[JoyCOrig]
or [JoyAOrig],eax
.nopl13
cmp byte[snesmouse],2
je .nopl24
cmp byte[snesmouse],3
je .nopl24
mov eax,[JoyDOrig]
or [JoyBOrig],eax
.nopl24
ret
NEWSYM ProcessMovies
cmp byte[MovieProcessing],2
je near .record
.repeater
pushad
mov bx,[MovieFileHand]
mov ecx,1
mov edx,MovieTemp
call Read_File
cmp eax,0
je near .endplay2
cmp byte[MovieTemp],1
ja near .endplay
cmp byte[MovieTemp],1
je .nomovement
mov ecx,20
mov edx,PJoyAOrig
call Read_File
.nomovement
popad
mov eax,[PJoyAOrig]
mov [JoyAOrig],eax
mov eax,[PJoyBOrig]
mov [JoyBOrig],eax
mov eax,[PJoyCOrig]
mov [JoyCOrig],eax
mov eax,[PJoyDOrig]
mov [JoyDOrig],eax
mov eax,[PJoyEOrig]
mov [JoyEOrig],eax
; cmp byte[RepeatFrame],1
; jne .norepeat
; mov byte[RepeatFrame],0
; jmp .repeater
;.norepeat
ret
.endplay2
mov dword[Msgptr],.movieended
mov eax,[MsgCount]
mov [MessageOn],eax
.endplay
mov byte[MovieProcessing],0
call Close_File
popad
ret
.record
cmp byte[BackState],1
jne .nobackstate
cmp byte[CNetType],20
jae near .storefullcrecv
.nobackstate
mov eax,[JoyAOrig]
cmp eax,[PJoyAOrig]
jne .storefull
mov eax,[JoyBOrig]
cmp eax,[PJoyBOrig]
jne .storefull
mov eax,[JoyCOrig]
cmp eax,[PJoyCOrig]
jne .storefull
mov eax,[JoyDOrig]
cmp eax,[PJoyDOrig]
jne .storefull
mov eax,[JoyEOrig]
cmp eax,[PJoyEOrig]
jne .storefull
mov byte[MovieTemp],1
push ebx
mov ebx,[MovieBuffSize]
mov byte[MovieBuffer+ebx],1
inc dword[MovieBuffSize]
pop ebx
inc dword[MovieBuffFrame]
cmp dword[MovieBuffFrame],60
je near .writebuffertodisk
ret
.storefull
mov eax,[JoyAOrig]
mov [PJoyAOrig],eax
mov eax,[JoyBOrig]
mov [PJoyBOrig],eax
mov eax,[JoyCOrig]
mov [PJoyCOrig],eax
mov eax,[JoyDOrig]
mov [PJoyDOrig],eax
mov eax,[JoyEOrig]
mov [PJoyEOrig],eax
mov byte[MovieTemp],0
push ebx
mov ebx,[MovieBuffSize]
mov byte[MovieBuffer+ebx],0
mov eax,[JoyAOrig]
mov [MovieBuffer+ebx+1],eax
mov eax,[JoyBOrig]
mov [MovieBuffer+ebx+5],eax
mov eax,[JoyCOrig]
mov [MovieBuffer+ebx+9],eax
mov eax,[JoyDOrig]
mov [MovieBuffer+ebx+13],eax
mov eax,[JoyEOrig]
mov [MovieBuffer+ebx+17],eax
add dword[MovieBuffSize],21
pop ebx
inc dword[MovieBuffFrame]
cmp dword[MovieBuffFrame],60
je near .writebuffertodisk
ret
.writebuffertodisk
pushad
mov bx,[MovieFileHand]
mov ecx,[MovieBuffSize]
mov edx,MovieBuffer
call Write_File
popad
mov dword[MovieBuffSize],0
mov dword[MovieBuffFrame],0
ret
.notstorefullcrecv
push ebx
mov eax,[ReadHead]
cmp [CReadHead],eax
jne .juststoredata
inc dword[CFWriteStart]
and dword[CFWriteStart],7Fh
mov eax,[CFWriteHead]
cmp eax,[CFWriteStart]
jne .nowrite
call .writetobuffer
inc dword[CFWriteHead]
and dword[CFWriteHead],7Fh
.nowrite
inc dword[CReadHead]
and dword[CReadHead],7Fh
.juststoredata
mov ebx,[ReadHead]
shl ebx,5
mov byte[StoreBuffer+ebx],1
inc dword[ReadHead]
and dword[ReadHead],7Fh
pop ebx
ret
.storefullcrecv
push ebx
mov eax,[ReadHead]
cmp [CReadHead],eax
jne .juststoredata2
inc dword[CFWriteStart]
and dword[CFWriteStart],7Fh
mov eax,[CFWriteHead]
cmp eax,[CFWriteStart]
jne .nowrite2
call .writetobuffer
inc dword[CFWriteHead]
and dword[CFWriteHead],7Fh
.nowrite2
inc dword[CReadHead]
and dword[CReadHead],7Fh
.juststoredata2
mov ebx,[ReadHead]
shl ebx,5
add ebx,StoreBuffer
mov byte[ebx],0
mov eax,[JoyAOrig]
mov [ebx+1],eax
mov eax,[JoyBOrig]
mov [ebx+5],eax
mov eax,[JoyCOrig]
mov [ebx+9],eax
mov eax,[JoyDOrig]
mov [ebx+13],eax
mov eax,[JoyEOrig]
mov [ebx+17],eax
inc dword[ReadHead]
and dword[ReadHead],7Fh
pop ebx
ret
.writetobuffer
push ecx
mov ecx,[CFWriteHead]
shl ecx,5
add ecx,StoreBuffer
; cmp byte[ecx],1
; je .nochange
mov eax,[ecx+1]
cmp [PJoyAOrig],eax
jne .change
mov eax,[ecx+5]
cmp [PJoyBOrig],eax
jne .change
mov eax,[ecx+9]
cmp [PJoyCOrig],eax
jne .change
mov eax,[ecx+13]
cmp [PJoyDOrig],eax
jne .change
mov eax,[ecx+17]
cmp [PJoyEOrig],eax
jne .change
.nochange
pop ecx
mov ebx,[MovieBuffSize]
mov byte[MovieBuffer+ebx],1
inc dword[MovieBuffSize]
inc dword[MovieBuffFrame]
cmp dword[MovieBuffFrame],60
je near .writebuffer
ret
.change
mov eax,[ecx+1]
mov [PJoyAOrig],eax
mov eax,[ecx+5]
mov [PJoyBOrig],eax
mov eax,[ecx+9]
mov [PJoyCOrig],eax
mov eax,[ecx+13]
mov [PJoyDOrig],eax
mov eax,[ecx+17]
mov [PJoyEOrig],eax
mov ebx,[MovieBuffSize]
mov byte[MovieBuffer+ebx],0
mov eax,[ecx+1]
mov [MovieBuffer+ebx+1],eax
mov eax,[ecx+5]
mov [MovieBuffer+ebx+5],eax
mov eax,[ecx+9]
mov [MovieBuffer+ebx+9],eax
mov eax,[ecx+13]
mov [MovieBuffer+ebx+13],eax
mov eax,[ecx+17]
mov [MovieBuffer+ebx+17],eax
add dword[MovieBuffSize],21
pop ecx
inc dword[MovieBuffFrame]
cmp dword[MovieBuffFrame],60
je .writebuffer
ret
.writebuffer
call .writebuffertodisk
ret
.movieended db 'MOVIE FINISHED.',0
NEWSYM MovieBuffSize, dd 0
NEWSYM MovieBuffFrame, dd 0
MovieBuffer times 21*60 dd 0
NEWSYM CFWriteStart, dd 64+30
NEWSYM CReadHead, dd 0
NEWSYM ReadHead, dd 0
NEWSYM CFWriteHead, dd 0
NEWSYM StoreBuffer, times 128*32 db 0
;*******************************************************
; Init 65816 Initializes the Registers
;*******************************************************
SECTION .data
NEWSYM execatzerovirq, db 0
NEWSYM disablehdma, db 0
NEWSYM disableeffects, db 0
NEWSYM hdmaearlstart, db 0
NEWSYM hdmadelay, db 0
NEWSYM dracxhack, 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 Offby1line, db 0
NEWSYM Reg4212hack, dd 0
NEWSYM CacheCheckSkip, db 0
NEWSYM HIRQSkip, db 0
NEWSYM ClearScreenSkip, db 0
SECTION .text
; hacks :
; Breath of fire 2 : 100/130/25/35 -p 70
; BToads vs DD : 197/192/47/47 -p 130
; Bubsy ; 182/177/44/44 -p 120
; EWJim2 : execatzerovirq = 1
NEWSYM Checkheadersame
mov cl,20
.next
mov al,[esi]
xor al,07Fh
cmp [edi],al
jne .noromhead
inc esi
inc edi
dec cl
jnz .next
mov al,0
ret
.noromhead
mov al,1
ret
NEWSYM Outputfilename
mov esi,[romdata]
add esi,0FFC0h
mov ecx,20
.l
push esi
push ecx
xor eax,eax
mov al,[esi]
xor al,07Fh
call printnum
mov ah,02h
mov dl,','
call Output_Text
pop ecx
pop esi
inc esi
dec ecx
jnz .l
mov ah,02h
mov dl,'-'
call Output_Text
xor eax,eax
mov al,[opexec268]
call printnum
mov ah,02h
mov dl,'-'
call Output_Text
xor eax,eax
mov al,[opexec358]
call printnum
mov ah,02h
mov dl,'-'
call Output_Text
xor eax,eax
mov al,[opexec268cph]
call printnum
mov ah,02h
mov dl,'-'
call Output_Text
xor eax,eax
mov al,[opexec358cph]
call printnum
call Get_Key
ret
; Header hacks
headerhack2:
; Megaman X2 - Header Hack
mov esi,[romdata]
add esi,7FC0h
mov edi,.mmx2head
call Checkheadersame
cmp al,0
jne .noromheadmmx2
mov esi,[romdata]
add esi,32704+22
mov byte[esi],0F3h
.noromheadmmx2
ret
.mmx2head db 50,58,56,62,50,62,49,95,39,77,95,95,95,95,95,95,95,95,95,95
NEWSYM headerhack
mov byte[disablehdma],0
mov byte[Offby1line],0
mov byte[CacheCheckSkip],0
mov byte[HIRQSkip],0
mov dword[WindowDisables],0
mov byte[ClearScreenSkip],0
cmp byte[DSP1Type],0
je .notdis
mov byte[disablehdma],1
.notdis
; Here are the individual game hacks. Some of these probably can
; be removed since many of them were created very early in ZSNES
; development.
mov byte[bgfixer],0
cmp byte[OldGfxMode2],0
je .nobgfixer
mov byte[bgfixer],1
.nobgfixer
mov esi,[romdata]
cmp dword[esi+0FFC8h],'EST6'
jne .notdq
mov byte[CacheCheckSkip],1
mov byte[bgfixer],1
.notdq
cmp dword[esi+07FC8h],'EST6'
jne .notdq2
mov byte[CacheCheckSkip],1
mov byte[bgfixer],1
.notdq2
cmp dword[esi+0FFC0h],'FINA'
jne .notff
; mov dword[WindowDisables],180
.notff
mov esi,[romdata]
add esi,9AB0h
cmp dword[esi],0F00F2908h
jne .notff3
mov byte[opexec268],163
mov byte[opexec358],157
mov byte[opexec268cph],39
mov byte[opexec358cph],39
.notff3
; Earth Worm Jim 2 - IRQ hack (reduce sound static)
mov esi,[romdata]
add esi,0FFC0h
mov edi,.ewj2head
call Checkheadersame
cmp al,0
jne .noromhead2
mov byte[execatzerovirq],1
.noromhead2
; Lamborgini Challenge - -p 110
mov esi,[romdata]
add esi,07FC0h
mov edi,.lambhead
call Checkheadersame
cmp al,0
jne .noromheadlamb
mov byte[opexec268],187
mov byte[opexec358],187
.noromheadlamb
; Addams Family Values - -p 75
mov esi,[romdata]
add esi,07FC0h
mov edi,.adm3head
call Checkheadersame
cmp al,0
jne .noromheadadm3
mov byte[opexec268],120
mov byte[opexec358],100
.noromheadadm3
mov byte[Reg4212hack],0
; Bubsy -p 115
mov esi,[romdata]
add esi,07FC0h
mov edi,.bubshead
call Checkheadersame
cmp al,0
jne .noromhead3
mov byte[opexec268],220
mov byte[opexec358],220
mov byte[opexec268cph],64
mov byte[opexec358cph],64
mov byte[Reg4212hack],4
.noromhead3
; BToad vs DD - 197/192/47/47 -p 120
mov esi,[romdata]
; add esi,07FC0h
cmp dword[esi+640h],0E2FA85F6h
jne .noromhead4
mov byte[opexec268],187
mov byte[opexec358],187
mov byte[opexec268cph],47
mov byte[opexec358cph],47
mov bl,[cycpb358]
mov byte[cycpblt],bl
mov al,[opexec358]
mov byte[cycpl],al
.noromhead4
; Chrono Trigger - 187/182/47/47 -p 120 / res change clear screen disable
mov esi,[romdata]
; add esi,0FFC0h
cmp dword[esi+8640h],0E243728Dh
jne .noromhead6
cmp byte[opexec358],182
ja .noromhead6
mov byte[ClearScreenSkip],1
mov byte[opexec268],187
mov byte[opexec358],182
mov byte[opexec268cph],47
mov byte[opexec358cph],47
mov bl,[cycpb358]
mov byte[cycpblt],bl
mov al,[opexec358]
mov byte[cycpl],al
.noromhead6
; Lufia 2 - 182/177/44/44
mov esi,[romdata]
add esi,07FC0h
mov edi,.luf2head
call Checkheadersame
cmp al,0
jne .noromhead5
mov byte[opexec268],182
mov byte[opexec358],177
mov byte[opexec268cph],44
mov byte[opexec358cph],44
.noromhead5
; PunchOut - Disable HDMA start in middle of screen
mov esi,[romdata]
add esi,07FC0h
mov edi,.pouthead
call Checkheadersame
cmp al,0
jne .noromhead7
mov byte[disablehdma],1
.noromhead7
mov word[IRQHack],0
; Front Mission - -p 140
mov esi,[romdata]
add esi,0FFC0h
cmp dword[esi],0C4DDDBCCh
jne .noromheadfm2
cmp dword[esi+4],0AEBCAFD0h
jne .noromheadfm2
mov byte[opexec268],226
mov byte[opexec358],226
mov byte[opexec268cph],44
mov byte[opexec358cph],44
.noromheadfm2
; Clayfighter 2 - -p 120
mov esi,[romdata]
add esi,0FFC0h
cmp dword[esi],'Clay'
jne .noromheadcf2
cmp byte[esi+12],'2'
jne .noromheadcf2
mov byte[opexec268],187
mov byte[opexec358],182
mov byte[opexec268cph],47
mov byte[opexec358cph],47
.noromheadcf2
mov esi,[romdata]
add esi,0FFC0h
cmp dword[esi],'Donk'
jne .noromheaddk
cmp word[ramsize],2048
jne .noromheaddk
mov word[ramsize],4096
mov word[ramsizeand],4095
.noromheaddk
; Front Mission - -p 140
mov esi,[romdata]
add esi,0FFC0h
cmp dword[esi],'FRON'
jne .noromheadfm
cmp dword[esi+4],'T MI'
jne .noromheadfm
mov byte[opexec268],226
mov byte[opexec358],226
mov byte[opexec268cph],44
mov byte[opexec358cph],44
.noromheadfm
ret
.ewj2head db 58,62,45,43,55,40,48,45,50,95,53,54,50,95,77,95,95,95,95,95
.bubshead db 61,10,29,12,06,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95
.btvdhead db 61,62,43,43,51,58,43,48,62,59,44,95,59,81,59,81,95,95,95,95
.luf2head db 51,10,25,22,30,95,54,54,87,58,12,11,15,16,19,22,12,95,54,54
.pouthead db 44,10,15,26,13,95,47,10,17,28,23,82,48,10,11,94,94,95,95,95
.drcxhead db 41,62,50,47,54,45,58,44,95,52,54,44,44,95,95,95,95,95,95,95
.drx2head db 60,62,44,43,51,58,41,62,49,54,62,95,59,45,62,60,42,51,62,95
.ctrghead db 60,55,45,48,49,48,95,43,45,54,56,56,58,45,95,95,95,95,95,95
.lambhead db 51,62,50,61,48,45,56,55,54,49,54,95,62,50,58,45,54,60,62,49
.adm3head db 62,59,59,62,50,44,95,57,62,50,54,51,38,95,41,62,51,42,58,44
.fmishead db 57,13,16,17,11,95,50,22,12,12,22,16,17,95,87,58,86,95,95,95
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
.unableskip db 'SPC700 STALL DETECTED.',0
SECTION .data
NEWSYM ReturnFromSPCStall, db 0
NEWSYM SPCStallSetting, db 0
NEWSYM SPCSkipXtraROM, db 0
NEWSYM WindowDisables, dd 0
SECTION .text
%macro helpclearmem 2
mov edi,%1
mov ecx,%2
rep stosb
%endmacro
NEWSYM init65816
mov byte[osm2dis],0
mov byte[bgfixer2],0
mov word[ScrDispl],0
cmp byte[SA1Enable],0
je .nosa1init
call SA1Reset
call SetAddressingModesSA1
.nosa1init
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 dword[snesmmap+50h*4],eax
mov dword[snesmap2+50h*4],eax
mov ecx,16384
.spc7110clear
mov dword[eax],0
add eax,4
loop .spc7110clear
.nospc7110init
mov byte[cycpb268],125
mov byte[cycpb358],147
mov byte[cycpbl2],125
mov byte[cycpblt2],125
mov byte[cycpbl],125
mov byte[cycpblt],125
cmp byte[SPC7110Enable],0
jne .specialtimer
cmp byte[SDD1Enable],0
jne .specialtimer
jmp .nospecialtimer
.specialtimer
mov byte[cycpb268],69
mov byte[cycpb358],81
mov byte[cycpbl2],69
mov byte[cycpblt2],69
mov byte[cycpbl],69
mov byte[cycpblt],69
.nospecialtimer
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 Sound buffer
mov edi,[spcBuffera]
mov ecx,65536
xor eax,eax
rep stosd
; Clear Echo buffer
mov edi,echobuf
mov ecx,25000
xor eax,eax
rep stosd
; Clear DSPMem
mov edi,DSPMem
mov ecx,64
xor eax,eax
rep stosd
mov byte[prevoamptr],0FFh
mov byte[execatzerovirq],0
mov byte[disablehdma],0
mov byte[disableeffects],0
mov byte[dracxhack],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
; call Outputfilename
; Check Headers
mov esi,[romdata]
mov byte[hdmaearlstart],0
add esi,07FC0h
cmp byte[esi],'Y'
jne .nohdmaearlstart
mov byte[hdmaearlstart],2
.nohdmaearlstart
call headerhack
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
mov byte[xe],1 ; E
mov ax,[resetv]
mov word[xpc],ax
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 byte[cycpl],al ; 2.68 Mhz / 3.58 Mhz = 228
mov byte[curcyc],al
mov al,[opexec268cph]
mov byte[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
mov eax,080808080h
; Mario Paint, Clear WRAM w/ 0x00 (due to corrupt rom w/ trainer removed)
mov esi,[romdata]
add esi,07FC0h
cmp dword[esi],'MARI'
jne .notmpaint
xor eax,eax
.notmpaint
mov esi,[romdata]
add esi,07FC0h
cmp word[esi],'BS' ; 7FFFFFA
jne .notbsx
.yesbsx
mov eax,0FFFFFFFFh
pushad
xor edx,edx
mov eax,128
mov ebx,[NumofBanks]
div ebx
mov ecx,eax
dec ecx
jz .skipbsxmove
mov ebx,[NumofBanks]
shl ebx,15
mov edx,ebx
add ebx,[romdata]
.loopbsx
mov esi,[romdata]
mov edi,edx
.loopbsx2
mov al,[esi]
xor al,al
mov [ebx],al
inc esi
inc ebx
dec edi
jnz .loopbsx2
loop .loopbsx
.skipbsxmove
popad
.notbsx
helpclearmem wramdataa, 65536
helpclearmem ram7fa, 65536
cmp word[esi],'BS'
jne .notbsx2
mov dword[ram7fa+65528],01010101h
mov dword[ram7fa+65532],01010101h
.notbsx2
xor eax,eax
helpclearmem [vram], 65536
helpclearmem vidmemch2, 4096
helpclearmem vidmemch4, 4096
helpclearmem vidmemch8, 4096
ret
.boffound db '.....',0
;*******************************************************
; 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 .data
NEWSYM curromsize, db 0
NEWSYM cromptradd, dd 0
NEWSYM NoiseDisTemp, dd 0,0
SECTION .text
NEWSYM initsnes
mov byte[ForceNewGfxOff],0
mov dword[NoiseDisTemp],0
mov dword[NoiseDisTemp+4],0
mov esi,[romdata]
add esi,7FC0h
cmp word[esi],'BS' ; 7FFFFFA
je near .bslorom
mov esi,[romdata]
add esi,32704+22
cmp byte[romtype],2
jne .nohirom2b
add esi,8000h
.nohirom2b
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
mov al,[esi]
and al,0F0h
cmp byte[romtype],1
jne .nosfx
cmp al,10h
je near .sfx
.nosfx
cmp al,30h
je near SA1memmap
cmp al,40h
je near SDD1memmap
cmp byte[SPC7110Enable],1
je near .hirom
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
loop .loopa
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
mov ecx,40h
.loopb
stosd
add eax,8000h
loop .loopb
; set banks 80-BF (40h x 32KB ROM banks @ 8000h)
mov eax,[romdata]
sub eax,8000h
mov cx,40h
.loopc
stosd
add eax,8000h
loop .loopc
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
mov ecx,40h
.loopd
stosd
add eax,8000h
loop .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
loop .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
loop .loopb2
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
mov eax,[wramdata]
mov ecx,40h
.loopc2
stosd
loop .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
loop .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
loop .loopas
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
mov ecx,40h
.loopbs
stosd
add eax,8000h
loop .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
loop .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
loop .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
loop .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
loop .loopb2s
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
mov eax,[wramdata]
mov ecx,40h
.loopc2s
stosd
loop .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
loop .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 dword[NoiseDisTemp],01000101h
mov dword[NoiseDisTemp+4],01h
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
loop .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
loop .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
loop .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
loop .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
loop .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
loop .loopb3
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
mov eax,[wramdata]
mov ecx,40h
.loopc23
stosd
loop .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
loop .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
call prepare48mbit
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
loop .loopab
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
mov eax,[romdata]
mov ecx,40h
.loopbb
stosd
add eax,10000h
loop .loopbb
; set banks 80-BF (40h x 32KB ROM banks @ 8000h)
mov eax,[romdata]
mov ecx,40h
.loopcb
stosd
add eax,10000h
loop .loopcb
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
mov eax,[romdata]
mov ecx,40h
.loopdb
stosd
add eax,10000h
loop .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
loop .loopa2b
; set banks 40-6F (30h x 64KB ROM banks @ 0000h)
mov eax,[romdata]
mov cx,40h
.loopb2b
stosd
add eax,10000h
loop .loopb2b
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
mov eax,[wramdata]
mov cx,40h
.loopc2b
stosd
loop .loopc2b
; set banks C0-FF (40h x 64KB ROM banks @ 0000h)
mov eax,[romdata]
mov cx,40h
.loopd2b
stosd
add eax,10000h
loop .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
loop .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
loop .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
loop .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
loop .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
loop .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
loop .loopb23s
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
mov eax,[wramdata]
mov ecx,40h
.loopc23s
stosd
loop .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
loop .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
loop .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
loop .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
loop .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
loop .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
loop .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
loop .loopb23s
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
mov eax,[wramdata]
mov ecx,40h
.loopc23s
stosd
loop .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
loop .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
loop .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
loop .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
loop .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
loop .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
loop .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
loop .loopb23s
; set banks 80-BF (01h x 32KB WRAM @ 0000h)
mov eax,[wramdata]
mov ecx,40h
.loopc23s
stosd
loop .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
loop .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
;*******************************************************
; Prepare 48mbit Moves blocks around for 48mbit
;*******************************************************
SECTION .data
NEWSYM memdest, dd 0
NEWSYM SFXCounter, dd 0
SECTION .text
NEWSYM prepare48mbit
; make table 2 (64,0,65,1,...)
mov edi,mode7tab+128
mov ecx,64
mov al,64
mov ah,0
.nextl2
mov [edi],al
mov [edi+1],ah
inc al
inc ah
add edi,2
dec ecx
jnz .nextl2
mov eax,[romdata]
add eax,200000h
mov [memdest],eax
call ProcessSwapTable
cmp byte[romtype],1
je .nothirom
call UnInterleave48mbit
.nothirom
ret
UnInterleave48mbit:
pushad
; make table 2 (0 .. 255)
mov edi,mode7tab+256
mov ecx,256
xor al,al
.nextlb2
mov [edi],al
inc al
inc edi
dec ecx
jnz .nextlb2
mov esi,mode7tab+256
mov ecx,40h
xor al,al
.loop
mov [esi+40h],al
inc al
inc esi
loop .loop
mov esi,mode7tab+256
mov ecx,40h
mov al,40h+1
.loop2
mov [esi+80h],al
add al,2
inc esi
loop .loop2
mov esi,mode7tab+256
mov ecx,20h
mov al,40h
.loop3
mov [esi+20h],al
add al,2
mov [esi],al
add al,2
inc esi
loop .loop3
call SwapTable256
popad
ret
NEWSYM ProcessSwapTable
; make table 1 (0 .. 127)
mov edi,mode7tab
mov ecx,128
xor al,al
.nextl
mov [edi],al
inc al
inc edi
dec ecx
jnz .nextl
xor eax,eax
xor ebx,ebx
; sort memory
; start at first entry in table 2
mov esi,mode7tab+128
mov ecx,128
.nextentry
; find which blocks to swap
; search entry from table 2 in table 1
mov al,[esi]
mov edi,mode7tab
.findnext
mov bl,[edi]
cmp bl,al
je .foundit
inc edi
jmp .findnext
.foundit
mov bl,[esi-128]
mov [esi-128],al
mov [edi],bl
mov eax,esi
sub eax,mode7tab+128
mov ebx,edi
sub ebx,mode7tab
; swap blocks at memory location $200000+al*8000h with $200000+bl*8000h
shl eax,15
add eax,[memdest]
shl ebx,15
add ebx,[memdest]
push esi
mov esi,eax
mov edi,ebx
mov edx,2000h
.loopa
mov eax,[esi]
mov ebx,[edi]
mov [esi],ebx
mov [edi],eax
add esi,4
add edi,4
dec edx
jnz .loopa
pop esi
xor eax,eax
xor ebx,ebx
inc esi
dec ecx
jnz near .nextentry
call Makemode7Table
ret
NEWSYM preparesfx
mov byte[SFXCounter],0
mov esi,[romdata]
add esi,07FC0h
cmp dword[esi],'FX S'
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
cmp dword[eax+0EFFBBh], 21066396h
je .yesinterleaved
cmp dword[eax+048000h],0E702E1F6h
je .yesinterleaved
jmp .noswapper
.yesinterleaved
mov edi,mode7tab+128
mov ecx,128
mov al,0
.nextl2
mov ah,al
and ah,11100001b
mov bl,al
and bl,00000110b
shl bl,2
or ah,bl
mov bl,al
and bl,00011000b
shr bl,2
or ah,bl
mov [edi],ah
inc al
inc edi
dec ecx
jnz .nextl2
mov eax,[romdata]
mov [memdest],eax
call ProcessSwapTable
.noswapper
; 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
loop .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
NEWSYM UnInterleave
pushad
; NumofBanks contains # of 32k banks
; make table 2 (0 .. 255)
mov edi,mode7tab+256
mov ecx,256
xor al,al
.nextlb2
mov [edi],al
inc al
inc edi
dec ecx
jnz .nextlb2
mov eax,[NumofBanks]
shr eax,1
mov edi,mode7tab+256
mov ecx,eax
mov bl,al
xor bh,bh
.nextl
mov [edi],bl
mov [edi+1],bh
inc bl
inc bh
add edi,2
dec ecx
jnz .nextl
call SwapTable256
popad
ret
SwapTable256:
; make table 1 (0 .. 255)
mov edi,mode7tab
mov ecx,256
xor al,al
.nextlb
mov [edi],al
inc al
inc edi
dec ecx
jnz .nextlb
xor eax,eax
xor ebx,ebx
; sort memory
; start at first entry in table 2
mov esi,mode7tab+256
mov ecx,[NumofBanks]
shr ecx,1
add ecx,ecx
.nextentry
; find which blocks to swap
; search entry from table 2 in table 1
mov al,[esi]
mov edi,mode7tab
.findnext
mov bl,[edi]
cmp bl,al
je .foundit
inc edi
jmp .findnext
.foundit
mov bl,[esi-256]
mov [esi-256],al
mov [edi],bl
mov eax,edi
add eax,256
cmp eax,esi
je near .skipthis
mov eax,esi
sub eax,mode7tab+256
mov ebx,edi
sub ebx,mode7tab
; swap blocks at memory location $200000+al*8000h with $200000+bl*8000h
shl eax,15
add eax,[romdata]
shl ebx,15
add ebx,[romdata]
push esi
mov esi,eax
mov edi,ebx
mov edx,2000h
.loopa
mov eax,[esi]
mov ebx,[edi]
mov [esi],ebx
mov [edi],eax
add esi,4
add edi,4
dec edx
jnz .loopa
pop esi
.skipthis
xor eax,eax
xor ebx,ebx
inc esi
dec ecx
jnz near .nextentry
.endthis
call Makemode7Table
ret
;*******************************************************
; Copy execloop
;*******************************************************
NEWSYM copyexecloop
ret
;*******************************************************
; Process execloop
;*******************************************************
NEWSYM procexecloop
cmp byte[spcon],0
jne .noprocloop
mov byte[curexecstate],1
ret
.noprocloop
mov byte[curexecstate],3
ret
;*******************************************************
; Change execloop
;*******************************************************
NEWSYM changeexecloop
ret
;*******************************************************
; Clear Memory
;*******************************************************
;vidbuffera resb 131072
;romdataa resb 4194304+32768+2097152
;wramdataa resb 65536
;ram7fa resb 65536
;vrama resb 65536
;srama resb 32768
;debugbufa resb 80000
;regptra resb 49152
;regptwa resb 49152
;vcache2ba resb 262144
;vcache4ba resb 131072
;vcache8ba resb 65536
%macro helpclearmem2 2
mov edi,%1
mov ecx,%2
rep stosd
%endmacro
NEWSYM clearmem
xor eax,eax
helpclearmem [vidbuffer], 131072
helpclearmem wramdataa, 65536
helpclearmem ram7fa, 65536
helpclearmem [vram], 65536
helpclearmem srama, 65536
helpclearmem debugbufa, 80000
helpclearmem regptra, 49152
helpclearmem regptwa, 49152
helpclearmem [vcache2b], 262144
helpclearmem [vcache4b], 131072
helpclearmem [vcache8b], 65536
helpclearmem vidmemch2, 4096
helpclearmem vidmemch4, 4096
helpclearmem vidmemch8, 4096
helpclearmem pal16b, 1024
helpclearmem pal16bcl, 1024
helpclearmem pal16bclha, 1024
mov eax,0FFFFh
helpclearmem2 pal16bxcl, 256
xor al,al
mov al,0FFh
mov edi,[romdata]
mov ecx,4194304+32768
cmp byte[Sup48mbit],0
je .no48mb
add ecx,2097152
.no48mb
cmp byte[Sup16mbit],0
je .no16mb
sub ecx,2097152
.no16mb
rep stosb
; ret
NEWSYM clearmem2
mov edi,[sram]
mov eax,0FFFFFFFFh
mov ecx,8192*2
rep stosd
mov al,0FFh
mov edi,spcRam
mov ecx,65472
rep stosb
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
loop .loopa
ret
.hexdat db '0123456789ABCDEF'
NEWSYM printhex8
mov ecx,2
xor ebx,ebx
.loopb
mov bx,ax
and bx,0F0h
shr bx,4
mov dl,[.hexdat+ebx]
push ax
mov ah,02h
call Output_Text
pop ax
shl ax,4
loop .loopb
ret
.hexdat db '0123456789ABCDEF'
;*******************************************************
; Load File
;*******************************************************
; Search for header size first which is filesize MOD 32768
NEWSYM RetrieveDataIPS
xor ah,ah
cmp ecx,10000
jne .notoverflow
push edx
push ecx
mov edx,wramdataa
mov ecx,10000
call Read_File
cmp eax,0
jne .notempty
mov ah,1
jmp .empty
.notempty
xor ah,ah
.empty
pop ecx
pop edx
xor ecx,ecx
.notoverflow
mov al,[wramdataa+ecx]
inc ecx
ret
IPSSL dd 0
NEWSYM PatchIPS
mov byte[IPSPatched],0
mov dword[IPSOffset],0
cmp byte[Header512],0
je .no512head
mov dword[IPSOffset],512
.no512head
mov dword[IPSLimit],4096*1024
cmp byte[Sup48mbit],0
je .not48
mov dword[IPSLimit],6144*1024
.not48
cmp byte[Sup16mbit],0
je .not16
mov dword[IPSLimit],2048*1024
.not16
; 1965-1970, >1969*1024+712 (812/850/1000)
; upper bound: 1969*1024+1024
; between 1965-<1970 / 1968,1970
; mov dword[IPSLimit],208062h
; mov dword[IPSSL],208832h
; font = 208062h-208832h
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
cmp byte[eax],'\'
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
mov edx,fname+1
call Open_File
jc near .failed
mov bx,ax
mov edx,Headchek
mov ecx,5
call Read_File
cmp dword[Headchek],'PATC'
jne near .ipsfaileddet
cmp byte[Headchek+4],'H'
jne near .ipsfaileddet
mov ecx,10000
.ipxloop
.findnext
xor edx,edx
call RetrieveDataIPS
cmp ah,0
jne near .ipsfailed
mov dh,al
shl edx,8
call RetrieveDataIPS
cmp ah,0
jne near .ipsfailed
mov dh,al
call RetrieveDataIPS
cmp ah,0
jne near .ipsfailed
mov dl,al
cmp edx,454F46h
je near .ipsokay
call RetrieveDataIPS
cmp ah,0
jne near .ipsfailed
sub edx,[IPSOffset]
mov [IPSCount+1],al
call RetrieveDataIPS
cmp ah,0
jne near .ipsfailed
mov [IPSCount],al
cmp word[IPSCount],0
je .ipsclear
.loop
call RetrieveDataIPS
cmp ah,0
jne near .ipsfailed
; cmp edx,[IPSSL]
; jae .nolimit
cmp edx,[IPSLimit]
jae .limit
.nolimit
mov esi,[romdata]
mov [esi+edx],al
.limit
inc edx
dec word[IPSCount]
jnz .loop
jmp .findnext
.ipsclear
call RetrieveDataIPS
cmp ah,0
jne near .ipsfailed
mov [IPSCount+1],al
call RetrieveDataIPS
cmp ah,0
jne near .ipsfailed
mov [IPSCount],al
call RetrieveDataIPS
cmp ah,0
jne near .ipsfailed
cmp word[IPSCount],0
je near .findnext
mov esi,[romdata]
.loop2
cmp edx,[IPSLimit]
jae .limit2
mov [esi+edx],al
.limit2
inc edx
dec word[IPSCount]
jnz .loop2
jmp .findnext
.ipsokay
mov dword[Msgptr],.ipsokaymsg
mov dword[MessageOn],60*4
mov byte[IPSPatched],1
jmp .ipsfaileddet
.ipsfailed
mov dword[Msgptr],.ipsnokaymsg
mov dword[MessageOn],60*4
mov byte[IPSPatched],1
.ipsfaileddet
call Close_File
.failed
pop eax
mov ebx,[Prevextn]
mov [eax],ebx
; font = 208062h-208832h
; mov esi,[romdata]
; mov [esi+208062h],0
;0-768, 3072-3072+256, 4096-4096+256
; mov edx,2079*1024 ;+2048+2048*40
; mov ecx,2048
; mov esi,[romdata]
;.ltop
; mov byte[esi+edx],0
; inc edx
; loop .ltop
ret
.ipsokaymsg db 'IPS PATCHED.',0
.ipsnokaymsg db 'IPS IS CORRUPT.',0
section .data
NEWSYM Header512, db 0
NEWSYM Prevextn, dd 0
NEWSYM Headchek, db 0,0,0,0,0
NEWSYM IPSLimit, dd 0
NEWSYM IPSOffset, dd 0
NEWSYM IPSCount, dd 0
IPSPatched db 0
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
%ifdef __LINUX__
mov dword[edx],'.cmb'
%else
mov dword[edx],'.CMB'
%endif
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,byte[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
%ifdef __LINUX__
mov dword[edx],'.srm'
%else
mov dword[edx],'.SRM'
%endif
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
%ifdef __LINUX__
mov dword[edx],'.srm'
%else
mov dword[edx],'.SRM'
%endif
.notfound
ret
NEWSYM loadfile
mov byte[TextFile], 0
call GetCurDir
mov byte[InGUI],0
jmp loadfileGUI.nogui
mov dword[MessageOn],0
mov byte[loadedfromgui],0
mov byte[yesoutofmemory],0
mov byte[Header512],0
mov byte[.fail],0
; determine header size
mov dword[.curfileofs],0
mov byte[.first],1
mov byte[.multfound],0
; open file
mov edx,fname+1
call Open_File
jc near .failed
.nextfile
cmp byte[.first],1
je .nomul
cmp byte[.multfound],0
jne .nomul
push eax
push edx
mov byte[.multfound],1
mov edx,.mult
mov ah,9
call Output_Text
pop edx
pop eax
.nomul
mov bx,ax
mov ecx,4194304+32768
cmp byte[Sup48mbit],0
je .no48mb
add ecx,2097152
.no48mb
cmp byte[Sup16mbit],0
je .no16mb
sub ecx,2097152
.no16mb
sub ecx,[.curfileofs]
jnc .nooverflow
xor ecx,ecx
.nooverflow
mov edx,[headdata]
add edx,[.curfileofs]
call Read_File
jc near .failed
or eax,eax
jz near .success
mov ecx,eax
shr eax,15
shl eax,15
mov esi,[headdata]
add esi,[.curfileofs]
mov edi,[headdata]
add edi,[.curfileofs]
sub ecx,eax
or ecx,ecx
jz .nonoheader
add eax,ecx
sub eax,512
mov ecx,512
mov byte[Header512],1
; mov ecx,512
; and eax,0FFFF8000h
; add eax,8000h
.nonoheader
add [.curfileofs],eax
add edi,ecx
.next
mov cl,[edi]
mov [esi],cl
inc esi
inc edi
dec eax
jnz .next
mov ecx,1
mov edx,.temp
call Read_File
cmp eax,0
je .success
mov byte[.fail],1
.success
call Close_File
jc near .failed
; check for 2nd+ part of file
mov edi,fname+1
mov byte[.cchar],'\'
; get position of . or \
.nextsearch
cmp byte[edi],0
je .nomore
cmp byte[edi],'.'
jne .notdot
mov byte[.cchar],'.'
mov [.dotpos],edi
.notdot
cmp byte[edi],'\'
jne .notslash
mov byte[.cchar],'\'
.notslash
inc edi
jmp .nextsearch
.nomore
cmp byte[.cchar],'\'
jne .noslashb
mov [.dotpos],edi
.noslashb
mov edi,[.dotpos]
; search for .1, .2, etc.
cmp byte[edi],'.'
jne .nonumer
cmp byte[edi+1],'1'
jb .nonumer
cmp byte[edi+1],'8'
ja .nonumer
cmp byte[edi+2],0
jne .nonumer
inc byte[edi+1]
xor ecx,ecx
mov byte[.first],2
mov edx,fname+1
call Open_File
jnc near .nextfile
dec byte[edi+1]
.nonumer
; search for A,B,C, etc.
cmp byte[.first],0
je .yesgd
cmp byte[edi-1],'A'
je .yesgd
cmp byte[edi-1],'a'
je .yesgd
jmp .nogdformat
.yesgd
mov byte[.first],0
inc byte[edi-1]
mov edx,fname+1
call Open_File
jnc near .nextfile
dec byte[edi-1]
.nogdformat
call convertsram
mov byte[SramExists],0
; change to sram dir
mov dl,[SRAMDrive]
mov ebx,SRAMDir
call Change_Dir
; 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
jc .failed
call Close_File
jc .failed
.notexist
call OpenCombFile
mov edx,.opened
mov ah,9
call Output_Text
; Verify checksum
mov ecx,[.curfileofs]
mov esi,[headdata]
xor eax,eax
xor ebx,ebx
.nextcs
mov al,[esi]
inc esi
add ebx,eax
dec ecx
jnz .nextcs
mov [Checksumvalue],bx
mov eax,[.curfileofs]
mov [NumofBytes],eax
shr eax,15
mov [NumofBanks],eax
cmp byte[.fail],0
je .notfailed
mov byte[yesoutofmemory],1
.notfailed
mov byte[TextFile], 1
call PatchIPS
ret
.failed
mov edx,.failop
mov ah,9
call Output_Text
jmp DosExit
SECTION .data
.multfound db 0
.first db 0
.cchar db 0
.dotpos dd 0
.curfileofs dd 0
.filehand dw 0
.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
.temp db 0
.fail db 0
NEWSYM Checksumvalue, dw 0
NEWSYM SramExists, db 0
NEWSYM NumofBanks, dd 0
NEWSYM NumofBytes, dd 0
NEWSYM ZipSupport, db 0
InGUI db 0
%ifdef __LINUX__
tempdirname db '/tmp/zziptmp',0
%else
tempdirname db 'zziptmp_.__z',0
%endif
PrevDir db '..',0
SECTION .text
GUIfindBlank db '*.',0
%macro UnZipSearch 1
mov cx,20h
mov edx,%1
call Get_First_Entry
jc %%notfound
test byte[DTALoc+15h],10h
jnz %%notfound
jmp .found
%%notfound
%endmacro
InvalidZip db 'ZSNES Version A does not support .ZIP files.',13,10,'Please use Version C for this feature.',10,13,0
ZipError db 0
UnZipFile:
cmp byte[OSPort],1
jne .noasm
mov ax,03h
int 10h
mov edx,InvalidZip
call PrintStr
jmp DosExit
.noasm
; get Drive/Dir
%ifdef __LINUX__
mov ebx,GUIcurrentdir
%else
mov ebx,GUIcurrentdir+3
%endif
mov edx,GUIcurrentdir
call Get_Dir
%ifndef __LINUX__
add byte[GUIcurrentdir],65
%endif
cmp byte[InGUI],0
je near .nochange
; locate end of string & append filename
%ifdef __LINUX__
mov eax,GUIcurrentdir
%else
mov eax,GUIcurrentdir+3
%endif
.loop
cmp byte[eax],0
je .endfound
inc eax
jmp .loop
.endfound
cmp byte[eax-2],':'
je .noaddslash
%ifdef __LINUX__
mov byte[eax],'/'
%else
mov byte[eax],'\'
%endif
inc eax
.noaddslash
mov ebx,fname+1
.loopb
mov cl,[ebx]
mov [eax],cl
or cl,cl
jz .zero
inc eax
inc ebx
jmp .loopb
.zero
; Change to Save Directory
mov dl,[SRAMDrive]
mov ebx,SRAMDir
call Change_Dir
.nochange
; Change to Temp Directory
mov edx,tempdirname
call Change_Single_Dir
jnc near .notfail
; Create Temp Directory
mov edx,tempdirname
call Create_Dir
; jc near .fail
; Change to Temp Directory
mov edx,tempdirname
call Change_Single_Dir
jc near .fail
.notfail
; mov ax,03h
; int 10h
; mov edx,GUIcurrentdir
; call PrintStr
; jmp DosExit
; Erase contents of the zip directory if there are any stuff
mov esi,mode7tab
call ZipDeleteRecurse
; UnZip File
mov eax,GUIcurrentdir
cmp byte[InGUI],1
je .nogui
mov eax,fname+1
.nogui
push eax
call extractzip
pop eax
cmp byte[ZipError],0
jne near .failed
; Find valid rom file
UnZipSearch GUIsmcfind
UnZipSearch GUIsfcfind
UnZipSearch GUIswcfind
UnZipSearch GUIfigfind
UnZipSearch GUIfind058
UnZipSearch GUIfind078
UnZipSearch GUIfindUSA
UnZipSearch GUIfindJAP
UnZipSearch GUIfindBIN
UnZipSearch GUIfindZIP
UnZipSearch GUIfind1
UnZipSearch GUIfindBlank
.failed
call ZipDelete
jmp .fail
.found
mov byte[ZipSupport],1
mov edx,DTALoc+1Eh
mov eax,fname+1
.continue
mov bl,[edx]
mov [eax],bl
inc eax
inc edx
or bl,bl
jnz .continue
ret
mov ax,3
int 10h
mov edx,DTALoc+1Eh
; mov edx,GUIcurrentdir
call PrintStr
jmp DosExit
.fail
mov byte[ZipSupport],2
ret
ZipDelete:
mov esi,mode7tab
call ZipDeleteRecurse
mov edx,PrevDir
call Change_Single_Dir
mov edx,tempdirname
call Remove_Dir
call Makemode7Table
ret
tempzip db 0
ZipDeleteRecurse:
; Find all directories
mov edx,GUIfindall
mov cx,10h
call Get_First_Entry
jc near .notfounddir
.moreentries2
test byte[DTALoc+15h],10h
jz .nodir
cmp byte[DTALoc+1Eh],'.'
jne .founddir
.nodir
call Get_Next_Entry
jnc .moreentries2
jmp .notfounddir
.founddir
cmp byte[tempzip],3
jne .notone
%ifndef __LINUX__
mov ax,03h
int 10h
%endif
jmp DosExit
.notone
push edx
mov ecx,43
mov edi,DTALoc
.loop
mov al,[edi]
mov [esi],al
inc edi
inc esi
loop .loop
mov edx,DTALoc+1Eh
call Change_Single_Dir
inc byte[tempzip]
call ZipDeleteRecurse
sub esi,43
mov edx,PrevDir
call Change_Single_Dir
mov edx,esi
add edx,1Eh
call Remove_Dir
jc .faildirdel
pop edx
jmp ZipDeleteRecurse
.faildirdel
pop edx
.notfounddir
; ah = 41h, edx = ptr to file
mov cx,20h
mov edx,GUIfindall
call Get_First_Entry
jc .notfound
.moreentries
push edx
mov edx,DTALoc+1Eh
call Delete_File
pop edx
call Get_Next_Entry
jnc .moreentries
.notfound
ret
SPC7110Allocated db 0
SPC7110DIRA db 'FEOEZSP7',0
SPC7110DIRB db 'SMHT-SP7',0
SDD1DIRA db 'SOCNSDD1',0
SDD1DIRB db 'SFA2SDD1',0
SPC7110IndexName db 'INDEX.BIN',0
SPC7110DirEntry db '*.BIN',0
SPC7110CPtr dd 0
SPC7110CPtr2 dd 0
NEWSYM SPC7110nfname, db ' \ .bin',0
NEWSYM SPC7110IndexSize, dd 0
NEWSYM SPC7110Entries, dd 0
spc7110notfound db 'DECOMPRESSED PACK NOT FOUND',0
spc7110notfoundb db 'INDEX DATA NOT FOUND',0
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
cmp byte[romtype],1
jne .notlorom
mov esi,[romdata]
add esi,32704+22
mov al,[esi]
; Star Ocean = 45h, SFA2 = 43h
cmp al,43h
je .sdd1
cmp al,45h
je .sdd1
.notlorom
.sdd1
ret
.spc7110
mov edx,SPC7110DIRA
cmp al,0F9h
je .noSPC7110b
mov edx,SPC7110DIRB
.noSPC7110b
cmp al,043h
jne .noSDD1
mov edx,SDD1DIRB
jmp .sdd1b
.noSDD1
cmp al,045h
jne .noSDD1b
mov edx,SDD1DIRA
jmp .sdd1b
.noSDD1b
mov eax,[edx]
mov [SPC7110nfname],eax
mov eax,[edx+4]
mov [SPC7110nfname+4],eax
call Change_Single_Dir
jc near .nodir
mov edx,SPC7110IndexName
call Open_File
jc near .noindex
mov bx,ax
mov edx,[romdata]
add edx,580000h
mov ecx,12*32768
call Read_File
mov [SPC7110IndexSize],eax
call Close_File
mov dword[SPC7110Entries],0
mov edx,PrevDir
call Change_Single_Dir
ret
.sdd1b
cmp byte[SPC7110Allocated],0
jne .notalloc
push edx
call allocspc7110
mov byte[SPC7110Allocated],1
pop edx
.notalloc
call Change_Single_Dir
jc near .nodir
mov eax,[spc7110romptr]
mov [SPC7110CPtr],eax
add eax,65536
mov [SPC7110CPtr2],eax
mov edx,SPC7110DirEntry
mov cx,20h
call Get_First_Entry
jc near .notfound
.moreentries
pushad
mov edx,DTALoc+1Eh
xor ecx,ecx
xor eax,eax
.loop
cmp byte[edx],'.'
je .fin
cmp byte[edx],0
je .fin
cmp byte[edx],'-'
je .skipthisone
mov al,[edx]
cmp al,'A'
jb .num
cmp al,'a'
jb .uppercl
sub al,'a'-10
jmp .done
.uppercl
sub al,'A'-10
jmp .done
.num
sub al,'0'
.done
shl ecx,4
add ecx,eax
.skipthisone
inc edx
jmp .loop
.fin
; spc7110romptr format:
; 64K - address/pointer/length table
mov ebx,[SPC7110CPtr2]
mov eax,[SPC7110CPtr]
mov [eax],ecx
mov [eax+4],ebx
mov edx,DTALoc+1Eh
call Open_File
jc near .failed
mov bx,ax
add dword[SPC7110CPtr],8
mov edx,[SPC7110CPtr2]
mov ecx,65536
call Read_File
add dword[SPC7110CPtr2],eax
mov edx,dword[SPC7110CPtr]
mov [edx],eax
add dword[SPC7110CPtr],4
call Close_File
inc dword[SPC7110Entries]
.failed
popad
call Get_Next_Entry
jnc near .moreentries
mov edx,PrevDir
call Change_Single_Dir
ret
.notfound
mov edx,PrevDir
call Change_Single_Dir
.nodir
mov dword[Msgptr],spc7110notfound
mov dword[MessageOn],60*6
ret
.noindex
mov edx,PrevDir
call Change_Single_Dir
mov dword[Msgptr],spc7110notfoundb
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
; determine if it's a .zip file or not
mov eax,fname
mov byte[ZipSupport],0
.ziploop
inc eax
cmp byte[eax],0
jne .ziploop
sub eax,4
; cmp byte[eax+1],'.'
; jne .finishzipd2
; cmp byte[eax+2],'g'
; je .zokay4
; cmp byte[eax+2],'G'
; jne .finishzipd2
;.zokay4
; cmp byte[eax+3],'z'
; je .zokay5
; cmp byte[eax+3],'Z'
; jne .finishzipd2
;.zokay5
; jmp .zokay3
.finishzipd2
cmp byte[eax],'.'
jne near .finishzipd
inc eax
cmp byte[eax],'z'
je .zokay1
cmp byte[eax],'Z'
jne .finishzipd
.zokay1
inc eax
cmp byte[eax],'i'
je .zokay2
cmp byte[eax],'I'
jne .finishzipd
.zokay2
inc eax
cmp byte[eax],'p'
je .zokay3
cmp byte[eax],'P'
jne .finishzipd
.zokay3
call UnZipFile
cmp byte[ZipSupport],2
jne .finishzipd
cmp byte[InGUI],1
je .zipfail
jmp .failed
.zipfail
ret
.finishzipd
mov byte[TextFile], 0
mov dword[MessageOn],0
mov byte[loadedfromgui],1
mov byte[Header512],0
mov byte[yesoutofmemory],0
mov byte[.fail],0
; determine header size
mov dword[.curfileofs],0
mov byte[.first],1
mov byte[.multfound],0
mov dword[.curromspace],0
; open file
mov edx,fname+1
call Open_File
jc near .failed
.nextfile
cmp byte[.first],1
je .nomul
cmp byte[.multfound],0
jne .nomul
push eax
push edx
mov byte[.multfound],1
cmp byte[InGUI],1
je .ingui
; mov edx,.mult
; mov ah,9
; call Output_Text
.ingui
pop edx
pop eax
.nomul
mov bx,ax
mov ecx,4194304+32768
cmp byte[Sup48mbit],0
je .no48mb
add ecx,2097152
.no48mb
cmp byte[Sup16mbit],0
je .no16mb
sub ecx,2097152
.no16mb
mov [.maxromspace],ecx
sub dword[.maxromspace],32768
sub ecx,[.curfileofs]
jnc .nooverflow
xor ecx,ecx
.nooverflow
mov edx,[headdata]
add edx,[.curfileofs]
call Read_File
jc near .failed
or eax,eax
jz near .success2
add dword[.curromspace],eax
mov ecx,eax
shr eax,15
shl eax,15
mov esi,[headdata]
add esi,[.curfileofs]
mov edi,[headdata]
add edi,[.curfileofs]
add [.curfileofs],eax
sub ecx,eax
; xor ecx,ecx
; or ecx,ecx
cmp ecx,512
jne .nonoheader
mov byte[Header512],1
mov ecx,512
and eax,0FFFF8000h
add eax,8000h
jmp .yesheader
.nonoheader
add eax,ecx
xor ecx,ecx
.yesheader
add edi,ecx
; check if .smc header
push esi
push eax
mov esi,[headdata]
add esi,7FDCh
add esi,512
mov ax,[esi]
xor ax,[esi+2]
cmp ax,0FFFFh
je .yessmc
add esi,8000h
mov ax,[esi]
xor ax,[esi+2]
cmp ax,0FFFFh
je .yessmc
pop eax
pop esi
jmp .next
.yessmc
pop eax
pop esi
mov edi,esi
add edi,512
and eax,0FFFF8000h
add eax,8000h
; move eax # of bytes from edi to esi
sub dword[.curromspace],512
.next
mov cl,[edi]
mov [esi],cl
inc esi
inc edi
dec eax
jnz .next
mov ecx,1
mov edx,.temp
call Read_File
cmp eax,0
je .success
mov byte[.fail],1
jmp .success
.success2
mov byte[.fail],0
.success
call Close_File
jc near .failed
; check for 2nd+ part of file
mov edi,fname+1
mov byte[.cchar],'\'
; get position of . or \
.nextsearch
cmp byte[edi],0
je .nomore
cmp byte[edi],'.'
jne .notdot
mov byte[.cchar],'.'
mov [.dotpos],edi
.notdot
cmp byte[edi],'\'
jne .notslash
mov byte[.cchar],'\'
.notslash
inc edi
jmp .nextsearch
.nomore
cmp byte[.cchar],'\'
jne .noslashb
mov [.dotpos],edi
.noslashb
mov edi,[.dotpos]
; search for .1, .2, etc.
cmp byte[edi],'.'
jne .nonumer
cmp byte[edi+1],'1'
jb .nonumer
cmp byte[edi+1],'8'
ja .nonumer
cmp byte[edi+2],0
jne .nonumer
inc byte[edi+1]
xor ecx,ecx
mov byte[.first],2
mov edx,fname+1
call Open_File
jnc near .nextfile
dec byte[edi+1]
.nonumer
; search for A,B,C, etc.
cmp byte[.first],0
je .yesgd
cmp byte[edi-1],'A'
je .yesgd
cmp byte[edi-1],'a'
je .yesgd
jmp .nogdformat
.yesgd
mov byte[.first],0
inc byte[edi-1]
mov edx,fname+1
call Open_File
jnc near .nextfile
dec byte[edi-1]
.nogdformat
mov byte[IPSPatched],0
cmp byte[ZipSupport],1
jne .nottempdirdel
call PatchIPS
call ZipDelete
.nottempdirdel
call convertsram
mov byte[SramExists],0
; change to sram dir
mov dl,[SRAMDrive]
mov ebx,SRAMDir
call Change_Dir
; 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
; mirror image
mov eax,[.curromspace]
cmp dword[.maxromspace],eax
jbe .nomir
mov edx,[romdata]
mov ebx,[romdata]
add edx,[.curromspace]
mov ecx,[.curromspace]
.nextmir
mov al,[ebx]
mov [edx],al
inc ebx
inc edx
inc ecx
cmp ecx,[.maxromspace]
jne .nextmir
.nomir
mov eax,[.curfileofs]
mov [NumofBytes],eax
shr eax,15
mov [NumofBanks],eax
; calculate checksum
mov ecx,[.curfileofs]
mov esi,[headdata]
xor eax,eax
xor ebx,ebx
.nextcs
mov al,[esi]
inc esi
add ebx,eax
dec ecx
jnz .nextcs
mov [Checksumvalue],bx
mov eax,[.curfileofs]
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
cmp byte[IPSPatched],0
jne .patched
mov byte[TextFile], 1
call PatchIPS
.patched
ret
.failed
cmp byte[ZipSupport],1
jne .nottempdirdelb
call ZipDelete
.nottempdirdelb
.failed2
cmp byte[InGUI],1
je .noguic
mov edx,.failop
mov ah,9
call Output_Text
.noguic
mov byte[GUIloadfailed],1
jmp DosExit
SECTION .data
.multfound db 0
.first db 0
.cchar db 0
.dotpos dd 0
.curfileofs dd 0
.filehand dw 0
.temp db 0
.fail db 0
.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
.maxromspace dd 0
.curromspace dd 0
NEWSYM GUIloadfailed, db 0
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
mov dl,[SRAMDrive]
mov ebx,SRAMDir
call Change_Dir
ret
;*******************************************************
; 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
; Convert to interleaved - If LoROM and offset 7FD5 contains 21h, then
; uninterleave
NEWSYM showinfo
mov edx,.romsizea
cmp byte[Sup48mbit],0
je .no48
mov edx,.romsizeb
cmp byte[newgfx16b],0
je .no48
mov edx,.romsized
.no48
cmp byte[Sup16mbit],0
je .no16
mov edx,.romsizec
.no16
mov ah,9
call Output_Text
mov edx,.filename
mov ah,9
call Output_Text
xor ecx,ecx
mov cl,[fname]
mov esi,fname+1
mov ah,2
.loopa
lodsb
mov dl,al
call Output_Text
loop .loopa
mov edx,.ret
mov ah,9
call Output_Text
; frameskip = ?
mov edx,.frameskip
mov ah,9
call Output_Text
mov dl,[frameskip]
test dl,0FFh
jnz .yesfs
mov edx,.auto
mov ah,9
call Output_Text
jmp .skip
.yesfs
mov ah,2
add dl,47
call Output_Text
mov edx,.ret
mov ah,9
call Output_Text
.skip
; debugger on/off
mov edx,.debugon
mov ah,9
call Output_Text
mov al,[debugger]
test al,0FFh
jnz .debugron
mov edx,.off
mov ah,9
call Output_Text
jmp .skip2
.debugron
mov edx,.on
mov ah,9
call Output_Text
.skip2
mov edx,.ret
mov ah,9
call Output_Text
; memory free
mov edx,.memryfr
call Output_Text
mov edx,.memfree
call Get_Memfree
mov eax,[.memfree]
call printnum
mov edx,.ret
mov ah,9
call Output_Text
call Output_Text
; ROM Information
mov edx,.smcname
mov ah,9
call Output_Text
; determine whether hirom or lorom is used
cmp byte[romtype],0
jnz near .donecheck
call CheckROMType
cmp byte[ROMTypeNOTFound],0
je .donecheck
mov ah,09h
mov edx,.doh
call Output_Text
jmp DosExit
.donecheck
; COP Software 00FFF4,5 00FFE4,5 N/A
; ABORT Hardware 00FFF8,9 00FFE8,9 2
; NMI Hardware 00FFFA,B 00FFEA,B 3
; RES Hardware 00FFFC.D 00FFFC,D 1
; BRK Software 00FFFE,F 00FFE6,7 N/A
; IRQ Hardware 00FFFE,F 00FFEE,F 4
call SetIRQVectors
; Output Name
mov esi,[romdata]
add esi,7FC0h
cmp byte[romtype],2
jne .nohirom2
add esi,8000h
.nohirom2
mov ecx,21
.loopb
lodsb
mov dl,al
mov ah,2
call Output_Text
loop .loopb
inc esi
mov edx,.ret
; ROM Type
mov ah,9
call Output_Text
mov edx,.romtyp
call Output_Text
mov edx,.hirom
cmp byte[romtype],1
jne .nolorom
mov edx,.lorom
.nolorom
call Output_Text
mov edx,.romtype
xor ebx,ebx
mov bl,[esi]
; xor eax,eax
; mov al,bl
; call printnum
; jmp DosExit
mov al,bl
inc esi
cmp al,055h
jne .noRTC
mov bl,12
jmp .nochip
.noRTC
cmp al,0F5h
je .yesSPC7110
cmp al,0F9h
jne .noSPC7110
.yesSPC7110
mov bl,11
jmp .nochip
.noSPC7110
cmp al,0F3h
jne .noC4
mov bl,9
jmp .nochip
.noC4
and bl,0F0h
cmp bl,10h
je .sfx
cmp bl,30h
je .sa1
cmp bl,40h
je .sdd1
mov bl,20
cmp al,5
ja .okay
mov bl,al
.okay
jmp .nochip
.sfx
mov bl,6
jmp .nochip
.sa1
mov bl,7
jmp .nochip
.sdd1
mov bl,10
jmp .nochip
.nochip
cmp bl,20
je .unknown
shl bl,4
add edx,ebx
call Output_Text
jmp .nounknown
.unknown
mov edx,.unknowns
call Output_Text
mov al,[esi-1]
call printhex8
mov edx,.brackets
mov ah,9
call Output_Text
.nounknown
; Memory Map
; cmp byte[intldone],0
; je .nointerl
; mov ah,09h
; mov edx,.intlvd
; call Output_Text
;.nointerl
mov ah,09h
mov edx,.memmap
call Output_Text
push esi
mov esi,[romdata]
add esi,7FD5h
xor eax,eax
mov al,byte[esi]
and al,2Fh
pop esi
call printhex8
mov ah,09h
mov edx,.ret
call Output_Text
; ROM Size
mov edx,.romsize
mov ah,9
call Output_Text
mov cl,[esi]
mov [curromsize],cl
; cmp byte[NumofBanks],160
; jb .not48
; mov byte[curromsize],13
;.not48
inc esi
xor eax,eax
sub cl,7
mov al,1
shl al,cl
call printnum
mov edx,.megabit
mov ah,9
call Output_Text
; RAM Size
mov edx,.sramsize
mov ah,9
call Output_Text
and eax,0FFFFh
mov cl,[esi]
inc esi
xor eax,eax
mov al,1
shl al,cl
cmp al,1
jne .yessram
mov al,0
.yessram
call printnum
shl eax,10
cmp eax,65536
jbe .nosramc
mov eax,65536
.nosramc
mov [ramsize],eax
dec eax
mov [ramsizeand],eax
mov edx,.kilobit
mov ah,9
call Output_Text
mov al,[esi]
cmp byte[ForcePal],1
jne .nontsc
mov al,0
.nontsc
cmp byte[ForcePal],2
jne .nopal2
mov al,2
.nopal2
mov byte[romispal],0
mov word[totlines],262
mov dword[MsgCount],120
cmp al,1
jbe .nopal
cmp al,0Fh
je .nopal
mov byte[romispal],1
mov word[totlines],314
mov dword[MsgCount],100
mov edx,.romtypep
mov ah,9
call Output_Text
jmp .yespal
.nopal
mov edx,.romtypen
mov ah,9
call Output_Text
.yespal
mov esi,[headdata]
add esi,7FBDh
cmp byte[romtype],2
jne .nohirom4
add esi,8000h
.nohirom4
cmp byte[esi],0
je .nochipram
jmp .nochipram
mov edx,.ramsize
mov ah,9
call Output_Text
xor eax,eax
mov al,[esi]
shl eax,12
call printnum
mov edx,.kilobit
mov ah,9
call Output_Text
.nochipram
;FFBD (0=none, 1=16kbit, 3=64kbit, 5=256kbit,etc.
mov edx,.checksumc
mov ah,9
; call Output_Text
mov ax,[Checksumvalue]
mov esi,[headdata]
add esi,7FDCh+2
cmp byte[romtype],2
jne .nohirom3
add esi,8000h
.nohirom3
cmp ax,[esi]
jne .failed
mov edx,.cpassed
jmp .passed
.failed
mov edx,.cfailed
.passed
mov ah,9
; call Output_Text
; Display NMI & Reset
mov edx,.nmidisp
mov ah,9
call Output_Text
xor eax,eax
mov ax,[nmiv]
call printhex
mov edx,.ret
mov ah,9
call Output_Text
mov edx,.resetdisp
mov ah,9
call Output_Text
mov ax,[resetv]
call printhex
mov edx,.ret
mov ah,9
call Output_Text
cmp byte[intldone],1
jne .nointerl
mov edx,.intlvd
mov ah,9
call Output_Text
.nointerl
mov edx,.ret
mov ah,9
call Output_Text
mov edx,.waitkey
mov ah,9
call Output_Text
; wait for key
cmp byte[enterpress],0
jne .noesc
cmp byte[OSPort],3
je .noesc
call Get_Key
cmp al,27
jne .noesc
mov dl,[InitDrive]
mov ebx,InitDir
call Change_Dir
jmp DosExit
.noesc
mov edx,.ret
call Output_Text
ret
SECTION .data
.memfree times 30 db 0
.filename db 'Filename : ',0
.frameskip db 'Frame Skip : ',0
.percexec db '% to Exec : ',0
.debugon db 'Debugger : ',0
.memryfr db 'Memory Free : ',0
.auto db 'AUTO',13,10,0
.on db 'ON',13,10,0
.off db 'OFF',13,10,0
.ret db 13,10,0
.waitkey db 'Press Any Key to Continue.',0
.smcname db 'Cartridge name : ',0
.romtyp db 'ROM type : ',0
.memmap db 'Memory Map : ',0
.hirom db 'HIROM/',0
.lorom db 'LOROM/',0
.romtype db 'ROM ',13,10,0
db 'ROM/RAM ',13,10,0
db 'ROM/SRAM ',13,10,0
db 'ROM/DSP1 ',13,10,0
db 'RAM/DSP1/RAM ',13,10,0
db 'ROM/DSP1/SRAM',13,10,0
db 'SFX ',13,10,0
db 'SA-1 ',13,10,0
db 'SFX2/RAM ',13,10,0
db 'C4/ROM ',13,10,0
db 'SDD-1 ',13,10,0
db 'SPC7110 ',13,10,0
db 'S-RTC ',13,10,0
.unknowns db 'UNKNOWN (',0
.brackets db ')',13,10,0
.romsize db 'ROM size : ',0
.sramsize db 'SRAM size : ',0
.ramsize db 'CartRAM size : ',0
.romtypep db 'ROM Type : PAL',13,10,0
.romtypen db 'ROM Type : NTSC',13,10,0
.checksumc db 'Checksum : ',0
.cpassed db 'PASSED',13,10,0
.cfailed db 'FAILED',13,10,0
.romsizea db 13,10,'Max 32mbit ROM support',13,10,13,10,0
.romsizeb db 13,10,'Max 48mbit ROM support + SuperFX/C4 support',13,10,13,10,0
.romsizec db 13,10,'Max 16mbit ROM support',13,10,13,10,0
.romsized db 13,10,'Max 48mbit ROM support + SuperFX/C4 support + 16bit New Gfx Engine',13,10,13,10,0
.megabit db ' Megabits',13,10,0
.kilobit db ' Kilobytes',13,10,0
.nmidisp db 'NMI Vector Location : ',0
.resetdisp db 'Reset Vector Location : ',0
.doh db 'Cannot detect whether cartridge is HiROM or LoROM.',13,10,'Please use -h/-l',13,10,0
.intlvd db 'Image is uninterleaved.',13,10,0
NEWSYM DSP1Type, db 0
NEWSYM intldone, db 0
SECTION .text
NEWSYM CheckROMType
call SetAddressingModes
call GenerateBank0Table
call headerhack2
mov byte[ROMTypeNOTFound],0
; check reset vectors
; RES Hardware 00FFFC.D 00FFFC,D 1
mov esi,[romdata]
mov ax,[esi+0FFFCh]
mov bx,[esi+07FFCh]
test ax,8000h
jnz .checkloarea
test bx,8000h
jz .notfound2
mov byte[romtype],1
jmp .donecheck
.checkloarea
test bx,8000h
jnz .notfound2
mov byte[romtype],2
jmp .donecheck
.notfound2
mov esi,[romdata]
add esi,7FECh
cmp word[esi],8000h
jb .checkhirom
mov esi,[romdata]
add esi,32704+23
cmp byte[esi],32
ja .checkhirom
mov esi,[romdata]
add esi,7FDCh
lodsw
mov bx,ax
lodsw
xor bx,ax
cmp bx,0FFFFh
jne .checkhirom
cmp ax,0
je .checkhirom
cmp ax,0FFFFh
je .checkhirom
mov byte[romtype],1
jmp .donecheck
.checkhirom
mov esi,[romdata]
add esi,32704+23+32768
cmp byte[esi],32
ja .cantcheck
mov esi,[romdata]
add esi,0FFDCh
lodsw
mov bx,ax
lodsw
xor bx,ax
cmp bx,0FFFFh
jne .cantcheck
mov byte[romtype],2
jmp .donecheck
.cantcheck
; check for a header with mostly letters or spaces
mov esi,[romdata]
add esi,32704
mov ecx,21
mov al,0
.nextletter
cmp byte[esi],32
je .yesletter
cmp byte[esi],'0'
jb .noletter
cmp byte[esi],'9'
jbe .yesletter
cmp byte[esi],'A'
jb .noletter
cmp byte[esi],'Z'
jbe .yesletter
cmp byte[esi],'a'
jb .noletter
cmp byte[esi],'z'
ja .noletter
.yesletter
inc al
.noletter
inc esi
loop .nextletter
cmp al,12
jna .checkhiromletter
mov byte[romtype],1
jmp .donecheck
.checkhiromletter
mov esi,[romdata]
add esi,65472
mov ecx,21
mov al,0
.nextletterb
cmp byte[esi],32
je .yesletterb
cmp byte[esi],'0'
jb .noletterb
cmp byte[esi],'9'
jbe .yesletterb
cmp byte[esi],'A'
jb .noletterb
cmp byte[esi],'Z'
jbe .yesletterb
cmp byte[esi],'a'
jb .noletterb
cmp byte[esi],'z'
ja .noletterb
.yesletterb
inc al
.noletterb
inc esi
loop .nextletterb
cmp al,12
jna .notfound
mov byte[romtype],2
jmp .donecheck
.notfound
mov esi,[romdata]
mov ax,[esi+0FFFCh]
mov bx,[esi+07FFCh]
cmp ax,8000h
jne .checkloarea8000
cmp bx,8000h
je .notfound28000
mov byte[romtype],2
jmp .donecheck
.checkloarea8000
cmp bx,8000h
jne .notfound28000
mov byte[romtype],1
jmp .donecheck
.notfound28000
mov byte[ROMTypeNOTFound],1
.donecheck
cmp byte[forceromtype],0
je .noforce
mov al,[forceromtype]
mov [romtype],al
mov byte[forceromtype],0
mov byte[ROMTypeNOTFound],0
jmp .doneinterl
.noforce
mov byte[intldone],0
cmp byte[romtype],1
jne .nointerlcheck
mov esi,[romdata]
add esi,7FD5h
cmp byte[esi],21h
je .interleaved
cmp byte[esi],92h
je .interleaved
mov eax,[romdata]
add eax,07FC0h
cmp dword[eax+8],'EST3'
je .interleaved
cmp byte[eax],'T'
je .nointerlcheck
cmp byte[esi],31h
jne .nointerlcheck
.interleaved
cmp byte[finterleave],1
je .doneinterl
.interleaved2
mov byte[intldone],1
call UnInterleave
mov byte[romtype],2
jmp .doneinterl
.nointerlcheck
cmp byte[finterleave],1
je .interleaved2
.doneinterl
mov esi,[romdata]
add esi,0FFC0h
mov byte[disablespcclr],0
mov eax,50205040h
or eax,0A000302h
cmp dword[esi],eax
jne .nospcdis
mov byte[disablespcclr],1
.nospcdis
mov eax,[esi]
mov byte[DSP1Type],0
mov esi,[romdata]
add esi,32704+22
cmp byte[romtype],2
jne .nohirom2
add esi,8000h
.nohirom2
mov al,[esi]
cmp al,3
je .dsp1
cmp al,4
je .dsp1
cmp al,5
je .dsp1
jmp .nodsp1
.dsp1
call InitDSP
mov byte[DSP1Type],1
cmp byte[romtype],2
jne .nodsp1
mov byte[DSP1Type],2
.nodsp1
; banks 0-3Fh
mov dword[memtabler8+3Fh*4],regaccessbankr8
mov dword[memtablew8+3Fh*4],regaccessbankw8
mov dword[memtabler16+3Fh*4],regaccessbankr16
mov dword[memtablew16+3Fh*4],regaccessbankw16
mov dword[memtabler8+0BFh*4],regaccessbankr8
mov dword[memtablew8+0BFh*4],regaccessbankw8
mov dword[memtabler16+0BFh*4],regaccessbankr16
mov dword[memtablew16+0BFh*4],regaccessbankw16
mov dword[memtabler8+70h*4],sramaccessbankr8
mov dword[memtablew8+70h*4],sramaccessbankw8
mov dword[memtabler16+70h*4],sramaccessbankr16
mov dword[memtablew16+70h*4],sramaccessbankw16
mov dword[memtabler8+71h*4],sramaccessbankr8
mov dword[memtablew8+71h*4],sramaccessbankw8
mov dword[memtabler16+71h*4],sramaccessbankr16
mov dword[memtablew16+71h*4],sramaccessbankw16
mov dword[memtabler8+72h*4],sramaccessbankr8
mov dword[memtablew8+72h*4],sramaccessbankw8
mov dword[memtabler16+72h*4],sramaccessbankr16
mov dword[memtablew16+72h*4],sramaccessbankw16
mov dword[memtabler8+73h*4],sramaccessbankr8
mov dword[memtablew8+73h*4],sramaccessbankw8
mov dword[memtabler16+73h*4],sramaccessbankr16
mov dword[memtablew16+73h*4],sramaccessbankw16
mov dword[memtabler8+78h*4],memaccessbankr8
mov dword[memtablew8+78h*4],memaccessbankw8
mov dword[memtabler16+78h*4],memaccessbankr16
mov dword[memtablew16+78h*4],memaccessbankw16
mov dword[memtabler8+79h*4],memaccessbankr8
mov dword[memtablew8+79h*4],memaccessbankw8
mov dword[memtabler16+79h*4],memaccessbankr16
mov dword[memtablew16+79h*4],memaccessbankw16
mov esi,[romdata]
add esi,32704+22
cmp byte[romtype],2
jne .nohirom2b
add esi,8000h
.nohirom2b
mov byte[SFXEnable],0
mov byte[C4Enable],0
mov byte[SPC7110Enable],0
mov byte[RTCEnable],0
mov byte[SA1Enable],0
mov byte[SDD1Enable],0
mov byte[SFXSRAM],0
mov al,[esi]
cmp al,055h
jne .noRTC
mov byte[RTCEnable],1
.noRTC
cmp al,0F5h
je .yesSPC7110
cmp al,0F9h
jne .noSPC7110
.yesSPC7110
mov byte[SPC7110Enable],1
jmp .nosfx
.noSPC7110
cmp al,0F3h
jne .noc4chip
mov byte[C4Enable],1
jmp .nosfx
.noc4chip
and al,0F0h
cmp al,10h
je .yessfx
cmp al,30h
je near .yessa1
cmp al,40h
je near .yessdd1
jmp .nosfx
.yessfx
mov al,[esi]
and al,0Fh
cmp al,5
je .sram
cmp al,6
jne .nosram
.sram
mov byte[SFXSRAM],1
.nosram
cmp byte[Sup48mbit],1
je .sfxokay
mov byte[yesoutofmemory],1
jmp .nosfx
.sfxokay
mov byte[SFXEnable],1
mov dword[memtabler8+70h*4],sfxaccessbankr8
mov dword[memtablew8+70h*4],sfxaccessbankw8
mov dword[memtabler16+70h*4],sfxaccessbankr16
mov dword[memtablew16+70h*4],sfxaccessbankw16
mov dword[memtabler8+71h*4],sfxaccessbankr8b
mov dword[memtablew8+71h*4],sfxaccessbankw8b
mov dword[memtabler16+71h*4],sfxaccessbankr16b
mov dword[memtablew16+71h*4],sfxaccessbankw16b
mov dword[memtabler8+72h*4],sfxaccessbankr8c
mov dword[memtablew8+72h*4],sfxaccessbankw8c
mov dword[memtabler16+72h*4],sfxaccessbankr16c
mov dword[memtablew16+72h*4],sfxaccessbankw16c
mov dword[memtabler8+73h*4],sfxaccessbankr8d
mov dword[memtablew8+73h*4],sfxaccessbankw8d
mov dword[memtabler16+73h*4],sfxaccessbankr16d
mov dword[memtablew16+73h*4],sfxaccessbankw16d
mov dword[memtabler8+78h*4],sramaccessbankr8s
mov dword[memtablew8+78h*4],sramaccessbankw8s
mov dword[memtabler16+78h*4],sramaccessbankr16s
mov dword[memtablew16+78h*4],sramaccessbankw16s
mov dword[memtabler8+79h*4],sramaccessbankr8s
mov dword[memtablew8+79h*4],sramaccessbankw8s
mov dword[memtabler16+79h*4],sramaccessbankr16s
mov dword[memtablew16+79h*4],sramaccessbankw16s
mov dword[SfxR1],0
mov dword[SfxR2],0
mov esi,[sfxramdata]
mov ecx,65536
.loopsfxclear
mov dword[esi],0
add esi,4
dec ecx
jnz .loopsfxclear
cmp byte[SramExists],0
je .nosramsfx
mov esi,[sram]
mov edi,[sfxramdata]
mov ecx,16384
.sfxsramloop
mov eax,[esi]
mov [edi],eax
add esi,4
add edi,4
dec ecx
jnz .sfxsramloop
.nosramsfx
call InitFxTables
.nosfx
jmp .nosa1
.yessdd1
mov byte[SDD1Enable],1
jmp .nosa1
.yessa1
mov byte[SA1Enable],1
.nosa1
mov dword[SfxSFR],0
mov byte[SfxSCMR],0
call initregr
call initregw
cmp byte[SA1Enable],0
je .nosa1init
call GenerateBank0TableSA1
call SetAddressingModesSA1
; open .srm file
mov edx,fnames+1
call Open_File
jc .nosa1init
mov byte[SramExists],1
mov bx,ax
mov ecx,65536*2
mov edx,[romdata]
add edx,1024*4096
call Read_File
jc .nosa1init
call Close_File
.nosa1init
cmp byte[DSP1Type],1
jne .nodsp1lorom
mov dword[memtabler8+3Fh*4],DSP1Read8b3F
mov dword[memtablew8+3Fh*4],DSP1Write8b3F
mov dword[memtabler16+3Fh*4],DSP1Read16b3F
mov dword[memtablew16+3Fh*4],DSP1Write16b3F
mov dword[memtabler8+0BFh*4],DSP1Read8b3F
mov dword[memtablew8+0BFh*4],DSP1Write8b3F
mov dword[memtabler16+0BFh*4],DSP1Read16b3F
mov dword[memtablew16+0BFh*4],DSP1Write16b3F
.nodsp1lorom
mov dword[wramdata],wramdataa
call SPC7110Load
ret
SECTION .data
NEWSYM SFXEnable, db 0
NEWSYM C4Enable, db 0
NEWSYM SPC7110Enable, db 0
NEWSYM RTCEnable, db 0
NEWSYM SA1Enable, db 0
NEWSYM SDD1Enable, db 0
NEWSYM C4RamR, dd 0
NEWSYM C4RamW, dd 0
NEWSYM C4Ram, dd 0
NEWSYM ROMTypeNOTFound, db 0
SECTION .text
NEWSYM SetIRQVectors
; Get Vectors (NMI & Reset)
mov esi,[romdata]
add esi,32704+21
cmp byte[romtype],2
jne .nohirom9
add esi,8000h
.nohirom9
mov al,[esi]
test al,0F0h
jnz .yesfastrom
mov al,[opexec268]
mov [opexec358],al
mov al,[opexec268cph]
mov [opexec358cph],al
mov al,[cycpb268]
mov [cycpb358],al
.yesfastrom
mov esi,[romdata]
add esi,7FE4h
cmp byte[romtype],2
jne .nohirom
add esi,8000h
.nohirom
cmp word[esi+24],0FFFFh
jne .notreseterror
mov word[esi+6],0FF9Ch
mov word[esi+24],0FF80h
.notreseterror
lodsw
mov [copv],ax
lodsw
mov [brkv],ax
lodsw
mov [abortv],ax
lodsw
mov [nmiv],ax
mov [nmiv2],ax
add esi,2
lodsw
mov [irqv],ax
mov [irqv2],ax
add esi,4
; 8-bit and reset
lodsw
mov [copv8],ax
inc esi
inc esi
lodsw
mov [abortv8],ax
lodsw
mov [nmiv8],ax
lodsw
mov [resetv],ax
lodsw
mov [brkv8],ax
mov [irqv8],ax
cmp byte[yesoutofmemory],0
je .notfailed
mov word[resetv],8000h
mov esi,[romdata]
mov word[esi],0FE80h
mov word[esi+8000h],0FE80h
.notfailed
ret
NEWSYM outofmemfix
mov esi,[romdata]
cmp byte[romtype],2
je .hirom
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
.hirom
add esi,8000h
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 .notso2
mov dword[Msgptr],outofmemoryerror2
.notso2
mov dword[MessageOn],0FFFFFFFFh
ret
SECTION .data
NEWSYM yesoutofmemory, db 0
NEWSYM outofmemoryerror, db 'OUT OF MEMORY.',0
NEWSYM outofmemoryerror2, db 'ROM IS TOO BIG.',0
SECTION .text
NEWSYM InitAsmEnd