diff --git a/zsnes/src/Makefile.in b/zsnes/src/Makefile.in index fa61627e..4ae46f99 100644 --- a/zsnes/src/Makefile.in +++ b/zsnes/src/Makefile.in @@ -1,183 +1,183 @@ -#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. - -CHIPDIR=chips -CPUDIR=cpu -DOSDIR=dos -GUIDIR=gui -VIDEODIR=video -WINDIR=linux -OBJDIR=obj -ZIPDIR=zip - -CHIPSOBJ=${CHIPDIR}/sfxproc.o ${CHIPDIR}/fxemu2.o ${CHIPDIR}/dsp1proc.o\ - ${CHIPDIR}/fxemu2b.o ${CHIPDIR}/fxemu2c.o ${CHIPDIR}/fxtable.o\ - ${CHIPDIR}/sa1proc.o ${CHIPDIR}/sa1regs.o ${CHIPDIR}/dsp1emu.o - -CPUOBJ=${CPUDIR}/addrni.o ${CPUDIR}/dma.o ${CPUDIR}/dsp.o ${CPUDIR}/dspproc.o\ - ${CPUDIR}/execute.o ${CPUDIR}/irq.o ${CPUDIR}/memory.o \ - ${CPUDIR}/spc700.o ${CPUDIR}/stable.o ${CPUDIR}/table.o\ - ${CPUDIR}/tableb.o ${CPUDIR}/tablec.o - -GUIOBJ=${GUIDIR}/gui.o ${GUIDIR}/menu.o - -VIDEOBJ=${VIDEODIR}/makev16b.o ${VIDEODIR}/makev16t.o ${VIDEODIR}/makevid.o\ - ${VIDEODIR}/mode716.o ${VIDEODIR}/mode716b.o ${VIDEODIR}/mode716d.o\ - ${VIDEODIR}/mode716e.o ${VIDEODIR}/mode716t.o ${VIDEODIR}/mode7.o\ - ${VIDEODIR}/mode7ext.o ${VIDEODIR}/mv16tms.o ${VIDEODIR}/newg162.o\ - ${VIDEODIR}/newgfx16.o ${VIDEODIR}/newgfx2.o ${VIDEODIR}/newgfx.o\ - ${VIDEODIR}/m716text.o ${VIDEODIR}/2xsaiw.o\ - ${VIDEODIR}/procvid.o ${VIDEODIR}/sw_draw.o - -WINOBJ=${WINDIR}/copyvwin.o ${WINDIR}/sdlintrf.o ${WINDIR}/sdllink.o \ - @GL_DRAW@ ${WINDIR}/sw_draw.o \ - ${WINDIR}/zloaderw.o ${WINDIR}/ztcp.o ${WINDIR}/zipxw.o \ - ${WINDIR}/zfilew.o ${WINDIR}/protect.o - -WINDOSOBJ=${DOSDIR}/debug.o ${DOSDIR}/joy.o ${DOSDIR}/modemrtn.o ${DOSDIR}/vesa2.o\ - ${DOSDIR}/initvid.o ${DOSDIR}/sw.o ${DOSDIR}/gppro.o ${DOSDIR}/vesa12.o - -#PREOBJ=${OBJDIR}/unzip.o ${OBJDIR}/zzip.o ${DOSDIR}/zsipx.o - -ZIPOBJ=${ZIPDIR}/zzip.o ${ZIPDIR}/unzip.o ${ZIPDIR}/zpng.o - -MAINOBJ=cfgload.o endmem.o fixsin.o init.o initc.o ui.o vcache.o water.o smoke.o burn.o - -OBJS=${CHIPSOBJ} ${CPUOBJ} ${WINOBJ} ${WINDOSOBJ} ${GUIOBJ} ${VIDEOBJ} ${ZIPOBJ} ${MAINOBJ} - -.SUFFIXES: .c .asm - -%.o: %.c - @CC@ @CFLAGS@ -o $@ -c $< - -%.o: %.asm - @NASMPATH@ @NFLAGS@ -o $@ $< - -ALL: @ZSNESEXE@ - -@ZSNESEXE@: ${OBJS} - @CC@ -o @ZSNESEXE@ ${OBJS} @CFLAGS@ @LDFLAGS@ - -${ZIPDIR}/zpng.o: ${ZIPDIR}/zpng.c ${ZIPDIR}/zpng.h -${ZIPDIR}/unzip.o: ${ZIPDIR}/unzip.c ${ZIPDIR}/zunzip.h -${ZIPDIR}/zzip.o: ${ZIPDIR}/zzip.c ${ZIPDIR}/zunzip.h -fixsin.o: fixsin.c -water.o: water.c -smoke.o: smoke.c -burn.o: burn.c -${VIDEODIR}/procvid.o: ${VIDEODIR}/procvid.asm macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xsaimmx.inc -${CHIPDIR}/dsp1proc.o: ${CHIPDIR}/dsp1proc.asm macros.mac -${CHIPDIR}/sa1regs.o: ${CHIPDIR}/sa1regs.asm macros.mac\ - ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac -${CHIPDIR}/sfxproc.o: ${CHIPDIR}/sfxproc.asm macros.mac\ - ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac - -${CHIPDIR}/dsp1emu.o: ${CHIPDIR}/dsp1emu.c -ui.o: ui.asm macros.mac -cfgload.o:cfgload.asm macros.mac -init.o:init.asm macros.mac -initc.o:init.c -${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac -${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac -${CPUDIR}/table.o: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\ - ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816.inc\ - ${CPUDIR}/regs.mac ${CPUDIR}/regs.inc ${CPUDIR}/regsw.mac\ - ${CPUDIR}/regsw.inc macros.mac -${CPUDIR}/tableb.o: ${CPUDIR}/tableb.asm ${CPUDIR}/65816db.inc\ - ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816b.inc\ - ${CPUDIR}/regs.mac macros.mac -${CPUDIR}/tablec.o: ${CPUDIR}/tablec.asm ${CPUDIR}/65816dc.inc\ - ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816c.inc\ - ${CPUDIR}/regs.mac macros.mac -${CPUDIR}/stable.o: ${CPUDIR}/stable.asm ${CPUDIR}/s65816d.inc\ - ${CPUDIR}/saddress.inc ${CPUDIR}/saddrni.inc ${CPUDIR}/se65816.inc\ - macros.mac -${CPUDIR}/memory.o: ${CPUDIR}/memory.asm macros.mac -${CPUDIR}/dma.o: ${CPUDIR}/dma.asm macros.mac -${DOSDIR}/dosintrf.o: ${DOSDIR}/dosintrf.asm macros.mac -vcache.o:vcache.asm macros.mac -${DOSDIR}/initvid.o:${DOSDIR}/initvid.asm macros.mac -${VIDEODIR}/makevid.o: ${VIDEODIR}/makevid.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/makev16b.o: ${VIDEODIR}/makev16b.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/makev16t.o: ${VIDEODIR}/makev16t.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/mv16tms.o: ${VIDEODIR}/mv16tms.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/mode7.o: ${VIDEODIR}/mode7.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode716.o: ${VIDEODIR}/mode716.asm ${VIDEODIR}/mode716.mac\ - macros.mac -${VIDEODIR}/mode716b.o:${VIDEODIR}/mode716b.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode716t.o:${VIDEODIR}/mode716t.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode716d.o:${VIDEODIR}/mode716d.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode7ext.o:${VIDEODIR}/mode7ext.asm macros.mac -${VIDEODIR}/mode716e.o:${VIDEODIR}/mode716e.asm macros.mac -${VIDEODIR}/m716text.o:${VIDEODIR}/m716text.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${CPUDIR}/irq.o: ${CPUDIR}/irq.asm macros.mac -${CPUDIR}/dspproc.o: ${CPUDIR}/dspproc.asm macros.mac -${CPUDIR}/spc700.o:${CPUDIR}/spc700.asm macros.mac\ - ${CPUDIR}/regsw.mac ${CPUDIR}/spcdef.inc ${CPUDIR}/spcaddr.inc -${CPUDIR}/dsp.o: ${CPUDIR}/dsp.asm macros.mac -${DOSDIR}/vesa2.o: ${DOSDIR}/vesa2.asm macros.mac -${DOSDIR}/vesa12.o: ${DOSDIR}/vesa12.asm macros.mac -${DOSDIR}/joy.o: ${DOSDIR}/joy.asm macros.mac -${DOSDIR}/sw.o: ${DOSDIR}/sw.asm macros.mac -${GUIDIR}/gui.o: ${GUIDIR}/gui.asm ${GUIDIR}/guitools.inc\ - ${GUIDIR}/guimisc.inc ${GUIDIR}/guimouse.inc ${GUIDIR}/guiwindp.inc\ - ${GUIDIR}/guinetpl.inc ${GUIDIR}/guikeys.inc ${GUIDIR}/guicheat.inc\ - ${GUIDIR}/guicombo.inc ${GUIDIR}/guiload.inc macros.mac -${GUIDIR}/menu.o: ${GUIDIR}/menu.asm macros.mac -${VIDEODIR}/newgfx.o:${VIDEODIR}/newgfx.asm ${VIDEODIR}/vidmacro.mac\ - ${VIDEODIR}/newgfx2.mac ${VIDEODIR}/newgfx.mac macros.mac -${VIDEODIR}/newgfx2.o:${VIDEODIR}/newgfx2.asm ${VIDEODIR}/newgfxwn.mac\ - ${VIDEODIR}/newgfx.mac macros.mac -${VIDEODIR}/newgfx16.o: ${VIDEODIR}/newgfx16.asm macros.mac ${VIDEODIR}/vidmacro.mac\ - ${VIDEODIR}/newgfx16.mac ${VIDEODIR}/newg162.mac -${VIDEODIR}/newg162.o: macros.mac ${VIDEODIR}/newg162.asm ${VIDEODIR}/newg162.mac\ - ${VIDEODIR}/vidmacro.mac ${VIDEODIR}/newg16wn.mac -${CHIPDIR}/fxemu2.o: ${CHIPDIR}/fxemu2.asm ${CHIPDIR}/fxemu2.mac\ - macros.mac -${CHIPSDIR}/fxemu2b.o: ${CHIPDIR}/fxemu2b.asm ${CHIPDIR}/fxemu2.mac\ - ${CHIPDIR}/fxemu2b.mac -${CHIPSDIR}/fxemu2c.o: ${CHIPDIR}/fxemu2c.asm macros.mac ${CHIPDIR}/fxemu2.mac\ - ${CHIPDIR}/fxemu2b.mac ${CHIPDIR}/fxemu2c.mac -${CHIPDIR}/fxtable.o: ${CHIPDIR}/fxtable.asm macros.mac -${DOSDIR}/gppro.o: ${DOSDIR}/gppro.asm macros.mac -${DOSDIR}/zsipx.o: ${DOSDIR}/zsipx.asm -${CHIPDIR}/sa1proc.o: ${CHIPDIR}/sa1proc.asm macros.mac -endmem.o: endmem.asm macros.mac -${DOSDIR}/modemrtn.o: ${DOSDIR}/modemrtn.asm macros.mac - -install: - @INSTALL@ -m 0755 @ZSNESEXE@ @prefix@/bin - @INSTALL@ -m 0644 linux/zsnes.1 @prefix@/man/man1 - -uninstall: - rm -f @prefix@/bin/$(notdir @ZSNESEXE@) @prefix@/man/man5/zsnes.5 - -clean: - rm -f ${CHIPDIR}/*.o ${CPUDIR}/*.o ${VIDEODIR}/*.o ${GUIDIR}/*.o ${DOSDIR}/*.o ${WINDIR}/*.o ${ZIPDIR}/*.o *.o @ZSNESEXE@ - -distclean: - rm -f ${CHIPDIR}/*.o ${CPUDIR}/*.o ${VIDEODIR}/*.o ${GUIDIR}/*.o ${DOSDIR}/*.o ${WINDIR}/*.o ${ZIPDIR}/*.o *.o @ZSNESEXE@ Makefile config.cache config.log config.status config.h - +#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. + +CHIPDIR=chips +CPUDIR=cpu +DOSDIR=dos +GUIDIR=gui +VIDEODIR=video +WINDIR=linux +OBJDIR=obj +ZIPDIR=zip + +CHIPSOBJ=${CHIPDIR}/sfxproc.o ${CHIPDIR}/fxemu2.o ${CHIPDIR}/dsp1proc.o\ + ${CHIPDIR}/fxemu2b.o ${CHIPDIR}/fxemu2c.o ${CHIPDIR}/fxtable.o\ + ${CHIPDIR}/sa1proc.o ${CHIPDIR}/sa1regs.o ${CHIPDIR}/dsp1emu.o + +CPUOBJ=${CPUDIR}/addrni.o ${CPUDIR}/dma.o ${CPUDIR}/dsp.o ${CPUDIR}/dspproc.o\ + ${CPUDIR}/execute.o ${CPUDIR}/irq.o ${CPUDIR}/memory.o \ + ${CPUDIR}/spc700.o ${CPUDIR}/stable.o ${CPUDIR}/table.o\ + ${CPUDIR}/tableb.o ${CPUDIR}/tablec.o + +GUIOBJ=${GUIDIR}/gui.o ${GUIDIR}/menu.o + +VIDEOBJ=${VIDEODIR}/makev16b.o ${VIDEODIR}/makev16t.o ${VIDEODIR}/makevid.o\ + ${VIDEODIR}/mode716.o ${VIDEODIR}/mode716b.o ${VIDEODIR}/mode716d.o\ + ${VIDEODIR}/mode716e.o ${VIDEODIR}/mode716t.o ${VIDEODIR}/mode7.o\ + ${VIDEODIR}/mode7ext.o ${VIDEODIR}/mv16tms.o ${VIDEODIR}/newg162.o\ + ${VIDEODIR}/newgfx16.o ${VIDEODIR}/newgfx2.o ${VIDEODIR}/newgfx.o\ + ${VIDEODIR}/m716text.o ${VIDEODIR}/2xsaiw.o\ + ${VIDEODIR}/procvid.o ${VIDEODIR}/sw_draw.o + +WINOBJ=${WINDIR}/copyvwin.o ${WINDIR}/sdlintrf.o ${WINDIR}/sdllink.o \ + @GL_DRAW@ ${WINDIR}/sw_draw.o \ + ${WINDIR}/zloaderw.o ${WINDIR}/ztcp.o ${WINDIR}/zipxw.o \ + ${WINDIR}/zfilew.o ${WINDIR}/protect.o + +WINDOSOBJ=${DOSDIR}/debug.o ${DOSDIR}/joy.o ${DOSDIR}/modemrtn.o ${DOSDIR}/vesa2.o\ + ${DOSDIR}/initvid.o ${DOSDIR}/sw.o ${DOSDIR}/gppro.o ${DOSDIR}/vesa12.o + +#PREOBJ=${OBJDIR}/unzip.o ${OBJDIR}/zzip.o ${DOSDIR}/zsipx.o + +ZIPOBJ=${ZIPDIR}/zzip.o ${ZIPDIR}/unzip.o ${ZIPDIR}/zpng.o + +MAINOBJ=cfgload.o endmem.o fixsin.o init.o initc.o ui.o vcache.o water.o smoke.o burn.o + +OBJS=${CHIPSOBJ} ${CPUOBJ} ${WINOBJ} ${WINDOSOBJ} ${GUIOBJ} ${VIDEOBJ} ${ZIPOBJ} ${MAINOBJ} + +.SUFFIXES: .c .asm + +%.o: %.c + @CC@ @CFLAGS@ -o $@ -c $< + +%.o: %.asm + @NASMPATH@ @NFLAGS@ -o $@ $< + +ALL: @ZSNESEXE@ + +@ZSNESEXE@: ${OBJS} + @CC@ -o @ZSNESEXE@ ${OBJS} @CFLAGS@ @LDFLAGS@ + +${ZIPDIR}/zpng.o: ${ZIPDIR}/zpng.c ${ZIPDIR}/zpng.h +${ZIPDIR}/unzip.o: ${ZIPDIR}/unzip.c ${ZIPDIR}/zunzip.h +${ZIPDIR}/zzip.o: ${ZIPDIR}/zzip.c ${ZIPDIR}/zunzip.h +fixsin.o: fixsin.c +water.o: water.c +smoke.o: smoke.c +burn.o: burn.c +${VIDEODIR}/procvid.o: ${VIDEODIR}/procvid.asm macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xsaimmx.inc +${CHIPDIR}/dsp1proc.o: ${CHIPDIR}/dsp1proc.asm macros.mac +${CHIPDIR}/sa1regs.o: ${CHIPDIR}/sa1regs.asm macros.mac\ + ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac +${CHIPDIR}/sfxproc.o: ${CHIPDIR}/sfxproc.asm macros.mac\ + ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac + +${CHIPDIR}/dsp1emu.o: ${CHIPDIR}/dsp1emu.c +ui.o: ui.asm macros.mac +cfgload.o:cfgload.asm macros.mac +init.o:init.asm macros.mac +initc.o:init.c +${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac +${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac +${CPUDIR}/table.o: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\ + ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816.inc\ + ${CPUDIR}/regs.mac ${CPUDIR}/regs.inc ${CPUDIR}/regsw.mac\ + ${CPUDIR}/regsw.inc macros.mac +${CPUDIR}/tableb.o: ${CPUDIR}/tableb.asm ${CPUDIR}/65816db.inc\ + ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816b.inc\ + ${CPUDIR}/regs.mac macros.mac +${CPUDIR}/tablec.o: ${CPUDIR}/tablec.asm ${CPUDIR}/65816dc.inc\ + ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816c.inc\ + ${CPUDIR}/regs.mac macros.mac +${CPUDIR}/stable.o: ${CPUDIR}/stable.asm ${CPUDIR}/s65816d.inc\ + ${CPUDIR}/saddress.inc ${CPUDIR}/saddrni.inc ${CPUDIR}/se65816.inc\ + macros.mac +${CPUDIR}/memory.o: ${CPUDIR}/memory.asm macros.mac +${CPUDIR}/dma.o: ${CPUDIR}/dma.asm macros.mac +${DOSDIR}/dosintrf.o: ${DOSDIR}/dosintrf.asm macros.mac +vcache.o:vcache.asm macros.mac +${DOSDIR}/initvid.o:${DOSDIR}/initvid.asm macros.mac +${VIDEODIR}/makevid.o: ${VIDEODIR}/makevid.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/makev16b.o: ${VIDEODIR}/makev16b.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/makev16t.o: ${VIDEODIR}/makev16t.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/mv16tms.o: ${VIDEODIR}/mv16tms.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/mode7.o: ${VIDEODIR}/mode7.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode716.o: ${VIDEODIR}/mode716.asm ${VIDEODIR}/mode716.mac\ + macros.mac +${VIDEODIR}/mode716b.o:${VIDEODIR}/mode716b.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode716t.o:${VIDEODIR}/mode716t.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode716d.o:${VIDEODIR}/mode716d.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode7ext.o:${VIDEODIR}/mode7ext.asm macros.mac +${VIDEODIR}/mode716e.o:${VIDEODIR}/mode716e.asm macros.mac +${VIDEODIR}/m716text.o:${VIDEODIR}/m716text.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${CPUDIR}/irq.o: ${CPUDIR}/irq.asm macros.mac +${CPUDIR}/dspproc.o: ${CPUDIR}/dspproc.asm macros.mac +${CPUDIR}/spc700.o:${CPUDIR}/spc700.asm macros.mac\ + ${CPUDIR}/regsw.mac ${CPUDIR}/spcdef.inc ${CPUDIR}/spcaddr.inc +${CPUDIR}/dsp.o: ${CPUDIR}/dsp.asm macros.mac +${DOSDIR}/vesa2.o: ${DOSDIR}/vesa2.asm macros.mac +${DOSDIR}/vesa12.o: ${DOSDIR}/vesa12.asm macros.mac +${DOSDIR}/joy.o: ${DOSDIR}/joy.asm macros.mac +${DOSDIR}/sw.o: ${DOSDIR}/sw.asm macros.mac +${GUIDIR}/gui.o: ${GUIDIR}/gui.asm ${GUIDIR}/guitools.inc\ + ${GUIDIR}/guimisc.inc ${GUIDIR}/guimouse.inc ${GUIDIR}/guiwindp.inc\ + ${GUIDIR}/guinetpl.inc ${GUIDIR}/guikeys.inc ${GUIDIR}/guicheat.inc\ + ${GUIDIR}/guicombo.inc ${GUIDIR}/guiload.inc macros.mac +${GUIDIR}/menu.o: ${GUIDIR}/menu.asm macros.mac +${VIDEODIR}/newgfx.o:${VIDEODIR}/newgfx.asm ${VIDEODIR}/vidmacro.mac\ + ${VIDEODIR}/newgfx2.mac ${VIDEODIR}/newgfx.mac macros.mac +${VIDEODIR}/newgfx2.o:${VIDEODIR}/newgfx2.asm ${VIDEODIR}/newgfxwn.mac\ + ${VIDEODIR}/newgfx.mac macros.mac +${VIDEODIR}/newgfx16.o: ${VIDEODIR}/newgfx16.asm macros.mac ${VIDEODIR}/vidmacro.mac\ + ${VIDEODIR}/newgfx16.mac ${VIDEODIR}/newg162.mac +${VIDEODIR}/newg162.o: macros.mac ${VIDEODIR}/newg162.asm ${VIDEODIR}/newg162.mac\ + ${VIDEODIR}/vidmacro.mac ${VIDEODIR}/newg16wn.mac +${CHIPDIR}/fxemu2.o: ${CHIPDIR}/fxemu2.asm ${CHIPDIR}/fxemu2.mac\ + macros.mac +${CHIPSDIR}/fxemu2b.o: ${CHIPDIR}/fxemu2b.asm ${CHIPDIR}/fxemu2.mac\ + ${CHIPDIR}/fxemu2b.mac +${CHIPSDIR}/fxemu2c.o: ${CHIPDIR}/fxemu2c.asm macros.mac ${CHIPDIR}/fxemu2.mac\ + ${CHIPDIR}/fxemu2b.mac ${CHIPDIR}/fxemu2c.mac +${CHIPDIR}/fxtable.o: ${CHIPDIR}/fxtable.asm macros.mac +${DOSDIR}/gppro.o: ${DOSDIR}/gppro.asm macros.mac +${DOSDIR}/zsipx.o: ${DOSDIR}/zsipx.asm +${CHIPDIR}/sa1proc.o: ${CHIPDIR}/sa1proc.asm macros.mac +endmem.o: endmem.asm macros.mac +${DOSDIR}/modemrtn.o: ${DOSDIR}/modemrtn.asm macros.mac + +install: + @INSTALL@ -m 0755 @ZSNESEXE@ @prefix@/bin + @INSTALL@ -m 0644 linux/zsnes.1 @prefix@/man/man1 + +uninstall: + rm -f @prefix@/bin/$(notdir @ZSNESEXE@) @prefix@/man/man5/zsnes.5 + +clean: + rm -f ${CHIPDIR}/*.o ${CPUDIR}/*.o ${VIDEODIR}/*.o ${GUIDIR}/*.o ${DOSDIR}/*.o ${WINDIR}/*.o ${ZIPDIR}/*.o *.o @ZSNESEXE@ + +distclean: + rm -f ${CHIPDIR}/*.o ${CPUDIR}/*.o ${VIDEODIR}/*.o ${GUIDIR}/*.o ${DOSDIR}/*.o ${WINDIR}/*.o ${ZIPDIR}/*.o *.o @ZSNESEXE@ Makefile config.cache config.log config.status config.h + diff --git a/zsnes/src/gui/gui.asm b/zsnes/src/gui/gui.asm index 521c51b1..d8c3c414 100644 --- a/zsnes/src/gui/gui.asm +++ b/zsnes/src/gui/gui.asm @@ -1,5567 +1,5567 @@ -;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. - - -; Sorry. The GUI code is a total mess. One problem I encountered is that -; there seems to be a bug in nasm with using math calculations combined -; with macros within macros, so in some macro definitions, I had to -; add/subtract extra values in certain macros to get the GUI to align -; correctly. -; The GUI is drawn is mostly manually. What I mean is such as -; coding 5 boxes to represent a shaded box for each box. Although that -; can be simplified using macros to draw 5 boxes, that unknown bug in nasm -; showed up which prevented me from using macros extensively. I was -; thinking of changing it to an object-based GUI for easier coding, -; but that was decided far into the development of the GUI itself -; and that I also never expected this code to become open-source, so I -; decided not to proceed with it. - -; Routine StartGUI is the function called to start the GUI and also -; contains the execution main loop of the GUI. If you want to completely -; replace the GUI, just add a function call from that function, then -; jump to endprog to exit ZSNES or continueprog to continue with the -; gameplay. Do not replace StartGUI with a function since it is not -; a function, but rather a label that is being jumped to. - -; ************************************** -; GUI.ASM -; ************************************** -; -; Associated files : -; GUIWinDp.inc - Window Display Routines -; GUITools.inc - Misc routines for the GUI - - -; Quick Searches : -; DisplayMenu - routines to display top menu bar -; Incomp - Search for start of modem processing -; ProcessModem -; GUIgetcurrentinput -; GUITryMenuItem - Processes the menu item when user clicks item -; Mouseimplementation -; DGUIDisplayer -; LGUILoadData -; SetInputDevice -; CalibrateDev1 -; ButtonProcess - routines that processes boxed buttons -; CheatCodeSearchInit -; guiwincontrol - - -%include "macros.mac" - -EXTSYM curblank, vidpastecopyscr, frameskip, newengen, vsyncon -EXTSYM cvidmode, antienab, smallscreenon, smallscreence,NetQuit -EXTSYM soundon, StereoSound, SoundCompD, SoundQuality, MusicRelVol -EXTSYM endprog, continueprog, spcBuffera, spcRamcmp, cbitmode, makepal -EXTSYM t1cc, LoadDir, SRAMDir, LoadDrive,SRAMDrive, initsnes, romloadskip -EXTSYM fname, makeextension, sram, clearmem2, loadfileGUI, GUIloadfailed -EXTSYM SetupROM, CheckROMType, romdata, ForcePal, ramsize, ramsizeand, curromsize -EXTSYM romispal, totlines, cfgloadsdir, init65816, procexecloop -EXTSYM spcRam, spcPCRam, spcS, spcRamDP, spcA, spcX, spcY, spcP, spcNZ -EXTSYM Voice0Status, Voice1Status, Voice2Status, Voice3Status, Voice4Status -EXTSYM Voice5Status, Voice6Status, Voice7Status, romtype, SetIRQVectors -EXTSYM ClearScreen, statesaver, loadstate2, vidbuffer, ASCII2Font, hirestiledat -EXTSYM showallext, ROMTypeNOTFound, scanlines,statefileloc,pl1selk,pl2selk -EXTSYM fnamest,sprlefttot,spritetablea,fnames,SFXSRAM,sfxramdata,cgram,srama -EXTSYM tempco0,prevbright,maxbr,prevpal,coladdr,coladdg,coladdb -EXTSYM scaddtype,ScreenScale,vesa2red10,initvideo2,initvideo,pressed,UpdateDevices -EXTSYM memtabler8,memtablew8,writeon,pl1contrl,pl2contrl,JoyRead,SetInputDevice -EXTSYM SetInputDevice209,FPSOn,RevStereo,WDSPReg0C,WDSPReg1C,WDSPReg2C -EXTSYM WDSPReg3C,pl12s34,resolutn,delay,chaton,chatstrL,chatLpos,chatstrR,chatRTL -EXTSYM InitDrive,InitDir,createnewcfg,Makemode7Table,SnowOn,MovieBuffSize -EXTSYM MovieBuffFrame,vidbufferofsb,ZipSupport,wramdata,bgfixer,cfgnewgfx -EXTSYM cfgdontsave,videotroub,Open_File,Read_File,Close_File,Write_File,Create_File -EXTSYM File_Seek,File_Seek_End,Open_File_Write,Get_Date,Check_Key,Get_Key -EXTSYM Change_Drive,Change_Single_Dir,Change_Dir,Get_Dir,Get_First_Entry -EXTSYM Get_Next_Entry,Set_DTA_Address,timer2upd,curexecstate,TripBufAvail -EXTSYM nmiprevaddrl,nmiprevaddrh,nmirept,nmiprevline,nmistatus,spcnumread,spchalted -EXTSYM NextLineCache,VidStartDraw,ResetTripleBuf,GUINGVID -EXTSYM ScanCodeListing,AdjustFrequency,GUISaveVars,Init_Mouse -EXTSYM Get_MouseData,Set_MouseXMax,Set_MouseYMax,Set_MousePosition,Get_MousePositionDisplacement -EXTSYM GUIInit,GUIDeInit,SpecialLine -EXTSYM DrawWater,DrawBurn,RemoteDisconnect,loadstate3 -EXTSYM SA1Enable,SA1RAMArea -EXTSYM GUIFName,GUICName -EXTSYM printnum -EXTSYM MMXCheck -EXTSYM SaveCombFile -EXTSYM NetSent,valuea -EXTSYM welcome -EXTSYM showinfogui -EXTSYM BackupCVFrame -EXTSYM Wait1SecWin,ClearUDPStuff -EXTSYM DisableSUDPPacket,EnableSUDPPacket -EXTSYM BackStateSize -EXTSYM ResetExecStuff -EXTSYM RestoreCVFrame -EXTSYM CurRecv,BackState,CBackupPos,PBackupPos,PPValue,DPValue,NetQuitter -EXTSYM LatencyV -EXTSYM LatencyRecvPtr,LatencySendPtr -EXTSYM NumofBanks -EXTSYM WinErrorA,WinErrorB,WinErrorC -EXTSYM ErrorPointer -EXTSYM MessageOn,Msgptr,MsgCount -EXTSYM PJoyAOrig,PJoyBOrig,PJoyCOrig,PJoyDOrig,PJoyEOrig -EXTSYM GetHostName -EXTSYM vramaddr,curypos,ClearRegs,vram,sndrot,regsbackup -EXTSYM GetScreen,GUITBWVID -EXTSYM Clear2xSaIBuffer -EXTSYM MouseWindow -EXTSYM GotoHomepage -EXTSYM cfgcvidmode, ExitFromGUI -EXTSYM GUIWFVID -EXTSYM cfgvsync,newgfx16b -EXTSYM cfgscanline,cfginterp -EXTSYM NumVideoModes -EXTSYM cfgvolume, MusicVol, DSPMem -EXTSYM NumInputDevices,GUIInputNames -EXTSYM GUIVideoModeNames -EXTSYM GUISLVID,GUIINVID,GUIEAVID,GUIIEVID,GUIFSVID,GUIWSVID -EXTSYM GUISSVID,GUITBVID,GUIHSVID,GUI2xVID,GUII2VID,GUIM7VID -EXTSYM cfgsoundon,cfgSoundQuality,cfgStereoSound,cfgforce8b -EXTSYM Force8b,convertnum,converthex -EXTSYM per2exec -EXTSYM hostname -EXTSYM UDPConfig -EXTSYM snesmouse -EXTSYM pl1upk,pl1downk,pl1leftk,pl1rightk,pl1Lk,pl1Rk,pl1Ak,pl1Bk -EXTSYM outofmemfix,yesoutofmemory -EXTSYM CReadHead,ReadHead,CFWriteHead,CFWriteStart -EXTSYM JoyX,JoyY,JoyMinX,JoyMinY,JoyMaxX,JoyMaxY,JoyMinX209,JoyMaxX209 -EXTSYM JoyMinY209,JoyMaxY209,GetCoords,GetCoords3 -EXTSYM MultiTap,SFXEnable -EXTSYM RestoreSystemVars -EXTSYM TCPIPStartServer -EXTSYM TCPIPInitConnectToServer -EXTSYM TCPIPWaitForConnection -EXTSYM tcperr -EXTSYM TCPIPConnectToServer -EXTSYM TCPIPConnectToServerW -EXTSYM selc0040 -EXTSYM TCPIPPreparePacket -EXTSYM TCPIPSendPacket,TCPIPSendPacketUDP -EXTSYM TCPIPDisconnect,TCPIPStatus -EXTSYM TCPIPStoreByte -EXTSYM TCPIPGetByte,GUIBIFIL -EXTSYM firstsaveinc -EXTSYM nssdip1,nssdip2,nssdip3,nssdip4,nssdip5,nssdip6 -%ifdef __LINUX__ -EXTSYM numlockptr -%endif -%ifdef __WIN32__ -EXTSYM initDirectDraw -EXTSYM reInitSound -%endif - -%ifdef __MSDOS__ -EXTSYM dssel, cantinitmodem, ModemClearBuffer, ModemGetChar -EXTSYM InitModem, DeInitModem, ModemCheckRing, ModemCheckDCD -EXTSYM DeInitModemC, ModemSendChar, UartType -EXTSYM deinitipx, IPXSearchval, ipxlookforconnect, initipx -EXTSYM PreparePacketIPX,SendPacketIPX,ipxgetchar,ipxsendchar -%endif - -NEWSYM GuiAsmStart - -%include "gui/guitools.inc" -%include "gui/guimisc.inc" -%include "gui/guimouse.inc" -%include "gui/guiwindp.inc" -%include "gui/guinetpl.inc" -%include "gui/guikeys.inc" -%include "gui/guicheat.inc" -%include "gui/guicombo.inc" -%include "gui/guiload.inc" - - - -SECTION .data - - -; ProcessRemoteCommand -; NetLoadStuff ; Send 14 to initiate, Send 15 to cancel (either way) -; call PreparePacket -; mov al,253 -; call RemoteSendChar -; call SendPacket -; NetAddChar - -NEWSYM WaterOn, db 1 - -; Things to do : -; -; .checkmenuboxclick -; gray scale = 32 .. 63 -; shadow = 96 .. 127 -; blue scale = 148 .. 167, 168 .. 187 -; gray scale = 189 .. 220 (32+137) - - -; | Game Config Cheat MultiPlay Misc -;------------------------------------------------------- -; Load Input#1 Add Code Modem Game Keys -; Run Input#2 Browse IPX GUI Opns -; Reset Input#3 Search About -; ----- Input#4 -; Save State ------- -; Load State Options -; Chose State Video -; ----- Sound -; Quit - -; Windows : 1 = Save/Load Confirmation -; 2 = Chose State -; 3 = Input Device Window -; 4 = Options -; 5 = Video -; 6 = Sound -; 7 = Cheat -; 8 = IPX/Modem -; 9 = GameOptions -; 10 = GUI Options -; 11 = About - -MenuDat1 db 12,3,1,1,1,1,1,1,1,1,1,0,1,2,0 -MenuDat2 db 8, 3,1,1,0,1,1,1,0,2,0,0 -MenuDat3 db 10, 3,1,1,1,1,0,1,0,1,1,2,0 -MenuDat4 db 2, 3,1,2,0 -MenuDat5 db 1, 3,2,0 -MenuDat6 db 6, 3,1,1,1,1,0,2,0 - -GUIPrevMenuData - db 1,'1. ',0 - db 1,'2. ',0 - db 1,'3. ',0 - db 1,'4. ',0 - db 1,'5. ',0 - db 1,'6. ',0 - db 1,'7. ',0 - db 1,'8. ',0 - db 1,'9. ',0 - db 1,'0. ',0 - db 0,'------------',0 -.onoff db 1,'FREEZE DATA : OFF ',0 - db 1,'CLEAR ALL DATA ',0 -GUIGameMenuData - db 1,'LOAD ',0 - db 1,'RUN [ESC] ',0 - db 1,'RESET ',0 - db 0,'------------',0 - db 1,'SAVE STATE ',0 - db 1,'OPEN STATE ',0 - db 1,'PICK STATE ',0 - db 0,'------------',0 - db 1,'QUIT ',0 -GUIConfigMenuData - db 1,'INPUT #1 ',0 - db 1,'INPUT #2 ',0 - db 1,'INPUT #3 ',0 - db 1,'INPUT #4 ',0 - db 1,'INPUT #5 ',0 - db 0,'------------',0 - db 1,'ADD-ONS ',0 - db 0,'------------',0 - db 1,'OPTIONS ',0 - db 1,'VIDEO ',0 - db 1,'SOUND ',0 -GUICheatMenuData - db 1,'ADD CODE ',0 - db 1,'BROWSE ',0 - db 1,'SEARCH ',0 -GUINetPlayMenuData - db 1,'MODEM ',0 - db 1,'IPX ',0 -GUIMiscMenuData - db 1,'GAME KEYS ',0 - db 1,'GUI OPNS ',0 - db 1,'MOVIE OPN ',0 - db 1,'KEY COMB. ',0 - db 1,'SAVE CFG ',0 - db 0,'------------',0 - db 1,'ABOUT ',0 - -; Config, Options -> New Gfx Engine, Frame Rate, Fast Forward FrameRate, etc. -; Config, Video -> Video Mode, Interpolation, etc. -; Config, Options -> Set up Save and/or Load State Confirmation -; Select Different game key assignments -; If menu should go to Load or last position when ESC -; is pressed from game - -GUIRAdd db 15 -GUIGAdd db 10 -GUIBAdd db 31 -mousewrap db 0 ; 0 = mouse boundries, 1 = mouse wrap -mouseshad db 1 ; 0 = no mouse shadow, 1 = mouse shadow -lastcursres db 0 ; 0 = go to load, 1 = go to previous menu, 2 = no menu -resetposn db 1 ; 0 = no window reset, 1 = window reset -NEWSYM GUIClick, db 0 ; 1 = mouse click enters/exits gui -GUIwinposx2 dd 0,5 ,60 ,30 ,55 ,50 ,65 ,5 ,30 ,20 ,10 ,80 ,65 ,20 ,70 ,50 ,3 ,0 -GUIwinposy2 dd 0,20 ,70 ,30 ,20 ,22 ,36 ,20 ,30 ,20 ,40 ,70 ,60 ,30 ,65 ,50 ,22 ,0 - -; Default keys -; Sound Channels 0 .. 7, Save/Select/Load States, Fast Forward -; Exit, Load, Reset, BG Disables, Reset, Windowing, New Gfx, OffsetMode -; State Selection 0 .. 9 - -NEWSYM KeyDisableSC0, dd 63 -NEWSYM KeyDisableSC1, dd 64 -NEWSYM KeyDisableSC2, dd 65 -NEWSYM KeyDisableSC3, dd 66 -NEWSYM KeyDisableSC4, dd 67 -NEWSYM KeyDisableSC5, dd 68 -NEWSYM KeyDisableSC6, dd 87 -NEWSYM KeyDisableSC7, dd 88 -NEWSYM KeySaveState, dd 60 -NEWSYM KeyStateSelct, dd 61 -NEWSYM KeyLoadState, dd 62 -NEWSYM KeyFastFrwrd, dd 41 -NEWSYM KeyQuickExit, dd 0 -NEWSYM KeyQuickLoad, dd 0 -NEWSYM KeyQuickRst, dd 0 -NEWSYM KeyBGDisble0, dd 2 -NEWSYM KeyBGDisble1, dd 3 -NEWSYM KeyBGDisble2, dd 4 -NEWSYM KeyBGDisble3, dd 5 -NEWSYM KeySprDisble, dd 6 -NEWSYM KeyResetAll, dd 7 -NEWSYM KeyExtraEnab, dd 8 -NEWSYM KeyNewGfxSwt, dd 9 -NEWSYM KeyWinDisble, dd 10 -NEWSYM KeyOffsetMSw, dd 11 -NEWSYM KeyStateSlc0, dd 0 -NEWSYM KeyStateSlc1, dd 0 -NEWSYM KeyStateSlc2, dd 0 -NEWSYM KeyStateSlc3, dd 0 -NEWSYM KeyStateSlc4, dd 0 -NEWSYM KeyStateSlc5, dd 0 -NEWSYM KeyStateSlc6, dd 0 -NEWSYM KeyStateSlc7, dd 0 -NEWSYM KeyStateSlc8, dd 0 -NEWSYM KeyStateSlc9, dd 0 - -GUIshowallext db 0 -GUIloadfntype db 0 - -NEWSYM pl3selk, dd 0 ; 3SELECT = SHIFT -NEWSYM pl3startk, dd 0 ; 3START = ENTER -NEWSYM pl3upk, dd 0 ; 3UP = up -NEWSYM pl3downk, dd 0 ; 3DOWN = down -NEWSYM pl3leftk, dd 0 ; 3LEFT = left -NEWSYM pl3rightk, dd 0 ; 3RIGHT = right -NEWSYM pl3Xk, dd 0 ; 3X = INS -NEWSYM pl3Ak, dd 0 ; 3A = HOME -NEWSYM pl3Lk, dd 0 ; 3L = PAGE UP -NEWSYM pl3Yk, dd 0 ; 3Y = DELETE -NEWSYM pl3Bk, dd 0 ; 3B = END -NEWSYM pl3Rk, dd 0 ; 3R = PAGE DOWN -NEWSYM pl4selk, dd 0 ; 4SELECT = SHIFT -NEWSYM pl4startk, dd 0 ; 4START = ENTER -NEWSYM pl4upk, dd 0 ; 4UP = up -NEWSYM pl4downk, dd 0 ; 4DOWN = down -NEWSYM pl4leftk, dd 0 ; 4LEFT = left -NEWSYM pl4rightk, dd 0 ; 4RIGHT = right -NEWSYM pl4Xk, dd 0 ; 4X = INS -NEWSYM pl4Ak, dd 0 ; 4A = HOME -NEWSYM pl4Lk, dd 0 ; 4L = PAGE UP -NEWSYM pl4Yk, dd 0 ; 4Y = DELETE -NEWSYM pl4Bk, dd 0 ; 4B = END -NEWSYM pl4Rk, dd 0 ; 4R = PAGE DOWN -NEWSYM TimeChecker, db 0 ; Future Reserved -GUISoundBuffer db 1 ; Sound Buffer Disabled -prevloadnames times 16*10 db 32 -prevloaddname times 128*10 db 0 -prevloadfname times 16*10 db 32 -prevlfreeze db 0 -GUIsmallscreenon db 0 -GUIScreenScale db 0 - -NEWSYM pl3contrl, db 0 -NEWSYM pl4contrl, db 0 -NEWSYM pl1p209b, db 0 -NEWSYM pl2p209b, db 0 -NEWSYM pl3p209b, db 0 -NEWSYM pl4p209b, db 0 -JoyPad1Move db 0 -NEWSYM FirstTimeData, db 0 -NEWSYM PrevSWFix, db 0 -NEWSYM CalibXmin, dd 0 -NEWSYM CalibYmin, dd 0 -NEWSYM CalibXmax, dd 0 -NEWSYM CalibYmax, dd 0 -NEWSYM CalibXmin209, dd 0 -NEWSYM CalibYmin209, dd 0 -NEWSYM CalibXmax209, dd 0 -NEWSYM CalibYmax209, dd 0 -NEWSYM maxskip, db 9 -NEWSYM FPSAtStart, db 0 -NEWSYM SidewinderFix, db 0 -GUIInitSt1 db 'ATZ' -.rest times 47 db 0 -GUIInitSt2 db 'AT S0=0' -.rest times 43 db 0 -GUIDialSt db 'ATDT ',0 -NEWSYM ComNum, db 2 -NEWSYM ComIRQ, db 3 -NEWSYM BaudRate, dd 3 -NEWSYM pl1Atk, dd 0 ; Turbo A -NEWSYM pl1Btk, dd 0 ; Turbo B -NEWSYM pl1Xtk, dd 0 ; Turbo X -NEWSYM pl1Ytk, dd 0 ; Turbo Y -NEWSYM pl2Atk, dd 0 ; Turbo A -NEWSYM pl2Btk, dd 0 ; Turbo B -NEWSYM pl2Xtk, dd 0 ; Turbo X -NEWSYM pl2Ytk, dd 0 ; Turbo Y -NEWSYM pl3Atk, dd 0 ; Turbo A -NEWSYM pl3Btk, dd 0 ; Turbo B -NEWSYM pl3Xtk, dd 0 ; Turbo X -NEWSYM pl3Ytk, dd 0 ; Turbo Y -NEWSYM pl4Atk, dd 0 ; Turbo A -NEWSYM pl4Btk, dd 0 ; Turbo B -NEWSYM pl4Xtk, dd 0 ; Turbo X -NEWSYM pl4Ytk, dd 0 ; Turbo Y -NEWSYM Turbo30hz, db 0 ; Turbo at 30hz instead of 60hz - -NEWSYM KeyVolUp, dd 0 -NEWSYM KeyVolDown, dd 0 -NEWSYM KeyFRateUp, dd 0 -NEWSYM KeyFRateDown, dd 0 - -NEWSYM KeyQuickChat, dd 20 -NEWSYM FossilUse, db 0 -NEWSYM TimerEnable, db 0 - -NEWSYM Surround, db 0 -NEWSYM InterSound, db 1 -NEWSYM FastFwdToggle, db 0 -NEWSYM En2xSaI, db 0 -NEWSYM AutoLoadCht, db 0 -NEWSYM KeyQuickSnapShot, dd 0 - -CheatSrcByteSize db 0 -CheatSrcByteBase db 0 -CheatSrcSearchType db 0 -CheatUpperByteOnly db 0 -NEWSYM SRAMSave5Sec, db 0 -NEWSYM ReInitSoundC, db 0 -NEWSYM OldGfxMode2 , db 0 -NEWSYM PitchModEn , db 0 -NEWSYM LatestSave , db 0 -NEWSYM AutoState , db 0 -NEWSYM OldVolume , db 1 -NEWSYM BlankVar , db 1 - -NEWSYM pl1ULk, dd 0 -NEWSYM pl1URk, dd 0 -NEWSYM pl1DLk, dd 0 -NEWSYM pl1DRk, dd 0 -NEWSYM pl2ULk, dd 0 -NEWSYM pl2URk, dd 0 -NEWSYM pl2DLk, dd 0 -NEWSYM pl2DRk, dd 0 -NEWSYM pl3ULk, dd 0 -NEWSYM pl3URk, dd 0 -NEWSYM pl3DLk, dd 0 -NEWSYM pl3DRk, dd 0 -NEWSYM pl4ULk, dd 0 -NEWSYM pl4URk, dd 0 -NEWSYM pl4DLk, dd 0 -NEWSYM pl4DRk, dd 0 - -NEWSYM LowPassFilterType, db 0 -NEWSYM DontSavePath, db 0 -NEWSYM ReCalib, db 1 -NEWSYM GUIComboGameSpec, db 0 -NEWSYM SoundNoiseDis, db 0 ; Disable Noise -NEWSYM Triplebufen, db 0 -NEWSYM SoundBufEn, db 0 -NEWSYM SPCDisable, db 0 -NEWSYM RaisePitch, db 0 - -prevloadl db 0 -prevloaddnamel times 512*10 db 0 -prevloadfnamel times 512*10 db 0 - -%ifdef __WIN32__ -NEWSYM PrevWinMode, db 2 -NEWSYM PrevFSMode, db 6 -%elifdef __LINUX__ -NEWSYM PrevWinMode, db 2 -NEWSYM PrevFSMode, db 3 -%else -NEWSYM PrevWinMode, db 0 -NEWSYM PrevFSMode, db 0 -%endif - -OldWinPos db 0 -GUIwinposx dd 0,5 ,60 ,30 ,55 ,50 ,65 ,5 ,30 ,20 ,10 ,80 ,65 ,20 ,70 ,50 ,3 ,50 -GUIwinposxexp times 30 dd 0 -GUIwinposy dd 0,20 ,70 ,30 ,20 ,22 ,36 ,20 ,30 ,20 ,30 ,70 ,60 ,30 ,65 ,50 ,22 ,60 -GUIwinposyexp times 30 dd 0 - -NEWSYM GUIEffect, db 0 - -NEWSYM pl5selk, dd 0 ; 4SELECT = SHIFT -NEWSYM pl5startk, dd 0 ; 4START = ENTER -NEWSYM pl5upk, dd 0 ; 4UP = up -NEWSYM pl5downk, dd 0 ; 4DOWN = down -NEWSYM pl5leftk, dd 0 ; 4LEFT = left -NEWSYM pl5rightk, dd 0 ; 4RIGHT = right -NEWSYM pl5Xk, dd 0 ; 4X = INS -NEWSYM pl5Ak, dd 0 ; 4A = HOME -NEWSYM pl5Lk, dd 0 ; 4L = PAGE UP -NEWSYM pl5Yk, dd 0 ; 4Y = DELETE -NEWSYM pl5Bk, dd 0 ; 4B = END -NEWSYM pl5Rk, dd 0 ; 4R = PAGE DOWN -NEWSYM pl5ULk, dd 0 -NEWSYM pl5URk, dd 0 -NEWSYM pl5DLk, dd 0 -NEWSYM pl5DRk, dd 0 -NEWSYM pl5Atk, dd 0 ; Turbo A -NEWSYM pl5Btk, dd 0 ; Turbo B -NEWSYM pl5Xtk, dd 0 ; Turbo X -NEWSYM pl5Ytk, dd 0 ; Turbo Y -NEWSYM pl5contrl, db 0 -NEWSYM pl1p209, db 0 -NEWSYM pl2p209, db 0 -NEWSYM pl3p209, db 0 -NEWSYM pl4p209, db 0 -NEWSYM pl5p209, db 0 - -NEWSYM GUIEnableTransp, db 0 -NEWSYM Mode7HiRes16b, dd 0 -NEWSYM NewEngEnForce, db 1 -NEWSYM KeyRewind, dd 0 -NEWSYM ChatNick, times 16 db 0 -NEWSYM KeySlowDown, dd 0 - -NEWSYM UseCubicSpline, db 1 - -NEWSYM LargeSoundBuf, db 0 -NEWSYM HighPriority, db 0 -NEWSYM AlwaysOnTop, db 0 -NEWSYM SaveMainWindowPos, db 1 -NEWSYM MainWindowX, dw -1 -NEWSYM MainWindowY, dw -1 - -NEWSYM ScreenShotFormat, db 0 - -NEWSYM pl1Ltk, dd 0 ; Turbo L -NEWSYM pl1Rtk, dd 0 ; Turbo R -NEWSYM pl2Ltk, dd 0 ; Turbo L -NEWSYM pl2Rtk, dd 0 ; Turbo R -NEWSYM pl3Ltk, dd 0 ; Turbo L -NEWSYM pl3Rtk, dd 0 ; Turbo R -NEWSYM pl4Ltk, dd 0 ; Turbo L -NEWSYM pl4Rtk, dd 0 ; Turbo R -NEWSYM pl5Ltk, dd 0 ; Turbo L -NEWSYM pl5Rtk, dd 0 ; Turbo R - -NEWSYM GUITRAdd, db 0 -NEWSYM GUITGAdd, db 10 -NEWSYM GUITBAdd, db 31 - -NEWSYM GUIWRAdd, db 8 -NEWSYM GUIWGAdd, db 8 -NEWSYM GUIWBAdd, db 25 - -NEWSYM GrayscaleMode, db 0 -NEWSYM MouseWheel, db 1 -NEWSYM SmallMsgText, db 0 -NEWSYM AllowMultipleInst, db 0 -NEWSYM FilteredGUI, db 0 -NEWSYM BilinearFilter, db 0 -NEWSYM TripleBufferWin, db 0 - -NEWSYM ExclusiveSound, db 0 -NEWSYM DisableScreenSaver, db 0 -NEWSYM MMXSupport, db 1 -NEWSYM TrapMouseCursor, db 1 -NEWSYM KeyQuickClock, dd 0 -NEWSYM KeyQuickSaveSPC, dd 0 -NEWSYM AutoIncSaveSlot, db 0 -NEWSYM TCPIPAddress, times 29 db 0 -NEWSYM SoundInterpType, db 1 -NEWSYM KeyDisplayFPS, dd 0 -NEWSYM KeyIncStateSlot, dd 0 -NEWSYM KeyDecStateSlot, dd 0 -NEWSYM KeyUsePlayer1234, dd 0 - -GUIsave equ $-GUIRAdd - -section .bss - -NEWSYM ForceROMTiming, resb 1 -NEWSYM ForceHiLoROM, resb 1 - -NEWSYM CombinDataGlob, resb 3300 ; 20-name, 42-combo, 2-key#, 1-P#, 1-ff -NEWSYM CombinDataLocl, resb 3300 - -section .data -NEWSYM CmdLineNetPlay, db 0 -NEWSYM CmdLineTCPIPAddress, times 29 db 0 -section .bss - -GUIwinorder resb 18 -GUIwinpos resb 18 -GUIwinactiv resb 18 -DialNumber resb 40 -ViewBuffer resb 50*32 -NEWSYM ModemInitStat, resb 1 -ModemProcess resb 1 ; Shows current dial/answer process -ModemPTimer resd 1 ; Timer for modem process -ModemOKStat resb 1 ; OK is detected on modem status - -SECTION .data -; LOAD STAT INPT OPT VID SND CHT NET GMKEY GUIOP ABT RSET SRC STCN MOVE CMBO ADDO -GUIwinposxo dd 0,5 ,60 ,30 ,55 ,50 ,35 ,5 ,30 ,10 ,10 ,50 ,65 ,20 ,70 ,50 ,3 ,50 -GUIwinposyo dd 0,20 ,70 ,30 ,20 ,20 ,20 ,20 ,30 ,20 ,20 ,20 ,60 ,30 ,65 ,50 ,22 ,60 -GUIwinsizex dd 0,244 ,126 ,189 ,167 ,170 ,188 ,244 ,8*16,235 ,240 ,190 ,9*16,8*16,9*16,140 ,250 ,160 -GUIwinsizey dd 0,190 ,3*16,166 ,190 ,192 ,188 ,191 ,40 ,189 ,150 ,190 ,42 ,40 ,42 ,70 ,190 ,100 -GUIwinptr db 0 - -section .bss -GUItextcolor resb 5 -GUIcmenupos resb 1 -GUIescpress resb 1 -GUIcwinpress resb 1 -GUIpmenupos resb 1 -GUIcrowpos resd 1 -GUIpclicked resb 1 -GUImouseposx resd 1 -GUImouseposy resd 1 -GUICYLocPtr resd 1 -GUIMenuL resd 1 -GUIMenuR resd 1 -GUIMenuD resd 1 -GUIOnMenuItm resb 1 -NEWSYM GUIQuit, resb 1 -GUIHold resb 1 -GUIHoldx resd 1 -GUIHoldy resd 1 -GUIHoldxm resd 1 -GUIHoldym resd 1 -GUIcolscaleval resd 1 -cwindrawn resb 1 -GUIWincol resd 1 -GUIWincoladd resd 1 -GUITemp resd 1 -GUIHoldXlimL resd 1 -GUIHoldXlimR resd 1 -GUIHoldYlim resd 1 -GUIHoldYlimR resd 1 -cloadnpos resd 1 -cloadnposb resd 1 -cloadmaxlen resd 1 -cloadnleft resd 1 -cplayernum resb 1 -vbuflimtop resd 1 -vbuflimbot resd 1 -GUIScrolTim1 resd 1 -GUIScrolTim2 resd 1 -GUICHold resd 1 -GUICBHold resd 1 -GUICBHold2 resd 1 -GUIDClickTL resd 1 -GUIDClCWin resd 1 -GUIDClCEntry resd 1 -GUICResetPos resd 1 -GUICStatePos resd 1 -GUICCFlash resb 1 -GUILDFlash resb 1 -GUIPalConv resd 1 -PrevResoln resw 1 -SnowMover resd 1 -keycontrolval resd 1 -NEWSYM CheatBDoor, resb 1 -NEWSYM ShowTimer, resb 1 -NEWSYM MousePRClick, resb 1 -NEWSYM MouseDis, resb 1 -NEWSYM NetPlayNoMore, resb 1 -RestoreValues resb 1 -NEWSYM NetChatFirst, resb 1 -NEWSYM NetServer, resb 1 -NEWSYM NetQuitAfter, resb 1 -NEWSYM NetNewNick, resb 16 -NEWSYM NetFilename, resb 512 - -NEWSYM CheatOn, resd 1 -NEWSYM NumCheats, resd 1 -NEWSYM cheatdataprev, resb 28 ; leave contents blank -NEWSYM cheatdata, resb 28*255+56 ; toggle, value, address, pvalue, name(22) - -NEWSYM GUIcurrentdir, resb 131 - -curgsval resb 1 - -SECTION .data -NEWSYM numdrives, dd 26 -SubPalTable times 256 db 1 ; Corresponding Gray Scale Color - -SECTION .bss -WhichRemote resd 1 ; Modem = 1, IPX = 2, TCP/IP = 4 -Connected resd 1 -IDCheckPos resd 1 - -NEWSYM pl1neten, resb 1 -NEWSYM pl2neten, resb 1 -NEWSYM pl3neten, resb 1 -NEWSYM pl4neten, resb 1 -NEWSYM pl5neten, resb 1 -NEWSYM cnetplaybuf, resb 512 -NEWSYM cnetptrhead, resd 1 -NEWSYM cnetptrtail, resd 1 -NEWSYM prevp1net, resd 1 -NEWSYM prevp2net, resd 1 -NEWSYM prevp3net, resd 1 -NEWSYM prevp4net, resd 1 -NEWSYM prevp5net, resd 1 -NEWSYM netdelayed, resb 1 -NEWSYM ChatProgress,resd 1 -NEWSYM RecvProgress,resd 1 -NEWSYM IPXInfoStr, resw 1 -NEWSYM IPXInfoStrR, resw 1 -NEWSYM GUICMessage, resd 1 -NEWSYM GUICTimer, resd 1 -NEWSYM GUIOn, resb 1 -NEWSYM GUIOn2, resb 1 -NEWSYM GUIReset, resb 1 -;GOSPort db 0 -NEWSYM CurPalSelect, resb 1 -NEWSYM MotionBlur, resb 1 - -NEWSYM StartLL, resd 1 -NEWSYM StartLR, resd 1 -NEWSYM LatencyVal, resb 32 - -NEWSYM NetLoadState, resb 1 - -NEWSYM TRVal, resw 1 -NEWSYM TGVal, resw 1 -NEWSYM TBVal, resw 1 -NEWSYM TRVali, resw 1 -NEWSYM TGVali, resw 1 -NEWSYM TBVali, resw 1 -NEWSYM TRVal2, resw 1 -NEWSYM TGVal2, resw 1 -NEWSYM TBVal2, resw 1 - -SECTION .text - -%macro stim 0 -%ifdef __MSDOS__ - sti -%endif -%endmacro - -%macro clim 0 -%ifdef __MSDOS__ - cli -%endif -%endmacro - -clearsram: - push eax - push ecx - mov eax,srama - mov ecx,65536 -.loop - mov byte[eax],0FFh - inc eax - dec ecx - jnz .loop - cmp byte[SFXSRAM],0 - je .nosfxsram - mov eax,[sfxramdata] - mov ecx,65536 -.loop2 - mov byte[eax],0FFh - inc eax - dec ecx - jnz .loop2 -.nosfxsram - cmp byte[SA1Enable],1 - jne .nosa1 - mov eax,[SA1RAMArea] - mov ecx,65536*2 -.loop3 - mov byte[eax],0FFh - inc eax - dec ecx - jnz .loop3 -.nosa1 - pop ecx - pop eax - ret - -GUIQuickLoadUpdate: - cmp byte[prevlfreeze],0 - je .off - mov byte[GUIPrevMenuData.onoff+15],'O' - mov byte[GUIPrevMenuData.onoff+16],'N' - mov byte[GUIPrevMenuData.onoff+17],' ' - jmp .on -.off - mov byte[GUIPrevMenuData.onoff+15],'O' - mov byte[GUIPrevMenuData.onoff+16],'F' - mov byte[GUIPrevMenuData.onoff+17],'F' -.on - mov esi,prevloadfnamel -%ifdef __MSDOS__ - mov esi,prevloadnames -%endif - mov edi,GUIPrevMenuData+3 - mov edx,10 -.mainloop - mov ecx,25 -%ifdef __MSDOS__ - mov ecx,16 -%endif - push edi - push esi - cmp byte[esi],32 - je near .fin2 -.loop - mov al,[esi] - cmp al,0 - je .zero - mov [edi],al - inc esi - inc edi - dec ecx - jnz .loop - cmp byte[esi],0 - je .zero - mov byte[edi],'.' - mov byte[edi+1],'.' - mov byte[edi+2],'.' - jmp .fin -.zero - add ecx,3 -.loop2 - mov byte[edi],32 - inc edi - dec ecx - jnz .loop2 - jmp .fin -.fin2 - mov ecx,18 -.loop3 - mov byte[edi],32 - inc edi - dec ecx - jnz .loop3 -.fin - pop esi - pop edi - add esi,512 ;16 -%ifdef __MSDOS__ - sub esi,512-16 -%endif - add edi,32 - dec edx - jnz near .mainloop - ret - - - -CalcChecksum: - mov eax,GUIRAdd - mov ecx,100 - xor edx,edx - xor ebx,ebx -.loop - mov bl,[eax] - add edx,ebx - inc eax - dec ecx - jnz .loop - mov ebx,edx - xor bx,1011001011101101b - xor eax,eax - test bh,08h - jz .nb - mov al,1 -.nb - and bh,0F7h - test bl,10h - jz .nb2 - or bh,08h -.nb2 - and bl,0EFh - test al,1 - jz .nb3 - or bl,10h -.nb3 - xor bl,bh - or bl,80h - ret - -NEWSYM GUIRestoreVars - mov edx,GUIFName - call Open_File - jc .fail - mov bx,ax - mov edx,GUIRAdd - mov ecx,GUIsave - call Read_File - call Close_File -.fail - mov al,[GUIsmallscreenon] - mov [smallscreenon],al - mov al,[GUIScreenScale] - mov [ScreenScale],al - cmp byte[CmdLineNetPlay],0 - je .nocmdlinenetplay - mov ecx,28/4 - mov esi,CmdLineTCPIPAddress - mov edi,TCPIPAddress -.netplayloop - mov eax,[esi] - add esi,byte 4 - mov [edi],eax - add edi,byte 4 - dec ecx - jnz .netplayloop - xor eax,eax -.nocmdlinenetplay - call CalcChecksum - cmp byte[TimeChecker],bl - jne .nottimer - mov byte[ShowTimer],1 - mov dword[NumSnow],200 - mov dword[SnowTimer],0 -.nottimer - cmp byte[ReCalib],0 - je .nocal - mov byte[ReCalib],0 - mov dword[CalibXmin],0 - mov dword[CalibXmax],0 - mov dword[CalibYmin],0 - mov dword[CalibYmax],0 - mov dword[CalibXmin209],0 - mov dword[CalibXmax209],0 - mov dword[CalibYmin209],0 - mov dword[CalibYmax209],0 -.nocal - - mov dword[NumComboGlob],0 - mov edx,GUICName - 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 [NumComboGlob],al - mov ecx,[NumComboGlob] - mov edx,ecx - shl ecx,6 - add ecx,edx - add ecx,edx - mov edx,CombinDataGlob - call Read_File -.done - call Close_File -.failb - ret - -SECTION .data -NEWSYM ComboHeader, db 'Key Combination File',26,1,0 -NEWSYM ComboBlHeader, times 23 db 0 -SECTION .text - -NEWSYM ExecGUISaveVars - cmp byte[ShowTimer],1 - jne .nottimer - call CalcChecksum - mov byte[TimeChecker],bl -.nottimer - cmp byte[cfgdontsave],1 - je .failed - mov edx,GUIFName - call Create_File - jc .failed - mov bx,ax - mov edx,GUIRAdd - mov ecx,GUIsave - call Write_File - call Close_File -.failed - mov al,[NumComboGlob] - or al,al - jz .failb - mov [ComboHeader+22],al - mov edx,GUICName - call Create_File - jc .failb - mov bx,ax - mov edx,ComboHeader - mov ecx,23 - call Write_File - mov ecx,[NumComboGlob] - mov edx,ecx - shl ecx,6 - add ecx,edx - add ecx,edx - mov edx,CombinDataGlob - call Write_File - call Close_File -.failb - ret - -%macro GUIInitIRQs 0 - call GUIInit - mov esi,pressed - mov ecx,256 - mov al,0 -.loopa - mov [esi],al - inc esi - dec ecx - jnz .loopa -%endmacro - -%macro GUIDeInitIRQs 0 - call GUIDeInit -%endmacro - -SECTION .bss -NEWSYM GUIoldhand9o, resd 1 -NEWSYM GUIoldhand9s, resw 1 -NEWSYM GUIoldhand8o, resd 1 -NEWSYM GUIoldhand8s, resw 1 -GUIt1cc resd 1 -GUIt1ccSwap resb 1 -GUIskipnextkey42 resb 1 - -SECTION .text -NEWSYM GUIinit18_2hz - mov al,00110110b - out 43H,al - mov ax,0 - out 40H,al - mov al,ah - out 40H,al - ret - -NEWSYM GUIinit36_4hz - mov al,00110110b - out 43H,al - mov ax,32768 - out 40H,al - mov al,ah - out 40H,al - ret - -NEWSYM GUI36hzcall - inc dword[GUIt1cc] - inc dword[SnowMover] - cmp dword[ModemPTimer],0 - je .nodec5 - dec dword[ModemPTimer] -.nodec5 - cmp dword[GUIEditStringLTxt],0 - je .nodec - dec dword[GUIEditStringLTxt] -.nodec - cmp dword[GUIScrolTim1],0 - je .nodec4 - dec dword[GUIScrolTim1] -.nodec4 - cmp dword[GUIDClickTL],0 - je .nodec2 - dec dword[GUIDClickTL] -.nodec2 - cmp dword[GUIkeydelay],0 - je .nodec3 - dec dword[GUIkeydelay] -.nodec3 - cmp dword[GUIkeydelay2],0 - je .nodec3b - dec dword[GUIkeydelay2] -.nodec3b - cmp dword[GUICTimer],0 - je .nodec6 - dec dword[GUICTimer] -.nodec6 - inc byte[GUICCFlash] - and byte[GUICCFlash],0Fh - inc byte[GUILDFlash] - and byte[GUILDFlash],0Fh - inc byte[GUINetTextm2+2] - and byte[GUINetTextm2+2],0Fh - ret - -%ifdef __MSDOS__ -NEWSYM GUIhandler8h - cli - push ds - push eax - mov ax,[cs:dssel] - mov ds,ax - call GUI36hzcall - xor byte[GUIt1ccSwap],1 - cmp byte[GUIt1ccSwap],0 - je .nocall - pushf - call far [GUIoldhand8o] -.nocall - mov al,20h - out 20h,al - pop eax - pop ds - sti - iretd - -NEWSYM GUIhandler9h - cli - push ds - push eax - push ebx - mov ax,[cs:dssel] - mov ds,ax - - xor ebx,ebx - in al,60H ; get keyboard scan code - cmp al,42 - jne .no42 - cmp byte[GUIskipnextkey42],0 - je .no42 - mov byte[GUIskipnextkey42],0 - jmp .skipkeyrel -.no42 - cmp al,0E0h - jne .noE0 - mov byte[GUIskipnextkey42],1 - jmp .skipkeyrel -.noE0 - mov byte[GUIskipnextkey42],0 - mov bl,al - xor bh,bh - test bl,80h ; check if bit 7 is on (key released) - jnz .keyrel - cmp byte[pressed+ebx],0 - jne .skipa - mov byte[pressed+ebx],1 ; if not, set key to pressed -.skipa - jmp .skipkeyrel -.keyrel - and bl,7Fh - mov byte[pressed+ebx],0 ; if not, set key to pressed -.skipkeyrel - mov byte[pressed],0 - - pushf - call far [GUIoldhand9o] - mov al,20h - out 20h,al - pop ebx - pop eax - pop ds - sti - iretd -%endif - -%macro loadmenuopen 1 - mov al,[GUIcmenupos] - mov [GUIpmenupos],al - mov byte[GUIcmenupos],0 - cmp byte[GUIwinactiv+%1],1 - je %%menuontop - xor eax,eax - mov al,[GUIwinptr] - inc byte[GUIwinptr] - mov byte[GUIwinorder+eax],%1 - mov byte[GUIwinactiv+%1],1 - cmp byte[resetposn],1 - jne %%nomenuitem - mov eax,[GUIwinposxo+%1*4] - mov [GUIwinposx+%1*4],eax - mov eax,[GUIwinposyo+%1*4] - mov [GUIwinposy+%1*4],eax - jmp %%nomenuitem -%%menuontop - xor eax,eax - ; look for match -%%notfoundyet - mov bl,byte[GUIwinorder+eax] - cmp bl,%1 - je %%nextfind - inc eax - jmp %%notfoundyet -%%nextfind - inc eax - cmp al,[GUIwinptr] - je %%foundend - mov cl,[GUIwinorder+eax] - mov [GUIwinorder+eax-1],cl - jmp %%nextfind -%%foundend - mov byte[GUIpclicked],0 - mov [GUIwinorder+eax-1],bl -%%nomenuitem -%endmacro - -loadnetopen: - loadmenuopen 8 - ret - -SECTION .bss -MouseInitOkay resb 1 -SECTION .text - -LoadDetermine: - mov byte[GUIGameMenuData+14],1 - mov byte[GUIGameMenuData+14*2],1 - mov byte[GUIGameMenuData+14*4],1 - mov byte[GUIGameMenuData+14*5],1 - mov byte[GUIGameMenuData+14*6],1 - mov byte[GUICheatMenuData],1 - mov byte[GUICheatMenuData+14],1 - mov byte[GUICheatMenuData+14*2],1 - mov byte[GUIMiscMenuData+14*2],1 - cmp byte[CheatBDoor],1 - je .nomodem - cmp byte[CNetType],21 - je .modem - cmp byte[CNetType],22 - je .modem - cmp byte[CNetType],20 - jne .nomodem -.modem - mov byte[GUICheatMenuData],2 - mov byte[GUICheatMenuData+14],2 - mov byte[GUICheatMenuData+14*2],2 -.nomodem - cmp byte[romloadskip],0 - je .noromloaded2 - mov byte[GUIGameMenuData+14],2 - mov byte[GUIGameMenuData+14*2],2 - mov byte[GUIGameMenuData+14*4],2 - mov byte[GUIGameMenuData+14*5],2 - mov byte[GUIGameMenuData+14*6],2 - mov byte[GUICheatMenuData],2 - mov byte[GUICheatMenuData+14],2 - mov byte[GUICheatMenuData+14*2],2 - mov byte[GUIMiscMenuData+14*2],2 -.noromloaded2 -.noromloaded - ret - -SECTION .data -SantaData: -db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -db 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 -db 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 -db 1,0,0,1,0,0,1,0,0,0,1,1,1,0,1,1 -db 1,1,0,1,1,0,1,1,0,1,0,1,1,1,1,1 -db 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1 -db 1,1,0,1,1,0,1,1,0,0,1,1,1,1,1,1 - -SantaPos dd 272 -SantaNextT dd 36*15 -NumSnow dd 0 -NEWSYM SnowTimer, dd 36*30 -MsgGiftLeft dd 0 -SECTION .text - -DrawSnow: - cmp byte[OkaySC],0 - je near .nosanta - cmp dword[MsgGiftLeft],0 - je .nodec - mov edx,20 - mov ebx,210 - mov byte[GUItextcolor],228 - GUIOuttextwin .giftmsg -.nodec - mov esi,[vidbuffer] - add esi,[SantaPos] - add esi,60*288 - mov edx,SantaData - mov ebx,8 -.sloop2 - mov ecx,16 -.sloop - cmp byte[edx],0 - je .transp - mov byte[esi],0 -.transp - inc esi - inc edx - dec ecx - jnz .sloop - add esi,272 - dec ebx - jnz .sloop2 -.nosanta - mov esi,[vidbuffer] - mov ecx,200 - xor edx,edx -.loop - xor eax,eax - mov al,[SnowData+edx*4+3] - mov ebx,eax - shl eax,8 - shl ebx,5 - add eax,ebx - xor ebx,ebx - mov bl,[SnowData+edx*4+1] - add eax,ebx - add eax,16 - mov bl,[SnowVelDist+edx*2] - and bl,03h - add bl,228 - test byte[SnowVelDist+edx*2],8 - jz .nosnow - mov byte[esi+eax],bl -.nosnow - inc edx - dec ecx - jnz .loop - ; Change Snow Displacement Values -.next - cmp dword[SnowMover],0 - je .nomore - call ProcessSnowVelocity - dec dword[SnowMover] - jmp .next -.nomore - ret - -SECTION .data -.giftmsg db 'A GIFT TO YOU IN THE OPTIONS!',0 -SECTION .text - -ProcessSnowVelocity: - cmp dword[MsgGiftLeft],0 - je .nodec - dec dword[MsgGiftLeft] -.nodec - cmp dword[NumSnow],200 - jne .snowincr - cmp dword[SantaNextT],0 - je .skip - dec dword[SantaNextT] - jmp .notsreset -.skip - dec dword[SantaPos] - cmp dword[SantaPos],0 - jne .notsreset - mov dword[SantaPos],272 - mov dword[SantaNextT],36*60 - jmp .notsreset -.snowincr - dec dword[SnowTimer] - jnz .notsreset - inc dword[NumSnow] - mov dword[SnowTimer],18 -.notsreset - - mov ecx,[NumSnow] - cmp ecx,0 - jne .okay - ret -.okay - xor edx,edx -.loop - xor eax,eax - mov al,[SnowVelDist+edx*2] - mov ebx,100 - sub bl,[MusicRelVol] - add bx,bx - add ax,bx - add ax,bx - add word[SnowData+edx*4],ax - xor eax,eax - mov al,[SnowVelDist+edx*2+1] - add ax,256 - add word[SnowData+edx*4+2],ax - cmp word[SnowData+edx*4+2],200h - ja .nosdata - or byte[SnowVelDist+edx*2],8 -.nosdata - inc edx - dec ecx - jnz .loop - ret - -SECTION .bss -OkaySC resb 1 -SECTION .data -cstempfname db 'tmpchtsr.___',0 -SECTION .text - - -NEWSYM SaveSramData - ; save sram - cmp byte[sramsavedis],1 - je .nosram - cmp dword[ramsize],0 - je .nosram - clim - xor eax,eax - xor ebx,ebx - xor ecx,ecx - xor edx,edx - xor esi,esi - xor edi,edi - mov edx,fnames+1 - call Create_File - jc .failed - mov bx,ax - mov ecx,[ramsize] - mov edx,[sram] - call Write_File - call Close_File -.failed - stim -.nosram - call SaveCombFile - ret - -NEWSYM ProcRewind - mov eax,KeyRewind - add eax,4 - mov ebx,8 -.loop - cmp byte[eax],'a' - jb .b - cmp byte[eax],'z' - ja .b - sub byte[eax],'a'-'A' -.b - inc eax - dec ebx - jnz .loop - sub eax,8 - ; 90,83,75,78,73,71 - mov dword[.temp],44*65536*256+24*65536+72*256+40 - mov word[.temp+4],41*256+50 - add dword[.temp],34*65536*256+51*65536+11*256+50 - add word[.temp+4],30*256+23 - call .c - ; 95,68,69,77,79,95 - mov dword[.temp],25*65536*256+29*65536+31*256+62 - mov word[.temp+4],43*256+18 - add dword[.temp],52*65536*256+40*65536+37*256+33 - add word[.temp+4],52*256+61 - call .c - ; 80,72,65,82,79,83 - mov dword[.temp],11*65536*256+33*65536+24*256+35 - mov word[.temp+4],52*256+30 - add dword[.temp],71*65536*256+32*65536+48*256+45 - add word[.temp+4],31*256+49 - call .c - ret -.c - mov ebx,[.temp] - cmp [eax],ebx - jne .noteq - mov bx,[.temp+4] - cmp [eax+4],bx - jne .noteq - mov dword[eax],0 - mov dword[eax+4],0 - mov dword[eax+8],0 -.noteq - ret -section .bss -.temp resd 2 -section .text - -%macro ProcessOneDigit 1 - cmp dl,9 - jbe %%notover - add dl,65-48-10 -%%notover - add dl,48 - mov byte[.message+%1],dl - xor edx,edx - div ebx -%endmacro - -NEWSYM TestSent - mov eax,[NetSent] - xor edx,edx - mov ebx,16 - div ebx - ProcessOneDigit 3 - ProcessOneDigit 2 - ProcessOneDigit 1 - ProcessOneDigit 0 - - mov eax,[valuea] - xor edx,edx - mov ebx,16 - div ebx - ProcessOneDigit 8 - ProcessOneDigit 7 - ProcessOneDigit 6 - ProcessOneDigit 5 - - mov dword[GUICMessage],.message - mov dword[GUICTimer],100000 - ret -SECTION .data -.message db 0,0,0,0,' ',0,0,0,0,0,0,0 -SECTION .text - -NEWSYM StartGUI -; cmp byte[OSPort],1 -; jbe .dosport - cmp byte[TripBufAvail],0 - jne .notexttb - mov byte[Triplebufen],0 -.notexttb - cmp byte[MMXSupport],1 - jne .2xSaIdis - cmp byte[newgfx16b],0 - je .2xSaIdis - jmp .no2xSaIdis -.2xSaIdis - mov byte[En2xSaI],0 -.no2xSaIdis - cmp byte[En2xSaI],0 - je .no2xsaidis - mov byte[Triplebufen],0 -.no2xsaidis - cmp byte[En2xSaI],0 - je .no2xsaien - mov byte[scanlines],0 - mov byte[antienab],0 -.no2xsaien - -;.dosport - mov ecx,64 - mov eax,SpecialLine -.slloop - mov dword[eax],0 - add eax,4 - dec ecx - jnz .slloop - cmp byte[OldWinPos],0 - jne .okayow - xor esi,esi - mov ecx,17 -.nextow - mov eax,[GUIwinposx2+esi*4] - mov [GUIwinposx+esi*4],eax - mov eax,[GUIwinposy2+esi*4] - mov [GUIwinposy+esi*4],eax - inc esi - dec ecx - jnz .nextow - mov byte[OldWinPos],1 - mov eax,[pl1p209b] - mov [pl1p209],eax -.okayow -%ifndef __MSDOS__ - mov dword[GUINetPlayMenuData+1],'INTE' - mov dword[GUINetPlayMenuData+5],'RNET' - mov dword[GUINetPlayMenuData+1+14],'----' - mov dword[GUINetPlayMenuData+5+14],'----' - mov byte[MenuDat5],0 - mov byte[MenuDat5+1],2 -%endif -;.notwinport - ; copy old quickfilename to new quickfilename - cmp byte[prevloadl],0 - jne .noconvertlfqm - mov byte[prevloadl],1 - mov ecx,10 - xor edx,edx -.convlfnlp - mov eax,ecx - dec eax - mov edx,eax - shl eax,9 - shl edx,4 - mov bl,16 -.convlfnlp2 - mov bh,[prevloadfname+edx] - mov [prevloadfnamel+eax],bh - inc edx - inc eax - dec bl - jnz .convlfnlp2 - mov eax,ecx - dec eax - mov edx,eax - shl eax,9 - shl edx,7 - mov bl,128 -.convlfnlp2b - mov bh,[prevloaddname+edx] - mov [prevloaddnamel+eax],bh - inc edx - inc eax - dec bl - jnz .convlfnlp2b - dec ecx - jnz .convlfnlp -.noconvertlfqm - - mov byte[GUIOn],1 - mov byte[GUIOn2],1 - mov eax,[NumComboLocl] - cmp byte[GUIComboGameSpec],0 - jne .local - mov eax,[NumComboGlob] -.local - mov [NumCombo],eax - call ResetTripleBuf - - cmp dword[GUIwinposx+16*4],0 - jne .notzero - mov dword[GUIwinposx+16*4],3 - mov dword[GUIwinposy+16*4],22 -.notzero - xor ecx,ecx -.joysloop - cmp dword[pl1ULk+ecx*4],80h - jbe .nojoystick - mov dword[pl1ULk+ecx*4],0 -.nojoystick - inc ecx - cmp ecx,16 - jne .joysloop - - mov dword[GUICTimer],0 - cmp byte[OldVolume],1 - jne .notold - mov byte[OldVolume],0 - mov byte[MusicRelVol],100 - mov byte[cfgvolume],100 - ; Initialize volume - xor eax,eax - xor edx,edx - mov al,[MusicRelVol] - shl eax,7 - mov ebx,100 - div ebx - cmp al,127 - jb .noofb - mov al,127 -.noofb - mov [MusicVol],al -.notold - mov byte[CheatSearchStatus],0 - cmp byte[newgfx16b],0 - je .nong - mov ecx,255*144 - mov eax,[vidbufferofsb] -.loop - mov dword[eax],0 - add eax,4 - dec ecx - jnz .loop -.nong - mov byte[ShowTimer],1 - call Get_Date - cmp dh,12 - jne .noxmas - cmp dl,25 - jne .noxmas - mov byte[OkaySC],1 -.noxmas - mov byte[lastmouseholded],1 - cmp dword[GUIwinposx+15*4],0 - jne .nomoviemenufix - mov dword[GUIwinposx+15*4],50 - mov dword[GUIwinposy+15*4],50 -.nomoviemenufix - mov ax,[resolutn] - mov [PrevResoln],ax - mov word[resolutn],224 - - mov byte[GUIPalConv],0 - mov byte[MousePRClick],1 - - pushad - cmp byte[MouseInitOkay],1 - je near .mousedone - mov byte[MouseInitOkay],1 - cmp byte[MouseDis],1 - je .mousedone - call Init_Mouse - cmp ax,0 - jne .mousedone - mov byte[MouseDis],1 -.mousedone - popad - - mov eax,[KeyQuickLoad] - test byte[pressed+eax],1 - jz near .noquickload - mov byte[GUIcmenupos],0 - loadmenuopen 1 -.noquickload - mov esi,pressed - mov ecx,64+32+8 -.pclear - mov dword[esi],0 - add esi,4 - dec ecx - jnz .pclear - mov byte[pressed+1],2 - mov byte[GUIescpress],1 - - ; set Video cursor location - xor eax,eax - mov al,[cvidmode] - mov [GUIcurrentvideocursloc],eax - mov ebx,[NumVideoModes] - sub ebx,5 - cmp eax,ebx - jbe .noof - mov eax,ebx -.noof - mov [GUIcurrentvideoviewloc],eax - - ; change to sram dir - mov dl,[SRAMDrive] - mov ebx,SRAMDir - call Change_Dir - - call SaveSramData - - cmp byte[SFXSRAM],0 - je .nosfxsram - clim - mov edx,fnames+1 - call Create_File - jc .nosfxramwrite - mov bx,ax - mov ecx,65536 - mov edx,[sfxramdata] - call Write_File - call Close_File -.nosfxramwrite - stim -.nosfxsram - call GUIQuickLoadUpdate - call LoadDetermine - ; change dir to LoadDrive/LoadDir - mov dl,[LoadDrive] - mov ebx,LoadDir - call Change_Dir - - cmp byte[NetFilename],0 - je near .nofilenamenet - cmp byte[NetChatFirst],0 - je near .filenamenetb - mov ebx,NetFilename - xor ecx,ecx -.fnetloop - cmp byte[ebx],'\' - jne .fnetloopb - mov ecx,ebx -.fnetloopb - inc ebx - cmp byte[ebx],0 - jne .fnetloop - or ecx,ecx - jz near .nofilenamenet - mov byte[ecx],0 - push ecx - mov dl,[LoadDrive] - cmp byte[NetFilename+1],':' - jne .nodrivenetb - mov dl,[NetFilename] - sub dl,'A' -.nodrivenetb - mov ebx,NetFilename - call Change_Dir - pop ecx - mov ebx,NetFilename - inc ecx -.nextnetl - mov al,[ecx] - mov [ebx],al - inc ecx - inc ebx - or al,al - jnz .nextnetl - jmp .nofilenamenet -.filenamenetb - mov dl,[LoadDrive] - cmp byte[NetFilename+1],':' - jne .nodrivenet - mov dl,[NetFilename] - sub dl,'A' -.nodrivenet - mov ebx,NetFilename - call Change_Dir - mov byte[NetFilename],0 -.nofilenamenet - cmp byte[NetServer],0 - je .noserverclient - mov byte[CNetType],15 - mov byte[ModemProcess],40 - cmp byte[NetServer],2 - jne .noclient - mov byte[ModemProcess],41 -.noclient - mov byte[NetServer],0 - mov byte[WhichRemote],4 - mov byte[GUIcmenupos],0 - mov byte[GUIcrowpos],0 - call loadnetopen -.noserverclient - cmp byte[NetNewNick],0 - je .nonewnick - mov ebx,NetNewNick - mov ecx,ChatNick -.nickloop - mov al,[ebx] - mov [ecx],al - inc ebx - inc ecx - or al,al - jnz .nickloop - mov byte[NetNewNick],0 -.nonewnick - -;NEWSYM NetChatFirst, db 0 -;NEWSYM NetServer, db 0 -;NEWSYM NetQuitAfter, db 0 -;NEWSYM NetNewNick, times 16 db 0 -;NEWSYM NetFilename, times 512 db 0 - - cmp byte[CNetType],20 - je near .noautostate - cmp byte[AutoState],0 - je .noautostate - cmp byte[romloadskip],0 - jne .noautostate - call SaveSecondState -.noautostate - - GUIInitIRQs - - cmp byte[CNetType],20 - jne near .nostat20 - test byte[NetQuit],80h - jnz near .nostat20 - mov byte[GUIcmenupos],0 - mov byte[GUIcrowpos],0 - call loadnetopen -%ifdef __MSDOS__ - cmp byte[WhichRemote],1 - jne .yesdcd - call ModemCheckDCD - cmp al,1 - jne near .nostat20 -.yesdcd -%endif - - mov byte[RestoreValues],1 - pushad - mov dword[CBackupPos],0 - call BackupCVFrame - popad - - call DisableSUDPPacket - call Wait1SecWin - ; sync - call PreparePacket - mov al,254 - call RemoteSendChar - call SendPacket - call PreparePacket - mov al,254 - call RemoteSendChar - call SendPacket - call PreparePacket - mov al,254 - call RemoteSendChar - call SendPacket - call PreparePacket - mov al,254 - call RemoteSendChar - call SendPacket - mov dword[ModemPTimer],4*32 -.nochar - pushad - call JoyRead - popad - call RemoteGetChar - cmp dword[ModemPTimer],0 - je near .nostat20 - cmp dh,0 - je .nochar - cmp dl,254 - jne .nochar - call PreparePacket - mov al,253 - call RemoteSendChar - call SendPacket -.nocharc - pushad - call JoyRead - popad - call RemoteGetChar - cmp dword[ModemPTimer],0 - je near .nostat20 - cmp dh,0 - je .nocharc - cmp dl,253 - jne .nocharc - call PreparePacket - mov al,1 - call RemoteSendChar - call SendPacket - call ClearUDPStuff - - mov byte[RemoteCommand],1 - mov byte[HoldCommand],1 - cmp byte[NetLoadState],1 - jne .notreceive - mov byte[CNetType],22 -.noreceivestate - pushad - call JoyRead - popad - call RemoteGetChar - cmp dh,0 - je .noreceivestate - cmp dl,14 - jne .noreceivestate - call loadstaterecvinit -.notreceive - cmp byte[NetLoadState],2 - jne .notsend - call NetLoadStuff -.notsend -.nostat20 - - cmp byte[GUIwinptr],0 - jne .nomenuopen - cmp byte[lastcursres],1 - je .nomenuchange - mov byte[GUIcmenupos],2 - mov byte[GUIcrowpos],0 - mov dword[GUICYLocPtr],MenuDat2 - cmp byte[lastcursres],0 - je .nomenuchange -.nomenuopen - mov byte[GUIcmenupos],0 -.nomenuchange - cmp byte[GUIwinactiv+1],0 - je .noloadrefresh - call GetLoadData -.noloadrefresh - mov byte[GUIHold],0 - ; clear 256 bytes from hirestiledat - mov esi,hirestiledat - mov ecx,256 -.loophires - mov byte[esi],0 - inc esi - dec ecx - jnz .loophires - mov byte[curblank],00h - call InitGUI - - cmp byte[CheatWinMode],0 - je near .csskip - ; change to sram dir - mov dl,[SRAMDrive] - mov ebx,SRAMDir - call Change_Dir - - ; Load Cheat Search File - mov edx,cstempfname - call Open_File - jc .csskipb - mov bx,ax - mov edx,[vidbuffer] - add edx,129600 - mov ecx,65536*2+32768 - call Read_File - call Close_File - -.csskipb - ; change dir to LoadDrive/LoadDir - mov dl,[LoadDrive] - mov ebx,LoadDir - call Change_Dir -.csskip - - mov byte[GUIQuit],0 -.nokey - cmp byte[CNetType],21 - je .noquit - cmp byte[CNetType],22 - jne .yesquit -.noquit - mov byte[GUIQuit],0 -.yesquit - cmp byte[GUIQuit],2 - je near .exit - cmp byte[GUIQuit],1 - je near .exitgui - mov byte[GUIQuit],0 - cmp byte[MouseDis],1 - je .mousedis2 - call ProcessMouse - cmp byte[videotroub],1 - jne .notrouble - ret -.notrouble -.mousedis2 - call GUIUnBuffer - cmp byte[CNetType],20 - je .nowater - cmp byte[CNetType],21 - je .nowater - cmp byte[CNetType],22 - je .nowater - cmp byte[GUIEffect],1 - jne .nosnow - call DrawSnow -.nosnow - cmp byte[GUIEffect],2 - jne .nowater - call DrawWater -.nowater - cmp byte[GUIEffect],3 - jne .nowater2 - call DrawWater -.nowater2 - cmp byte[GUIEffect],4 - jne .nosmoke -; call DrawSmoke - call DrawBurn -.nosmoke -; call TestSent - cmp byte[CNetType],20 - jne .noreceive - - cmp byte[NetChatFirst],0 - je .noloadbeforechat - mov eax,NetFilename - call GUIloadfilename.nocnettype - mov byte[sramsavedis],1 - call transfersram - mov byte[NetChatFirst],0 -.noloadbeforechat - - cmp byte[GUIcmenupos],0 - jne .nomenuout2 - cmp byte[GUIwinptr],0 - jne .nomenuout2 - cmp byte[netlastloaded],1 - je .openmenu - mov byte[GUIcmenupos],2 - mov byte[GUIcrowpos],0 - jmp .nomenuout2 -.openmenu - mov byte[netlastloaded],0 - call loadnetopen -.nomenuout2 - call RemoteGetChar - cmp dh,0 - jne .received - mov dl,1 -.received - call ProcessRemoteCommand - jmp .noreceive2 -.noreceive - mov byte[HoldCommand],0 -.noreceive2 - - cmp byte[CNetType],21 - jne .noloadstatesend - call loadstatesend -.noloadstatesend - cmp byte[CNetType],22 - jne .noloadstaterecv - call loadstaterecv -.noloadstaterecv - - cmp byte[CNetType],15 - je .modem - cmp byte[CNetType],12 - je .modem - cmp byte[CNetType],11 - je .modem - cmp byte[CNetType],10 - jne near .nomodem -.modem - call ProcessModem -%ifdef __MSDOS__ - cmp byte[Connected],1 - je near .nomodem - call ModemGetChar - cmp dh,0 - je .nomodem - cmp byte[ModemOKStat],0 - jne .foundokay - mov byte[ModemOKStat],1 - jmp .skipstat -.foundokay - cmp byte[ModemOKStat],1 - jne .nostat0 - cmp dl,13 - jne .nostat0 - inc byte[ModemOKStat] - jmp .skipstat -.nostat0 - cmp byte[ModemOKStat],2 - jne .nostat1 - cmp dl,'O' - jne .nostat1 - inc byte[ModemOKStat] - jmp .skipstat -.nostat1 - cmp byte[ModemOKStat],3 - jne .nostat2 - cmp dl,'K' - jne .nostat2 - inc byte[ModemOKStat] - jmp .skipstat -.nostat2 -.skipstat - mov dh,0 - call NetAddChar -%endif -.nomodem - - cmp dword[GUIEditStringcWin],0 - je .noblink - cmp dword[GUIEditStringcLen],0 - je .noblink - mov eax,[GUIEditStringcLen] - cmp dword[GUIEditStringLTxt],8 - jb .noblinka - mov byte[eax],'_' - mov byte[eax+1],0 - mov dword[GUIEditStringLstb],1 -.noblinka - cmp dword[GUIEditStringLTxt],0 - jne .noblink - mov dword[GUIEditStringLTxt],16 -.noblink - - call DisplayBoxes - - cmp dword[GUIEditStringLstb],1 - jne .notblinked - mov dword[GUIEditStringLstb],0 - mov eax,[GUIEditStringcLen] - mov byte[eax],0 -.notblinked - - call DisplayMenu - cmp byte[MouseDis],1 - je .mousedis3 - call DrawMouse -.mousedis3 - cmp byte[FirstTimeData],0 - jne .nofirsttime - call guifirsttimemsg - mov byte[FirstTimeData],1 -.nofirsttime - cmp dword[GUICTimer],0 - je .notimer - GUIOuttext 21,211,[GUICMessage],50 - GUIOuttext 20,210,[GUICMessage],63 -.notimer - call vidpastecopyscr - call GUIgetcurrentinput - jmp .nokey - -.exitgui - cmp byte[CNetType],20 - jne near .nostat20b2 - call PreparePacket - mov al,255 - call RemoteSendChar - call SendPacket - call PreparePacket - mov al,255 - call RemoteSendChar - call SendPacket - call PreparePacket - mov al,255 - call RemoteSendChar - call SendPacket -.nostat20b2 - - GUIDeInitIRQs - - mov ax,[PrevResoln] - mov [resolutn],ax - jmp endprog -.exit - mov edi,[spcBuffera] - mov ecx,65536 - xor eax,eax - rep stosd - mov edi,spcRamcmp - mov ecx,65536/4 - xor eax,eax - rep stosd - GUIDeInitIRQs - call ClearScreen - cmp byte[cbitmode],0 - jne .nomakepal - call makepal -.nomakepal - mov word[t1cc],1 - - mov byte[chaton],0 - mov dword[chatstrL],0 - mov dword[chatLpos],0 - mov dword[chatstrR],0 - mov dword[chatRTL],0 - - cmp byte[CNetType],20 - jne near .nostat20b - - mov al,10 - sub al,[Latency] - cmp byte[Latency],4 - jb .nolatency - mov al,7 -.nolatency - mov [BackStateSize],al - - call ResetExecStuff - - mov byte[MultiTap],1 - cmp byte[pl3neten],0 - jne .mtap - cmp byte[pl4neten],0 - jne .mtap - cmp byte[pl5neten],0 - jne .mtap -.nomtap - mov byte[MultiTap],0 -.mtap - - cmp byte[RestoreValues],1 - jne .norestoreval - pushad - mov dword[PBackupPos],0 - call RestoreCVFrame - popad -.norestoreval - - mov dword[nmiprevaddrl],0 - mov dword[nmiprevaddrh],0 - mov dword[nmirept],0 - mov dword[nmiprevline],224 - mov dword[nmistatus],0 - mov dword[spcnumread],0 - mov dword[spchalted],-1 - mov byte[NextLineCache],0 - mov byte[DSPMem+08h],0 - mov byte[DSPMem+18h],0 - mov byte[DSPMem+28h],0 - mov byte[DSPMem+38h],0 - mov byte[DSPMem+48h],0 - mov byte[DSPMem+58h],0 - mov byte[DSPMem+68h],0 - mov byte[DSPMem+78h],0 - - mov byte[netdelayed],0 - mov dword[cnetptrhead],0 - mov dword[cnetptrtail],0 - mov dword[prevp1net],0 - mov dword[prevp2net],0 - mov dword[prevp3net],0 - mov dword[prevp4net],0 - mov dword[prevp5net],0 - mov byte[BackState],1 - mov dword[CBackupPos],0 - mov dword[PBackupPos],0 - mov dword[PPValue],0 - mov dword[DPValue],0 - mov byte[CurRecv],0 - mov dword[NetQuitter],0 - mov dword[LatencyV],0 - mov dword[LatencyV+4],0 - mov dword[LatencyV+8],0 - mov dword[LatencyV+12],0 - mov dword[LatencyRecvPtr],0 - mov dword[LatencySendPtr],0 - - mov eax,cnetplaybuf - mov ecx,512 -.loop20 - mov byte[eax],0 - inc eax - dec ecx - jnz .loop20 - mov al,[Latency] - mov [LatencyLeft],al - mov byte[NetSwap],0 - - mov dword[CBackupPos],0 - mov dword[PBackupPos],0 - - mov ebx,[romdata] - mov ecx,[NumofBanks] - shl ecx,15 - xor eax,eax - or ecx,ecx - jz .nocsumloop -.csumloop - add al,[ebx] - adc ah,0 - inc ebx - dec ecx - jnz .csumloop -.nocsumloop - mov [CheckSumVal],eax - - mov ebx,eax - ; sync with modem - call PreparePacket - mov al,30 - call RemoteSendChar - mov al,230 - call RemoteSendChar - mov al,[CheckSumVal] - call RemoteSendChar - mov al,[CheckSumVal+1] - call RemoteSendChar - call SendPacket -.nocharb - pushad - call JoyRead - popad -; cmp byte[pressed+1],1 -; je near .faileda - - call RemoteGetChar - cmp dh,0 - je .nocharb - cmp dl,230 - jne .nocharb -.nocharb2 - call RemoteGetChar - cmp dh,0 - je .nocharb2 - cmp dl,[CheckSumVal] - jne .wrongcs -.nocharb3 - call RemoteGetChar - cmp dh,0 - je .nocharb3 - cmp dl,[CheckSumVal+1] - je .okaychat -.wrongcs - mov esi,WrongCheckSum - call WritetochatBuffer - jmp StartGUI -.okaychat - call PreparePacket - mov al,229 - call RemoteSendChar - call SendPacket -.nocharb5 - pushad - call JoyRead - popad -; cmp byte[pressed+1],1 -; je near .failedb - - call RemoteGetChar - cmp dh,0 - je .nocharb5 - cmp dl,229 - jne .nocharb5 -.nostat20b - call EnableSUDPPacket - - mov byte[ChatProgress],0 - mov dword[RecvProgress],0 - - ; get LoadDrive/LoadDir - mov ebx,LoadDir - mov edx,LoadDrive - call Get_Dir - - ; change dir to InitDrive/InitDir - mov dl,[InitDrive] - mov ebx,InitDir - ; save config - call Change_Dir - call createnewcfg - call GUISaveVars - - ; change dir to SRAMDrive/SRAMDir - mov dl,[SRAMDrive] - mov ebx,SRAMDir - call Change_Dir - - mov byte[MousePRClick],1 - mov byte[prevbright],0 - mov ax,[PrevResoln] - mov [resolutn],ax - - mov byte[CheatOn],0 - cmp dword[NumCheats],0 - je .nocheats - mov byte[CheatOn],1 -.nocheats - - cmp byte[CopyRamToggle],1 - jne .nocopyram - mov byte[CopyRamToggle],0 - mov eax,dword[vidbuffer] - add eax,129600 - ; copy 128k ram - mov ebx,[wramdata] - mov ecx,32768 -.loopcr - mov edx,[ebx] - mov [eax],edx - add ebx,4 - add eax,4 - dec ecx - jnz .loopcr -.nocopyram - - cmp byte[CheatWinMode],2 - jne .notview - mov byte[CheatWinMode],1 -.notview - - cmp byte[CheatWinMode],0 - je .csskip2 - ; Save Cheat Search File - mov edx,cstempfname - call Create_File - jc .csskip2 - mov bx,ax - mov edx,[vidbuffer] - add edx,129600 - mov ecx,65536*2+32768 - call Write_File - call Close_File -.csskip2 - - mov edi,[vidbuffer] - mov ecx,288*120 - xor eax,eax - rep stosd - - mov ecx,256*144 - mov eax,[vidbufferofsb] -.loopcl - mov dword[eax],0 - add eax,4 - dec ecx - jnz .loopcl - - mov al,[cfgsoundon] - mov [soundon],al - mov al,[cfgStereoSound] - mov [StereoSound],al - mov al,[cfgSoundQuality] - mov [SoundQuality],al - call AdjustFrequency - mov byte[GUIOn],0 - mov byte[GUIOn2],0 - mov byte[GUIReset],0 - mov dword[StartLL],0 - mov dword[StartLR],0 - mov byte[NetLoadState],0 - jmp continueprog - -.faileda - call WinErrorA - jmp continueprog -.failedb - call WinErrorB - jmp continueprog - -SECTION .bss -CheckSumVal resd 1 -SECTION .data -WrongCheckSum db 10,13,'ROM Data Mismatch',10,13,10,13,0 -SECTION .text - - -SRAMDirc: - ; get LoadDrive/LoadDir - mov ebx,LoadDir - mov edx,LoadDrive - call Get_Dir - ; change to sram dir - mov dl,[SRAMDrive] - mov ebx,SRAMDir - call Change_Dir - ret - -LOADDir: - mov dl,[LoadDrive] - mov ebx,LoadDir - call Change_Dir - ret - -guifirsttimemsg: - xor ebx,ebx - mov ecx,256 -.a - mov byte[pressed+ebx],0 - inc ebx - dec ecx - jnz .a - mov byte[pressed+2Ch],0 -.again - GUIBox 43,75,213,163,160 - GUIBox 43,75,213,75,162 - GUIBox 43,75,43,163,161 - GUIBox 213,75,213,163,159 - GUIBox 43,163,213,163,158 - GUIOuttext 56,81,guiftimemsg1,220-15 - GUIOuttext 55,80,guiftimemsg1,220 - GUIOuttext 56,96,guiftimemsg2,220-15 - GUIOuttext 55,95,guiftimemsg2,220 - GUIOuttext 56,104,guiftimemsg3,220-15 - GUIOuttext 55,103,guiftimemsg3,220 - GUIOuttext 56,112,guiftimemsg4,220-15 - GUIOuttext 55,111,guiftimemsg4,220 - GUIOuttext 56,120,guiftimemsg5,220-15 - GUIOuttext 55,119,guiftimemsg5,220 - GUIOuttext 56,128,guiftimemsg6,220-15 - GUIOuttext 55,127,guiftimemsg6,220 - GUIOuttext 56,136,guiftimemsg7,220-15 - GUIOuttext 55,135,guiftimemsg7,220 - GUIOuttext 56,151,guiftimemsg8,220-15 - GUIOuttext 55,150,guiftimemsg8,220 - call vidpastecopyscr - call GUIUnBuffer - call DisplayBoxes - call DisplayMenu - call JoyRead - cmp byte[pressed+2Ch],0 - jne .pressedokay - jmp .again -.pressedokay -.again2 - call Check_Key - or al,al - jz .nokey - call Get_Key - jmp .again2 -.nokey - cmp byte[MouseDis],1 - je .mousedis2 - push ebx -; mov eax,0Bh -; int 33h - pop ebx -.mousedis2 - ret - -SECTION .data -guiftimemsg1 db 'ONE TIME USER REMINDER :',0 -guiftimemsg2 db 'PLEASE BE SURE TO READ',0 -guiftimemsg3 db 'GUINOTES.TXT FOR AN',0 -guiftimemsg4 db 'IMPORTANT REMINDER.',0 -guiftimemsg5 db 'ALSO, WHENEVER YOU HAVE',0 -guiftimemsg6 db 'PROBLEMS, BE SURE TO READ',0 -guiftimemsg7 db 'ZSNES.FAQ AND README.TXT',0 -guiftimemsg8 db 'PRESS "Z" TO CONTINUE.',0 -SECTION .text - -guimustrestartmsg: - xor ebx,ebx - mov ecx,256 -.a - cmp byte[pressed+ebx],1 - jne .npr1 - mov byte[pressed+ebx],2 -.npr1 - inc ebx - dec ecx - jnz .a - mov byte[pressed+2Ch],0 -.again - GUIBox 43,87,213,151,160 - GUIBox 43,87,213,87,162 - GUIBox 43,87,43,151,161 - GUIBox 213,87,213,151,159 - GUIBox 43,151,213,151,158 - GUIOuttext 56,92,guiqtimemsg1,220-15 - GUIOuttext 55,91,guiqtimemsg1,220 - GUIOuttext 56,100,guiqtimemsg2,220-15 - GUIOuttext 55,99,guiqtimemsg2,220 - GUIOuttext 56,108,guiqtimemsg3,220-15 - GUIOuttext 55,107,guiqtimemsg3,220 - GUIOuttext 56,116,guiqtimemsg4,220-15 - GUIOuttext 55,115,guiqtimemsg4,220 - GUIOuttext 56,139,guiqtimemsg8,220-15 - GUIOuttext 55,138,guiqtimemsg8,220 - call vidpastecopyscr - call GUIUnBuffer - call DisplayBoxes - call DisplayMenu - call JoyRead - - mov byte[pressed+2Ch],0 - - call JoyRead - xor ebx,ebx - mov ecx,256+128+64 -.b - cmp byte[pressed+ebx],1 - je .pressedokay - inc ebx - dec ecx - jnz .b - jmp .again -.pressedokay -.again2 - call Check_Key - or al,al - jz .nokey - call Get_Key - jmp .again2 -.nokey - cmp byte[MouseDis],1 - je .mousedis2 - push ebx -; mov eax,0Bh -; int 33h - pop ebx -.mousedis2 - mov byte[GUIQuit],1 - ret - -SECTION .data -guiqtimemsg1 db 'ZSNES MUST BE RESTARTED',0 -guiqtimemsg2 db 'TO USE THIS OPTION.',0 -guiqtimemsg3 db 'THIS PROGRAM WILL NOW',0 -guiqtimemsg4 db 'EXIT.',0 -guiqtimemsg8 db 'PRESS ANY KEY.',0 -SECTION .text - -guiprevideo: - xor ebx,ebx - mov ecx,256 -.a - mov byte[pressed+ebx],0 - inc ebx - dec ecx - jnz .a - call GUIUnBuffer - call DisplayBoxes - call DisplayMenu - GUIBox 43,90,213,163,160 - GUIBox 43,90,213,90,162 - GUIBox 43,90,43,163,161 - GUIBox 213,90,213,163,159 - GUIBox 43,163,213,163,158 - GUIOuttext 56,96,guiprevidmsg1,220-15 - GUIOuttext 55,95,guiprevidmsg1,220 - GUIOuttext 56,104,guiprevidmsg2,220-15 - GUIOuttext 55,103,guiprevidmsg2,220 - GUIOuttext 56,112,guiprevidmsg3,220-15 - GUIOuttext 55,111,guiprevidmsg3,220 - GUIOuttext 56,120,guiprevidmsg4,220-15 - GUIOuttext 55,119,guiprevidmsg4,220 - GUIOuttext 56,128,guiprevidmsg5,220-15 - GUIOuttext 55,127,guiprevidmsg5,220 - GUIOuttext 56,136,guiprevidmsg6,220-15 - GUIOuttext 55,135,guiprevidmsg6,220 - GUIOuttext 56,151,guiprevidmsg7,220-15 - GUIOuttext 55,150,guiprevidmsg7,220 - call vidpastecopyscr - mov byte[pressed+2Ch],0 -.again - call JoyRead - xor ebx,ebx - mov ecx,256+128+64 -.b - cmp byte[pressed+ebx],0 - jne .pressedokay - inc ebx - dec ecx - jnz .b - cmp byte[MouseDis],1 - je .mousedis - call Get_MouseData - test bx,01h - jnz .pressedokay -.mousedis - jmp .again -.pressedokay -.again2 - call Check_Key - or al,al - jz .nokey - call Get_Key - jmp .again2 -.nokey - cmp byte[MouseDis],1 - je .mousedis2 - push ebx -; mov eax,0Bh -; int 33h - pop ebx -.mousedis2 - ret - -SECTION .data -guiprevidmsg1 db 'ZSNES WILL NOW ATTEMPT',0 -guiprevidmsg2 db 'TO CHANGE YOUR VIDEO',0 -guiprevidmsg3 db 'MODE. IF THE CHANGE',0 -guiprevidmsg4 db 'IS UNSUCCESSFUL, WAIT',0 -guiprevidmsg5 db '10 SECONDS AND VIDEO',0 -guiprevidmsg6 db 'MODE WILL BE RESET',0 -guiprevidmsg7 db 'PRESS ANY KEY',0 -SECTION .text - -guipostvideo: - mov ecx,255*144 - mov eax,[vidbufferofsb] -.loop - mov dword[eax],0FFFFFFFFh - add eax,4 - dec ecx - jnz .loop - - xor ebx,ebx - mov ecx,256 -.a - mov byte[pressed+ebx],0 - inc ebx - dec ecx - jnz .a - mov dword[GUIkeydelay],36*10 - -.pressedfail - call GUIUnBuffer - call DisplayBoxes - call DisplayMenu - GUIBox 43,90,213,163,160 - GUIBox 43,90,213,90,162 - GUIBox 43,90,43,163,161 - GUIBox 213,90,213,163,159 - GUIBox 43,163,213,163,158 - GUIOuttext 56,96,guipostvidmsg1,220-15 - GUIOuttext 55,95,guipostvidmsg1,220 - GUIOuttext 56,151,guipostvidmsg2,220-15 - GUIOuttext 55,150,guipostvidmsg2,220 - call vidpastecopyscr - ; Wait for all mouse and input data to be 0 - - call JoyRead - xor ebx,ebx - mov ecx,256+128+64 -.b2 - cmp byte[pressed+ebx],0 - jne near .pressedfail - inc ebx - dec ecx - jnz .b2 - cmp byte[MouseDis],1 - je .mousedis3 - call Get_MouseData - test bx,01h - jnz near .pressedfail -.mousedis3 - -.again - call JoyRead - xor ebx,ebx - mov ecx,256+128+64 -.b - cmp byte[pressed+ebx],0 - jne .pressedokay - inc ebx - dec ecx - jnz .b - cmp byte[MouseDis],1 - je .mousedis - call Get_MouseData - test bx,01h - jnz .pressedokay -.mousedis - cmp dword[GUIkeydelay],0 - je .pressedokay - jmp .again -.pressedokay -.again2 - call Check_Key - or al,al - jz .nokey - call Get_Key - jmp .again2 -.nokey - cmp byte[MouseDis],1 - je .mousedis2 - push ebx -; mov eax,0Bh -; int 33h - pop ebx -.mousedis2 - mov byte[GUIpclicked],1 - ret - -SECTION .data -guipostvidmsg1 db 'VIDEO MODE CHANGED.',0 -guipostvidmsg2 db 'PRESS ANY KEY',0 -SECTION .text - -guipostvideofail: - mov dword[guipostvidptr],guipostvidmsg3b - mov byte[guipostvidmsg3b],0 - mov byte[guipostvidmsg4b],0 - mov byte[guipostvidmsg5b],0 - mov eax,[ErrorPointer] - mov ebx,eax -.loop - cmp byte[ebx],0 - je .found - cmp byte[ebx],'$' - je .found - inc ebx - jmp .loop -.found - mov edx,ebx - sub edx,eax -.detnext - or edx,edx - jz .notext - cmp edx,25 - jbe .copytext -.nospace - dec edx - cmp byte[eax+edx],32 - jne .nospace - jmp .detnext -.copytext - push ebx - mov ecx,[guipostvidptr] -.copytextloop - mov bl,[eax] - cmp bl,'$' - jne .notdol - mov bl,0 -.notdol - mov [ecx],bl - inc eax - inc ecx - dec edx - jnz .copytextloop - mov byte[ecx],0 - pop ebx - add dword[guipostvidptr],26 - cmp byte[eax],0 - je .notext - cmp byte[eax],'$' - je .notext - inc eax - jmp .found -.notext - - xor ebx,ebx - mov ecx,256 -.a - mov byte[pressed+ebx],0 - inc ebx - dec ecx - jnz .a - call GUIUnBuffer - call DisplayBoxes - call DisplayMenu - GUIBox 43,90,213,163,160 - GUIBox 43,90,213,90,162 - GUIBox 43,90,43,163,161 - GUIBox 213,90,213,163,159 - GUIBox 43,163,213,163,158 - GUIOuttext 56,96,guipostvidmsg1b,220-15 - GUIOuttext 55,95,guipostvidmsg1b,220 - GUIOuttext 56,108,guipostvidmsg2b,220-15 - GUIOuttext 55,107,guipostvidmsg2b,220 - GUIOuttext 56,119,guipostvidmsg3b,220-15 - GUIOuttext 55,118,guipostvidmsg3b,220 - GUIOuttext 56,129,guipostvidmsg4b,220-15 - GUIOuttext 55,128,guipostvidmsg4b,220 - GUIOuttext 56,139,guipostvidmsg5b,220-15 - GUIOuttext 55,138,guipostvidmsg5b,220 - GUIOuttext 56,152,guipostvidmsg8b,220-15 - GUIOuttext 55,151,guipostvidmsg8b,220 - call vidpastecopyscr - call GUIUnBuffer - call DisplayBoxes - call DisplayMenu -%ifndef __LINUX__ - mov dword[GUIkeydelay],0FFFFFFFFh -%else - mov dword[GUIkeydelay],0x0 -%endif - jmp guipostvideo.pressedfail - -SECTION .data -guipostvidmsg1b db 'VIDEO MODE CHANGE FAILED.',0 -guipostvidmsg2b db 'UNABLE TO INIT VESA2:',0 -guipostvidmsg3b db 'AAAAAAAAAAAAAAAAAAAAAAAAA',0 -guipostvidmsg4b db 'AAAAAAAAAAAAAAAAAAAAAAAAA',0 -guipostvidmsg5b db 'AAAAAAAAAAAAAAAAAAAAAAAAA',0 -guipostvidmsg8b db 'PRESS ANY KEY',0 -SECTION .bss -guipostvidptr resd 1 -SECTION .text - -GUILoadManualDir - mov ebx,GUILoadTextA - mov [ManualCPtr],ebx - cmp byte[ebx],0 - je near .nofindfile - xor eax,eax -.next - cmp byte[ebx],':' - jne .nocolon - mov eax,ebx -.nocolon - inc ebx - cmp byte[ebx],0 - jne .next - or eax,eax - jz .nomorecolon - cmp eax,GUILoadTextA - je .invalidcolon - mov bl,[eax-1] - cmp bl,'a' - jb .nolower - cmp bl,'z' - ja .nolower - sub bl,'a'-'A' -.nolower - cmp bl,'A' - jb .invalidcolon - cmp bl,'Z' - ja .invalidcolon - sub bl,'A' - mov dl,bl - push eax - call Change_Drive - pop eax - mov byte[ManualStatus],1 -.invalidcolon - inc eax - mov [ManualCPtr],eax -.nomorecolon - mov ebx,[ManualCPtr] - cmp byte[ebx],0 - je near .finish - xor eax,eax -.next2 - cmp byte[ebx],'\' - jne .nobackslash - mov eax,ebx -.nobackslash - inc ebx - cmp byte[ebx],0 - jne .next2 - or eax,eax - jz .finish - inc eax - mov cl,[eax] - mov byte[eax],0 - push ecx - push eax - mov edx,[ManualCPtr] - call Change_Single_Dir - jc .nosuchdir - mov byte[ManualStatus],1 -.nosuchdir - pop eax - pop ecx - mov [eax],cl - mov [ManualCPtr],eax -.finish - mov edx,[ManualCPtr] - call Change_Single_Dir - jc .notdir - mov byte[ManualStatus],1 - jmp .nomoredir -.notdir - call .nomoredir - mov edx,[ManualCPtr] - cmp byte[edx],0 - je .nofindfile - ; otherwise set ManualStatus to 2 - mov byte[ManualStatus],2 - mov dword[GUIcurrentfilewin],0 -.nofindfile - ret -.nomoredir - ; refresh dir if necessary - cmp byte[ManualStatus],1 - jne .norefresh - call GetLoadData.a -.norefresh - ret - -SECTION .bss -ManualCPtr resd 1 -ManualStatus resb 1 - -NEWSYM MovieCounter, resd 1 - -SECTION .data -UnableMovie2 db 'MUST PLAY WITH SOUND OFF',0 -UnableMovie3 db 'MUST PLAY WITH SOUND ON',0 - -SECTION .text - -MoviePlay: - cmp byte[CNetType],20 - je near .dontplay - mov byte[GUICBHold],0 - mov dword[MovieCounter],0 - cmp byte[MovieProcessing],0 - jne near .dontplay - mov byte[GUIQuit],2 - mov ebx,[statefileloc] - mov eax,[fnamest+ebx-3] - push eax - mov dword[fnamest+ebx-3],'.zmv' - mov al,[CMovieExt] - mov byte[fnamest+ebx],al - call ChangetoSRAMdir - mov dword[Totalbyteloaded],0 - call loadstate2 - mov edx,fnamest+1 - call Open_File - jc near .notexist - mov bx,ax - mov [MovieFileHand],bx - mov cx,[Totalbyteloaded+2] - mov dx,[Totalbyteloaded] - call File_Seek - mov edx,RecData - mov ecx,16 - call Read_File - cmp byte[RecData+2],1 - jne .noextra - mov eax,[RecData+3] - mov [timer2upd],eax - mov eax,[RecData+7] - mov [curexecstate],eax - mov dword[nmiprevaddrl],0 - mov dword[nmiprevaddrh],0 - mov dword[nmirept],0 - mov dword[nmiprevline],224 - mov dword[nmistatus],0 - mov dword[spcnumread],0 - mov dword[spchalted],-1 - mov byte[NextLineCache],0 -.noextra - mov al,[RecData] - cmp al,[soundon] - jne near .soundisoff - cmp dword[ramsize],0 - je .noram - mov edx,[sram] - mov ecx,[ramsize] - call Read_File -.noram - mov byte[MovieProcessing],1 -.skip - mov dword[PJoyAOrig],0 - mov dword[PJoyBOrig],0 - mov dword[PJoyCOrig],0 - mov dword[PJoyDOrig],0 - mov dword[PJoyEOrig],0 - mov byte[sramsavedis],1 - mov byte[UseRemoteSRAMData],0 - mov byte[DSPMem+08h],0 - mov byte[DSPMem+18h],0 - mov byte[DSPMem+28h],0 - mov byte[DSPMem+38h],0 - mov byte[DSPMem+48h],0 - mov byte[DSPMem+58h],0 - mov byte[DSPMem+68h],0 - mov byte[DSPMem+78h],0 -.notexist - call ChangetoLOADdir - pop eax - mov ebx,[statefileloc] - mov [fnamest+ebx-3],eax -.dontplay - ret -.soundisoff - mov dword[Msgptr],UnableMovie2 - cmp byte[soundon],0 - jne .soundon - mov dword[Msgptr],UnableMovie3 -.soundon - mov eax,[MsgCount] - mov [MessageOn],eax - call Close_File - pop eax - ret - -SECTION .bss -NEWSYM Totalbyteloaded, resd 1 -NEWSYM sramsavedis, resb 1 - -SECTION .data -DevicePtr dd pl1selk,pl2selk,pl3selk,pl4selk,pl5selk - -SECTION .text - -CheckMenuItemHelp: - mov al,[GUIcmenupos] - mov [GUIpmenupos],al - mov byte[GUIcmenupos],0 - cmp byte[GUIwinactiv+edx],1 - je .menuontop - xor eax,eax - mov al,[GUIwinptr] - inc byte[GUIwinptr] - mov byte[GUIwinorder+eax],dl - mov byte[GUIwinactiv+edx],1 - cmp byte[resetposn],1 - jne .nomenuitem - mov eax,[GUIwinposxo+edx*4] - mov [GUIwinposx+edx*4],eax - mov eax,[GUIwinposyo+edx*4] - mov [GUIwinposy+edx*4],eax - jmp .nomenuitem -.menuontop - xor eax,eax - ; look for match -.notfoundyet - mov bl,byte[GUIwinorder+eax] - cmp bl,dl - je .nextfind - inc eax - jmp .notfoundyet -.nextfind - inc eax - cmp al,[GUIwinptr] - je .foundend - mov cl,[GUIwinorder+eax] - mov [GUIwinorder+eax-1],cl - jmp .nextfind -.foundend - mov byte[GUIpclicked],0 - mov [GUIwinorder+eax-1],bl -.nomenuitem - ret - -%macro GUICheckMenuItem 2 - mov edx,%1 - cmp byte[GUIcrowpos],%2 - jne near %%nomenuitem - call CheckMenuItemHelp -%%nomenuitem -%endmacro - -%macro checkqloadvalue 1 - cmp byte[GUIcrowpos],%1 - jne %%skip - mov esi,prevloaddnamel+%1*512 - cmp byte[esi+1],0 - je %%notvalid - mov edi,prevloadfnamel+%1*512 - mov ebx,prevloadnames+%1*16 - mov ecx,%1 - call loadquickfname -%%notvalid - ret -%%skip -%endmacro - -GUITryMenuItem: - cmp byte[GUIcmenupos],1 - jne near .noquickload - checkqloadvalue 0 - checkqloadvalue 1 - checkqloadvalue 2 - checkqloadvalue 3 - checkqloadvalue 4 - checkqloadvalue 5 - checkqloadvalue 6 - checkqloadvalue 7 - checkqloadvalue 8 - checkqloadvalue 9 - cmp byte[GUIcrowpos],11 - jne .skipswitch - xor byte[prevlfreeze],1 - cmp byte[prevlfreeze],0 - je .off - mov byte[GUIPrevMenuData.onoff+15],'O' - mov byte[GUIPrevMenuData.onoff+16],'N' - mov byte[GUIPrevMenuData.onoff+17],' ' - jmp .on -.off - mov byte[GUIPrevMenuData.onoff+15],'O' - mov byte[GUIPrevMenuData.onoff+16],'F' - mov byte[GUIPrevMenuData.onoff+17],'F' -.on -.skipswitch - cmp byte[GUIcrowpos],12 - jne .skipclear - cmp byte[prevlfreeze],0 - jne .skipclear - mov edi,prevloadnames - mov eax,20202020h - mov ecx,4*10 - rep stosd - mov edi,prevloaddnamel - xor eax,eax - mov ecx,128*10 - rep stosd - mov edi,prevloadfnamel - mov eax,0 ;20202020h - mov ecx,128*10 - rep stosd - call GUIQuickLoadUpdate - ret -.skipclear -.noquickload - cmp byte[GUIcmenupos],2 - jne near .nomain - GUICheckMenuItem 1, 0 ; Load - cmp byte[GUIcrowpos],0 - jne .noloadrefresh - jmp GetLoadData -.noloadrefresh - cmp byte[romloadskip],0 - jne near .noromloaded - cmp byte[GUIcrowpos],1 ; Run - jne .norun - cmp byte[romloadskip],0 - jne .dontquit - mov byte[GUIQuit],2 -.dontquit - ret -.norun - cmp byte[CNetType],21 - je near .noreset - cmp byte[CNetType],22 - je near .noreset - GUICheckMenuItem 12, 2 ; Reset - cmp byte[GUIcrowpos],2 - jne .noreset - mov byte[GUICResetPos],1 -.noreset -; cmp byte[OSPort],3 -; je .win32state -; cmp byte[CNetType],20 -; je near .noromloaded -;.win32state - cmp byte[CNetType],21 - je near .noromloaded - cmp byte[CNetType],22 - je near .noromloaded - cmp byte[GUIcrowpos],4 - jne .nosavestate - mov byte[GUIStatesText5],0 - mov byte[GUICStatePos],1 -.nosavestate - cmp byte[GUIcrowpos],5 - jne .noloadstate - mov byte[GUIStatesText5],1 - mov byte[GUICStatePos],1 -.noloadstate - GUICheckMenuItem 14, 4 ; Save State - GUICheckMenuItem 14, 5 ; Load State - GUICheckMenuItem 2, 6 ; Select State -.noromloaded - cmp byte[GUIcrowpos],8 - jne .noquit - mov byte[GUIQuit],1 -.noquit -.nomain - cmp byte[GUIcmenupos],3 - jne near .noconfig - GUICheckMenuItem 3, 0 - GUICheckMenuItem 3, 1 - GUICheckMenuItem 3, 2 - GUICheckMenuItem 3, 3 - GUICheckMenuItem 3, 4 - cmp byte[GUIcrowpos],0 - jne .noplay1 - mov byte[cplayernum],0 -.noplay1 - cmp byte[GUIcrowpos],1 - jne .noplay2 - mov byte[cplayernum],1 -.noplay2 - cmp byte[GUIcrowpos],2 - jne .noplay3 - mov byte[cplayernum],2 -.noplay3 - cmp byte[GUIcrowpos],3 - jne .noplay4 - mov byte[cplayernum],3 -.noplay4 - cmp byte[GUIcrowpos],4 - jne .noplay5 - mov byte[cplayernum],4 -.noplay5 - GUICheckMenuItem 17, 6 - GUICheckMenuItem 4, 8 - GUICheckMenuItem 5, 9 - GUICheckMenuItem 6, 10 -.noconfig - cmp byte[romloadskip],0 - jne near .nocheat - cmp byte[CheatBDoor],1 - je .yescheat - cmp byte[CNetType],20 - je near .nocheat - cmp byte[CNetType],21 - je near .nocheat - cmp byte[CNetType],22 - je near .nocheat -.yescheat - cmp byte[GUIcmenupos],4 - jne near .nocheat - GUICheckMenuItem 7, 0 - GUICheckMenuItem 7, 1 - GUICheckMenuItem 13, 2 - cmp byte[GUIcrowpos],0 - jne .noaddc - mov dword[GUIcurrentcheatwin],1 -.noaddc - cmp byte[GUIcrowpos],1 - jne .nobrowsec - mov dword[GUIcurrentcheatwin],0 -.nobrowsec -.nocheat - cmp byte[GUIcmenupos],5 - jne near .nonet -; cmp byte[GOSPort],3 -; je near .win32 -%ifdef __MSDOS__ - cmp byte[CNetType],10 - jae .nomod - mov byte[CNetType],0 -.nomod - GUICheckMenuItem 8, 0 - GUICheckMenuItem 8, 1 - cmp byte[CNetType],10 - jae near .nonet - cmp byte[GUIcrowpos],1 - jne .noipx - mov byte[CNetType],7 -.noipx - cmp byte[GUIcrowpos],0 - jne near .nonet - mov byte[CNetType],1 - jmp .nonet -%endif -;.win32 - GUICheckMenuItem 8, 0 - cmp byte[CNetType],10 - jae near .nonet - cmp byte[GUIcrowpos],0 - jne near .nonet - mov byte[CNetType],4 - call GetHostName -.nonet - cmp byte[GUIcmenupos],6 - jne near .nomisc - GUICheckMenuItem 9, 0 - GUICheckMenuItem 10, 1 - cmp byte[romloadskip],0 - jne near .nomovie - GUICheckMenuItem 15, 2 - cmp byte[GUIcrowpos],2 - jne .nomovie - mov byte[MovieRecordWinVal],0 -.nomovie - GUICheckMenuItem 16, 3 - cmp byte[GUIcrowpos],4 - jne .nosavestuff - - ; change dir to InitDrive/InitDir - mov dl,[InitDrive] - mov ebx,InitDir - call Change_Dir - call createnewcfg - call GUISaveVars - - call Makemode7Table - mov dword[GUICMessage],.message1 - mov dword[GUICTimer],50 - ; change dir to LoadDrive/LoadDir - mov dl,[LoadDrive] - mov ebx,LoadDir - call Change_Dir -.nosavestuff - GUICheckMenuItem 11, 6 -.nomisc - ret - -SECTION .data -.message1 db 'CONFIGURATION FILES SAVED.',0 -SECTION .text - -DisplayBoxes: - xor esi,esi - mov byte[cwindrawn],0 -.next2 - mov al,[GUIwinorder+esi] - cmp al,0 - je .done - inc byte[cwindrawn] - inc esi - jmp .next2 -.done - dec byte[cwindrawn] - xor eax,eax - xor esi,esi -.next - mov al,[GUIwinorder+esi] - cmp al,0 - je near .nomore - push esi - cmp al,1 - jne .noguiconfirm - cmp byte[GUIReset],1 - je near .finstuff - call DisplayGUILoad - jmp .finstuff -.noguiconfirm - cmp al,2 - jne .noguichosesave - call DisplayGUIChoseSave - jmp .finstuff -.noguichosesave - cmp al,3 - jne .noguiinput - call DisplayGUIInput - jmp .finstuff -.noguiinput - cmp al,4 - jne .noguioption - call DisplayGUIOption - jmp .finstuff -.noguioption - cmp al,5 - jne .noguivideo - call DisplayGUIVideo - jmp .finstuff -.noguivideo - cmp al,6 - jne .noguisound - call DisplayGUISound - jmp .finstuff -.noguisound - cmp al,7 - jne .noguicheat - call DisplayGUICheat - jmp .finstuff -.noguicheat - cmp al,8 - jne .noguinet - call DisplayNetOptns - jmp .finstuff -.noguinet - cmp al,9 - jne .noguigameop - call DisplayGameOptns - jmp .finstuff -.noguigameop - cmp al,10 - jne .noguiconf - call DisplayGUIOptns -%ifdef __WIN32__ - pushad - call CheckAlwaysOnTop - popad -%endif - jmp .finstuff -.noguiconf - cmp al,11 - jne .noguiconf2 - call DisplayGUIAbout - jmp .finstuff -.noguiconf2 - cmp al,12 - jne .noguireset - call DisplayGUIReset - jmp .finstuff -.noguireset - cmp al,13 - jne .noguisearch - call DisplayGUISearch - jmp .finstuff -.noguisearch - cmp al,14 - jne .noguistates - call DisplayGUIStates - jmp .finstuff -.noguistates - cmp al,15 - jne .noguimovies - call DisplayGUIMovies - jmp .finstuff -.noguimovies - cmp al,16 - jne .noguicombo - call DisplayGUICombo - jmp .finstuff -.noguicombo - cmp al,17 - jne .noaddon - call DisplayGUIAddOns - jmp .finstuff -.noaddon -.finstuff - pop esi - inc esi - dec byte[cwindrawn] - jmp .next -.nomore - ret - - - -ChangetoSRAMdir: - mov dl,[SRAMDrive] - mov ebx,SRAMDir - call Change_Dir - ret - -ChangetoLOADdir: - mov dl,[LoadDrive] - mov ebx,LoadDir - call Change_Dir - ret - -GUIProcStates: - xor eax,eax - mov al,[GUIwinptr] - dec eax - mov byte[GUIwinactiv+14],0 - mov byte[GUIwinorder+eax],0 - dec byte[GUIwinptr] - cmp byte[GUICBHold],10 - je .yesstate - mov byte[GUICBHold],0 - ret -.yesstate - mov byte[GUICBHold],0 - ; change dir to SRAMDrive/SRAMDir - call ChangetoSRAMdir - cmp byte[GUIStatesText5],1 - je .loadstate - call statesaver - jmp .changedir -.loadstate - cmp byte[CNetType],20 - jne .notnet - call NetLoadStuff - jmp .changedir -.notnet - call loadstate2 -.changedir - ; change dir to LoadDrive/LoadDir - call ChangetoLOADdir - ret - -SaveSecondState: - ; change dir to SRAMDrive/SRAMDir - call ChangetoSRAMdir - mov ebx,[statefileloc] - mov al,[fnamest+ebx] - mov byte[fnamest+ebx],'s' - push eax - call statesaver - pop eax - mov ebx,[statefileloc] - mov [fnamest+ebx],al - call ChangetoLOADdir - ret - -LoadSecondState: - call ChangetoSRAMdir - mov ebx,[statefileloc] - mov al,[fnamest+ebx] - mov byte[fnamest+ebx],'s' - push eax - call loadstate2 - pop eax - mov ebx,[statefileloc] - mov [fnamest+ebx],al - call ChangetoLOADdir - ret - -GUIProcReset: - cmp byte[GUICBHold],2 - jne .noreset - mov byte[GUIReset],1 - call GUIDoReset - cmp byte[CNetType],20 - jne .noreset - call PreparePacket - mov al,40 - call RemoteSendChar - call SendPacket - mov byte[GUIQuit],0 -.noreset - mov byte[GUICBHold],0 - xor eax,eax - mov al,[GUIwinptr] - dec eax - mov byte[GUIwinactiv+12],0 - mov byte[GUIwinorder+eax],0 - dec byte[GUIwinptr] - ret - -SECTION .bss -LoadDuplicFound resb 1 -SECTION .text - -%macro GUIDMHelp 4 - mov byte[GUItextcolor],46 - mov byte[GUItextcolor+1],42 - mov byte[GUItextcolor+2],38 - mov byte[GUItextcolor+3],44 - mov byte[GUItextcolor+4],40 - cmp byte[GUIcmenupos],%4 - jne %%nohighlight - mov byte[GUItextcolor],38 - mov byte[GUItextcolor+1],40 - mov byte[GUItextcolor+2],46 - mov byte[GUItextcolor+3],40 - mov byte[GUItextcolor+4],44 -%%nohighlight - GUIBox %1,3,%2,3,[GUItextcolor] - GUIBox %1,4,%2,12,[GUItextcolor+1] - GUIBox %1,13,%2,13,[GUItextcolor+2] - GUIBox %1,3,%1,12,[GUItextcolor+3] - GUIBox %2,4,%2,13,[GUItextcolor+4] - GUIOuttext %1+5,7,%3,44 - GUIOuttext %1+4,6,%3,62 -%endmacro - -%macro GUIDMHelpB 4 - mov byte[GUItextcolor],46 - mov byte[GUItextcolor+1],42 - mov byte[GUItextcolor+2],38 - mov byte[GUItextcolor+3],44 - mov byte[GUItextcolor+4],40 - cmp byte[GUIcwinpress],%4 - jne %%nohighlight - mov byte[GUItextcolor],38 - mov byte[GUItextcolor+1],40 - mov byte[GUItextcolor+2],46 - mov byte[GUItextcolor+3],40 - mov byte[GUItextcolor+4],44 -%%nohighlight - GUIBox %1,3,%2,3,[GUItextcolor] - GUIBox %1,4,%2,13,[GUItextcolor+1] - GUIBox %1,14,%2,14,[GUItextcolor+2] - GUIBox %1,3,%1,13,[GUItextcolor+3] - GUIBox %2,4,%2,14,[GUItextcolor+4] - GUIOuttext %1+3,7,%3,44 - GUIOuttext %1+2,6,%3,62 -%endmacro - -%macro GUIDMHelpB2 4 - mov byte[GUItextcolor],46 - mov byte[GUItextcolor+1],42 - mov byte[GUItextcolor+2],38 - mov byte[GUItextcolor+3],44 - mov byte[GUItextcolor+4],40 - cmp byte[GUIcwinpress],%4 - jne %%nohighlight - mov byte[GUItextcolor],38 - mov byte[GUItextcolor+1],40 - mov byte[GUItextcolor+2],46 - mov byte[GUItextcolor+3],40 - mov byte[GUItextcolor+4],44 -%%nohighlight - GUIBox %1,3,%2,3,[GUItextcolor] - GUIBox %1,4,%2,6,[GUItextcolor+1] - GUIBox %1,7,%2,7,[GUItextcolor+2] - GUIBox %1,3,%1,6,[GUItextcolor+3] - GUIBox %2,4,%2,7,[GUItextcolor+4] - GUIOuttext %1+3,5,%3,44 - GUIOuttext %1+2,4,%3,62 -%endmacro - -%macro GUIDMHelpB3 4 - mov byte[GUItextcolor],46 - mov byte[GUItextcolor+1],42 - mov byte[GUItextcolor+2],38 - mov byte[GUItextcolor+3],44 - mov byte[GUItextcolor+4],40 - cmp byte[GUIcwinpress],%4 - jne %%nohighlight - mov byte[GUItextcolor],38 - mov byte[GUItextcolor+1],40 - mov byte[GUItextcolor+2],46 - mov byte[GUItextcolor+3],40 - mov byte[GUItextcolor+4],44 -%%nohighlight - GUIBox %1,9,%2,9,[GUItextcolor] - GUIBox %1,10,%2,12,[GUItextcolor+1] - GUIBox %1,13,%2,13,[GUItextcolor+2] - GUIBox %1,9,%1,12,[GUItextcolor+3] - GUIBox %2,10,%2,13,[GUItextcolor+4] - GUIOuttext %1+3,11,%3,44 - GUIOuttext %1+2,10,%3,62 -%endmacro - -%macro GUIDrawMenuM 10 - GUIShadow %7,%8,%7+4+%3*6,%8+3+%4*10 - GUIBox %1,%2,%1+4+%3*6,%2+3+%4*10,43 - - mov edi,[GUIcrowpos] - mov ecx,edi - shl edi,8 - shl ecx,5 - add edi,ecx - lea edi,[edi*5] - shl edi,1 - add edi,[vidbuffer] - add edi,%1+17+18*288 - mov ecx,6*%3+3 - mov edx,1 - mov al,73 - push edi - call GUIDrawBox - pop edi - add edi,288 - mov ecx,6*%3+3 - mov edx,7 - mov al,72 - push edi - call GUIDrawBox - pop edi - add edi,288*7 - mov ecx,6*%3+3 - mov edx,1 - mov al,73 - call GUIDrawBox - - GUIBox %1+%10,%2,%1+4+%3*6,%2,47 - GUIBox %1,%2,%1,%9,45 - GUIBox %1,%9,%1+4+%3*6,%9,39 - GUIBox %1+4+%3*6,1+%2,%1+4+%3*6,%9,41 - mov edi,%5 - mov esi,[vidbuffer] - add esi,16+%6+20*288 - mov ecx,%4 - mov edx,6*%3 - call GUIMenuDisplay - - mov dword[GUIMenuL],%1+1 - mov dword[GUIMenuR],%1+6*%3+3 - mov dword[GUIMenuD],18+%4*10 -%endmacro - -DisplayMenu: - ; Draw Shadow - GUIShadow 5,7,235,21 - ; Display Top Border - GUIBox 0,1,229,1,71 - GUIBox 0,2,229,2,70 - GUIBox 0,3,229,3,69 - GUIBox 0,4,229,4,68 - GUIBox 0,5,229,5,67 - GUIBox 0,6,229,6,66 - GUIBox 0,7,229,7,65 - GUIBox 0,8,229,8,64 - GUIBox 0,9,229,9,65 - GUIBox 0,10,229,10,66 - GUIBox 0,11,229,11,67 - GUIBox 0,12,229,12,68 - GUIBox 0,13,229,13,69 - GUIBox 0,14,229,14,70 - GUIBox 0,15,229,15,71 - -; cmp byte[OSPort],3 -; jne near .notwinpressa - %ifdef __LINUX__ - GUIShadow 238,9,247,20 - GUIShadow 249,9,257,20 - %endif - %ifdef __WIN32__ - GUIShadow 238,9,247,14 - GUIShadow 238,16,247,20 - GUIShadow 249,9,257,20 - %endif -.notwinpressa - -; cmp byte[OSPort],3 -; jne near .notwinpressb - - %ifdef __LINUX__ - mov byte[GUIMenuItem+36],247 - GUIDMHelpB 233,242,GUIMenuItem+36,1 - mov byte[GUIMenuItem+36],'x' - GUIDMHelpB 244,253,GUIMenuItem+36,2 - %endif - - %ifdef __WIN32__ - mov byte[GUIMenuItem+36],249 - GUIDMHelpB2 233,242,GUIMenuItem+36,1 - mov byte[GUIMenuItem+36],248 - GUIDMHelpB3 233,242,GUIMenuItem+36,3 - mov byte[GUIMenuItem+36],'x' - GUIDMHelpB 244,253,GUIMenuItem+36,2 - %endif -.notwinpressb - - ; Display upper-left box - mov byte[GUIMenuItem+36],25 - GUIDMHelp 4,12,GUIMenuItem+6,1 - GUIOuttext 4+3,7,GUIMenuItem+36,44 - GUIOuttext 4+2,6,GUIMenuItem+36,62 - ; Display boxes - GUIDMHelp 17,47,GUIMenuItem,2 - GUIDMHelp 52,94,GUIMenuItem+7,3 - GUIDMHelp 99,135,GUIMenuItem+14,4 - GUIDMHelp 140,188,GUIMenuItem+21,5 - GUIDMHelp 193,223,GUIMenuItem+29,6 - - mov dword[GUIMenuL],0 - mov dword[GUIMenuR],0 - mov dword[GUIMenuD],0 - - ; format : x pos, y pos, #charx, #chary, name, xpos+2, xpos+5,22, - ; 19+#chary*10, length of top menu box - cmp byte[GUIcmenupos],1 - jne near .nomenu1 - GUIDrawMenuM 4,16,30,13,GUIPrevMenuData,6,9,22,149,8 ;19+13*10 - mov dword[GUICYLocPtr],MenuDat1 -.nomenu1 - cmp byte[GUIcmenupos],2 - jne near .nomenu2 - GUIDrawMenuM 17,16,10,9,GUIGameMenuData,19,22,22,109,30 ;19+9*10 - mov dword[GUICYLocPtr],MenuDat2 -.nomenu2 - cmp byte[GUIcmenupos],3 - jne near .nomenu3 - GUIDrawMenuM 52,16,9,11,GUIConfigMenuData,54,57,22,129,42 ;19+11*10 - mov dword[GUICYLocPtr],MenuDat3 -.nomenu3 - cmp byte[GUIcmenupos],4 - jne near .nomenu4 - GUIDrawMenuM 99,16,11,3,GUICheatMenuData,101,104,22,49,36 ;19+3*10 - mov dword[GUICYLocPtr],MenuDat4 -.nomenu4 - cmp byte[GUIcmenupos],5 - jne near .nomenu5 -; cmp byte[GOSPort],3 -; je near .menu5b -%ifdef __MSDOS__ - GUIDrawMenuM 140,16,10,2,GUINetPlayMenuData,142,145,22,39,48 ;19+2*10 - mov dword[GUICYLocPtr],MenuDat5 - jmp .nomenu5 -%endif -.menu5b - GUIDrawMenuM 140,16,10,1,GUINetPlayMenuData,142,145,22,29,48 ;19+2*10 - mov dword[GUICYLocPtr],MenuDat5 -.nomenu5 - cmp byte[GUIcmenupos],6 - jne near .nomenu6 - GUIDrawMenuM 193,16,9,7,GUIMiscMenuData,195,198,22,89,30 ;19+5*10 - mov dword[GUICYLocPtr],MenuDat6 -.nomenu6 - ret - -GUIMenuDisplay: - xor ebx,ebx -.next - mov al,[edi] - push ebx - push ecx - push esi - cmp al,0 - je near .notext - cmp al,2 - je .darktext - inc edi - mov byte[GUItextcolor],44 - cmp byte[GUIcrowpos],bl - je .nodrawshadow - push edi - push esi - add esi,289 - call GUIOutputString - pop esi - pop edi -.nodrawshadow - mov byte[GUItextcolor],63 - call GUIOutputString - inc edi - jmp .text -.darktext - inc edi - mov byte[GUItextcolor],42 - cmp byte[GUIcrowpos],bl - je .nodrawshadow2 - push edi - push esi - add esi,289 - call GUIOutputString - pop esi - pop edi -.nodrawshadow2 - mov byte[GUItextcolor],57 - call GUIOutputString - inc edi - jmp .text -.notext - add esi,4*288 - mov ecx,edx -.loop - mov byte[esi],45 - mov byte[esi-289],40 - mov byte[esi+289],42 - inc esi - dec ecx - jnz .loop - add edi,14 -.text - pop esi - pop ecx - pop ebx - add esi,10*288 - inc ebx - dec ecx - jnz near .next - ret - - - -InitGUI: - cmp byte[newengen],0 - je .nong16b - cmp byte[cbitmode],0 - je .nong16b - call GetScreen -.nong16b - call ClearScreen - call Clear2xSaIBuffer - call GUISetPal - call GUIBufferData - ret - -GUISetPal: - cmp byte[cbitmode],1 - je near GUISetPal16 - ; set palette - ; Fixed Color Scale = 0 .. 31 - mov dx,03C8h - mov al,0 - out dx,al - inc dx - out dx,al - out dx,al - out dx,al - - inc al - mov dx,03C8h - mov bl,1 - out dx,al - inc dx -.loopd - mov al,bl - add al,[GUIRAdd] - out dx,al - mov al,bl - add al,[GUIGAdd] - out dx,al - mov al,bl - add al,[GUIBAdd] - out dx,al - inc bl - cmp bl,32 - jne .loopd - ; gray scale = 32 .. 63 - mov dx,03C8h - mov bl,32 - mov al,32 - out dx,al - inc dx -.loopc - mov al,bl - add al,al - out dx,al - out dx,al - out dx,al - inc bl - cmp bl,64 - jne .loopc - ; shadow = 96 .. 127 - inc al - mov al,96 - mov dx,03C8h - mov bl,0 - out dx,al - inc dx -.loope - mov al,bl - add al,[GUIRAdd] - mov ah,al - add al,al - add al,ah - shr al,2 - out dx,al - mov al,bl - add al,[GUIGAdd] - mov ah,al - add al,al - add al,ah - shr al,2 - out dx,al - mov al,bl - add al,[GUIBAdd] - mov ah,al - add al,al - add al,ah - shr al,2 - out dx,al - inc bl - cmp bl,32 - jne .loope - - ; 0,10,31 - mov al,[GUITRAdd] - mov [TRVal],al - mov al,[GUITGAdd] - mov [TGVal],al - mov al,[GUITBAdd] - mov [TBVal],al - mov ax,[TRVal] - inc ax - shr ax,3 - mov [TRVali],ax - shl ax,3 - add [TRVal],ax - mov ax,[TGVal] - inc ax - shr ax,3 - mov [TGVali],ax - shl ax,3 - add [TGVal],ax - mov ax,[TBVal] - inc ax - shr ax,3 - mov [TBVali],ax - shl ax,3 - add [TBVal],ax - - GUIPal 64,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 65,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 66,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 67,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 68,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 69,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 70,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 71,[TRVal],[TGVal],[TBVal] - - GUIPal 72,40,0,20 - GUIPal 73,34,0,21 - - GUIPal 80,0,10,28 - GUIPal 81,0,10,27 - GUIPal 82,0,10,25 - GUIPal 83,0,09,24 - GUIPal 84,0,08,22 - GUIPal 85,0,07,20 - GUIPal 86,0,06,18 - GUIPal 87,0,05,15 - GUIPal 88,20,0,10 - GUIPal 89,17,0,10 - - ; Orange Scale - mov dx,03C8h - mov al,128 - mov cl,20 - out dx,al - mov bh,0 - mov ah,0 - inc dx -.loopf - add bh,2 - add ah,1 - mov al,63 - out dx,al - mov al,bh - out dx,al - mov al,ah - out dx,al - dec cl - jnz .loopf - - ; Blue scale = 148 .. 167 - mov al,[GUIWRAdd] - add al,al - mov [TRVal],al - mov al,[GUIWGAdd] - add al,al - mov [TGVal],al - mov al,[GUIWBAdd] - add al,al - mov [TBVal],al - mov byte[TRVali],4 - mov byte[TGVali],4 - mov byte[TBVali],4 - - GUIPal 152,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 151,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 150,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 149,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 148,[TRVal],[TGVal],[TBVal] - - mov al,[GUIWRAdd] - add al,al - mov [TRVal],al - mov al,[GUIWGAdd] - add al,al - mov [TGVal],al - mov al,[GUIWBAdd] - add al,al - mov [TBVal],al - mov byte[TRVali],4 - mov byte[TGVali],4 - mov byte[TBVali],4 - call DecPalVal - call DecPalVal - - GUIPal 157,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 156,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 155,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 154,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 153,[TRVal],[TGVal],[TBVal] - - mov al,[GUIWRAdd] - add al,al - mov [TRVal],al - mov al,[GUIWGAdd] - add al,al - mov [TGVal],al - mov al,[GUIWBAdd] - add al,al - mov [TBVal],al - mov byte[TRVali],4 - mov byte[TGVali],4 - mov byte[TBVali],4 - call DecPalVal - call DecPalVal - call DecPalVal - call DecPalVal - - GUIPal 162,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 161,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 160,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 159,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 158,[TRVal],[TGVal],[TBVal] - - GUIPal 163,40,40,00 - GUIPal 164,30,30,00 - GUIPal 165,50,00,00 - GUIPal 166,35,00,00 - GUIPal 167,00,00,00 - - ; Blue scale shadow - mov al,[GUIWRAdd] - mov [TRVal],al - mov al,[GUIWGAdd] - mov [TGVal],al - mov al,[GUIWBAdd] - mov [TBVal],al - mov byte[TRVali],2 - mov byte[TGVali],2 - mov byte[TBVali],2 - - GUIPal 172,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 171,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 170,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 169,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 168,[TRVal],[TGVal],[TBVal] - - mov al,[GUIWRAdd] - mov [TRVal],al - mov al,[GUIWGAdd] - mov [TGVal],al - mov al,[GUIWBAdd] - mov [TBVal],al - mov byte[TRVali],2 - mov byte[TGVali],2 - mov byte[TBVali],2 - call DecPalVal - call DecPalVal - - GUIPal 177,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 176,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 175,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 174,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 173,[TRVal],[TGVal],[TBVal] - - mov al,[GUIWRAdd] - mov [TRVal],al - mov al,[GUIWGAdd] - mov [TGVal],al - mov al,[GUIWBAdd] - mov [TBVal],al - mov byte[TRVali],2 - mov byte[TGVali],2 - mov byte[TBVali],2 - call DecPalVal - call DecPalVal - call DecPalVal - call DecPalVal - - GUIPal 182,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 181,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 180,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 179,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal 178,[TRVal],[TGVal],[TBVal] - - GUIPal 183,20,20,00 - GUIPal 184,15,15,00 - GUIPal 185,25,00,00 - GUIPal 186,17,00,00 - GUIPal 187,00,00,00 - - ; gray scale2 = 189 .. 220 - mov dx,03C8h - mov al,189 - mov bl,0 - out dx,al - inc dx -.loopi - mov al,bl - add al,al - mov ah,bl - shr ah,1 - sub al,ah - out dx,al - out dx,al - add al,ah - out dx,al - inc bl - cmp bl,64 - jne .loopi - - GUIPal 221,00,55,00 - GUIPal 222,00,45,00 - GUIPal 223,00,25,00 - - GUIPal 224,40,0,20 - GUIPal 225,32,0,15 - - GUIPal 226,20,0,10 - GUIPal 227,16,0,07 - - GUIPal 228,45,45,50 - GUIPal 229,40,40,45 - GUIPal 230,35,35,40 - GUIPal 231,30,30,35 - - GUIPal 232,35,15,15 - - GUIPal 233,50,12,60 - GUIPal 234,30,14,60 - - cmp byte[GUIPalConv],0 - je .convert - ret -.convert - mov byte[GUIPalConv],1 - - ; Convert Image data to Gray Scale - ; Create Palette Table - call GUIconvpal - ; Convert Current Image in Buffer - mov esi,[vidbuffer] - mov ecx,288*240 - xor eax,eax -.next - mov al,[esi] - mov bl,[SubPalTable+eax] - mov [esi],bl - inc esi - dec ecx - jnz .next - ret - -SECTION .bss ;ALIGN=32 -NEWSYM GUICPC, resw 256 -SECTION .text - -%macro GUIPal16b 4 - mov ax,%2 - shr ax,1 - shl ax,11 - mov bx,%3 - shl bx,5 - or ax,bx - mov bx,%4 - shr bx,1 - or ax,bx - mov word[GUICPC+%1*2],ax -%endmacro - -DecPalVal: - mov ax,[TRVali] - sub word[TRVal],ax - mov ax,[TGVali] - sub word[TGVal],ax - mov ax,[TBVali] - sub word[TBVal],ax - test word[TRVal],8000h - jz .notnegr - mov word[TRVal],0 -.notnegr - test word[TGVal],8000h - jz .notnegg - mov word[TGVal],0 -.notnegg - test word[TBVal],8000h - jz .notnegb - mov word[TBVal],0 -.notnegb - ret - -GUISetPal16: - ; set palette - ; Fixed Color Scale = 0 .. 31 - mov word[GUICPC],0 - inc al - xor ebx,ebx - mov bl,1 -.loopd - xor ecx,ecx - mov cl,bl - add cl,[GUIRAdd] - shr cl,1 - shl ecx,11 - xor eax,eax - mov al,bl - add al,[GUIGAdd] - shl eax,5 - or ecx,eax - xor eax,eax - mov al,bl - add al,[GUIBAdd] - shr eax,1 - or ecx,eax - mov [GUICPC+ebx*2],cx - inc bl - cmp bl,32 - jne .loopd - - ; gray scale = 32 .. 63 - mov bl,32 - mov al,32 -.loopc - mov al,bl - add al,al - xor ecx,ecx - mov cl,al - shr ecx,1 - shl ecx,11 - xor edx,edx - mov dl,al - shl edx,5 - or ecx,edx - xor edx,edx - mov dl,al - shr edx,1 - or ecx,edx - mov [GUICPC+ebx*2],cx - inc bl - cmp bl,64 - jne .loopc - - ; shadow = 96 .. 127 - xor ebx,ebx -.loope - xor ecx,ecx - mov al,bl - add al,[GUIRAdd] - mov ah,al - add al,al - add al,ah - shr al,2 - shr al,1 - or cl,al - shl ecx,6 - mov al,bl - add al,[GUIGAdd] - mov ah,al - add al,al - add al,ah - shr al,2 - or cl,al - shl ecx,5 - mov al,bl - add al,[GUIBAdd] - mov ah,al - add al,al - add al,ah - shr al,2 - shr al,1 - or cl,al - mov [GUICPC+ebx*2+96*2],cx - inc bl - cmp bl,32 - jne .loope - - ; 0,10,31 - mov al,[GUITRAdd] - mov [TRVal],al - mov al,[GUITGAdd] - mov [TGVal],al - mov al,[GUITBAdd] - mov [TBVal],al - mov ax,[TRVal] - inc ax - shr ax,3 - mov [TRVali],ax - shl ax,3 - add [TRVal],ax - mov ax,[TGVal] - inc ax - shr ax,3 - mov [TGVali],ax - shl ax,3 - add [TGVal],ax - mov ax,[TBVal] - inc ax - shr ax,3 - mov [TBVali],ax - shl ax,3 - add [TBVal],ax - - GUIPal16b 64,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 65,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 66,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 67,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 68,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 69,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 70,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 71,[TRVal],[TGVal],[TBVal] - - GUIPal16b 72,40,0,20 - GUIPal16b 73,34,0,21 - - GUIPal16b 80,0,10,28 - GUIPal16b 81,0,10,27 - GUIPal16b 82,0,10,25 - GUIPal16b 83,0,09,24 - GUIPal16b 84,0,08,22 - GUIPal16b 85,0,07,20 - GUIPal16b 86,0,06,18 - GUIPal16b 87,0,05,15 - GUIPal16b 88,20,0,10 - GUIPal16b 89,17,0,10 - - ; Orange Scale - mov cl,20 - mov bh,0 - mov ah,0 - inc dx - mov esi,128 -.loopf - add bh,2 - add ah,1 - mov edx,1Fh << 6 - or dl,bh - shl edx,5 - mov al,ah - shr al,1 - or dl,al - mov [GUICPC+esi*2],dx - inc esi - dec cl - jnz .loopf - - ; Blue scale = 148 .. 167 - mov al,[GUIWRAdd] - add al,al - mov [TRVal],al - mov al,[GUIWGAdd] - add al,al - mov [TGVal],al - mov al,[GUIWBAdd] - add al,al - mov [TBVal],al - mov byte[TRVali],4 - mov byte[TGVali],4 - mov byte[TBVali],4 - - GUIPal16b 152,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 151,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 150,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 149,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 148,[TRVal],[TGVal],[TBVal] - - mov al,[GUIWRAdd] - add al,al - mov [TRVal],al - mov al,[GUIWGAdd] - add al,al - mov [TGVal],al - mov al,[GUIWBAdd] - add al,al - mov [TBVal],al - mov byte[TRVali],4 - mov byte[TGVali],4 - mov byte[TBVali],4 - mov al,[TRVal] - shr al,2 - sub [TRVal],al - mov al,[TGVal] - shr al,2 - sub [TGVal],al - mov al,[TBVal] - shr al,2 - sub [TBVal],al - - GUIPal16b 157,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 156,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 155,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 154,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 153,[TRVal],[TGVal],[TBVal] - - mov al,[GUIWRAdd] - add al,al - mov [TRVal],al - mov al,[GUIWGAdd] - add al,al - mov [TGVal],al - mov al,[GUIWBAdd] - add al,al - mov [TBVal],al - mov byte[TRVali],4 - mov byte[TGVali],4 - mov byte[TBVali],4 - mov al,[TRVal] - shr al,1 - sub [TRVal],al - mov al,[TGVal] - shr al,1 - sub [TGVal],al - mov al,[TBVal] - shr al,1 - sub [TBVal],al - - GUIPal16b 162,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 161,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 160,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 159,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 158,[TRVal],[TGVal],[TBVal] - - GUIPal16b 163,40,40,00 - GUIPal16b 164,30,30,00 - GUIPal16b 165,50,00,00 - GUIPal16b 166,35,00,00 - GUIPal16b 167,00,00,00 - - ; Blue scale shadow - mov al,[GUIWRAdd] - mov [TRVal],al - mov al,[GUIWGAdd] - mov [TGVal],al - mov al,[GUIWBAdd] - mov [TBVal],al - mov byte[TRVali],2 - mov byte[TGVali],2 - mov byte[TBVali],2 - - GUIPal16b 172,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 171,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 170,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 169,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 168,[TRVal],[TGVal],[TBVal] - - mov al,[GUIWRAdd] - mov [TRVal],al - mov al,[GUIWGAdd] - mov [TGVal],al - mov al,[GUIWBAdd] - mov [TBVal],al - mov byte[TRVali],2 - mov byte[TGVali],2 - mov byte[TBVali],2 - call DecPalVal - call DecPalVal - - GUIPal16b 177,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 176,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 175,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 174,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 173,[TRVal],[TGVal],[TBVal] - - mov al,[GUIWRAdd] - mov [TRVal],al - mov al,[GUIWGAdd] - mov [TGVal],al - mov al,[GUIWBAdd] - mov [TBVal],al - mov byte[TRVali],2 - mov byte[TGVali],2 - mov byte[TBVali],2 - call DecPalVal - call DecPalVal - call DecPalVal - call DecPalVal - - GUIPal16b 182,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 181,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 180,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 179,[TRVal],[TGVal],[TBVal] - call DecPalVal - GUIPal16b 178,[TRVal],[TGVal],[TBVal] - - GUIPal16b 183,20,20,00 - GUIPal16b 184,15,15,00 - GUIPal16b 185,25,00,00 - GUIPal16b 186,17,00,00 - GUIPal16b 187,00,00,00 - - ; gray scale2 = 189 .. 220 - mov bl,0 - mov esi,189 -.loopi - xor edx,edx - mov al,bl - add al,al - mov ah,bl - shr ah,1 - sub al,ah - mov dl,al - shr dl,1 - shl edx,6 - or dl,al - shl edx,5 - add al,ah - shr al,1 - or dl,al - mov [GUICPC+esi*2],dx - inc esi - inc bl - cmp bl,64 - jne .loopi - - GUIPal16b 221,00,55,00 - GUIPal16b 222,00,45,00 - GUIPal16b 223,00,25,00 - - GUIPal16b 224,40,0,20 - GUIPal16b 225,32,0,15 - - GUIPal16b 226,20,0,10 - GUIPal16b 227,16,0,07 - - GUIPal16b 228,45,45,50 - GUIPal16b 229,40,40,45 - GUIPal16b 230,35,35,40 - GUIPal16b 231,30,30,35 - - GUIPal16b 232,35,15,15 - - GUIPal16b 233,50,12,60 - GUIPal16b 234,30,14,60 - GUIPal16b 235,12,60,25 - GUIPal16b 236,14,42,25 - GUIPal16b 237,60,20,25 - GUIPal16b 238,42,20,25 - - cmp byte[vesa2red10],1 - jne .nored10 - jmp .nored10 - mov esi,GUICPC - mov ecx,256 -.next2 - mov ax,[esi] - mov bx,ax - and bx,0000000000011111b - and ax,1111111111000000b - shr ax,1 - or ax,bx - mov [esi],ax - add esi,2 - dec ecx - jnz .next2 -.nored10 - cmp byte[GUIPalConv],0 - je .convert - ret -.convert - mov byte[GUIPalConv],1 - mov esi,[vidbuffer] - mov edi,288*240 - xor ebx,ebx -.next - mov ax,[esi+ebx*2] - mov ecx,eax - shr ecx,11 - and ecx,1Fh - mov edx,eax - shr edx,6 - and edx,1Fh - add ecx,edx - mov edx,eax - and edx,1Fh - add ecx,edx - shr ecx,1 - mov al,[.multab+ecx] - mov [esi+ebx],al - inc ebx - dec edi - jnz .next - ret - -SECTION .data -.multab db 1,1,1,2,2,3,4,4,5,6,6,7,8,8,9,10,10,11,12,12,13,14,14,15,16,16, - db 17,18,18,19,20,20,21,22,22,23,24,24,25,26,26,27,28,28,29,30,30, - db 31 -SECTION .text - -GUIBufferData: - mov ecx,16384 - cmp byte[cbitmode],1 - jne near .16b - add ecx,16384 - cmp word[PrevResoln],224 - je .nobufb - add esi,288*8 -.nobufb -.16b - ; copy to spritetable - mov esi,[vidbuffer] - cmp word[PrevResoln],224 - je .nobufa - add esi,288*8 -.nobufa - mov edi,[spritetablea] - add edi,8*288 -.loop - mov eax,[esi] - mov [edi],eax - add esi,4 - add edi,4 - dec ecx - jnz .loop - mov edi,sprlefttot - mov ecx,64*5 -.a - mov dword[edi],0 - add edi,4 - dec ecx - jnz .a - ret - -GUIUnBuffer: - mov ecx,16384 - ; copy from spritetable - mov edi,[vidbuffer] - mov esi,[spritetablea] - add esi,8*288 - rep movsd - mov eax,01010101h - mov ecx,2*288 - rep stosd - ret - -GUIconvpal: - mov ax,[cgram] - mov [tempco0],ax - test byte[scaddtype],00100000b - jz near .noaddition - test byte[scaddtype],10000000b - jnz near .noaddition - mov cx,[cgram] - mov ax,cx - and ax,001Fh - add al,[coladdr] - cmp al,01Fh - jb .noadd - mov al,01Fh -.noadd - mov bx,ax - mov ax,cx - shr ax,5 - and ax,001Fh - add al,[coladdg] - cmp al,01Fh - jb .noaddb - mov al,01Fh -.noaddb - shl ax,5 - add bx,ax - mov ax,cx - shr ax,10 - and ax,001Fh - add al,[coladdb] - cmp al,01Fh - jb .noaddc - mov al,01Fh -.noaddc - shl ax,10 - add bx,ax - mov [cgram],bx -.noaddition - mov edi,cgram - mov ebx,prevpal - xor ah,ah -.loopa - mov cx,[edi] - push eax - push ebx - mov [ebx],cx - mov al,ah - mov ax,cx - and al,01Fh - mov bh,[maxbr] - mov bl,bh - mul bl - mov bl,15 - div bl - mov [curgsval],al - mov ax,cx - shr ax,5 - and al,01Fh - mov bl,bh - mul bl - mov bl,15 - div bl - add [curgsval],al - mov ax,cx - shr ax,10 - and al,01Fh - mov bl,bh - mul bl - mov bl,15 - div bl - add [curgsval],al - pop ebx - pop eax - add edi,2 - add ebx,2 - push eax - push ebx - mov al,ah - and eax,0FFh - mov bl,[curgsval] - push eax - push ebx - mov al,bl - mov bl,3 - xor ah,ah - div bl - pop ebx - mov bl,al - pop eax - cmp byte[MessageOn],0 - je .nochange128 - cmp al,128 - jne .nochange128 - mov bl,31 -.nochange128 - or bl,bl - jnz .noadder - inc bl -.noadder - mov [SubPalTable+eax],bl - pop ebx - pop eax - inc ah - jnz near .loopa - mov al,[maxbr] - mov [prevbright],al - mov ax,[tempco0] - mov [cgram],ax - ret - -SECTION .data -GUIMousePtr db 50+88,47+88,45+88,43+88,42+88,00,00,00 - db 53+88,52+88,46+88,42+88,00,00,00,00 - db 55+88,54+88,54+88,44+88,00,00,00,00 - db 57+88,57+88,56+88,52+88,45+88,00,00,00 - db 59+88,00,00,55+88,50+88,45+88,00,00 - db 00,00,00,00,55+88,50+88,45+88,00 - db 00,00,00,00,00,55+88,50+88,47+88 - db 00,00,00,00,00,00,52+88,00 - - db 50,47,45,43,40,00,00,00 - db 53,52,46,42,00,00,00,00 - db 55,54,54,44,00,00,00,00 - db 57,57,56,52,45,00,00,00 - db 59,00,00,55,50,45,00,00 - db 00,00,00,00,55,50,45,00 - db 00,00,00,00,00,55,50,47 - db 00,00,00,00,00,00,52,00 - -NEWSYM GUIFontData - db 0,0,0,0,0 - db 01110000b - db 10011000b - db 10101000b - db 11001000b - db 01110000b; 0 - db 00100000b - db 01100000b - db 00100000b - db 00100000b - db 01110000b; 1 - db 01110000b - db 10001000b - db 00110000b - db 01000000b - db 11111000b; 2 - db 01110000b - db 10001000b - db 00110000b - db 10001000b - db 01110000b; 3 - db 01010000b - db 10010000b - db 11111000b - db 00010000b - db 00010000b; 4 - db 11111000b - db 10000000b - db 11110000b - db 00001000b - db 11110000b; 5 - db 01110000b - db 10000000b - db 11110000b - db 10001000b - db 01110000b; 6 - db 11111000b - db 00001000b - db 00010000b - db 00010000b - db 00010000b; 7 - db 01110000b - db 10001000b - db 01110000b - db 10001000b - db 01110000b; 8 - db 01110000b - db 10001000b - db 01111000b - db 00001000b - db 01110000b; 9 - db 01110000b - db 10001000b - db 11111000b - db 10001000b - db 10001000b; A - db 11110000b - db 10001000b - db 11110000b - db 10001000b - db 11110000b; B - db 01110000b - db 10001000b - db 10000000b - db 10001000b - db 01110000b; C - db 11110000b - db 10001000b - db 10001000b - db 10001000b - db 11110000b; D - db 11111000b - db 10000000b - db 11110000b - db 10000000b - db 11111000b; E - db 11111000b - db 10000000b - db 11110000b - db 10000000b - db 10000000b; F - db 01111000b - db 10000000b - db 10011000b - db 10001000b - db 01110000b; G - db 10001000b - db 10001000b - db 11111000b - db 10001000b - db 10001000b; H - db 11111000b - db 00100000b - db 00100000b - db 00100000b - db 11111000b; I - db 01111000b - db 00010000b - db 00010000b - db 10010000b - db 01100000b; J - db 10010000b - db 10100000b - db 11100000b - db 10010000b - db 10001000b; K - db 10000000b - db 10000000b - db 10000000b - db 10000000b - db 11111000b; L - db 11011000b - db 10101000b - db 10101000b - db 10101000b - db 10001000b; M - db 11001000b - db 10101000b - db 10101000b - db 10101000b - db 10011000b; N - db 01110000b - db 10001000b - db 10001000b - db 10001000b - db 01110000b; O - db 11110000b - db 10001000b - db 11110000b - db 10000000b - db 10000000b; P - db 01110000b - db 10001000b - db 10101000b - db 10010000b - db 01101000b; Q - db 11110000b - db 10001000b - db 11110000b - db 10010000b - db 10001000b; R - db 01111000b - db 10000000b - db 01110000b - db 00001000b - db 11110000b; S - db 11111000b - db 00100000b - db 00100000b - db 00100000b - db 00100000b; T - db 10001000b - db 10001000b - db 10001000b - db 10001000b - db 01110000b; U - db 10001000b - db 10001000b - db 01010000b - db 01010000b - db 00100000b; V - db 10001000b - db 10101000b - db 10101000b - db 10101000b - db 01010000b; W - db 10001000b - db 01010000b - db 00100000b - db 01010000b - db 10001000b; X - db 10001000b - db 01010000b - db 00100000b - db 00100000b - db 00100000b; Y - db 11111000b - db 00010000b - db 00100000b - db 01000000b - db 11111000b; Z - db 00000000b - db 00000000b - db 11111000b - db 00000000b - db 00000000b; - - db 00000000b - db 00000000b - db 00000000b - db 00000000b - db 11111000b; _ - db 01101000b - db 10010000b - db 00000000b - db 00000000b - db 00000000b; ~ - db 00000000b - db 00000000b - db 00000000b - db 00000000b - db 00100000b; . - db 00001000b - db 00010000b - db 00100000b - db 01000000b - db 10000000b; / - db 00010000b - db 00100000b - db 01000000b - db 00100000b - db 00010000b; < - db 01000000b - db 00100000b - db 00010000b - db 00100000b - db 01000000b; > - db 01110000b - db 01000000b - db 01000000b - db 01000000b - db 01110000b; [ - db 01110000b - db 00010000b - db 00010000b - db 00010000b - db 01110000b; ] - db 00000000b - db 00100000b - db 00000000b - db 00100000b - db 00000000b; : - db 01100000b - db 10011000b - db 01110000b - db 10011000b - db 01101000b; & - db 00100000b - db 00100000b - db 10101000b - db 01110000b - db 00100000b; arrow - db 01010000b - db 11111000b - db 01010000b - db 11111000b - db 01010000b; # - db 00000000b - db 11111000b - db 00000000b - db 11111000b - db 00000000b; = - db 01001000b - db 10010000b - db 00000000b - db 00000000b - db 00000000b; " - db 10000000b - db 01000000b - db 00100000b - db 00010000b - db 00001000b; \ (Screw you nassm) - db 10101000b - db 01110000b - db 11111000b - db 01110000b - db 10101000b; * - db 01110000b - db 10001000b - db 00110000b - db 00000000b - db 00100000b; ? - db 10001000b - db 00010000b - db 00100000b - db 01000000b - db 10001000b; % - db 00100000b - db 00100000b - db 11111000b - db 00100000b - db 00100000b; + - db 00000000b - db 00000000b - db 00000000b - db 00100000b - db 01000000b; , - db 00110000b - db 01000000b - db 01000000b - db 01000000b - db 00110000b; ( - db 01100000b - db 00010000b - db 00010000b - db 00010000b - db 01100000b; ) - db 01110000b - db 10011000b - db 10111000b - db 10000000b - db 01110000b; @ - db 00100000b - db 01000000b - db 00000000b - db 00000000b - db 00000000b; ' - db 00100000b - db 00100000b - db 00100000b - db 00000000b - db 00100000b; ! - db 01111000b - db 10100000b - db 01110000b - db 00101000b - db 11110000b; $ - db 00000000b - db 00100000b - db 00000000b - db 00100000b - db 01000000b; ; - db 01000000b - db 00100000b - db 00000000b - db 00000000b - db 00000000b; ` - db 00100000b - db 01010000b - db 00000000b - db 00000000b - db 00000000b; ^ - db 00110000b - db 01000000b - db 11000000b - db 01000000b - db 00110000b; { - db 01100000b - db 00010000b - db 00011000b - db 00010000b - db 01100000b; } - db 00100000b - db 00100000b - db 01110000b - db 01110000b - db 11111000b; Up - db 11111000b - db 01110000b - db 01110000b - db 00100000b - db 00100000b; Down - db 00001000b - db 00111000b - db 11111000b - db 00111000b - db 00001000b; Left - db 10000000b - db 11100000b - db 11111000b - db 11100000b - db 10000000b; Right - db 00100000b - db 01100000b - db 11111000b - db 01100000b - db 00100000b; Arrow Left - db 00111000b - db 00100000b - db 00110000b - db 00001000b - db 10110000b; .5 - db 11111100b - db 10000100b - db 11111100b - db 00000000b - db 00000000b; Maximize - db 00000000b - db 11111100b - db 00000000b - db 00000000b - db 00000000b; Minimize - db 11111000b - db 10001000b - db 10001000b - db 10001000b - db 11111000b; Maximize (Linux) - -; 189 .. 220 -GUIIconDataClose: - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,216,216,216,216,216,216,216,0 ,0 - db 214,212,202,212,212,212,202,212,210,0 - db 214,212,212,200,212,200,212,212,210,202 - db 214,212,212,212,198,212,212,212,210,202 - db 214,212,212,196,212,196,212,212,210,200 - db 214,212,194,212,212,212,194,212,210,200 - db 0 ,208,208,208,208,208,208,208,198,198 - db 0 ,0 ,198,198,198,198,198,198,198,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - -GUIIconDataButtonHole: - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,207,205,207,0 ,0 ,0 ,0 - db 0 ,0 ,207,203,202,203,207,0 ,0 ,0 - db 0 ,207,203,200,198,200,203,207,0 ,0 - db 0 ,207,202,198,197,198,202,207,0 ,0 - db 0 ,207,203,200,198,200,203,207,0 ,0 - db 0 ,0 ,207,203,202,203,207,0 ,0 ,0 - db 0 ,0 ,0 ,207,205,207,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - -GUIIconDataButtonFill: - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,207,209,207,0 ,0 ,0 ,0 - db 0 ,0 ,207,211,212,211,207,0 ,0 ,0 - db 0 ,207,211,214,216,214,211,207,0 ,0 - db 0 ,207,212,216,217,216,212,207,0 ,0 - db 0 ,207,211,214,216,214,211,207,0 ,0 - db 0 ,0 ,207,211,212,211,207,0 ,0 ,0 - db 0 ,0 ,0 ,207,209,207,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - -GUIIconDataSlideBar: - db 0 ,0 ,0 ,0 ,216,0 ,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,212,216,220,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,212,216,220,202,0 ,0 ,0 - db 0 ,0 ,212,212,216,218,220,0 ,0 ,0 - db 0 ,0 ,212,214,216,218,220,202,0 ,0 - db 0 ,0 ,212,214,216,218,220,202,0 ,0 - db 0 ,0 ,0 ,212,216,220,202,202,0 ,0 - db 0 ,0 ,0 ,212,216,220,202,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,216,202,202,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,202,0 ,0 ,0 ,0 - -GUIIconDataCheckBoxUC: - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,220,219,218,217,216,215,0 ,0 ,0 - db 0 ,219,218,217,216,215,214,202,0 ,0 - db 0 ,218,217,216,215,214,213,202,0 ,0 - db 0 ,217,216,215,214,213,212,202,0 ,0 - db 0 ,216,215,214,213,212,211,202,0 ,0 - db 0 ,215,214,213,212,211,210,202,0 ,0 - db 0 ,0 ,202,202,202,202,202,202,0 ,0 - -GUIIconDataCheckBoxC: - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,165,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,165,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,165,0 ,0 ,0 - db 0 ,220,219,218,217,165,215,0 ,0 ,0 - db 0 ,165,165,217,165,165,214,202,0 ,0 - db 0 ,218,165,216,165,214,213,202,0 ,0 - db 0 ,217,165,165,165,213,212,202,0 ,0 - db 0 ,216,215,165,213,212,211,202,0 ,0 - db 0 ,215,214,165,212,211,210,202,0 ,0 - db 0 ,0 ,202,202,202,202,202,202,0 ,0 - -GUIIconDataCheckBoxX: - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,165,0 ,0 ,0 ,0 ,0 ,165,0 ,0 - db 0 ,220,165,218,217,216,165,0 ,0 ,0 - db 0 ,219,218,165,216,165,214,202,0 ,0 - db 0 ,218,217,216,165,214,213,202,0 ,0 - db 0 ,217,216,165,214,165,212,202,0 ,0 - db 0 ,216,165,214,213,212,165,202,0 ,0 - db 0 ,165,214,213,212,211,210,165,0 ,0 - db 0 ,0 ,202,202,202,202,202,202,0 ,0 - -GUIIconDataUpArrow: - db 201,209,209,209,209,209,209,200,0 ,0 - db 207,205,205,202,203,205,205,203,0 ,0 - db 207,205,201,202,203,202,205,203,0 ,0 - db 207,200,205,202,203,205,201,203,0 ,0 - db 207,205,205,202,203,205,205,203,0 ,0 - db 207,205,205,202,203,205,205,203,0 ,0 - db 207,205,205,202,203,205,205,203,0 ,0 - db 199,201,201,201,201,201,201,198,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - -GUIIconDataDownArrow: - db 201,209,209,209,209,209,209,200,0 ,0 - db 207,205,205,202,203,205,205,203,0 ,0 - db 207,205,205,202,203,205,205,203,0 ,0 - db 207,205,205,202,203,205,205,203,0 ,0 - db 207,200,205,202,203,205,201,203,0 ,0 - db 207,205,201,202,203,202,205,203,0 ,0 - db 207,205,205,202,203,205,205,203,0 ,0 - db 199,201,201,201,201,201,201,198,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - -NEWSYM SnowData -dw 161,251,115,211,249,87,128,101,232,176,51,180,108,193,224,112,254,159,102,238 -dw 223,123,218,42,173,160,143,170,64,1,174,29,34,187,194,199,40,89,232,32 -dw 7,195,141,67,216,48,234,1,243,116,164,182,146,136,66,70,36,43,98,208 -dw 63,240,216,253,147,36,33,253,98,80,228,156,73,82,85,1,97,72,187,239 -dw 18,196,127,182,22,22,101,25,124,145,240,213,186,22,7,161,30,98,90,197 -dw 22,205,32,150,59,133,49,140,10,128,142,185,176,142,220,195,100,102,105,194 -dw 43,139,184,153,1,95,176,169,192,201,233,243,73,65,188,14,194,39,251,140 -dw 239,181,142,160,242,248,82,49,9,157,233,162,254,121,112,6,118,24,56,121 -dw 74,209,1,223,145,6,75,73,18,168,194,168,58,39,222,170,214,75,45,218 -dw 39,197,242,98,22,90,255,5,144,244,252,55,98,18,135,101,27,85,215,207 -dw 183,28,201,142,45,122,145,159,41,243,109,29,117,203,7,234,231,214,131,133 -dw 217,8,74,207,130,77,21,229,167,78,218,109,142,58,134,238,29,182,178,14 -dw 144,129,196,219,60,128,30,105,57,53,76,122,242,208,101,241,246,99,248,67 -dw 137,244,70,51,202,94,164,125,115,72,61,72,129,169,155,122,91,154,160,83 -dw 41,102,223,218,140,40,132,16,223,92,50,230,168,47,126,117,242,136,1,245 -dw 171,0,36,98,73,69,14,229,66,177,108,92,39,250,243,161,111,85,211,99 -dw 52,98,121,188,128,201,90,205,223,92,177,19,87,18,75,54,6,81,235,137 -dw 247,66,211,129,247,39,119,206,116,250,113,231,190,196,53,51,34,114,39,22 -dw 192,33,249,151,26,22,139,97,171,238,182,88,22,176,157,255,178,199,138,98 -dw 140,36,112,90,25,245,134,64,48,190,165,113,24,195,84,70,175,9,179,69 -dw 13,26,167,237,163,159,185,128,109,114,86,74,188,103,141,48,188,203,205,191 -dw 215,193,224,4,153,36,108,3,172,235,56,251,211,115,173,216,240,33,78,150 -dw 133,64,51,103,56,26,165,222,70,148,115,119,246,229,181,63,109,49,228,108 -dw 126,10,170,48,87,42,193,24,28,255,176,176,209,181,97,93,61,241,201,137 -dw 129,97,24,159,168,215,61,113,104,143,168,7,196,216,149,239,110,65,75,143 -dw 238,0,37,19,8,56,65,234,228,72,42,5,226,95,243,51,55,231,114,90 -dw 160,141,171,108,218,252,154,64,175,142,214,211,180,129,217,118,33,130,213,2 -dw 73,145,93,21,162,141,97,225,112,253,49,43,113,208,131,104,31,51,192,37 -dw 117,186,16,45,61,114,220,6,89,163,197,203,142,80,89,115,190,190,228,15 -dw 166,145,59,139,120,79,104,252,246,73,113,144,224,65,204,155,221,85,31,99 -dw 48,253,94,159,215,31,123,204,248,153,31,210,174,178,54,146,152,88,56,92 -dw 197,35,124,104,211,118,1,207,108,68,123,161,107,69,143,13,79,170,130,193 -dw 214,153,219,247,227,2,170,208,248,139,118,241,247,183,18,135,246,126,201,46 -dw 70,234,171,72,18,135,236,216,32,178,148,231,161,15,6,254,34,181,5,71 -dw 2,219,71,87,252,16,202,190,180,83,99,209,75,134,78,84,114,32,171,246 -dw 125,11,57,200,102,29,176,26,205,151,152,108,100,146,117,95,71,77,158,207 -dw 60,192,50,135,223,237,231,53,27,195,170,146,155,160,92,224,247,187,14,50 -dw 203,5,153,42,17,75,109,14,78,160,236,114,131,105,189,209,233,135,221,207 -dw 226,119,104,10,178,107,77,160,233,179,120,227,133,241,32,223,63,247,66,157 -dw 140,81,118,81,63,193,173,228,214,78,124,123,222,149,9,242,0,128,194,110 - -NEWSYM SnowVelDist -db 57,92,100,19,100,184,238,225,55,240,255,221,215,105,226,153,164,41,22,93 -db 176,203,155,199,244,52,233,219,110,227,229,227,152,240,83,248,226,31,163,22 -db 28,156,18,10,248,67,123,167,25,138,90,10,79,107,208,229,248,233,185,10 -db 167,21,19,178,132,154,81,70,20,71,95,147,72,27,91,189,13,189,102,84 -db 195,123,251,93,68,36,178,59,107,99,104,191,76,110,44,206,123,46,98,112 -db 26,50,1,35,150,17,242,208,69,23,202,197,59,80,136,124,40,89,11,40 -db 1,136,90,72,198,83,2,174,174,4,28,205,135,35,194,54,22,40,4,132 -db 191,88,163,66,204,230,35,111,9,177,254,174,163,68,5,88,111,235,58,236 -db 4,248,172,154,101,164,43,223,10,13,210,125,146,73,192,57,117,152,128,36 -db 106,21,253,113,110,133,244,4,150,32,76,71,22,106,210,244,46,128,27,215 -db 231,112,177,196,198,120,196,57,234,74,235,108,64,181,209,188,177,63,197,200 -db 126,164,136,163,48,62,225,223,212,201,195,121,90,7,10,196,88,53,39,249 -db 147,98,65,253,246,3,152,125,242,105,44,129,94,232,13,4,86,220,194,67 -db 186,210,171,197,64,138,89,78,58,150,52,79,138,201,244,111,106,181,192,69 -db 234,253,239,113,98,37,209,151,60,47,241,235,185,52,173,94,172,182,47,150 -db 80,118,10,58,161,237,10,64,238,198,14,74,132,250,234,63,169,86,158,170 -db 76,168,124,133,28,203,246,140,228,77,50,53,115,113,157,218,90,192,28,209 -db 72,117,156,101,226,99,11,245,69,59,17,175,164,59,8,166,163,185,10,60 -db 100,19,26,38,114,232,180,115,238,184,88,103,178,67,212,21,87,64,85,1 -db 62,87,155,62,21,96,205,195,131,97,191,252,218,209,179,201,12,2,234,110 -db 162,14,145,170,156,105,85,132,132,60,239,14,80,129,225,144,149,244,188,8 -db 13,168,181,168,30,142,24,110,26,172,231,182,50,214,66,193,100,45,132,144 -db 205,190,16,133,45,250,83,183,140,229,117,226,68,59,163,96,235,227,25,155 -db 209,105,41,214,30,107,2,85,180,23,241,39,113,63,75,44,107,142,93,29 -db 62,240,235,152,147,52,54,146,109,112,139,162,238,198,201,8,141,115,112,106 -db 4,99,25,155,111,161,114,253,75,100,28,59,101,150,2,122,228,6,12,59 -db 249,181,67,136,227,227,199,46,75,203,50,25,50,61,62,22,238,124,218,134 -db 243,21,243,222,94,138,161,234,133,23,138,45,4,226,154,227,8,84,105,126 -db 200,127,240,144,124,197,102,144,53,29,94,231,108,175,136,37,44,183,178,95 -db 41,196,214,12,42,221,106,225,151,32,53,130,24,211,88,14,135,18,90,219 -db 177,129,90,217,162,181,199,133,116,56,36,100,230,91,220,83,41,65,20,64 -db 177,197,249,24,242,62,26,234,92,44,167,153,243,94,179,163,103,29,220,199 -db 128,94,236,152,53,32,77,78,228,89,124,85,87,50,197,116,179,105,236,139 -db 102,17,159,66,176,27,205,36,113,80,60,6,61,174,254,174,246,72,154,31 -db 97,40,10,8,114,203,238,26,89,51,134,110,118,176,87,32,192,210,146,207 -db 88,45,156,179,61,224,87,107,107,1,252,187,203,100,169,211,205,105,12,231 -db 137,176,166,37,192,241,169,84,32,85,112,168,154,7,247,146,183,225,246,173 -db 57,103,110,236,113,118,203,200,22,87,251,7,138,37,12,84,221,171,51,209 -db 242,37,89,73,151,162,139,189,131,209,221,96,107,144,175,79,199,123,98,138 -db 226,86,221,254,72,14,126,180,200,171,85,94,120,124,196,225,150,57,219,158 - -SECTION .text - -NEWSYM GuiAsmEnd +;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. + + +; Sorry. The GUI code is a total mess. One problem I encountered is that +; there seems to be a bug in nasm with using math calculations combined +; with macros within macros, so in some macro definitions, I had to +; add/subtract extra values in certain macros to get the GUI to align +; correctly. +; The GUI is drawn is mostly manually. What I mean is such as +; coding 5 boxes to represent a shaded box for each box. Although that +; can be simplified using macros to draw 5 boxes, that unknown bug in nasm +; showed up which prevented me from using macros extensively. I was +; thinking of changing it to an object-based GUI for easier coding, +; but that was decided far into the development of the GUI itself +; and that I also never expected this code to become open-source, so I +; decided not to proceed with it. + +; Routine StartGUI is the function called to start the GUI and also +; contains the execution main loop of the GUI. If you want to completely +; replace the GUI, just add a function call from that function, then +; jump to endprog to exit ZSNES or continueprog to continue with the +; gameplay. Do not replace StartGUI with a function since it is not +; a function, but rather a label that is being jumped to. + +; ************************************** +; GUI.ASM +; ************************************** +; +; Associated files : +; GUIWinDp.inc - Window Display Routines +; GUITools.inc - Misc routines for the GUI + + +; Quick Searches : +; DisplayMenu - routines to display top menu bar +; Incomp - Search for start of modem processing +; ProcessModem +; GUIgetcurrentinput +; GUITryMenuItem - Processes the menu item when user clicks item +; Mouseimplementation +; DGUIDisplayer +; LGUILoadData +; SetInputDevice +; CalibrateDev1 +; ButtonProcess - routines that processes boxed buttons +; CheatCodeSearchInit +; guiwincontrol + + +%include "macros.mac" + +EXTSYM curblank, vidpastecopyscr, frameskip, newengen, vsyncon +EXTSYM cvidmode, antienab, smallscreenon, smallscreence,NetQuit +EXTSYM soundon, StereoSound, SoundCompD, SoundQuality, MusicRelVol +EXTSYM endprog, continueprog, spcBuffera, spcRamcmp, cbitmode, makepal +EXTSYM t1cc, LoadDir, SRAMDir, LoadDrive,SRAMDrive, initsnes, romloadskip +EXTSYM fname, makeextension, sram, clearmem2, loadfileGUI, GUIloadfailed +EXTSYM SetupROM, CheckROMType, romdata, ForcePal, ramsize, ramsizeand, curromsize +EXTSYM romispal, totlines, cfgloadsdir, init65816, procexecloop +EXTSYM spcRam, spcPCRam, spcS, spcRamDP, spcA, spcX, spcY, spcP, spcNZ +EXTSYM Voice0Status, Voice1Status, Voice2Status, Voice3Status, Voice4Status +EXTSYM Voice5Status, Voice6Status, Voice7Status, romtype, SetIRQVectors +EXTSYM ClearScreen, statesaver, loadstate2, vidbuffer, ASCII2Font, hirestiledat +EXTSYM showallext, ROMTypeNOTFound, scanlines,statefileloc,pl1selk,pl2selk +EXTSYM fnamest,sprlefttot,spritetablea,fnames,SFXSRAM,sfxramdata,cgram,srama +EXTSYM tempco0,prevbright,maxbr,prevpal,coladdr,coladdg,coladdb +EXTSYM scaddtype,ScreenScale,vesa2red10,initvideo2,initvideo,pressed,UpdateDevices +EXTSYM memtabler8,memtablew8,writeon,pl1contrl,pl2contrl,JoyRead,SetInputDevice +EXTSYM SetInputDevice209,FPSOn,RevStereo,WDSPReg0C,WDSPReg1C,WDSPReg2C +EXTSYM WDSPReg3C,pl12s34,resolutn,delay,chaton,chatstrL,chatLpos,chatstrR,chatRTL +EXTSYM InitDrive,InitDir,createnewcfg,Makemode7Table,SnowOn,MovieBuffSize +EXTSYM MovieBuffFrame,vidbufferofsb,ZipSupport,wramdata,bgfixer,cfgnewgfx +EXTSYM cfgdontsave,videotroub,Open_File,Read_File,Close_File,Write_File,Create_File +EXTSYM File_Seek,File_Seek_End,Open_File_Write,Get_Date,Check_Key,Get_Key +EXTSYM Change_Drive,Change_Single_Dir,Change_Dir,Get_Dir,Get_First_Entry +EXTSYM Get_Next_Entry,Set_DTA_Address,timer2upd,curexecstate,TripBufAvail +EXTSYM nmiprevaddrl,nmiprevaddrh,nmirept,nmiprevline,nmistatus,spcnumread,spchalted +EXTSYM NextLineCache,VidStartDraw,ResetTripleBuf,GUINGVID +EXTSYM ScanCodeListing,AdjustFrequency,GUISaveVars,Init_Mouse +EXTSYM Get_MouseData,Set_MouseXMax,Set_MouseYMax,Set_MousePosition,Get_MousePositionDisplacement +EXTSYM GUIInit,GUIDeInit,SpecialLine +EXTSYM DrawWater,DrawBurn,RemoteDisconnect,loadstate3 +EXTSYM SA1Enable,SA1RAMArea +EXTSYM GUIFName,GUICName +EXTSYM printnum +EXTSYM MMXCheck +EXTSYM SaveCombFile +EXTSYM NetSent,valuea +EXTSYM welcome +EXTSYM showinfogui +EXTSYM BackupCVFrame +EXTSYM Wait1SecWin,ClearUDPStuff +EXTSYM DisableSUDPPacket,EnableSUDPPacket +EXTSYM BackStateSize +EXTSYM ResetExecStuff +EXTSYM RestoreCVFrame +EXTSYM CurRecv,BackState,CBackupPos,PBackupPos,PPValue,DPValue,NetQuitter +EXTSYM LatencyV +EXTSYM LatencyRecvPtr,LatencySendPtr +EXTSYM NumofBanks +EXTSYM WinErrorA,WinErrorB,WinErrorC +EXTSYM ErrorPointer +EXTSYM MessageOn,Msgptr,MsgCount +EXTSYM PJoyAOrig,PJoyBOrig,PJoyCOrig,PJoyDOrig,PJoyEOrig +EXTSYM GetHostName +EXTSYM vramaddr,curypos,ClearRegs,vram,sndrot,regsbackup +EXTSYM GetScreen,GUITBWVID +EXTSYM Clear2xSaIBuffer +EXTSYM MouseWindow +EXTSYM GotoHomepage +EXTSYM cfgcvidmode, ExitFromGUI +EXTSYM GUIWFVID +EXTSYM cfgvsync,newgfx16b +EXTSYM cfgscanline,cfginterp +EXTSYM NumVideoModes +EXTSYM cfgvolume, MusicVol, DSPMem +EXTSYM NumInputDevices,GUIInputNames +EXTSYM GUIVideoModeNames +EXTSYM GUISLVID,GUIINVID,GUIEAVID,GUIIEVID,GUIFSVID,GUIWSVID +EXTSYM GUISSVID,GUITBVID,GUIHSVID,GUI2xVID,GUII2VID,GUIM7VID +EXTSYM cfgsoundon,cfgSoundQuality,cfgStereoSound,cfgforce8b +EXTSYM Force8b,convertnum,converthex +EXTSYM per2exec +EXTSYM hostname +EXTSYM UDPConfig +EXTSYM snesmouse +EXTSYM pl1upk,pl1downk,pl1leftk,pl1rightk,pl1Lk,pl1Rk,pl1Ak,pl1Bk +EXTSYM outofmemfix,yesoutofmemory +EXTSYM CReadHead,ReadHead,CFWriteHead,CFWriteStart +EXTSYM JoyX,JoyY,JoyMinX,JoyMinY,JoyMaxX,JoyMaxY,JoyMinX209,JoyMaxX209 +EXTSYM JoyMinY209,JoyMaxY209,GetCoords,GetCoords3 +EXTSYM MultiTap,SFXEnable +EXTSYM RestoreSystemVars +EXTSYM TCPIPStartServer +EXTSYM TCPIPInitConnectToServer +EXTSYM TCPIPWaitForConnection +EXTSYM tcperr +EXTSYM TCPIPConnectToServer +EXTSYM TCPIPConnectToServerW +EXTSYM selc0040 +EXTSYM TCPIPPreparePacket +EXTSYM TCPIPSendPacket,TCPIPSendPacketUDP +EXTSYM TCPIPDisconnect,TCPIPStatus +EXTSYM TCPIPStoreByte +EXTSYM TCPIPGetByte,GUIBIFIL +EXTSYM firstsaveinc +EXTSYM nssdip1,nssdip2,nssdip3,nssdip4,nssdip5,nssdip6 +%ifdef __LINUX__ +EXTSYM numlockptr +%endif +%ifdef __WIN32__ +EXTSYM initDirectDraw +EXTSYM reInitSound +%endif + +%ifdef __MSDOS__ +EXTSYM dssel, cantinitmodem, ModemClearBuffer, ModemGetChar +EXTSYM InitModem, DeInitModem, ModemCheckRing, ModemCheckDCD +EXTSYM DeInitModemC, ModemSendChar, UartType +EXTSYM deinitipx, IPXSearchval, ipxlookforconnect, initipx +EXTSYM PreparePacketIPX,SendPacketIPX,ipxgetchar,ipxsendchar +%endif + +NEWSYM GuiAsmStart + +%include "gui/guitools.inc" +%include "gui/guimisc.inc" +%include "gui/guimouse.inc" +%include "gui/guiwindp.inc" +%include "gui/guinetpl.inc" +%include "gui/guikeys.inc" +%include "gui/guicheat.inc" +%include "gui/guicombo.inc" +%include "gui/guiload.inc" + + + +SECTION .data + + +; ProcessRemoteCommand +; NetLoadStuff ; Send 14 to initiate, Send 15 to cancel (either way) +; call PreparePacket +; mov al,253 +; call RemoteSendChar +; call SendPacket +; NetAddChar + +NEWSYM WaterOn, db 1 + +; Things to do : +; +; .checkmenuboxclick +; gray scale = 32 .. 63 +; shadow = 96 .. 127 +; blue scale = 148 .. 167, 168 .. 187 +; gray scale = 189 .. 220 (32+137) + + +; | Game Config Cheat MultiPlay Misc +;------------------------------------------------------- +; Load Input#1 Add Code Modem Game Keys +; Run Input#2 Browse IPX GUI Opns +; Reset Input#3 Search About +; ----- Input#4 +; Save State ------- +; Load State Options +; Chose State Video +; ----- Sound +; Quit + +; Windows : 1 = Save/Load Confirmation +; 2 = Chose State +; 3 = Input Device Window +; 4 = Options +; 5 = Video +; 6 = Sound +; 7 = Cheat +; 8 = IPX/Modem +; 9 = GameOptions +; 10 = GUI Options +; 11 = About + +MenuDat1 db 12,3,1,1,1,1,1,1,1,1,1,0,1,2,0 +MenuDat2 db 8, 3,1,1,0,1,1,1,0,2,0,0 +MenuDat3 db 10, 3,1,1,1,1,0,1,0,1,1,2,0 +MenuDat4 db 2, 3,1,2,0 +MenuDat5 db 1, 3,2,0 +MenuDat6 db 6, 3,1,1,1,1,0,2,0 + +GUIPrevMenuData + db 1,'1. ',0 + db 1,'2. ',0 + db 1,'3. ',0 + db 1,'4. ',0 + db 1,'5. ',0 + db 1,'6. ',0 + db 1,'7. ',0 + db 1,'8. ',0 + db 1,'9. ',0 + db 1,'0. ',0 + db 0,'------------',0 +.onoff db 1,'FREEZE DATA : OFF ',0 + db 1,'CLEAR ALL DATA ',0 +GUIGameMenuData + db 1,'LOAD ',0 + db 1,'RUN [ESC] ',0 + db 1,'RESET ',0 + db 0,'------------',0 + db 1,'SAVE STATE ',0 + db 1,'OPEN STATE ',0 + db 1,'PICK STATE ',0 + db 0,'------------',0 + db 1,'QUIT ',0 +GUIConfigMenuData + db 1,'INPUT #1 ',0 + db 1,'INPUT #2 ',0 + db 1,'INPUT #3 ',0 + db 1,'INPUT #4 ',0 + db 1,'INPUT #5 ',0 + db 0,'------------',0 + db 1,'ADD-ONS ',0 + db 0,'------------',0 + db 1,'OPTIONS ',0 + db 1,'VIDEO ',0 + db 1,'SOUND ',0 +GUICheatMenuData + db 1,'ADD CODE ',0 + db 1,'BROWSE ',0 + db 1,'SEARCH ',0 +GUINetPlayMenuData + db 1,'MODEM ',0 + db 1,'IPX ',0 +GUIMiscMenuData + db 1,'GAME KEYS ',0 + db 1,'GUI OPNS ',0 + db 1,'MOVIE OPN ',0 + db 1,'KEY COMB. ',0 + db 1,'SAVE CFG ',0 + db 0,'------------',0 + db 1,'ABOUT ',0 + +; Config, Options -> New Gfx Engine, Frame Rate, Fast Forward FrameRate, etc. +; Config, Video -> Video Mode, Interpolation, etc. +; Config, Options -> Set up Save and/or Load State Confirmation +; Select Different game key assignments +; If menu should go to Load or last position when ESC +; is pressed from game + +GUIRAdd db 15 +GUIGAdd db 10 +GUIBAdd db 31 +mousewrap db 0 ; 0 = mouse boundries, 1 = mouse wrap +mouseshad db 1 ; 0 = no mouse shadow, 1 = mouse shadow +lastcursres db 0 ; 0 = go to load, 1 = go to previous menu, 2 = no menu +resetposn db 1 ; 0 = no window reset, 1 = window reset +NEWSYM GUIClick, db 0 ; 1 = mouse click enters/exits gui +GUIwinposx2 dd 0,5 ,60 ,30 ,55 ,50 ,65 ,5 ,30 ,20 ,10 ,80 ,65 ,20 ,70 ,50 ,3 ,0 +GUIwinposy2 dd 0,20 ,70 ,30 ,20 ,22 ,36 ,20 ,30 ,20 ,40 ,70 ,60 ,30 ,65 ,50 ,22 ,0 + +; Default keys +; Sound Channels 0 .. 7, Save/Select/Load States, Fast Forward +; Exit, Load, Reset, BG Disables, Reset, Windowing, New Gfx, OffsetMode +; State Selection 0 .. 9 + +NEWSYM KeyDisableSC0, dd 63 +NEWSYM KeyDisableSC1, dd 64 +NEWSYM KeyDisableSC2, dd 65 +NEWSYM KeyDisableSC3, dd 66 +NEWSYM KeyDisableSC4, dd 67 +NEWSYM KeyDisableSC5, dd 68 +NEWSYM KeyDisableSC6, dd 87 +NEWSYM KeyDisableSC7, dd 88 +NEWSYM KeySaveState, dd 60 +NEWSYM KeyStateSelct, dd 61 +NEWSYM KeyLoadState, dd 62 +NEWSYM KeyFastFrwrd, dd 41 +NEWSYM KeyQuickExit, dd 0 +NEWSYM KeyQuickLoad, dd 0 +NEWSYM KeyQuickRst, dd 0 +NEWSYM KeyBGDisble0, dd 2 +NEWSYM KeyBGDisble1, dd 3 +NEWSYM KeyBGDisble2, dd 4 +NEWSYM KeyBGDisble3, dd 5 +NEWSYM KeySprDisble, dd 6 +NEWSYM KeyResetAll, dd 7 +NEWSYM KeyExtraEnab, dd 8 +NEWSYM KeyNewGfxSwt, dd 9 +NEWSYM KeyWinDisble, dd 10 +NEWSYM KeyOffsetMSw, dd 11 +NEWSYM KeyStateSlc0, dd 0 +NEWSYM KeyStateSlc1, dd 0 +NEWSYM KeyStateSlc2, dd 0 +NEWSYM KeyStateSlc3, dd 0 +NEWSYM KeyStateSlc4, dd 0 +NEWSYM KeyStateSlc5, dd 0 +NEWSYM KeyStateSlc6, dd 0 +NEWSYM KeyStateSlc7, dd 0 +NEWSYM KeyStateSlc8, dd 0 +NEWSYM KeyStateSlc9, dd 0 + +GUIshowallext db 0 +GUIloadfntype db 0 + +NEWSYM pl3selk, dd 0 ; 3SELECT = SHIFT +NEWSYM pl3startk, dd 0 ; 3START = ENTER +NEWSYM pl3upk, dd 0 ; 3UP = up +NEWSYM pl3downk, dd 0 ; 3DOWN = down +NEWSYM pl3leftk, dd 0 ; 3LEFT = left +NEWSYM pl3rightk, dd 0 ; 3RIGHT = right +NEWSYM pl3Xk, dd 0 ; 3X = INS +NEWSYM pl3Ak, dd 0 ; 3A = HOME +NEWSYM pl3Lk, dd 0 ; 3L = PAGE UP +NEWSYM pl3Yk, dd 0 ; 3Y = DELETE +NEWSYM pl3Bk, dd 0 ; 3B = END +NEWSYM pl3Rk, dd 0 ; 3R = PAGE DOWN +NEWSYM pl4selk, dd 0 ; 4SELECT = SHIFT +NEWSYM pl4startk, dd 0 ; 4START = ENTER +NEWSYM pl4upk, dd 0 ; 4UP = up +NEWSYM pl4downk, dd 0 ; 4DOWN = down +NEWSYM pl4leftk, dd 0 ; 4LEFT = left +NEWSYM pl4rightk, dd 0 ; 4RIGHT = right +NEWSYM pl4Xk, dd 0 ; 4X = INS +NEWSYM pl4Ak, dd 0 ; 4A = HOME +NEWSYM pl4Lk, dd 0 ; 4L = PAGE UP +NEWSYM pl4Yk, dd 0 ; 4Y = DELETE +NEWSYM pl4Bk, dd 0 ; 4B = END +NEWSYM pl4Rk, dd 0 ; 4R = PAGE DOWN +NEWSYM TimeChecker, db 0 ; Future Reserved +GUISoundBuffer db 1 ; Sound Buffer Disabled +prevloadnames times 16*10 db 32 +prevloaddname times 128*10 db 0 +prevloadfname times 16*10 db 32 +prevlfreeze db 0 +GUIsmallscreenon db 0 +GUIScreenScale db 0 + +NEWSYM pl3contrl, db 0 +NEWSYM pl4contrl, db 0 +NEWSYM pl1p209b, db 0 +NEWSYM pl2p209b, db 0 +NEWSYM pl3p209b, db 0 +NEWSYM pl4p209b, db 0 +JoyPad1Move db 0 +NEWSYM FirstTimeData, db 0 +NEWSYM PrevSWFix, db 0 +NEWSYM CalibXmin, dd 0 +NEWSYM CalibYmin, dd 0 +NEWSYM CalibXmax, dd 0 +NEWSYM CalibYmax, dd 0 +NEWSYM CalibXmin209, dd 0 +NEWSYM CalibYmin209, dd 0 +NEWSYM CalibXmax209, dd 0 +NEWSYM CalibYmax209, dd 0 +NEWSYM maxskip, db 9 +NEWSYM FPSAtStart, db 0 +NEWSYM SidewinderFix, db 0 +GUIInitSt1 db 'ATZ' +.rest times 47 db 0 +GUIInitSt2 db 'AT S0=0' +.rest times 43 db 0 +GUIDialSt db 'ATDT ',0 +NEWSYM ComNum, db 2 +NEWSYM ComIRQ, db 3 +NEWSYM BaudRate, dd 3 +NEWSYM pl1Atk, dd 0 ; Turbo A +NEWSYM pl1Btk, dd 0 ; Turbo B +NEWSYM pl1Xtk, dd 0 ; Turbo X +NEWSYM pl1Ytk, dd 0 ; Turbo Y +NEWSYM pl2Atk, dd 0 ; Turbo A +NEWSYM pl2Btk, dd 0 ; Turbo B +NEWSYM pl2Xtk, dd 0 ; Turbo X +NEWSYM pl2Ytk, dd 0 ; Turbo Y +NEWSYM pl3Atk, dd 0 ; Turbo A +NEWSYM pl3Btk, dd 0 ; Turbo B +NEWSYM pl3Xtk, dd 0 ; Turbo X +NEWSYM pl3Ytk, dd 0 ; Turbo Y +NEWSYM pl4Atk, dd 0 ; Turbo A +NEWSYM pl4Btk, dd 0 ; Turbo B +NEWSYM pl4Xtk, dd 0 ; Turbo X +NEWSYM pl4Ytk, dd 0 ; Turbo Y +NEWSYM Turbo30hz, db 0 ; Turbo at 30hz instead of 60hz + +NEWSYM KeyVolUp, dd 0 +NEWSYM KeyVolDown, dd 0 +NEWSYM KeyFRateUp, dd 0 +NEWSYM KeyFRateDown, dd 0 + +NEWSYM KeyQuickChat, dd 20 +NEWSYM FossilUse, db 0 +NEWSYM TimerEnable, db 0 + +NEWSYM Surround, db 0 +NEWSYM InterSound, db 1 +NEWSYM FastFwdToggle, db 0 +NEWSYM En2xSaI, db 0 +NEWSYM AutoLoadCht, db 0 +NEWSYM KeyQuickSnapShot, dd 0 + +CheatSrcByteSize db 0 +CheatSrcByteBase db 0 +CheatSrcSearchType db 0 +CheatUpperByteOnly db 0 +NEWSYM SRAMSave5Sec, db 0 +NEWSYM ReInitSoundC, db 0 +NEWSYM OldGfxMode2 , db 0 +NEWSYM PitchModEn , db 0 +NEWSYM LatestSave , db 0 +NEWSYM AutoState , db 0 +NEWSYM OldVolume , db 1 +NEWSYM BlankVar , db 1 + +NEWSYM pl1ULk, dd 0 +NEWSYM pl1URk, dd 0 +NEWSYM pl1DLk, dd 0 +NEWSYM pl1DRk, dd 0 +NEWSYM pl2ULk, dd 0 +NEWSYM pl2URk, dd 0 +NEWSYM pl2DLk, dd 0 +NEWSYM pl2DRk, dd 0 +NEWSYM pl3ULk, dd 0 +NEWSYM pl3URk, dd 0 +NEWSYM pl3DLk, dd 0 +NEWSYM pl3DRk, dd 0 +NEWSYM pl4ULk, dd 0 +NEWSYM pl4URk, dd 0 +NEWSYM pl4DLk, dd 0 +NEWSYM pl4DRk, dd 0 + +NEWSYM LowPassFilterType, db 0 +NEWSYM DontSavePath, db 0 +NEWSYM ReCalib, db 1 +NEWSYM GUIComboGameSpec, db 0 +NEWSYM SoundNoiseDis, db 0 ; Disable Noise +NEWSYM Triplebufen, db 0 +NEWSYM SoundBufEn, db 0 +NEWSYM SPCDisable, db 0 +NEWSYM RaisePitch, db 0 + +prevloadl db 0 +prevloaddnamel times 512*10 db 0 +prevloadfnamel times 512*10 db 0 + +%ifdef __WIN32__ +NEWSYM PrevWinMode, db 2 +NEWSYM PrevFSMode, db 6 +%elifdef __LINUX__ +NEWSYM PrevWinMode, db 2 +NEWSYM PrevFSMode, db 3 +%else +NEWSYM PrevWinMode, db 0 +NEWSYM PrevFSMode, db 0 +%endif + +OldWinPos db 0 +GUIwinposx dd 0,5 ,60 ,30 ,55 ,50 ,65 ,5 ,30 ,20 ,10 ,80 ,65 ,20 ,70 ,50 ,3 ,50 +GUIwinposxexp times 30 dd 0 +GUIwinposy dd 0,20 ,70 ,30 ,20 ,22 ,36 ,20 ,30 ,20 ,30 ,70 ,60 ,30 ,65 ,50 ,22 ,60 +GUIwinposyexp times 30 dd 0 + +NEWSYM GUIEffect, db 0 + +NEWSYM pl5selk, dd 0 ; 4SELECT = SHIFT +NEWSYM pl5startk, dd 0 ; 4START = ENTER +NEWSYM pl5upk, dd 0 ; 4UP = up +NEWSYM pl5downk, dd 0 ; 4DOWN = down +NEWSYM pl5leftk, dd 0 ; 4LEFT = left +NEWSYM pl5rightk, dd 0 ; 4RIGHT = right +NEWSYM pl5Xk, dd 0 ; 4X = INS +NEWSYM pl5Ak, dd 0 ; 4A = HOME +NEWSYM pl5Lk, dd 0 ; 4L = PAGE UP +NEWSYM pl5Yk, dd 0 ; 4Y = DELETE +NEWSYM pl5Bk, dd 0 ; 4B = END +NEWSYM pl5Rk, dd 0 ; 4R = PAGE DOWN +NEWSYM pl5ULk, dd 0 +NEWSYM pl5URk, dd 0 +NEWSYM pl5DLk, dd 0 +NEWSYM pl5DRk, dd 0 +NEWSYM pl5Atk, dd 0 ; Turbo A +NEWSYM pl5Btk, dd 0 ; Turbo B +NEWSYM pl5Xtk, dd 0 ; Turbo X +NEWSYM pl5Ytk, dd 0 ; Turbo Y +NEWSYM pl5contrl, db 0 +NEWSYM pl1p209, db 0 +NEWSYM pl2p209, db 0 +NEWSYM pl3p209, db 0 +NEWSYM pl4p209, db 0 +NEWSYM pl5p209, db 0 + +NEWSYM GUIEnableTransp, db 0 +NEWSYM Mode7HiRes16b, dd 0 +NEWSYM NewEngEnForce, db 1 +NEWSYM KeyRewind, dd 0 +NEWSYM ChatNick, times 16 db 0 +NEWSYM KeySlowDown, dd 0 + +NEWSYM UseCubicSpline, db 1 + +NEWSYM LargeSoundBuf, db 0 +NEWSYM HighPriority, db 0 +NEWSYM AlwaysOnTop, db 0 +NEWSYM SaveMainWindowPos, db 1 +NEWSYM MainWindowX, dw -1 +NEWSYM MainWindowY, dw -1 + +NEWSYM ScreenShotFormat, db 0 + +NEWSYM pl1Ltk, dd 0 ; Turbo L +NEWSYM pl1Rtk, dd 0 ; Turbo R +NEWSYM pl2Ltk, dd 0 ; Turbo L +NEWSYM pl2Rtk, dd 0 ; Turbo R +NEWSYM pl3Ltk, dd 0 ; Turbo L +NEWSYM pl3Rtk, dd 0 ; Turbo R +NEWSYM pl4Ltk, dd 0 ; Turbo L +NEWSYM pl4Rtk, dd 0 ; Turbo R +NEWSYM pl5Ltk, dd 0 ; Turbo L +NEWSYM pl5Rtk, dd 0 ; Turbo R + +NEWSYM GUITRAdd, db 0 +NEWSYM GUITGAdd, db 10 +NEWSYM GUITBAdd, db 31 + +NEWSYM GUIWRAdd, db 8 +NEWSYM GUIWGAdd, db 8 +NEWSYM GUIWBAdd, db 25 + +NEWSYM GrayscaleMode, db 0 +NEWSYM MouseWheel, db 1 +NEWSYM SmallMsgText, db 0 +NEWSYM AllowMultipleInst, db 0 +NEWSYM FilteredGUI, db 0 +NEWSYM BilinearFilter, db 0 +NEWSYM TripleBufferWin, db 0 + +NEWSYM ExclusiveSound, db 0 +NEWSYM DisableScreenSaver, db 0 +NEWSYM MMXSupport, db 1 +NEWSYM TrapMouseCursor, db 1 +NEWSYM KeyQuickClock, dd 0 +NEWSYM KeyQuickSaveSPC, dd 0 +NEWSYM AutoIncSaveSlot, db 0 +NEWSYM TCPIPAddress, times 29 db 0 +NEWSYM SoundInterpType, db 1 +NEWSYM KeyDisplayFPS, dd 0 +NEWSYM KeyIncStateSlot, dd 0 +NEWSYM KeyDecStateSlot, dd 0 +NEWSYM KeyUsePlayer1234, dd 0 + +GUIsave equ $-GUIRAdd + +section .bss + +NEWSYM ForceROMTiming, resb 1 +NEWSYM ForceHiLoROM, resb 1 + +NEWSYM CombinDataGlob, resb 3300 ; 20-name, 42-combo, 2-key#, 1-P#, 1-ff +NEWSYM CombinDataLocl, resb 3300 + +section .data +NEWSYM CmdLineNetPlay, db 0 +NEWSYM CmdLineTCPIPAddress, times 29 db 0 +section .bss + +GUIwinorder resb 18 +GUIwinpos resb 18 +GUIwinactiv resb 18 +DialNumber resb 40 +ViewBuffer resb 50*32 +NEWSYM ModemInitStat, resb 1 +ModemProcess resb 1 ; Shows current dial/answer process +ModemPTimer resd 1 ; Timer for modem process +ModemOKStat resb 1 ; OK is detected on modem status + +SECTION .data +; LOAD STAT INPT OPT VID SND CHT NET GMKEY GUIOP ABT RSET SRC STCN MOVE CMBO ADDO +GUIwinposxo dd 0,5 ,60 ,30 ,55 ,50 ,35 ,5 ,30 ,10 ,10 ,50 ,65 ,20 ,70 ,50 ,3 ,50 +GUIwinposyo dd 0,20 ,70 ,30 ,20 ,20 ,20 ,20 ,30 ,20 ,20 ,20 ,60 ,30 ,65 ,50 ,22 ,60 +GUIwinsizex dd 0,244 ,126 ,189 ,167 ,170 ,188 ,244 ,8*16,235 ,240 ,190 ,9*16,8*16,9*16,140 ,250 ,160 +GUIwinsizey dd 0,190 ,3*16,166 ,190 ,192 ,188 ,191 ,40 ,189 ,150 ,190 ,42 ,40 ,42 ,70 ,190 ,100 +GUIwinptr db 0 + +section .bss +GUItextcolor resb 5 +GUIcmenupos resb 1 +GUIescpress resb 1 +GUIcwinpress resb 1 +GUIpmenupos resb 1 +GUIcrowpos resd 1 +GUIpclicked resb 1 +GUImouseposx resd 1 +GUImouseposy resd 1 +GUICYLocPtr resd 1 +GUIMenuL resd 1 +GUIMenuR resd 1 +GUIMenuD resd 1 +GUIOnMenuItm resb 1 +NEWSYM GUIQuit, resb 1 +GUIHold resb 1 +GUIHoldx resd 1 +GUIHoldy resd 1 +GUIHoldxm resd 1 +GUIHoldym resd 1 +GUIcolscaleval resd 1 +cwindrawn resb 1 +GUIWincol resd 1 +GUIWincoladd resd 1 +GUITemp resd 1 +GUIHoldXlimL resd 1 +GUIHoldXlimR resd 1 +GUIHoldYlim resd 1 +GUIHoldYlimR resd 1 +cloadnpos resd 1 +cloadnposb resd 1 +cloadmaxlen resd 1 +cloadnleft resd 1 +cplayernum resb 1 +vbuflimtop resd 1 +vbuflimbot resd 1 +GUIScrolTim1 resd 1 +GUIScrolTim2 resd 1 +GUICHold resd 1 +GUICBHold resd 1 +GUICBHold2 resd 1 +GUIDClickTL resd 1 +GUIDClCWin resd 1 +GUIDClCEntry resd 1 +GUICResetPos resd 1 +GUICStatePos resd 1 +GUICCFlash resb 1 +GUILDFlash resb 1 +GUIPalConv resd 1 +PrevResoln resw 1 +SnowMover resd 1 +keycontrolval resd 1 +NEWSYM CheatBDoor, resb 1 +NEWSYM ShowTimer, resb 1 +NEWSYM MousePRClick, resb 1 +NEWSYM MouseDis, resb 1 +NEWSYM NetPlayNoMore, resb 1 +RestoreValues resb 1 +NEWSYM NetChatFirst, resb 1 +NEWSYM NetServer, resb 1 +NEWSYM NetQuitAfter, resb 1 +NEWSYM NetNewNick, resb 16 +NEWSYM NetFilename, resb 512 + +NEWSYM CheatOn, resd 1 +NEWSYM NumCheats, resd 1 +NEWSYM cheatdataprev, resb 28 ; leave contents blank +NEWSYM cheatdata, resb 28*255+56 ; toggle, value, address, pvalue, name(22) + +NEWSYM GUIcurrentdir, resb 131 + +curgsval resb 1 + +SECTION .data +NEWSYM numdrives, dd 26 +SubPalTable times 256 db 1 ; Corresponding Gray Scale Color + +SECTION .bss +WhichRemote resd 1 ; Modem = 1, IPX = 2, TCP/IP = 4 +Connected resd 1 +IDCheckPos resd 1 + +NEWSYM pl1neten, resb 1 +NEWSYM pl2neten, resb 1 +NEWSYM pl3neten, resb 1 +NEWSYM pl4neten, resb 1 +NEWSYM pl5neten, resb 1 +NEWSYM cnetplaybuf, resb 512 +NEWSYM cnetptrhead, resd 1 +NEWSYM cnetptrtail, resd 1 +NEWSYM prevp1net, resd 1 +NEWSYM prevp2net, resd 1 +NEWSYM prevp3net, resd 1 +NEWSYM prevp4net, resd 1 +NEWSYM prevp5net, resd 1 +NEWSYM netdelayed, resb 1 +NEWSYM ChatProgress,resd 1 +NEWSYM RecvProgress,resd 1 +NEWSYM IPXInfoStr, resw 1 +NEWSYM IPXInfoStrR, resw 1 +NEWSYM GUICMessage, resd 1 +NEWSYM GUICTimer, resd 1 +NEWSYM GUIOn, resb 1 +NEWSYM GUIOn2, resb 1 +NEWSYM GUIReset, resb 1 +;GOSPort db 0 +NEWSYM CurPalSelect, resb 1 +NEWSYM MotionBlur, resb 1 + +NEWSYM StartLL, resd 1 +NEWSYM StartLR, resd 1 +NEWSYM LatencyVal, resb 32 + +NEWSYM NetLoadState, resb 1 + +NEWSYM TRVal, resw 1 +NEWSYM TGVal, resw 1 +NEWSYM TBVal, resw 1 +NEWSYM TRVali, resw 1 +NEWSYM TGVali, resw 1 +NEWSYM TBVali, resw 1 +NEWSYM TRVal2, resw 1 +NEWSYM TGVal2, resw 1 +NEWSYM TBVal2, resw 1 + +SECTION .text + +%macro stim 0 +%ifdef __MSDOS__ + sti +%endif +%endmacro + +%macro clim 0 +%ifdef __MSDOS__ + cli +%endif +%endmacro + +clearsram: + push eax + push ecx + mov eax,srama + mov ecx,65536 +.loop + mov byte[eax],0FFh + inc eax + dec ecx + jnz .loop + cmp byte[SFXSRAM],0 + je .nosfxsram + mov eax,[sfxramdata] + mov ecx,65536 +.loop2 + mov byte[eax],0FFh + inc eax + dec ecx + jnz .loop2 +.nosfxsram + cmp byte[SA1Enable],1 + jne .nosa1 + mov eax,[SA1RAMArea] + mov ecx,65536*2 +.loop3 + mov byte[eax],0FFh + inc eax + dec ecx + jnz .loop3 +.nosa1 + pop ecx + pop eax + ret + +GUIQuickLoadUpdate: + cmp byte[prevlfreeze],0 + je .off + mov byte[GUIPrevMenuData.onoff+15],'O' + mov byte[GUIPrevMenuData.onoff+16],'N' + mov byte[GUIPrevMenuData.onoff+17],' ' + jmp .on +.off + mov byte[GUIPrevMenuData.onoff+15],'O' + mov byte[GUIPrevMenuData.onoff+16],'F' + mov byte[GUIPrevMenuData.onoff+17],'F' +.on + mov esi,prevloadfnamel +%ifdef __MSDOS__ + mov esi,prevloadnames +%endif + mov edi,GUIPrevMenuData+3 + mov edx,10 +.mainloop + mov ecx,25 +%ifdef __MSDOS__ + mov ecx,16 +%endif + push edi + push esi + cmp byte[esi],32 + je near .fin2 +.loop + mov al,[esi] + cmp al,0 + je .zero + mov [edi],al + inc esi + inc edi + dec ecx + jnz .loop + cmp byte[esi],0 + je .zero + mov byte[edi],'.' + mov byte[edi+1],'.' + mov byte[edi+2],'.' + jmp .fin +.zero + add ecx,3 +.loop2 + mov byte[edi],32 + inc edi + dec ecx + jnz .loop2 + jmp .fin +.fin2 + mov ecx,18 +.loop3 + mov byte[edi],32 + inc edi + dec ecx + jnz .loop3 +.fin + pop esi + pop edi + add esi,512 ;16 +%ifdef __MSDOS__ + sub esi,512-16 +%endif + add edi,32 + dec edx + jnz near .mainloop + ret + + + +CalcChecksum: + mov eax,GUIRAdd + mov ecx,100 + xor edx,edx + xor ebx,ebx +.loop + mov bl,[eax] + add edx,ebx + inc eax + dec ecx + jnz .loop + mov ebx,edx + xor bx,1011001011101101b + xor eax,eax + test bh,08h + jz .nb + mov al,1 +.nb + and bh,0F7h + test bl,10h + jz .nb2 + or bh,08h +.nb2 + and bl,0EFh + test al,1 + jz .nb3 + or bl,10h +.nb3 + xor bl,bh + or bl,80h + ret + +NEWSYM GUIRestoreVars + mov edx,GUIFName + call Open_File + jc .fail + mov bx,ax + mov edx,GUIRAdd + mov ecx,GUIsave + call Read_File + call Close_File +.fail + mov al,[GUIsmallscreenon] + mov [smallscreenon],al + mov al,[GUIScreenScale] + mov [ScreenScale],al + cmp byte[CmdLineNetPlay],0 + je .nocmdlinenetplay + mov ecx,28/4 + mov esi,CmdLineTCPIPAddress + mov edi,TCPIPAddress +.netplayloop + mov eax,[esi] + add esi,byte 4 + mov [edi],eax + add edi,byte 4 + dec ecx + jnz .netplayloop + xor eax,eax +.nocmdlinenetplay + call CalcChecksum + cmp byte[TimeChecker],bl + jne .nottimer + mov byte[ShowTimer],1 + mov dword[NumSnow],200 + mov dword[SnowTimer],0 +.nottimer + cmp byte[ReCalib],0 + je .nocal + mov byte[ReCalib],0 + mov dword[CalibXmin],0 + mov dword[CalibXmax],0 + mov dword[CalibYmin],0 + mov dword[CalibYmax],0 + mov dword[CalibXmin209],0 + mov dword[CalibXmax209],0 + mov dword[CalibYmin209],0 + mov dword[CalibYmax209],0 +.nocal + + mov dword[NumComboGlob],0 + mov edx,GUICName + 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 [NumComboGlob],al + mov ecx,[NumComboGlob] + mov edx,ecx + shl ecx,6 + add ecx,edx + add ecx,edx + mov edx,CombinDataGlob + call Read_File +.done + call Close_File +.failb + ret + +SECTION .data +NEWSYM ComboHeader, db 'Key Combination File',26,1,0 +NEWSYM ComboBlHeader, times 23 db 0 +SECTION .text + +NEWSYM ExecGUISaveVars + cmp byte[ShowTimer],1 + jne .nottimer + call CalcChecksum + mov byte[TimeChecker],bl +.nottimer + cmp byte[cfgdontsave],1 + je .failed + mov edx,GUIFName + call Create_File + jc .failed + mov bx,ax + mov edx,GUIRAdd + mov ecx,GUIsave + call Write_File + call Close_File +.failed + mov al,[NumComboGlob] + or al,al + jz .failb + mov [ComboHeader+22],al + mov edx,GUICName + call Create_File + jc .failb + mov bx,ax + mov edx,ComboHeader + mov ecx,23 + call Write_File + mov ecx,[NumComboGlob] + mov edx,ecx + shl ecx,6 + add ecx,edx + add ecx,edx + mov edx,CombinDataGlob + call Write_File + call Close_File +.failb + ret + +%macro GUIInitIRQs 0 + call GUIInit + mov esi,pressed + mov ecx,256 + mov al,0 +.loopa + mov [esi],al + inc esi + dec ecx + jnz .loopa +%endmacro + +%macro GUIDeInitIRQs 0 + call GUIDeInit +%endmacro + +SECTION .bss +NEWSYM GUIoldhand9o, resd 1 +NEWSYM GUIoldhand9s, resw 1 +NEWSYM GUIoldhand8o, resd 1 +NEWSYM GUIoldhand8s, resw 1 +GUIt1cc resd 1 +GUIt1ccSwap resb 1 +GUIskipnextkey42 resb 1 + +SECTION .text +NEWSYM GUIinit18_2hz + mov al,00110110b + out 43H,al + mov ax,0 + out 40H,al + mov al,ah + out 40H,al + ret + +NEWSYM GUIinit36_4hz + mov al,00110110b + out 43H,al + mov ax,32768 + out 40H,al + mov al,ah + out 40H,al + ret + +NEWSYM GUI36hzcall + inc dword[GUIt1cc] + inc dword[SnowMover] + cmp dword[ModemPTimer],0 + je .nodec5 + dec dword[ModemPTimer] +.nodec5 + cmp dword[GUIEditStringLTxt],0 + je .nodec + dec dword[GUIEditStringLTxt] +.nodec + cmp dword[GUIScrolTim1],0 + je .nodec4 + dec dword[GUIScrolTim1] +.nodec4 + cmp dword[GUIDClickTL],0 + je .nodec2 + dec dword[GUIDClickTL] +.nodec2 + cmp dword[GUIkeydelay],0 + je .nodec3 + dec dword[GUIkeydelay] +.nodec3 + cmp dword[GUIkeydelay2],0 + je .nodec3b + dec dword[GUIkeydelay2] +.nodec3b + cmp dword[GUICTimer],0 + je .nodec6 + dec dword[GUICTimer] +.nodec6 + inc byte[GUICCFlash] + and byte[GUICCFlash],0Fh + inc byte[GUILDFlash] + and byte[GUILDFlash],0Fh + inc byte[GUINetTextm2+2] + and byte[GUINetTextm2+2],0Fh + ret + +%ifdef __MSDOS__ +NEWSYM GUIhandler8h + cli + push ds + push eax + mov ax,[cs:dssel] + mov ds,ax + call GUI36hzcall + xor byte[GUIt1ccSwap],1 + cmp byte[GUIt1ccSwap],0 + je .nocall + pushf + call far [GUIoldhand8o] +.nocall + mov al,20h + out 20h,al + pop eax + pop ds + sti + iretd + +NEWSYM GUIhandler9h + cli + push ds + push eax + push ebx + mov ax,[cs:dssel] + mov ds,ax + + xor ebx,ebx + in al,60H ; get keyboard scan code + cmp al,42 + jne .no42 + cmp byte[GUIskipnextkey42],0 + je .no42 + mov byte[GUIskipnextkey42],0 + jmp .skipkeyrel +.no42 + cmp al,0E0h + jne .noE0 + mov byte[GUIskipnextkey42],1 + jmp .skipkeyrel +.noE0 + mov byte[GUIskipnextkey42],0 + mov bl,al + xor bh,bh + test bl,80h ; check if bit 7 is on (key released) + jnz .keyrel + cmp byte[pressed+ebx],0 + jne .skipa + mov byte[pressed+ebx],1 ; if not, set key to pressed +.skipa + jmp .skipkeyrel +.keyrel + and bl,7Fh + mov byte[pressed+ebx],0 ; if not, set key to pressed +.skipkeyrel + mov byte[pressed],0 + + pushf + call far [GUIoldhand9o] + mov al,20h + out 20h,al + pop ebx + pop eax + pop ds + sti + iretd +%endif + +%macro loadmenuopen 1 + mov al,[GUIcmenupos] + mov [GUIpmenupos],al + mov byte[GUIcmenupos],0 + cmp byte[GUIwinactiv+%1],1 + je %%menuontop + xor eax,eax + mov al,[GUIwinptr] + inc byte[GUIwinptr] + mov byte[GUIwinorder+eax],%1 + mov byte[GUIwinactiv+%1],1 + cmp byte[resetposn],1 + jne %%nomenuitem + mov eax,[GUIwinposxo+%1*4] + mov [GUIwinposx+%1*4],eax + mov eax,[GUIwinposyo+%1*4] + mov [GUIwinposy+%1*4],eax + jmp %%nomenuitem +%%menuontop + xor eax,eax + ; look for match +%%notfoundyet + mov bl,byte[GUIwinorder+eax] + cmp bl,%1 + je %%nextfind + inc eax + jmp %%notfoundyet +%%nextfind + inc eax + cmp al,[GUIwinptr] + je %%foundend + mov cl,[GUIwinorder+eax] + mov [GUIwinorder+eax-1],cl + jmp %%nextfind +%%foundend + mov byte[GUIpclicked],0 + mov [GUIwinorder+eax-1],bl +%%nomenuitem +%endmacro + +loadnetopen: + loadmenuopen 8 + ret + +SECTION .bss +MouseInitOkay resb 1 +SECTION .text + +LoadDetermine: + mov byte[GUIGameMenuData+14],1 + mov byte[GUIGameMenuData+14*2],1 + mov byte[GUIGameMenuData+14*4],1 + mov byte[GUIGameMenuData+14*5],1 + mov byte[GUIGameMenuData+14*6],1 + mov byte[GUICheatMenuData],1 + mov byte[GUICheatMenuData+14],1 + mov byte[GUICheatMenuData+14*2],1 + mov byte[GUIMiscMenuData+14*2],1 + cmp byte[CheatBDoor],1 + je .nomodem + cmp byte[CNetType],21 + je .modem + cmp byte[CNetType],22 + je .modem + cmp byte[CNetType],20 + jne .nomodem +.modem + mov byte[GUICheatMenuData],2 + mov byte[GUICheatMenuData+14],2 + mov byte[GUICheatMenuData+14*2],2 +.nomodem + cmp byte[romloadskip],0 + je .noromloaded2 + mov byte[GUIGameMenuData+14],2 + mov byte[GUIGameMenuData+14*2],2 + mov byte[GUIGameMenuData+14*4],2 + mov byte[GUIGameMenuData+14*5],2 + mov byte[GUIGameMenuData+14*6],2 + mov byte[GUICheatMenuData],2 + mov byte[GUICheatMenuData+14],2 + mov byte[GUICheatMenuData+14*2],2 + mov byte[GUIMiscMenuData+14*2],2 +.noromloaded2 +.noromloaded + ret + +SECTION .data +SantaData: +db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +db 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 +db 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 +db 1,0,0,1,0,0,1,0,0,0,1,1,1,0,1,1 +db 1,1,0,1,1,0,1,1,0,1,0,1,1,1,1,1 +db 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1 +db 1,1,0,1,1,0,1,1,0,0,1,1,1,1,1,1 + +SantaPos dd 272 +SantaNextT dd 36*15 +NumSnow dd 0 +NEWSYM SnowTimer, dd 36*30 +MsgGiftLeft dd 0 +SECTION .text + +DrawSnow: + cmp byte[OkaySC],0 + je near .nosanta + cmp dword[MsgGiftLeft],0 + je .nodec + mov edx,20 + mov ebx,210 + mov byte[GUItextcolor],228 + GUIOuttextwin .giftmsg +.nodec + mov esi,[vidbuffer] + add esi,[SantaPos] + add esi,60*288 + mov edx,SantaData + mov ebx,8 +.sloop2 + mov ecx,16 +.sloop + cmp byte[edx],0 + je .transp + mov byte[esi],0 +.transp + inc esi + inc edx + dec ecx + jnz .sloop + add esi,272 + dec ebx + jnz .sloop2 +.nosanta + mov esi,[vidbuffer] + mov ecx,200 + xor edx,edx +.loop + xor eax,eax + mov al,[SnowData+edx*4+3] + mov ebx,eax + shl eax,8 + shl ebx,5 + add eax,ebx + xor ebx,ebx + mov bl,[SnowData+edx*4+1] + add eax,ebx + add eax,16 + mov bl,[SnowVelDist+edx*2] + and bl,03h + add bl,228 + test byte[SnowVelDist+edx*2],8 + jz .nosnow + mov byte[esi+eax],bl +.nosnow + inc edx + dec ecx + jnz .loop + ; Change Snow Displacement Values +.next + cmp dword[SnowMover],0 + je .nomore + call ProcessSnowVelocity + dec dword[SnowMover] + jmp .next +.nomore + ret + +SECTION .data +.giftmsg db 'A GIFT TO YOU IN THE OPTIONS!',0 +SECTION .text + +ProcessSnowVelocity: + cmp dword[MsgGiftLeft],0 + je .nodec + dec dword[MsgGiftLeft] +.nodec + cmp dword[NumSnow],200 + jne .snowincr + cmp dword[SantaNextT],0 + je .skip + dec dword[SantaNextT] + jmp .notsreset +.skip + dec dword[SantaPos] + cmp dword[SantaPos],0 + jne .notsreset + mov dword[SantaPos],272 + mov dword[SantaNextT],36*60 + jmp .notsreset +.snowincr + dec dword[SnowTimer] + jnz .notsreset + inc dword[NumSnow] + mov dword[SnowTimer],18 +.notsreset + + mov ecx,[NumSnow] + cmp ecx,0 + jne .okay + ret +.okay + xor edx,edx +.loop + xor eax,eax + mov al,[SnowVelDist+edx*2] + mov ebx,100 + sub bl,[MusicRelVol] + add bx,bx + add ax,bx + add ax,bx + add word[SnowData+edx*4],ax + xor eax,eax + mov al,[SnowVelDist+edx*2+1] + add ax,256 + add word[SnowData+edx*4+2],ax + cmp word[SnowData+edx*4+2],200h + ja .nosdata + or byte[SnowVelDist+edx*2],8 +.nosdata + inc edx + dec ecx + jnz .loop + ret + +SECTION .bss +OkaySC resb 1 +SECTION .data +cstempfname db 'tmpchtsr.___',0 +SECTION .text + + +NEWSYM SaveSramData + ; save sram + cmp byte[sramsavedis],1 + je .nosram + cmp dword[ramsize],0 + je .nosram + clim + xor eax,eax + xor ebx,ebx + xor ecx,ecx + xor edx,edx + xor esi,esi + xor edi,edi + mov edx,fnames+1 + call Create_File + jc .failed + mov bx,ax + mov ecx,[ramsize] + mov edx,[sram] + call Write_File + call Close_File +.failed + stim +.nosram + call SaveCombFile + ret + +NEWSYM ProcRewind + mov eax,KeyRewind + add eax,4 + mov ebx,8 +.loop + cmp byte[eax],'a' + jb .b + cmp byte[eax],'z' + ja .b + sub byte[eax],'a'-'A' +.b + inc eax + dec ebx + jnz .loop + sub eax,8 + ; 90,83,75,78,73,71 + mov dword[.temp],44*65536*256+24*65536+72*256+40 + mov word[.temp+4],41*256+50 + add dword[.temp],34*65536*256+51*65536+11*256+50 + add word[.temp+4],30*256+23 + call .c + ; 95,68,69,77,79,95 + mov dword[.temp],25*65536*256+29*65536+31*256+62 + mov word[.temp+4],43*256+18 + add dword[.temp],52*65536*256+40*65536+37*256+33 + add word[.temp+4],52*256+61 + call .c + ; 80,72,65,82,79,83 + mov dword[.temp],11*65536*256+33*65536+24*256+35 + mov word[.temp+4],52*256+30 + add dword[.temp],71*65536*256+32*65536+48*256+45 + add word[.temp+4],31*256+49 + call .c + ret +.c + mov ebx,[.temp] + cmp [eax],ebx + jne .noteq + mov bx,[.temp+4] + cmp [eax+4],bx + jne .noteq + mov dword[eax],0 + mov dword[eax+4],0 + mov dword[eax+8],0 +.noteq + ret +section .bss +.temp resd 2 +section .text + +%macro ProcessOneDigit 1 + cmp dl,9 + jbe %%notover + add dl,65-48-10 +%%notover + add dl,48 + mov byte[.message+%1],dl + xor edx,edx + div ebx +%endmacro + +NEWSYM TestSent + mov eax,[NetSent] + xor edx,edx + mov ebx,16 + div ebx + ProcessOneDigit 3 + ProcessOneDigit 2 + ProcessOneDigit 1 + ProcessOneDigit 0 + + mov eax,[valuea] + xor edx,edx + mov ebx,16 + div ebx + ProcessOneDigit 8 + ProcessOneDigit 7 + ProcessOneDigit 6 + ProcessOneDigit 5 + + mov dword[GUICMessage],.message + mov dword[GUICTimer],100000 + ret +SECTION .data +.message db 0,0,0,0,' ',0,0,0,0,0,0,0 +SECTION .text + +NEWSYM StartGUI +; cmp byte[OSPort],1 +; jbe .dosport + cmp byte[TripBufAvail],0 + jne .notexttb + mov byte[Triplebufen],0 +.notexttb + cmp byte[MMXSupport],1 + jne .2xSaIdis + cmp byte[newgfx16b],0 + je .2xSaIdis + jmp .no2xSaIdis +.2xSaIdis + mov byte[En2xSaI],0 +.no2xSaIdis + cmp byte[En2xSaI],0 + je .no2xsaidis + mov byte[Triplebufen],0 +.no2xsaidis + cmp byte[En2xSaI],0 + je .no2xsaien + mov byte[scanlines],0 + mov byte[antienab],0 +.no2xsaien + +;.dosport + mov ecx,64 + mov eax,SpecialLine +.slloop + mov dword[eax],0 + add eax,4 + dec ecx + jnz .slloop + cmp byte[OldWinPos],0 + jne .okayow + xor esi,esi + mov ecx,17 +.nextow + mov eax,[GUIwinposx2+esi*4] + mov [GUIwinposx+esi*4],eax + mov eax,[GUIwinposy2+esi*4] + mov [GUIwinposy+esi*4],eax + inc esi + dec ecx + jnz .nextow + mov byte[OldWinPos],1 + mov eax,[pl1p209b] + mov [pl1p209],eax +.okayow +%ifndef __MSDOS__ + mov dword[GUINetPlayMenuData+1],'INTE' + mov dword[GUINetPlayMenuData+5],'RNET' + mov dword[GUINetPlayMenuData+1+14],'----' + mov dword[GUINetPlayMenuData+5+14],'----' + mov byte[MenuDat5],0 + mov byte[MenuDat5+1],2 +%endif +;.notwinport + ; copy old quickfilename to new quickfilename + cmp byte[prevloadl],0 + jne .noconvertlfqm + mov byte[prevloadl],1 + mov ecx,10 + xor edx,edx +.convlfnlp + mov eax,ecx + dec eax + mov edx,eax + shl eax,9 + shl edx,4 + mov bl,16 +.convlfnlp2 + mov bh,[prevloadfname+edx] + mov [prevloadfnamel+eax],bh + inc edx + inc eax + dec bl + jnz .convlfnlp2 + mov eax,ecx + dec eax + mov edx,eax + shl eax,9 + shl edx,7 + mov bl,128 +.convlfnlp2b + mov bh,[prevloaddname+edx] + mov [prevloaddnamel+eax],bh + inc edx + inc eax + dec bl + jnz .convlfnlp2b + dec ecx + jnz .convlfnlp +.noconvertlfqm + + mov byte[GUIOn],1 + mov byte[GUIOn2],1 + mov eax,[NumComboLocl] + cmp byte[GUIComboGameSpec],0 + jne .local + mov eax,[NumComboGlob] +.local + mov [NumCombo],eax + call ResetTripleBuf + + cmp dword[GUIwinposx+16*4],0 + jne .notzero + mov dword[GUIwinposx+16*4],3 + mov dword[GUIwinposy+16*4],22 +.notzero + xor ecx,ecx +.joysloop + cmp dword[pl1ULk+ecx*4],80h + jbe .nojoystick + mov dword[pl1ULk+ecx*4],0 +.nojoystick + inc ecx + cmp ecx,16 + jne .joysloop + + mov dword[GUICTimer],0 + cmp byte[OldVolume],1 + jne .notold + mov byte[OldVolume],0 + mov byte[MusicRelVol],100 + mov byte[cfgvolume],100 + ; Initialize volume + xor eax,eax + xor edx,edx + mov al,[MusicRelVol] + shl eax,7 + mov ebx,100 + div ebx + cmp al,127 + jb .noofb + mov al,127 +.noofb + mov [MusicVol],al +.notold + mov byte[CheatSearchStatus],0 + cmp byte[newgfx16b],0 + je .nong + mov ecx,255*144 + mov eax,[vidbufferofsb] +.loop + mov dword[eax],0 + add eax,4 + dec ecx + jnz .loop +.nong + mov byte[ShowTimer],1 + call Get_Date + cmp dh,12 + jne .noxmas + cmp dl,25 + jne .noxmas + mov byte[OkaySC],1 +.noxmas + mov byte[lastmouseholded],1 + cmp dword[GUIwinposx+15*4],0 + jne .nomoviemenufix + mov dword[GUIwinposx+15*4],50 + mov dword[GUIwinposy+15*4],50 +.nomoviemenufix + mov ax,[resolutn] + mov [PrevResoln],ax + mov word[resolutn],224 + + mov byte[GUIPalConv],0 + mov byte[MousePRClick],1 + + pushad + cmp byte[MouseInitOkay],1 + je near .mousedone + mov byte[MouseInitOkay],1 + cmp byte[MouseDis],1 + je .mousedone + call Init_Mouse + cmp ax,0 + jne .mousedone + mov byte[MouseDis],1 +.mousedone + popad + + mov eax,[KeyQuickLoad] + test byte[pressed+eax],1 + jz near .noquickload + mov byte[GUIcmenupos],0 + loadmenuopen 1 +.noquickload + mov esi,pressed + mov ecx,64+32+8 +.pclear + mov dword[esi],0 + add esi,4 + dec ecx + jnz .pclear + mov byte[pressed+1],2 + mov byte[GUIescpress],1 + + ; set Video cursor location + xor eax,eax + mov al,[cvidmode] + mov [GUIcurrentvideocursloc],eax + mov ebx,[NumVideoModes] + sub ebx,5 + cmp eax,ebx + jbe .noof + mov eax,ebx +.noof + mov [GUIcurrentvideoviewloc],eax + + ; change to sram dir + mov dl,[SRAMDrive] + mov ebx,SRAMDir + call Change_Dir + + call SaveSramData + + cmp byte[SFXSRAM],0 + je .nosfxsram + clim + mov edx,fnames+1 + call Create_File + jc .nosfxramwrite + mov bx,ax + mov ecx,65536 + mov edx,[sfxramdata] + call Write_File + call Close_File +.nosfxramwrite + stim +.nosfxsram + call GUIQuickLoadUpdate + call LoadDetermine + ; change dir to LoadDrive/LoadDir + mov dl,[LoadDrive] + mov ebx,LoadDir + call Change_Dir + + cmp byte[NetFilename],0 + je near .nofilenamenet + cmp byte[NetChatFirst],0 + je near .filenamenetb + mov ebx,NetFilename + xor ecx,ecx +.fnetloop + cmp byte[ebx],'\' + jne .fnetloopb + mov ecx,ebx +.fnetloopb + inc ebx + cmp byte[ebx],0 + jne .fnetloop + or ecx,ecx + jz near .nofilenamenet + mov byte[ecx],0 + push ecx + mov dl,[LoadDrive] + cmp byte[NetFilename+1],':' + jne .nodrivenetb + mov dl,[NetFilename] + sub dl,'A' +.nodrivenetb + mov ebx,NetFilename + call Change_Dir + pop ecx + mov ebx,NetFilename + inc ecx +.nextnetl + mov al,[ecx] + mov [ebx],al + inc ecx + inc ebx + or al,al + jnz .nextnetl + jmp .nofilenamenet +.filenamenetb + mov dl,[LoadDrive] + cmp byte[NetFilename+1],':' + jne .nodrivenet + mov dl,[NetFilename] + sub dl,'A' +.nodrivenet + mov ebx,NetFilename + call Change_Dir + mov byte[NetFilename],0 +.nofilenamenet + cmp byte[NetServer],0 + je .noserverclient + mov byte[CNetType],15 + mov byte[ModemProcess],40 + cmp byte[NetServer],2 + jne .noclient + mov byte[ModemProcess],41 +.noclient + mov byte[NetServer],0 + mov byte[WhichRemote],4 + mov byte[GUIcmenupos],0 + mov byte[GUIcrowpos],0 + call loadnetopen +.noserverclient + cmp byte[NetNewNick],0 + je .nonewnick + mov ebx,NetNewNick + mov ecx,ChatNick +.nickloop + mov al,[ebx] + mov [ecx],al + inc ebx + inc ecx + or al,al + jnz .nickloop + mov byte[NetNewNick],0 +.nonewnick + +;NEWSYM NetChatFirst, db 0 +;NEWSYM NetServer, db 0 +;NEWSYM NetQuitAfter, db 0 +;NEWSYM NetNewNick, times 16 db 0 +;NEWSYM NetFilename, times 512 db 0 + + cmp byte[CNetType],20 + je near .noautostate + cmp byte[AutoState],0 + je .noautostate + cmp byte[romloadskip],0 + jne .noautostate + call SaveSecondState +.noautostate + + GUIInitIRQs + + cmp byte[CNetType],20 + jne near .nostat20 + test byte[NetQuit],80h + jnz near .nostat20 + mov byte[GUIcmenupos],0 + mov byte[GUIcrowpos],0 + call loadnetopen +%ifdef __MSDOS__ + cmp byte[WhichRemote],1 + jne .yesdcd + call ModemCheckDCD + cmp al,1 + jne near .nostat20 +.yesdcd +%endif + + mov byte[RestoreValues],1 + pushad + mov dword[CBackupPos],0 + call BackupCVFrame + popad + + call DisableSUDPPacket + call Wait1SecWin + ; sync + call PreparePacket + mov al,254 + call RemoteSendChar + call SendPacket + call PreparePacket + mov al,254 + call RemoteSendChar + call SendPacket + call PreparePacket + mov al,254 + call RemoteSendChar + call SendPacket + call PreparePacket + mov al,254 + call RemoteSendChar + call SendPacket + mov dword[ModemPTimer],4*32 +.nochar + pushad + call JoyRead + popad + call RemoteGetChar + cmp dword[ModemPTimer],0 + je near .nostat20 + cmp dh,0 + je .nochar + cmp dl,254 + jne .nochar + call PreparePacket + mov al,253 + call RemoteSendChar + call SendPacket +.nocharc + pushad + call JoyRead + popad + call RemoteGetChar + cmp dword[ModemPTimer],0 + je near .nostat20 + cmp dh,0 + je .nocharc + cmp dl,253 + jne .nocharc + call PreparePacket + mov al,1 + call RemoteSendChar + call SendPacket + call ClearUDPStuff + + mov byte[RemoteCommand],1 + mov byte[HoldCommand],1 + cmp byte[NetLoadState],1 + jne .notreceive + mov byte[CNetType],22 +.noreceivestate + pushad + call JoyRead + popad + call RemoteGetChar + cmp dh,0 + je .noreceivestate + cmp dl,14 + jne .noreceivestate + call loadstaterecvinit +.notreceive + cmp byte[NetLoadState],2 + jne .notsend + call NetLoadStuff +.notsend +.nostat20 + + cmp byte[GUIwinptr],0 + jne .nomenuopen + cmp byte[lastcursres],1 + je .nomenuchange + mov byte[GUIcmenupos],2 + mov byte[GUIcrowpos],0 + mov dword[GUICYLocPtr],MenuDat2 + cmp byte[lastcursres],0 + je .nomenuchange +.nomenuopen + mov byte[GUIcmenupos],0 +.nomenuchange + cmp byte[GUIwinactiv+1],0 + je .noloadrefresh + call GetLoadData +.noloadrefresh + mov byte[GUIHold],0 + ; clear 256 bytes from hirestiledat + mov esi,hirestiledat + mov ecx,256 +.loophires + mov byte[esi],0 + inc esi + dec ecx + jnz .loophires + mov byte[curblank],00h + call InitGUI + + cmp byte[CheatWinMode],0 + je near .csskip + ; change to sram dir + mov dl,[SRAMDrive] + mov ebx,SRAMDir + call Change_Dir + + ; Load Cheat Search File + mov edx,cstempfname + call Open_File + jc .csskipb + mov bx,ax + mov edx,[vidbuffer] + add edx,129600 + mov ecx,65536*2+32768 + call Read_File + call Close_File + +.csskipb + ; change dir to LoadDrive/LoadDir + mov dl,[LoadDrive] + mov ebx,LoadDir + call Change_Dir +.csskip + + mov byte[GUIQuit],0 +.nokey + cmp byte[CNetType],21 + je .noquit + cmp byte[CNetType],22 + jne .yesquit +.noquit + mov byte[GUIQuit],0 +.yesquit + cmp byte[GUIQuit],2 + je near .exit + cmp byte[GUIQuit],1 + je near .exitgui + mov byte[GUIQuit],0 + cmp byte[MouseDis],1 + je .mousedis2 + call ProcessMouse + cmp byte[videotroub],1 + jne .notrouble + ret +.notrouble +.mousedis2 + call GUIUnBuffer + cmp byte[CNetType],20 + je .nowater + cmp byte[CNetType],21 + je .nowater + cmp byte[CNetType],22 + je .nowater + cmp byte[GUIEffect],1 + jne .nosnow + call DrawSnow +.nosnow + cmp byte[GUIEffect],2 + jne .nowater + call DrawWater +.nowater + cmp byte[GUIEffect],3 + jne .nowater2 + call DrawWater +.nowater2 + cmp byte[GUIEffect],4 + jne .nosmoke +; call DrawSmoke + call DrawBurn +.nosmoke +; call TestSent + cmp byte[CNetType],20 + jne .noreceive + + cmp byte[NetChatFirst],0 + je .noloadbeforechat + mov eax,NetFilename + call GUIloadfilename.nocnettype + mov byte[sramsavedis],1 + call transfersram + mov byte[NetChatFirst],0 +.noloadbeforechat + + cmp byte[GUIcmenupos],0 + jne .nomenuout2 + cmp byte[GUIwinptr],0 + jne .nomenuout2 + cmp byte[netlastloaded],1 + je .openmenu + mov byte[GUIcmenupos],2 + mov byte[GUIcrowpos],0 + jmp .nomenuout2 +.openmenu + mov byte[netlastloaded],0 + call loadnetopen +.nomenuout2 + call RemoteGetChar + cmp dh,0 + jne .received + mov dl,1 +.received + call ProcessRemoteCommand + jmp .noreceive2 +.noreceive + mov byte[HoldCommand],0 +.noreceive2 + + cmp byte[CNetType],21 + jne .noloadstatesend + call loadstatesend +.noloadstatesend + cmp byte[CNetType],22 + jne .noloadstaterecv + call loadstaterecv +.noloadstaterecv + + cmp byte[CNetType],15 + je .modem + cmp byte[CNetType],12 + je .modem + cmp byte[CNetType],11 + je .modem + cmp byte[CNetType],10 + jne near .nomodem +.modem + call ProcessModem +%ifdef __MSDOS__ + cmp byte[Connected],1 + je near .nomodem + call ModemGetChar + cmp dh,0 + je .nomodem + cmp byte[ModemOKStat],0 + jne .foundokay + mov byte[ModemOKStat],1 + jmp .skipstat +.foundokay + cmp byte[ModemOKStat],1 + jne .nostat0 + cmp dl,13 + jne .nostat0 + inc byte[ModemOKStat] + jmp .skipstat +.nostat0 + cmp byte[ModemOKStat],2 + jne .nostat1 + cmp dl,'O' + jne .nostat1 + inc byte[ModemOKStat] + jmp .skipstat +.nostat1 + cmp byte[ModemOKStat],3 + jne .nostat2 + cmp dl,'K' + jne .nostat2 + inc byte[ModemOKStat] + jmp .skipstat +.nostat2 +.skipstat + mov dh,0 + call NetAddChar +%endif +.nomodem + + cmp dword[GUIEditStringcWin],0 + je .noblink + cmp dword[GUIEditStringcLen],0 + je .noblink + mov eax,[GUIEditStringcLen] + cmp dword[GUIEditStringLTxt],8 + jb .noblinka + mov byte[eax],'_' + mov byte[eax+1],0 + mov dword[GUIEditStringLstb],1 +.noblinka + cmp dword[GUIEditStringLTxt],0 + jne .noblink + mov dword[GUIEditStringLTxt],16 +.noblink + + call DisplayBoxes + + cmp dword[GUIEditStringLstb],1 + jne .notblinked + mov dword[GUIEditStringLstb],0 + mov eax,[GUIEditStringcLen] + mov byte[eax],0 +.notblinked + + call DisplayMenu + cmp byte[MouseDis],1 + je .mousedis3 + call DrawMouse +.mousedis3 + cmp byte[FirstTimeData],0 + jne .nofirsttime + call guifirsttimemsg + mov byte[FirstTimeData],1 +.nofirsttime + cmp dword[GUICTimer],0 + je .notimer + GUIOuttext 21,211,[GUICMessage],50 + GUIOuttext 20,210,[GUICMessage],63 +.notimer + call vidpastecopyscr + call GUIgetcurrentinput + jmp .nokey + +.exitgui + cmp byte[CNetType],20 + jne near .nostat20b2 + call PreparePacket + mov al,255 + call RemoteSendChar + call SendPacket + call PreparePacket + mov al,255 + call RemoteSendChar + call SendPacket + call PreparePacket + mov al,255 + call RemoteSendChar + call SendPacket +.nostat20b2 + + GUIDeInitIRQs + + mov ax,[PrevResoln] + mov [resolutn],ax + jmp endprog +.exit + mov edi,[spcBuffera] + mov ecx,65536 + xor eax,eax + rep stosd + mov edi,spcRamcmp + mov ecx,65536/4 + xor eax,eax + rep stosd + GUIDeInitIRQs + call ClearScreen + cmp byte[cbitmode],0 + jne .nomakepal + call makepal +.nomakepal + mov word[t1cc],1 + + mov byte[chaton],0 + mov dword[chatstrL],0 + mov dword[chatLpos],0 + mov dword[chatstrR],0 + mov dword[chatRTL],0 + + cmp byte[CNetType],20 + jne near .nostat20b + + mov al,10 + sub al,[Latency] + cmp byte[Latency],4 + jb .nolatency + mov al,7 +.nolatency + mov [BackStateSize],al + + call ResetExecStuff + + mov byte[MultiTap],1 + cmp byte[pl3neten],0 + jne .mtap + cmp byte[pl4neten],0 + jne .mtap + cmp byte[pl5neten],0 + jne .mtap +.nomtap + mov byte[MultiTap],0 +.mtap + + cmp byte[RestoreValues],1 + jne .norestoreval + pushad + mov dword[PBackupPos],0 + call RestoreCVFrame + popad +.norestoreval + + mov dword[nmiprevaddrl],0 + mov dword[nmiprevaddrh],0 + mov dword[nmirept],0 + mov dword[nmiprevline],224 + mov dword[nmistatus],0 + mov dword[spcnumread],0 + mov dword[spchalted],-1 + mov byte[NextLineCache],0 + mov byte[DSPMem+08h],0 + mov byte[DSPMem+18h],0 + mov byte[DSPMem+28h],0 + mov byte[DSPMem+38h],0 + mov byte[DSPMem+48h],0 + mov byte[DSPMem+58h],0 + mov byte[DSPMem+68h],0 + mov byte[DSPMem+78h],0 + + mov byte[netdelayed],0 + mov dword[cnetptrhead],0 + mov dword[cnetptrtail],0 + mov dword[prevp1net],0 + mov dword[prevp2net],0 + mov dword[prevp3net],0 + mov dword[prevp4net],0 + mov dword[prevp5net],0 + mov byte[BackState],1 + mov dword[CBackupPos],0 + mov dword[PBackupPos],0 + mov dword[PPValue],0 + mov dword[DPValue],0 + mov byte[CurRecv],0 + mov dword[NetQuitter],0 + mov dword[LatencyV],0 + mov dword[LatencyV+4],0 + mov dword[LatencyV+8],0 + mov dword[LatencyV+12],0 + mov dword[LatencyRecvPtr],0 + mov dword[LatencySendPtr],0 + + mov eax,cnetplaybuf + mov ecx,512 +.loop20 + mov byte[eax],0 + inc eax + dec ecx + jnz .loop20 + mov al,[Latency] + mov [LatencyLeft],al + mov byte[NetSwap],0 + + mov dword[CBackupPos],0 + mov dword[PBackupPos],0 + + mov ebx,[romdata] + mov ecx,[NumofBanks] + shl ecx,15 + xor eax,eax + or ecx,ecx + jz .nocsumloop +.csumloop + add al,[ebx] + adc ah,0 + inc ebx + dec ecx + jnz .csumloop +.nocsumloop + mov [CheckSumVal],eax + + mov ebx,eax + ; sync with modem + call PreparePacket + mov al,30 + call RemoteSendChar + mov al,230 + call RemoteSendChar + mov al,[CheckSumVal] + call RemoteSendChar + mov al,[CheckSumVal+1] + call RemoteSendChar + call SendPacket +.nocharb + pushad + call JoyRead + popad +; cmp byte[pressed+1],1 +; je near .faileda + + call RemoteGetChar + cmp dh,0 + je .nocharb + cmp dl,230 + jne .nocharb +.nocharb2 + call RemoteGetChar + cmp dh,0 + je .nocharb2 + cmp dl,[CheckSumVal] + jne .wrongcs +.nocharb3 + call RemoteGetChar + cmp dh,0 + je .nocharb3 + cmp dl,[CheckSumVal+1] + je .okaychat +.wrongcs + mov esi,WrongCheckSum + call WritetochatBuffer + jmp StartGUI +.okaychat + call PreparePacket + mov al,229 + call RemoteSendChar + call SendPacket +.nocharb5 + pushad + call JoyRead + popad +; cmp byte[pressed+1],1 +; je near .failedb + + call RemoteGetChar + cmp dh,0 + je .nocharb5 + cmp dl,229 + jne .nocharb5 +.nostat20b + call EnableSUDPPacket + + mov byte[ChatProgress],0 + mov dword[RecvProgress],0 + + ; get LoadDrive/LoadDir + mov ebx,LoadDir + mov edx,LoadDrive + call Get_Dir + + ; change dir to InitDrive/InitDir + mov dl,[InitDrive] + mov ebx,InitDir + ; save config + call Change_Dir + call createnewcfg + call GUISaveVars + + ; change dir to SRAMDrive/SRAMDir + mov dl,[SRAMDrive] + mov ebx,SRAMDir + call Change_Dir + + mov byte[MousePRClick],1 + mov byte[prevbright],0 + mov ax,[PrevResoln] + mov [resolutn],ax + + mov byte[CheatOn],0 + cmp dword[NumCheats],0 + je .nocheats + mov byte[CheatOn],1 +.nocheats + + cmp byte[CopyRamToggle],1 + jne .nocopyram + mov byte[CopyRamToggle],0 + mov eax,dword[vidbuffer] + add eax,129600 + ; copy 128k ram + mov ebx,[wramdata] + mov ecx,32768 +.loopcr + mov edx,[ebx] + mov [eax],edx + add ebx,4 + add eax,4 + dec ecx + jnz .loopcr +.nocopyram + + cmp byte[CheatWinMode],2 + jne .notview + mov byte[CheatWinMode],1 +.notview + + cmp byte[CheatWinMode],0 + je .csskip2 + ; Save Cheat Search File + mov edx,cstempfname + call Create_File + jc .csskip2 + mov bx,ax + mov edx,[vidbuffer] + add edx,129600 + mov ecx,65536*2+32768 + call Write_File + call Close_File +.csskip2 + + mov edi,[vidbuffer] + mov ecx,288*120 + xor eax,eax + rep stosd + + mov ecx,256*144 + mov eax,[vidbufferofsb] +.loopcl + mov dword[eax],0 + add eax,4 + dec ecx + jnz .loopcl + + mov al,[cfgsoundon] + mov [soundon],al + mov al,[cfgStereoSound] + mov [StereoSound],al + mov al,[cfgSoundQuality] + mov [SoundQuality],al + call AdjustFrequency + mov byte[GUIOn],0 + mov byte[GUIOn2],0 + mov byte[GUIReset],0 + mov dword[StartLL],0 + mov dword[StartLR],0 + mov byte[NetLoadState],0 + jmp continueprog + +.faileda + call WinErrorA + jmp continueprog +.failedb + call WinErrorB + jmp continueprog + +SECTION .bss +CheckSumVal resd 1 +SECTION .data +WrongCheckSum db 10,13,'ROM Data Mismatch',10,13,10,13,0 +SECTION .text + + +SRAMDirc: + ; get LoadDrive/LoadDir + mov ebx,LoadDir + mov edx,LoadDrive + call Get_Dir + ; change to sram dir + mov dl,[SRAMDrive] + mov ebx,SRAMDir + call Change_Dir + ret + +LOADDir: + mov dl,[LoadDrive] + mov ebx,LoadDir + call Change_Dir + ret + +guifirsttimemsg: + xor ebx,ebx + mov ecx,256 +.a + mov byte[pressed+ebx],0 + inc ebx + dec ecx + jnz .a + mov byte[pressed+2Ch],0 +.again + GUIBox 43,75,213,163,160 + GUIBox 43,75,213,75,162 + GUIBox 43,75,43,163,161 + GUIBox 213,75,213,163,159 + GUIBox 43,163,213,163,158 + GUIOuttext 56,81,guiftimemsg1,220-15 + GUIOuttext 55,80,guiftimemsg1,220 + GUIOuttext 56,96,guiftimemsg2,220-15 + GUIOuttext 55,95,guiftimemsg2,220 + GUIOuttext 56,104,guiftimemsg3,220-15 + GUIOuttext 55,103,guiftimemsg3,220 + GUIOuttext 56,112,guiftimemsg4,220-15 + GUIOuttext 55,111,guiftimemsg4,220 + GUIOuttext 56,120,guiftimemsg5,220-15 + GUIOuttext 55,119,guiftimemsg5,220 + GUIOuttext 56,128,guiftimemsg6,220-15 + GUIOuttext 55,127,guiftimemsg6,220 + GUIOuttext 56,136,guiftimemsg7,220-15 + GUIOuttext 55,135,guiftimemsg7,220 + GUIOuttext 56,151,guiftimemsg8,220-15 + GUIOuttext 55,150,guiftimemsg8,220 + call vidpastecopyscr + call GUIUnBuffer + call DisplayBoxes + call DisplayMenu + call JoyRead + cmp byte[pressed+2Ch],0 + jne .pressedokay + jmp .again +.pressedokay +.again2 + call Check_Key + or al,al + jz .nokey + call Get_Key + jmp .again2 +.nokey + cmp byte[MouseDis],1 + je .mousedis2 + push ebx +; mov eax,0Bh +; int 33h + pop ebx +.mousedis2 + ret + +SECTION .data +guiftimemsg1 db 'ONE TIME USER REMINDER :',0 +guiftimemsg2 db 'PLEASE BE SURE TO READ',0 +guiftimemsg3 db 'GUINOTES.TXT FOR AN',0 +guiftimemsg4 db 'IMPORTANT REMINDER.',0 +guiftimemsg5 db 'ALSO, WHENEVER YOU HAVE',0 +guiftimemsg6 db 'PROBLEMS, BE SURE TO READ',0 +guiftimemsg7 db 'ZSNES.FAQ AND README.TXT',0 +guiftimemsg8 db 'PRESS "Z" TO CONTINUE.',0 +SECTION .text + +guimustrestartmsg: + xor ebx,ebx + mov ecx,256 +.a + cmp byte[pressed+ebx],1 + jne .npr1 + mov byte[pressed+ebx],2 +.npr1 + inc ebx + dec ecx + jnz .a + mov byte[pressed+2Ch],0 +.again + GUIBox 43,87,213,151,160 + GUIBox 43,87,213,87,162 + GUIBox 43,87,43,151,161 + GUIBox 213,87,213,151,159 + GUIBox 43,151,213,151,158 + GUIOuttext 56,92,guiqtimemsg1,220-15 + GUIOuttext 55,91,guiqtimemsg1,220 + GUIOuttext 56,100,guiqtimemsg2,220-15 + GUIOuttext 55,99,guiqtimemsg2,220 + GUIOuttext 56,108,guiqtimemsg3,220-15 + GUIOuttext 55,107,guiqtimemsg3,220 + GUIOuttext 56,116,guiqtimemsg4,220-15 + GUIOuttext 55,115,guiqtimemsg4,220 + GUIOuttext 56,139,guiqtimemsg8,220-15 + GUIOuttext 55,138,guiqtimemsg8,220 + call vidpastecopyscr + call GUIUnBuffer + call DisplayBoxes + call DisplayMenu + call JoyRead + + mov byte[pressed+2Ch],0 + + call JoyRead + xor ebx,ebx + mov ecx,256+128+64 +.b + cmp byte[pressed+ebx],1 + je .pressedokay + inc ebx + dec ecx + jnz .b + jmp .again +.pressedokay +.again2 + call Check_Key + or al,al + jz .nokey + call Get_Key + jmp .again2 +.nokey + cmp byte[MouseDis],1 + je .mousedis2 + push ebx +; mov eax,0Bh +; int 33h + pop ebx +.mousedis2 + mov byte[GUIQuit],1 + ret + +SECTION .data +guiqtimemsg1 db 'ZSNES MUST BE RESTARTED',0 +guiqtimemsg2 db 'TO USE THIS OPTION.',0 +guiqtimemsg3 db 'THIS PROGRAM WILL NOW',0 +guiqtimemsg4 db 'EXIT.',0 +guiqtimemsg8 db 'PRESS ANY KEY.',0 +SECTION .text + +guiprevideo: + xor ebx,ebx + mov ecx,256 +.a + mov byte[pressed+ebx],0 + inc ebx + dec ecx + jnz .a + call GUIUnBuffer + call DisplayBoxes + call DisplayMenu + GUIBox 43,90,213,163,160 + GUIBox 43,90,213,90,162 + GUIBox 43,90,43,163,161 + GUIBox 213,90,213,163,159 + GUIBox 43,163,213,163,158 + GUIOuttext 56,96,guiprevidmsg1,220-15 + GUIOuttext 55,95,guiprevidmsg1,220 + GUIOuttext 56,104,guiprevidmsg2,220-15 + GUIOuttext 55,103,guiprevidmsg2,220 + GUIOuttext 56,112,guiprevidmsg3,220-15 + GUIOuttext 55,111,guiprevidmsg3,220 + GUIOuttext 56,120,guiprevidmsg4,220-15 + GUIOuttext 55,119,guiprevidmsg4,220 + GUIOuttext 56,128,guiprevidmsg5,220-15 + GUIOuttext 55,127,guiprevidmsg5,220 + GUIOuttext 56,136,guiprevidmsg6,220-15 + GUIOuttext 55,135,guiprevidmsg6,220 + GUIOuttext 56,151,guiprevidmsg7,220-15 + GUIOuttext 55,150,guiprevidmsg7,220 + call vidpastecopyscr + mov byte[pressed+2Ch],0 +.again + call JoyRead + xor ebx,ebx + mov ecx,256+128+64 +.b + cmp byte[pressed+ebx],0 + jne .pressedokay + inc ebx + dec ecx + jnz .b + cmp byte[MouseDis],1 + je .mousedis + call Get_MouseData + test bx,01h + jnz .pressedokay +.mousedis + jmp .again +.pressedokay +.again2 + call Check_Key + or al,al + jz .nokey + call Get_Key + jmp .again2 +.nokey + cmp byte[MouseDis],1 + je .mousedis2 + push ebx +; mov eax,0Bh +; int 33h + pop ebx +.mousedis2 + ret + +SECTION .data +guiprevidmsg1 db 'ZSNES WILL NOW ATTEMPT',0 +guiprevidmsg2 db 'TO CHANGE YOUR VIDEO',0 +guiprevidmsg3 db 'MODE. IF THE CHANGE',0 +guiprevidmsg4 db 'IS UNSUCCESSFUL, WAIT',0 +guiprevidmsg5 db '10 SECONDS AND VIDEO',0 +guiprevidmsg6 db 'MODE WILL BE RESET',0 +guiprevidmsg7 db 'PRESS ANY KEY',0 +SECTION .text + +guipostvideo: + mov ecx,255*144 + mov eax,[vidbufferofsb] +.loop + mov dword[eax],0FFFFFFFFh + add eax,4 + dec ecx + jnz .loop + + xor ebx,ebx + mov ecx,256 +.a + mov byte[pressed+ebx],0 + inc ebx + dec ecx + jnz .a + mov dword[GUIkeydelay],36*10 + +.pressedfail + call GUIUnBuffer + call DisplayBoxes + call DisplayMenu + GUIBox 43,90,213,163,160 + GUIBox 43,90,213,90,162 + GUIBox 43,90,43,163,161 + GUIBox 213,90,213,163,159 + GUIBox 43,163,213,163,158 + GUIOuttext 56,96,guipostvidmsg1,220-15 + GUIOuttext 55,95,guipostvidmsg1,220 + GUIOuttext 56,151,guipostvidmsg2,220-15 + GUIOuttext 55,150,guipostvidmsg2,220 + call vidpastecopyscr + ; Wait for all mouse and input data to be 0 + + call JoyRead + xor ebx,ebx + mov ecx,256+128+64 +.b2 + cmp byte[pressed+ebx],0 + jne near .pressedfail + inc ebx + dec ecx + jnz .b2 + cmp byte[MouseDis],1 + je .mousedis3 + call Get_MouseData + test bx,01h + jnz near .pressedfail +.mousedis3 + +.again + call JoyRead + xor ebx,ebx + mov ecx,256+128+64 +.b + cmp byte[pressed+ebx],0 + jne .pressedokay + inc ebx + dec ecx + jnz .b + cmp byte[MouseDis],1 + je .mousedis + call Get_MouseData + test bx,01h + jnz .pressedokay +.mousedis + cmp dword[GUIkeydelay],0 + je .pressedokay + jmp .again +.pressedokay +.again2 + call Check_Key + or al,al + jz .nokey + call Get_Key + jmp .again2 +.nokey + cmp byte[MouseDis],1 + je .mousedis2 + push ebx +; mov eax,0Bh +; int 33h + pop ebx +.mousedis2 + mov byte[GUIpclicked],1 + ret + +SECTION .data +guipostvidmsg1 db 'VIDEO MODE CHANGED.',0 +guipostvidmsg2 db 'PRESS ANY KEY',0 +SECTION .text + +guipostvideofail: + mov dword[guipostvidptr],guipostvidmsg3b + mov byte[guipostvidmsg3b],0 + mov byte[guipostvidmsg4b],0 + mov byte[guipostvidmsg5b],0 + mov eax,[ErrorPointer] + mov ebx,eax +.loop + cmp byte[ebx],0 + je .found + cmp byte[ebx],'$' + je .found + inc ebx + jmp .loop +.found + mov edx,ebx + sub edx,eax +.detnext + or edx,edx + jz .notext + cmp edx,25 + jbe .copytext +.nospace + dec edx + cmp byte[eax+edx],32 + jne .nospace + jmp .detnext +.copytext + push ebx + mov ecx,[guipostvidptr] +.copytextloop + mov bl,[eax] + cmp bl,'$' + jne .notdol + mov bl,0 +.notdol + mov [ecx],bl + inc eax + inc ecx + dec edx + jnz .copytextloop + mov byte[ecx],0 + pop ebx + add dword[guipostvidptr],26 + cmp byte[eax],0 + je .notext + cmp byte[eax],'$' + je .notext + inc eax + jmp .found +.notext + + xor ebx,ebx + mov ecx,256 +.a + mov byte[pressed+ebx],0 + inc ebx + dec ecx + jnz .a + call GUIUnBuffer + call DisplayBoxes + call DisplayMenu + GUIBox 43,90,213,163,160 + GUIBox 43,90,213,90,162 + GUIBox 43,90,43,163,161 + GUIBox 213,90,213,163,159 + GUIBox 43,163,213,163,158 + GUIOuttext 56,96,guipostvidmsg1b,220-15 + GUIOuttext 55,95,guipostvidmsg1b,220 + GUIOuttext 56,108,guipostvidmsg2b,220-15 + GUIOuttext 55,107,guipostvidmsg2b,220 + GUIOuttext 56,119,guipostvidmsg3b,220-15 + GUIOuttext 55,118,guipostvidmsg3b,220 + GUIOuttext 56,129,guipostvidmsg4b,220-15 + GUIOuttext 55,128,guipostvidmsg4b,220 + GUIOuttext 56,139,guipostvidmsg5b,220-15 + GUIOuttext 55,138,guipostvidmsg5b,220 + GUIOuttext 56,152,guipostvidmsg8b,220-15 + GUIOuttext 55,151,guipostvidmsg8b,220 + call vidpastecopyscr + call GUIUnBuffer + call DisplayBoxes + call DisplayMenu +%ifndef __LINUX__ + mov dword[GUIkeydelay],0FFFFFFFFh +%else + mov dword[GUIkeydelay],0x0 +%endif + jmp guipostvideo.pressedfail + +SECTION .data +guipostvidmsg1b db 'VIDEO MODE CHANGE FAILED.',0 +guipostvidmsg2b db 'UNABLE TO INIT VESA2:',0 +guipostvidmsg3b db 'AAAAAAAAAAAAAAAAAAAAAAAAA',0 +guipostvidmsg4b db 'AAAAAAAAAAAAAAAAAAAAAAAAA',0 +guipostvidmsg5b db 'AAAAAAAAAAAAAAAAAAAAAAAAA',0 +guipostvidmsg8b db 'PRESS ANY KEY',0 +SECTION .bss +guipostvidptr resd 1 +SECTION .text + +GUILoadManualDir + mov ebx,GUILoadTextA + mov [ManualCPtr],ebx + cmp byte[ebx],0 + je near .nofindfile + xor eax,eax +.next + cmp byte[ebx],':' + jne .nocolon + mov eax,ebx +.nocolon + inc ebx + cmp byte[ebx],0 + jne .next + or eax,eax + jz .nomorecolon + cmp eax,GUILoadTextA + je .invalidcolon + mov bl,[eax-1] + cmp bl,'a' + jb .nolower + cmp bl,'z' + ja .nolower + sub bl,'a'-'A' +.nolower + cmp bl,'A' + jb .invalidcolon + cmp bl,'Z' + ja .invalidcolon + sub bl,'A' + mov dl,bl + push eax + call Change_Drive + pop eax + mov byte[ManualStatus],1 +.invalidcolon + inc eax + mov [ManualCPtr],eax +.nomorecolon + mov ebx,[ManualCPtr] + cmp byte[ebx],0 + je near .finish + xor eax,eax +.next2 + cmp byte[ebx],'\' + jne .nobackslash + mov eax,ebx +.nobackslash + inc ebx + cmp byte[ebx],0 + jne .next2 + or eax,eax + jz .finish + inc eax + mov cl,[eax] + mov byte[eax],0 + push ecx + push eax + mov edx,[ManualCPtr] + call Change_Single_Dir + jc .nosuchdir + mov byte[ManualStatus],1 +.nosuchdir + pop eax + pop ecx + mov [eax],cl + mov [ManualCPtr],eax +.finish + mov edx,[ManualCPtr] + call Change_Single_Dir + jc .notdir + mov byte[ManualStatus],1 + jmp .nomoredir +.notdir + call .nomoredir + mov edx,[ManualCPtr] + cmp byte[edx],0 + je .nofindfile + ; otherwise set ManualStatus to 2 + mov byte[ManualStatus],2 + mov dword[GUIcurrentfilewin],0 +.nofindfile + ret +.nomoredir + ; refresh dir if necessary + cmp byte[ManualStatus],1 + jne .norefresh + call GetLoadData.a +.norefresh + ret + +SECTION .bss +ManualCPtr resd 1 +ManualStatus resb 1 + +NEWSYM MovieCounter, resd 1 + +SECTION .data +UnableMovie2 db 'MUST PLAY WITH SOUND OFF',0 +UnableMovie3 db 'MUST PLAY WITH SOUND ON',0 + +SECTION .text + +MoviePlay: + cmp byte[CNetType],20 + je near .dontplay + mov byte[GUICBHold],0 + mov dword[MovieCounter],0 + cmp byte[MovieProcessing],0 + jne near .dontplay + mov byte[GUIQuit],2 + mov ebx,[statefileloc] + mov eax,[fnamest+ebx-3] + push eax + mov dword[fnamest+ebx-3],'.zmv' + mov al,[CMovieExt] + mov byte[fnamest+ebx],al + call ChangetoSRAMdir + mov dword[Totalbyteloaded],0 + call loadstate2 + mov edx,fnamest+1 + call Open_File + jc near .notexist + mov bx,ax + mov [MovieFileHand],bx + mov cx,[Totalbyteloaded+2] + mov dx,[Totalbyteloaded] + call File_Seek + mov edx,RecData + mov ecx,16 + call Read_File + cmp byte[RecData+2],1 + jne .noextra + mov eax,[RecData+3] + mov [timer2upd],eax + mov eax,[RecData+7] + mov [curexecstate],eax + mov dword[nmiprevaddrl],0 + mov dword[nmiprevaddrh],0 + mov dword[nmirept],0 + mov dword[nmiprevline],224 + mov dword[nmistatus],0 + mov dword[spcnumread],0 + mov dword[spchalted],-1 + mov byte[NextLineCache],0 +.noextra + mov al,[RecData] + cmp al,[soundon] + jne near .soundisoff + cmp dword[ramsize],0 + je .noram + mov edx,[sram] + mov ecx,[ramsize] + call Read_File +.noram + mov byte[MovieProcessing],1 +.skip + mov dword[PJoyAOrig],0 + mov dword[PJoyBOrig],0 + mov dword[PJoyCOrig],0 + mov dword[PJoyDOrig],0 + mov dword[PJoyEOrig],0 + mov byte[sramsavedis],1 + mov byte[UseRemoteSRAMData],0 + mov byte[DSPMem+08h],0 + mov byte[DSPMem+18h],0 + mov byte[DSPMem+28h],0 + mov byte[DSPMem+38h],0 + mov byte[DSPMem+48h],0 + mov byte[DSPMem+58h],0 + mov byte[DSPMem+68h],0 + mov byte[DSPMem+78h],0 +.notexist + call ChangetoLOADdir + pop eax + mov ebx,[statefileloc] + mov [fnamest+ebx-3],eax +.dontplay + ret +.soundisoff + mov dword[Msgptr],UnableMovie2 + cmp byte[soundon],0 + jne .soundon + mov dword[Msgptr],UnableMovie3 +.soundon + mov eax,[MsgCount] + mov [MessageOn],eax + call Close_File + pop eax + ret + +SECTION .bss +NEWSYM Totalbyteloaded, resd 1 +NEWSYM sramsavedis, resb 1 + +SECTION .data +DevicePtr dd pl1selk,pl2selk,pl3selk,pl4selk,pl5selk + +SECTION .text + +CheckMenuItemHelp: + mov al,[GUIcmenupos] + mov [GUIpmenupos],al + mov byte[GUIcmenupos],0 + cmp byte[GUIwinactiv+edx],1 + je .menuontop + xor eax,eax + mov al,[GUIwinptr] + inc byte[GUIwinptr] + mov byte[GUIwinorder+eax],dl + mov byte[GUIwinactiv+edx],1 + cmp byte[resetposn],1 + jne .nomenuitem + mov eax,[GUIwinposxo+edx*4] + mov [GUIwinposx+edx*4],eax + mov eax,[GUIwinposyo+edx*4] + mov [GUIwinposy+edx*4],eax + jmp .nomenuitem +.menuontop + xor eax,eax + ; look for match +.notfoundyet + mov bl,byte[GUIwinorder+eax] + cmp bl,dl + je .nextfind + inc eax + jmp .notfoundyet +.nextfind + inc eax + cmp al,[GUIwinptr] + je .foundend + mov cl,[GUIwinorder+eax] + mov [GUIwinorder+eax-1],cl + jmp .nextfind +.foundend + mov byte[GUIpclicked],0 + mov [GUIwinorder+eax-1],bl +.nomenuitem + ret + +%macro GUICheckMenuItem 2 + mov edx,%1 + cmp byte[GUIcrowpos],%2 + jne near %%nomenuitem + call CheckMenuItemHelp +%%nomenuitem +%endmacro + +%macro checkqloadvalue 1 + cmp byte[GUIcrowpos],%1 + jne %%skip + mov esi,prevloaddnamel+%1*512 + cmp byte[esi+1],0 + je %%notvalid + mov edi,prevloadfnamel+%1*512 + mov ebx,prevloadnames+%1*16 + mov ecx,%1 + call loadquickfname +%%notvalid + ret +%%skip +%endmacro + +GUITryMenuItem: + cmp byte[GUIcmenupos],1 + jne near .noquickload + checkqloadvalue 0 + checkqloadvalue 1 + checkqloadvalue 2 + checkqloadvalue 3 + checkqloadvalue 4 + checkqloadvalue 5 + checkqloadvalue 6 + checkqloadvalue 7 + checkqloadvalue 8 + checkqloadvalue 9 + cmp byte[GUIcrowpos],11 + jne .skipswitch + xor byte[prevlfreeze],1 + cmp byte[prevlfreeze],0 + je .off + mov byte[GUIPrevMenuData.onoff+15],'O' + mov byte[GUIPrevMenuData.onoff+16],'N' + mov byte[GUIPrevMenuData.onoff+17],' ' + jmp .on +.off + mov byte[GUIPrevMenuData.onoff+15],'O' + mov byte[GUIPrevMenuData.onoff+16],'F' + mov byte[GUIPrevMenuData.onoff+17],'F' +.on +.skipswitch + cmp byte[GUIcrowpos],12 + jne .skipclear + cmp byte[prevlfreeze],0 + jne .skipclear + mov edi,prevloadnames + mov eax,20202020h + mov ecx,4*10 + rep stosd + mov edi,prevloaddnamel + xor eax,eax + mov ecx,128*10 + rep stosd + mov edi,prevloadfnamel + mov eax,0 ;20202020h + mov ecx,128*10 + rep stosd + call GUIQuickLoadUpdate + ret +.skipclear +.noquickload + cmp byte[GUIcmenupos],2 + jne near .nomain + GUICheckMenuItem 1, 0 ; Load + cmp byte[GUIcrowpos],0 + jne .noloadrefresh + jmp GetLoadData +.noloadrefresh + cmp byte[romloadskip],0 + jne near .noromloaded + cmp byte[GUIcrowpos],1 ; Run + jne .norun + cmp byte[romloadskip],0 + jne .dontquit + mov byte[GUIQuit],2 +.dontquit + ret +.norun + cmp byte[CNetType],21 + je near .noreset + cmp byte[CNetType],22 + je near .noreset + GUICheckMenuItem 12, 2 ; Reset + cmp byte[GUIcrowpos],2 + jne .noreset + mov byte[GUICResetPos],1 +.noreset +; cmp byte[OSPort],3 +; je .win32state +; cmp byte[CNetType],20 +; je near .noromloaded +;.win32state + cmp byte[CNetType],21 + je near .noromloaded + cmp byte[CNetType],22 + je near .noromloaded + cmp byte[GUIcrowpos],4 + jne .nosavestate + mov byte[GUIStatesText5],0 + mov byte[GUICStatePos],1 +.nosavestate + cmp byte[GUIcrowpos],5 + jne .noloadstate + mov byte[GUIStatesText5],1 + mov byte[GUICStatePos],1 +.noloadstate + GUICheckMenuItem 14, 4 ; Save State + GUICheckMenuItem 14, 5 ; Load State + GUICheckMenuItem 2, 6 ; Select State +.noromloaded + cmp byte[GUIcrowpos],8 + jne .noquit + mov byte[GUIQuit],1 +.noquit +.nomain + cmp byte[GUIcmenupos],3 + jne near .noconfig + GUICheckMenuItem 3, 0 + GUICheckMenuItem 3, 1 + GUICheckMenuItem 3, 2 + GUICheckMenuItem 3, 3 + GUICheckMenuItem 3, 4 + cmp byte[GUIcrowpos],0 + jne .noplay1 + mov byte[cplayernum],0 +.noplay1 + cmp byte[GUIcrowpos],1 + jne .noplay2 + mov byte[cplayernum],1 +.noplay2 + cmp byte[GUIcrowpos],2 + jne .noplay3 + mov byte[cplayernum],2 +.noplay3 + cmp byte[GUIcrowpos],3 + jne .noplay4 + mov byte[cplayernum],3 +.noplay4 + cmp byte[GUIcrowpos],4 + jne .noplay5 + mov byte[cplayernum],4 +.noplay5 + GUICheckMenuItem 17, 6 + GUICheckMenuItem 4, 8 + GUICheckMenuItem 5, 9 + GUICheckMenuItem 6, 10 +.noconfig + cmp byte[romloadskip],0 + jne near .nocheat + cmp byte[CheatBDoor],1 + je .yescheat + cmp byte[CNetType],20 + je near .nocheat + cmp byte[CNetType],21 + je near .nocheat + cmp byte[CNetType],22 + je near .nocheat +.yescheat + cmp byte[GUIcmenupos],4 + jne near .nocheat + GUICheckMenuItem 7, 0 + GUICheckMenuItem 7, 1 + GUICheckMenuItem 13, 2 + cmp byte[GUIcrowpos],0 + jne .noaddc + mov dword[GUIcurrentcheatwin],1 +.noaddc + cmp byte[GUIcrowpos],1 + jne .nobrowsec + mov dword[GUIcurrentcheatwin],0 +.nobrowsec +.nocheat + cmp byte[GUIcmenupos],5 + jne near .nonet +; cmp byte[GOSPort],3 +; je near .win32 +%ifdef __MSDOS__ + cmp byte[CNetType],10 + jae .nomod + mov byte[CNetType],0 +.nomod + GUICheckMenuItem 8, 0 + GUICheckMenuItem 8, 1 + cmp byte[CNetType],10 + jae near .nonet + cmp byte[GUIcrowpos],1 + jne .noipx + mov byte[CNetType],7 +.noipx + cmp byte[GUIcrowpos],0 + jne near .nonet + mov byte[CNetType],1 + jmp .nonet +%endif +;.win32 + GUICheckMenuItem 8, 0 + cmp byte[CNetType],10 + jae near .nonet + cmp byte[GUIcrowpos],0 + jne near .nonet + mov byte[CNetType],4 + call GetHostName +.nonet + cmp byte[GUIcmenupos],6 + jne near .nomisc + GUICheckMenuItem 9, 0 + GUICheckMenuItem 10, 1 + cmp byte[romloadskip],0 + jne near .nomovie + GUICheckMenuItem 15, 2 + cmp byte[GUIcrowpos],2 + jne .nomovie + mov byte[MovieRecordWinVal],0 +.nomovie + GUICheckMenuItem 16, 3 + cmp byte[GUIcrowpos],4 + jne .nosavestuff + + ; change dir to InitDrive/InitDir + mov dl,[InitDrive] + mov ebx,InitDir + call Change_Dir + call createnewcfg + call GUISaveVars + + call Makemode7Table + mov dword[GUICMessage],.message1 + mov dword[GUICTimer],50 + ; change dir to LoadDrive/LoadDir + mov dl,[LoadDrive] + mov ebx,LoadDir + call Change_Dir +.nosavestuff + GUICheckMenuItem 11, 6 +.nomisc + ret + +SECTION .data +.message1 db 'CONFIGURATION FILES SAVED.',0 +SECTION .text + +DisplayBoxes: + xor esi,esi + mov byte[cwindrawn],0 +.next2 + mov al,[GUIwinorder+esi] + cmp al,0 + je .done + inc byte[cwindrawn] + inc esi + jmp .next2 +.done + dec byte[cwindrawn] + xor eax,eax + xor esi,esi +.next + mov al,[GUIwinorder+esi] + cmp al,0 + je near .nomore + push esi + cmp al,1 + jne .noguiconfirm + cmp byte[GUIReset],1 + je near .finstuff + call DisplayGUILoad + jmp .finstuff +.noguiconfirm + cmp al,2 + jne .noguichosesave + call DisplayGUIChoseSave + jmp .finstuff +.noguichosesave + cmp al,3 + jne .noguiinput + call DisplayGUIInput + jmp .finstuff +.noguiinput + cmp al,4 + jne .noguioption + call DisplayGUIOption + jmp .finstuff +.noguioption + cmp al,5 + jne .noguivideo + call DisplayGUIVideo + jmp .finstuff +.noguivideo + cmp al,6 + jne .noguisound + call DisplayGUISound + jmp .finstuff +.noguisound + cmp al,7 + jne .noguicheat + call DisplayGUICheat + jmp .finstuff +.noguicheat + cmp al,8 + jne .noguinet + call DisplayNetOptns + jmp .finstuff +.noguinet + cmp al,9 + jne .noguigameop + call DisplayGameOptns + jmp .finstuff +.noguigameop + cmp al,10 + jne .noguiconf + call DisplayGUIOptns +%ifdef __WIN32__ + pushad + call CheckAlwaysOnTop + popad +%endif + jmp .finstuff +.noguiconf + cmp al,11 + jne .noguiconf2 + call DisplayGUIAbout + jmp .finstuff +.noguiconf2 + cmp al,12 + jne .noguireset + call DisplayGUIReset + jmp .finstuff +.noguireset + cmp al,13 + jne .noguisearch + call DisplayGUISearch + jmp .finstuff +.noguisearch + cmp al,14 + jne .noguistates + call DisplayGUIStates + jmp .finstuff +.noguistates + cmp al,15 + jne .noguimovies + call DisplayGUIMovies + jmp .finstuff +.noguimovies + cmp al,16 + jne .noguicombo + call DisplayGUICombo + jmp .finstuff +.noguicombo + cmp al,17 + jne .noaddon + call DisplayGUIAddOns + jmp .finstuff +.noaddon +.finstuff + pop esi + inc esi + dec byte[cwindrawn] + jmp .next +.nomore + ret + + + +ChangetoSRAMdir: + mov dl,[SRAMDrive] + mov ebx,SRAMDir + call Change_Dir + ret + +ChangetoLOADdir: + mov dl,[LoadDrive] + mov ebx,LoadDir + call Change_Dir + ret + +GUIProcStates: + xor eax,eax + mov al,[GUIwinptr] + dec eax + mov byte[GUIwinactiv+14],0 + mov byte[GUIwinorder+eax],0 + dec byte[GUIwinptr] + cmp byte[GUICBHold],10 + je .yesstate + mov byte[GUICBHold],0 + ret +.yesstate + mov byte[GUICBHold],0 + ; change dir to SRAMDrive/SRAMDir + call ChangetoSRAMdir + cmp byte[GUIStatesText5],1 + je .loadstate + call statesaver + jmp .changedir +.loadstate + cmp byte[CNetType],20 + jne .notnet + call NetLoadStuff + jmp .changedir +.notnet + call loadstate2 +.changedir + ; change dir to LoadDrive/LoadDir + call ChangetoLOADdir + ret + +SaveSecondState: + ; change dir to SRAMDrive/SRAMDir + call ChangetoSRAMdir + mov ebx,[statefileloc] + mov al,[fnamest+ebx] + mov byte[fnamest+ebx],'s' + push eax + call statesaver + pop eax + mov ebx,[statefileloc] + mov [fnamest+ebx],al + call ChangetoLOADdir + ret + +LoadSecondState: + call ChangetoSRAMdir + mov ebx,[statefileloc] + mov al,[fnamest+ebx] + mov byte[fnamest+ebx],'s' + push eax + call loadstate2 + pop eax + mov ebx,[statefileloc] + mov [fnamest+ebx],al + call ChangetoLOADdir + ret + +GUIProcReset: + cmp byte[GUICBHold],2 + jne .noreset + mov byte[GUIReset],1 + call GUIDoReset + cmp byte[CNetType],20 + jne .noreset + call PreparePacket + mov al,40 + call RemoteSendChar + call SendPacket + mov byte[GUIQuit],0 +.noreset + mov byte[GUICBHold],0 + xor eax,eax + mov al,[GUIwinptr] + dec eax + mov byte[GUIwinactiv+12],0 + mov byte[GUIwinorder+eax],0 + dec byte[GUIwinptr] + ret + +SECTION .bss +LoadDuplicFound resb 1 +SECTION .text + +%macro GUIDMHelp 4 + mov byte[GUItextcolor],46 + mov byte[GUItextcolor+1],42 + mov byte[GUItextcolor+2],38 + mov byte[GUItextcolor+3],44 + mov byte[GUItextcolor+4],40 + cmp byte[GUIcmenupos],%4 + jne %%nohighlight + mov byte[GUItextcolor],38 + mov byte[GUItextcolor+1],40 + mov byte[GUItextcolor+2],46 + mov byte[GUItextcolor+3],40 + mov byte[GUItextcolor+4],44 +%%nohighlight + GUIBox %1,3,%2,3,[GUItextcolor] + GUIBox %1,4,%2,12,[GUItextcolor+1] + GUIBox %1,13,%2,13,[GUItextcolor+2] + GUIBox %1,3,%1,12,[GUItextcolor+3] + GUIBox %2,4,%2,13,[GUItextcolor+4] + GUIOuttext %1+5,7,%3,44 + GUIOuttext %1+4,6,%3,62 +%endmacro + +%macro GUIDMHelpB 4 + mov byte[GUItextcolor],46 + mov byte[GUItextcolor+1],42 + mov byte[GUItextcolor+2],38 + mov byte[GUItextcolor+3],44 + mov byte[GUItextcolor+4],40 + cmp byte[GUIcwinpress],%4 + jne %%nohighlight + mov byte[GUItextcolor],38 + mov byte[GUItextcolor+1],40 + mov byte[GUItextcolor+2],46 + mov byte[GUItextcolor+3],40 + mov byte[GUItextcolor+4],44 +%%nohighlight + GUIBox %1,3,%2,3,[GUItextcolor] + GUIBox %1,4,%2,13,[GUItextcolor+1] + GUIBox %1,14,%2,14,[GUItextcolor+2] + GUIBox %1,3,%1,13,[GUItextcolor+3] + GUIBox %2,4,%2,14,[GUItextcolor+4] + GUIOuttext %1+3,7,%3,44 + GUIOuttext %1+2,6,%3,62 +%endmacro + +%macro GUIDMHelpB2 4 + mov byte[GUItextcolor],46 + mov byte[GUItextcolor+1],42 + mov byte[GUItextcolor+2],38 + mov byte[GUItextcolor+3],44 + mov byte[GUItextcolor+4],40 + cmp byte[GUIcwinpress],%4 + jne %%nohighlight + mov byte[GUItextcolor],38 + mov byte[GUItextcolor+1],40 + mov byte[GUItextcolor+2],46 + mov byte[GUItextcolor+3],40 + mov byte[GUItextcolor+4],44 +%%nohighlight + GUIBox %1,3,%2,3,[GUItextcolor] + GUIBox %1,4,%2,6,[GUItextcolor+1] + GUIBox %1,7,%2,7,[GUItextcolor+2] + GUIBox %1,3,%1,6,[GUItextcolor+3] + GUIBox %2,4,%2,7,[GUItextcolor+4] + GUIOuttext %1+3,5,%3,44 + GUIOuttext %1+2,4,%3,62 +%endmacro + +%macro GUIDMHelpB3 4 + mov byte[GUItextcolor],46 + mov byte[GUItextcolor+1],42 + mov byte[GUItextcolor+2],38 + mov byte[GUItextcolor+3],44 + mov byte[GUItextcolor+4],40 + cmp byte[GUIcwinpress],%4 + jne %%nohighlight + mov byte[GUItextcolor],38 + mov byte[GUItextcolor+1],40 + mov byte[GUItextcolor+2],46 + mov byte[GUItextcolor+3],40 + mov byte[GUItextcolor+4],44 +%%nohighlight + GUIBox %1,9,%2,9,[GUItextcolor] + GUIBox %1,10,%2,12,[GUItextcolor+1] + GUIBox %1,13,%2,13,[GUItextcolor+2] + GUIBox %1,9,%1,12,[GUItextcolor+3] + GUIBox %2,10,%2,13,[GUItextcolor+4] + GUIOuttext %1+3,11,%3,44 + GUIOuttext %1+2,10,%3,62 +%endmacro + +%macro GUIDrawMenuM 10 + GUIShadow %7,%8,%7+4+%3*6,%8+3+%4*10 + GUIBox %1,%2,%1+4+%3*6,%2+3+%4*10,43 + + mov edi,[GUIcrowpos] + mov ecx,edi + shl edi,8 + shl ecx,5 + add edi,ecx + lea edi,[edi*5] + shl edi,1 + add edi,[vidbuffer] + add edi,%1+17+18*288 + mov ecx,6*%3+3 + mov edx,1 + mov al,73 + push edi + call GUIDrawBox + pop edi + add edi,288 + mov ecx,6*%3+3 + mov edx,7 + mov al,72 + push edi + call GUIDrawBox + pop edi + add edi,288*7 + mov ecx,6*%3+3 + mov edx,1 + mov al,73 + call GUIDrawBox + + GUIBox %1+%10,%2,%1+4+%3*6,%2,47 + GUIBox %1,%2,%1,%9,45 + GUIBox %1,%9,%1+4+%3*6,%9,39 + GUIBox %1+4+%3*6,1+%2,%1+4+%3*6,%9,41 + mov edi,%5 + mov esi,[vidbuffer] + add esi,16+%6+20*288 + mov ecx,%4 + mov edx,6*%3 + call GUIMenuDisplay + + mov dword[GUIMenuL],%1+1 + mov dword[GUIMenuR],%1+6*%3+3 + mov dword[GUIMenuD],18+%4*10 +%endmacro + +DisplayMenu: + ; Draw Shadow + GUIShadow 5,7,235,21 + ; Display Top Border + GUIBox 0,1,229,1,71 + GUIBox 0,2,229,2,70 + GUIBox 0,3,229,3,69 + GUIBox 0,4,229,4,68 + GUIBox 0,5,229,5,67 + GUIBox 0,6,229,6,66 + GUIBox 0,7,229,7,65 + GUIBox 0,8,229,8,64 + GUIBox 0,9,229,9,65 + GUIBox 0,10,229,10,66 + GUIBox 0,11,229,11,67 + GUIBox 0,12,229,12,68 + GUIBox 0,13,229,13,69 + GUIBox 0,14,229,14,70 + GUIBox 0,15,229,15,71 + +; cmp byte[OSPort],3 +; jne near .notwinpressa + %ifdef __LINUX__ + GUIShadow 238,9,247,20 + GUIShadow 249,9,257,20 + %endif + %ifdef __WIN32__ + GUIShadow 238,9,247,14 + GUIShadow 238,16,247,20 + GUIShadow 249,9,257,20 + %endif +.notwinpressa + +; cmp byte[OSPort],3 +; jne near .notwinpressb + + %ifdef __LINUX__ + mov byte[GUIMenuItem+36],247 + GUIDMHelpB 233,242,GUIMenuItem+36,1 + mov byte[GUIMenuItem+36],'x' + GUIDMHelpB 244,253,GUIMenuItem+36,2 + %endif + + %ifdef __WIN32__ + mov byte[GUIMenuItem+36],249 + GUIDMHelpB2 233,242,GUIMenuItem+36,1 + mov byte[GUIMenuItem+36],248 + GUIDMHelpB3 233,242,GUIMenuItem+36,3 + mov byte[GUIMenuItem+36],'x' + GUIDMHelpB 244,253,GUIMenuItem+36,2 + %endif +.notwinpressb + + ; Display upper-left box + mov byte[GUIMenuItem+36],25 + GUIDMHelp 4,12,GUIMenuItem+6,1 + GUIOuttext 4+3,7,GUIMenuItem+36,44 + GUIOuttext 4+2,6,GUIMenuItem+36,62 + ; Display boxes + GUIDMHelp 17,47,GUIMenuItem,2 + GUIDMHelp 52,94,GUIMenuItem+7,3 + GUIDMHelp 99,135,GUIMenuItem+14,4 + GUIDMHelp 140,188,GUIMenuItem+21,5 + GUIDMHelp 193,223,GUIMenuItem+29,6 + + mov dword[GUIMenuL],0 + mov dword[GUIMenuR],0 + mov dword[GUIMenuD],0 + + ; format : x pos, y pos, #charx, #chary, name, xpos+2, xpos+5,22, + ; 19+#chary*10, length of top menu box + cmp byte[GUIcmenupos],1 + jne near .nomenu1 + GUIDrawMenuM 4,16,30,13,GUIPrevMenuData,6,9,22,149,8 ;19+13*10 + mov dword[GUICYLocPtr],MenuDat1 +.nomenu1 + cmp byte[GUIcmenupos],2 + jne near .nomenu2 + GUIDrawMenuM 17,16,10,9,GUIGameMenuData,19,22,22,109,30 ;19+9*10 + mov dword[GUICYLocPtr],MenuDat2 +.nomenu2 + cmp byte[GUIcmenupos],3 + jne near .nomenu3 + GUIDrawMenuM 52,16,9,11,GUIConfigMenuData,54,57,22,129,42 ;19+11*10 + mov dword[GUICYLocPtr],MenuDat3 +.nomenu3 + cmp byte[GUIcmenupos],4 + jne near .nomenu4 + GUIDrawMenuM 99,16,11,3,GUICheatMenuData,101,104,22,49,36 ;19+3*10 + mov dword[GUICYLocPtr],MenuDat4 +.nomenu4 + cmp byte[GUIcmenupos],5 + jne near .nomenu5 +; cmp byte[GOSPort],3 +; je near .menu5b +%ifdef __MSDOS__ + GUIDrawMenuM 140,16,10,2,GUINetPlayMenuData,142,145,22,39,48 ;19+2*10 + mov dword[GUICYLocPtr],MenuDat5 + jmp .nomenu5 +%endif +.menu5b + GUIDrawMenuM 140,16,10,1,GUINetPlayMenuData,142,145,22,29,48 ;19+2*10 + mov dword[GUICYLocPtr],MenuDat5 +.nomenu5 + cmp byte[GUIcmenupos],6 + jne near .nomenu6 + GUIDrawMenuM 193,16,9,7,GUIMiscMenuData,195,198,22,89,30 ;19+5*10 + mov dword[GUICYLocPtr],MenuDat6 +.nomenu6 + ret + +GUIMenuDisplay: + xor ebx,ebx +.next + mov al,[edi] + push ebx + push ecx + push esi + cmp al,0 + je near .notext + cmp al,2 + je .darktext + inc edi + mov byte[GUItextcolor],44 + cmp byte[GUIcrowpos],bl + je .nodrawshadow + push edi + push esi + add esi,289 + call GUIOutputString + pop esi + pop edi +.nodrawshadow + mov byte[GUItextcolor],63 + call GUIOutputString + inc edi + jmp .text +.darktext + inc edi + mov byte[GUItextcolor],42 + cmp byte[GUIcrowpos],bl + je .nodrawshadow2 + push edi + push esi + add esi,289 + call GUIOutputString + pop esi + pop edi +.nodrawshadow2 + mov byte[GUItextcolor],57 + call GUIOutputString + inc edi + jmp .text +.notext + add esi,4*288 + mov ecx,edx +.loop + mov byte[esi],45 + mov byte[esi-289],40 + mov byte[esi+289],42 + inc esi + dec ecx + jnz .loop + add edi,14 +.text + pop esi + pop ecx + pop ebx + add esi,10*288 + inc ebx + dec ecx + jnz near .next + ret + + + +InitGUI: + cmp byte[newengen],0 + je .nong16b + cmp byte[cbitmode],0 + je .nong16b + call GetScreen +.nong16b + call ClearScreen + call Clear2xSaIBuffer + call GUISetPal + call GUIBufferData + ret + +GUISetPal: + cmp byte[cbitmode],1 + je near GUISetPal16 + ; set palette + ; Fixed Color Scale = 0 .. 31 + mov dx,03C8h + mov al,0 + out dx,al + inc dx + out dx,al + out dx,al + out dx,al + + inc al + mov dx,03C8h + mov bl,1 + out dx,al + inc dx +.loopd + mov al,bl + add al,[GUIRAdd] + out dx,al + mov al,bl + add al,[GUIGAdd] + out dx,al + mov al,bl + add al,[GUIBAdd] + out dx,al + inc bl + cmp bl,32 + jne .loopd + ; gray scale = 32 .. 63 + mov dx,03C8h + mov bl,32 + mov al,32 + out dx,al + inc dx +.loopc + mov al,bl + add al,al + out dx,al + out dx,al + out dx,al + inc bl + cmp bl,64 + jne .loopc + ; shadow = 96 .. 127 + inc al + mov al,96 + mov dx,03C8h + mov bl,0 + out dx,al + inc dx +.loope + mov al,bl + add al,[GUIRAdd] + mov ah,al + add al,al + add al,ah + shr al,2 + out dx,al + mov al,bl + add al,[GUIGAdd] + mov ah,al + add al,al + add al,ah + shr al,2 + out dx,al + mov al,bl + add al,[GUIBAdd] + mov ah,al + add al,al + add al,ah + shr al,2 + out dx,al + inc bl + cmp bl,32 + jne .loope + + ; 0,10,31 + mov al,[GUITRAdd] + mov [TRVal],al + mov al,[GUITGAdd] + mov [TGVal],al + mov al,[GUITBAdd] + mov [TBVal],al + mov ax,[TRVal] + inc ax + shr ax,3 + mov [TRVali],ax + shl ax,3 + add [TRVal],ax + mov ax,[TGVal] + inc ax + shr ax,3 + mov [TGVali],ax + shl ax,3 + add [TGVal],ax + mov ax,[TBVal] + inc ax + shr ax,3 + mov [TBVali],ax + shl ax,3 + add [TBVal],ax + + GUIPal 64,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 65,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 66,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 67,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 68,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 69,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 70,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 71,[TRVal],[TGVal],[TBVal] + + GUIPal 72,40,0,20 + GUIPal 73,34,0,21 + + GUIPal 80,0,10,28 + GUIPal 81,0,10,27 + GUIPal 82,0,10,25 + GUIPal 83,0,09,24 + GUIPal 84,0,08,22 + GUIPal 85,0,07,20 + GUIPal 86,0,06,18 + GUIPal 87,0,05,15 + GUIPal 88,20,0,10 + GUIPal 89,17,0,10 + + ; Orange Scale + mov dx,03C8h + mov al,128 + mov cl,20 + out dx,al + mov bh,0 + mov ah,0 + inc dx +.loopf + add bh,2 + add ah,1 + mov al,63 + out dx,al + mov al,bh + out dx,al + mov al,ah + out dx,al + dec cl + jnz .loopf + + ; Blue scale = 148 .. 167 + mov al,[GUIWRAdd] + add al,al + mov [TRVal],al + mov al,[GUIWGAdd] + add al,al + mov [TGVal],al + mov al,[GUIWBAdd] + add al,al + mov [TBVal],al + mov byte[TRVali],4 + mov byte[TGVali],4 + mov byte[TBVali],4 + + GUIPal 152,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 151,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 150,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 149,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 148,[TRVal],[TGVal],[TBVal] + + mov al,[GUIWRAdd] + add al,al + mov [TRVal],al + mov al,[GUIWGAdd] + add al,al + mov [TGVal],al + mov al,[GUIWBAdd] + add al,al + mov [TBVal],al + mov byte[TRVali],4 + mov byte[TGVali],4 + mov byte[TBVali],4 + call DecPalVal + call DecPalVal + + GUIPal 157,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 156,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 155,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 154,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 153,[TRVal],[TGVal],[TBVal] + + mov al,[GUIWRAdd] + add al,al + mov [TRVal],al + mov al,[GUIWGAdd] + add al,al + mov [TGVal],al + mov al,[GUIWBAdd] + add al,al + mov [TBVal],al + mov byte[TRVali],4 + mov byte[TGVali],4 + mov byte[TBVali],4 + call DecPalVal + call DecPalVal + call DecPalVal + call DecPalVal + + GUIPal 162,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 161,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 160,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 159,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 158,[TRVal],[TGVal],[TBVal] + + GUIPal 163,40,40,00 + GUIPal 164,30,30,00 + GUIPal 165,50,00,00 + GUIPal 166,35,00,00 + GUIPal 167,00,00,00 + + ; Blue scale shadow + mov al,[GUIWRAdd] + mov [TRVal],al + mov al,[GUIWGAdd] + mov [TGVal],al + mov al,[GUIWBAdd] + mov [TBVal],al + mov byte[TRVali],2 + mov byte[TGVali],2 + mov byte[TBVali],2 + + GUIPal 172,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 171,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 170,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 169,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 168,[TRVal],[TGVal],[TBVal] + + mov al,[GUIWRAdd] + mov [TRVal],al + mov al,[GUIWGAdd] + mov [TGVal],al + mov al,[GUIWBAdd] + mov [TBVal],al + mov byte[TRVali],2 + mov byte[TGVali],2 + mov byte[TBVali],2 + call DecPalVal + call DecPalVal + + GUIPal 177,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 176,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 175,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 174,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 173,[TRVal],[TGVal],[TBVal] + + mov al,[GUIWRAdd] + mov [TRVal],al + mov al,[GUIWGAdd] + mov [TGVal],al + mov al,[GUIWBAdd] + mov [TBVal],al + mov byte[TRVali],2 + mov byte[TGVali],2 + mov byte[TBVali],2 + call DecPalVal + call DecPalVal + call DecPalVal + call DecPalVal + + GUIPal 182,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 181,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 180,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 179,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal 178,[TRVal],[TGVal],[TBVal] + + GUIPal 183,20,20,00 + GUIPal 184,15,15,00 + GUIPal 185,25,00,00 + GUIPal 186,17,00,00 + GUIPal 187,00,00,00 + + ; gray scale2 = 189 .. 220 + mov dx,03C8h + mov al,189 + mov bl,0 + out dx,al + inc dx +.loopi + mov al,bl + add al,al + mov ah,bl + shr ah,1 + sub al,ah + out dx,al + out dx,al + add al,ah + out dx,al + inc bl + cmp bl,64 + jne .loopi + + GUIPal 221,00,55,00 + GUIPal 222,00,45,00 + GUIPal 223,00,25,00 + + GUIPal 224,40,0,20 + GUIPal 225,32,0,15 + + GUIPal 226,20,0,10 + GUIPal 227,16,0,07 + + GUIPal 228,45,45,50 + GUIPal 229,40,40,45 + GUIPal 230,35,35,40 + GUIPal 231,30,30,35 + + GUIPal 232,35,15,15 + + GUIPal 233,50,12,60 + GUIPal 234,30,14,60 + + cmp byte[GUIPalConv],0 + je .convert + ret +.convert + mov byte[GUIPalConv],1 + + ; Convert Image data to Gray Scale + ; Create Palette Table + call GUIconvpal + ; Convert Current Image in Buffer + mov esi,[vidbuffer] + mov ecx,288*240 + xor eax,eax +.next + mov al,[esi] + mov bl,[SubPalTable+eax] + mov [esi],bl + inc esi + dec ecx + jnz .next + ret + +SECTION .bss ;ALIGN=32 +NEWSYM GUICPC, resw 256 +SECTION .text + +%macro GUIPal16b 4 + mov ax,%2 + shr ax,1 + shl ax,11 + mov bx,%3 + shl bx,5 + or ax,bx + mov bx,%4 + shr bx,1 + or ax,bx + mov word[GUICPC+%1*2],ax +%endmacro + +DecPalVal: + mov ax,[TRVali] + sub word[TRVal],ax + mov ax,[TGVali] + sub word[TGVal],ax + mov ax,[TBVali] + sub word[TBVal],ax + test word[TRVal],8000h + jz .notnegr + mov word[TRVal],0 +.notnegr + test word[TGVal],8000h + jz .notnegg + mov word[TGVal],0 +.notnegg + test word[TBVal],8000h + jz .notnegb + mov word[TBVal],0 +.notnegb + ret + +GUISetPal16: + ; set palette + ; Fixed Color Scale = 0 .. 31 + mov word[GUICPC],0 + inc al + xor ebx,ebx + mov bl,1 +.loopd + xor ecx,ecx + mov cl,bl + add cl,[GUIRAdd] + shr cl,1 + shl ecx,11 + xor eax,eax + mov al,bl + add al,[GUIGAdd] + shl eax,5 + or ecx,eax + xor eax,eax + mov al,bl + add al,[GUIBAdd] + shr eax,1 + or ecx,eax + mov [GUICPC+ebx*2],cx + inc bl + cmp bl,32 + jne .loopd + + ; gray scale = 32 .. 63 + mov bl,32 + mov al,32 +.loopc + mov al,bl + add al,al + xor ecx,ecx + mov cl,al + shr ecx,1 + shl ecx,11 + xor edx,edx + mov dl,al + shl edx,5 + or ecx,edx + xor edx,edx + mov dl,al + shr edx,1 + or ecx,edx + mov [GUICPC+ebx*2],cx + inc bl + cmp bl,64 + jne .loopc + + ; shadow = 96 .. 127 + xor ebx,ebx +.loope + xor ecx,ecx + mov al,bl + add al,[GUIRAdd] + mov ah,al + add al,al + add al,ah + shr al,2 + shr al,1 + or cl,al + shl ecx,6 + mov al,bl + add al,[GUIGAdd] + mov ah,al + add al,al + add al,ah + shr al,2 + or cl,al + shl ecx,5 + mov al,bl + add al,[GUIBAdd] + mov ah,al + add al,al + add al,ah + shr al,2 + shr al,1 + or cl,al + mov [GUICPC+ebx*2+96*2],cx + inc bl + cmp bl,32 + jne .loope + + ; 0,10,31 + mov al,[GUITRAdd] + mov [TRVal],al + mov al,[GUITGAdd] + mov [TGVal],al + mov al,[GUITBAdd] + mov [TBVal],al + mov ax,[TRVal] + inc ax + shr ax,3 + mov [TRVali],ax + shl ax,3 + add [TRVal],ax + mov ax,[TGVal] + inc ax + shr ax,3 + mov [TGVali],ax + shl ax,3 + add [TGVal],ax + mov ax,[TBVal] + inc ax + shr ax,3 + mov [TBVali],ax + shl ax,3 + add [TBVal],ax + + GUIPal16b 64,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 65,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 66,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 67,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 68,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 69,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 70,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 71,[TRVal],[TGVal],[TBVal] + + GUIPal16b 72,40,0,20 + GUIPal16b 73,34,0,21 + + GUIPal16b 80,0,10,28 + GUIPal16b 81,0,10,27 + GUIPal16b 82,0,10,25 + GUIPal16b 83,0,09,24 + GUIPal16b 84,0,08,22 + GUIPal16b 85,0,07,20 + GUIPal16b 86,0,06,18 + GUIPal16b 87,0,05,15 + GUIPal16b 88,20,0,10 + GUIPal16b 89,17,0,10 + + ; Orange Scale + mov cl,20 + mov bh,0 + mov ah,0 + inc dx + mov esi,128 +.loopf + add bh,2 + add ah,1 + mov edx,1Fh << 6 + or dl,bh + shl edx,5 + mov al,ah + shr al,1 + or dl,al + mov [GUICPC+esi*2],dx + inc esi + dec cl + jnz .loopf + + ; Blue scale = 148 .. 167 + mov al,[GUIWRAdd] + add al,al + mov [TRVal],al + mov al,[GUIWGAdd] + add al,al + mov [TGVal],al + mov al,[GUIWBAdd] + add al,al + mov [TBVal],al + mov byte[TRVali],4 + mov byte[TGVali],4 + mov byte[TBVali],4 + + GUIPal16b 152,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 151,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 150,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 149,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 148,[TRVal],[TGVal],[TBVal] + + mov al,[GUIWRAdd] + add al,al + mov [TRVal],al + mov al,[GUIWGAdd] + add al,al + mov [TGVal],al + mov al,[GUIWBAdd] + add al,al + mov [TBVal],al + mov byte[TRVali],4 + mov byte[TGVali],4 + mov byte[TBVali],4 + mov al,[TRVal] + shr al,2 + sub [TRVal],al + mov al,[TGVal] + shr al,2 + sub [TGVal],al + mov al,[TBVal] + shr al,2 + sub [TBVal],al + + GUIPal16b 157,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 156,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 155,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 154,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 153,[TRVal],[TGVal],[TBVal] + + mov al,[GUIWRAdd] + add al,al + mov [TRVal],al + mov al,[GUIWGAdd] + add al,al + mov [TGVal],al + mov al,[GUIWBAdd] + add al,al + mov [TBVal],al + mov byte[TRVali],4 + mov byte[TGVali],4 + mov byte[TBVali],4 + mov al,[TRVal] + shr al,1 + sub [TRVal],al + mov al,[TGVal] + shr al,1 + sub [TGVal],al + mov al,[TBVal] + shr al,1 + sub [TBVal],al + + GUIPal16b 162,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 161,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 160,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 159,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 158,[TRVal],[TGVal],[TBVal] + + GUIPal16b 163,40,40,00 + GUIPal16b 164,30,30,00 + GUIPal16b 165,50,00,00 + GUIPal16b 166,35,00,00 + GUIPal16b 167,00,00,00 + + ; Blue scale shadow + mov al,[GUIWRAdd] + mov [TRVal],al + mov al,[GUIWGAdd] + mov [TGVal],al + mov al,[GUIWBAdd] + mov [TBVal],al + mov byte[TRVali],2 + mov byte[TGVali],2 + mov byte[TBVali],2 + + GUIPal16b 172,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 171,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 170,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 169,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 168,[TRVal],[TGVal],[TBVal] + + mov al,[GUIWRAdd] + mov [TRVal],al + mov al,[GUIWGAdd] + mov [TGVal],al + mov al,[GUIWBAdd] + mov [TBVal],al + mov byte[TRVali],2 + mov byte[TGVali],2 + mov byte[TBVali],2 + call DecPalVal + call DecPalVal + + GUIPal16b 177,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 176,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 175,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 174,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 173,[TRVal],[TGVal],[TBVal] + + mov al,[GUIWRAdd] + mov [TRVal],al + mov al,[GUIWGAdd] + mov [TGVal],al + mov al,[GUIWBAdd] + mov [TBVal],al + mov byte[TRVali],2 + mov byte[TGVali],2 + mov byte[TBVali],2 + call DecPalVal + call DecPalVal + call DecPalVal + call DecPalVal + + GUIPal16b 182,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 181,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 180,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 179,[TRVal],[TGVal],[TBVal] + call DecPalVal + GUIPal16b 178,[TRVal],[TGVal],[TBVal] + + GUIPal16b 183,20,20,00 + GUIPal16b 184,15,15,00 + GUIPal16b 185,25,00,00 + GUIPal16b 186,17,00,00 + GUIPal16b 187,00,00,00 + + ; gray scale2 = 189 .. 220 + mov bl,0 + mov esi,189 +.loopi + xor edx,edx + mov al,bl + add al,al + mov ah,bl + shr ah,1 + sub al,ah + mov dl,al + shr dl,1 + shl edx,6 + or dl,al + shl edx,5 + add al,ah + shr al,1 + or dl,al + mov [GUICPC+esi*2],dx + inc esi + inc bl + cmp bl,64 + jne .loopi + + GUIPal16b 221,00,55,00 + GUIPal16b 222,00,45,00 + GUIPal16b 223,00,25,00 + + GUIPal16b 224,40,0,20 + GUIPal16b 225,32,0,15 + + GUIPal16b 226,20,0,10 + GUIPal16b 227,16,0,07 + + GUIPal16b 228,45,45,50 + GUIPal16b 229,40,40,45 + GUIPal16b 230,35,35,40 + GUIPal16b 231,30,30,35 + + GUIPal16b 232,35,15,15 + + GUIPal16b 233,50,12,60 + GUIPal16b 234,30,14,60 + GUIPal16b 235,12,60,25 + GUIPal16b 236,14,42,25 + GUIPal16b 237,60,20,25 + GUIPal16b 238,42,20,25 + + cmp byte[vesa2red10],1 + jne .nored10 + jmp .nored10 + mov esi,GUICPC + mov ecx,256 +.next2 + mov ax,[esi] + mov bx,ax + and bx,0000000000011111b + and ax,1111111111000000b + shr ax,1 + or ax,bx + mov [esi],ax + add esi,2 + dec ecx + jnz .next2 +.nored10 + cmp byte[GUIPalConv],0 + je .convert + ret +.convert + mov byte[GUIPalConv],1 + mov esi,[vidbuffer] + mov edi,288*240 + xor ebx,ebx +.next + mov ax,[esi+ebx*2] + mov ecx,eax + shr ecx,11 + and ecx,1Fh + mov edx,eax + shr edx,6 + and edx,1Fh + add ecx,edx + mov edx,eax + and edx,1Fh + add ecx,edx + shr ecx,1 + mov al,[.multab+ecx] + mov [esi+ebx],al + inc ebx + dec edi + jnz .next + ret + +SECTION .data +.multab db 1,1,1,2,2,3,4,4,5,6,6,7,8,8,9,10,10,11,12,12,13,14,14,15,16,16, + db 17,18,18,19,20,20,21,22,22,23,24,24,25,26,26,27,28,28,29,30,30, + db 31 +SECTION .text + +GUIBufferData: + mov ecx,16384 + cmp byte[cbitmode],1 + jne near .16b + add ecx,16384 + cmp word[PrevResoln],224 + je .nobufb + add esi,288*8 +.nobufb +.16b + ; copy to spritetable + mov esi,[vidbuffer] + cmp word[PrevResoln],224 + je .nobufa + add esi,288*8 +.nobufa + mov edi,[spritetablea] + add edi,8*288 +.loop + mov eax,[esi] + mov [edi],eax + add esi,4 + add edi,4 + dec ecx + jnz .loop + mov edi,sprlefttot + mov ecx,64*5 +.a + mov dword[edi],0 + add edi,4 + dec ecx + jnz .a + ret + +GUIUnBuffer: + mov ecx,16384 + ; copy from spritetable + mov edi,[vidbuffer] + mov esi,[spritetablea] + add esi,8*288 + rep movsd + mov eax,01010101h + mov ecx,2*288 + rep stosd + ret + +GUIconvpal: + mov ax,[cgram] + mov [tempco0],ax + test byte[scaddtype],00100000b + jz near .noaddition + test byte[scaddtype],10000000b + jnz near .noaddition + mov cx,[cgram] + mov ax,cx + and ax,001Fh + add al,[coladdr] + cmp al,01Fh + jb .noadd + mov al,01Fh +.noadd + mov bx,ax + mov ax,cx + shr ax,5 + and ax,001Fh + add al,[coladdg] + cmp al,01Fh + jb .noaddb + mov al,01Fh +.noaddb + shl ax,5 + add bx,ax + mov ax,cx + shr ax,10 + and ax,001Fh + add al,[coladdb] + cmp al,01Fh + jb .noaddc + mov al,01Fh +.noaddc + shl ax,10 + add bx,ax + mov [cgram],bx +.noaddition + mov edi,cgram + mov ebx,prevpal + xor ah,ah +.loopa + mov cx,[edi] + push eax + push ebx + mov [ebx],cx + mov al,ah + mov ax,cx + and al,01Fh + mov bh,[maxbr] + mov bl,bh + mul bl + mov bl,15 + div bl + mov [curgsval],al + mov ax,cx + shr ax,5 + and al,01Fh + mov bl,bh + mul bl + mov bl,15 + div bl + add [curgsval],al + mov ax,cx + shr ax,10 + and al,01Fh + mov bl,bh + mul bl + mov bl,15 + div bl + add [curgsval],al + pop ebx + pop eax + add edi,2 + add ebx,2 + push eax + push ebx + mov al,ah + and eax,0FFh + mov bl,[curgsval] + push eax + push ebx + mov al,bl + mov bl,3 + xor ah,ah + div bl + pop ebx + mov bl,al + pop eax + cmp byte[MessageOn],0 + je .nochange128 + cmp al,128 + jne .nochange128 + mov bl,31 +.nochange128 + or bl,bl + jnz .noadder + inc bl +.noadder + mov [SubPalTable+eax],bl + pop ebx + pop eax + inc ah + jnz near .loopa + mov al,[maxbr] + mov [prevbright],al + mov ax,[tempco0] + mov [cgram],ax + ret + +SECTION .data +GUIMousePtr db 50+88,47+88,45+88,43+88,42+88,00,00,00 + db 53+88,52+88,46+88,42+88,00,00,00,00 + db 55+88,54+88,54+88,44+88,00,00,00,00 + db 57+88,57+88,56+88,52+88,45+88,00,00,00 + db 59+88,00,00,55+88,50+88,45+88,00,00 + db 00,00,00,00,55+88,50+88,45+88,00 + db 00,00,00,00,00,55+88,50+88,47+88 + db 00,00,00,00,00,00,52+88,00 + + db 50,47,45,43,40,00,00,00 + db 53,52,46,42,00,00,00,00 + db 55,54,54,44,00,00,00,00 + db 57,57,56,52,45,00,00,00 + db 59,00,00,55,50,45,00,00 + db 00,00,00,00,55,50,45,00 + db 00,00,00,00,00,55,50,47 + db 00,00,00,00,00,00,52,00 + +NEWSYM GUIFontData + db 0,0,0,0,0 + db 01110000b + db 10011000b + db 10101000b + db 11001000b + db 01110000b; 0 + db 00100000b + db 01100000b + db 00100000b + db 00100000b + db 01110000b; 1 + db 01110000b + db 10001000b + db 00110000b + db 01000000b + db 11111000b; 2 + db 01110000b + db 10001000b + db 00110000b + db 10001000b + db 01110000b; 3 + db 01010000b + db 10010000b + db 11111000b + db 00010000b + db 00010000b; 4 + db 11111000b + db 10000000b + db 11110000b + db 00001000b + db 11110000b; 5 + db 01110000b + db 10000000b + db 11110000b + db 10001000b + db 01110000b; 6 + db 11111000b + db 00001000b + db 00010000b + db 00010000b + db 00010000b; 7 + db 01110000b + db 10001000b + db 01110000b + db 10001000b + db 01110000b; 8 + db 01110000b + db 10001000b + db 01111000b + db 00001000b + db 01110000b; 9 + db 01110000b + db 10001000b + db 11111000b + db 10001000b + db 10001000b; A + db 11110000b + db 10001000b + db 11110000b + db 10001000b + db 11110000b; B + db 01110000b + db 10001000b + db 10000000b + db 10001000b + db 01110000b; C + db 11110000b + db 10001000b + db 10001000b + db 10001000b + db 11110000b; D + db 11111000b + db 10000000b + db 11110000b + db 10000000b + db 11111000b; E + db 11111000b + db 10000000b + db 11110000b + db 10000000b + db 10000000b; F + db 01111000b + db 10000000b + db 10011000b + db 10001000b + db 01110000b; G + db 10001000b + db 10001000b + db 11111000b + db 10001000b + db 10001000b; H + db 11111000b + db 00100000b + db 00100000b + db 00100000b + db 11111000b; I + db 01111000b + db 00010000b + db 00010000b + db 10010000b + db 01100000b; J + db 10010000b + db 10100000b + db 11100000b + db 10010000b + db 10001000b; K + db 10000000b + db 10000000b + db 10000000b + db 10000000b + db 11111000b; L + db 11011000b + db 10101000b + db 10101000b + db 10101000b + db 10001000b; M + db 11001000b + db 10101000b + db 10101000b + db 10101000b + db 10011000b; N + db 01110000b + db 10001000b + db 10001000b + db 10001000b + db 01110000b; O + db 11110000b + db 10001000b + db 11110000b + db 10000000b + db 10000000b; P + db 01110000b + db 10001000b + db 10101000b + db 10010000b + db 01101000b; Q + db 11110000b + db 10001000b + db 11110000b + db 10010000b + db 10001000b; R + db 01111000b + db 10000000b + db 01110000b + db 00001000b + db 11110000b; S + db 11111000b + db 00100000b + db 00100000b + db 00100000b + db 00100000b; T + db 10001000b + db 10001000b + db 10001000b + db 10001000b + db 01110000b; U + db 10001000b + db 10001000b + db 01010000b + db 01010000b + db 00100000b; V + db 10001000b + db 10101000b + db 10101000b + db 10101000b + db 01010000b; W + db 10001000b + db 01010000b + db 00100000b + db 01010000b + db 10001000b; X + db 10001000b + db 01010000b + db 00100000b + db 00100000b + db 00100000b; Y + db 11111000b + db 00010000b + db 00100000b + db 01000000b + db 11111000b; Z + db 00000000b + db 00000000b + db 11111000b + db 00000000b + db 00000000b; - + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 11111000b; _ + db 01101000b + db 10010000b + db 00000000b + db 00000000b + db 00000000b; ~ + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00100000b; . + db 00001000b + db 00010000b + db 00100000b + db 01000000b + db 10000000b; / + db 00010000b + db 00100000b + db 01000000b + db 00100000b + db 00010000b; < + db 01000000b + db 00100000b + db 00010000b + db 00100000b + db 01000000b; > + db 01110000b + db 01000000b + db 01000000b + db 01000000b + db 01110000b; [ + db 01110000b + db 00010000b + db 00010000b + db 00010000b + db 01110000b; ] + db 00000000b + db 00100000b + db 00000000b + db 00100000b + db 00000000b; : + db 01100000b + db 10011000b + db 01110000b + db 10011000b + db 01101000b; & + db 00100000b + db 00100000b + db 10101000b + db 01110000b + db 00100000b; arrow + db 01010000b + db 11111000b + db 01010000b + db 11111000b + db 01010000b; # + db 00000000b + db 11111000b + db 00000000b + db 11111000b + db 00000000b; = + db 01001000b + db 10010000b + db 00000000b + db 00000000b + db 00000000b; " + db 10000000b + db 01000000b + db 00100000b + db 00010000b + db 00001000b; \ (Screw you nassm) + db 10101000b + db 01110000b + db 11111000b + db 01110000b + db 10101000b; * + db 01110000b + db 10001000b + db 00110000b + db 00000000b + db 00100000b; ? + db 10001000b + db 00010000b + db 00100000b + db 01000000b + db 10001000b; % + db 00100000b + db 00100000b + db 11111000b + db 00100000b + db 00100000b; + + db 00000000b + db 00000000b + db 00000000b + db 00100000b + db 01000000b; , + db 00110000b + db 01000000b + db 01000000b + db 01000000b + db 00110000b; ( + db 01100000b + db 00010000b + db 00010000b + db 00010000b + db 01100000b; ) + db 01110000b + db 10011000b + db 10111000b + db 10000000b + db 01110000b; @ + db 00100000b + db 01000000b + db 00000000b + db 00000000b + db 00000000b; ' + db 00100000b + db 00100000b + db 00100000b + db 00000000b + db 00100000b; ! + db 01111000b + db 10100000b + db 01110000b + db 00101000b + db 11110000b; $ + db 00000000b + db 00100000b + db 00000000b + db 00100000b + db 01000000b; ; + db 01000000b + db 00100000b + db 00000000b + db 00000000b + db 00000000b; ` + db 00100000b + db 01010000b + db 00000000b + db 00000000b + db 00000000b; ^ + db 00110000b + db 01000000b + db 11000000b + db 01000000b + db 00110000b; { + db 01100000b + db 00010000b + db 00011000b + db 00010000b + db 01100000b; } + db 00100000b + db 00100000b + db 01110000b + db 01110000b + db 11111000b; Up + db 11111000b + db 01110000b + db 01110000b + db 00100000b + db 00100000b; Down + db 00001000b + db 00111000b + db 11111000b + db 00111000b + db 00001000b; Left + db 10000000b + db 11100000b + db 11111000b + db 11100000b + db 10000000b; Right + db 00100000b + db 01100000b + db 11111000b + db 01100000b + db 00100000b; Arrow Left + db 00111000b + db 00100000b + db 00110000b + db 00001000b + db 10110000b; .5 + db 11111100b + db 10000100b + db 11111100b + db 00000000b + db 00000000b; Maximize + db 00000000b + db 11111100b + db 00000000b + db 00000000b + db 00000000b; Minimize + db 11111000b + db 10001000b + db 10001000b + db 10001000b + db 11111000b; Maximize (Linux) + +; 189 .. 220 +GUIIconDataClose: + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,216,216,216,216,216,216,216,0 ,0 + db 214,212,202,212,212,212,202,212,210,0 + db 214,212,212,200,212,200,212,212,210,202 + db 214,212,212,212,198,212,212,212,210,202 + db 214,212,212,196,212,196,212,212,210,200 + db 214,212,194,212,212,212,194,212,210,200 + db 0 ,208,208,208,208,208,208,208,198,198 + db 0 ,0 ,198,198,198,198,198,198,198,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + +GUIIconDataButtonHole: + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,207,205,207,0 ,0 ,0 ,0 + db 0 ,0 ,207,203,202,203,207,0 ,0 ,0 + db 0 ,207,203,200,198,200,203,207,0 ,0 + db 0 ,207,202,198,197,198,202,207,0 ,0 + db 0 ,207,203,200,198,200,203,207,0 ,0 + db 0 ,0 ,207,203,202,203,207,0 ,0 ,0 + db 0 ,0 ,0 ,207,205,207,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + +GUIIconDataButtonFill: + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,207,209,207,0 ,0 ,0 ,0 + db 0 ,0 ,207,211,212,211,207,0 ,0 ,0 + db 0 ,207,211,214,216,214,211,207,0 ,0 + db 0 ,207,212,216,217,216,212,207,0 ,0 + db 0 ,207,211,214,216,214,211,207,0 ,0 + db 0 ,0 ,207,211,212,211,207,0 ,0 ,0 + db 0 ,0 ,0 ,207,209,207,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + +GUIIconDataSlideBar: + db 0 ,0 ,0 ,0 ,216,0 ,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,212,216,220,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,212,216,220,202,0 ,0 ,0 + db 0 ,0 ,212,212,216,218,220,0 ,0 ,0 + db 0 ,0 ,212,214,216,218,220,202,0 ,0 + db 0 ,0 ,212,214,216,218,220,202,0 ,0 + db 0 ,0 ,0 ,212,216,220,202,202,0 ,0 + db 0 ,0 ,0 ,212,216,220,202,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,216,202,202,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,202,0 ,0 ,0 ,0 + +GUIIconDataCheckBoxUC: + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,220,219,218,217,216,215,0 ,0 ,0 + db 0 ,219,218,217,216,215,214,202,0 ,0 + db 0 ,218,217,216,215,214,213,202,0 ,0 + db 0 ,217,216,215,214,213,212,202,0 ,0 + db 0 ,216,215,214,213,212,211,202,0 ,0 + db 0 ,215,214,213,212,211,210,202,0 ,0 + db 0 ,0 ,202,202,202,202,202,202,0 ,0 + +GUIIconDataCheckBoxC: + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,165,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,165,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,165,0 ,0 ,0 + db 0 ,220,219,218,217,165,215,0 ,0 ,0 + db 0 ,165,165,217,165,165,214,202,0 ,0 + db 0 ,218,165,216,165,214,213,202,0 ,0 + db 0 ,217,165,165,165,213,212,202,0 ,0 + db 0 ,216,215,165,213,212,211,202,0 ,0 + db 0 ,215,214,165,212,211,210,202,0 ,0 + db 0 ,0 ,202,202,202,202,202,202,0 ,0 + +GUIIconDataCheckBoxX: + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,165,0 ,0 ,0 ,0 ,0 ,165,0 ,0 + db 0 ,220,165,218,217,216,165,0 ,0 ,0 + db 0 ,219,218,165,216,165,214,202,0 ,0 + db 0 ,218,217,216,165,214,213,202,0 ,0 + db 0 ,217,216,165,214,165,212,202,0 ,0 + db 0 ,216,165,214,213,212,165,202,0 ,0 + db 0 ,165,214,213,212,211,210,165,0 ,0 + db 0 ,0 ,202,202,202,202,202,202,0 ,0 + +GUIIconDataUpArrow: + db 201,209,209,209,209,209,209,200,0 ,0 + db 207,205,205,202,203,205,205,203,0 ,0 + db 207,205,201,202,203,202,205,203,0 ,0 + db 207,200,205,202,203,205,201,203,0 ,0 + db 207,205,205,202,203,205,205,203,0 ,0 + db 207,205,205,202,203,205,205,203,0 ,0 + db 207,205,205,202,203,205,205,203,0 ,0 + db 199,201,201,201,201,201,201,198,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + +GUIIconDataDownArrow: + db 201,209,209,209,209,209,209,200,0 ,0 + db 207,205,205,202,203,205,205,203,0 ,0 + db 207,205,205,202,203,205,205,203,0 ,0 + db 207,205,205,202,203,205,205,203,0 ,0 + db 207,200,205,202,203,205,201,203,0 ,0 + db 207,205,201,202,203,202,205,203,0 ,0 + db 207,205,205,202,203,205,205,203,0 ,0 + db 199,201,201,201,201,201,201,198,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 + +NEWSYM SnowData +dw 161,251,115,211,249,87,128,101,232,176,51,180,108,193,224,112,254,159,102,238 +dw 223,123,218,42,173,160,143,170,64,1,174,29,34,187,194,199,40,89,232,32 +dw 7,195,141,67,216,48,234,1,243,116,164,182,146,136,66,70,36,43,98,208 +dw 63,240,216,253,147,36,33,253,98,80,228,156,73,82,85,1,97,72,187,239 +dw 18,196,127,182,22,22,101,25,124,145,240,213,186,22,7,161,30,98,90,197 +dw 22,205,32,150,59,133,49,140,10,128,142,185,176,142,220,195,100,102,105,194 +dw 43,139,184,153,1,95,176,169,192,201,233,243,73,65,188,14,194,39,251,140 +dw 239,181,142,160,242,248,82,49,9,157,233,162,254,121,112,6,118,24,56,121 +dw 74,209,1,223,145,6,75,73,18,168,194,168,58,39,222,170,214,75,45,218 +dw 39,197,242,98,22,90,255,5,144,244,252,55,98,18,135,101,27,85,215,207 +dw 183,28,201,142,45,122,145,159,41,243,109,29,117,203,7,234,231,214,131,133 +dw 217,8,74,207,130,77,21,229,167,78,218,109,142,58,134,238,29,182,178,14 +dw 144,129,196,219,60,128,30,105,57,53,76,122,242,208,101,241,246,99,248,67 +dw 137,244,70,51,202,94,164,125,115,72,61,72,129,169,155,122,91,154,160,83 +dw 41,102,223,218,140,40,132,16,223,92,50,230,168,47,126,117,242,136,1,245 +dw 171,0,36,98,73,69,14,229,66,177,108,92,39,250,243,161,111,85,211,99 +dw 52,98,121,188,128,201,90,205,223,92,177,19,87,18,75,54,6,81,235,137 +dw 247,66,211,129,247,39,119,206,116,250,113,231,190,196,53,51,34,114,39,22 +dw 192,33,249,151,26,22,139,97,171,238,182,88,22,176,157,255,178,199,138,98 +dw 140,36,112,90,25,245,134,64,48,190,165,113,24,195,84,70,175,9,179,69 +dw 13,26,167,237,163,159,185,128,109,114,86,74,188,103,141,48,188,203,205,191 +dw 215,193,224,4,153,36,108,3,172,235,56,251,211,115,173,216,240,33,78,150 +dw 133,64,51,103,56,26,165,222,70,148,115,119,246,229,181,63,109,49,228,108 +dw 126,10,170,48,87,42,193,24,28,255,176,176,209,181,97,93,61,241,201,137 +dw 129,97,24,159,168,215,61,113,104,143,168,7,196,216,149,239,110,65,75,143 +dw 238,0,37,19,8,56,65,234,228,72,42,5,226,95,243,51,55,231,114,90 +dw 160,141,171,108,218,252,154,64,175,142,214,211,180,129,217,118,33,130,213,2 +dw 73,145,93,21,162,141,97,225,112,253,49,43,113,208,131,104,31,51,192,37 +dw 117,186,16,45,61,114,220,6,89,163,197,203,142,80,89,115,190,190,228,15 +dw 166,145,59,139,120,79,104,252,246,73,113,144,224,65,204,155,221,85,31,99 +dw 48,253,94,159,215,31,123,204,248,153,31,210,174,178,54,146,152,88,56,92 +dw 197,35,124,104,211,118,1,207,108,68,123,161,107,69,143,13,79,170,130,193 +dw 214,153,219,247,227,2,170,208,248,139,118,241,247,183,18,135,246,126,201,46 +dw 70,234,171,72,18,135,236,216,32,178,148,231,161,15,6,254,34,181,5,71 +dw 2,219,71,87,252,16,202,190,180,83,99,209,75,134,78,84,114,32,171,246 +dw 125,11,57,200,102,29,176,26,205,151,152,108,100,146,117,95,71,77,158,207 +dw 60,192,50,135,223,237,231,53,27,195,170,146,155,160,92,224,247,187,14,50 +dw 203,5,153,42,17,75,109,14,78,160,236,114,131,105,189,209,233,135,221,207 +dw 226,119,104,10,178,107,77,160,233,179,120,227,133,241,32,223,63,247,66,157 +dw 140,81,118,81,63,193,173,228,214,78,124,123,222,149,9,242,0,128,194,110 + +NEWSYM SnowVelDist +db 57,92,100,19,100,184,238,225,55,240,255,221,215,105,226,153,164,41,22,93 +db 176,203,155,199,244,52,233,219,110,227,229,227,152,240,83,248,226,31,163,22 +db 28,156,18,10,248,67,123,167,25,138,90,10,79,107,208,229,248,233,185,10 +db 167,21,19,178,132,154,81,70,20,71,95,147,72,27,91,189,13,189,102,84 +db 195,123,251,93,68,36,178,59,107,99,104,191,76,110,44,206,123,46,98,112 +db 26,50,1,35,150,17,242,208,69,23,202,197,59,80,136,124,40,89,11,40 +db 1,136,90,72,198,83,2,174,174,4,28,205,135,35,194,54,22,40,4,132 +db 191,88,163,66,204,230,35,111,9,177,254,174,163,68,5,88,111,235,58,236 +db 4,248,172,154,101,164,43,223,10,13,210,125,146,73,192,57,117,152,128,36 +db 106,21,253,113,110,133,244,4,150,32,76,71,22,106,210,244,46,128,27,215 +db 231,112,177,196,198,120,196,57,234,74,235,108,64,181,209,188,177,63,197,200 +db 126,164,136,163,48,62,225,223,212,201,195,121,90,7,10,196,88,53,39,249 +db 147,98,65,253,246,3,152,125,242,105,44,129,94,232,13,4,86,220,194,67 +db 186,210,171,197,64,138,89,78,58,150,52,79,138,201,244,111,106,181,192,69 +db 234,253,239,113,98,37,209,151,60,47,241,235,185,52,173,94,172,182,47,150 +db 80,118,10,58,161,237,10,64,238,198,14,74,132,250,234,63,169,86,158,170 +db 76,168,124,133,28,203,246,140,228,77,50,53,115,113,157,218,90,192,28,209 +db 72,117,156,101,226,99,11,245,69,59,17,175,164,59,8,166,163,185,10,60 +db 100,19,26,38,114,232,180,115,238,184,88,103,178,67,212,21,87,64,85,1 +db 62,87,155,62,21,96,205,195,131,97,191,252,218,209,179,201,12,2,234,110 +db 162,14,145,170,156,105,85,132,132,60,239,14,80,129,225,144,149,244,188,8 +db 13,168,181,168,30,142,24,110,26,172,231,182,50,214,66,193,100,45,132,144 +db 205,190,16,133,45,250,83,183,140,229,117,226,68,59,163,96,235,227,25,155 +db 209,105,41,214,30,107,2,85,180,23,241,39,113,63,75,44,107,142,93,29 +db 62,240,235,152,147,52,54,146,109,112,139,162,238,198,201,8,141,115,112,106 +db 4,99,25,155,111,161,114,253,75,100,28,59,101,150,2,122,228,6,12,59 +db 249,181,67,136,227,227,199,46,75,203,50,25,50,61,62,22,238,124,218,134 +db 243,21,243,222,94,138,161,234,133,23,138,45,4,226,154,227,8,84,105,126 +db 200,127,240,144,124,197,102,144,53,29,94,231,108,175,136,37,44,183,178,95 +db 41,196,214,12,42,221,106,225,151,32,53,130,24,211,88,14,135,18,90,219 +db 177,129,90,217,162,181,199,133,116,56,36,100,230,91,220,83,41,65,20,64 +db 177,197,249,24,242,62,26,234,92,44,167,153,243,94,179,163,103,29,220,199 +db 128,94,236,152,53,32,77,78,228,89,124,85,87,50,197,116,179,105,236,139 +db 102,17,159,66,176,27,205,36,113,80,60,6,61,174,254,174,246,72,154,31 +db 97,40,10,8,114,203,238,26,89,51,134,110,118,176,87,32,192,210,146,207 +db 88,45,156,179,61,224,87,107,107,1,252,187,203,100,169,211,205,105,12,231 +db 137,176,166,37,192,241,169,84,32,85,112,168,154,7,247,146,183,225,246,173 +db 57,103,110,236,113,118,203,200,22,87,251,7,138,37,12,84,221,171,51,209 +db 242,37,89,73,151,162,139,189,131,209,221,96,107,144,175,79,199,123,98,138 +db 226,86,221,254,72,14,126,180,200,171,85,94,120,124,196,225,150,57,219,158 + +SECTION .text + +NEWSYM GuiAsmEnd diff --git a/zsnes/src/gui/guiload.inc b/zsnes/src/gui/guiload.inc index ba5052be..4a50bf06 100644 --- a/zsnes/src/gui/guiload.inc +++ b/zsnes/src/gui/guiload.inc @@ -1,1600 +1,1600 @@ -;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. - - -; GUI File (Game) Loader - -%macro GUIGetEntry 1 - mov edx,%1 - mov cx,20h - call Get_First_Entry - jc %%nomore -%%moreentries - test byte[DTALoc+15h],10h - jnz %%nofile - inc dword[GUInumentries] - mov esi,DTALoc+1Eh - mov byte[edi],0 - inc edi - mov ecx,13 -%%nextchar - mov al,[esi] - mov [edi],al - inc esi - inc edi - dec ecx - jnz %%nextchar -%%nofile - call Get_Next_Entry - jnc %%moreentries -%%nomore -%endmacro - -%macro GUIGetEntry2 1 - mov edx,%1 - mov cx,20h - call Get_First_Entry - jc %%nomore -%%moreentries - test byte[DTALoc+15h],10h - jnz %%nofile - mov eax,[GUInumentries] - shl eax,2 - add eax,spcRamcmp - mov [eax],edi - inc dword[GUInumentries] - mov esi,DTALoc+1Eh - mov byte[edi],0 - inc edi -%%nextchar - mov al,[esi] - mov [edi],al - inc esi - inc edi - or al,al - jnz %%nextchar -%%nofile - call Get_Next_Entry - jnc %%moreentries -%%nomore -%endmacro - -%macro GUIGetDir2 0 - mov edx,GUIfindDIR - mov cx,10h - call Get_First_Entry - jc .nomore -.moreentries - test byte[DTALoc+15h],10h - jz .nodir - mov eax,[GUInumentries] - shl eax,2 - add eax,spcRamcmp - mov [eax],edi - inc dword[GUInumentries] - inc dword[GUIdirentries] - mov esi,DTALoc+1Eh - mov byte[edi],1 - inc edi -.nextchar - mov al,[esi] - mov [edi],al - inc esi - inc edi - or al,al - jnz .nextchar -.nodir - call Get_Next_Entry - jnc .moreentries -.nomore -%endmacro - -%macro GUIGetDir 0 - mov edx,GUIfindDIR - mov cx,10h - call Get_First_Entry - jc .nomore -.moreentries - test byte[DTALoc+15h],10h - jz .nodir - inc dword[GUInumentries] - inc dword[GUIdirentries] - mov esi,DTALoc+1Eh - mov byte[edi],1 - inc edi - mov ecx,13 -.nextchar - mov al,[esi] - mov [edi],al - inc esi - inc edi - dec ecx - jnz .nextchar -.nodir - call Get_Next_Entry - jnc .moreentries -.nomore -%endmacro - -%macro GUIPutDrive 0 - mov byte[edi],2 - inc edi - mov byte[edi],'[' - mov [edi+1],al - mov byte[edi+2],':' - mov byte[edi+3],']' - mov byte[edi+4],0 - add edi,13 - mov byte[esi],2 - inc esi - mov byte[esi],'[' - mov [esi+1],al - mov byte[esi+2],':' - mov byte[esi+3],']' - mov byte[esi+4],0 - add esi,31 - inc dword[GUInumentries] - inc dword[GUIdirentries] -%endmacro - -%macro GUIPutDrive2 0 - mov byte[edi],2 - inc edi - mov byte[edi],'[' - mov [edi+1],al - mov byte[edi+2],':' - mov byte[edi+3],']' - mov byte[edi+4],0 - add edi,5 - inc dword[GUInumentries] - inc dword[GUIdirentries] -%endmacro - -;LGUI - -SECTION .bss -netlastloaded resb 1 -SECTION .text - -GUIloadfilename: - cmp byte[CNetType],15 - je .noload - cmp byte[CNetType],12 - je .noload - cmp byte[CNetType],11 - je .noload - cmp byte[CNetType],10 - je .noload - cmp byte[CNetType],21 - je .noload - cmp byte[CNetType],22 - jne .yesload -.noload - ret -.yesload - cmp byte[CNetType],20 - jne near .nocnettype - mov byte[netlastloaded],1 -; FileNameMod times 29 db 0 - cmp byte[GUIcmenupos],1 - jne .nomenuout - mov byte[GUIcmenupos],0 -.nomenuout - mov esi,FileNameMod -.nextfnc - mov cl,[eax] - mov [esi],cl - inc eax - inc esi - cmp cl,0 - jne .nextfnc - mov byte[RemoteCommand],10 - pushad - call GUIQuickLoadUpdate - popad - ret -.nocnettype - cmp byte[CNetType],20 - je .okay20 -; ret -.okay20 - mov esi,eax - ; find length of string & copy filename - xor cl,cl -.findnext - mov ch,[esi] - cmp byte[esi],0 - je .foundend - inc esi - inc cl - jmp .findnext -.foundend - mov [fname],cl - ; copy filename - mov esi,eax - mov edi,fname+1 -.continuecopy - mov al,[esi] - mov [edi],al - cmp al,0 - je .foundzero - inc esi - inc edi - jmp .continuecopy -.foundzero - - ; get LoadDrive/LoadDir & SRAMDrive/SRAMDir - mov ebx,LoadDir - mov edx,LoadDrive - call Get_Dir -%ifndef __LINUX__ - cmp byte[cfgloadsdir],0 - jne .nosdrive - mov ebx,SRAMDir - mov edx,SRAMDrive - call Get_Dir -%endif -.nosdrive - - ; create .srm header - call makeextension - ; clear memory - mov edi,[sram] - mov eax,0FFFFFFFFh - mov ecx,8192 -.n - mov [edi],eax - add edi,4 - dec ecx - jnz .n - call clearmem2 - - mov dword[nmiprevaddrl],0 - mov dword[nmiprevaddrh],0 - mov dword[nmirept],0 - mov dword[nmiprevline],224 - mov dword[nmistatus],0 - mov dword[spcnumread],0 - mov dword[spchalted],-1 - mov byte[NextLineCache],0 - mov byte[curexecstate],1 - - mov byte [romloadskip],1 - ; load file - call loadfileGUI - cmp byte[ZipSupport],2 - je near .noloader - cmp byte[GUIloadfailed],1 - je near .noloader - - mov byte[CheatOn],0 - mov byte[NumCheats],0 -; mov byte[CheatSrcByteSize],0 -; mov byte[CheatSrcByteBase],0 -; mov byte[CheatSrcSearchType],0 - mov byte[CheatWinMode],0 - mov byte[CheatSearchStatus],0 - - call SetupROM - call showinfogui - call initsnes - mov byte[snesmouse],0 - mov byte[sramsavedis],0 - mov eax,regsbackup - mov ebx,sndrot - mov ecx,3019 -.rbackupl - mov dl,[eax] - mov [ebx],dl - inc ebx - inc eax - dec ecx - jnz .rbackupl - cmp byte[yesoutofmemory],1 - jne .noout - call outofmemfix -.noout - call GUIDoReset - call GUIQuickLoadUpdate - cmp byte[AutoLoadCht],0 - je .nocheatload - cmp byte[CNetType],20 - je .nocheatload - ; change dir to LoadDrive/LoadDir - mov dl,[LoadDrive] - mov ebx,LoadDir - call Change_Dir - call CheatCodeLoad -.nocheatload - cmp byte[AutoState],0 - je .noloader - call LoadSecondState -.noloader - cmp byte[GUIwinptr],1 - jne .nowinopen - mov al,[GUIpmenupos] - mov [GUIcmenupos],al -.nowinopen - ; change dir to LoadDrive/LoadDir - mov dl,[LoadDrive] - mov ebx,LoadDir - call Change_Dir - ret - -GUILoadData: - mov byte[GUICBHold],0 - cmp byte[GUIcurrentfilewin],0 - je near .loadfiles - ; Change directory - cmp byte[GUIloadfntype],0 - jne .nottype0c - mov eax,[GUIcurrentdircursloc] - add eax,[GUIfileentries] - mov eax,[spcRamcmp+eax*4] - jmp .donetype0 -.nottype0c - mov eax,[GUIcurrentdircursloc] - mov ebx,eax - lea eax,[eax*8] - add ebx,ebx - add eax,ebx - add ebx,ebx - add eax,ebx - add eax,[GUIdirStartLoc] -.donetype0 - inc eax - cmp byte[eax+2],':' - je .drive - mov edx,eax - call Change_Single_Dir - jc .error - call GetLoadData.a -.error - ret -.drive - ; Change Drive - mov dl,[eax+1] - sub dl,65 - call Change_Drive - call GetLoadData.a - ret -.unableload - pop eax - ret -.loadfiles - mov byte[LoadDuplicFound],0 - cmp byte[prevlfreeze],0 - jne near .frozen -; cmp byte[GUIloadfntype],0 -; je near .frozen - - ; check if a duplicate exists - mov esi,prevloadnames -.checkanother - push esi - mov edx,[GUIcurrentcursloc] - shl edx,5 - add edx,[spcBuffera] - cmp byte[GUIloadfntype],0 - jne .nottype0 - mov edx,[GUIcurrentcursloc] - mov edx,[spcRamcmp+edx*4] -.nottype0 - inc edx - mov cl,16 -.dloop - mov al,[edx] - cmp [esi],al - jne .nomatch - inc edx - inc esi - dec cl - jz .matchfound - cmp al,0 - jne .dloop -.matchfound - pop esi - mov byte[LoadDuplicFound],1 - jmp .frozen -.nomatch - pop esi - add esi,16 - cmp esi,prevloadnames+10*16 - jne near .checkanother - - ; copy game name - ; shift names down - mov esi,prevloadnames+16*9-1 - mov ecx,16*9 -.loop - mov al,[esi] - mov [esi+16],al - dec esi - dec edi - dec ecx - jnz .loop - mov esi,prevloadfnamel+512*9-1 - mov edi,prevloaddnamel+512*9-1 - mov ecx,512*9 -.loop2 - mov al,[esi] - mov [esi+512],al - mov al,[edi] - mov [edi+512],al - dec esi - dec edi - dec ecx - jnz .loop2 -.skip - ; copy game name - mov edx,[GUIcurrentcursloc] - shl edx,5 - add edx,[spcBuffera] - cmp byte[GUIloadfntype],0 - jne .nottype0b - mov edx,[GUIcurrentcursloc] - mov edx,[spcRamcmp+edx*4] -.nottype0b - inc edx - mov ebx,prevloadnames - mov ecx,16 -.loopfnc - mov al,[edx] - mov [ebx],al - inc edx - inc ebx - dec ecx - jnz .loopfnc - - ; get Drive/Dir - mov ebx,prevloaddnamel+1 - mov edx,prevloaddnamel - call Get_Dir -.frozen - - cmp byte[GUIloadfntype],0 - jne .nottype0b2 - mov eax,[GUIcurrentcursloc] - mov eax,[spcRamcmp+eax*4] - jmp .donetype0b -.nottype0b2 - mov eax,[GUIcurrentcursloc] - mov ebx,eax - lea eax,[eax*8] - add ebx,ebx - add eax,ebx - add ebx,ebx - add eax,ebx - add eax,spcRamcmp -.donetype0b - inc eax - cmp byte[prevlfreeze],0 - jne .foundend - cmp byte[LoadDuplicFound],0 - jne .foundend - mov esi,eax - mov edi,prevloadfnamel - ; copy filename -.findnext - mov ch,[esi] - mov [edi],ch - cmp ch,0 - je .foundend - inc esi - inc edi - jmp .findnext -.foundend - call GUIloadfilename - xor eax,eax - mov al,[GUIwinptr] - dec eax - mov byte[GUIwinactiv+1],0 - mov byte[GUIwinorder+eax],0 - dec byte[GUIwinptr] - ret -SECTION .data -.drivefn db 'A:\temp.tmp',0 -SECTION .text - -GetNormalEntries2: - cmp byte[showallext],1 - je near .guishowall - GUIGetEntry2 GUIsmcfind - GUIGetEntry2 GUIsfcfind - GUIGetEntry2 GUIswcfind - GUIGetEntry2 GUIfigfind - GUIGetEntry2 GUImgdfind - GUIGetEntry2 GUIufofind - %ifndef __MSDOS__ - GUIGetEntry2 GUIfindGZIP - %endif - GUIGetEntry2 GUIfind058 - GUIGetEntry2 GUIfind078 - GUIGetEntry2 GUIfindUSA - GUIGetEntry2 GUIfindEUR - GUIGetEntry2 GUIfindJAP - GUIGetEntry2 GUIfindBIN -; cmp byte[OSPort],1 -; je near .noasm - GUIGetEntry2 GUIfindZIP -;.noasm - GUIGetEntry2 GUIfind1 - jmp .guiNext -.guishowall - GUIGetEntry2 GUIfindall -.guiNext - ret - -GetNormalEntries: - cmp byte[showallext],1 - je near .guishowall - GUIGetEntry GUIsmcfind - GUIGetEntry GUIsfcfind - GUIGetEntry GUIswcfind - GUIGetEntry GUIfigfind - GUIGetEntry GUImgdfind - GUIGetEntry GUIufofind - %ifndef __MSDOS__ - GUIGetEntry GUIfindGZIP - %endif - GUIGetEntry GUIfind058 - GUIGetEntry GUIfind078 - GUIGetEntry GUIfindUSA - GUIGetEntry GUIfindEUR - GUIGetEntry GUIfindJAP - GUIGetEntry GUIfindBIN -; cmp byte[OSPort],1 -; je near .noasm - GUIGetEntry GUIfindZIP -;.noasm - GUIGetEntry GUIfind1 - jmp .guiNext -.guishowall - GUIGetEntry GUIfindall -.guiNext - ret - -GUIGetEntryLFNfunc: - push es - push edi - mov eax,714Eh ; Findfirst - mov cx,ds - mov es,cx - mov ch,0 - mov cl,0 - mov edi,LFNData - mov si,0 - int 21h - mov [LFNHandle],ax - pop edi - pop es - jc near .done -.next - mov esi,LFNData+44 - mov ecx,23 -.loop - mov al,[esi] - cmp al,'a' - jb .nocap - cmp al,'z' - ja .nocap - sub al,'a'-'A' -.nocap - cmp al,'%' - jne .noperc - cmp byte[esi+1],'0' - jb .noperc - cmp byte[esi+1],'F' - ja .noperc - cmp byte[esi+2],'0' - jb .noperc - cmp byte[esi+2],'F' - ja .noperc - mov al,[esi+2] - sub al,'0' - cmp al,9 - jbe .nodec - sub al,'A'-'0'-10 -.nodec - mov ah,[esi+1] - sub ah,'0' - cmp ah,9 - jbe .nodecb - sub ah,'A'-'0'-10 -.nodecb - shl ah,4 - or al,ah - add esi,2 -.noperc - mov [edi],al - inc edi - inc esi - dec ecx - jnz near .loop - mov byte[edi],0 - add edi,9 - push es - push edi - mov bx,[LFNHandle] - mov eax, 714Fh ; Findnext - mov dx,ds - mov es,dx - mov edi,LFNData - mov si,0 - int 21h - pop edi - pop es - jnc near .next -.done - mov eax,71A1h ;Filefind Close - mov bx,[LFNHandle] - int 21h - ret - -GUIGetEntryLFNfuncdir: - mov edx,GUIfindall - push es - push edi - mov eax,714Eh ; Findfirst - mov cx,ds - mov es,cx - mov ch,10h - mov cl,10h - mov edi,LFNData - mov si,0 - int 21h - mov [LFNHandle],ax - pop edi - pop es - jc near .done -.next - mov esi,LFNData+44 - mov ecx,11 -.loop - mov al,[esi] - cmp al,'a' - jb .nocap - cmp al,'z' - ja .nocap - sub al,'a'-'A' -.nocap - mov [edi],al - inc edi - inc esi - dec ecx - jnz .loop - mov byte[edi],0 - add edi,21 - push es - push edi - mov bx,[LFNHandle] - mov eax, 714Fh ; Findnext - mov dx,ds - mov es,dx - mov edi,LFNData - mov si,0 - int 21h - pop edi - pop es - jnc near .next -.done - mov eax,71A1h ;Filefind Close - mov bx,[LFNHandle] - int 21h - ret - -%macro GUIGetEntryLFN 1 - mov edx,%1 - call GUIGetEntryLFNfunc -%endmacro - -GetLoadLfn: - call GetNormalEntries - push edi - mov edi,[spcBuffera] - inc edi - cmp byte[showallext],1 - je near .guishowall - GUIGetEntryLFN GUIsmcfind - GUIGetEntryLFN GUIsfcfind - GUIGetEntryLFN GUIswcfind - GUIGetEntryLFN GUIfigfind - GUIGetEntryLFN GUImgdfind - GUIGetEntryLFN GUIufofind - %ifndef __MSDOS__ - GUIGetEntryLFN GUIfindGZIP - %endif - GUIGetEntryLFN GUIfind058 - GUIGetEntryLFN GUIfind078 - GUIGetEntryLFN GUIfindUSA - GUIGetEntryLFN GUIfindEUR - GUIGetEntryLFN GUIfindJAP - GUIGetEntryLFN GUIfindBIN - GUIGetEntryLFN GUIfindZIP - GUIGetEntryLFN GUIfind1 - jmp .guiNext -.guishowall - GUIGetEntryLFN GUIfindall -.guiNext - pop edi - ret - -SECTION .bss -LFNData resb 400 -LFNHandle resw 1 -SECTION .text - -GetLoadNormal: - call GetNormalEntries2 - ret - -GetLoadHeader: - call GetNormalEntries - push edi - ; Copy every 14 bytes of spcRamcmp into every 32 bytes of spcBuffer - mov ecx,[GUInumentries] - mov esi,spcRamcmp+1 - mov edi,[spcBuffera] - inc edi - cmp ecx,0 - je near .none -.loop - ; open file at esi and store in edi - push esi - push ecx - push edi - ; check if .zip file - mov eax,esi -.zipdet - cmp byte[eax],0 - je near .skipcheck - cmp byte[eax],'.' - je .dotdetected - inc eax - jmp .zipdet -.dotdetected - cmp byte[eax+1],'z' - je near .yeszipa - cmp byte[eax+1],'Z' - jne near .skipcheck -.yeszipa - cmp byte[eax+2],'i' - je near .yeszipb - cmp byte[eax+2],'I' - jne near .skipcheck -.yeszipb - cmp byte[eax+3],'p' - je near .yeszipc - cmp byte[eax+3],'P' - jne near .skipcheck -.yeszipc - ; move esi to edi -.ziploop - mov al,[esi] - mov [edi],al - inc esi - inc edi - or al,al - jnz .ziploop - jmp .doneall -.skipcheck - ; open file - mov edx,esi - call Open_File - jc near .fileerror - mov bx,ax - ; Check filesize - mov cx,0 - mov dx,0 - call File_Seek_End - jc near .fileerror - cmp dx,0 - jne .locokay - cmp ax,32768 - jae .locokay - jmp .fileerror -.locokay - ; Look for 512 byte header - mov cx,0 - mov dx,250 - call File_Seek - jc near .fileerror - mov ecx,20 - mov edx,fnameheadtemp - call Read_File - jc near .fileerror - ; if 10 or more 0's, then header - mov ecx,20 - mov esi,fnameheadtemp - xor eax,eax -.loop2 - cmp byte[esi],0 - jne .notzero2 - inc eax -.notzero2 - inc esi - dec ecx - jnz .loop2 - cmp eax,10 - ja near .yes512header - mov cx,0 - mov dx,32704 - call File_Seek - jc near .fileerror - mov ecx,20 - mov edx,edi - call Read_File - jc near .fileerror - mov cx,0 - mov dx,32704+32768 - call File_Seek - jc near .fileerror - mov ecx,20 - mov edx,fnameheadtemp - call Read_File - jc near .fileerror - jmp .noheaderdone -.yes512header - mov cx,0 - mov dx,32704+512 - call File_Seek - jc near .fileerror - mov ecx,20 - mov edx,edi - call Read_File - jc near .fileerror - mov cx,1 - mov dx,448 - call File_Seek - jc near .fileerror - mov ecx,20 - mov edx,fnameheadtemp - call Read_File - jc near .fileerror -.noheaderdone - mov ecx,20 -.loops - cmp byte[edi],0 - jne .notzero - mov byte[edi],32 -.notzero - inc edi - dec ecx - jnz .loops - ; Check which header has more alphabets, then move - sub edi,20 - call .checkalpha - push eax - push edi - mov edi,fnameheadtemp - call .checkalpha - pop edi - mov ecx,eax - pop eax - cmp ecx,eax - jb .noswaps - mov ecx,20 - sub edi,20 - mov esi,fnameheadtemp -.loops2 - mov al,[esi] - mov [edi],al - inc edi - inc esi - dec ecx - jnz .loops2 -.noswaps - jmp .fileokay -.fileerror - mov eax,[.invfile] - mov [edi],eax - mov eax,[.invfile+4] - mov [edi+4],eax - mov eax,[.invfile+8] - mov [edi+8],eax - mov eax,[.invfile+12] - mov [edi+12],eax - mov eax,[.invfile+16] - mov [edi+16],eax -.fileokay - call Close_File -.doneall - pop edi - pop ecx - pop esi - mov byte[edi+20],0 - push edi - push esi - push ecx - ; check if first 20 bytes are all equal or not - mov al,[edi+1] - mov ecx,19 -.loopchk - cmp byte[edi+1],al - jne .notequal - inc edi - dec ecx - jnz .loopchk - sub edi,19 - mov ecx,14 -.loopcpy - mov al,[esi] - mov [edi],al - inc esi - inc edi - dec ecx - jnz .loopcpy -.notequal - pop ecx - pop esi - pop edi - ; Capitalize - push edi - push ecx - mov ecx,20 -.loop4 - mov al,[edi] - cmp al,'a' - jb .nocap - cmp al,'z' - ja .nocap - sub al,'a'-'A' -.nocap - mov [edi],al - dec ecx - jnz .loop4 - pop ecx - pop edi - add esi,14 - add edi,32 - dec ecx - jnz near .loop -.none - pop edi - ret - -.checkalpha - mov ecx,20 - xor eax,eax -.loop3 - cmp byte[edi],32 - je .alpha - cmp byte[edi],'A' - jb .noalpha - cmp byte[edi],'Z' - jbe .alpha - cmp byte[edi],'a' - jb .noalpha - cmp byte[edi],'z' - ja .noalpha -.alpha - inc eax -.noalpha - inc edi - dec ecx - jnz .loop3 - ret - -SECTION .data -.invfile db ' ** INVALID FILE **',0 -SECTION .bss -fnameheadtemp resb 22 -SECTION .text - -GetNormalDirEntries2: - GUIGetDir2 - ret - -GetNormalDirEntries: - GUIGetDir - ret - -GetLoadDirNormal2: - call GetNormalDirEntries2 - ret - -GetLoadDirNormal: - call GetNormalDirEntries - push edi - ; Copy every 14 bytes of spcRamcmp into every 32 bytes of spcBuffer - mov ecx,[GUIdirentries] - mov esi,[GUIdirStartLoc] - mov edi,dword[GUIfileentries] - shl edi,5 - add edi,[spcBuffera] - cmp ecx,0 - je .none -.loop - mov eax,[esi] - mov [edi],eax - mov eax,[esi+4] - mov [edi+4],eax - mov eax,[esi+8] - mov [edi+8],eax - xor ax,ax - mov [edi+12],ax - add esi,14 - add edi,32 - dec ecx - jnz .loop -.none - pop edi - ret - -GetLoadDirNormallfn: - call GetNormalDirEntries - push edi - ; Copy every 14 bytes of spcRamcmp into every 32 bytes of spcBuffer - mov edi,dword[GUIfileentries] - shl edi,5 - add edi,[spcBuffera] - inc edi - call GUIGetEntryLFNfuncdir - pop edi - ret - -SECTION .bss -Win95Failed resb 1 -SECTION .text - -NEWSYM GetCurDir - ; get Drive/Dir -%ifndef __LINUX__ - mov ebx,GUIcurrentdir+3 -%else - mov ebx,GUIcurrentdir -%endif - mov edx,GUIcurrentdir - call Get_Dir - -%ifndef __LINUX__ - add byte[GUIcurrentdir],65 - - mov byte[GUIcurrentdir+1],':' - mov byte[GUIcurrentdir+2],'\' -%endif - - cmp byte[GUIcurrentdir+35],0 - je .nodotend - mov byte[GUIcurrentdir+35],'.' - mov byte[GUIcurrentdir+36],'.' - mov byte[GUIcurrentdir+37],'.' - mov byte[GUIcurrentdir+38],0 -.nodotend - ; Set DTA address - call Set_DTA_Address - ret - -GetLoadData: - mov dword[GUIcurrentfilewin],0 -.a - call GetCurDir - mov dword[GUInumentries],0 - mov dword[GUIcurrentviewloc],0 - mov dword[GUIcurrentcursloc],0 - mov dword[GUIcurrentdirviewloc],0 - mov dword[GUIcurrentdircursloc],0 - mov edi,spcRamcmp - mov byte[Win95Failed],0 -; cmp byte[OSPort],1 -; ja .notdos -%ifdef __MSDOS__ - cmp byte[GUIloadfntype],2 - jne .nowin95lfn - clc - mov ax,7100h - int 21h - jc .nowin95lfn -%endif -;.notdos - mov byte[GUIloadfntype],0 -.nowin95lfn - cmp byte[GUIloadfntype],2 - je .win95lfn - cmp byte[GUIloadfntype],1 - je .snesheader - mov edi,[spcBuffera] - call GetLoadNormal - jmp .doneheader -.snesheader - mov byte[showallext],0 - call GetLoadHeader - jmp .doneheader -.win95lfn - call GetLoadLfn -.doneheader - cmp byte[Win95Failed],1 - jne .notfailed - mov byte[GUIloadfntype],0 - jmp GetLoadData -.notfailed - mov eax,dword[GUInumentries] - mov dword[GUIfileentries],eax - cmp dword[GUIfileentries],0 - jne .nonoentry - mov dword[GUIcurrentfilewin],1 -.nonoentry - - ; Sort List - push edi - ; compares string at esi to edi and returns 1 to al if esi is >, else 0 -.sortagain - mov byte[BubbleSorted],0 - mov esi,[spcBuffera] - inc esi - mov edi,spcRamcmp+1 - cmp dword[GUInumentries],1 - jbe near .nosort - cmp byte[GUIloadfntype],0 - je near .sort2 - mov ecx,[GUInumentries] - dec ecx -.nextentry - push ecx - ; check if esi > esi+32 - call GUIStringGreater - ; if it is, swap! - cmp al,0 - je near .noswap - mov ecx,31 -.nextswap - mov al,[esi] - mov bl,[esi+32] - mov [esi],bl - mov [esi+32],al - inc esi - dec ecx - jnz .nextswap - mov ecx,13 -.nextswap2 - mov al,[edi] - mov bl,[edi+14] - mov [edi],bl - mov [edi+14],al - inc edi - dec ecx - jnz .nextswap2 - mov byte[BubbleSorted],1 - sub esi,31 - sub edi,13 -.noswap - add esi,32 - add edi,14 - pop ecx - dec ecx - jnz near .nextentry -.nosort - cmp byte[BubbleSorted],1 - je near .sortagain - jmp .donesort - -.sort2 - mov esi,spcRamcmp - mov ecx,[GUInumentries] - dec ecx -.nextentryb - push ecx - mov ebx,[esi] - mov edx,[esi+4] - inc ebx - inc edx - ; check if ebx > edx - call GUIStringGreater2 - ; if it is, swap! - cmp al,0 - je near .noswapb - mov eax,[esi] - mov ebx,[esi+4] - mov [esi],ebx - mov [esi+4],eax - mov byte[BubbleSorted],1 -.noswapb - add esi,4 - pop ecx - dec ecx - jnz near .nextentryb -.nosortb - cmp byte[BubbleSorted],1 - je near .sortagain -.donesort - pop edi -GUIGetDirs: - mov dword[GUIdirentries],0 - mov [GUIdirStartLoc],edi - cmp byte[GUIloadfntype],0 - jne near .loadtype0 - mov eax,[GUInumentries] - mov [GUIdirStartLoc],eax -.loadtype0 - - cmp byte[GUIloadfntype],2 - je .win95lfn - cmp byte[GUIloadfntype],0 - je .normaldir - call GetLoadDirNormal - jmp .nowin95 -.normaldir - call GetLoadDirNormal2 - jmp .nowin95 -.win95lfn - call GetLoadDirNormallfn -.nowin95 - cmp dword[GUInumentries],0 - je near .nodirs - cmp dword[GUIdirentries],0 - je near .nodirs - - ; Sort List - ; copy from GUIdirStartLoc to spcBuffer+GUIdirentries*32 - ; compares string at esi to edi and returns 1 to al if esi is >, else 0 - - push edi - ; compares string at esi to edi and returns 1 to al if esi is >, else 0 -.sortagain - mov byte[BubbleSorted],0 - mov esi,dword[GUIfileentries] - shl esi,5 - add esi,[spcBuffera] - mov edi,[GUIdirStartLoc] - inc esi - inc edi - - cmp dword[GUIdirentries],1 - jbe near .nosort - mov ecx,[GUIdirentries] - dec ecx - cmp byte[GUIloadfntype],0 - je near .sort2 -.nextentry - push ecx - ; check if esi > esi+32 - call GUIStringGreater - ; if it is, swap! - cmp al,0 - je near .noswap - mov ecx,31 -.nextswap - mov al,[esi] - mov bl,[esi+32] - mov [esi],bl - mov [esi+32],al - inc esi - dec ecx - jnz .nextswap - mov ecx,13 -.nextswap2 - mov al,[edi] - mov bl,[edi+14] - mov [edi],bl - mov [edi+14],al - inc edi - dec ecx - jnz .nextswap2 - mov byte[BubbleSorted],1 - sub esi,31 - sub edi,13 -.noswap - add esi,32 - add edi,14 - pop ecx - dec ecx - jnz near .nextentry -.nosort - cmp byte[BubbleSorted],1 - je near .sortagain - pop edi - jmp .nodirs -.sort2 - mov esi,dword[GUIfileentries] - shl esi,2 - add esi,spcRamcmp -.nextentryb - push ecx - mov ebx,[esi] - mov edx,[esi+4] - inc ebx - inc edx - ; check if ebx > edx - call GUIStringGreater2 - ; if it is, swap! - cmp al,0 - je near .noswapb - mov eax,[esi] - mov ebx,[esi+4] - mov [esi],ebx - mov [esi+4],eax - mov byte[BubbleSorted],1 -.noswapb - add esi,4 - pop ecx - dec ecx - jnz near .nextentryb -.nosortb - cmp byte[BubbleSorted],1 - je near .sortagain - pop edi -.nodirs -%ifndef __LINUX__ - cmp byte[GUIloadfntype],0 - je near .drive2 - mov esi,[GUInumentries] - shl esi,5 - add esi,[spcBuffera] - mov al,65 - mov ecx,[numdrives] -.nextdrive - GUIPutDrive - inc al - dec ecx - jnz .nextdrive - jmp .nodrive -.drive2 - mov esi,[GUInumentries] - shl esi,2 - add esi,spcRamcmp - mov al,65 - mov ecx,[numdrives] -.nextdriveb - mov [esi],edi - GUIPutDrive2 - add esi,4 - inc al - dec ecx - jnz .nextdriveb -.nodrive -%endif - ret - -SECTION .bss -BubbleSorted resb 1 -GUIcurrentfilewin resd 1 -GUIcurrentviewloc resd 1 -GUIcurrentcursloc resd 1 -GUIcurrentdirviewloc resd 1 -GUIcurrentdircursloc resd 1 -GUIdirStartLoc resd 1 -GUInumentries resd 1 -GUIdirentries resd 1 -GUIfileentries resd 0 - -SECTION .data -%ifdef __LINUX__ -NEWSYM GUIsmcfind, db '*.[sS][mM][cC]',0 -NEWSYM GUIsfcfind, db '*.[sS][fF][cC]',0 -NEWSYM GUIswcfind, db '*.[sS][wW][cC]',0 -NEWSYM GUIfigfind, db '*.[fF][iI][gG]',0 -NEWSYM GUImgdfind, db '*.[mM][gG][dD]',0 -NEWSYM GUIufofind, db '*.[uU][fF][oO]',0 -%else -NEWSYM GUIsmcfind, db '*.SMC',0 -NEWSYM GUIsfcfind, db '*.SFC',0 -NEWSYM GUIswcfind, db '*.SWC',0 -NEWSYM GUIfigfind, db '*.FIG',0 -NEWSYM GUImgdfind, db '*.MGD',0 -NEWSYM GUIufofind, db '*.UFO',0 -%endif -NEWSYM GUIfind058, db '*.058',0 -NEWSYM GUIfind078, db '*.078',0 -%ifdef __LINUX__ -NEWSYM GUIfindUSA, db '*.[uU][sS][aA]',0 -NEWSYM GUIfindEUR, db '*.[eE][uU][rR]',0 -NEWSYM GUIfindJAP, db '*.[jJ][aA][pP]',0 -NEWSYM GUIfindBIN, db '*.[bB][iI][nN]',0 -NEWSYM GUIfindZIP, db '*.[zZ][iI][pP]',0 -NEWSYM GUIfindGZIP, db '*.[gG][zZ]',0 -%else -NEWSYM GUIfindUSA, db '*.USA',0 -NEWSYM GUIfindEUR, db '*.EUR',0 -NEWSYM GUIfindJAP, db '*.JAP',0 -NEWSYM GUIfindBIN, db '*.BIN',0 -NEWSYM GUIfindZIP, db '*.ZIP',0 -NEWSYM GUIfindGZIP, db '*.GZ',0 -%endif -NEWSYM GUIfind1, db '*.1',0 -%ifdef __LINUX__ -GUIfindDIR db '*',0 -NEWSYM GUIfindall, db '*',0 -%else -GUIfindDIR db '*.*',0 -NEWSYM GUIfindall, db '*.*',0 -%endif - -SECTION .data -NEWSYM DTALoc, times 2048+32 db 0 - -SECTION .text - -; Routines to load from the Quick Menu -loadquickfname: - pushad -.trynext - cmp byte[GUIwinptr],0 - je near .noclose - xor eax,eax - mov al,[GUIwinptr] - dec eax - xor ebx,ebx - mov bl,[GUIwinorder+eax] - ; close window - mov byte[GUIwinorder+eax],0 - mov byte[GUIwinactiv+ebx],0 - dec byte[GUIwinptr] - cmp byte[GUIwinptr],0 - jne .noclose - mov al,[GUIpmenupos] - mov [GUIcmenupos],al - jmp .trynext -.noclose - popad - - ; move menuitem to top - cmp ecx,0 - je near .nomove - cmp byte[prevlfreeze],0 - jne near .nomove - - ; copy 16 bytes of ebx to pressed - mov eax,[ebx] - mov [pressed],eax - mov eax,[ebx+4] - mov [pressed+4],eax - mov eax,[ebx+8] - mov [pressed+8],eax - mov eax,[ebx+12] - mov [pressed+12],eax - ; move each entry above ebx down -.next2 - mov eax,[ebx-16] - mov [ebx],eax - mov eax,[ebx+4-16] - mov [ebx+4],eax - mov eax,[ebx+8-16] - mov [ebx+8],eax - mov eax,[ebx+12-16] - mov [ebx+12],eax - sub ebx,16 - cmp ebx,prevloadnames - jne .next2 - ; copy 16 bytes of pressed to top - mov eax,[pressed] - mov [ebx],eax - mov eax,[pressed+4] - mov [ebx+4],eax - mov eax,[pressed+8] - mov [ebx+8],eax - mov eax,[pressed+12] - mov [ebx+12],eax - - ; copy 512 bytes of edi to pressed - mov ecx,128 - xor ebx,ebx -.loopb - mov eax,[edi+ebx*4] - mov [pressed+ebx*4],eax - inc ebx - dec ecx - jnz .loopb - ; move each entry above ebx down -.next3b - mov ecx,128 - xor ebx,ebx -.loop2b - mov eax,[edi-512+ebx*4] - mov [edi+ebx*4],eax - inc ebx - dec ecx - jnz .loop2b - sub edi,512 - cmp edi,prevloadfnamel - jne .next3b - ; copy 512 bytes of pressed to top - mov ecx,128 - xor ebx,ebx -.loop3b - mov eax,[pressed+ebx*4] - mov [edi+ebx*4],eax - inc ebx - dec ecx - jnz .loop3b - - ; copy 512 bytes of esi to pressed - mov ecx,128 - xor ebx,ebx -.loop - mov eax,[esi+ebx*4] - mov [pressed+ebx*4],eax - inc ebx - dec ecx - jnz .loop - ; move each entry above ebx down -.next3 - mov ecx,128 - xor ebx,ebx -.loop2 - mov eax,[esi-512+ebx*4] - mov [esi+ebx*4],eax - inc ebx - dec ecx - jnz .loop2 - sub esi,512 - cmp esi,prevloaddnamel - jne .next3 - ; copy 512 bytes of pressed to top - mov ecx,128 - xor ebx,ebx -.loop3 - mov eax,[pressed+ebx*4] - mov [esi+ebx*4],eax - inc ebx - dec ecx - jnz .loop3 - -; pushad -; mov ax,03h -; int 10h -; popad -; push edi -; mov edx,esi+1 -; call PrintStr -; pop edi -; mov edx,edi+1 -; call PrintStr -; jmp DosExit - - ; clear pressed - mov eax,pressed - mov ecx,128 -.loop4 - mov dword[eax],0 - add eax,4 - dec ecx - jnz .loop4 -.nomove - ; change dir - mov dl,[esi] - mov ebx,esi - inc ebx - call Change_Dir - call GetCurDir - mov eax,edi - push eax - mov edx,edi - call Open_File - jc near .failed - mov bx,ax - mov edx,.temp - mov ecx,1 - call Read_File - jc near .failed2 - call Close_File - jc near .failed - pop eax - pushad - call GUIQuickLoadUpdate - popad - - call GUIloadfilename - ret -.failed2 - call Close_File -.failed - pop eax - ret - -SECTION .bss -.temp resd 256 -SECTION .text +;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. + + +; GUI File (Game) Loader + +%macro GUIGetEntry 1 + mov edx,%1 + mov cx,20h + call Get_First_Entry + jc %%nomore +%%moreentries + test byte[DTALoc+15h],10h + jnz %%nofile + inc dword[GUInumentries] + mov esi,DTALoc+1Eh + mov byte[edi],0 + inc edi + mov ecx,13 +%%nextchar + mov al,[esi] + mov [edi],al + inc esi + inc edi + dec ecx + jnz %%nextchar +%%nofile + call Get_Next_Entry + jnc %%moreentries +%%nomore +%endmacro + +%macro GUIGetEntry2 1 + mov edx,%1 + mov cx,20h + call Get_First_Entry + jc %%nomore +%%moreentries + test byte[DTALoc+15h],10h + jnz %%nofile + mov eax,[GUInumentries] + shl eax,2 + add eax,spcRamcmp + mov [eax],edi + inc dword[GUInumentries] + mov esi,DTALoc+1Eh + mov byte[edi],0 + inc edi +%%nextchar + mov al,[esi] + mov [edi],al + inc esi + inc edi + or al,al + jnz %%nextchar +%%nofile + call Get_Next_Entry + jnc %%moreentries +%%nomore +%endmacro + +%macro GUIGetDir2 0 + mov edx,GUIfindDIR + mov cx,10h + call Get_First_Entry + jc .nomore +.moreentries + test byte[DTALoc+15h],10h + jz .nodir + mov eax,[GUInumentries] + shl eax,2 + add eax,spcRamcmp + mov [eax],edi + inc dword[GUInumentries] + inc dword[GUIdirentries] + mov esi,DTALoc+1Eh + mov byte[edi],1 + inc edi +.nextchar + mov al,[esi] + mov [edi],al + inc esi + inc edi + or al,al + jnz .nextchar +.nodir + call Get_Next_Entry + jnc .moreentries +.nomore +%endmacro + +%macro GUIGetDir 0 + mov edx,GUIfindDIR + mov cx,10h + call Get_First_Entry + jc .nomore +.moreentries + test byte[DTALoc+15h],10h + jz .nodir + inc dword[GUInumentries] + inc dword[GUIdirentries] + mov esi,DTALoc+1Eh + mov byte[edi],1 + inc edi + mov ecx,13 +.nextchar + mov al,[esi] + mov [edi],al + inc esi + inc edi + dec ecx + jnz .nextchar +.nodir + call Get_Next_Entry + jnc .moreentries +.nomore +%endmacro + +%macro GUIPutDrive 0 + mov byte[edi],2 + inc edi + mov byte[edi],'[' + mov [edi+1],al + mov byte[edi+2],':' + mov byte[edi+3],']' + mov byte[edi+4],0 + add edi,13 + mov byte[esi],2 + inc esi + mov byte[esi],'[' + mov [esi+1],al + mov byte[esi+2],':' + mov byte[esi+3],']' + mov byte[esi+4],0 + add esi,31 + inc dword[GUInumentries] + inc dword[GUIdirentries] +%endmacro + +%macro GUIPutDrive2 0 + mov byte[edi],2 + inc edi + mov byte[edi],'[' + mov [edi+1],al + mov byte[edi+2],':' + mov byte[edi+3],']' + mov byte[edi+4],0 + add edi,5 + inc dword[GUInumentries] + inc dword[GUIdirentries] +%endmacro + +;LGUI + +SECTION .bss +netlastloaded resb 1 +SECTION .text + +GUIloadfilename: + cmp byte[CNetType],15 + je .noload + cmp byte[CNetType],12 + je .noload + cmp byte[CNetType],11 + je .noload + cmp byte[CNetType],10 + je .noload + cmp byte[CNetType],21 + je .noload + cmp byte[CNetType],22 + jne .yesload +.noload + ret +.yesload + cmp byte[CNetType],20 + jne near .nocnettype + mov byte[netlastloaded],1 +; FileNameMod times 29 db 0 + cmp byte[GUIcmenupos],1 + jne .nomenuout + mov byte[GUIcmenupos],0 +.nomenuout + mov esi,FileNameMod +.nextfnc + mov cl,[eax] + mov [esi],cl + inc eax + inc esi + cmp cl,0 + jne .nextfnc + mov byte[RemoteCommand],10 + pushad + call GUIQuickLoadUpdate + popad + ret +.nocnettype + cmp byte[CNetType],20 + je .okay20 +; ret +.okay20 + mov esi,eax + ; find length of string & copy filename + xor cl,cl +.findnext + mov ch,[esi] + cmp byte[esi],0 + je .foundend + inc esi + inc cl + jmp .findnext +.foundend + mov [fname],cl + ; copy filename + mov esi,eax + mov edi,fname+1 +.continuecopy + mov al,[esi] + mov [edi],al + cmp al,0 + je .foundzero + inc esi + inc edi + jmp .continuecopy +.foundzero + + ; get LoadDrive/LoadDir & SRAMDrive/SRAMDir + mov ebx,LoadDir + mov edx,LoadDrive + call Get_Dir +%ifndef __LINUX__ + cmp byte[cfgloadsdir],0 + jne .nosdrive + mov ebx,SRAMDir + mov edx,SRAMDrive + call Get_Dir +%endif +.nosdrive + + ; create .srm header + call makeextension + ; clear memory + mov edi,[sram] + mov eax,0FFFFFFFFh + mov ecx,8192 +.n + mov [edi],eax + add edi,4 + dec ecx + jnz .n + call clearmem2 + + mov dword[nmiprevaddrl],0 + mov dword[nmiprevaddrh],0 + mov dword[nmirept],0 + mov dword[nmiprevline],224 + mov dword[nmistatus],0 + mov dword[spcnumread],0 + mov dword[spchalted],-1 + mov byte[NextLineCache],0 + mov byte[curexecstate],1 + + mov byte [romloadskip],1 + ; load file + call loadfileGUI + cmp byte[ZipSupport],2 + je near .noloader + cmp byte[GUIloadfailed],1 + je near .noloader + + mov byte[CheatOn],0 + mov byte[NumCheats],0 +; mov byte[CheatSrcByteSize],0 +; mov byte[CheatSrcByteBase],0 +; mov byte[CheatSrcSearchType],0 + mov byte[CheatWinMode],0 + mov byte[CheatSearchStatus],0 + + call SetupROM + call showinfogui + call initsnes + mov byte[snesmouse],0 + mov byte[sramsavedis],0 + mov eax,regsbackup + mov ebx,sndrot + mov ecx,3019 +.rbackupl + mov dl,[eax] + mov [ebx],dl + inc ebx + inc eax + dec ecx + jnz .rbackupl + cmp byte[yesoutofmemory],1 + jne .noout + call outofmemfix +.noout + call GUIDoReset + call GUIQuickLoadUpdate + cmp byte[AutoLoadCht],0 + je .nocheatload + cmp byte[CNetType],20 + je .nocheatload + ; change dir to LoadDrive/LoadDir + mov dl,[LoadDrive] + mov ebx,LoadDir + call Change_Dir + call CheatCodeLoad +.nocheatload + cmp byte[AutoState],0 + je .noloader + call LoadSecondState +.noloader + cmp byte[GUIwinptr],1 + jne .nowinopen + mov al,[GUIpmenupos] + mov [GUIcmenupos],al +.nowinopen + ; change dir to LoadDrive/LoadDir + mov dl,[LoadDrive] + mov ebx,LoadDir + call Change_Dir + ret + +GUILoadData: + mov byte[GUICBHold],0 + cmp byte[GUIcurrentfilewin],0 + je near .loadfiles + ; Change directory + cmp byte[GUIloadfntype],0 + jne .nottype0c + mov eax,[GUIcurrentdircursloc] + add eax,[GUIfileentries] + mov eax,[spcRamcmp+eax*4] + jmp .donetype0 +.nottype0c + mov eax,[GUIcurrentdircursloc] + mov ebx,eax + lea eax,[eax*8] + add ebx,ebx + add eax,ebx + add ebx,ebx + add eax,ebx + add eax,[GUIdirStartLoc] +.donetype0 + inc eax + cmp byte[eax+2],':' + je .drive + mov edx,eax + call Change_Single_Dir + jc .error + call GetLoadData.a +.error + ret +.drive + ; Change Drive + mov dl,[eax+1] + sub dl,65 + call Change_Drive + call GetLoadData.a + ret +.unableload + pop eax + ret +.loadfiles + mov byte[LoadDuplicFound],0 + cmp byte[prevlfreeze],0 + jne near .frozen +; cmp byte[GUIloadfntype],0 +; je near .frozen + + ; check if a duplicate exists + mov esi,prevloadnames +.checkanother + push esi + mov edx,[GUIcurrentcursloc] + shl edx,5 + add edx,[spcBuffera] + cmp byte[GUIloadfntype],0 + jne .nottype0 + mov edx,[GUIcurrentcursloc] + mov edx,[spcRamcmp+edx*4] +.nottype0 + inc edx + mov cl,16 +.dloop + mov al,[edx] + cmp [esi],al + jne .nomatch + inc edx + inc esi + dec cl + jz .matchfound + cmp al,0 + jne .dloop +.matchfound + pop esi + mov byte[LoadDuplicFound],1 + jmp .frozen +.nomatch + pop esi + add esi,16 + cmp esi,prevloadnames+10*16 + jne near .checkanother + + ; copy game name + ; shift names down + mov esi,prevloadnames+16*9-1 + mov ecx,16*9 +.loop + mov al,[esi] + mov [esi+16],al + dec esi + dec edi + dec ecx + jnz .loop + mov esi,prevloadfnamel+512*9-1 + mov edi,prevloaddnamel+512*9-1 + mov ecx,512*9 +.loop2 + mov al,[esi] + mov [esi+512],al + mov al,[edi] + mov [edi+512],al + dec esi + dec edi + dec ecx + jnz .loop2 +.skip + ; copy game name + mov edx,[GUIcurrentcursloc] + shl edx,5 + add edx,[spcBuffera] + cmp byte[GUIloadfntype],0 + jne .nottype0b + mov edx,[GUIcurrentcursloc] + mov edx,[spcRamcmp+edx*4] +.nottype0b + inc edx + mov ebx,prevloadnames + mov ecx,16 +.loopfnc + mov al,[edx] + mov [ebx],al + inc edx + inc ebx + dec ecx + jnz .loopfnc + + ; get Drive/Dir + mov ebx,prevloaddnamel+1 + mov edx,prevloaddnamel + call Get_Dir +.frozen + + cmp byte[GUIloadfntype],0 + jne .nottype0b2 + mov eax,[GUIcurrentcursloc] + mov eax,[spcRamcmp+eax*4] + jmp .donetype0b +.nottype0b2 + mov eax,[GUIcurrentcursloc] + mov ebx,eax + lea eax,[eax*8] + add ebx,ebx + add eax,ebx + add ebx,ebx + add eax,ebx + add eax,spcRamcmp +.donetype0b + inc eax + cmp byte[prevlfreeze],0 + jne .foundend + cmp byte[LoadDuplicFound],0 + jne .foundend + mov esi,eax + mov edi,prevloadfnamel + ; copy filename +.findnext + mov ch,[esi] + mov [edi],ch + cmp ch,0 + je .foundend + inc esi + inc edi + jmp .findnext +.foundend + call GUIloadfilename + xor eax,eax + mov al,[GUIwinptr] + dec eax + mov byte[GUIwinactiv+1],0 + mov byte[GUIwinorder+eax],0 + dec byte[GUIwinptr] + ret +SECTION .data +.drivefn db 'A:\temp.tmp',0 +SECTION .text + +GetNormalEntries2: + cmp byte[showallext],1 + je near .guishowall + GUIGetEntry2 GUIsmcfind + GUIGetEntry2 GUIsfcfind + GUIGetEntry2 GUIswcfind + GUIGetEntry2 GUIfigfind + GUIGetEntry2 GUImgdfind + GUIGetEntry2 GUIufofind + %ifndef __MSDOS__ + GUIGetEntry2 GUIfindGZIP + %endif + GUIGetEntry2 GUIfind058 + GUIGetEntry2 GUIfind078 + GUIGetEntry2 GUIfindUSA + GUIGetEntry2 GUIfindEUR + GUIGetEntry2 GUIfindJAP + GUIGetEntry2 GUIfindBIN +; cmp byte[OSPort],1 +; je near .noasm + GUIGetEntry2 GUIfindZIP +;.noasm + GUIGetEntry2 GUIfind1 + jmp .guiNext +.guishowall + GUIGetEntry2 GUIfindall +.guiNext + ret + +GetNormalEntries: + cmp byte[showallext],1 + je near .guishowall + GUIGetEntry GUIsmcfind + GUIGetEntry GUIsfcfind + GUIGetEntry GUIswcfind + GUIGetEntry GUIfigfind + GUIGetEntry GUImgdfind + GUIGetEntry GUIufofind + %ifndef __MSDOS__ + GUIGetEntry GUIfindGZIP + %endif + GUIGetEntry GUIfind058 + GUIGetEntry GUIfind078 + GUIGetEntry GUIfindUSA + GUIGetEntry GUIfindEUR + GUIGetEntry GUIfindJAP + GUIGetEntry GUIfindBIN +; cmp byte[OSPort],1 +; je near .noasm + GUIGetEntry GUIfindZIP +;.noasm + GUIGetEntry GUIfind1 + jmp .guiNext +.guishowall + GUIGetEntry GUIfindall +.guiNext + ret + +GUIGetEntryLFNfunc: + push es + push edi + mov eax,714Eh ; Findfirst + mov cx,ds + mov es,cx + mov ch,0 + mov cl,0 + mov edi,LFNData + mov si,0 + int 21h + mov [LFNHandle],ax + pop edi + pop es + jc near .done +.next + mov esi,LFNData+44 + mov ecx,23 +.loop + mov al,[esi] + cmp al,'a' + jb .nocap + cmp al,'z' + ja .nocap + sub al,'a'-'A' +.nocap + cmp al,'%' + jne .noperc + cmp byte[esi+1],'0' + jb .noperc + cmp byte[esi+1],'F' + ja .noperc + cmp byte[esi+2],'0' + jb .noperc + cmp byte[esi+2],'F' + ja .noperc + mov al,[esi+2] + sub al,'0' + cmp al,9 + jbe .nodec + sub al,'A'-'0'-10 +.nodec + mov ah,[esi+1] + sub ah,'0' + cmp ah,9 + jbe .nodecb + sub ah,'A'-'0'-10 +.nodecb + shl ah,4 + or al,ah + add esi,2 +.noperc + mov [edi],al + inc edi + inc esi + dec ecx + jnz near .loop + mov byte[edi],0 + add edi,9 + push es + push edi + mov bx,[LFNHandle] + mov eax, 714Fh ; Findnext + mov dx,ds + mov es,dx + mov edi,LFNData + mov si,0 + int 21h + pop edi + pop es + jnc near .next +.done + mov eax,71A1h ;Filefind Close + mov bx,[LFNHandle] + int 21h + ret + +GUIGetEntryLFNfuncdir: + mov edx,GUIfindall + push es + push edi + mov eax,714Eh ; Findfirst + mov cx,ds + mov es,cx + mov ch,10h + mov cl,10h + mov edi,LFNData + mov si,0 + int 21h + mov [LFNHandle],ax + pop edi + pop es + jc near .done +.next + mov esi,LFNData+44 + mov ecx,11 +.loop + mov al,[esi] + cmp al,'a' + jb .nocap + cmp al,'z' + ja .nocap + sub al,'a'-'A' +.nocap + mov [edi],al + inc edi + inc esi + dec ecx + jnz .loop + mov byte[edi],0 + add edi,21 + push es + push edi + mov bx,[LFNHandle] + mov eax, 714Fh ; Findnext + mov dx,ds + mov es,dx + mov edi,LFNData + mov si,0 + int 21h + pop edi + pop es + jnc near .next +.done + mov eax,71A1h ;Filefind Close + mov bx,[LFNHandle] + int 21h + ret + +%macro GUIGetEntryLFN 1 + mov edx,%1 + call GUIGetEntryLFNfunc +%endmacro + +GetLoadLfn: + call GetNormalEntries + push edi + mov edi,[spcBuffera] + inc edi + cmp byte[showallext],1 + je near .guishowall + GUIGetEntryLFN GUIsmcfind + GUIGetEntryLFN GUIsfcfind + GUIGetEntryLFN GUIswcfind + GUIGetEntryLFN GUIfigfind + GUIGetEntryLFN GUImgdfind + GUIGetEntryLFN GUIufofind + %ifndef __MSDOS__ + GUIGetEntryLFN GUIfindGZIP + %endif + GUIGetEntryLFN GUIfind058 + GUIGetEntryLFN GUIfind078 + GUIGetEntryLFN GUIfindUSA + GUIGetEntryLFN GUIfindEUR + GUIGetEntryLFN GUIfindJAP + GUIGetEntryLFN GUIfindBIN + GUIGetEntryLFN GUIfindZIP + GUIGetEntryLFN GUIfind1 + jmp .guiNext +.guishowall + GUIGetEntryLFN GUIfindall +.guiNext + pop edi + ret + +SECTION .bss +LFNData resb 400 +LFNHandle resw 1 +SECTION .text + +GetLoadNormal: + call GetNormalEntries2 + ret + +GetLoadHeader: + call GetNormalEntries + push edi + ; Copy every 14 bytes of spcRamcmp into every 32 bytes of spcBuffer + mov ecx,[GUInumentries] + mov esi,spcRamcmp+1 + mov edi,[spcBuffera] + inc edi + cmp ecx,0 + je near .none +.loop + ; open file at esi and store in edi + push esi + push ecx + push edi + ; check if .zip file + mov eax,esi +.zipdet + cmp byte[eax],0 + je near .skipcheck + cmp byte[eax],'.' + je .dotdetected + inc eax + jmp .zipdet +.dotdetected + cmp byte[eax+1],'z' + je near .yeszipa + cmp byte[eax+1],'Z' + jne near .skipcheck +.yeszipa + cmp byte[eax+2],'i' + je near .yeszipb + cmp byte[eax+2],'I' + jne near .skipcheck +.yeszipb + cmp byte[eax+3],'p' + je near .yeszipc + cmp byte[eax+3],'P' + jne near .skipcheck +.yeszipc + ; move esi to edi +.ziploop + mov al,[esi] + mov [edi],al + inc esi + inc edi + or al,al + jnz .ziploop + jmp .doneall +.skipcheck + ; open file + mov edx,esi + call Open_File + jc near .fileerror + mov bx,ax + ; Check filesize + mov cx,0 + mov dx,0 + call File_Seek_End + jc near .fileerror + cmp dx,0 + jne .locokay + cmp ax,32768 + jae .locokay + jmp .fileerror +.locokay + ; Look for 512 byte header + mov cx,0 + mov dx,250 + call File_Seek + jc near .fileerror + mov ecx,20 + mov edx,fnameheadtemp + call Read_File + jc near .fileerror + ; if 10 or more 0's, then header + mov ecx,20 + mov esi,fnameheadtemp + xor eax,eax +.loop2 + cmp byte[esi],0 + jne .notzero2 + inc eax +.notzero2 + inc esi + dec ecx + jnz .loop2 + cmp eax,10 + ja near .yes512header + mov cx,0 + mov dx,32704 + call File_Seek + jc near .fileerror + mov ecx,20 + mov edx,edi + call Read_File + jc near .fileerror + mov cx,0 + mov dx,32704+32768 + call File_Seek + jc near .fileerror + mov ecx,20 + mov edx,fnameheadtemp + call Read_File + jc near .fileerror + jmp .noheaderdone +.yes512header + mov cx,0 + mov dx,32704+512 + call File_Seek + jc near .fileerror + mov ecx,20 + mov edx,edi + call Read_File + jc near .fileerror + mov cx,1 + mov dx,448 + call File_Seek + jc near .fileerror + mov ecx,20 + mov edx,fnameheadtemp + call Read_File + jc near .fileerror +.noheaderdone + mov ecx,20 +.loops + cmp byte[edi],0 + jne .notzero + mov byte[edi],32 +.notzero + inc edi + dec ecx + jnz .loops + ; Check which header has more alphabets, then move + sub edi,20 + call .checkalpha + push eax + push edi + mov edi,fnameheadtemp + call .checkalpha + pop edi + mov ecx,eax + pop eax + cmp ecx,eax + jb .noswaps + mov ecx,20 + sub edi,20 + mov esi,fnameheadtemp +.loops2 + mov al,[esi] + mov [edi],al + inc edi + inc esi + dec ecx + jnz .loops2 +.noswaps + jmp .fileokay +.fileerror + mov eax,[.invfile] + mov [edi],eax + mov eax,[.invfile+4] + mov [edi+4],eax + mov eax,[.invfile+8] + mov [edi+8],eax + mov eax,[.invfile+12] + mov [edi+12],eax + mov eax,[.invfile+16] + mov [edi+16],eax +.fileokay + call Close_File +.doneall + pop edi + pop ecx + pop esi + mov byte[edi+20],0 + push edi + push esi + push ecx + ; check if first 20 bytes are all equal or not + mov al,[edi+1] + mov ecx,19 +.loopchk + cmp byte[edi+1],al + jne .notequal + inc edi + dec ecx + jnz .loopchk + sub edi,19 + mov ecx,14 +.loopcpy + mov al,[esi] + mov [edi],al + inc esi + inc edi + dec ecx + jnz .loopcpy +.notequal + pop ecx + pop esi + pop edi + ; Capitalize + push edi + push ecx + mov ecx,20 +.loop4 + mov al,[edi] + cmp al,'a' + jb .nocap + cmp al,'z' + ja .nocap + sub al,'a'-'A' +.nocap + mov [edi],al + dec ecx + jnz .loop4 + pop ecx + pop edi + add esi,14 + add edi,32 + dec ecx + jnz near .loop +.none + pop edi + ret + +.checkalpha + mov ecx,20 + xor eax,eax +.loop3 + cmp byte[edi],32 + je .alpha + cmp byte[edi],'A' + jb .noalpha + cmp byte[edi],'Z' + jbe .alpha + cmp byte[edi],'a' + jb .noalpha + cmp byte[edi],'z' + ja .noalpha +.alpha + inc eax +.noalpha + inc edi + dec ecx + jnz .loop3 + ret + +SECTION .data +.invfile db ' ** INVALID FILE **',0 +SECTION .bss +fnameheadtemp resb 22 +SECTION .text + +GetNormalDirEntries2: + GUIGetDir2 + ret + +GetNormalDirEntries: + GUIGetDir + ret + +GetLoadDirNormal2: + call GetNormalDirEntries2 + ret + +GetLoadDirNormal: + call GetNormalDirEntries + push edi + ; Copy every 14 bytes of spcRamcmp into every 32 bytes of spcBuffer + mov ecx,[GUIdirentries] + mov esi,[GUIdirStartLoc] + mov edi,dword[GUIfileentries] + shl edi,5 + add edi,[spcBuffera] + cmp ecx,0 + je .none +.loop + mov eax,[esi] + mov [edi],eax + mov eax,[esi+4] + mov [edi+4],eax + mov eax,[esi+8] + mov [edi+8],eax + xor ax,ax + mov [edi+12],ax + add esi,14 + add edi,32 + dec ecx + jnz .loop +.none + pop edi + ret + +GetLoadDirNormallfn: + call GetNormalDirEntries + push edi + ; Copy every 14 bytes of spcRamcmp into every 32 bytes of spcBuffer + mov edi,dword[GUIfileentries] + shl edi,5 + add edi,[spcBuffera] + inc edi + call GUIGetEntryLFNfuncdir + pop edi + ret + +SECTION .bss +Win95Failed resb 1 +SECTION .text + +NEWSYM GetCurDir + ; get Drive/Dir +%ifndef __LINUX__ + mov ebx,GUIcurrentdir+3 +%else + mov ebx,GUIcurrentdir +%endif + mov edx,GUIcurrentdir + call Get_Dir + +%ifndef __LINUX__ + add byte[GUIcurrentdir],65 + + mov byte[GUIcurrentdir+1],':' + mov byte[GUIcurrentdir+2],'\' +%endif + + cmp byte[GUIcurrentdir+35],0 + je .nodotend + mov byte[GUIcurrentdir+35],'.' + mov byte[GUIcurrentdir+36],'.' + mov byte[GUIcurrentdir+37],'.' + mov byte[GUIcurrentdir+38],0 +.nodotend + ; Set DTA address + call Set_DTA_Address + ret + +GetLoadData: + mov dword[GUIcurrentfilewin],0 +.a + call GetCurDir + mov dword[GUInumentries],0 + mov dword[GUIcurrentviewloc],0 + mov dword[GUIcurrentcursloc],0 + mov dword[GUIcurrentdirviewloc],0 + mov dword[GUIcurrentdircursloc],0 + mov edi,spcRamcmp + mov byte[Win95Failed],0 +; cmp byte[OSPort],1 +; ja .notdos +%ifdef __MSDOS__ + cmp byte[GUIloadfntype],2 + jne .nowin95lfn + clc + mov ax,7100h + int 21h + jc .nowin95lfn +%endif +;.notdos + mov byte[GUIloadfntype],0 +.nowin95lfn + cmp byte[GUIloadfntype],2 + je .win95lfn + cmp byte[GUIloadfntype],1 + je .snesheader + mov edi,[spcBuffera] + call GetLoadNormal + jmp .doneheader +.snesheader + mov byte[showallext],0 + call GetLoadHeader + jmp .doneheader +.win95lfn + call GetLoadLfn +.doneheader + cmp byte[Win95Failed],1 + jne .notfailed + mov byte[GUIloadfntype],0 + jmp GetLoadData +.notfailed + mov eax,dword[GUInumentries] + mov dword[GUIfileentries],eax + cmp dword[GUIfileentries],0 + jne .nonoentry + mov dword[GUIcurrentfilewin],1 +.nonoentry + + ; Sort List + push edi + ; compares string at esi to edi and returns 1 to al if esi is >, else 0 +.sortagain + mov byte[BubbleSorted],0 + mov esi,[spcBuffera] + inc esi + mov edi,spcRamcmp+1 + cmp dword[GUInumentries],1 + jbe near .nosort + cmp byte[GUIloadfntype],0 + je near .sort2 + mov ecx,[GUInumentries] + dec ecx +.nextentry + push ecx + ; check if esi > esi+32 + call GUIStringGreater + ; if it is, swap! + cmp al,0 + je near .noswap + mov ecx,31 +.nextswap + mov al,[esi] + mov bl,[esi+32] + mov [esi],bl + mov [esi+32],al + inc esi + dec ecx + jnz .nextswap + mov ecx,13 +.nextswap2 + mov al,[edi] + mov bl,[edi+14] + mov [edi],bl + mov [edi+14],al + inc edi + dec ecx + jnz .nextswap2 + mov byte[BubbleSorted],1 + sub esi,31 + sub edi,13 +.noswap + add esi,32 + add edi,14 + pop ecx + dec ecx + jnz near .nextentry +.nosort + cmp byte[BubbleSorted],1 + je near .sortagain + jmp .donesort + +.sort2 + mov esi,spcRamcmp + mov ecx,[GUInumentries] + dec ecx +.nextentryb + push ecx + mov ebx,[esi] + mov edx,[esi+4] + inc ebx + inc edx + ; check if ebx > edx + call GUIStringGreater2 + ; if it is, swap! + cmp al,0 + je near .noswapb + mov eax,[esi] + mov ebx,[esi+4] + mov [esi],ebx + mov [esi+4],eax + mov byte[BubbleSorted],1 +.noswapb + add esi,4 + pop ecx + dec ecx + jnz near .nextentryb +.nosortb + cmp byte[BubbleSorted],1 + je near .sortagain +.donesort + pop edi +GUIGetDirs: + mov dword[GUIdirentries],0 + mov [GUIdirStartLoc],edi + cmp byte[GUIloadfntype],0 + jne near .loadtype0 + mov eax,[GUInumentries] + mov [GUIdirStartLoc],eax +.loadtype0 + + cmp byte[GUIloadfntype],2 + je .win95lfn + cmp byte[GUIloadfntype],0 + je .normaldir + call GetLoadDirNormal + jmp .nowin95 +.normaldir + call GetLoadDirNormal2 + jmp .nowin95 +.win95lfn + call GetLoadDirNormallfn +.nowin95 + cmp dword[GUInumentries],0 + je near .nodirs + cmp dword[GUIdirentries],0 + je near .nodirs + + ; Sort List + ; copy from GUIdirStartLoc to spcBuffer+GUIdirentries*32 + ; compares string at esi to edi and returns 1 to al if esi is >, else 0 + + push edi + ; compares string at esi to edi and returns 1 to al if esi is >, else 0 +.sortagain + mov byte[BubbleSorted],0 + mov esi,dword[GUIfileentries] + shl esi,5 + add esi,[spcBuffera] + mov edi,[GUIdirStartLoc] + inc esi + inc edi + + cmp dword[GUIdirentries],1 + jbe near .nosort + mov ecx,[GUIdirentries] + dec ecx + cmp byte[GUIloadfntype],0 + je near .sort2 +.nextentry + push ecx + ; check if esi > esi+32 + call GUIStringGreater + ; if it is, swap! + cmp al,0 + je near .noswap + mov ecx,31 +.nextswap + mov al,[esi] + mov bl,[esi+32] + mov [esi],bl + mov [esi+32],al + inc esi + dec ecx + jnz .nextswap + mov ecx,13 +.nextswap2 + mov al,[edi] + mov bl,[edi+14] + mov [edi],bl + mov [edi+14],al + inc edi + dec ecx + jnz .nextswap2 + mov byte[BubbleSorted],1 + sub esi,31 + sub edi,13 +.noswap + add esi,32 + add edi,14 + pop ecx + dec ecx + jnz near .nextentry +.nosort + cmp byte[BubbleSorted],1 + je near .sortagain + pop edi + jmp .nodirs +.sort2 + mov esi,dword[GUIfileentries] + shl esi,2 + add esi,spcRamcmp +.nextentryb + push ecx + mov ebx,[esi] + mov edx,[esi+4] + inc ebx + inc edx + ; check if ebx > edx + call GUIStringGreater2 + ; if it is, swap! + cmp al,0 + je near .noswapb + mov eax,[esi] + mov ebx,[esi+4] + mov [esi],ebx + mov [esi+4],eax + mov byte[BubbleSorted],1 +.noswapb + add esi,4 + pop ecx + dec ecx + jnz near .nextentryb +.nosortb + cmp byte[BubbleSorted],1 + je near .sortagain + pop edi +.nodirs +%ifndef __LINUX__ + cmp byte[GUIloadfntype],0 + je near .drive2 + mov esi,[GUInumentries] + shl esi,5 + add esi,[spcBuffera] + mov al,65 + mov ecx,[numdrives] +.nextdrive + GUIPutDrive + inc al + dec ecx + jnz .nextdrive + jmp .nodrive +.drive2 + mov esi,[GUInumentries] + shl esi,2 + add esi,spcRamcmp + mov al,65 + mov ecx,[numdrives] +.nextdriveb + mov [esi],edi + GUIPutDrive2 + add esi,4 + inc al + dec ecx + jnz .nextdriveb +.nodrive +%endif + ret + +SECTION .bss +BubbleSorted resb 1 +GUIcurrentfilewin resd 1 +GUIcurrentviewloc resd 1 +GUIcurrentcursloc resd 1 +GUIcurrentdirviewloc resd 1 +GUIcurrentdircursloc resd 1 +GUIdirStartLoc resd 1 +GUInumentries resd 1 +GUIdirentries resd 1 +GUIfileentries resd 0 + +SECTION .data +%ifdef __LINUX__ +NEWSYM GUIsmcfind, db '*.[sS][mM][cC]',0 +NEWSYM GUIsfcfind, db '*.[sS][fF][cC]',0 +NEWSYM GUIswcfind, db '*.[sS][wW][cC]',0 +NEWSYM GUIfigfind, db '*.[fF][iI][gG]',0 +NEWSYM GUImgdfind, db '*.[mM][gG][dD]',0 +NEWSYM GUIufofind, db '*.[uU][fF][oO]',0 +%else +NEWSYM GUIsmcfind, db '*.SMC',0 +NEWSYM GUIsfcfind, db '*.SFC',0 +NEWSYM GUIswcfind, db '*.SWC',0 +NEWSYM GUIfigfind, db '*.FIG',0 +NEWSYM GUImgdfind, db '*.MGD',0 +NEWSYM GUIufofind, db '*.UFO',0 +%endif +NEWSYM GUIfind058, db '*.058',0 +NEWSYM GUIfind078, db '*.078',0 +%ifdef __LINUX__ +NEWSYM GUIfindUSA, db '*.[uU][sS][aA]',0 +NEWSYM GUIfindEUR, db '*.[eE][uU][rR]',0 +NEWSYM GUIfindJAP, db '*.[jJ][aA][pP]',0 +NEWSYM GUIfindBIN, db '*.[bB][iI][nN]',0 +NEWSYM GUIfindZIP, db '*.[zZ][iI][pP]',0 +NEWSYM GUIfindGZIP, db '*.[gG][zZ]',0 +%else +NEWSYM GUIfindUSA, db '*.USA',0 +NEWSYM GUIfindEUR, db '*.EUR',0 +NEWSYM GUIfindJAP, db '*.JAP',0 +NEWSYM GUIfindBIN, db '*.BIN',0 +NEWSYM GUIfindZIP, db '*.ZIP',0 +NEWSYM GUIfindGZIP, db '*.GZ',0 +%endif +NEWSYM GUIfind1, db '*.1',0 +%ifdef __LINUX__ +GUIfindDIR db '*',0 +NEWSYM GUIfindall, db '*',0 +%else +GUIfindDIR db '*.*',0 +NEWSYM GUIfindall, db '*.*',0 +%endif + +SECTION .data +NEWSYM DTALoc, times 2048+32 db 0 + +SECTION .text + +; Routines to load from the Quick Menu +loadquickfname: + pushad +.trynext + cmp byte[GUIwinptr],0 + je near .noclose + xor eax,eax + mov al,[GUIwinptr] + dec eax + xor ebx,ebx + mov bl,[GUIwinorder+eax] + ; close window + mov byte[GUIwinorder+eax],0 + mov byte[GUIwinactiv+ebx],0 + dec byte[GUIwinptr] + cmp byte[GUIwinptr],0 + jne .noclose + mov al,[GUIpmenupos] + mov [GUIcmenupos],al + jmp .trynext +.noclose + popad + + ; move menuitem to top + cmp ecx,0 + je near .nomove + cmp byte[prevlfreeze],0 + jne near .nomove + + ; copy 16 bytes of ebx to pressed + mov eax,[ebx] + mov [pressed],eax + mov eax,[ebx+4] + mov [pressed+4],eax + mov eax,[ebx+8] + mov [pressed+8],eax + mov eax,[ebx+12] + mov [pressed+12],eax + ; move each entry above ebx down +.next2 + mov eax,[ebx-16] + mov [ebx],eax + mov eax,[ebx+4-16] + mov [ebx+4],eax + mov eax,[ebx+8-16] + mov [ebx+8],eax + mov eax,[ebx+12-16] + mov [ebx+12],eax + sub ebx,16 + cmp ebx,prevloadnames + jne .next2 + ; copy 16 bytes of pressed to top + mov eax,[pressed] + mov [ebx],eax + mov eax,[pressed+4] + mov [ebx+4],eax + mov eax,[pressed+8] + mov [ebx+8],eax + mov eax,[pressed+12] + mov [ebx+12],eax + + ; copy 512 bytes of edi to pressed + mov ecx,128 + xor ebx,ebx +.loopb + mov eax,[edi+ebx*4] + mov [pressed+ebx*4],eax + inc ebx + dec ecx + jnz .loopb + ; move each entry above ebx down +.next3b + mov ecx,128 + xor ebx,ebx +.loop2b + mov eax,[edi-512+ebx*4] + mov [edi+ebx*4],eax + inc ebx + dec ecx + jnz .loop2b + sub edi,512 + cmp edi,prevloadfnamel + jne .next3b + ; copy 512 bytes of pressed to top + mov ecx,128 + xor ebx,ebx +.loop3b + mov eax,[pressed+ebx*4] + mov [edi+ebx*4],eax + inc ebx + dec ecx + jnz .loop3b + + ; copy 512 bytes of esi to pressed + mov ecx,128 + xor ebx,ebx +.loop + mov eax,[esi+ebx*4] + mov [pressed+ebx*4],eax + inc ebx + dec ecx + jnz .loop + ; move each entry above ebx down +.next3 + mov ecx,128 + xor ebx,ebx +.loop2 + mov eax,[esi-512+ebx*4] + mov [esi+ebx*4],eax + inc ebx + dec ecx + jnz .loop2 + sub esi,512 + cmp esi,prevloaddnamel + jne .next3 + ; copy 512 bytes of pressed to top + mov ecx,128 + xor ebx,ebx +.loop3 + mov eax,[pressed+ebx*4] + mov [esi+ebx*4],eax + inc ebx + dec ecx + jnz .loop3 + +; pushad +; mov ax,03h +; int 10h +; popad +; push edi +; mov edx,esi+1 +; call PrintStr +; pop edi +; mov edx,edi+1 +; call PrintStr +; jmp DosExit + + ; clear pressed + mov eax,pressed + mov ecx,128 +.loop4 + mov dword[eax],0 + add eax,4 + dec ecx + jnz .loop4 +.nomove + ; change dir + mov dl,[esi] + mov ebx,esi + inc ebx + call Change_Dir + call GetCurDir + mov eax,edi + push eax + mov edx,edi + call Open_File + jc near .failed + mov bx,ax + mov edx,.temp + mov ecx,1 + call Read_File + jc near .failed2 + call Close_File + jc near .failed + pop eax + pushad + call GUIQuickLoadUpdate + popad + + call GUIloadfilename + ret +.failed2 + call Close_File +.failed + pop eax + ret + +SECTION .bss +.temp resd 256 +SECTION .text diff --git a/zsnes/src/init.asm b/zsnes/src/init.asm index bcd023b6..fd40129d 100644 --- a/zsnes/src/init.asm +++ b/zsnes/src/init.asm @@ -1,6397 +1,6397 @@ -;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,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,Create_File -;EXTSYM OSPort -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,spchalted,tableD,timeron,vidbright,DSPMem,OldGfxMode2 -EXTSYM SPC700read,SPC700write,GUIDoReset,spc700read -EXTSYM InitC4,SA1Reset,SetAddressingModesSA1,SetAddressingModes,SDD1BankA,SPC7110init -EXTSYM RTCinit,InitOBC -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 GUImgdfind,GUIufofind -;EXTSYM GUIfindUSA,GUIfindEUR,GUIfindJAP,GUIfindZIP,GUIfind1,DTALoc,GUIfindall,ZipError -EXTSYM GUIfindUSA,GUIfindEUR,GUIfindJAP,GUIfindZIP,GUIfind1,DTALoc,GUIfindall -EXTSYM spc7110romptr,allocspc7110 -EXTSYM SRAMDir,SRAMDrive,cfgloadsdir,fnamest,statefileloc -EXTSYM ForcePal,ForceROMTiming,ForceHiLoROM,InitDir,InitDrive,enterpress,frameskip -EXTSYM infoloc -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,wramreadptr,wramwriteptr -EXTSYM pl1Ltk,pl1Rtk,pl2Ltk,pl2Rtk,pl3Ltk,pl3Rtk,pl4Ltk,pl4Rtk,pl5Ltk,pl5Rtk -EXTSYM loadstate2 -%ifdef __LINUX__ -EXTSYM LoadDir, popdir, pushdir -%endif - -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 -; FIX STATMAT -NEWSYM autoloadstate, db 0 ; auto load state slot number -; FIX STATMAT - -SECTION .text - -EXTSYM cpalval -NEWSYM init - ; prevents a crash if cpalval gets accessed before initializing - mov eax,cpalval - mov ecx,256 -.looppal - mov dword[eax],cpalval - add eax,4 - dec ecx - jnz .looppal - - ; Initialize snow stuff - mov ecx,400 - xor edx,edx -.snowloop - shl word[SnowData+edx*2],8 - and byte[SnowVelDist+edx],0F7h - cmp dword[SnowTimer],0 - jne .skip - or byte[SnowVelDist+edx],08h -.skip - inc edx - dec ecx - jnz .snowloop - - 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 - dec ecx - jnz .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 - call showinfogui -.noloadfile - call UpdateDevices - call init65816 - call initregr - call initregw - call initsnes - - ; Initialize volume - xor eax,eax - xor edx,edx - mov al,[MusicRelVol] - shl eax,7 - mov ebx,0A3D70A3Dh - mul ebx - shr edx,6 - cmp dl,127 - jb .noof - mov dl,127 -.noof - mov [MusicVol],dl - -; FIX STATMAT - ; Here's the auto-load ZST file stuff - cmp byte[autoloadstate],1 - jl .noautoloadstate - je .enddigits - mov ebx,[statefileloc] - sub byte[autoloadstate],1 - cmp byte[autoloadstate],10 - jge .2digits - mov al,byte[autoloadstate] - add al,48 - mov byte[fnamest+ebx],al - jmp .enddigits -.2digits - xor eax,eax - mov al,byte[autoloadstate] - mov dl,10 - div dl - add al,48 - add ah,48 - mov byte[fnamest+ebx-1],al - mov byte[fnamest+ebx],ah -.enddigits - - ; Load the specified state file - call loadstate2 - - ; Just skip the extension re-setup below if we don't need to do it - cmp byte[autoloadstate],9 - jbe .noautoloadstate - - ; Put back the 'ST' on the end of the extension as we changed it - ; above (by placing two digits in the extension). This is so - ; as not to break any other code later on which depends - ; on it being present. - mov ebx,[statefileloc] -%ifdef __LINUX__ - mov word[fnamest+ebx-1],'st' -%else - mov word[fnamest+ebx-1],'ST' -%endif - -.noautoloadstate -; FIX STATMAT - xor eax,eax - mov al,[cvidmode] - cmp byte[GUI16VID+eax],1 - je .yes16b - mov byte[newengen],1 - mov byte[cfgnewgfx],1 -.yes16b - cmp byte[NewEngEnForce],1 - jne .noforce - mov byte[NewEngEnForce],0 - mov byte[newengen],1 - mov byte[cfgnewgfx],1 -.noforce - - mov ebx,ebm - mov eax,EndMessage - mov dh,17h - mov ch,67 - mov cl,1 -.loopen - mov dl,[ebx] - rol dl,cl - xor dl,dh - mov [eax],dl - rol dh,1 - inc cl - or cl,cl - jne .notzero - inc cl -.notzero - and cl,07h - inc eax - inc ebx - dec ch - jnz .loopen - - - cmp byte[yesoutofmemory],1 - jne .noout - call outofmemfix -.noout - cmp byte[debugger],0 - je near start65816 - cmp byte[romloadskip],1 - je near start65816 - jmp startdebugger - -EndMessageB - -; global variables - -SECTION .data - - -; Controls -;FIXME: define pl3contrl, pl4contrl and pl5contrl here? -;Christophe 2001/03/10 -NEWSYM numjoy, db 0 ; number of joysticks (1 = 1, 2 = 2) -; 0 = Disable, 1 = Keyboard, 2 = Joystick, 3 = Gamepad -; 4 = 4-button 5 = 6-button 6 = sidewinder -NEWSYM pl1contrl, db 1 ; player 1 device -NEWSYM pl1keya, dd 0 -NEWSYM pl1keyb, dd 0 -%ifdef __MSDOS__ -NEWSYM pl1selk, dd 54 -NEWSYM pl1startk, dd 28 -NEWSYM pl1upk, dd 72 -NEWSYM pl1downk, dd 80 -NEWSYM pl1leftk, dd 75 -NEWSYM pl1rightk, dd 77 -%else -NEWSYM pl1selk, dd 54 -NEWSYM pl1startk, dd 28 -NEWSYM pl1upk, dd 200 -NEWSYM pl1downk, dd 208 -NEWSYM pl1leftk, dd 203 -NEWSYM pl1rightk, dd 205 -%endif -NEWSYM pl1Xk, dd 31 -NEWSYM pl1Ak, dd 45 -NEWSYM pl1Lk, dd 32 -NEWSYM pl1Yk, dd 30 -NEWSYM pl1Bk, dd 44 -NEWSYM pl1Rk, dd 46 -NEWSYM pl2contrl, db 0 ; player 2 device -NEWSYM pl2keya, dd 0 -NEWSYM pl2keyb, dd 0 -NEWSYM pl2selk, dd 27 -NEWSYM pl2startk, dd 26 -NEWSYM pl2upk, dd 199 -NEWSYM pl2downk, dd 207 -NEWSYM pl2leftk, dd 211 -NEWSYM pl2rightk, dd 209 -NEWSYM pl2Xk, dd 24 -NEWSYM pl2Ak, dd 25 -NEWSYM pl2Lk, dd 23 -NEWSYM pl2Yk, dd 37 -NEWSYM pl2Bk, dd 38 -NEWSYM pl2Rk, dd 36 -NEWSYM JoyStart, db 0 -NEWSYM JoySelec, db 0 -NEWSYM JoyBC, db 1 -NEWSYM JoyYC, db 3 -NEWSYM JoyAC, db 2 -NEWSYM JoyXC, db 4 -NEWSYM JoyLC, db 5 -NEWSYM JoyRC, db 6 -NEWSYM TurboSw, db 0 - -NEWSYM 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 263 ; 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 61 ; 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 .bss -NEWSYM WhichSW, resb 1 -NEWSYM WhichGR, resb 1 -NEWSYM autofr, resb 1 -TurboCB resb 1 - -NEWSYM MovieTemp, resb 1 -NEWSYM JoyAOrig, resd 1 -NEWSYM JoyBOrig, resd 1 -NEWSYM JoyCOrig, resd 1 -NEWSYM JoyDOrig, resd 1 -NEWSYM JoyEOrig, resd 1 -NEWSYM JoyANow, resd 1 -NEWSYM JoyBNow, resd 1 -NEWSYM JoyCNow, resd 1 -NEWSYM JoyDNow, resd 1 -NEWSYM JoyENow, resd 1 -NEWSYM PJoyAOrig, resd 1 -NEWSYM PJoyBOrig, resd 1 -NEWSYM PJoyCOrig, resd 1 -NEWSYM PJoyDOrig, resd 1 -NEWSYM PJoyEOrig, resd 1 -NEWSYM LethEnData, resd 1 -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 - dec ecx - jnz %%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 - PlayerDeviceHelp pl1Ltk ,JoyAOrig,00200000h - PlayerDeviceHelp pl1Rtk ,JoyAOrig,00100000h -.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 - PlayerDeviceHelp pl2Ltk ,JoyBOrig,00200000h - PlayerDeviceHelp pl2Rtk ,JoyBOrig,00100000h -.noswitch2 - ProcessKeyComb 1,JoyBOrig - or dword[JoyBOrig],00008000h ; Joystick Enable -.noinput2 - mov dword[JoyCOrig],0 - cmp byte[pl3contrl],0 - je near .noinput3 - ; Get Player3 input device - PlayerDeviceHelp pl3Bk ,JoyCOrig,80000000h - PlayerDeviceHelp pl3Yk ,JoyCOrig,40000000h - PlayerDeviceHelp pl3selk ,JoyCOrig,20000000h - PlayerDeviceHelp pl3startk,JoyCOrig,10000000h - PlayerDeviceHelp pl3upk ,JoyCOrig,08000000h - PlayerDeviceHelp pl3downk ,JoyCOrig,04000000h - PlayerDeviceHelp pl3leftk ,JoyCOrig,02000000h - PlayerDeviceHelp pl3rightk,JoyCOrig,01000000h - PlayerDeviceHelp pl3Ak ,JoyCOrig,00800000h - PlayerDeviceHelp pl3Xk ,JoyCOrig,00400000h - PlayerDeviceHelp pl3Lk ,JoyCOrig,00200000h - PlayerDeviceHelp pl3Rk ,JoyCOrig,00100000h - PlayerDeviceHelp pl3ULk ,JoyCOrig,0A000000h - PlayerDeviceHelp pl3URk ,JoyCOrig,09000000h - PlayerDeviceHelp pl3DLk ,JoyCOrig,06000000h - PlayerDeviceHelp pl3DRk ,JoyCOrig,05000000h - PlayerDeviceFix JoyCOrig - mov al,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 - PlayerDeviceHelp pl3Ltk ,JoyCOrig,00200000h - PlayerDeviceHelp pl3Rtk ,JoyCOrig,00100000h -.noswitch3 - ProcessKeyComb 2,JoyCOrig - or dword[JoyCOrig],00008000h ; Joystick Enable -.noinput3 - mov dword[JoyDOrig],0 - cmp byte[pl4contrl],0 - je near .noinput4 - ; Get Player4 input device - PlayerDeviceHelp pl4Bk ,JoyDOrig,80000000h - PlayerDeviceHelp pl4Yk ,JoyDOrig,40000000h - PlayerDeviceHelp pl4selk ,JoyDOrig,20000000h - PlayerDeviceHelp pl4startk,JoyDOrig,10000000h - PlayerDeviceHelp pl4upk ,JoyDOrig,08000000h - PlayerDeviceHelp pl4downk ,JoyDOrig,04000000h - PlayerDeviceHelp pl4leftk ,JoyDOrig,02000000h - PlayerDeviceHelp pl4rightk,JoyDOrig,01000000h - PlayerDeviceHelp pl4Ak ,JoyDOrig,00800000h - PlayerDeviceHelp pl4Xk ,JoyDOrig,00400000h - PlayerDeviceHelp pl4Lk ,JoyDOrig,00200000h - PlayerDeviceHelp pl4Rk ,JoyDOrig,00100000h - PlayerDeviceHelp pl4ULk ,JoyDOrig,0A000000h - PlayerDeviceHelp pl4URk ,JoyDOrig,09000000h - PlayerDeviceHelp pl4DLk ,JoyDOrig,06000000h - PlayerDeviceHelp pl4DRk ,JoyDOrig,05000000h - PlayerDeviceFix JoyDOrig - mov al,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 - PlayerDeviceHelp pl4Ltk ,JoyDOrig,00200000h - PlayerDeviceHelp pl4Rtk ,JoyDOrig,00100000h -.noswitch4 - ProcessKeyComb 3,JoyDOrig - or dword[JoyDOrig],00008000h ; Joystick Enable -.noinput4 - mov dword[JoyEOrig],0 - cmp byte[pl5contrl],0 - je near .noinput5 - ; Get Player4 input device - PlayerDeviceHelp pl5Bk ,JoyEOrig,80000000h - PlayerDeviceHelp pl5Yk ,JoyEOrig,40000000h - PlayerDeviceHelp pl5selk ,JoyEOrig,20000000h - PlayerDeviceHelp pl5startk,JoyEOrig,10000000h - PlayerDeviceHelp pl5upk ,JoyEOrig,08000000h - PlayerDeviceHelp pl5downk ,JoyEOrig,04000000h - PlayerDeviceHelp pl5leftk ,JoyEOrig,02000000h - PlayerDeviceHelp pl5rightk,JoyEOrig,01000000h - PlayerDeviceHelp pl5Ak ,JoyEOrig,00800000h - PlayerDeviceHelp pl5Xk ,JoyEOrig,00400000h - PlayerDeviceHelp pl5Lk ,JoyEOrig,00200000h - PlayerDeviceHelp pl5Rk ,JoyEOrig,00100000h - PlayerDeviceHelp pl5ULk ,JoyEOrig,0A000000h - PlayerDeviceHelp pl5URk ,JoyEOrig,09000000h - PlayerDeviceHelp pl5DLk ,JoyEOrig,06000000h - PlayerDeviceHelp pl5DRk ,JoyEOrig,05000000h - PlayerDeviceFix JoyEOrig - mov al,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 - PlayerDeviceHelp pl5Ltk ,JoyEOrig,00200000h - PlayerDeviceHelp pl5Rtk ,JoyEOrig,00100000h -.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 - -SECTION .data - -.movieended db 'MOVIE FINISHED.',0 -NEWSYM CFWriteStart, dd 64+30 - -SECTION .bss -NEWSYM MovieBuffSize, resd 1 -NEWSYM MovieBuffFrame, resd 1 -MovieBuffer resd 21*60 -NEWSYM CReadHead, resd 1 -NEWSYM ReadHead, resd 1 -NEWSYM CFWriteHead, resd 1 -NEWSYM StoreBuffer, resb 128*32 - -;******************************************************* -; Init 65816 Initializes the Registers -;******************************************************* - -SECTION .data -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 CacheCheckSkip, db 0 -NEWSYM HIRQSkip, db 0 -NEWSYM ClearScreenSkip, db 0 -NEWSYM hirqmode2, db 0 -NEWSYM ENVDisable, 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 - -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 - - -SECTION .text - -; Header hacks - -EXTSYM ewj2hack -EXTSYM latchyr - -NEWSYM headerhack - mov byte[disablehdma],0 - mov byte[Offby1line],0 - mov byte[CacheCheckSkip],0 - mov word[IRQHack],0 - mov byte[HIRQSkip],0 - mov byte[hdmaearlstart],0 - mov dword[WindowDisables],0 - mov byte[ClearScreenSkip],0 - mov byte[hirqmode2],0 - mov byte[ENVDisable],0 - - mov esi,[romdata] - add esi,0FFC0h - cmp dword[esi],'HORA' - jne .nothoraigakuen - cmp dword[esi+4],'I-GA' - jne .nothoraigakuen - cmp dword[esi+8],'KUEN' - jne .nothoraigakuen - cmp dword[esi+12],' ' - jne .nothoraigakuen - mov al,0h - mov edi,spcRam - mov ecx,65472 - rep stosb - ret -.nothoraigakuen - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'DIGI' - jne .notdigitaldevilstory - cmp dword[esi+4],'TAL ' - jne .notdigitaldevilstory - cmp dword[esi+8],'DEVI' - jne .notdigitaldevilstory - cmp dword[esi+12],'L ST' - jne .notdigitaldevilstory - mov esi,[romdata] - add esi,63CA3h - mov byte [esi],0FFh ; Increase internal spc program delay to prevent irq - ; from causing bad length spc transfer (0xFFFF) -.notdigitaldevilstory - - - mov esi,[romdata] - add esi,0FFC0h - cmp dword[esi],'SAMU' - jne .notsamuraishodown - cmp dword[esi+4],'RAI ' - jne .notsamuraishodown - cmp dword[esi+8],'SHOD' - jne .notsamuraishodown - cmp dword[esi+12],'OWN ' - jne .notsamuraishodown - mov word [IRQHack],1 -.notsamuraishodown - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],0DFCAB0BDh - jne .notfamista1 - cmp dword[esi+4],0D0A7CCB0h - jne .notfamista1 - cmp dword[esi+8],02020C0BDh - jne .notfamista1 - cmp dword[esi+12],20202020h - jne .notfamista1 - mov esi,[romdata] - add esi,2762Fh - mov word [esi],0EAEAh ; Skip a check for value FF at 2140 when spc not - ; initialized yet?!? -.notfamista1 - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],0DFCAB0BDh - jne .notfamista2 - cmp dword[esi+4],0D0A7CCB0h - jne .notfamista2 - cmp dword[esi+8],03220C0BDh - jne .notfamista2 - cmp dword[esi+12],20202020h - jne .notfamista2 - mov esi,[romdata] - add esi,6CEDh - mov word [esi],0EAEAh ; Skip a check for value FF at 2140 when spc not - ; initialized yet?!? - mov esi,[romdata] - add esi,6CF9h - mov word [esi],0EAEAh ; Skip a check for value FF at 2140 when spc not - ; initialized yet?!? -.notfamista2 - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],20434653h - jne .notkamenrider - cmp dword[esi+4],0D7DDD2B6h - jne .notkamenrider - cmp dword[esi+8],0B0DEC0B2h - jne .notkamenrider - cmp dword[esi+12],20202020h - jne .notkamenrider - mov byte[latchyr],2 -.notkamenrider - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'EURO' - jne .noteuropeanprimegoal - cmp dword[esi+4],'PEAN' - jne .noteuropeanprimegoal - cmp dword[esi+8],' PRI' - jne .noteuropeanprimegoal - cmp dword[esi+12],'ME G' - jne .noteuropeanprimegoal - mov al,0h - mov edi,spcRam - mov ecx,65472 - rep stosb - ret -.noteuropeanprimegoal - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'CYBE' - jne .notcyberknight2 - cmp dword[esi+4],'R KN' - jne .notcyberknight2 - cmp dword[esi+8],'IGHT' - jne .notcyberknight2 - cmp dword[esi+12],' 2 ' - jne .notcyberknight2 - mov byte[cycpb268],75 - mov byte[cycpb358],77 - mov byte[cycpbl2],75 - mov byte[cycpblt2],75 - mov byte[cycpbl],75 - mov byte[cycpblt],75 -.notcyberknight2 - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],0B4B1DEC3h - jne .notdeasomething - cmp dword[esi+4],0CFBBC9C4h - jne .notdeasomething - cmp dword[esi+8],0CAAFB120h - jne .notdeasomething - mov esi,[romdata] - add esi,017837Ch - mov word [esi],0EAEAh -.notdeasomething - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'HUMA' - jne .nothumangrandprix3 - cmp dword[esi+4],'N GR' - jne .nothumangrandprix3 - cmp dword[esi+8],'ANDP' - jne .nothumangrandprix3 - mov byte[cycpb268],135 - mov byte[cycpb358],157 - mov byte[cycpbl2],125 - mov byte[cycpblt2],125 - mov byte[cycpbl],125 - mov byte[cycpblt],125 -.nothumangrandprix3 - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'ACCE' - jne .notaccelebrid - cmp dword[esi+4],'LEBR' - jne .notaccelebrid - cmp dword[esi+8],'ID ' - jne .notaccelebrid - mov esi,[romdata] - add esi,034DA2h - mov byte[esi],000h - mov esi,[romdata] - add esi,034DA3h - mov byte[esi],000h -.notaccelebrid - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'BATT' - jne .notbattlegp - cmp dword[esi+4],'LE G' - jne .notbattlegp - cmp dword[esi+8],'RAND' - jne .notbattlegp - mov esi,[romdata] - add esi,018089h - mov byte[esi],0FBh - mov esi,[romdata] - add esi,006C95h - mov byte[esi],0FBh -.notbattlegp - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'Neug' - jne .notneugiertrans - cmp dword[esi+4],'ier ' - jne .notneugiertrans - cmp dword[esi+8],'(tr.' - jne .notneugiertrans - - mov esi,[romdata] - add esi,0D4150h - mov byte[esi],0F9h -.notneugiertrans - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'NEUG' - jne .notneugier - cmp dword[esi+4],'IER ' - jne .notneugier - cmp dword[esi+8],' ' - jne .notneugier - - mov esi,[romdata] - add esi,0D4150h - mov byte[esi],0F9h -.notneugier - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'HOME' - jne .nothomealone - cmp dword[esi+4],' ALO' - jne .nothomealone - mov esi,[romdata] - add esi,0666Bh - mov byte[esi],0EEh ; RTS instead of jumping to a rts - mov byte[esi+1],0BCh ; RTS instead of jumping to a rts -.nothomealone - -; mov esi,[romdata] -; add esi,0FFC0h -; cmp dword[esi],'EMER' -; jne .notemeralddragon -; cmp dword[esi+4],'ALD ' -; jne .notemeralddragon -; cmp dword[esi+8],'DRAG' -; jne .notemeralddragon -; mov byte[ENVDisable],1 -;.notemeralddragon - - mov esi,[romdata] - add esi,7FC0h - cmp dword[esi],'FF M' - jne .notffmq - mov byte[hirqmode2],1 -.notffmq - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'YOSH' - jne .notyoshi - cmp dword[esi+8],'ISLA' - jne .notyoshi -.notyoshi - cmp dword[esi],'YOSS' - jne .notyoshi2 - cmp dword[esi+8],'ISLA' - jne .notyoshi2 - mov byte[hdmaearlstart],2 - mov byte[opexec268],116 - mov byte[opexec358],126 -.notyoshi2 - - mov esi,[romdata] - add esi,0FFC0h - cmp dword[esi],'BUBS' - jne .notbubsy2 - cmp dword[esi+4],'Y II' - jne .notbubsy2 - mov byte[cycpb268],125 - mov byte[cycpb358],147 - mov byte[cycpbl2],125 - mov byte[cycpblt2],125 - mov byte[cycpbl],125 - mov byte[cycpblt],125 -.notbubsy2 - - mov esi,[romdata] - add esi,7FC0h - cmp dword[esi],0DEB3B0CFh - je .marvelous - cmp dword[esi],'REND' - jne .notrend - mov byte[cycpb268],157 - mov byte[cycpb358],157 - mov byte[cycpbl2],157 - mov byte[cycpblt2],157 - mov byte[cycpbl],157 - mov byte[cycpblt],157 - jmp .notrend -.marvelous -.notrend - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'STAR' - jne .notds9 - cmp dword[esi+4],' TRE' - jne .notds9 - cmp dword[esi+8],'K: D' - jne .notds9 - mov byte[opexec268],187 - mov byte[opexec358],187 -.notds9 - - mov esi,[romdata] - add esi,0FFC0h - cmp dword[esi],'CLAY' - jne .notclayfighter - cmp dword[esi+4],' FIG' - jne .notclayfighter - cmp dword[esi+8],'HTER' - jne .notclayfighter - cmp dword[esi+12],' ' - jne .notclayfighter - mov esi,[romdata] ; In intro - add esi,01A10B9h - mov byte[esi],0DEh - - mov esi,[romdata] ; In game - add esi,01A1996h - mov byte[esi],0DEh - mov esi,[romdata] - add esi,01AE563h - mov byte[esi],0DEh - mov esi,[romdata] - add esi,01AE600h - mov byte[esi],0DEh -.notclayfighter - - mov esi,[romdata] - add esi,0FFC0h - cmp dword[esi],'Baha' - jne .notbahamutlagoon - cmp dword[esi+4],'mut ' - jne .notbahamutlagoon - cmp dword[esi+8],'Lago' - jne .notbahamutlagoon - mov esi,[romdata] - add esi,010254h - mov byte[esi],0EEh -.notbahamutlagoon - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'MORT' - jne .notmk - cmp dword[esi+4],'AL K' - jne .notmk - cmp dword[esi+8],'OMBA' - jne .notmk - cmp dword[esi+12],'T ' - jne .notmk - mov byte[disablehdma],1 -.notmk - - mov esi,[romdata] - add esi,0FFC0h - cmp dword[esi],'CLOC' - jne .notclocktower - cmp dword[esi+4],'K TO' - jne .notclocktower - cmp dword[esi+8],'WER ' - jne .notclocktower - mov byte[opexec268],187 - mov byte[opexec358],182 - mov byte[opexec268cph],47 - mov byte[opexec358cph],47 -.notclocktower - - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'DRAG' - jne .notdq5 - cmp dword[esi+4],'ONQU' - jne .notdq5 - cmp dword[esi+8],'EST5' - jne .notdq5 - mov byte[disablehdma],1 -.notdq5 - - ; Lamborgini Challenge - -p 110 - mov esi,[romdata] - add esi,07FC0h - cmp dword[esi],'DIGI' - jne .nodigitaldevil - mov byte[opexec268],187 - mov byte[opexec358],187 -.nodigitaldevil - - mov esi,[romdata] - add esi,7FC0h - cmp dword[esi],'SP F' - jne .notfmatchtennis - mov byte[cycpb268],145 - mov byte[cycpb358],147 - mov byte[cycpbl2],145 - mov byte[cycpblt2],145 - mov byte[cycpbl],145 - mov byte[cycpblt],145 -.notfmatchtennis - - mov esi,[romdata] - add esi,7FC0h - cmp dword[esi],'DEAD' - je .deaddance - cmp dword[esi],'TUFF' - jne .nottuffenuff -.deaddance - mov byte[cycpb268],75 - mov byte[cycpb358],77 - mov byte[cycpbl2],75 - mov byte[cycpblt2],75 - mov byte[cycpbl],75 - mov byte[cycpblt],75 -.nottuffenuff - - 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 esi,[romdata] - add esi,02A9C1Ah - mov word [esi],0 - add esi, 5 - mov word [esi],0 - mov dword [ewj2hack],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 - - ; 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 -.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 -;int 3h -.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 - - ; Front Mission - -p 140 - mov esi,[romdata] - add esi,0FFC0h - cmp dword[esi],0C4DDDBCCh - jne .noromheadfm - cmp dword[esi+4],0AEBCAFD0h - jne .noromheadfm - mov byte[opexec268],226 - mov byte[opexec358],226 - mov byte[opexec268cph],80 - mov byte[opexec358cph],80 -.noromheadfm - - ; Front Mission - -p 140 - mov esi,[romdata] - add esi,0FFC0h - cmp dword[esi],'FRON' - jne .noromheadfm2 - cmp dword[esi+4],'T MI' - jne .noromheadfm2 - mov byte[opexec268],226 - mov byte[opexec358],226 - mov byte[opexec268cph],80 - mov byte[opexec358cph],80 -.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 - ret - -SECTION .data - -.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 - -SECTION .text - - -NEWSYM idledetectspc - inc dword[numspcvblleft] - cmp byte[SPCStallSetting],2 - jae .fullstall - inc byte[SPCStallSetting] - mov byte[ReturnFromSPCStall],1 - ret -.fullstall - mov dword[spc700idle],29 - mov dword[Msgptr],.unableskip - mov eax,[MsgCount] - mov [MessageOn],eax - ret - -SECTION .data -.unableskip db 'SPC700 STALL DETECTED.',0 - -SECTION .bss -NEWSYM ReturnFromSPCStall, resb 1 -NEWSYM SPCStallSetting, resb 1 -NEWSYM SPCSkipXtraROM, resb 1 -NEWSYM WindowDisables, resd 1 -SECTION .text - -%macro helpclearmem 2 - mov edi,%1 - mov ecx,%2 - rep stosb -%endmacro - -NEWSYM init65816 - mov byte[osm2dis],0 - mov byte[bgfixer2],0 - mov word[ScrDispl],0 - cmp byte[SA1Enable],0 - je .nosa1init - call SA1Reset - call SetAddressingModesSA1 -.nosa1init - cmp byte[OBCEnable],0 - je .noobcinit - call InitOBC -.noobcinit - cmp byte[C4Enable],0 - je .noc4init - mov byte[osm2dis],1 - mov byte[bgfixer2],1 - call InitC4 -.noc4init - cmp byte[RTCEnable],0 - je .noRTCinit - call RTCinit -.noRTCinit - cmp byte[SPC7110Enable],0 - je .nospc7110init - call SPC7110init - mov dword[memtabler8+50h*4],memaccessspc7110r8 - mov dword[memtabler16+50h*4],memaccessspc7110r16 - mov dword[memtablew8+50h*4],memaccessspc7110w8 - mov dword[memtablew16+50h*4],memaccessspc7110w16 - mov eax,[romdata] - add eax,510000h - mov dword[snesmmap+50h*4],eax - mov dword[snesmap2+50h*4],eax - mov ecx,16384 -.spc7110clear - mov dword[eax],0 - add eax,4 - dec ecx - jnz .spc7110clear -.nospc7110init - mov byte[cycpb268],117 - mov byte[cycpb358],127 - mov byte[cycpbl2],117 - mov byte[cycpblt2],117 - mov byte[cycpbl],117 - mov byte[cycpblt],117 - - 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[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 - 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 dword[spcnumread],0 - mov dword[spchalted],-1 - mov dword[coladdr],0 - mov byte[NMIEnab],1 - mov word[VIRQLoc],0 - mov byte[doirqnext],0 - mov dword[reg1read],0 - mov word[resolutn],224 - mov byte[vidbright],0 - mov byte[forceblnk],0 - mov byte [spcP],0 - mov byte[timeron],0 - mov byte[JoyAPos],0 - mov byte[JoyBPos],0 - mov byte[coladdr],0 - mov byte[coladdg],0 - mov byte[coladdb],0 - - mov byte[INTEnab],0 - mov word[xa],0 - mov byte[xdb],0 - mov byte[xpb],0 - mov byte[xirqb],0 - mov word[xs],01FFh - mov word[xd],0 - mov word[xx],0 - mov word[xy],0 - mov dword[SDD1BankA],03020100h - mov byte[xp],00110100b ; NVMXDIZC - - push ebx - mov byte[xe],1 ; E - xor eax,eax - mov ax,[resetv] - mov word[xpc],ax - mov ebx,[romdata] - add eax,ebx - cmp word[xpc],8000h - jb .notrainer - cmp dword[ebx+0FFC0h],'BREA' - jne .ntrchecka - cmp word[resetv],0F000h - jne .ntrchecka - jmp .yestrainer -.ntrchecka - sub eax,8000h - cmp byte[eax],5Ch - jne .notrainer - cmp word[eax+2],80h - je .notrainer - cmp word[eax+2],8080h - je .notrainer - cmp word[eax+2],89h - je .notrainer - cmp word[eax+2],8089h - je .notrainer -.yestrainer - mov dword[ramsize],32768 - mov dword[ramsizeand],32767 -.notrainer - pop ebx - - mov byte[intrset],0 - cmp byte[romtype],1 - je .nohirom - mov byte[xpb],00h - mov byte[xirqb],00h -.nohirom - cmp word[xpc],8000h - jae .n - add word[xpc],8000h -; mov byte[xpb],40h -.n - mov al,[opexec268] - mov 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,055555555h - - ;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 - ;dec ecx - ;jnz .loopbsx -;.skipbsxmove - ;popad -;.notbsx - - helpclearmem wramdataa, 65536 - helpclearmem ram7fa, 65536 - cmp byte[BSEnable],1 - jne .notbsx2 - cmp byte[romtype],1 ;Hack for BS HiROMs - 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 - - mov dword[wramreadptr],getwram1fff - mov dword[wramwriteptr],setwram1fff - ret - -SECTION .data -.boffound db '.....',0 -SECTION .text - -getwram1fff: - mov al,[wramdataa+1fffh] - ret -setwram1fff: - mov [wramdata+1fffh],al - ret - -;******************************************************* -; Init SNES Sets the pointers, etc. -;******************************************************* -; Set banks according to : -; Banks 00-3F,80-BF : WRAM (0000h-7FFFh), ROM Data (8000h-FFFFh) -; Banks 40-7F,C0-FF : ROM Data (0000h-FFFFh) -; Bank 70-77 : SRAM (0000h-7FFFh) -; Bank 7E : WRAM (0000h-FFFFh) -; Bank 7F : ExtendRAM (0000h-FFFFh) - -SECTION .bss -NEWSYM curromsize, resb 1 -NEWSYM cromptradd, resd 1 -NEWSYM NoiseDisTemp, resd 2 -NEWSYM lorommapmode2, resb 1 -NEWSYM MMXSRAMFix, resb 1 -SECTION .text - -NEWSYM initsnes - mov byte[ForceNewGfxOff],0 - mov dword[NoiseDisTemp],0 - mov dword[NoiseDisTemp+4],0 - mov byte[MMXSRAMFix],0 - - mov esi,[romdata] - add esi,7FC0h - cmp dword[esi],'MEGA' - jne .notmmx - cmp dword[esi+4],'MAN ' - jne .notmmx - cmp dword[esi+8],'X ' - jne .notmmx - mov esi,[romdata] - cmp byte[esi+824Ah],0F0h - jne .mmxa - mov byte[esi+824Ah],080h -.mmxa - cmp byte[esi+21FC3h],0F0h - jne .mmxb - mov byte[esi+21FC3h],080h -.mmxb - cmp byte[esi+2241Bh],0F0h - jne .mmxc - mov byte[esi+2241Bh],080h -.mmxc - cmp byte[esi+824Fh],0F0h - jne .mmxd - mov byte[esi+824Fh],080h -.mmxd - cmp byte[esi+21FC8h],0F0h - jne .mmxe - mov byte[esi+21FC8h],080h -.mmxe - cmp byte[esi+22420h],0F0h - jne .mmxf - mov byte[esi+22420h],080h -.mmxf - mov byte[MMXSRAMFix],1 -.notmmx - - mov esi,[romdata] - add esi,7FC0h - cmp byte[BSEnable],1 - jne .notbsx3 - cmp byte[romtype],1 ;Hack for BS HiROMs - je near .bslorom -.notbsx3 - mov esi,[romdata] - add esi,[infoloc] - add esi,22 - mov byte[MultiTap],1 - cmp byte[pl12s34],1 - je .nomtap - cmp byte[pl3contrl],0 - jne .mtap - cmp byte[pl4contrl],0 - jne .mtap - cmp byte[pl5contrl],0 - jne .mtap -.nomtap - mov byte[MultiTap],0 -.mtap - - cmp byte[romtype],1 - jne .nosfx - cmp byte[SFXEnable],1 - je near .sfx -.nosfx - cmp byte[SA1Enable],1 - je near SA1memmap - cmp byte[SDD1Enable],1 - je near SDD1memmap - - cmp byte[SPC7110Enable],1 - je near .hirom - ;Should catch DKJM2 here, but need to fix mem map as well - cmp byte[curromsize],13 - je near .lorom48 - cmp byte[romtype],1 - jne near .hirom - - ; set addresses 8000-FFFF - ; set banks 00-3F (40h x 32KB ROM banks @ 8000h) - mov edi,snesmmap - mov eax,[romdata] - sub eax,8000h - mov ecx,40h -.loopa - stosd - add eax,8000h - dec ecx - jnz .loopa - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov ecx,40h -.loopb - stosd - add eax,8000h - dec ecx - jnz .loopb - ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) - mov eax,[romdata] - cmp byte[lorommapmode2],0 - je .notlorommode2 - add eax,200000h -.notlorommode2 - sub eax,8000h - mov cx,20h -.loopc - stosd - add eax,8000h - dec ecx - jnz .loopc - cmp byte[lorommapmode2],0 - je .notlorommode2b - sub eax,200000h -.notlorommode2b - mov cx,20h -.loopclr - stosd - add eax,8000h - dec ecx - jnz .loopclr - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov ecx,40h -.loopd - stosd - add eax,8000h - dec ecx - jnz .loopd - ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) - ; set banks 00-3F - mov edi,snesmap2 - mov eax,[wramdata] - mov ecx,40h -.loopa2 - stosd - dec ecx - jnz .loopa2 - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,200000h - mov ecx,40h -.loopb2 - stosd - add eax,8000h - dec ecx - jnz .loopb2 - ; set banks 80-BF (01h x 32KB WRAM @ 0000h) - mov eax,[wramdata] - mov ecx,40h -.loopc2 - stosd - dec ecx - jnz .loopc2 - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,200000h - mov ecx,40h -.loopd2 - stosd - add eax,8000h - dec ecx - jnz .loopd2 - ; set bank 70 - mov eax,[sram] - xor ebx,ebx - mov bl,70h -.nextsram - mov [snesmap2+ebx*4],eax - inc bl - cmp bl,77h - jbe .nextsram - ; set bank 7E - mov eax,[wramdata] - mov [snesmmap+7Eh*4],eax - mov [snesmap2+7Eh*4],eax - ; set bank 7F - mov eax,[ram7f] - mov [snesmmap+7Fh*4],eax - mov [snesmap2+7Fh*4],eax - ret - -.bslorom - ; set addresses 8000-FFFF - ; set banks 00-3F (40h x 32KB ROM banks @ 8000h) - mov edi,snesmmap - mov eax,[romdata] - sub eax,8000h - mov ecx,40h -.loopas - stosd - add eax,8000h - dec ecx - jnz .loopas - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov ecx,40h -.loopbs - stosd - add eax,8000h - dec ecx - jnz .loopbs - ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) - mov eax,[romdata] - sub eax,8000h - mov cx,40h -.loopcs - stosd - add eax,8000h - dec ecx - jnz .loopcs - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,8000h - mov ecx,40h -.loopds - stosd - add eax,8000h - dec ecx - jnz .loopds - ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) - ; set banks 00-3F - mov edi,snesmap2 - mov eax,[wramdata] - mov ecx,40h -.loopa2s - stosd - dec ecx - jnz .loopa2s - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,200000h - mov ecx,40h -.loopb2s - stosd - add eax,8000h - dec ecx - jnz .loopb2s - ; set banks 80-BF (01h x 32KB WRAM @ 0000h) - mov eax,[wramdata] - mov ecx,40h -.loopc2s - stosd - dec ecx - jnz .loopc2s - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,8000h - mov ecx,40h -.loopd2s - stosd - add eax,8000h - dec ecx - jnz .loopd2s - ; set bank 70 - mov eax,[sram] - xor ebx,ebx - mov bl,70h -.nextsrams - mov [snesmap2+ebx*4],eax - inc bl - cmp bl,77h - jbe .nextsrams - ; set bank 7E - mov eax,[wramdata] - mov [snesmmap+7Eh*4],eax - mov [snesmap2+7Eh*4],eax - ; set bank 7F - mov eax,[ram7f] - mov [snesmmap+7Fh*4],eax - mov [snesmap2+7Fh*4],eax - ret - -.lorom48 - mov byte[cycpb268],94 - mov byte[cycpb358],94 - mov byte[cycpbl2],94 - mov byte[cycpblt2],94 - mov byte[cycpbl],94 - mov byte[cycpblt],94 - mov byte[opexec268],183 - mov byte[opexec358],187 - mov byte[opexec268cph],30 - mov byte[opexec358cph],30 - mov 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 - dec ecx - jnz .loopa3 - ; set banks 40-6F (30h x 64KB ROM banks @ 8000h) - mov eax,[romdata] - sub eax,8000h - mov ecx,40h -.loopb32 - stosd - add eax,8000h - dec ecx - jnz .loopb32 - ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) - mov eax,[romdata] - sub eax,8000h - mov cx,40h -.loopc3 - stosd - add eax,8000h - dec ecx - jnz .loopc3 - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,200000h - mov ecx,40h -.loopd3 - stosd - add eax,10000h - dec ecx - jnz .loopd3 - ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) - ; set banks 00-3F - mov edi,snesmap2 - mov eax,[wramdata] - mov ecx,40h -.loopa23 - stosd - dec ecx - jnz .loopa23 - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,100000h - mov ecx,40h -.loopb3 - stosd - add eax,8000h - dec ecx - jnz .loopb3 - ; set banks 80-BF (01h x 32KB WRAM @ 0000h) - mov eax,[wramdata] - mov ecx,40h -.loopc23 - stosd - dec ecx - jnz .loopc23 - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,200000h - mov ecx,40h -.loopd23 - stosd - add eax,10000h - dec ecx - jnz .loopd23 - ; set bank 70 - mov eax,[sram] - xor ebx,ebx - mov bl,70h -.nextsram3 - mov [snesmap2+ebx*4],eax - inc bl - cmp bl,77h - jbe .nextsram3 - ; set bank 7E - mov eax,[wramdata] - mov [snesmmap+7Eh*4],eax - mov [snesmap2+7Eh*4],eax - ; set bank 7F - mov eax,[ram7f] - mov [snesmmap+7Fh*4],eax - mov [snesmap2+7Fh*4],eax - 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 - dec ecx - jnz .loopab - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - mov ecx,40h -.loopbb - stosd - add eax,10000h - dec ecx - jnz .loopbb - ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) - mov eax,[romdata] - mov ecx,40h -.loopcb - stosd - add eax,10000h - dec ecx - jnz .loopcb - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - mov ecx,40h -.loopdb - stosd - add eax,10000h - dec ecx - jnz .loopdb - ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) - ; set banks 00-3F - mov edi,snesmap2 - mov eax,[wramdata] - mov ecx,40h -.loopa2b - stosd - dec ecx - jnz .loopa2b - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - mov cx,40h -.loopb2b - stosd - add eax,10000h - dec ecx - jnz .loopb2b - ; set banks 80-BF (01h x 32KB WRAM @ 0000h) - mov eax,[wramdata] - mov cx,40h -.loopc2b - stosd - dec ecx - jnz .loopc2b - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - mov cx,40h -.loopd2b - stosd - add eax,10000h - dec ecx - jnz .loopd2b - ; set bank 70 - mov eax,[sram] - xor ebx,ebx - mov bl,70h -.nextsramb - mov [snesmap2+ebx*4],eax - inc bl - cmp bl,77h - jbe .nextsramb - ; set bank 7E - mov eax,[wramdata] - mov [snesmmap+7Eh*4],eax - mov [snesmap2+7Eh*4],eax - ; set bank 7F - mov eax,[ram7f] - mov [snesmmap+7Fh*4],eax - mov [snesmap2+7Fh*4],eax - ret - -.sfx - mov byte[MultiTap],0 - ; Clear sfxregisters - mov edi,SfxR0 - mov ecx,16 - xor eax,eax - rep stosd - ; set addresses 8000-FFFF - ; set banks 00-3F (40h x 32KB ROM banks @ 8000h) - mov edi,snesmmap - mov eax,[romdata] -; sub eax,8000h - mov ecx,40h -.loopa3s - stosd - add eax,10000h - dec ecx - jnz .loopa3s - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] -; add eax,200000h - add eax,8000h - mov ecx,40h -.loopb3s - stosd - add eax,20000h - dec ecx - jnz .loopb3s - ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) - mov eax,[romdata] -; sub eax,8000h - mov cx,40h -.loopc3s - stosd - add eax,10000h - dec ecx - jnz .loopc3s - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] -; add eax,200000h - add eax,8000h - mov ecx,40h -.loopd3s - stosd - add eax,20000h - dec ecx - jnz .loopd3s - ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) - ; set banks 00-3F - mov edi,snesmap2 - mov eax,[wramdata] - mov ecx,40h -.loopa23s - stosd - dec ecx - jnz .loopa23s - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,8000h - mov ecx,40h -.loopb23s - stosd - add eax,20000h - dec ecx - jnz .loopb23s - ; set banks 80-BF (01h x 32KB WRAM @ 0000h) - mov eax,[wramdata] - mov ecx,40h -.loopc23s - stosd - dec ecx - jnz .loopc23s - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,8000h - mov ecx,40h -.loopd23s - stosd - add eax,20000h - dec ecx - jnz .loopd23s - ; set bank 70 - mov eax,[sram] - mov [snesmap2+78h*4],eax - mov [snesmap2+79h*4],eax - mov eax,[sfxramdata] - mov [snesmap2+70h*4],eax - add eax,65536 - mov [snesmap2+71h*4],eax - add eax,65536 - mov [snesmap2+72h*4],eax - add eax,65536 - mov [snesmap2+73h*4],eax - ; set bank 7E - mov eax,[wramdata] - mov [snesmmap+7Eh*4],eax - mov [snesmap2+7Eh*4],eax - ; set bank 7F - mov eax,[ram7f] - mov [snesmmap+7Fh*4],eax - mov [snesmap2+7Fh*4],eax - call preparesfx - ret - -SA1memmap: - mov eax,[romdata] - cmp dword[eax+0B95h],0ADCF10A9h - jne .nosuccess - mov byte[eax+0B96h],0 -.nosuccess - mov byte[MultiTap],0 - ; set addresses 8000-FFFF - ; set banks 00-3F (40h x 32KB ROM banks @ 8000h) - mov edi,snesmmap - mov eax,[romdata] - sub eax,8000h - mov ecx,40h -.loopa3s - stosd - add eax,8000h - dec ecx - jnz .loopa3s - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] -; add eax,400000h - mov ecx,40h -.loopb3s - stosd - add eax,10000h - dec ecx - jnz .loopb3s - ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) - mov eax,[romdata] - add eax,200000h - sub eax,8000h - mov cx,40h -.loopc3s - stosd - add eax,8000h - dec ecx - jnz .loopc3s - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,00000h - mov ecx,40h -.loopd3s - stosd - add eax,10000h - dec ecx - jnz .loopd3s - ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) - ; set banks 00-3F - mov edi,snesmap2 - mov eax,[wramdata] - mov ecx,40h -.loopa23s - stosd - dec ecx - jnz .loopa23s - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,400000h - mov ecx,40h -.loopb23s - stosd - add eax,10000h - dec ecx - jnz .loopb23s - ; set banks 80-BF (01h x 32KB WRAM @ 0000h) - mov eax,[wramdata] - mov ecx,40h -.loopc23s - stosd - dec ecx - jnz .loopc23s - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,00000h - mov ecx,40h -.loopd23s - stosd - add eax,10000h - dec ecx - jnz .loopd23s - ; set bank 7E - mov eax,[wramdata] - mov [snesmmap+7Eh*4],eax - mov [snesmap2+7Eh*4],eax - ; set bank 7F - mov eax,[ram7f] - mov [snesmmap+7Fh*4],eax - mov [snesmap2+7Fh*4],eax - ret - -SDD1memmap: - mov eax,[romdata] - cmp dword[eax+0B95h],0ADCF10A9h - jne .nosuccess - mov byte[eax+0B96h],0 -.nosuccess - mov byte[MultiTap],0 - ; set addresses 8000-FFFF - ; set banks 00-3F (40h x 32KB ROM banks @ 8000h) - mov edi,snesmmap - mov eax,[romdata] - sub eax,8000h - mov ecx,40h -.loopa3s - stosd - add eax,8000h - dec ecx - jnz .loopa3s - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] -; add eax,400000h - mov ecx,40h -.loopb3s - stosd - add eax,10000h - dec ecx - jnz .loopb3s - ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) - mov eax,[romdata] -; add eax,200000h - sub eax,8000h - mov cx,40h -.loopc3s - stosd - add eax,8000h - dec ecx - jnz .loopc3s - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,00000h - mov ecx,40h -.loopd3s - stosd - add eax,10000h - dec ecx - jnz .loopd3s - ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) - ; set banks 00-3F - mov edi,snesmap2 - mov eax,[wramdata] - mov ecx,40h -.loopa23s - stosd - dec ecx - jnz .loopa23s - ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,400000h - mov ecx,40h -.loopb23s - stosd - add eax,10000h - dec ecx - jnz .loopb23s - ; set banks 80-BF (01h x 32KB WRAM @ 0000h) - mov eax,[wramdata] - mov ecx,40h -.loopc23s - stosd - dec ecx - jnz .loopc23s - ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) - mov eax,[romdata] - add eax,00000h - mov ecx,40h -.loopd23s - stosd - add eax,10000h - dec ecx - jnz .loopd23s - ; set bank 7E - mov eax,[wramdata] - mov [snesmmap+7Eh*4],eax - mov [snesmap2+7Eh*4],eax - ; set bank 7F - mov eax,[ram7f] - mov [snesmmap+7Fh*4],eax - mov [snesmap2+7Fh*4],eax - ret - -;******************************************************* -; Prepare 48mbit Moves blocks around for 48mbit -;******************************************************* - -SECTION .data -NEWSYM memdest, dd 0 -NEWSYM SFXCounter, dd 0 -SECTION .text - -NEWSYM prepare48mbit - mov dword[NumofBanks],192 - ; 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 - dec ecx - jnz .loop - mov esi,mode7tab+256 - mov ecx,40h - mov al,40h+1 -.loop2 - mov [esi+80h],al - add al,2 - inc esi - dec ecx - jnz .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 - dec ecx - jnz .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],'DIRT' - je .yessfxcounter - cmp dword[esi],'Stun' - jne .nosfxcounter - mov byte[ForceNewGfxOff],1 -.yessfxcounter - mov byte[SFXCounter],1 -.nosfxcounter - - ; make table - mov byte[SfxAC],0 - mov eax,[romdata] - cmp dword[eax+02B80h],0AB6CAB6Ch - jne .noac - mov byte[SfxAC],1 -.noac - 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 - dec ecx - jnz .swaploop - sub edi,65536+32768 - sub esi,65536 - dec dl - jnz .swaploopb - ret - - ; copy address 0 to 200000h - ; make table 1 (0 .. 127) - mov esi,[romdata] - mov edi,[romdata] - add edi,200000h - mov ecx,200000h -.n - mov al,[esi] - mov [edi],al - inc esi - inc edi - dec ecx - jnz .n - ret - -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 - dec ecx - jnz .loopa - ret - -SECTION .data -.hexdat db '0123456789ABCDEF' -SECTION .text - -NEWSYM printhex8 - mov ecx,2 - xor ebx,ebx -.loopb - mov bx,ax - and bx,0F0h - shr bx,4 - mov dl,[printhex.hexdat+ebx] - push ax - mov ah,02h - call Output_Text - pop ax - shl ax,4 - dec ecx - jnz .loopb - ret - -;EXTSYM _imp__OutputDebugStringA@4 - -;NEWSYM printhex32 -; pushf -; mov ecx,8 -;.loopa -; mov ebx,eax -; and ebx,0Fh -; mov dl,[printhex.hexdat+ebx] -; mov [.hexout-1+ecx],dl -; shr eax,4 -; dec ecx -; jnz .loopa - -; push dword .hexout -; call [_imp__OutputDebugStringA@4] - -; popf -; db 0C3h ; ret - -;section .bss -;NEWSYM __debug_crap_address__, dd 0,0,0,0 -;.hexout db "blahblah",0 -;section .text - -;******************************************************* -; 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 - - -SECTION .bss -IPSSL resd 1 -SECTION .text - -NEWSYM PatchIPS -%ifdef __LINUX__ - pushad - call pushdir - popad -%endif - 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 -%ifdef __LINUX__ - cmp byte[eax],'/' -%else - cmp byte[eax],'\' -%endif - je .failfound - cmp byte[eax],'.' - je .foundokay - jmp .findnext2 -.failfound - mov eax,ebx -.foundokay - mov ebx,[eax] - mov [Prevextn],ebx - mov dword[eax],'.ips' - mov byte[eax+4],0 - push eax -%ifdef __LINUX__ - cmp byte [ZipSupport], 1 - je .nochangedir - mov ebx,LoadDir - call Change_Dir -.nochangedir: -%endif - 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 -; dec ecx -; jnz .ltop -%ifdef __LINUX__ - pushad - call popdir - popad -%endif - ret - -SECTION .data -.ipsokaymsg db 'IPS PATCHED.',0 -.ipsnokaymsg db 'IPS IS CORRUPT.',0 - -SECTION .bss -NEWSYM Header512, resb 1 -NEWSYM Prevextn, resd 1 -NEWSYM Headchek, resb 5 -NEWSYM IPSLimit, resd 1 -NEWSYM IPSOffset, resd 1 -NEWSYM IPSCount, resd 1 -IPSPatched resb 1 -SECTION .text - -OpenCombFile: - mov edx,fnames+1 -.next - cmp byte[edx],0 - je .found - inc edx - jmp .next -.found - dec edx - cmp byte[edx],'.' - je .found2 - jmp .found -.found2 - mov dword[edx],'.cmb' - push edx - mov dword[NumComboLocl],0 - mov edx,fnames+1 - call Open_File - jc .failb - mov bx,ax - mov edx,ComboBlHeader - mov ecx,23 - call Read_File - mov al,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 - mov dword[edx],'.srm' - ret - -NEWSYM SaveCombFile - cmp byte[romloadskip],0 - jne near .notfound - mov edx,fnames+1 -.next - cmp byte[edx],0 - je .found - inc edx - jmp .next -.found - dec edx - cmp byte[edx],'.' - je .found2 - jmp .found -.found2 - mov dword[edx],'.cmb' - push edx - mov al,[NumComboLocl] - or al,al - jz .failb - mov [ComboHeader+22],al - mov edx,fnames+1 - call Create_File - jc .failb - mov bx,ax - mov edx,ComboHeader - mov ecx,23 - call Write_File - mov ecx,[NumComboLocl] - mov edx,ecx - shl ecx,6 - add ecx,edx - add ecx,edx - mov edx,CombinDataLocl - call Write_File - call Close_File -.failb - pop edx - mov dword[edx],'.srm' -.notfound - ret - -NEWSYM loadfile - mov byte[TextFile], 0 - call GetCurDir - mov byte[InGUI],0 -%ifdef __LINUX__ - mov dl,[InitDrive] - mov ebx,InitDir - call Change_Dir -%endif - - jmp loadfileGUI.nogui - -SECTION .data -.failop db 'Error opening file!',13,10,0 -.opened db 'File opened successfully!',13,10,0 -.mult db 'Multiple file format detected.',13,10,13,10,0 -SECTION .bss -.multfound resb 1 -.first resb 1 -.cchar resb 1 -.dotpos resd 1 -.curfileofs resd 1 -.filehand resw 1 -.temp resb 1 -.fail resb 1 - - -NEWSYM Checksumvalue, resw 1 -NEWSYM Checksumvalue2, resw 1 ;This is outdated, but needed for the command line loader -NEWSYM CRC32, resd 1 -NEWSYM SramExists, resb 1 -NEWSYM NumofBanks, resd 1 -NEWSYM NumofBytes, resd 1 -NEWSYM ZipSupport, resb 1 -InGUI resb 1 - -SECTION .data - -%ifdef __LINUX__ -tempdirname db '/tmp/zziptmp',0 -%else -tempdirname db 'zziptmp_.__z',0 -%endif -PrevDir db '..',0 - - -GUIfindBlank db '*.',0 - -SECTION .text - -%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 - -SECTION .data -InvalidZip db 'ZSNES Version A does not support .ZIP files.',13,10,'Please use Version C for this feature.',10,13,0 - -SECTION .bss -ZipError resb 1 - -SECTION .text - -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 GUImgdfind - UnZipSearch GUIufofind - UnZipSearch GUIfind058 - UnZipSearch GUIfind078 - UnZipSearch GUIfindUSA - UnZipSearch GUIfindEUR - UnZipSearch GUIfindJAP - UnZipSearch GUIfindBIN - UnZipSearch GUIfindZIP - UnZipSearch GUIfind1 - UnZipSearch GUIfindIC7 - UnZipSearch GUIfindIC6 - UnZipSearch GUIfindIC5 - UnZipSearch GUIfindIC4 - UnZipSearch GUIfindIC3 - UnZipSearch GUIfindIC2 - UnZipSearch GUIfindIC1 - 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 - -%ifdef __LINUX__ -GUIfindIC7 db '*.[Ii][Cc]7',0 -GUIfindIC6 db '*.[Ii][Cc]6',0 -GUIfindIC5 db '*.[Ii][Cc]5',0 -GUIfindIC4 db '*.[Ii][Cc]4',0 -GUIfindIC3 db '*.[Ii][Cc]3',0 -GUIfindIC2 db '*.[Ii][Cc]2',0 -GUIfindIC1 db '*.[Ii][Cc]1',0 -%else -GUIfindIC7 db '*.iC7',0 -GUIfindIC6 db '*.iC6',0 -GUIfindIC5 db '*.iC5',0 -GUIfindIC4 db '*.iC4',0 -GUIfindIC3 db '*.iC3',0 -GUIfindIC2 db '*.iC2',0 -GUIfindIC1 db '*.iC1',0 -%endif - -ZipDelete: - mov esi,mode7tab - call ZipDeleteRecurse - mov edx,PrevDir - call Change_Single_Dir - mov edx,tempdirname - call Remove_Dir - call Makemode7Table - ret - -SECTION .bss -tempzip resb 1 -SECTION .text - -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 - dec ecx - jnz .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 - -SECTION .data - -SPC7110DIRA db 'FEOEZSP7',0 -SPC7110DIRB db 'SMHT-SP7',0 -SDD1DIRA db 'SOCNSDD1',0 -SDD1DIRB db 'SFZ2SDD1',0 -SDD1DIRC db 'SFA2SDD1',0 -SDD1DIRD db 'SF2ESDD1',0 -SPC7110IndexName db 'index.bin',0 -SPC7110DirEntry db '*.bin',0 -NEWSYM SDD1Offset, dd 65536*8 -%ifndef __LINUX__ -NEWSYM SDD1nfname, db ' \_00000-0.bin',0 -NEWSYM SPC7110nfname, db ' \ .bin',0 -%else -NEWSYM SDD1nfname, db ' /_00000-0.bin',0 -NEWSYM SPC7110nfname, db ' / .bin',0 -%endif -NEWSYM SDD1ifname, db 'sdd1gfx.idx',0 -NEWSYM SDD1dfname, db 'sdd1gfx.dat',0 -NEWSYM SDD1pfname, db 'sdd1gfx.pat',0 -spc7110notfound db 'DECOMPRESSED PACK NOT FOUND',0 -spc7110notfoundb db 'INDEX DATA NOT FOUND',0 - -SECTION .bss - -SPC7110Allocated resb 1 -SPC7110CPtr resd 1 -SPC7110CPtr2 resd 1 -NEWSYM SPC7110IndexSize, resd 1 -NEWSYM SPC7110Entries, resd 1 -SDD1PatchAddr resd 1 -SDD1PatchOfs resd 1 -SDD1PatchLen resd 1 - -SECTION .text - -EXTSYM sdd1fname - -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 near .spc7110 - cmp al,0F5h - je near .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 - cmp al,045h - jne .noSDD1 - mov edx,SDD1DIRA - mov dword[sdd1fname],'socn' - jmp .sdd1b -.noSDD1 - cmp al,043h - jne .noSDD1a - add esi,3 - mov al,[esi] - cmp al,0 - jne .notsfz2 - mov edx,SDD1DIRB - mov dword[sdd1fname],'sfz2' - jmp .sdd1b -.notsfz2 - cmp al,01h - jne .notsfa2 - mov edx,SDD1DIRC - mov dword[sdd1fname],'sfa2' - jmp .sdd1b -.notsfa2 - mov edx,SDD1DIRD - mov dword[sdd1fname],'sf2e' - jmp .sdd1b -.noSDD1a - ret -.spc7110 - mov edx,SPC7110DIRA - cmp al,0F9h - je .noSPC7110b - mov edx,SPC7110DIRB -.noSPC7110b - 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,[SDD1Offset] - mov [SPC7110CPtr2],eax - - mov edx,SDD1ifname - call Open_File - jc near .noindexfile - mov bx,ax - mov edx,[SPC7110CPtr] - mov ecx,[SDD1Offset] - call Read_File - add dword[SPC7110CPtr],eax - xor ecx,ecx - or eax,eax - jz .notfoundb - push ebx - xor edx,edx - mov ebx,12 - div ebx - mov dword[SPC7110Entries],eax - mov ecx,eax - mov eax,[spc7110romptr] - mov ebx,[SPC7110CPtr2] -.sdd1loop - add [eax+4],ebx - add eax,12 - dec ecx - jnz .sdd1loop - pop ebx -.notfoundb - call Close_File - mov edx,SDD1dfname - call Open_File - jc near .noindexfile - mov bx,ax - mov edx,[SPC7110CPtr2] - mov ecx,7*1024*1024 - call Read_File - add dword[SPC7110CPtr2],eax - call Close_File - jmp .yesindexfile -.noindexfile - mov eax,[spc7110romptr] - mov [SPC7110CPtr],eax - add eax,[SDD1Offset] - mov [SPC7110CPtr2],eax - mov dword[SPC7110Entries],0 -.yesindexfile - - 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 - 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,[SDD1Offset] - 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 - - ; Load patch (Address, offset, length) - mov edx,SDD1pfname - call Open_File - jc near .nopatch - mov bx,ax - mov ecx,4 - mov edx,SDD1PatchAddr - call Read_File - or eax,eax - jz .donepatch - mov ecx,4 - mov edx,SDD1PatchOfs - call Read_File - mov ecx,4 - mov edx,SDD1PatchLen - call Read_File - pushad - mov ecx,[SPC7110Entries] - mov edx,[spc7110romptr] -.patloop - mov eax,[edx] - cmp eax,[SDD1PatchAddr] - jne .notaddress - mov eax,[edx+4] - add eax,[SDD1PatchOfs] - pushad - mov edx,eax - mov ecx,[SDD1PatchLen] - call Read_File - popad - jmp .foundaddr -.notaddress - add edx,12 - dec ecx - jnz .patloop - ; not found - pushad - mov edx,[SPC7110CPtr2] - mov ecx,[SDD1PatchLen] - call Read_File - popad -.foundaddr - popad -.donepatch - call Close_File -.nopatch - - ; Save Datafile - jmp .nosavedatafile - -; mov eax,[spc7110romptr] -; mov [SPC7110CPtr],eax -; add eax,[SDD1Offset] -; mov [SPC7110CPtr2],eax - - mov ecx,[SPC7110Entries] - mov eax,[spc7110romptr] - mov ebx,eax - add ebx,[SDD1Offset] -.sdd1loopb - sub [eax+4],ebx - add eax,12 - dec ecx - jnz .sdd1loopb - - mov edx,SDD1ifname - call Create_File - mov bx,ax - mov edx,[spc7110romptr] - mov ecx,[SPC7110CPtr] - sub ecx,edx - call Write_File - call Close_File - - mov edx,SDD1dfname - call Create_File - mov bx,ax - mov edx,[spc7110romptr] - add edx,[SDD1Offset] - mov ecx,[SPC7110CPtr2] - sub ecx,edx - call Write_File - call Close_File - - mov ecx,[SPC7110Entries] - mov eax,[spc7110romptr] - mov ebx,eax - add ebx,[SDD1Offset] -.sdd1loopc - add [eax+4],ebx - add eax,12 - dec ecx - jnz .sdd1loopc -.nosavedatafile - - 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 esi,[headdata] - add esi,[.curfileofs] - mov edi,[headdata] - add edi,[.curfileofs] - add [.curfileofs],eax - mov ecx,eax - and ecx,32767 - cmp ecx,512 - je near .yesheader - ; check if .smc header - push esi - push eax - push ebx - xor ecx,ecx - mov ebx,512 -.nextzerocheck - cmp byte[esi],0 - jne .notzero - inc ecx -.notzero - inc esi - dec ebx - jnz .nextzerocheck - pop ebx - pop eax - pop esi - cmp ecx,450 - jb .nomove -.yesheader - mov byte[Header512],1 - mov edi,esi - add edi,512 - sub eax,512 - ; move eax # of bytes from edi to esi - sub dword[.curromspace],512 - sub dword[.curfileofs],512 -.next - mov cl,[edi] - mov [esi],cl - inc esi - inc edi - dec eax - jnz .next -.nomove - 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 \ (You suck nasm) -.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 - mov edi,[.dotpos] - ; search for ICx files - cmp byte[edi],'.' - jne .noicfile - cmp byte[edi+3],'1' - jb .noicfile - cmp byte[edi+3],'7' - ja .noicfile - cmp byte[edi+4],0 - jne .noicfile - dec byte[edi+3] - xor ecx,ecx - mov byte[.first],2 - mov edx,fname+1 - call Open_File - jnc near .nextfile - inc byte[edi+3] -.noicfile - ; 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[TextFile], 1 - mov byte[IPSPatched],0 - - mov byte[lorommapmode2],0 - mov esi,[romdata] - cmp dword[esi+207FC0h],'DERB' - jne .noderby96 - cmp dword[esi+207FC4h],'Y ST' - jne .noderby96 - cmp dword[esi+207FC8h],'ALLI' - jne .noderby96 - cmp dword[esi+207FCDh],'N 96' - jne .noderby96 - mov byte[lorommapmode2],1 -.noderby96 - cmp dword[esi+7FC0h],'SOUN' - jne .nosoundnovel - cmp dword[esi+7FC4h],'D NO' - jne .nosoundnovel - cmp dword[esi+7FC8h],'VEL-' - jne .nosoundnovel - cmp dword[esi+7FCDh],'COOL' - jne .nosoundnovel - mov byte[lorommapmode2],1 -.nosoundnovel - - jmp .skipall - ; scan for branches - mov esi,06A5h - add esi,[romdata] - mov ecx,80h -.loopcheck - cmp byte[esi],48h - je .yes - cmp byte[esi],8Bh - je .yes - cmp byte[esi],0Bh - je .yes - cmp byte[esi],4Bh - je .yes - cmp byte[esi],08h - je .yes - cmp byte[esi],0DAh - je .yes - cmp byte[esi],5Ah - je .yes - jmp .no -.yes - pushad - mov al,byte[esi] - mov al,80h - sub al,cl - call printhex8 - popad -.no - add esi,8000h - dec ecx - jnz .loopcheck -.skipall - - 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 - - mov eax,[.curfileofs] - mov [NumofBytes],eax - shr eax,15 - mov [NumofBanks],eax - - 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 -.failop db 'Error opening file!',13,10,0 -.opened db 'File opened successfully!',13,10,0 -.mult db 'Multiple file format detected.',13,10,13,10,0 - -SECTION .bss - -.multfound resb 1 -.first resb 1 -.cchar resb 1 -.dotpos resd 1 -.curfileofs resd 1 -.filehand resw 1 -.temp resb 1 -.fail resb 1 -.maxromspace resd 1 -.curromspace resd 1 -NEWSYM GUIloadfailed, resb 1 - -SECTION .text - - -NEWSYM convertsram - cmp byte[cfgloadsdir],1 - je .sdrivechange - ret -.sdrivechange - ; copy fnames/fnamest to not have any '\' in them - mov esi,fnames+1 - mov ebx,0 -.next - mov al,[esi] - cmp al,0 - je .fincutoff - cmp al,'\' - je .cutoff - cmp al,'/' - je .cutoff - cmp al,':' - je .cutoff - inc esi - jmp .next -.cutoff - inc esi - mov ebx,esi - jmp .next -.fincutoff - cmp ebx,0 - je .nocutoff - mov esi,ebx - mov edi,fnames+1 -.next2 - mov al,[esi] - mov [edi],al - inc esi - inc edi - cmp al,0 - jne .next2 -.nocutoff - mov esi,fnamest+1 - mov ebx,0 -.nextb - mov al,[esi] - cmp al,0 - je .fincutoffb - cmp al,'\' - je .cutoffb - cmp al,'/' - je .cutoffb - cmp al,':' - je .cutoffb - inc esi - jmp .nextb -.cutoffb - inc esi - mov ebx,esi - jmp .nextb -.fincutoffb - cmp ebx,0 - je .nocutoffb - mov esi,ebx - sub esi,fnamest+1 - sub [statefileloc],esi - mov esi,ebx - mov edi,fnamest+1 -.next2b - mov al,[esi] - mov [edi],al - inc esi - inc edi - cmp al,0 - jne .next2b -.nocutoffb - ; change to sram directory - mov dl,[SRAMDrive] - mov ebx,SRAMDir - call Change_Dir - ret - -SECTION .data -NEWSYM CSStatus, db ' TYPE: ',0 -NEWSYM CSStatus2, db 'INTERLEAVED:No BANK:Lo CHSUM:OK ',0 -NEWSYM CSStatus3, db 'VIDEO: CRC32: ',0 - -crc32_table: -dd 000000000h, 077073096h, 0ee0e612ch, 0990951bah, 0076dc419h, 0706af48fh -dd 0e963a535h, 09e6495a3h, 00edb8832h, 079dcb8a4h, 0e0d5e91eh, 097d2d988h -dd 009b64c2bh, 07eb17cbdh, 0e7b82d07h, 090bf1d91h, 01db71064h, 06ab020f2h -dd 0f3b97148h, 084be41deh, 01adad47dh, 06ddde4ebh, 0f4d4b551h, 083d385c7h -dd 0136c9856h, 0646ba8c0h, 0fd62f97ah, 08a65c9ech, 014015c4fh, 063066cd9h -dd 0fa0f3d63h, 08d080df5h, 03b6e20c8h, 04c69105eh, 0d56041e4h, 0a2677172h -dd 03c03e4d1h, 04b04d447h, 0d20d85fdh, 0a50ab56bh, 035b5a8fah, 042b2986ch -dd 0dbbbc9d6h, 0acbcf940h, 032d86ce3h, 045df5c75h, 0dcd60dcfh, 0abd13d59h -dd 026d930ach, 051de003ah, 0c8d75180h, 0bfd06116h, 021b4f4b5h, 056b3c423h -dd 0cfba9599h, 0b8bda50fh, 02802b89eh, 05f058808h, 0c60cd9b2h, 0b10be924h -dd 02f6f7c87h, 058684c11h, 0c1611dabh, 0b6662d3dh, 076dc4190h, 001db7106h -dd 098d220bch, 0efd5102ah, 071b18589h, 006b6b51fh, 09fbfe4a5h, 0e8b8d433h -dd 07807c9a2h, 00f00f934h, 09609a88eh, 0e10e9818h, 07f6a0dbbh, 0086d3d2dh -dd 091646c97h, 0e6635c01h, 06b6b51f4h, 01c6c6162h, 0856530d8h, 0f262004eh -dd 06c0695edh, 01b01a57bh, 08208f4c1h, 0f50fc457h, 065b0d9c6h, 012b7e950h -dd 08bbeb8eah, 0fcb9887ch, 062dd1ddfh, 015da2d49h, 08cd37cf3h, 0fbd44c65h -dd 04db26158h, 03ab551ceh, 0a3bc0074h, 0d4bb30e2h, 04adfa541h, 03dd895d7h -dd 0a4d1c46dh, 0d3d6f4fbh, 04369e96ah, 0346ed9fch, 0ad678846h, 0da60b8d0h -dd 044042d73h, 033031de5h, 0aa0a4c5fh, 0dd0d7cc9h, 05005713ch, 0270241aah -dd 0be0b1010h, 0c90c2086h, 05768b525h, 0206f85b3h, 0b966d409h, 0ce61e49fh -dd 05edef90eh, 029d9c998h, 0b0d09822h, 0c7d7a8b4h, 059b33d17h, 02eb40d81h -dd 0b7bd5c3bh, 0c0ba6cadh, 0edb88320h, 09abfb3b6h, 003b6e20ch, 074b1d29ah -dd 0ead54739h, 09dd277afh, 004db2615h, 073dc1683h, 0e3630b12h, 094643b84h -dd 00d6d6a3eh, 07a6a5aa8h, 0e40ecf0bh, 09309ff9dh, 00a00ae27h, 07d079eb1h -dd 0f00f9344h, 08708a3d2h, 01e01f268h, 06906c2feh, 0f762575dh, 0806567cbh -dd 0196c3671h, 06e6b06e7h, 0fed41b76h, 089d32be0h, 010da7a5ah, 067dd4acch -dd 0f9b9df6fh, 08ebeeff9h, 017b7be43h, 060b08ed5h, 0d6d6a3e8h, 0a1d1937eh -dd 038d8c2c4h, 04fdff252h, 0d1bb67f1h, 0a6bc5767h, 03fb506ddh, 048b2364bh -dd 0d80d2bdah, 0af0a1b4ch, 036034af6h, 041047a60h, 0df60efc3h, 0a867df55h -dd 0316e8eefh, 04669be79h, 0cb61b38ch, 0bc66831ah, 0256fd2a0h, 05268e236h -dd 0cc0c7795h, 0bb0b4703h, 0220216b9h, 05505262fh, 0c5ba3bbeh, 0b2bd0b28h -dd 02bb45a92h, 05cb36a04h, 0c2d7ffa7h, 0b5d0cf31h, 02cd99e8bh, 05bdeae1dh -dd 09b64c2b0h, 0ec63f226h, 0756aa39ch, 0026d930ah, 09c0906a9h, 0eb0e363fh -dd 072076785h, 005005713h, 095bf4a82h, 0e2b87a14h, 07bb12baeh, 00cb61b38h -dd 092d28e9bh, 0e5d5be0dh, 07cdcefb7h, 00bdbdf21h, 086d3d2d4h, 0f1d4e242h -dd 068ddb3f8h, 01fda836eh, 081be16cdh, 0f6b9265bh, 06fb077e1h, 018b74777h -dd 088085ae6h, 0ff0f6a70h, 066063bcah, 011010b5ch, 08f659effh, 0f862ae69h -dd 0616bffd3h, 0166ccf45h, 0a00ae278h, 0d70dd2eeh, 04e048354h, 03903b3c2h -dd 0a7672661h, 0d06016f7h, 04969474dh, 03e6e77dbh, 0aed16a4ah, 0d9d65adch -dd 040df0b66h, 037d83bf0h, 0a9bcae53h, 0debb9ec5h, 047b2cf7fh, 030b5ffe9h -dd 0bdbdf21ch, 0cabac28ah, 053b39330h, 024b4a3a6h, 0bad03605h, 0cdd70693h -dd 054de5729h, 023d967bfh, 0b3667a2eh, 0c4614ab8h, 05d681b02h, 02a6f2b94h -dd 0b40bbe37h, 0c30c8ea1h, 05a05df1bh, 02d02ef8dh - -SECTION .text - -NEWSYM showinfogui - mov esi,[romdata] - add esi,[infoloc] - - cmp dword[infoloc],40FFC0h - jne .notEHi1 - mov dword[CSStatus2+23], 'EHi ' - jmp .nohiromrn -.notEHi1 - mov dword[CSStatus2+23], 'Lo ' - cmp byte[romtype],2 - jne .nohiromrn - mov dword[CSStatus2+23], 'Hi ' -.nohiromrn - - mov edi,CSStatus - mov ecx,20 -.looprn - mov al,[esi] - or al,al - jnz .okaysp - mov al,32 -.okaysp - mov [edi],al - inc esi - inc edi - dec ecx - jnz .looprn - - mov dword[CSStatus3+6], 'PAL ' - add esi,5 - cmp byte[esi],2 - jae .notntsc1 - mov dword[CSStatus3+6], 'NTSC' -.notntsc1 - cmp byte[esi],13 - jb .notntsc2 - mov dword[CSStatus3+6], 'NTSC' -.notntsc2 - mov dword[CSStatus+29],'NORM' - mov dword[CSStatus+33],'AL ' - cmp byte[SA1Enable],0 - je .nosa1 - mov dword[CSStatus+29],'SA-1' - mov dword[CSStatus+33],' ' -.nosa1 - cmp byte[RTCEnable],0 - je .nortc - mov dword[CSStatus+29],'RTC ' - mov dword[CSStatus+33],' ' - -.nortc - cmp byte[SPC7110Enable],0 - je .nospc7110 - mov dword[CSStatus+29],'SPC7' - mov dword[CSStatus+33],'110 ' -.nospc7110 - cmp byte[SFXEnable],0 - je .nosfx - mov dword[CSStatus+29],'SUPE' - mov dword[CSStatus+33],'R FX' -.nosfx - cmp byte[C4Enable],0 - je .noc4 - mov dword[CSStatus+29],'C4 ' - mov dword[CSStatus+33],' ' -.noc4 - cmp byte[DSP1Enable],0 - je .nodsp1 - mov dword[CSStatus+29],'DSP-' - mov dword[CSStatus+33],'1 ' -.nodsp1 - cmp byte[DSP2Enable],0 - je .nodsp2 - mov dword[CSStatus+29],'DSP-' - mov dword[CSStatus+33],'2 ' -.nodsp2 - cmp byte[DSP3Enable],0 - je .nodsp3 - mov dword[CSStatus+29],'DSP-' - mov dword[CSStatus+33],'3 ' -.nodsp3 - cmp byte[DSP4Enable],0 - je .nodsp4 - mov dword[CSStatus+29],'DSP-' - mov dword[CSStatus+33],'4 ' -.nodsp4 - cmp byte[SDD1Enable],0 - je .nosdd1 - mov dword[CSStatus+29],'S-DD' - mov dword[CSStatus+33],'1 ' -.nosdd1 - cmp byte[OBCEnable],0 - je .noobc - mov dword[CSStatus+29],'OBC1' - mov dword[CSStatus+33],' ' -.noobc - cmp byte[SETAEnable],0 - je .noseta - mov dword[CSStatus+29],'SETA' - mov dword[CSStatus+33],' DSP' -.noseta - cmp byte[ST18Enable],0 - je .nost18 - mov dword[CSStatus+29],'ST01' - mov dword[CSStatus+33],'8 ' -.nost18 - cmp byte[SGBEnable],0 - je .nosgb - mov dword[CSStatus+29],'SGB ' - mov dword[CSStatus+33],' ' -.nosgb - cmp byte[BSEnable],0 - je .nobs - mov dword[CSStatus+29],'BROA' - mov dword[CSStatus+33],'DCST' - ;dummy out date so CRC32 matches - sub esi,3 - mov word[esi],042h ;42 is the answer, and the uCONSRT standard -.nobs - - mov dword[CSStatus2+12],'No ' - cmp byte[Interleaved],0 - je .nointlv - mov dword[CSStatus2+12],'Yes ' -.nointlv - - ; calculate CRC32 - xor edx,edx - mov eax,0FFFFFFFFh - mov ecx,dword[NumofBytes] - mov esi,[romdata] - .calcloop - mov dl,byte[esi] - mov ebx,eax ;ebx = CRC32 - xor ebx,edx ;ebx ^= edx - movzx ebx,bl ;ebx &= 0xFF - mov ebx,[ebx*4 + crc32_table] ;ebx = crc32_table[bl] - shr eax,8 ;CRC32 >>= 8 - xor eax,ebx ;CRC32 ^= ebx - inc esi - dec ecx - jnz .calcloop - xor eax,0FFFFFFFFh - mov [CRC32],eax - - ;Place CRC32 on line - mov ecx,8 - mov esi,CSStatus3 - add esi,32 - mov ebx,0F0000000h -.crcprintloop - mov eax,[CRC32] - and eax,ebx - dec ecx - shl ecx,2 - shr eax,cl - add eax,48 - cmp eax,58 - jb .noadd - add eax,7 -.noadd - mov [esi],al - inc esi - shr ebx,4 - shr ecx,2 - jnz .crcprintloop - - EXTSYM CalcChecksum - pushad - call CalcChecksum - popad - - mov esi,[romdata] - add esi,[infoloc] - add esi,1Eh - mov ax,[Checksumvalue] - cmp ax,[esi] - jne .failed -.passed2 - mov dword[CSStatus2+36],'OK ' - jmp .passed -.failed - mov dword[CSStatus2+36],'FAIL' -.passed - mov dword[MessageOn],300 - mov dword[Msgptr],CSStatus - mov eax,[MsgCount] - 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 - -;This looks like the info it displays if loaded via the command line -;Very outdated - -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 - dec ecx - jnz .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,[infoloc] - - mov ecx,21 -.loopb - lodsb - mov dl,al - mov ah,2 - call Output_Text - dec ecx - jnz .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*2 - jbe .nosramc - mov eax,65536*2 -.nosramc - mov [ramsize],eax - dec eax - mov [ramsizeand],eax - mov edx,.kilobit - mov ah,9 - call Output_Text - mov al,[ForceROMTiming] - mov byte[ForcePal],al - xor al,al - 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],263 - mov dword[MsgCount],120 - cmp al,1 - jbe .nopal - cmp al,0Dh - 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 -.cpassed2 - mov edx,.cpassed - jmp .passed -.failed - mov ax,[Checksumvalue2] - cmp ax,[esi] - je .cpassed2 - 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 -%ifdef __MSDOS__ - call Get_Key - cmp al,27 - jne .noesc - mov dl,[InitDrive] - mov ebx,InitDir - call Change_Dir - jmp DosExit -%endif -.noesc - mov edx,.ret - call Output_Text - ret - -SECTION .data -.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 - -SECTION .bss - -.memfree resb 30 - -NEWSYM DSP1Type, resb 1 -NEWSYM intldone, resb 1 -SECTION .text - -EXTSYM ClearScreen, cbitmode, makepal - -NEWSYM SetupROM - call CheckROMType - call SetIRQVectors - call ClearScreen - cmp byte[cbitmode],0 - jne .nomakepal - call makepal -.nomakepal - ; get ROM and SRAM size - mov esi,[romdata] - add esi,[infoloc] - add esi,18h - mov cl,[esi-1] - mov [curromsize],cl - mov cl,[esi] - inc esi - xor eax,eax - mov al,1 - shl al,cl - cmp al,1 - jne .yessram - mov al,0 -.yessram - shl eax,10 - cmp eax,65536 - jbe .nosramc - mov eax,65536 -.nosramc - mov [ramsize],eax - dec eax - mov [ramsizeand],eax - - ; get pal/ntsc - mov al,[ForceROMTiming] - mov byte[ForcePal],al - xor al,al - 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],263 - mov dword[MsgCount],120 - cmp byte[BSEnable],1 - je .nopal - cmp al,1 - jbe .nopal - cmp al,0Dh - jae .nopal - mov byte[romispal],1 - mov word[totlines],314 - mov dword[MsgCount],100 -.nopal - ret - -NEWSYM CheckROMType - call SetAddressingModes - call GenerateBank0Table - - EXTSYM BankCheck - call BankCheck - - 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 - ; 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 - - ; Chip Detection - 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 byte[OBCEnable],0 - mov byte[CHIPSRAM],0 - mov byte[SGBEnable],0 - mov byte[SETAEnable],0 - mov byte[ST18Enable],0 - mov byte[DSP1Enable],0 - mov byte[DSP2Enable],0 - mov byte[DSP3Enable],0 - mov byte[DSP4Enable],0 - mov byte[BSEnable],0 - - mov esi,[romdata] - add esi,[infoloc] - add esi,21 - - mov ax,[esi] - cmp ax,02530h - jne .notOBC1 - mov byte[OBCEnable],1 - mov byte[CHIPSRAM],1 - jmp .endchpdtct -.notOBC1 - cmp ax,04532h - jne .notSDD1A - mov byte[SDD1Enable],1 - mov byte[CHIPSRAM],1 - jmp .endchpdtct -.notSDD1A - cmp ax,04332h - jne .notSDD1B - mov byte[SDD1Enable],1 - jmp .endchpdtct -.notSDD1B - cmp ax,0E320h - jne .notSGB - mov byte[SGBEnable],1 - jmp .endchpdtct -.notSGB - cmp ax,0F320h - jne .notC4 - mov byte[C4Enable],1 - jmp .endchpdtct -.notC4 - cmp ax,03523h - jne .notSA1A - mov byte[SA1Enable],1 - mov byte[CHIPSRAM],1 - jmp .endchpdtct -.notSA1A - cmp ax,03423h - jne .notSA1B - mov byte[SA1Enable],1 - jmp .endchpdtct -.notSA1B - cmp ax,0F530h - jne .notSETAA - mov byte[ST18Enable],1 - mov byte[CHIPSRAM],1 ;Check later if this should be removed - jmp .endchpdtct -.notSETAA - cmp ax,0F630h - jne .notSETAB - mov byte[SETAEnable],1 - mov byte[CHIPSRAM],1 ;Check later if this should be removed - jmp .endchpdtct -.notSETAB - cmp ax,01320h - jne .notSFXA - mov byte[SFXEnable],1 - mov byte[SFXSRAM],1 ;Check later if this should be removed - jmp .endchpdtct -.notSFXA - cmp ax,01420h - jne .notSFXB - mov byte[SFXEnable],1 - mov byte[SFXSRAM],1 ;Check later if this should be removed - jmp .endchpdtct -.notSFXB - cmp ax,01520h - jne .notSFXC - mov byte[SFXEnable],1 - mov byte[SFXSRAM],1 ;Check later if this should be removed - jmp .endchpdtct -.notSFXC - cmp ax,01A20h - jne .notSFXD - mov byte[SFXEnable],1 - mov byte[SFXSRAM],1 ;Check later if this should be removed - jmp .endchpdtct -.notSFXD - cmp ax,05535h - jne .notRTCplain - mov byte[RTCEnable],1 - mov byte[CHIPSRAM],1 - jmp .endchpdtct -.notRTCplain - cmp ax,0F93Ah - jne .notSPC7A - mov byte[SPC7110Enable],1 - mov byte[RTCEnable],1 - mov byte[CHIPSRAM],1 - jmp .endchpdtct -.notSPC7A - cmp ax,0F53Ah - jne .notSPC7B - mov byte[SPC7110Enable],1 - mov byte[CHIPSRAM],1 - jmp .endchpdtct -.notSPC7B - cmp ax,00520h - jne .notDSP2 - mov byte[DSP2Enable],1 - mov byte[CHIPSRAM],1 - jmp .endchpdtct -.notDSP2 - cmp ax,00330h - jne .notDSP4 - mov byte[DSP4Enable],1 - jmp .endchpdtct -.notDSP4 - cmp ax,00530h - jne .notDSP3 - cmp byte[esi+5],0B2h ;Bandai only - jne .notDSP3 - mov byte[DSP3Enable],1 - mov byte[CHIPSRAM],1 - jmp .endchpdtct -.notDSP3 - cmp ah,3 - jne .notDSP1A - mov byte[DSP1Enable],1 - jmp .endchpdtct -.notDSP1A - cmp ah,5 - jne .notDSP1B - mov byte[DSP1Enable],1 - mov byte[CHIPSRAM],1 - jmp .endchpdtct -.notDSP1B - cmp byte[esi+5],033h - je .bsgoodDA - cmp byte[esi+5],0FFh - je .bsgoodDA - jmp .notBS -.bsgoodDA - cmp al,0 - je .bsgoodD5 - mov bl,al - and bl,083h - cmp bl,080h - je .bsgoodD5 - jmp .notBS -.bsgoodD5 - cmp ah,0FFh - jne .checkgooddate - cmp byte[esi+1],0FFh - je .validdate - jmp .notBS -.checkgooddate - mov bh,ah - and bh,0Fh - jnz .notBS - mov bh,ah - shr bh,4 - dec bh - cmp bh,12 - jae .notBS -.validdate - mov byte[BSEnable],1 - jmp .endchpdtct -.notBS -.endchpdtct - - cmp byte[DSP1Enable],1 - jne .notDSP1Hi - call InitDSP - mov byte[DSP1Type],1 - cmp byte[romtype],2 - jne .notDSP1Hi - mov byte[DSP1Type],2 -.notDSP1Hi - - ;Setup Super FX related stuff - cmp byte[SFXEnable],1 - jne near .nosfx - cmp byte[Sup48mbit],1 - je .sfxokay - mov byte[yesoutofmemory],1 - jmp .nosfx -.sfxokay - 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 - - ;General Stuff all mixed together - 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 near .nodsp1lorom - xor ecx,ecx -.dsp1loop - mov dword[memtabler8+30h*4+ecx],DSP1Read8b3F - mov dword[memtablew8+30h*4+ecx],DSP1Write8b3F - mov dword[memtabler16+30h*4+ecx],DSP1Read16b3F - mov dword[memtablew16+30h*4+ecx],DSP1Write16b3F - mov dword[memtabler8+0B0h*4+ecx],DSP1Read8b3F - mov dword[memtablew8+0B0h*4+ecx],DSP1Write8b3F - mov dword[memtabler16+0B0h*4+ecx],DSP1Read16b3F - mov dword[memtablew16+0B0h*4+ecx],DSP1Write16b3F - mov dword[memtabler8+0E0h*4+ecx],DSP1Read8b3F - mov dword[memtablew8+0E0h*4+ecx],DSP1Write8b3F - mov dword[memtabler16+0E0h*4+ecx],DSP1Read16b3F - mov dword[memtablew16+0E0h*4+ecx],DSP1Write16b3F - add ecx,4 - cmp ecx,16*4 - jne .dsp1loop -.nodsp1lorom - mov dword[wramdata],wramdataa - call SPC7110Load - ret - -SECTION .bss -NEWSYM CHIPSRAM, resb 1 -NEWSYM SFXEnable, resb 1 -NEWSYM C4Enable, resb 1 -NEWSYM SPC7110Enable, resb 1 -NEWSYM RTCEnable, resb 1 -NEWSYM SA1Enable, resb 1 -NEWSYM SDD1Enable, resb 1 -NEWSYM OBCEnable, resb 1 -NEWSYM SETAEnable, resb 1 ;ST010 & 11 -NEWSYM ST18Enable, resb 1 -NEWSYM SGBEnable, resb 1 -NEWSYM DSP1Enable, resb 1 -NEWSYM DSP2Enable, resb 1 -NEWSYM DSP3Enable, resb 1 -NEWSYM DSP4Enable, resb 1 -NEWSYM BSEnable, resb 1 -NEWSYM C4RamR, resd 1 -NEWSYM C4RamW, resd 1 -NEWSYM C4Ram, resd 1 -NEWSYM ROMTypeNOTFound, resb 1 -NEWSYM Interleaved, resb 1 -SECTION .text - -NEWSYM SetIRQVectors - ; Get Vectors (NMI & Reset) - mov esi,[romdata] - add esi,[infoloc] - add esi,21 - 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 - add esi,0Fh - 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 - jne .nhirom - add esi,8000h -.nhirom - mov word[resetv],8000h - mov word[xpc],8000h - mov byte[esi],58h - mov byte[esi+1],80h - mov byte[esi+2],0FEh - mov dword[Msgptr],outofmemoryerror - cmp byte[newgfx16b],1 - jne .notso - mov dword[Msgptr],outofmemoryerror2 -.notso - mov dword[MessageOn],0FFFFFFFFh - ret - -SECTION .bss -NEWSYM yesoutofmemory, resb 1 -SECTION .data -NEWSYM outofmemoryerror, db 'OUT OF MEMORY.',0 -NEWSYM outofmemoryerror2, db 'ROM IS TOO BIG.',0 -SECTION .text - -NEWSYM InitAsmEnd +;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,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,Create_File +;EXTSYM OSPort +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,spchalted,tableD,timeron,vidbright,DSPMem,OldGfxMode2 +EXTSYM SPC700read,SPC700write,GUIDoReset,spc700read +EXTSYM InitC4,SA1Reset,SetAddressingModesSA1,SetAddressingModes,SDD1BankA,SPC7110init +EXTSYM RTCinit,InitOBC +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 GUImgdfind,GUIufofind +;EXTSYM GUIfindUSA,GUIfindEUR,GUIfindJAP,GUIfindZIP,GUIfind1,DTALoc,GUIfindall,ZipError +EXTSYM GUIfindUSA,GUIfindEUR,GUIfindJAP,GUIfindZIP,GUIfind1,DTALoc,GUIfindall +EXTSYM spc7110romptr,allocspc7110 +EXTSYM SRAMDir,SRAMDrive,cfgloadsdir,fnamest,statefileloc +EXTSYM ForcePal,ForceROMTiming,ForceHiLoROM,InitDir,InitDrive,enterpress,frameskip +EXTSYM infoloc +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,wramreadptr,wramwriteptr +EXTSYM pl1Ltk,pl1Rtk,pl2Ltk,pl2Rtk,pl3Ltk,pl3Rtk,pl4Ltk,pl4Rtk,pl5Ltk,pl5Rtk +EXTSYM loadstate2 +%ifdef __LINUX__ +EXTSYM LoadDir, popdir, pushdir +%endif + +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 +; FIX STATMAT +NEWSYM autoloadstate, db 0 ; auto load state slot number +; FIX STATMAT + +SECTION .text + +EXTSYM cpalval +NEWSYM init + ; prevents a crash if cpalval gets accessed before initializing + mov eax,cpalval + mov ecx,256 +.looppal + mov dword[eax],cpalval + add eax,4 + dec ecx + jnz .looppal + + ; Initialize snow stuff + mov ecx,400 + xor edx,edx +.snowloop + shl word[SnowData+edx*2],8 + and byte[SnowVelDist+edx],0F7h + cmp dword[SnowTimer],0 + jne .skip + or byte[SnowVelDist+edx],08h +.skip + inc edx + dec ecx + jnz .snowloop + + 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 + dec ecx + jnz .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 + call showinfogui +.noloadfile + call UpdateDevices + call init65816 + call initregr + call initregw + call initsnes + + ; Initialize volume + xor eax,eax + xor edx,edx + mov al,[MusicRelVol] + shl eax,7 + mov ebx,0A3D70A3Dh + mul ebx + shr edx,6 + cmp dl,127 + jb .noof + mov dl,127 +.noof + mov [MusicVol],dl + +; FIX STATMAT + ; Here's the auto-load ZST file stuff + cmp byte[autoloadstate],1 + jl .noautoloadstate + je .enddigits + mov ebx,[statefileloc] + sub byte[autoloadstate],1 + cmp byte[autoloadstate],10 + jge .2digits + mov al,byte[autoloadstate] + add al,48 + mov byte[fnamest+ebx],al + jmp .enddigits +.2digits + xor eax,eax + mov al,byte[autoloadstate] + mov dl,10 + div dl + add al,48 + add ah,48 + mov byte[fnamest+ebx-1],al + mov byte[fnamest+ebx],ah +.enddigits + + ; Load the specified state file + call loadstate2 + + ; Just skip the extension re-setup below if we don't need to do it + cmp byte[autoloadstate],9 + jbe .noautoloadstate + + ; Put back the 'ST' on the end of the extension as we changed it + ; above (by placing two digits in the extension). This is so + ; as not to break any other code later on which depends + ; on it being present. + mov ebx,[statefileloc] +%ifdef __LINUX__ + mov word[fnamest+ebx-1],'st' +%else + mov word[fnamest+ebx-1],'ST' +%endif + +.noautoloadstate +; FIX STATMAT + xor eax,eax + mov al,[cvidmode] + cmp byte[GUI16VID+eax],1 + je .yes16b + mov byte[newengen],1 + mov byte[cfgnewgfx],1 +.yes16b + cmp byte[NewEngEnForce],1 + jne .noforce + mov byte[NewEngEnForce],0 + mov byte[newengen],1 + mov byte[cfgnewgfx],1 +.noforce + + mov ebx,ebm + mov eax,EndMessage + mov dh,17h + mov ch,67 + mov cl,1 +.loopen + mov dl,[ebx] + rol dl,cl + xor dl,dh + mov [eax],dl + rol dh,1 + inc cl + or cl,cl + jne .notzero + inc cl +.notzero + and cl,07h + inc eax + inc ebx + dec ch + jnz .loopen + + + cmp byte[yesoutofmemory],1 + jne .noout + call outofmemfix +.noout + cmp byte[debugger],0 + je near start65816 + cmp byte[romloadskip],1 + je near start65816 + jmp startdebugger + +EndMessageB + +; global variables + +SECTION .data + + +; Controls +;FIXME: define pl3contrl, pl4contrl and pl5contrl here? +;Christophe 2001/03/10 +NEWSYM numjoy, db 0 ; number of joysticks (1 = 1, 2 = 2) +; 0 = Disable, 1 = Keyboard, 2 = Joystick, 3 = Gamepad +; 4 = 4-button 5 = 6-button 6 = sidewinder +NEWSYM pl1contrl, db 1 ; player 1 device +NEWSYM pl1keya, dd 0 +NEWSYM pl1keyb, dd 0 +%ifdef __MSDOS__ +NEWSYM pl1selk, dd 54 +NEWSYM pl1startk, dd 28 +NEWSYM pl1upk, dd 72 +NEWSYM pl1downk, dd 80 +NEWSYM pl1leftk, dd 75 +NEWSYM pl1rightk, dd 77 +%else +NEWSYM pl1selk, dd 54 +NEWSYM pl1startk, dd 28 +NEWSYM pl1upk, dd 200 +NEWSYM pl1downk, dd 208 +NEWSYM pl1leftk, dd 203 +NEWSYM pl1rightk, dd 205 +%endif +NEWSYM pl1Xk, dd 31 +NEWSYM pl1Ak, dd 45 +NEWSYM pl1Lk, dd 32 +NEWSYM pl1Yk, dd 30 +NEWSYM pl1Bk, dd 44 +NEWSYM pl1Rk, dd 46 +NEWSYM pl2contrl, db 0 ; player 2 device +NEWSYM pl2keya, dd 0 +NEWSYM pl2keyb, dd 0 +NEWSYM pl2selk, dd 27 +NEWSYM pl2startk, dd 26 +NEWSYM pl2upk, dd 199 +NEWSYM pl2downk, dd 207 +NEWSYM pl2leftk, dd 211 +NEWSYM pl2rightk, dd 209 +NEWSYM pl2Xk, dd 24 +NEWSYM pl2Ak, dd 25 +NEWSYM pl2Lk, dd 23 +NEWSYM pl2Yk, dd 37 +NEWSYM pl2Bk, dd 38 +NEWSYM pl2Rk, dd 36 +NEWSYM JoyStart, db 0 +NEWSYM JoySelec, db 0 +NEWSYM JoyBC, db 1 +NEWSYM JoyYC, db 3 +NEWSYM JoyAC, db 2 +NEWSYM JoyXC, db 4 +NEWSYM JoyLC, db 5 +NEWSYM JoyRC, db 6 +NEWSYM TurboSw, db 0 + +NEWSYM 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 263 ; 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 61 ; 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 .bss +NEWSYM WhichSW, resb 1 +NEWSYM WhichGR, resb 1 +NEWSYM autofr, resb 1 +TurboCB resb 1 + +NEWSYM MovieTemp, resb 1 +NEWSYM JoyAOrig, resd 1 +NEWSYM JoyBOrig, resd 1 +NEWSYM JoyCOrig, resd 1 +NEWSYM JoyDOrig, resd 1 +NEWSYM JoyEOrig, resd 1 +NEWSYM JoyANow, resd 1 +NEWSYM JoyBNow, resd 1 +NEWSYM JoyCNow, resd 1 +NEWSYM JoyDNow, resd 1 +NEWSYM JoyENow, resd 1 +NEWSYM PJoyAOrig, resd 1 +NEWSYM PJoyBOrig, resd 1 +NEWSYM PJoyCOrig, resd 1 +NEWSYM PJoyDOrig, resd 1 +NEWSYM PJoyEOrig, resd 1 +NEWSYM LethEnData, resd 1 +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 + dec ecx + jnz %%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 + PlayerDeviceHelp pl1Ltk ,JoyAOrig,00200000h + PlayerDeviceHelp pl1Rtk ,JoyAOrig,00100000h +.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 + PlayerDeviceHelp pl2Ltk ,JoyBOrig,00200000h + PlayerDeviceHelp pl2Rtk ,JoyBOrig,00100000h +.noswitch2 + ProcessKeyComb 1,JoyBOrig + or dword[JoyBOrig],00008000h ; Joystick Enable +.noinput2 + mov dword[JoyCOrig],0 + cmp byte[pl3contrl],0 + je near .noinput3 + ; Get Player3 input device + PlayerDeviceHelp pl3Bk ,JoyCOrig,80000000h + PlayerDeviceHelp pl3Yk ,JoyCOrig,40000000h + PlayerDeviceHelp pl3selk ,JoyCOrig,20000000h + PlayerDeviceHelp pl3startk,JoyCOrig,10000000h + PlayerDeviceHelp pl3upk ,JoyCOrig,08000000h + PlayerDeviceHelp pl3downk ,JoyCOrig,04000000h + PlayerDeviceHelp pl3leftk ,JoyCOrig,02000000h + PlayerDeviceHelp pl3rightk,JoyCOrig,01000000h + PlayerDeviceHelp pl3Ak ,JoyCOrig,00800000h + PlayerDeviceHelp pl3Xk ,JoyCOrig,00400000h + PlayerDeviceHelp pl3Lk ,JoyCOrig,00200000h + PlayerDeviceHelp pl3Rk ,JoyCOrig,00100000h + PlayerDeviceHelp pl3ULk ,JoyCOrig,0A000000h + PlayerDeviceHelp pl3URk ,JoyCOrig,09000000h + PlayerDeviceHelp pl3DLk ,JoyCOrig,06000000h + PlayerDeviceHelp pl3DRk ,JoyCOrig,05000000h + PlayerDeviceFix JoyCOrig + mov al,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 + PlayerDeviceHelp pl3Ltk ,JoyCOrig,00200000h + PlayerDeviceHelp pl3Rtk ,JoyCOrig,00100000h +.noswitch3 + ProcessKeyComb 2,JoyCOrig + or dword[JoyCOrig],00008000h ; Joystick Enable +.noinput3 + mov dword[JoyDOrig],0 + cmp byte[pl4contrl],0 + je near .noinput4 + ; Get Player4 input device + PlayerDeviceHelp pl4Bk ,JoyDOrig,80000000h + PlayerDeviceHelp pl4Yk ,JoyDOrig,40000000h + PlayerDeviceHelp pl4selk ,JoyDOrig,20000000h + PlayerDeviceHelp pl4startk,JoyDOrig,10000000h + PlayerDeviceHelp pl4upk ,JoyDOrig,08000000h + PlayerDeviceHelp pl4downk ,JoyDOrig,04000000h + PlayerDeviceHelp pl4leftk ,JoyDOrig,02000000h + PlayerDeviceHelp pl4rightk,JoyDOrig,01000000h + PlayerDeviceHelp pl4Ak ,JoyDOrig,00800000h + PlayerDeviceHelp pl4Xk ,JoyDOrig,00400000h + PlayerDeviceHelp pl4Lk ,JoyDOrig,00200000h + PlayerDeviceHelp pl4Rk ,JoyDOrig,00100000h + PlayerDeviceHelp pl4ULk ,JoyDOrig,0A000000h + PlayerDeviceHelp pl4URk ,JoyDOrig,09000000h + PlayerDeviceHelp pl4DLk ,JoyDOrig,06000000h + PlayerDeviceHelp pl4DRk ,JoyDOrig,05000000h + PlayerDeviceFix JoyDOrig + mov al,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 + PlayerDeviceHelp pl4Ltk ,JoyDOrig,00200000h + PlayerDeviceHelp pl4Rtk ,JoyDOrig,00100000h +.noswitch4 + ProcessKeyComb 3,JoyDOrig + or dword[JoyDOrig],00008000h ; Joystick Enable +.noinput4 + mov dword[JoyEOrig],0 + cmp byte[pl5contrl],0 + je near .noinput5 + ; Get Player4 input device + PlayerDeviceHelp pl5Bk ,JoyEOrig,80000000h + PlayerDeviceHelp pl5Yk ,JoyEOrig,40000000h + PlayerDeviceHelp pl5selk ,JoyEOrig,20000000h + PlayerDeviceHelp pl5startk,JoyEOrig,10000000h + PlayerDeviceHelp pl5upk ,JoyEOrig,08000000h + PlayerDeviceHelp pl5downk ,JoyEOrig,04000000h + PlayerDeviceHelp pl5leftk ,JoyEOrig,02000000h + PlayerDeviceHelp pl5rightk,JoyEOrig,01000000h + PlayerDeviceHelp pl5Ak ,JoyEOrig,00800000h + PlayerDeviceHelp pl5Xk ,JoyEOrig,00400000h + PlayerDeviceHelp pl5Lk ,JoyEOrig,00200000h + PlayerDeviceHelp pl5Rk ,JoyEOrig,00100000h + PlayerDeviceHelp pl5ULk ,JoyEOrig,0A000000h + PlayerDeviceHelp pl5URk ,JoyEOrig,09000000h + PlayerDeviceHelp pl5DLk ,JoyEOrig,06000000h + PlayerDeviceHelp pl5DRk ,JoyEOrig,05000000h + PlayerDeviceFix JoyEOrig + mov al,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 + PlayerDeviceHelp pl5Ltk ,JoyEOrig,00200000h + PlayerDeviceHelp pl5Rtk ,JoyEOrig,00100000h +.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 + +SECTION .data + +.movieended db 'MOVIE FINISHED.',0 +NEWSYM CFWriteStart, dd 64+30 + +SECTION .bss +NEWSYM MovieBuffSize, resd 1 +NEWSYM MovieBuffFrame, resd 1 +MovieBuffer resd 21*60 +NEWSYM CReadHead, resd 1 +NEWSYM ReadHead, resd 1 +NEWSYM CFWriteHead, resd 1 +NEWSYM StoreBuffer, resb 128*32 + +;******************************************************* +; Init 65816 Initializes the Registers +;******************************************************* + +SECTION .data +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 CacheCheckSkip, db 0 +NEWSYM HIRQSkip, db 0 +NEWSYM ClearScreenSkip, db 0 +NEWSYM hirqmode2, db 0 +NEWSYM ENVDisable, 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 + +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 + + +SECTION .text + +; Header hacks + +EXTSYM ewj2hack +EXTSYM latchyr + +NEWSYM headerhack + mov byte[disablehdma],0 + mov byte[Offby1line],0 + mov byte[CacheCheckSkip],0 + mov word[IRQHack],0 + mov byte[HIRQSkip],0 + mov byte[hdmaearlstart],0 + mov dword[WindowDisables],0 + mov byte[ClearScreenSkip],0 + mov byte[hirqmode2],0 + mov byte[ENVDisable],0 + + mov esi,[romdata] + add esi,0FFC0h + cmp dword[esi],'HORA' + jne .nothoraigakuen + cmp dword[esi+4],'I-GA' + jne .nothoraigakuen + cmp dword[esi+8],'KUEN' + jne .nothoraigakuen + cmp dword[esi+12],' ' + jne .nothoraigakuen + mov al,0h + mov edi,spcRam + mov ecx,65472 + rep stosb + ret +.nothoraigakuen + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'DIGI' + jne .notdigitaldevilstory + cmp dword[esi+4],'TAL ' + jne .notdigitaldevilstory + cmp dword[esi+8],'DEVI' + jne .notdigitaldevilstory + cmp dword[esi+12],'L ST' + jne .notdigitaldevilstory + mov esi,[romdata] + add esi,63CA3h + mov byte [esi],0FFh ; Increase internal spc program delay to prevent irq + ; from causing bad length spc transfer (0xFFFF) +.notdigitaldevilstory + + + mov esi,[romdata] + add esi,0FFC0h + cmp dword[esi],'SAMU' + jne .notsamuraishodown + cmp dword[esi+4],'RAI ' + jne .notsamuraishodown + cmp dword[esi+8],'SHOD' + jne .notsamuraishodown + cmp dword[esi+12],'OWN ' + jne .notsamuraishodown + mov word [IRQHack],1 +.notsamuraishodown + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],0DFCAB0BDh + jne .notfamista1 + cmp dword[esi+4],0D0A7CCB0h + jne .notfamista1 + cmp dword[esi+8],02020C0BDh + jne .notfamista1 + cmp dword[esi+12],20202020h + jne .notfamista1 + mov esi,[romdata] + add esi,2762Fh + mov word [esi],0EAEAh ; Skip a check for value FF at 2140 when spc not + ; initialized yet?!? +.notfamista1 + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],0DFCAB0BDh + jne .notfamista2 + cmp dword[esi+4],0D0A7CCB0h + jne .notfamista2 + cmp dword[esi+8],03220C0BDh + jne .notfamista2 + cmp dword[esi+12],20202020h + jne .notfamista2 + mov esi,[romdata] + add esi,6CEDh + mov word [esi],0EAEAh ; Skip a check for value FF at 2140 when spc not + ; initialized yet?!? + mov esi,[romdata] + add esi,6CF9h + mov word [esi],0EAEAh ; Skip a check for value FF at 2140 when spc not + ; initialized yet?!? +.notfamista2 + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],20434653h + jne .notkamenrider + cmp dword[esi+4],0D7DDD2B6h + jne .notkamenrider + cmp dword[esi+8],0B0DEC0B2h + jne .notkamenrider + cmp dword[esi+12],20202020h + jne .notkamenrider + mov byte[latchyr],2 +.notkamenrider + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'EURO' + jne .noteuropeanprimegoal + cmp dword[esi+4],'PEAN' + jne .noteuropeanprimegoal + cmp dword[esi+8],' PRI' + jne .noteuropeanprimegoal + cmp dword[esi+12],'ME G' + jne .noteuropeanprimegoal + mov al,0h + mov edi,spcRam + mov ecx,65472 + rep stosb + ret +.noteuropeanprimegoal + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'CYBE' + jne .notcyberknight2 + cmp dword[esi+4],'R KN' + jne .notcyberknight2 + cmp dword[esi+8],'IGHT' + jne .notcyberknight2 + cmp dword[esi+12],' 2 ' + jne .notcyberknight2 + mov byte[cycpb268],75 + mov byte[cycpb358],77 + mov byte[cycpbl2],75 + mov byte[cycpblt2],75 + mov byte[cycpbl],75 + mov byte[cycpblt],75 +.notcyberknight2 + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],0B4B1DEC3h + jne .notdeasomething + cmp dword[esi+4],0CFBBC9C4h + jne .notdeasomething + cmp dword[esi+8],0CAAFB120h + jne .notdeasomething + mov esi,[romdata] + add esi,017837Ch + mov word [esi],0EAEAh +.notdeasomething + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'HUMA' + jne .nothumangrandprix3 + cmp dword[esi+4],'N GR' + jne .nothumangrandprix3 + cmp dword[esi+8],'ANDP' + jne .nothumangrandprix3 + mov byte[cycpb268],135 + mov byte[cycpb358],157 + mov byte[cycpbl2],125 + mov byte[cycpblt2],125 + mov byte[cycpbl],125 + mov byte[cycpblt],125 +.nothumangrandprix3 + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'ACCE' + jne .notaccelebrid + cmp dword[esi+4],'LEBR' + jne .notaccelebrid + cmp dword[esi+8],'ID ' + jne .notaccelebrid + mov esi,[romdata] + add esi,034DA2h + mov byte[esi],000h + mov esi,[romdata] + add esi,034DA3h + mov byte[esi],000h +.notaccelebrid + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'BATT' + jne .notbattlegp + cmp dword[esi+4],'LE G' + jne .notbattlegp + cmp dword[esi+8],'RAND' + jne .notbattlegp + mov esi,[romdata] + add esi,018089h + mov byte[esi],0FBh + mov esi,[romdata] + add esi,006C95h + mov byte[esi],0FBh +.notbattlegp + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'Neug' + jne .notneugiertrans + cmp dword[esi+4],'ier ' + jne .notneugiertrans + cmp dword[esi+8],'(tr.' + jne .notneugiertrans + + mov esi,[romdata] + add esi,0D4150h + mov byte[esi],0F9h +.notneugiertrans + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'NEUG' + jne .notneugier + cmp dword[esi+4],'IER ' + jne .notneugier + cmp dword[esi+8],' ' + jne .notneugier + + mov esi,[romdata] + add esi,0D4150h + mov byte[esi],0F9h +.notneugier + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'HOME' + jne .nothomealone + cmp dword[esi+4],' ALO' + jne .nothomealone + mov esi,[romdata] + add esi,0666Bh + mov byte[esi],0EEh ; RTS instead of jumping to a rts + mov byte[esi+1],0BCh ; RTS instead of jumping to a rts +.nothomealone + +; mov esi,[romdata] +; add esi,0FFC0h +; cmp dword[esi],'EMER' +; jne .notemeralddragon +; cmp dword[esi+4],'ALD ' +; jne .notemeralddragon +; cmp dword[esi+8],'DRAG' +; jne .notemeralddragon +; mov byte[ENVDisable],1 +;.notemeralddragon + + mov esi,[romdata] + add esi,7FC0h + cmp dword[esi],'FF M' + jne .notffmq + mov byte[hirqmode2],1 +.notffmq + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'YOSH' + jne .notyoshi + cmp dword[esi+8],'ISLA' + jne .notyoshi +.notyoshi + cmp dword[esi],'YOSS' + jne .notyoshi2 + cmp dword[esi+8],'ISLA' + jne .notyoshi2 + mov byte[hdmaearlstart],2 + mov byte[opexec268],116 + mov byte[opexec358],126 +.notyoshi2 + + mov esi,[romdata] + add esi,0FFC0h + cmp dword[esi],'BUBS' + jne .notbubsy2 + cmp dword[esi+4],'Y II' + jne .notbubsy2 + mov byte[cycpb268],125 + mov byte[cycpb358],147 + mov byte[cycpbl2],125 + mov byte[cycpblt2],125 + mov byte[cycpbl],125 + mov byte[cycpblt],125 +.notbubsy2 + + mov esi,[romdata] + add esi,7FC0h + cmp dword[esi],0DEB3B0CFh + je .marvelous + cmp dword[esi],'REND' + jne .notrend + mov byte[cycpb268],157 + mov byte[cycpb358],157 + mov byte[cycpbl2],157 + mov byte[cycpblt2],157 + mov byte[cycpbl],157 + mov byte[cycpblt],157 + jmp .notrend +.marvelous +.notrend + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'STAR' + jne .notds9 + cmp dword[esi+4],' TRE' + jne .notds9 + cmp dword[esi+8],'K: D' + jne .notds9 + mov byte[opexec268],187 + mov byte[opexec358],187 +.notds9 + + mov esi,[romdata] + add esi,0FFC0h + cmp dword[esi],'CLAY' + jne .notclayfighter + cmp dword[esi+4],' FIG' + jne .notclayfighter + cmp dword[esi+8],'HTER' + jne .notclayfighter + cmp dword[esi+12],' ' + jne .notclayfighter + mov esi,[romdata] ; In intro + add esi,01A10B9h + mov byte[esi],0DEh + + mov esi,[romdata] ; In game + add esi,01A1996h + mov byte[esi],0DEh + mov esi,[romdata] + add esi,01AE563h + mov byte[esi],0DEh + mov esi,[romdata] + add esi,01AE600h + mov byte[esi],0DEh +.notclayfighter + + mov esi,[romdata] + add esi,0FFC0h + cmp dword[esi],'Baha' + jne .notbahamutlagoon + cmp dword[esi+4],'mut ' + jne .notbahamutlagoon + cmp dword[esi+8],'Lago' + jne .notbahamutlagoon + mov esi,[romdata] + add esi,010254h + mov byte[esi],0EEh +.notbahamutlagoon + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'MORT' + jne .notmk + cmp dword[esi+4],'AL K' + jne .notmk + cmp dword[esi+8],'OMBA' + jne .notmk + cmp dword[esi+12],'T ' + jne .notmk + mov byte[disablehdma],1 +.notmk + + mov esi,[romdata] + add esi,0FFC0h + cmp dword[esi],'CLOC' + jne .notclocktower + cmp dword[esi+4],'K TO' + jne .notclocktower + cmp dword[esi+8],'WER ' + jne .notclocktower + mov byte[opexec268],187 + mov byte[opexec358],182 + mov byte[opexec268cph],47 + mov byte[opexec358cph],47 +.notclocktower + + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'DRAG' + jne .notdq5 + cmp dword[esi+4],'ONQU' + jne .notdq5 + cmp dword[esi+8],'EST5' + jne .notdq5 + mov byte[disablehdma],1 +.notdq5 + + ; Lamborgini Challenge - -p 110 + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'DIGI' + jne .nodigitaldevil + mov byte[opexec268],187 + mov byte[opexec358],187 +.nodigitaldevil + + mov esi,[romdata] + add esi,7FC0h + cmp dword[esi],'SP F' + jne .notfmatchtennis + mov byte[cycpb268],145 + mov byte[cycpb358],147 + mov byte[cycpbl2],145 + mov byte[cycpblt2],145 + mov byte[cycpbl],145 + mov byte[cycpblt],145 +.notfmatchtennis + + mov esi,[romdata] + add esi,7FC0h + cmp dword[esi],'DEAD' + je .deaddance + cmp dword[esi],'TUFF' + jne .nottuffenuff +.deaddance + mov byte[cycpb268],75 + mov byte[cycpb358],77 + mov byte[cycpbl2],75 + mov byte[cycpblt2],75 + mov byte[cycpbl],75 + mov byte[cycpblt],75 +.nottuffenuff + + 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 esi,[romdata] + add esi,02A9C1Ah + mov word [esi],0 + add esi, 5 + mov word [esi],0 + mov dword [ewj2hack],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 + + ; 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 +.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 +;int 3h +.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 + + ; Front Mission - -p 140 + mov esi,[romdata] + add esi,0FFC0h + cmp dword[esi],0C4DDDBCCh + jne .noromheadfm + cmp dword[esi+4],0AEBCAFD0h + jne .noromheadfm + mov byte[opexec268],226 + mov byte[opexec358],226 + mov byte[opexec268cph],80 + mov byte[opexec358cph],80 +.noromheadfm + + ; Front Mission - -p 140 + mov esi,[romdata] + add esi,0FFC0h + cmp dword[esi],'FRON' + jne .noromheadfm2 + cmp dword[esi+4],'T MI' + jne .noromheadfm2 + mov byte[opexec268],226 + mov byte[opexec358],226 + mov byte[opexec268cph],80 + mov byte[opexec358cph],80 +.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 + ret + +SECTION .data + +.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 + +SECTION .text + + +NEWSYM idledetectspc + inc dword[numspcvblleft] + cmp byte[SPCStallSetting],2 + jae .fullstall + inc byte[SPCStallSetting] + mov byte[ReturnFromSPCStall],1 + ret +.fullstall + mov dword[spc700idle],29 + mov dword[Msgptr],.unableskip + mov eax,[MsgCount] + mov [MessageOn],eax + ret + +SECTION .data +.unableskip db 'SPC700 STALL DETECTED.',0 + +SECTION .bss +NEWSYM ReturnFromSPCStall, resb 1 +NEWSYM SPCStallSetting, resb 1 +NEWSYM SPCSkipXtraROM, resb 1 +NEWSYM WindowDisables, resd 1 +SECTION .text + +%macro helpclearmem 2 + mov edi,%1 + mov ecx,%2 + rep stosb +%endmacro + +NEWSYM init65816 + mov byte[osm2dis],0 + mov byte[bgfixer2],0 + mov word[ScrDispl],0 + cmp byte[SA1Enable],0 + je .nosa1init + call SA1Reset + call SetAddressingModesSA1 +.nosa1init + cmp byte[OBCEnable],0 + je .noobcinit + call InitOBC +.noobcinit + cmp byte[C4Enable],0 + je .noc4init + mov byte[osm2dis],1 + mov byte[bgfixer2],1 + call InitC4 +.noc4init + cmp byte[RTCEnable],0 + je .noRTCinit + call RTCinit +.noRTCinit + cmp byte[SPC7110Enable],0 + je .nospc7110init + call SPC7110init + mov dword[memtabler8+50h*4],memaccessspc7110r8 + mov dword[memtabler16+50h*4],memaccessspc7110r16 + mov dword[memtablew8+50h*4],memaccessspc7110w8 + mov dword[memtablew16+50h*4],memaccessspc7110w16 + mov eax,[romdata] + add eax,510000h + mov dword[snesmmap+50h*4],eax + mov dword[snesmap2+50h*4],eax + mov ecx,16384 +.spc7110clear + mov dword[eax],0 + add eax,4 + dec ecx + jnz .spc7110clear +.nospc7110init + mov byte[cycpb268],117 + mov byte[cycpb358],127 + mov byte[cycpbl2],117 + mov byte[cycpblt2],117 + mov byte[cycpbl],117 + mov byte[cycpblt],117 + + 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[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 + 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 dword[spcnumread],0 + mov dword[spchalted],-1 + mov dword[coladdr],0 + mov byte[NMIEnab],1 + mov word[VIRQLoc],0 + mov byte[doirqnext],0 + mov dword[reg1read],0 + mov word[resolutn],224 + mov byte[vidbright],0 + mov byte[forceblnk],0 + mov byte [spcP],0 + mov byte[timeron],0 + mov byte[JoyAPos],0 + mov byte[JoyBPos],0 + mov byte[coladdr],0 + mov byte[coladdg],0 + mov byte[coladdb],0 + + mov byte[INTEnab],0 + mov word[xa],0 + mov byte[xdb],0 + mov byte[xpb],0 + mov byte[xirqb],0 + mov word[xs],01FFh + mov word[xd],0 + mov word[xx],0 + mov word[xy],0 + mov dword[SDD1BankA],03020100h + mov byte[xp],00110100b ; NVMXDIZC + + push ebx + mov byte[xe],1 ; E + xor eax,eax + mov ax,[resetv] + mov word[xpc],ax + mov ebx,[romdata] + add eax,ebx + cmp word[xpc],8000h + jb .notrainer + cmp dword[ebx+0FFC0h],'BREA' + jne .ntrchecka + cmp word[resetv],0F000h + jne .ntrchecka + jmp .yestrainer +.ntrchecka + sub eax,8000h + cmp byte[eax],5Ch + jne .notrainer + cmp word[eax+2],80h + je .notrainer + cmp word[eax+2],8080h + je .notrainer + cmp word[eax+2],89h + je .notrainer + cmp word[eax+2],8089h + je .notrainer +.yestrainer + mov dword[ramsize],32768 + mov dword[ramsizeand],32767 +.notrainer + pop ebx + + mov byte[intrset],0 + cmp byte[romtype],1 + je .nohirom + mov byte[xpb],00h + mov byte[xirqb],00h +.nohirom + cmp word[xpc],8000h + jae .n + add word[xpc],8000h +; mov byte[xpb],40h +.n + mov al,[opexec268] + mov 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,055555555h + + ;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 + ;dec ecx + ;jnz .loopbsx +;.skipbsxmove + ;popad +;.notbsx + + helpclearmem wramdataa, 65536 + helpclearmem ram7fa, 65536 + cmp byte[BSEnable],1 + jne .notbsx2 + cmp byte[romtype],1 ;Hack for BS HiROMs + 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 + + mov dword[wramreadptr],getwram1fff + mov dword[wramwriteptr],setwram1fff + ret + +SECTION .data +.boffound db '.....',0 +SECTION .text + +getwram1fff: + mov al,[wramdataa+1fffh] + ret +setwram1fff: + mov [wramdata+1fffh],al + ret + +;******************************************************* +; Init SNES Sets the pointers, etc. +;******************************************************* +; Set banks according to : +; Banks 00-3F,80-BF : WRAM (0000h-7FFFh), ROM Data (8000h-FFFFh) +; Banks 40-7F,C0-FF : ROM Data (0000h-FFFFh) +; Bank 70-77 : SRAM (0000h-7FFFh) +; Bank 7E : WRAM (0000h-FFFFh) +; Bank 7F : ExtendRAM (0000h-FFFFh) + +SECTION .bss +NEWSYM curromsize, resb 1 +NEWSYM cromptradd, resd 1 +NEWSYM NoiseDisTemp, resd 2 +NEWSYM lorommapmode2, resb 1 +NEWSYM MMXSRAMFix, resb 1 +SECTION .text + +NEWSYM initsnes + mov byte[ForceNewGfxOff],0 + mov dword[NoiseDisTemp],0 + mov dword[NoiseDisTemp+4],0 + mov byte[MMXSRAMFix],0 + + mov esi,[romdata] + add esi,7FC0h + cmp dword[esi],'MEGA' + jne .notmmx + cmp dword[esi+4],'MAN ' + jne .notmmx + cmp dword[esi+8],'X ' + jne .notmmx + mov esi,[romdata] + cmp byte[esi+824Ah],0F0h + jne .mmxa + mov byte[esi+824Ah],080h +.mmxa + cmp byte[esi+21FC3h],0F0h + jne .mmxb + mov byte[esi+21FC3h],080h +.mmxb + cmp byte[esi+2241Bh],0F0h + jne .mmxc + mov byte[esi+2241Bh],080h +.mmxc + cmp byte[esi+824Fh],0F0h + jne .mmxd + mov byte[esi+824Fh],080h +.mmxd + cmp byte[esi+21FC8h],0F0h + jne .mmxe + mov byte[esi+21FC8h],080h +.mmxe + cmp byte[esi+22420h],0F0h + jne .mmxf + mov byte[esi+22420h],080h +.mmxf + mov byte[MMXSRAMFix],1 +.notmmx + + mov esi,[romdata] + add esi,7FC0h + cmp byte[BSEnable],1 + jne .notbsx3 + cmp byte[romtype],1 ;Hack for BS HiROMs + je near .bslorom +.notbsx3 + mov esi,[romdata] + add esi,[infoloc] + add esi,22 + mov byte[MultiTap],1 + cmp byte[pl12s34],1 + je .nomtap + cmp byte[pl3contrl],0 + jne .mtap + cmp byte[pl4contrl],0 + jne .mtap + cmp byte[pl5contrl],0 + jne .mtap +.nomtap + mov byte[MultiTap],0 +.mtap + + cmp byte[romtype],1 + jne .nosfx + cmp byte[SFXEnable],1 + je near .sfx +.nosfx + cmp byte[SA1Enable],1 + je near SA1memmap + cmp byte[SDD1Enable],1 + je near SDD1memmap + + cmp byte[SPC7110Enable],1 + je near .hirom + ;Should catch DKJM2 here, but need to fix mem map as well + cmp byte[curromsize],13 + je near .lorom48 + cmp byte[romtype],1 + jne near .hirom + + ; set addresses 8000-FFFF + ; set banks 00-3F (40h x 32KB ROM banks @ 8000h) + mov edi,snesmmap + mov eax,[romdata] + sub eax,8000h + mov ecx,40h +.loopa + stosd + add eax,8000h + dec ecx + jnz .loopa + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov ecx,40h +.loopb + stosd + add eax,8000h + dec ecx + jnz .loopb + ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) + mov eax,[romdata] + cmp byte[lorommapmode2],0 + je .notlorommode2 + add eax,200000h +.notlorommode2 + sub eax,8000h + mov cx,20h +.loopc + stosd + add eax,8000h + dec ecx + jnz .loopc + cmp byte[lorommapmode2],0 + je .notlorommode2b + sub eax,200000h +.notlorommode2b + mov cx,20h +.loopclr + stosd + add eax,8000h + dec ecx + jnz .loopclr + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov ecx,40h +.loopd + stosd + add eax,8000h + dec ecx + jnz .loopd + ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) + ; set banks 00-3F + mov edi,snesmap2 + mov eax,[wramdata] + mov ecx,40h +.loopa2 + stosd + dec ecx + jnz .loopa2 + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,200000h + mov ecx,40h +.loopb2 + stosd + add eax,8000h + dec ecx + jnz .loopb2 + ; set banks 80-BF (01h x 32KB WRAM @ 0000h) + mov eax,[wramdata] + mov ecx,40h +.loopc2 + stosd + dec ecx + jnz .loopc2 + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,200000h + mov ecx,40h +.loopd2 + stosd + add eax,8000h + dec ecx + jnz .loopd2 + ; set bank 70 + mov eax,[sram] + xor ebx,ebx + mov bl,70h +.nextsram + mov [snesmap2+ebx*4],eax + inc bl + cmp bl,77h + jbe .nextsram + ; set bank 7E + mov eax,[wramdata] + mov [snesmmap+7Eh*4],eax + mov [snesmap2+7Eh*4],eax + ; set bank 7F + mov eax,[ram7f] + mov [snesmmap+7Fh*4],eax + mov [snesmap2+7Fh*4],eax + ret + +.bslorom + ; set addresses 8000-FFFF + ; set banks 00-3F (40h x 32KB ROM banks @ 8000h) + mov edi,snesmmap + mov eax,[romdata] + sub eax,8000h + mov ecx,40h +.loopas + stosd + add eax,8000h + dec ecx + jnz .loopas + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov ecx,40h +.loopbs + stosd + add eax,8000h + dec ecx + jnz .loopbs + ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) + mov eax,[romdata] + sub eax,8000h + mov cx,40h +.loopcs + stosd + add eax,8000h + dec ecx + jnz .loopcs + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,8000h + mov ecx,40h +.loopds + stosd + add eax,8000h + dec ecx + jnz .loopds + ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) + ; set banks 00-3F + mov edi,snesmap2 + mov eax,[wramdata] + mov ecx,40h +.loopa2s + stosd + dec ecx + jnz .loopa2s + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,200000h + mov ecx,40h +.loopb2s + stosd + add eax,8000h + dec ecx + jnz .loopb2s + ; set banks 80-BF (01h x 32KB WRAM @ 0000h) + mov eax,[wramdata] + mov ecx,40h +.loopc2s + stosd + dec ecx + jnz .loopc2s + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,8000h + mov ecx,40h +.loopd2s + stosd + add eax,8000h + dec ecx + jnz .loopd2s + ; set bank 70 + mov eax,[sram] + xor ebx,ebx + mov bl,70h +.nextsrams + mov [snesmap2+ebx*4],eax + inc bl + cmp bl,77h + jbe .nextsrams + ; set bank 7E + mov eax,[wramdata] + mov [snesmmap+7Eh*4],eax + mov [snesmap2+7Eh*4],eax + ; set bank 7F + mov eax,[ram7f] + mov [snesmmap+7Fh*4],eax + mov [snesmap2+7Fh*4],eax + ret + +.lorom48 + mov byte[cycpb268],94 + mov byte[cycpb358],94 + mov byte[cycpbl2],94 + mov byte[cycpblt2],94 + mov byte[cycpbl],94 + mov byte[cycpblt],94 + mov byte[opexec268],183 + mov byte[opexec358],187 + mov byte[opexec268cph],30 + mov byte[opexec358cph],30 + mov 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 + dec ecx + jnz .loopa3 + ; set banks 40-6F (30h x 64KB ROM banks @ 8000h) + mov eax,[romdata] + sub eax,8000h + mov ecx,40h +.loopb32 + stosd + add eax,8000h + dec ecx + jnz .loopb32 + ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) + mov eax,[romdata] + sub eax,8000h + mov cx,40h +.loopc3 + stosd + add eax,8000h + dec ecx + jnz .loopc3 + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,200000h + mov ecx,40h +.loopd3 + stosd + add eax,10000h + dec ecx + jnz .loopd3 + ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) + ; set banks 00-3F + mov edi,snesmap2 + mov eax,[wramdata] + mov ecx,40h +.loopa23 + stosd + dec ecx + jnz .loopa23 + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,100000h + mov ecx,40h +.loopb3 + stosd + add eax,8000h + dec ecx + jnz .loopb3 + ; set banks 80-BF (01h x 32KB WRAM @ 0000h) + mov eax,[wramdata] + mov ecx,40h +.loopc23 + stosd + dec ecx + jnz .loopc23 + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,200000h + mov ecx,40h +.loopd23 + stosd + add eax,10000h + dec ecx + jnz .loopd23 + ; set bank 70 + mov eax,[sram] + xor ebx,ebx + mov bl,70h +.nextsram3 + mov [snesmap2+ebx*4],eax + inc bl + cmp bl,77h + jbe .nextsram3 + ; set bank 7E + mov eax,[wramdata] + mov [snesmmap+7Eh*4],eax + mov [snesmap2+7Eh*4],eax + ; set bank 7F + mov eax,[ram7f] + mov [snesmmap+7Fh*4],eax + mov [snesmap2+7Fh*4],eax + 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 + dec ecx + jnz .loopab + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + mov ecx,40h +.loopbb + stosd + add eax,10000h + dec ecx + jnz .loopbb + ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) + mov eax,[romdata] + mov ecx,40h +.loopcb + stosd + add eax,10000h + dec ecx + jnz .loopcb + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + mov ecx,40h +.loopdb + stosd + add eax,10000h + dec ecx + jnz .loopdb + ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) + ; set banks 00-3F + mov edi,snesmap2 + mov eax,[wramdata] + mov ecx,40h +.loopa2b + stosd + dec ecx + jnz .loopa2b + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + mov cx,40h +.loopb2b + stosd + add eax,10000h + dec ecx + jnz .loopb2b + ; set banks 80-BF (01h x 32KB WRAM @ 0000h) + mov eax,[wramdata] + mov cx,40h +.loopc2b + stosd + dec ecx + jnz .loopc2b + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + mov cx,40h +.loopd2b + stosd + add eax,10000h + dec ecx + jnz .loopd2b + ; set bank 70 + mov eax,[sram] + xor ebx,ebx + mov bl,70h +.nextsramb + mov [snesmap2+ebx*4],eax + inc bl + cmp bl,77h + jbe .nextsramb + ; set bank 7E + mov eax,[wramdata] + mov [snesmmap+7Eh*4],eax + mov [snesmap2+7Eh*4],eax + ; set bank 7F + mov eax,[ram7f] + mov [snesmmap+7Fh*4],eax + mov [snesmap2+7Fh*4],eax + ret + +.sfx + mov byte[MultiTap],0 + ; Clear sfxregisters + mov edi,SfxR0 + mov ecx,16 + xor eax,eax + rep stosd + ; set addresses 8000-FFFF + ; set banks 00-3F (40h x 32KB ROM banks @ 8000h) + mov edi,snesmmap + mov eax,[romdata] +; sub eax,8000h + mov ecx,40h +.loopa3s + stosd + add eax,10000h + dec ecx + jnz .loopa3s + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] +; add eax,200000h + add eax,8000h + mov ecx,40h +.loopb3s + stosd + add eax,20000h + dec ecx + jnz .loopb3s + ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) + mov eax,[romdata] +; sub eax,8000h + mov cx,40h +.loopc3s + stosd + add eax,10000h + dec ecx + jnz .loopc3s + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] +; add eax,200000h + add eax,8000h + mov ecx,40h +.loopd3s + stosd + add eax,20000h + dec ecx + jnz .loopd3s + ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) + ; set banks 00-3F + mov edi,snesmap2 + mov eax,[wramdata] + mov ecx,40h +.loopa23s + stosd + dec ecx + jnz .loopa23s + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,8000h + mov ecx,40h +.loopb23s + stosd + add eax,20000h + dec ecx + jnz .loopb23s + ; set banks 80-BF (01h x 32KB WRAM @ 0000h) + mov eax,[wramdata] + mov ecx,40h +.loopc23s + stosd + dec ecx + jnz .loopc23s + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,8000h + mov ecx,40h +.loopd23s + stosd + add eax,20000h + dec ecx + jnz .loopd23s + ; set bank 70 + mov eax,[sram] + mov [snesmap2+78h*4],eax + mov [snesmap2+79h*4],eax + mov eax,[sfxramdata] + mov [snesmap2+70h*4],eax + add eax,65536 + mov [snesmap2+71h*4],eax + add eax,65536 + mov [snesmap2+72h*4],eax + add eax,65536 + mov [snesmap2+73h*4],eax + ; set bank 7E + mov eax,[wramdata] + mov [snesmmap+7Eh*4],eax + mov [snesmap2+7Eh*4],eax + ; set bank 7F + mov eax,[ram7f] + mov [snesmmap+7Fh*4],eax + mov [snesmap2+7Fh*4],eax + call preparesfx + ret + +SA1memmap: + mov eax,[romdata] + cmp dword[eax+0B95h],0ADCF10A9h + jne .nosuccess + mov byte[eax+0B96h],0 +.nosuccess + mov byte[MultiTap],0 + ; set addresses 8000-FFFF + ; set banks 00-3F (40h x 32KB ROM banks @ 8000h) + mov edi,snesmmap + mov eax,[romdata] + sub eax,8000h + mov ecx,40h +.loopa3s + stosd + add eax,8000h + dec ecx + jnz .loopa3s + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] +; add eax,400000h + mov ecx,40h +.loopb3s + stosd + add eax,10000h + dec ecx + jnz .loopb3s + ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) + mov eax,[romdata] + add eax,200000h + sub eax,8000h + mov cx,40h +.loopc3s + stosd + add eax,8000h + dec ecx + jnz .loopc3s + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,00000h + mov ecx,40h +.loopd3s + stosd + add eax,10000h + dec ecx + jnz .loopd3s + ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) + ; set banks 00-3F + mov edi,snesmap2 + mov eax,[wramdata] + mov ecx,40h +.loopa23s + stosd + dec ecx + jnz .loopa23s + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,400000h + mov ecx,40h +.loopb23s + stosd + add eax,10000h + dec ecx + jnz .loopb23s + ; set banks 80-BF (01h x 32KB WRAM @ 0000h) + mov eax,[wramdata] + mov ecx,40h +.loopc23s + stosd + dec ecx + jnz .loopc23s + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,00000h + mov ecx,40h +.loopd23s + stosd + add eax,10000h + dec ecx + jnz .loopd23s + ; set bank 7E + mov eax,[wramdata] + mov [snesmmap+7Eh*4],eax + mov [snesmap2+7Eh*4],eax + ; set bank 7F + mov eax,[ram7f] + mov [snesmmap+7Fh*4],eax + mov [snesmap2+7Fh*4],eax + ret + +SDD1memmap: + mov eax,[romdata] + cmp dword[eax+0B95h],0ADCF10A9h + jne .nosuccess + mov byte[eax+0B96h],0 +.nosuccess + mov byte[MultiTap],0 + ; set addresses 8000-FFFF + ; set banks 00-3F (40h x 32KB ROM banks @ 8000h) + mov edi,snesmmap + mov eax,[romdata] + sub eax,8000h + mov ecx,40h +.loopa3s + stosd + add eax,8000h + dec ecx + jnz .loopa3s + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] +; add eax,400000h + mov ecx,40h +.loopb3s + stosd + add eax,10000h + dec ecx + jnz .loopb3s + ; set banks 80-BF (40h x 32KB ROM banks @ 8000h) + mov eax,[romdata] +; add eax,200000h + sub eax,8000h + mov cx,40h +.loopc3s + stosd + add eax,8000h + dec ecx + jnz .loopc3s + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,00000h + mov ecx,40h +.loopd3s + stosd + add eax,10000h + dec ecx + jnz .loopd3s + ; set addresses 0000-7FFF (01h x 32KB WRAM @ 0000h) + ; set banks 00-3F + mov edi,snesmap2 + mov eax,[wramdata] + mov ecx,40h +.loopa23s + stosd + dec ecx + jnz .loopa23s + ; set banks 40-6F (30h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,400000h + mov ecx,40h +.loopb23s + stosd + add eax,10000h + dec ecx + jnz .loopb23s + ; set banks 80-BF (01h x 32KB WRAM @ 0000h) + mov eax,[wramdata] + mov ecx,40h +.loopc23s + stosd + dec ecx + jnz .loopc23s + ; set banks C0-FF (40h x 64KB ROM banks @ 0000h) + mov eax,[romdata] + add eax,00000h + mov ecx,40h +.loopd23s + stosd + add eax,10000h + dec ecx + jnz .loopd23s + ; set bank 7E + mov eax,[wramdata] + mov [snesmmap+7Eh*4],eax + mov [snesmap2+7Eh*4],eax + ; set bank 7F + mov eax,[ram7f] + mov [snesmmap+7Fh*4],eax + mov [snesmap2+7Fh*4],eax + ret + +;******************************************************* +; Prepare 48mbit Moves blocks around for 48mbit +;******************************************************* + +SECTION .data +NEWSYM memdest, dd 0 +NEWSYM SFXCounter, dd 0 +SECTION .text + +NEWSYM prepare48mbit + mov dword[NumofBanks],192 + ; 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 + dec ecx + jnz .loop + mov esi,mode7tab+256 + mov ecx,40h + mov al,40h+1 +.loop2 + mov [esi+80h],al + add al,2 + inc esi + dec ecx + jnz .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 + dec ecx + jnz .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],'DIRT' + je .yessfxcounter + cmp dword[esi],'Stun' + jne .nosfxcounter + mov byte[ForceNewGfxOff],1 +.yessfxcounter + mov byte[SFXCounter],1 +.nosfxcounter + + ; make table + mov byte[SfxAC],0 + mov eax,[romdata] + cmp dword[eax+02B80h],0AB6CAB6Ch + jne .noac + mov byte[SfxAC],1 +.noac + 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 + dec ecx + jnz .swaploop + sub edi,65536+32768 + sub esi,65536 + dec dl + jnz .swaploopb + ret + + ; copy address 0 to 200000h + ; make table 1 (0 .. 127) + mov esi,[romdata] + mov edi,[romdata] + add edi,200000h + mov ecx,200000h +.n + mov al,[esi] + mov [edi],al + inc esi + inc edi + dec ecx + jnz .n + ret + +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 + dec ecx + jnz .loopa + ret + +SECTION .data +.hexdat db '0123456789ABCDEF' +SECTION .text + +NEWSYM printhex8 + mov ecx,2 + xor ebx,ebx +.loopb + mov bx,ax + and bx,0F0h + shr bx,4 + mov dl,[printhex.hexdat+ebx] + push ax + mov ah,02h + call Output_Text + pop ax + shl ax,4 + dec ecx + jnz .loopb + ret + +;EXTSYM _imp__OutputDebugStringA@4 + +;NEWSYM printhex32 +; pushf +; mov ecx,8 +;.loopa +; mov ebx,eax +; and ebx,0Fh +; mov dl,[printhex.hexdat+ebx] +; mov [.hexout-1+ecx],dl +; shr eax,4 +; dec ecx +; jnz .loopa + +; push dword .hexout +; call [_imp__OutputDebugStringA@4] + +; popf +; db 0C3h ; ret + +;section .bss +;NEWSYM __debug_crap_address__, dd 0,0,0,0 +;.hexout db "blahblah",0 +;section .text + +;******************************************************* +; 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 + + +SECTION .bss +IPSSL resd 1 +SECTION .text + +NEWSYM PatchIPS +%ifdef __LINUX__ + pushad + call pushdir + popad +%endif + 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 +%ifdef __LINUX__ + cmp byte[eax],'/' +%else + cmp byte[eax],'\' +%endif + je .failfound + cmp byte[eax],'.' + je .foundokay + jmp .findnext2 +.failfound + mov eax,ebx +.foundokay + mov ebx,[eax] + mov [Prevextn],ebx + mov dword[eax],'.ips' + mov byte[eax+4],0 + push eax +%ifdef __LINUX__ + cmp byte [ZipSupport], 1 + je .nochangedir + mov ebx,LoadDir + call Change_Dir +.nochangedir: +%endif + 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 +; dec ecx +; jnz .ltop +%ifdef __LINUX__ + pushad + call popdir + popad +%endif + ret + +SECTION .data +.ipsokaymsg db 'IPS PATCHED.',0 +.ipsnokaymsg db 'IPS IS CORRUPT.',0 + +SECTION .bss +NEWSYM Header512, resb 1 +NEWSYM Prevextn, resd 1 +NEWSYM Headchek, resb 5 +NEWSYM IPSLimit, resd 1 +NEWSYM IPSOffset, resd 1 +NEWSYM IPSCount, resd 1 +IPSPatched resb 1 +SECTION .text + +OpenCombFile: + mov edx,fnames+1 +.next + cmp byte[edx],0 + je .found + inc edx + jmp .next +.found + dec edx + cmp byte[edx],'.' + je .found2 + jmp .found +.found2 + mov dword[edx],'.cmb' + push edx + mov dword[NumComboLocl],0 + mov edx,fnames+1 + call Open_File + jc .failb + mov bx,ax + mov edx,ComboBlHeader + mov ecx,23 + call Read_File + mov al,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 + mov dword[edx],'.srm' + ret + +NEWSYM SaveCombFile + cmp byte[romloadskip],0 + jne near .notfound + mov edx,fnames+1 +.next + cmp byte[edx],0 + je .found + inc edx + jmp .next +.found + dec edx + cmp byte[edx],'.' + je .found2 + jmp .found +.found2 + mov dword[edx],'.cmb' + push edx + mov al,[NumComboLocl] + or al,al + jz .failb + mov [ComboHeader+22],al + mov edx,fnames+1 + call Create_File + jc .failb + mov bx,ax + mov edx,ComboHeader + mov ecx,23 + call Write_File + mov ecx,[NumComboLocl] + mov edx,ecx + shl ecx,6 + add ecx,edx + add ecx,edx + mov edx,CombinDataLocl + call Write_File + call Close_File +.failb + pop edx + mov dword[edx],'.srm' +.notfound + ret + +NEWSYM loadfile + mov byte[TextFile], 0 + call GetCurDir + mov byte[InGUI],0 +%ifdef __LINUX__ + mov dl,[InitDrive] + mov ebx,InitDir + call Change_Dir +%endif + + jmp loadfileGUI.nogui + +SECTION .data +.failop db 'Error opening file!',13,10,0 +.opened db 'File opened successfully!',13,10,0 +.mult db 'Multiple file format detected.',13,10,13,10,0 +SECTION .bss +.multfound resb 1 +.first resb 1 +.cchar resb 1 +.dotpos resd 1 +.curfileofs resd 1 +.filehand resw 1 +.temp resb 1 +.fail resb 1 + + +NEWSYM Checksumvalue, resw 1 +NEWSYM Checksumvalue2, resw 1 ;This is outdated, but needed for the command line loader +NEWSYM CRC32, resd 1 +NEWSYM SramExists, resb 1 +NEWSYM NumofBanks, resd 1 +NEWSYM NumofBytes, resd 1 +NEWSYM ZipSupport, resb 1 +InGUI resb 1 + +SECTION .data + +%ifdef __LINUX__ +tempdirname db '/tmp/zziptmp',0 +%else +tempdirname db 'zziptmp_.__z',0 +%endif +PrevDir db '..',0 + + +GUIfindBlank db '*.',0 + +SECTION .text + +%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 + +SECTION .data +InvalidZip db 'ZSNES Version A does not support .ZIP files.',13,10,'Please use Version C for this feature.',10,13,0 + +SECTION .bss +ZipError resb 1 + +SECTION .text + +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 GUImgdfind + UnZipSearch GUIufofind + UnZipSearch GUIfind058 + UnZipSearch GUIfind078 + UnZipSearch GUIfindUSA + UnZipSearch GUIfindEUR + UnZipSearch GUIfindJAP + UnZipSearch GUIfindBIN + UnZipSearch GUIfindZIP + UnZipSearch GUIfind1 + UnZipSearch GUIfindIC7 + UnZipSearch GUIfindIC6 + UnZipSearch GUIfindIC5 + UnZipSearch GUIfindIC4 + UnZipSearch GUIfindIC3 + UnZipSearch GUIfindIC2 + UnZipSearch GUIfindIC1 + 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 + +%ifdef __LINUX__ +GUIfindIC7 db '*.[Ii][Cc]7',0 +GUIfindIC6 db '*.[Ii][Cc]6',0 +GUIfindIC5 db '*.[Ii][Cc]5',0 +GUIfindIC4 db '*.[Ii][Cc]4',0 +GUIfindIC3 db '*.[Ii][Cc]3',0 +GUIfindIC2 db '*.[Ii][Cc]2',0 +GUIfindIC1 db '*.[Ii][Cc]1',0 +%else +GUIfindIC7 db '*.iC7',0 +GUIfindIC6 db '*.iC6',0 +GUIfindIC5 db '*.iC5',0 +GUIfindIC4 db '*.iC4',0 +GUIfindIC3 db '*.iC3',0 +GUIfindIC2 db '*.iC2',0 +GUIfindIC1 db '*.iC1',0 +%endif + +ZipDelete: + mov esi,mode7tab + call ZipDeleteRecurse + mov edx,PrevDir + call Change_Single_Dir + mov edx,tempdirname + call Remove_Dir + call Makemode7Table + ret + +SECTION .bss +tempzip resb 1 +SECTION .text + +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 + dec ecx + jnz .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 + +SECTION .data + +SPC7110DIRA db 'FEOEZSP7',0 +SPC7110DIRB db 'SMHT-SP7',0 +SDD1DIRA db 'SOCNSDD1',0 +SDD1DIRB db 'SFZ2SDD1',0 +SDD1DIRC db 'SFA2SDD1',0 +SDD1DIRD db 'SF2ESDD1',0 +SPC7110IndexName db 'index.bin',0 +SPC7110DirEntry db '*.bin',0 +NEWSYM SDD1Offset, dd 65536*8 +%ifndef __LINUX__ +NEWSYM SDD1nfname, db ' \_00000-0.bin',0 +NEWSYM SPC7110nfname, db ' \ .bin',0 +%else +NEWSYM SDD1nfname, db ' /_00000-0.bin',0 +NEWSYM SPC7110nfname, db ' / .bin',0 +%endif +NEWSYM SDD1ifname, db 'sdd1gfx.idx',0 +NEWSYM SDD1dfname, db 'sdd1gfx.dat',0 +NEWSYM SDD1pfname, db 'sdd1gfx.pat',0 +spc7110notfound db 'DECOMPRESSED PACK NOT FOUND',0 +spc7110notfoundb db 'INDEX DATA NOT FOUND',0 + +SECTION .bss + +SPC7110Allocated resb 1 +SPC7110CPtr resd 1 +SPC7110CPtr2 resd 1 +NEWSYM SPC7110IndexSize, resd 1 +NEWSYM SPC7110Entries, resd 1 +SDD1PatchAddr resd 1 +SDD1PatchOfs resd 1 +SDD1PatchLen resd 1 + +SECTION .text + +EXTSYM sdd1fname + +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 near .spc7110 + cmp al,0F5h + je near .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 + cmp al,045h + jne .noSDD1 + mov edx,SDD1DIRA + mov dword[sdd1fname],'socn' + jmp .sdd1b +.noSDD1 + cmp al,043h + jne .noSDD1a + add esi,3 + mov al,[esi] + cmp al,0 + jne .notsfz2 + mov edx,SDD1DIRB + mov dword[sdd1fname],'sfz2' + jmp .sdd1b +.notsfz2 + cmp al,01h + jne .notsfa2 + mov edx,SDD1DIRC + mov dword[sdd1fname],'sfa2' + jmp .sdd1b +.notsfa2 + mov edx,SDD1DIRD + mov dword[sdd1fname],'sf2e' + jmp .sdd1b +.noSDD1a + ret +.spc7110 + mov edx,SPC7110DIRA + cmp al,0F9h + je .noSPC7110b + mov edx,SPC7110DIRB +.noSPC7110b + 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,[SDD1Offset] + mov [SPC7110CPtr2],eax + + mov edx,SDD1ifname + call Open_File + jc near .noindexfile + mov bx,ax + mov edx,[SPC7110CPtr] + mov ecx,[SDD1Offset] + call Read_File + add dword[SPC7110CPtr],eax + xor ecx,ecx + or eax,eax + jz .notfoundb + push ebx + xor edx,edx + mov ebx,12 + div ebx + mov dword[SPC7110Entries],eax + mov ecx,eax + mov eax,[spc7110romptr] + mov ebx,[SPC7110CPtr2] +.sdd1loop + add [eax+4],ebx + add eax,12 + dec ecx + jnz .sdd1loop + pop ebx +.notfoundb + call Close_File + mov edx,SDD1dfname + call Open_File + jc near .noindexfile + mov bx,ax + mov edx,[SPC7110CPtr2] + mov ecx,7*1024*1024 + call Read_File + add dword[SPC7110CPtr2],eax + call Close_File + jmp .yesindexfile +.noindexfile + mov eax,[spc7110romptr] + mov [SPC7110CPtr],eax + add eax,[SDD1Offset] + mov [SPC7110CPtr2],eax + mov dword[SPC7110Entries],0 +.yesindexfile + + 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 + 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,[SDD1Offset] + 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 + + ; Load patch (Address, offset, length) + mov edx,SDD1pfname + call Open_File + jc near .nopatch + mov bx,ax + mov ecx,4 + mov edx,SDD1PatchAddr + call Read_File + or eax,eax + jz .donepatch + mov ecx,4 + mov edx,SDD1PatchOfs + call Read_File + mov ecx,4 + mov edx,SDD1PatchLen + call Read_File + pushad + mov ecx,[SPC7110Entries] + mov edx,[spc7110romptr] +.patloop + mov eax,[edx] + cmp eax,[SDD1PatchAddr] + jne .notaddress + mov eax,[edx+4] + add eax,[SDD1PatchOfs] + pushad + mov edx,eax + mov ecx,[SDD1PatchLen] + call Read_File + popad + jmp .foundaddr +.notaddress + add edx,12 + dec ecx + jnz .patloop + ; not found + pushad + mov edx,[SPC7110CPtr2] + mov ecx,[SDD1PatchLen] + call Read_File + popad +.foundaddr + popad +.donepatch + call Close_File +.nopatch + + ; Save Datafile + jmp .nosavedatafile + +; mov eax,[spc7110romptr] +; mov [SPC7110CPtr],eax +; add eax,[SDD1Offset] +; mov [SPC7110CPtr2],eax + + mov ecx,[SPC7110Entries] + mov eax,[spc7110romptr] + mov ebx,eax + add ebx,[SDD1Offset] +.sdd1loopb + sub [eax+4],ebx + add eax,12 + dec ecx + jnz .sdd1loopb + + mov edx,SDD1ifname + call Create_File + mov bx,ax + mov edx,[spc7110romptr] + mov ecx,[SPC7110CPtr] + sub ecx,edx + call Write_File + call Close_File + + mov edx,SDD1dfname + call Create_File + mov bx,ax + mov edx,[spc7110romptr] + add edx,[SDD1Offset] + mov ecx,[SPC7110CPtr2] + sub ecx,edx + call Write_File + call Close_File + + mov ecx,[SPC7110Entries] + mov eax,[spc7110romptr] + mov ebx,eax + add ebx,[SDD1Offset] +.sdd1loopc + add [eax+4],ebx + add eax,12 + dec ecx + jnz .sdd1loopc +.nosavedatafile + + 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 esi,[headdata] + add esi,[.curfileofs] + mov edi,[headdata] + add edi,[.curfileofs] + add [.curfileofs],eax + mov ecx,eax + and ecx,32767 + cmp ecx,512 + je near .yesheader + ; check if .smc header + push esi + push eax + push ebx + xor ecx,ecx + mov ebx,512 +.nextzerocheck + cmp byte[esi],0 + jne .notzero + inc ecx +.notzero + inc esi + dec ebx + jnz .nextzerocheck + pop ebx + pop eax + pop esi + cmp ecx,450 + jb .nomove +.yesheader + mov byte[Header512],1 + mov edi,esi + add edi,512 + sub eax,512 + ; move eax # of bytes from edi to esi + sub dword[.curromspace],512 + sub dword[.curfileofs],512 +.next + mov cl,[edi] + mov [esi],cl + inc esi + inc edi + dec eax + jnz .next +.nomove + 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 \ (You suck nasm) +.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 + mov edi,[.dotpos] + ; search for ICx files + cmp byte[edi],'.' + jne .noicfile + cmp byte[edi+3],'1' + jb .noicfile + cmp byte[edi+3],'7' + ja .noicfile + cmp byte[edi+4],0 + jne .noicfile + dec byte[edi+3] + xor ecx,ecx + mov byte[.first],2 + mov edx,fname+1 + call Open_File + jnc near .nextfile + inc byte[edi+3] +.noicfile + ; 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[TextFile], 1 + mov byte[IPSPatched],0 + + mov byte[lorommapmode2],0 + mov esi,[romdata] + cmp dword[esi+207FC0h],'DERB' + jne .noderby96 + cmp dword[esi+207FC4h],'Y ST' + jne .noderby96 + cmp dword[esi+207FC8h],'ALLI' + jne .noderby96 + cmp dword[esi+207FCDh],'N 96' + jne .noderby96 + mov byte[lorommapmode2],1 +.noderby96 + cmp dword[esi+7FC0h],'SOUN' + jne .nosoundnovel + cmp dword[esi+7FC4h],'D NO' + jne .nosoundnovel + cmp dword[esi+7FC8h],'VEL-' + jne .nosoundnovel + cmp dword[esi+7FCDh],'COOL' + jne .nosoundnovel + mov byte[lorommapmode2],1 +.nosoundnovel + + jmp .skipall + ; scan for branches + mov esi,06A5h + add esi,[romdata] + mov ecx,80h +.loopcheck + cmp byte[esi],48h + je .yes + cmp byte[esi],8Bh + je .yes + cmp byte[esi],0Bh + je .yes + cmp byte[esi],4Bh + je .yes + cmp byte[esi],08h + je .yes + cmp byte[esi],0DAh + je .yes + cmp byte[esi],5Ah + je .yes + jmp .no +.yes + pushad + mov al,byte[esi] + mov al,80h + sub al,cl + call printhex8 + popad +.no + add esi,8000h + dec ecx + jnz .loopcheck +.skipall + + 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 + + mov eax,[.curfileofs] + mov [NumofBytes],eax + shr eax,15 + mov [NumofBanks],eax + + 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 +.failop db 'Error opening file!',13,10,0 +.opened db 'File opened successfully!',13,10,0 +.mult db 'Multiple file format detected.',13,10,13,10,0 + +SECTION .bss + +.multfound resb 1 +.first resb 1 +.cchar resb 1 +.dotpos resd 1 +.curfileofs resd 1 +.filehand resw 1 +.temp resb 1 +.fail resb 1 +.maxromspace resd 1 +.curromspace resd 1 +NEWSYM GUIloadfailed, resb 1 + +SECTION .text + + +NEWSYM convertsram + cmp byte[cfgloadsdir],1 + je .sdrivechange + ret +.sdrivechange + ; copy fnames/fnamest to not have any '\' in them + mov esi,fnames+1 + mov ebx,0 +.next + mov al,[esi] + cmp al,0 + je .fincutoff + cmp al,'\' + je .cutoff + cmp al,'/' + je .cutoff + cmp al,':' + je .cutoff + inc esi + jmp .next +.cutoff + inc esi + mov ebx,esi + jmp .next +.fincutoff + cmp ebx,0 + je .nocutoff + mov esi,ebx + mov edi,fnames+1 +.next2 + mov al,[esi] + mov [edi],al + inc esi + inc edi + cmp al,0 + jne .next2 +.nocutoff + mov esi,fnamest+1 + mov ebx,0 +.nextb + mov al,[esi] + cmp al,0 + je .fincutoffb + cmp al,'\' + je .cutoffb + cmp al,'/' + je .cutoffb + cmp al,':' + je .cutoffb + inc esi + jmp .nextb +.cutoffb + inc esi + mov ebx,esi + jmp .nextb +.fincutoffb + cmp ebx,0 + je .nocutoffb + mov esi,ebx + sub esi,fnamest+1 + sub [statefileloc],esi + mov esi,ebx + mov edi,fnamest+1 +.next2b + mov al,[esi] + mov [edi],al + inc esi + inc edi + cmp al,0 + jne .next2b +.nocutoffb + ; change to sram directory + mov dl,[SRAMDrive] + mov ebx,SRAMDir + call Change_Dir + ret + +SECTION .data +NEWSYM CSStatus, db ' TYPE: ',0 +NEWSYM CSStatus2, db 'INTERLEAVED:No BANK:Lo CHSUM:OK ',0 +NEWSYM CSStatus3, db 'VIDEO: CRC32: ',0 + +crc32_table: +dd 000000000h, 077073096h, 0ee0e612ch, 0990951bah, 0076dc419h, 0706af48fh +dd 0e963a535h, 09e6495a3h, 00edb8832h, 079dcb8a4h, 0e0d5e91eh, 097d2d988h +dd 009b64c2bh, 07eb17cbdh, 0e7b82d07h, 090bf1d91h, 01db71064h, 06ab020f2h +dd 0f3b97148h, 084be41deh, 01adad47dh, 06ddde4ebh, 0f4d4b551h, 083d385c7h +dd 0136c9856h, 0646ba8c0h, 0fd62f97ah, 08a65c9ech, 014015c4fh, 063066cd9h +dd 0fa0f3d63h, 08d080df5h, 03b6e20c8h, 04c69105eh, 0d56041e4h, 0a2677172h +dd 03c03e4d1h, 04b04d447h, 0d20d85fdh, 0a50ab56bh, 035b5a8fah, 042b2986ch +dd 0dbbbc9d6h, 0acbcf940h, 032d86ce3h, 045df5c75h, 0dcd60dcfh, 0abd13d59h +dd 026d930ach, 051de003ah, 0c8d75180h, 0bfd06116h, 021b4f4b5h, 056b3c423h +dd 0cfba9599h, 0b8bda50fh, 02802b89eh, 05f058808h, 0c60cd9b2h, 0b10be924h +dd 02f6f7c87h, 058684c11h, 0c1611dabh, 0b6662d3dh, 076dc4190h, 001db7106h +dd 098d220bch, 0efd5102ah, 071b18589h, 006b6b51fh, 09fbfe4a5h, 0e8b8d433h +dd 07807c9a2h, 00f00f934h, 09609a88eh, 0e10e9818h, 07f6a0dbbh, 0086d3d2dh +dd 091646c97h, 0e6635c01h, 06b6b51f4h, 01c6c6162h, 0856530d8h, 0f262004eh +dd 06c0695edh, 01b01a57bh, 08208f4c1h, 0f50fc457h, 065b0d9c6h, 012b7e950h +dd 08bbeb8eah, 0fcb9887ch, 062dd1ddfh, 015da2d49h, 08cd37cf3h, 0fbd44c65h +dd 04db26158h, 03ab551ceh, 0a3bc0074h, 0d4bb30e2h, 04adfa541h, 03dd895d7h +dd 0a4d1c46dh, 0d3d6f4fbh, 04369e96ah, 0346ed9fch, 0ad678846h, 0da60b8d0h +dd 044042d73h, 033031de5h, 0aa0a4c5fh, 0dd0d7cc9h, 05005713ch, 0270241aah +dd 0be0b1010h, 0c90c2086h, 05768b525h, 0206f85b3h, 0b966d409h, 0ce61e49fh +dd 05edef90eh, 029d9c998h, 0b0d09822h, 0c7d7a8b4h, 059b33d17h, 02eb40d81h +dd 0b7bd5c3bh, 0c0ba6cadh, 0edb88320h, 09abfb3b6h, 003b6e20ch, 074b1d29ah +dd 0ead54739h, 09dd277afh, 004db2615h, 073dc1683h, 0e3630b12h, 094643b84h +dd 00d6d6a3eh, 07a6a5aa8h, 0e40ecf0bh, 09309ff9dh, 00a00ae27h, 07d079eb1h +dd 0f00f9344h, 08708a3d2h, 01e01f268h, 06906c2feh, 0f762575dh, 0806567cbh +dd 0196c3671h, 06e6b06e7h, 0fed41b76h, 089d32be0h, 010da7a5ah, 067dd4acch +dd 0f9b9df6fh, 08ebeeff9h, 017b7be43h, 060b08ed5h, 0d6d6a3e8h, 0a1d1937eh +dd 038d8c2c4h, 04fdff252h, 0d1bb67f1h, 0a6bc5767h, 03fb506ddh, 048b2364bh +dd 0d80d2bdah, 0af0a1b4ch, 036034af6h, 041047a60h, 0df60efc3h, 0a867df55h +dd 0316e8eefh, 04669be79h, 0cb61b38ch, 0bc66831ah, 0256fd2a0h, 05268e236h +dd 0cc0c7795h, 0bb0b4703h, 0220216b9h, 05505262fh, 0c5ba3bbeh, 0b2bd0b28h +dd 02bb45a92h, 05cb36a04h, 0c2d7ffa7h, 0b5d0cf31h, 02cd99e8bh, 05bdeae1dh +dd 09b64c2b0h, 0ec63f226h, 0756aa39ch, 0026d930ah, 09c0906a9h, 0eb0e363fh +dd 072076785h, 005005713h, 095bf4a82h, 0e2b87a14h, 07bb12baeh, 00cb61b38h +dd 092d28e9bh, 0e5d5be0dh, 07cdcefb7h, 00bdbdf21h, 086d3d2d4h, 0f1d4e242h +dd 068ddb3f8h, 01fda836eh, 081be16cdh, 0f6b9265bh, 06fb077e1h, 018b74777h +dd 088085ae6h, 0ff0f6a70h, 066063bcah, 011010b5ch, 08f659effh, 0f862ae69h +dd 0616bffd3h, 0166ccf45h, 0a00ae278h, 0d70dd2eeh, 04e048354h, 03903b3c2h +dd 0a7672661h, 0d06016f7h, 04969474dh, 03e6e77dbh, 0aed16a4ah, 0d9d65adch +dd 040df0b66h, 037d83bf0h, 0a9bcae53h, 0debb9ec5h, 047b2cf7fh, 030b5ffe9h +dd 0bdbdf21ch, 0cabac28ah, 053b39330h, 024b4a3a6h, 0bad03605h, 0cdd70693h +dd 054de5729h, 023d967bfh, 0b3667a2eh, 0c4614ab8h, 05d681b02h, 02a6f2b94h +dd 0b40bbe37h, 0c30c8ea1h, 05a05df1bh, 02d02ef8dh + +SECTION .text + +NEWSYM showinfogui + mov esi,[romdata] + add esi,[infoloc] + + cmp dword[infoloc],40FFC0h + jne .notEHi1 + mov dword[CSStatus2+23], 'EHi ' + jmp .nohiromrn +.notEHi1 + mov dword[CSStatus2+23], 'Lo ' + cmp byte[romtype],2 + jne .nohiromrn + mov dword[CSStatus2+23], 'Hi ' +.nohiromrn + + mov edi,CSStatus + mov ecx,20 +.looprn + mov al,[esi] + or al,al + jnz .okaysp + mov al,32 +.okaysp + mov [edi],al + inc esi + inc edi + dec ecx + jnz .looprn + + mov dword[CSStatus3+6], 'PAL ' + add esi,5 + cmp byte[esi],2 + jae .notntsc1 + mov dword[CSStatus3+6], 'NTSC' +.notntsc1 + cmp byte[esi],13 + jb .notntsc2 + mov dword[CSStatus3+6], 'NTSC' +.notntsc2 + mov dword[CSStatus+29],'NORM' + mov dword[CSStatus+33],'AL ' + cmp byte[SA1Enable],0 + je .nosa1 + mov dword[CSStatus+29],'SA-1' + mov dword[CSStatus+33],' ' +.nosa1 + cmp byte[RTCEnable],0 + je .nortc + mov dword[CSStatus+29],'RTC ' + mov dword[CSStatus+33],' ' + +.nortc + cmp byte[SPC7110Enable],0 + je .nospc7110 + mov dword[CSStatus+29],'SPC7' + mov dword[CSStatus+33],'110 ' +.nospc7110 + cmp byte[SFXEnable],0 + je .nosfx + mov dword[CSStatus+29],'SUPE' + mov dword[CSStatus+33],'R FX' +.nosfx + cmp byte[C4Enable],0 + je .noc4 + mov dword[CSStatus+29],'C4 ' + mov dword[CSStatus+33],' ' +.noc4 + cmp byte[DSP1Enable],0 + je .nodsp1 + mov dword[CSStatus+29],'DSP-' + mov dword[CSStatus+33],'1 ' +.nodsp1 + cmp byte[DSP2Enable],0 + je .nodsp2 + mov dword[CSStatus+29],'DSP-' + mov dword[CSStatus+33],'2 ' +.nodsp2 + cmp byte[DSP3Enable],0 + je .nodsp3 + mov dword[CSStatus+29],'DSP-' + mov dword[CSStatus+33],'3 ' +.nodsp3 + cmp byte[DSP4Enable],0 + je .nodsp4 + mov dword[CSStatus+29],'DSP-' + mov dword[CSStatus+33],'4 ' +.nodsp4 + cmp byte[SDD1Enable],0 + je .nosdd1 + mov dword[CSStatus+29],'S-DD' + mov dword[CSStatus+33],'1 ' +.nosdd1 + cmp byte[OBCEnable],0 + je .noobc + mov dword[CSStatus+29],'OBC1' + mov dword[CSStatus+33],' ' +.noobc + cmp byte[SETAEnable],0 + je .noseta + mov dword[CSStatus+29],'SETA' + mov dword[CSStatus+33],' DSP' +.noseta + cmp byte[ST18Enable],0 + je .nost18 + mov dword[CSStatus+29],'ST01' + mov dword[CSStatus+33],'8 ' +.nost18 + cmp byte[SGBEnable],0 + je .nosgb + mov dword[CSStatus+29],'SGB ' + mov dword[CSStatus+33],' ' +.nosgb + cmp byte[BSEnable],0 + je .nobs + mov dword[CSStatus+29],'BROA' + mov dword[CSStatus+33],'DCST' + ;dummy out date so CRC32 matches + sub esi,3 + mov word[esi],042h ;42 is the answer, and the uCONSRT standard +.nobs + + mov dword[CSStatus2+12],'No ' + cmp byte[Interleaved],0 + je .nointlv + mov dword[CSStatus2+12],'Yes ' +.nointlv + + ; calculate CRC32 + xor edx,edx + mov eax,0FFFFFFFFh + mov ecx,dword[NumofBytes] + mov esi,[romdata] + .calcloop + mov dl,byte[esi] + mov ebx,eax ;ebx = CRC32 + xor ebx,edx ;ebx ^= edx + movzx ebx,bl ;ebx &= 0xFF + mov ebx,[ebx*4 + crc32_table] ;ebx = crc32_table[bl] + shr eax,8 ;CRC32 >>= 8 + xor eax,ebx ;CRC32 ^= ebx + inc esi + dec ecx + jnz .calcloop + xor eax,0FFFFFFFFh + mov [CRC32],eax + + ;Place CRC32 on line + mov ecx,8 + mov esi,CSStatus3 + add esi,32 + mov ebx,0F0000000h +.crcprintloop + mov eax,[CRC32] + and eax,ebx + dec ecx + shl ecx,2 + shr eax,cl + add eax,48 + cmp eax,58 + jb .noadd + add eax,7 +.noadd + mov [esi],al + inc esi + shr ebx,4 + shr ecx,2 + jnz .crcprintloop + + EXTSYM CalcChecksum + pushad + call CalcChecksum + popad + + mov esi,[romdata] + add esi,[infoloc] + add esi,1Eh + mov ax,[Checksumvalue] + cmp ax,[esi] + jne .failed +.passed2 + mov dword[CSStatus2+36],'OK ' + jmp .passed +.failed + mov dword[CSStatus2+36],'FAIL' +.passed + mov dword[MessageOn],300 + mov dword[Msgptr],CSStatus + mov eax,[MsgCount] + 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 + +;This looks like the info it displays if loaded via the command line +;Very outdated + +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 + dec ecx + jnz .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,[infoloc] + + mov ecx,21 +.loopb + lodsb + mov dl,al + mov ah,2 + call Output_Text + dec ecx + jnz .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*2 + jbe .nosramc + mov eax,65536*2 +.nosramc + mov [ramsize],eax + dec eax + mov [ramsizeand],eax + mov edx,.kilobit + mov ah,9 + call Output_Text + mov al,[ForceROMTiming] + mov byte[ForcePal],al + xor al,al + 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],263 + mov dword[MsgCount],120 + cmp al,1 + jbe .nopal + cmp al,0Dh + 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 +.cpassed2 + mov edx,.cpassed + jmp .passed +.failed + mov ax,[Checksumvalue2] + cmp ax,[esi] + je .cpassed2 + 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 +%ifdef __MSDOS__ + call Get_Key + cmp al,27 + jne .noesc + mov dl,[InitDrive] + mov ebx,InitDir + call Change_Dir + jmp DosExit +%endif +.noesc + mov edx,.ret + call Output_Text + ret + +SECTION .data +.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 + +SECTION .bss + +.memfree resb 30 + +NEWSYM DSP1Type, resb 1 +NEWSYM intldone, resb 1 +SECTION .text + +EXTSYM ClearScreen, cbitmode, makepal + +NEWSYM SetupROM + call CheckROMType + call SetIRQVectors + call ClearScreen + cmp byte[cbitmode],0 + jne .nomakepal + call makepal +.nomakepal + ; get ROM and SRAM size + mov esi,[romdata] + add esi,[infoloc] + add esi,18h + mov cl,[esi-1] + mov [curromsize],cl + mov cl,[esi] + inc esi + xor eax,eax + mov al,1 + shl al,cl + cmp al,1 + jne .yessram + mov al,0 +.yessram + shl eax,10 + cmp eax,65536 + jbe .nosramc + mov eax,65536 +.nosramc + mov [ramsize],eax + dec eax + mov [ramsizeand],eax + + ; get pal/ntsc + mov al,[ForceROMTiming] + mov byte[ForcePal],al + xor al,al + 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],263 + mov dword[MsgCount],120 + cmp byte[BSEnable],1 + je .nopal + cmp al,1 + jbe .nopal + cmp al,0Dh + jae .nopal + mov byte[romispal],1 + mov word[totlines],314 + mov dword[MsgCount],100 +.nopal + ret + +NEWSYM CheckROMType + call SetAddressingModes + call GenerateBank0Table + + EXTSYM BankCheck + call BankCheck + + 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 + ; 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 + + ; Chip Detection + 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 byte[OBCEnable],0 + mov byte[CHIPSRAM],0 + mov byte[SGBEnable],0 + mov byte[SETAEnable],0 + mov byte[ST18Enable],0 + mov byte[DSP1Enable],0 + mov byte[DSP2Enable],0 + mov byte[DSP3Enable],0 + mov byte[DSP4Enable],0 + mov byte[BSEnable],0 + + mov esi,[romdata] + add esi,[infoloc] + add esi,21 + + mov ax,[esi] + cmp ax,02530h + jne .notOBC1 + mov byte[OBCEnable],1 + mov byte[CHIPSRAM],1 + jmp .endchpdtct +.notOBC1 + cmp ax,04532h + jne .notSDD1A + mov byte[SDD1Enable],1 + mov byte[CHIPSRAM],1 + jmp .endchpdtct +.notSDD1A + cmp ax,04332h + jne .notSDD1B + mov byte[SDD1Enable],1 + jmp .endchpdtct +.notSDD1B + cmp ax,0E320h + jne .notSGB + mov byte[SGBEnable],1 + jmp .endchpdtct +.notSGB + cmp ax,0F320h + jne .notC4 + mov byte[C4Enable],1 + jmp .endchpdtct +.notC4 + cmp ax,03523h + jne .notSA1A + mov byte[SA1Enable],1 + mov byte[CHIPSRAM],1 + jmp .endchpdtct +.notSA1A + cmp ax,03423h + jne .notSA1B + mov byte[SA1Enable],1 + jmp .endchpdtct +.notSA1B + cmp ax,0F530h + jne .notSETAA + mov byte[ST18Enable],1 + mov byte[CHIPSRAM],1 ;Check later if this should be removed + jmp .endchpdtct +.notSETAA + cmp ax,0F630h + jne .notSETAB + mov byte[SETAEnable],1 + mov byte[CHIPSRAM],1 ;Check later if this should be removed + jmp .endchpdtct +.notSETAB + cmp ax,01320h + jne .notSFXA + mov byte[SFXEnable],1 + mov byte[SFXSRAM],1 ;Check later if this should be removed + jmp .endchpdtct +.notSFXA + cmp ax,01420h + jne .notSFXB + mov byte[SFXEnable],1 + mov byte[SFXSRAM],1 ;Check later if this should be removed + jmp .endchpdtct +.notSFXB + cmp ax,01520h + jne .notSFXC + mov byte[SFXEnable],1 + mov byte[SFXSRAM],1 ;Check later if this should be removed + jmp .endchpdtct +.notSFXC + cmp ax,01A20h + jne .notSFXD + mov byte[SFXEnable],1 + mov byte[SFXSRAM],1 ;Check later if this should be removed + jmp .endchpdtct +.notSFXD + cmp ax,05535h + jne .notRTCplain + mov byte[RTCEnable],1 + mov byte[CHIPSRAM],1 + jmp .endchpdtct +.notRTCplain + cmp ax,0F93Ah + jne .notSPC7A + mov byte[SPC7110Enable],1 + mov byte[RTCEnable],1 + mov byte[CHIPSRAM],1 + jmp .endchpdtct +.notSPC7A + cmp ax,0F53Ah + jne .notSPC7B + mov byte[SPC7110Enable],1 + mov byte[CHIPSRAM],1 + jmp .endchpdtct +.notSPC7B + cmp ax,00520h + jne .notDSP2 + mov byte[DSP2Enable],1 + mov byte[CHIPSRAM],1 + jmp .endchpdtct +.notDSP2 + cmp ax,00330h + jne .notDSP4 + mov byte[DSP4Enable],1 + jmp .endchpdtct +.notDSP4 + cmp ax,00530h + jne .notDSP3 + cmp byte[esi+5],0B2h ;Bandai only + jne .notDSP3 + mov byte[DSP3Enable],1 + mov byte[CHIPSRAM],1 + jmp .endchpdtct +.notDSP3 + cmp ah,3 + jne .notDSP1A + mov byte[DSP1Enable],1 + jmp .endchpdtct +.notDSP1A + cmp ah,5 + jne .notDSP1B + mov byte[DSP1Enable],1 + mov byte[CHIPSRAM],1 + jmp .endchpdtct +.notDSP1B + cmp byte[esi+5],033h + je .bsgoodDA + cmp byte[esi+5],0FFh + je .bsgoodDA + jmp .notBS +.bsgoodDA + cmp al,0 + je .bsgoodD5 + mov bl,al + and bl,083h + cmp bl,080h + je .bsgoodD5 + jmp .notBS +.bsgoodD5 + cmp ah,0FFh + jne .checkgooddate + cmp byte[esi+1],0FFh + je .validdate + jmp .notBS +.checkgooddate + mov bh,ah + and bh,0Fh + jnz .notBS + mov bh,ah + shr bh,4 + dec bh + cmp bh,12 + jae .notBS +.validdate + mov byte[BSEnable],1 + jmp .endchpdtct +.notBS +.endchpdtct + + cmp byte[DSP1Enable],1 + jne .notDSP1Hi + call InitDSP + mov byte[DSP1Type],1 + cmp byte[romtype],2 + jne .notDSP1Hi + mov byte[DSP1Type],2 +.notDSP1Hi + + ;Setup Super FX related stuff + cmp byte[SFXEnable],1 + jne near .nosfx + cmp byte[Sup48mbit],1 + je .sfxokay + mov byte[yesoutofmemory],1 + jmp .nosfx +.sfxokay + 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 + + ;General Stuff all mixed together + 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 near .nodsp1lorom + xor ecx,ecx +.dsp1loop + mov dword[memtabler8+30h*4+ecx],DSP1Read8b3F + mov dword[memtablew8+30h*4+ecx],DSP1Write8b3F + mov dword[memtabler16+30h*4+ecx],DSP1Read16b3F + mov dword[memtablew16+30h*4+ecx],DSP1Write16b3F + mov dword[memtabler8+0B0h*4+ecx],DSP1Read8b3F + mov dword[memtablew8+0B0h*4+ecx],DSP1Write8b3F + mov dword[memtabler16+0B0h*4+ecx],DSP1Read16b3F + mov dword[memtablew16+0B0h*4+ecx],DSP1Write16b3F + mov dword[memtabler8+0E0h*4+ecx],DSP1Read8b3F + mov dword[memtablew8+0E0h*4+ecx],DSP1Write8b3F + mov dword[memtabler16+0E0h*4+ecx],DSP1Read16b3F + mov dword[memtablew16+0E0h*4+ecx],DSP1Write16b3F + add ecx,4 + cmp ecx,16*4 + jne .dsp1loop +.nodsp1lorom + mov dword[wramdata],wramdataa + call SPC7110Load + ret + +SECTION .bss +NEWSYM CHIPSRAM, resb 1 +NEWSYM SFXEnable, resb 1 +NEWSYM C4Enable, resb 1 +NEWSYM SPC7110Enable, resb 1 +NEWSYM RTCEnable, resb 1 +NEWSYM SA1Enable, resb 1 +NEWSYM SDD1Enable, resb 1 +NEWSYM OBCEnable, resb 1 +NEWSYM SETAEnable, resb 1 ;ST010 & 11 +NEWSYM ST18Enable, resb 1 +NEWSYM SGBEnable, resb 1 +NEWSYM DSP1Enable, resb 1 +NEWSYM DSP2Enable, resb 1 +NEWSYM DSP3Enable, resb 1 +NEWSYM DSP4Enable, resb 1 +NEWSYM BSEnable, resb 1 +NEWSYM C4RamR, resd 1 +NEWSYM C4RamW, resd 1 +NEWSYM C4Ram, resd 1 +NEWSYM ROMTypeNOTFound, resb 1 +NEWSYM Interleaved, resb 1 +SECTION .text + +NEWSYM SetIRQVectors + ; Get Vectors (NMI & Reset) + mov esi,[romdata] + add esi,[infoloc] + add esi,21 + 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 + add esi,0Fh + 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 + jne .nhirom + add esi,8000h +.nhirom + mov word[resetv],8000h + mov word[xpc],8000h + mov byte[esi],58h + mov byte[esi+1],80h + mov byte[esi+2],0FEh + mov dword[Msgptr],outofmemoryerror + cmp byte[newgfx16b],1 + jne .notso + mov dword[Msgptr],outofmemoryerror2 +.notso + mov dword[MessageOn],0FFFFFFFFh + ret + +SECTION .bss +NEWSYM yesoutofmemory, resb 1 +SECTION .data +NEWSYM outofmemoryerror, db 'OUT OF MEMORY.',0 +NEWSYM outofmemoryerror2, db 'ROM IS TOO BIG.',0 +SECTION .text + +NEWSYM InitAsmEnd diff --git a/zsnes/src/link.win32 b/zsnes/src/link.win32 index 5938eb4b..35f95c72 100644 --- a/zsnes/src/link.win32 +++ b/zsnes/src/link.win32 @@ -1 +1 @@ -/Fezsnesw.exe chips\dsp1proc.obj dos\sw.obj dos\gppro.obj dos\vesa12.obj dos\zsipx.obj dos\modemrtn.obj dos\joy.obj dos\debug.obj dos\vesa2.obj dos\initvid.obj cfgload.obj endmem.obj fixsin.obj init.obj initc.obj ui.obj vcache.obj water.obj smoke.obj burn.obj video\procvid.obj win\copyvwin.obj win\winintrf.obj win\winlink.obj win\zloaderw.obj win\ztcp.obj win\zfilew.obj win\zipxw.obj video\makev16b.obj video\makev16t.obj video\makevid.obj video\mode716.obj video\mode716b.obj video\mode716d.obj video\mode716e.obj video\mode716t.obj video\mode7.obj video\mode7ext.obj video\mv16tms.obj video\newg162.obj video\newgfx16.obj video\newgfx2.obj video\newgfx.obj video\m716text.obj video\2xsaiw.obj video\sw_draw.obj gui\gui.obj gui\menu.obj cpu\addrni.obj cpu\dma.obj cpu\dsp.obj cpu\dspproc.obj cpu\execute.obj cpu\irq.obj cpu\memory.obj cpu\spc700.obj cpu\stable.obj cpu\table.obj cpu\tableb.obj cpu\tablec.obj chips\dsp1emu.obj chips\fxemu2.obj chips\fxemu2b.obj chips\fxemu2c.obj chips\fxtable.obj chips\sa1proc.obj chips\sa1regs.obj chips\sfxproc.obj zip\unzip.obj zip\zzip.obj zip\zpng.obj zlib.lib libpng.lib wsock32.lib user32.lib gdi32.lib shell32.lib winmm.lib ddraw.lib dsound.lib dinput8.lib d3dx.lib /link /section:.text,erw +/Fezsnesw.exe chips\dsp1proc.obj dos\sw.obj dos\gppro.obj dos\vesa12.obj dos\zsipx.obj dos\modemrtn.obj dos\joy.obj dos\debug.obj dos\vesa2.obj dos\initvid.obj cfgload.obj endmem.obj fixsin.obj init.obj initc.obj ui.obj vcache.obj water.obj smoke.obj burn.obj video\procvid.obj win\copyvwin.obj win\winintrf.obj win\winlink.obj win\zloaderw.obj win\ztcp.obj win\zfilew.obj win\zipxw.obj video\makev16b.obj video\makev16t.obj video\makevid.obj video\mode716.obj video\mode716b.obj video\mode716d.obj video\mode716e.obj video\mode716t.obj video\mode7.obj video\mode7ext.obj video\mv16tms.obj video\newg162.obj video\newgfx16.obj video\newgfx2.obj video\newgfx.obj video\m716text.obj video\2xsaiw.obj video\sw_draw.obj gui\gui.obj gui\menu.obj cpu\addrni.obj cpu\dma.obj cpu\dsp.obj cpu\dspproc.obj cpu\execute.obj cpu\irq.obj cpu\memory.obj cpu\spc700.obj cpu\stable.obj cpu\table.obj cpu\tableb.obj cpu\tablec.obj chips\dsp1emu.obj chips\fxemu2.obj chips\fxemu2b.obj chips\fxemu2c.obj chips\fxtable.obj chips\sa1proc.obj chips\sa1regs.obj chips\sfxproc.obj zip\unzip.obj zip\zzip.obj zip\zpng.obj zlib.lib libpng.lib wsock32.lib user32.lib gdi32.lib shell32.lib winmm.lib ddraw.lib dsound.lib dinput8.lib d3dx.lib /link /section:.text,erw diff --git a/zsnes/src/makefile.dos b/zsnes/src/makefile.dos index 30686ebf..0e8e429d 100644 --- a/zsnes/src/makefile.dos +++ b/zsnes/src/makefile.dos @@ -1,199 +1,199 @@ -#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. - -CHIPDIR=chips -CPUDIR=cpu -DOSDIR=dos -GUIDIR=gui -VIDEODIR=video -WINDIR=win -OBJDIR=obj -ZIPDIR=zip - -CHIPSOBJ=${CHIPDIR}/dsp1emu.o ${CHIPDIR}/fxemu2.o ${CHIPDIR}/sfxproc.o\ - ${CHIPDIR}/fxemu2b.o ${CHIPDIR}/fxemu2c.o ${CHIPDIR}/fxtable.o\ - ${CHIPDIR}/sa1proc.o ${CHIPDIR}/sa1regs.o ${CHIPDIR}/dsp1proc.o - -CPUOBJ=${CPUDIR}/addrni.o ${CPUDIR}/dma.o ${CPUDIR}/dsp.o ${CPUDIR}/dspproc.o\ - ${CPUDIR}/execute.o ${CPUDIR}/irq.o ${CPUDIR}/memory.o\ - ${CPUDIR}/spc700.o ${CPUDIR}/stable.o ${CPUDIR}/table.o\ - ${CPUDIR}/tableb.o ${CPUDIR}/tablec.o - -GUIOBJ=${GUIDIR}/gui.o ${GUIDIR}/menu.o - -VIDEOBJ=${VIDEODIR}/makev16b.o ${VIDEODIR}/makev16t.o ${VIDEODIR}/makevid.o\ - ${VIDEODIR}/mode716.o ${VIDEODIR}/mode716b.o ${VIDEODIR}/mode716d.o\ - ${VIDEODIR}/mode716e.o ${VIDEODIR}/mode716t.o ${VIDEODIR}/mode7.o\ - ${VIDEODIR}/mode7ext.o ${VIDEODIR}/mv16tms.o ${VIDEODIR}/newg162.o\ - ${VIDEODIR}/newgfx16.o ${VIDEODIR}/newgfx2.o ${VIDEODIR}/newgfx.o\ - ${VIDEODIR}/m716text.o ${VIDEODIR}/procvid.o - -DOSOBJ= ${DOSDIR}/dosintrf.o ${DOSDIR}/gppro.o ${DOSDIR}/debug.o\ - ${DOSDIR}/initvid.o ${DOSDIR}/modemrtn.o ${DOSDIR}/sw32.o\ - ${DOSDIR}/joy.o ${DOSDIR}/sound.o ${DOSDIR}/sw.o ${DOSDIR}/vesa12.o\ - ${DOSDIR}/vesa2.o ${DOSDIR}/zloader.o ${DOSDIR}/zsipx.o\ - ${DOSDIR}/zfile.o - -WINOBJ=${WINDIR}/copywin.o ${WINDIR}/winintrf.o ${WINDIR}/winlink.o\ - ${WINDIR}/zloaderw.o ${WINDIR}/ztcp.o ${WINDIR}/zipxw.o - -PREOBJ=${OBJDIR}/dosbuff.o ${OBJDIR}/ipx.o ${OBJDIR}/zipx.o - -ZIPOBJ=${ZIPDIR}/zzip.o ${ZIPDIR}/unzip.o ${ZIPDIR}/zpng.o - -MAINOBJ=cfgload.o endmem.o fixsin.o init.o initc.o ui.o vcache.o water.o smoke.o burn.o - - -OBJS=${CHIPSOBJ} ${CPUOBJ} ${DOSOBJ} ${GUIOBJ} ${VIDEOBJ} ${PREOBJ} ${MAINOBJ} ${ZIPOBJ} -LIBS=-lz -lm -lpng -#CFLAGS=-O2 -Wall -Wno-unused -D__MSDOS__ -CFLAGS=-O3 -march=i586 -fno-rtti -fno-exceptions -ffast-math\ --fomit-frame-pointer -fno-unroll-loops -Wall -Wno-unused -D__MSDOS__ -ASM=nasm -ASMFLAGS=-O1 -f coff -D__MSDOS__ -CC=gcc -PP=gpp - - -.SUFFIXES: .c .cpp .asm - -%.o: %.c - ${CC} ${CFLAGS} -o $@ -c $< - -%.o: %.cpp - ${PP} ${CFLAGS} -o $@ -c $< - -%.o: %.asm - ${ASM} ${ASMFLAGS} -o $@ $< - -ALL: zsnes.exe - -debug: zsnesd.exe - -zsnes.exe: ${OBJS} - ${CC} -Ws -s -o zsnes.exe ${OBJS} ${LIBS} - -zsnesd.exe: ${OBJS} - ${CC} -Ws -o zsnesd.exe ${OBJS} ${LIBS} - -${DOSDIR}/zloader.o: ${DOSDIR}/zloader.c -fixsin.o: fixsin.c -water.o: water.c -smoke.o: smoke.c -burn.o: burn.c -${DOSDIR}/zfile.o: ${DOSDIR}/zfile.c -${ZIPDIR}/unzip.o: ${ZIPDIR}/unzip.c ${ZIPDIR}/zunzip.h -${ZIPDIR}/zzip.o: ${ZIPDIR}/zzip.c ${ZIPDIR}/zunzip.h -${ZIPDIR}/zpng.o: ${ZIPDIR}/zpng.c ${ZIPDIR}/zpng.h -${VIDEODIR}/procvid.o: ${VIDEODIR}/procvid.asm macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xSaImmx.inc -${CHIPDIR}/dsp1proc.o: ${CHIPDIR}/dsp1proc.asm macros.mac -${CHIPDIR}/sa1regs.o: ${CHIPDIR}/sa1regs.asm macros.mac\ - ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac -${CHIPDIR}/sfxproc.o: ${CHIPDIR}/sfxproc.asm macros.mac\ - ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac -${CHIPDIR}/dsp1emu.o: ${CHIPDIR}/dsp1emu.c -ui.o: ui.asm macros.mac -cfgload.o:cfgload.asm macros.mac -init.o:init.asm macros.mac -initc.o:initc.c -${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac -${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac -${CPUDIR}/table.o: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\ - ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816.inc\ - ${CPUDIR}/regs.mac ${CPUDIR}/regs.inc ${CPUDIR}/regsw.mac\ - ${CPUDIR}/regsw.inc macros.mac -${CPUDIR}/tableb.o: ${CPUDIR}/tableb.asm ${CPUDIR}/65816db.inc\ - ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816b.inc\ - ${CPUDIR}/regs.mac macros.mac -${CPUDIR}/tablec.o: ${CPUDIR}/tablec.asm ${CPUDIR}/65816dc.inc\ - ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816c.inc\ - ${CPUDIR}/regs.mac macros.mac -${CPUDIR}/stable.o: ${CPUDIR}/stable.asm ${CPUDIR}/s65816d.inc\ - ${CPUDIR}/saddress.inc ${CPUDIR}/saddrni.inc ${CPUDIR}/se65816.inc\ - macros.mac -${CPUDIR}/memory.o: ${CPUDIR}/memory.asm macros.mac -${CPUDIR}/dma.o: ${CPUDIR}/dma.asm macros.mac -${DOSDIR}/dosintrf.o: ${DOSDIR}/dosintrf.asm macros.mac -vcache.o:vcache.asm macros.mac -${DOSDIR}/initvid.o:${DOSDIR}/initvid.asm macros.mac ${DOSDIR}/vga.inc -${VIDEODIR}/makevid.o: ${VIDEODIR}/makevid.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/makev16b.o: ${VIDEODIR}/makev16b.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/makev16t.o: ${VIDEODIR}/makev16t.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/mv16tms.o: ${VIDEODIR}/mv16tms.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/mode7.o: ${VIDEODIR}/mode7.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode716.o: ${VIDEODIR}/mode716.asm ${VIDEODIR}/mode716.mac\ - macros.mac -${VIDEODIR}/mode716b.o:${VIDEODIR}/mode716b.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode716t.o:${VIDEODIR}/mode716t.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode716d.o:${VIDEODIR}/mode716d.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode7ext.o:${VIDEODIR}/mode7ext.asm macros.mac -${VIDEODIR}/mode716e.o:${VIDEODIR}/mode716e.asm macros.mac -${VIDEODIR}/m716text.o:${VIDEODIR}/m716text.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${CPUDIR}/irq.o: ${CPUDIR}/irq.asm macros.mac -${CPUDIR}/dspproc.o: ${CPUDIR}/dspproc.asm macros.mac -${CPUDIR}/spc700.o:${CPUDIR}/spc700.asm macros.mac\ - ${CPUDIR}/regsw.mac ${CPUDIR}/spcdef.inc ${CPUDIR}/spcaddr.inc -${CPUDIR}/dsp.o: ${CPUDIR}/dsp.asm macros.mac -${DOSDIR}/vesa2.o: ${DOSDIR}/vesa2.asm macros.mac -${DOSDIR}/vesa12.o: ${DOSDIR}/vesa12.asm macros.mac -${DOSDIR}/joy.o: ${DOSDIR}/joy.asm macros.mac -${DOSDIR}/sw.o: ${DOSDIR}/sw.asm macros.mac -${GUIDIR}/gui.o: ${GUIDIR}/gui.asm ${GUIDIR}/guitools.inc\ - ${GUIDIR}/guimisc.inc ${GUIDIR}/guimouse.inc ${GUIDIR}/guiwindp.inc\ - ${GUIDIR}/guinetpl.inc ${GUIDIR}/guikeys.inc ${GUIDIR}/guicheat.inc\ - ${GUIDIR}/guicombo.inc ${GUIDIR}/guiload.inc macros.mac -${GUIDIR}/menu.o: ${GUIDIR}/menu.asm macros.mac -${VIDEODIR}/newgfx.o:${VIDEODIR}/newgfx.asm ${VIDEODIR}/vidmacro.mac\ - ${VIDEODIR}/newgfx2.mac ${VIDEODIR}/newgfx.mac macros.mac -${VIDEODIR}/newgfx2.o:${VIDEODIR}/newgfx2.asm ${VIDEODIR}/newgfxwn.mac\ - ${VIDEODIR}/newgfx.mac macros.mac -${VIDEODIR}/newgfx16.o: ${VIDEODIR}/newgfx16.asm macros.mac ${VIDEODIR}/vidmacro.mac\ - ${VIDEODIR}/newgfx16.mac ${VIDEODIR}/newg162.mac -${VIDEODIR}/newg162.o: macros.mac ${VIDEODIR}/newg162.asm ${VIDEODIR}/newg162.mac\ - ${VIDEODIR}/vidmacro.mac ${VIDEODIR}/newg16wn.mac -${CHIPDIR}/fxemu2.o: ${CHIPDIR}/fxemu2.asm ${CHIPDIR}/fxemu2.mac\ - macros.mac -${CHIPSDIR}/fxemu2b.o: ${CHIPDIR}/fxemu2b.asm ${CHIPDIR}/fxemu2.mac\ - ${CHIPDIR}/fxemu2b.mac -${CHIPSDIR}/fxemu2c.o: ${CHIPDIR}/fxemu2c.asm macros.mac ${CHIPDIR}/fxemu2.mac\ - ${CHIPDIR}/fxemu2b.mac ${CHIPDIR}/fxemu2c.mac -${CHIPDIR}/fxtable.o: ${CHIPDIR}/fxtable.asm macros.mac -${DOSDIR}/gppro.o: ${DOSDIR}/gppro.asm macros.mac -${DOSDIR}/zsipx.o: ${DOSDIR}/zsipx.asm -${CHIPDIR}/sa1proc.o: ${CHIPDIR}/sa1proc.asm macros.mac -endmem.o: endmem.asm macros.mac -${DOSDIR}/modemrtn.o: ${DOSDIR}/modemrtn.asm macros.mac - -clean: - del *.o - del ${CHIPDIR}\*.o - del ${CPUDIR}\*.o - del ${VIDEODIR}\*.o - del ${GUIDIR}\*.o - del ${DOSDIR}\*.o - del ${ZIPDIR}\*.o - del zsnes.exe - +#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. + +CHIPDIR=chips +CPUDIR=cpu +DOSDIR=dos +GUIDIR=gui +VIDEODIR=video +WINDIR=win +OBJDIR=obj +ZIPDIR=zip + +CHIPSOBJ=${CHIPDIR}/dsp1emu.o ${CHIPDIR}/fxemu2.o ${CHIPDIR}/sfxproc.o\ + ${CHIPDIR}/fxemu2b.o ${CHIPDIR}/fxemu2c.o ${CHIPDIR}/fxtable.o\ + ${CHIPDIR}/sa1proc.o ${CHIPDIR}/sa1regs.o ${CHIPDIR}/dsp1proc.o + +CPUOBJ=${CPUDIR}/addrni.o ${CPUDIR}/dma.o ${CPUDIR}/dsp.o ${CPUDIR}/dspproc.o\ + ${CPUDIR}/execute.o ${CPUDIR}/irq.o ${CPUDIR}/memory.o\ + ${CPUDIR}/spc700.o ${CPUDIR}/stable.o ${CPUDIR}/table.o\ + ${CPUDIR}/tableb.o ${CPUDIR}/tablec.o + +GUIOBJ=${GUIDIR}/gui.o ${GUIDIR}/menu.o + +VIDEOBJ=${VIDEODIR}/makev16b.o ${VIDEODIR}/makev16t.o ${VIDEODIR}/makevid.o\ + ${VIDEODIR}/mode716.o ${VIDEODIR}/mode716b.o ${VIDEODIR}/mode716d.o\ + ${VIDEODIR}/mode716e.o ${VIDEODIR}/mode716t.o ${VIDEODIR}/mode7.o\ + ${VIDEODIR}/mode7ext.o ${VIDEODIR}/mv16tms.o ${VIDEODIR}/newg162.o\ + ${VIDEODIR}/newgfx16.o ${VIDEODIR}/newgfx2.o ${VIDEODIR}/newgfx.o\ + ${VIDEODIR}/m716text.o ${VIDEODIR}/procvid.o + +DOSOBJ= ${DOSDIR}/dosintrf.o ${DOSDIR}/gppro.o ${DOSDIR}/debug.o\ + ${DOSDIR}/initvid.o ${DOSDIR}/modemrtn.o ${DOSDIR}/sw32.o\ + ${DOSDIR}/joy.o ${DOSDIR}/sound.o ${DOSDIR}/sw.o ${DOSDIR}/vesa12.o\ + ${DOSDIR}/vesa2.o ${DOSDIR}/zloader.o ${DOSDIR}/zsipx.o\ + ${DOSDIR}/zfile.o + +WINOBJ=${WINDIR}/copywin.o ${WINDIR}/winintrf.o ${WINDIR}/winlink.o\ + ${WINDIR}/zloaderw.o ${WINDIR}/ztcp.o ${WINDIR}/zipxw.o + +PREOBJ=${OBJDIR}/dosbuff.o ${OBJDIR}/ipx.o ${OBJDIR}/zipx.o + +ZIPOBJ=${ZIPDIR}/zzip.o ${ZIPDIR}/unzip.o ${ZIPDIR}/zpng.o + +MAINOBJ=cfgload.o endmem.o fixsin.o init.o initc.o ui.o vcache.o water.o smoke.o burn.o + + +OBJS=${CHIPSOBJ} ${CPUOBJ} ${DOSOBJ} ${GUIOBJ} ${VIDEOBJ} ${PREOBJ} ${MAINOBJ} ${ZIPOBJ} +LIBS=-lz -lm -lpng +#CFLAGS=-O2 -Wall -Wno-unused -D__MSDOS__ +CFLAGS=-O3 -march=i586 -fno-rtti -fno-exceptions -ffast-math\ +-fomit-frame-pointer -fno-unroll-loops -Wall -Wno-unused -D__MSDOS__ +ASM=nasm +ASMFLAGS=-O1 -f coff -D__MSDOS__ +CC=gcc +PP=gpp + + +.SUFFIXES: .c .cpp .asm + +%.o: %.c + ${CC} ${CFLAGS} -o $@ -c $< + +%.o: %.cpp + ${PP} ${CFLAGS} -o $@ -c $< + +%.o: %.asm + ${ASM} ${ASMFLAGS} -o $@ $< + +ALL: zsnes.exe + +debug: zsnesd.exe + +zsnes.exe: ${OBJS} + ${CC} -Ws -s -o zsnes.exe ${OBJS} ${LIBS} + +zsnesd.exe: ${OBJS} + ${CC} -Ws -o zsnesd.exe ${OBJS} ${LIBS} + +${DOSDIR}/zloader.o: ${DOSDIR}/zloader.c +fixsin.o: fixsin.c +water.o: water.c +smoke.o: smoke.c +burn.o: burn.c +${DOSDIR}/zfile.o: ${DOSDIR}/zfile.c +${ZIPDIR}/unzip.o: ${ZIPDIR}/unzip.c ${ZIPDIR}/zunzip.h +${ZIPDIR}/zzip.o: ${ZIPDIR}/zzip.c ${ZIPDIR}/zunzip.h +${ZIPDIR}/zpng.o: ${ZIPDIR}/zpng.c ${ZIPDIR}/zpng.h +${VIDEODIR}/procvid.o: ${VIDEODIR}/procvid.asm macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xSaImmx.inc +${CHIPDIR}/dsp1proc.o: ${CHIPDIR}/dsp1proc.asm macros.mac +${CHIPDIR}/sa1regs.o: ${CHIPDIR}/sa1regs.asm macros.mac\ + ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac +${CHIPDIR}/sfxproc.o: ${CHIPDIR}/sfxproc.asm macros.mac\ + ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac +${CHIPDIR}/dsp1emu.o: ${CHIPDIR}/dsp1emu.c +ui.o: ui.asm macros.mac +cfgload.o:cfgload.asm macros.mac +init.o:init.asm macros.mac +initc.o:initc.c +${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac +${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac +${CPUDIR}/table.o: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\ + ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816.inc\ + ${CPUDIR}/regs.mac ${CPUDIR}/regs.inc ${CPUDIR}/regsw.mac\ + ${CPUDIR}/regsw.inc macros.mac +${CPUDIR}/tableb.o: ${CPUDIR}/tableb.asm ${CPUDIR}/65816db.inc\ + ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816b.inc\ + ${CPUDIR}/regs.mac macros.mac +${CPUDIR}/tablec.o: ${CPUDIR}/tablec.asm ${CPUDIR}/65816dc.inc\ + ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816c.inc\ + ${CPUDIR}/regs.mac macros.mac +${CPUDIR}/stable.o: ${CPUDIR}/stable.asm ${CPUDIR}/s65816d.inc\ + ${CPUDIR}/saddress.inc ${CPUDIR}/saddrni.inc ${CPUDIR}/se65816.inc\ + macros.mac +${CPUDIR}/memory.o: ${CPUDIR}/memory.asm macros.mac +${CPUDIR}/dma.o: ${CPUDIR}/dma.asm macros.mac +${DOSDIR}/dosintrf.o: ${DOSDIR}/dosintrf.asm macros.mac +vcache.o:vcache.asm macros.mac +${DOSDIR}/initvid.o:${DOSDIR}/initvid.asm macros.mac ${DOSDIR}/vga.inc +${VIDEODIR}/makevid.o: ${VIDEODIR}/makevid.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/makev16b.o: ${VIDEODIR}/makev16b.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/makev16t.o: ${VIDEODIR}/makev16t.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/mv16tms.o: ${VIDEODIR}/mv16tms.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/mode7.o: ${VIDEODIR}/mode7.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode716.o: ${VIDEODIR}/mode716.asm ${VIDEODIR}/mode716.mac\ + macros.mac +${VIDEODIR}/mode716b.o:${VIDEODIR}/mode716b.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode716t.o:${VIDEODIR}/mode716t.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode716d.o:${VIDEODIR}/mode716d.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode7ext.o:${VIDEODIR}/mode7ext.asm macros.mac +${VIDEODIR}/mode716e.o:${VIDEODIR}/mode716e.asm macros.mac +${VIDEODIR}/m716text.o:${VIDEODIR}/m716text.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${CPUDIR}/irq.o: ${CPUDIR}/irq.asm macros.mac +${CPUDIR}/dspproc.o: ${CPUDIR}/dspproc.asm macros.mac +${CPUDIR}/spc700.o:${CPUDIR}/spc700.asm macros.mac\ + ${CPUDIR}/regsw.mac ${CPUDIR}/spcdef.inc ${CPUDIR}/spcaddr.inc +${CPUDIR}/dsp.o: ${CPUDIR}/dsp.asm macros.mac +${DOSDIR}/vesa2.o: ${DOSDIR}/vesa2.asm macros.mac +${DOSDIR}/vesa12.o: ${DOSDIR}/vesa12.asm macros.mac +${DOSDIR}/joy.o: ${DOSDIR}/joy.asm macros.mac +${DOSDIR}/sw.o: ${DOSDIR}/sw.asm macros.mac +${GUIDIR}/gui.o: ${GUIDIR}/gui.asm ${GUIDIR}/guitools.inc\ + ${GUIDIR}/guimisc.inc ${GUIDIR}/guimouse.inc ${GUIDIR}/guiwindp.inc\ + ${GUIDIR}/guinetpl.inc ${GUIDIR}/guikeys.inc ${GUIDIR}/guicheat.inc\ + ${GUIDIR}/guicombo.inc ${GUIDIR}/guiload.inc macros.mac +${GUIDIR}/menu.o: ${GUIDIR}/menu.asm macros.mac +${VIDEODIR}/newgfx.o:${VIDEODIR}/newgfx.asm ${VIDEODIR}/vidmacro.mac\ + ${VIDEODIR}/newgfx2.mac ${VIDEODIR}/newgfx.mac macros.mac +${VIDEODIR}/newgfx2.o:${VIDEODIR}/newgfx2.asm ${VIDEODIR}/newgfxwn.mac\ + ${VIDEODIR}/newgfx.mac macros.mac +${VIDEODIR}/newgfx16.o: ${VIDEODIR}/newgfx16.asm macros.mac ${VIDEODIR}/vidmacro.mac\ + ${VIDEODIR}/newgfx16.mac ${VIDEODIR}/newg162.mac +${VIDEODIR}/newg162.o: macros.mac ${VIDEODIR}/newg162.asm ${VIDEODIR}/newg162.mac\ + ${VIDEODIR}/vidmacro.mac ${VIDEODIR}/newg16wn.mac +${CHIPDIR}/fxemu2.o: ${CHIPDIR}/fxemu2.asm ${CHIPDIR}/fxemu2.mac\ + macros.mac +${CHIPSDIR}/fxemu2b.o: ${CHIPDIR}/fxemu2b.asm ${CHIPDIR}/fxemu2.mac\ + ${CHIPDIR}/fxemu2b.mac +${CHIPSDIR}/fxemu2c.o: ${CHIPDIR}/fxemu2c.asm macros.mac ${CHIPDIR}/fxemu2.mac\ + ${CHIPDIR}/fxemu2b.mac ${CHIPDIR}/fxemu2c.mac +${CHIPDIR}/fxtable.o: ${CHIPDIR}/fxtable.asm macros.mac +${DOSDIR}/gppro.o: ${DOSDIR}/gppro.asm macros.mac +${DOSDIR}/zsipx.o: ${DOSDIR}/zsipx.asm +${CHIPDIR}/sa1proc.o: ${CHIPDIR}/sa1proc.asm macros.mac +endmem.o: endmem.asm macros.mac +${DOSDIR}/modemrtn.o: ${DOSDIR}/modemrtn.asm macros.mac + +clean: + del *.o + del ${CHIPDIR}\*.o + del ${CPUDIR}\*.o + del ${VIDEODIR}\*.o + del ${GUIDIR}\*.o + del ${DOSDIR}\*.o + del ${ZIPDIR}\*.o + del zsnes.exe + diff --git a/zsnes/src/makefile.win b/zsnes/src/makefile.win index 29644bb3..4d6734f1 100644 --- a/zsnes/src/makefile.win +++ b/zsnes/src/makefile.win @@ -1,221 +1,221 @@ -#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. - -#This file depends on link.win32 so if you modify this makefile, -#don't forget to update link.win32 -#it is quite ugly but without that trick, the compilation didn't -#work for me (command line too long) - -#put the correct path to your directx sdk here -DXDIR=c:\mssdk - -CHIPDIR=chips -CPUDIR=cpu -DOSDIR=dos -GUIDIR=gui -VIDEODIR=video -WINDIR=win -OBJDIR=obj -ZIPDIR=zip - -CHIPSOBJ=${CHIPDIR}/sfxproc.obj ${CHIPDIR}/fxemu2.obj ${CHIPDIR}/dsp1proc.obj\ - ${CHIPDIR}/fxemu2b.obj ${CHIPDIR}/fxemu2c.obj ${CHIPDIR}/fxtable.obj\ - ${CHIPDIR}/sa1proc.obj ${CHIPDIR}/sa1regs.obj ${CHIPDIR}/dsp1emu.obj - -CPUOBJ=${CPUDIR}/addrni.obj ${CPUDIR}/dma.obj ${CPUDIR}/dsp.obj ${CPUDIR}/dspproc.obj\ - ${CPUDIR}/execute.obj ${CPUDIR}/irq.obj ${CPUDIR}/memory.obj\ - ${CPUDIR}/spc700.obj ${CPUDIR}/stable.obj ${CPUDIR}/table.obj\ - ${CPUDIR}/tableb.obj ${CPUDIR}/tablec.obj - -GUIOBJ=${GUIDIR}/gui.obj ${GUIDIR}/menu.obj - -VIDEOBJ=${VIDEODIR}/makev16b.obj ${VIDEODIR}/makev16t.obj ${VIDEODIR}/makevid.obj\ - ${VIDEODIR}/mode716.obj ${VIDEODIR}/mode716b.obj ${VIDEODIR}/mode716d.obj\ - ${VIDEODIR}/mode716e.obj ${VIDEODIR}/mode716t.obj ${VIDEODIR}/mode7.obj\ - ${VIDEODIR}/mode7ext.obj ${VIDEODIR}/mv16tms.obj ${VIDEODIR}/newg162.obj\ - ${VIDEODIR}/newgfx16.obj ${VIDEODIR}/newgfx2.obj ${VIDEODIR}/newgfx.obj\ - ${VIDEODIR}/m716text.obj ${VIDEODIR}/2xsaiw.obj\ - ${VIDEODIR}/procvid.obj ${VIDEODIR}/sw_draw.obj - -WINOBJ=${WINDIR}/copyvwin.obj ${WINDIR}/winintrf.obj ${WINDIR}/winlink.obj\ - ${WINDIR}/zloaderw.obj ${WINDIR}/ztcp.obj ${WINDIR}/zipxw.obj\ - ${WINDIR}/zfilew.obj - -WINDOSOBJ=${DOSDIR}/debug.obj ${DOSDIR}/joy.obj ${DOSDIR}/modemrtn.obj ${DOSDIR}/vesa2.obj\ - ${DOSDIR}/initvid.obj ${DOSDIR}/sw.obj ${DOSDIR}/gppro.obj ${DOSDIR}/vesa12.obj\ - ${DOSDIR}/zsipx.obj - -PREOBJ= - -ZIPOBJ=${ZIPDIR}/zzip.obj ${ZIPDIR}/unzip.obj ${ZIPDIR}/zpng.obj - -MAINOBJ=cfgload.obj endmem.obj fixsin.obj init.obj initc.obj ui.obj vcache.obj water.obj smoke.obj burn.obj - -OBJS=${CHIPSOBJ} ${CPUOBJ} ${WINOBJ} ${GUIOBJ} ${VIDEOBJ} ${ZIPOBJ} ${MAINOBJ} ${WINDOSOBJ} -LIBS= -CFLAGS=/Ox /G6 /c /D__WIN32__ -ASM=nasm -ASMFLAGS=-O1 -f win32 -D__WIN32__ -CC=cl - -.SUFFIXES: .c .cpp .asm - -%.obj : %.c - ${CC} ${CFLAGS} /Fo$@ $< - -%.obj: %.cpp - ${CC} ${CFLAGS} /Fo$@ $< - -%.obj: %.asm - ${ASM} ${ASMFLAGS} -o $@ $< - -ALL: zsnesw.exe - -zsnesw.exe: ${OBJS} ${WINDIR}/zsnes.res - cl @link.win32 ${WINDIR}/zsnes.res /link /libpath:${DXDIR}\lib - -${WINDIR}/zsnes.res: ${WINDIR}/zsnes.rc - rc ${WINDIR}/zsnes.rc -${WINDIR}/copyvwin.obj: ${WINDIR}/copyvwin.asm macros.mac -${WINDIR}/winintrf.obj: ${WINDIR}/winintrf.asm macros.mac -${WINDIR}/zfilew.obj: ${WINDIR}/zfilew.c -${WINDIR}/zipxw.obj: ${WINDIR}/zipxw.c -${WINDIR}/zloaderw.obj: ${WINDIR}/zloaderw.c -${WINDIR}/ztcp.obj: ${WINDIR}/ztcp.c -${WINDIR}/winlink.obj: ${WINDIR}/winlink.cpp ${WINDIR}/resource.h -${ZIPDIR}/unzip.obj: ${ZIPDIR}/unzip.c ${ZIPDIR}/zunzip.h -${ZIPDIR}/zzip.obj: ${ZIPDIR}/zzip.c ${ZIPDIR}/zunzip.h -${ZIPDIR}/zpng.obj: ${ZIPDIR}/zpng.c ${ZIPDIR}/zpng.h -${DOSDIR}/initvid.o:${DOSDIR}/initvid.asm macros.mac -${DOSDIR}/modemrtn.o: ${DOSDIR}/modemrtn.asm macros.mac -${DOSDIR}/zsipx.o: ${DOSDIR}/zsipx.asm -${DOSDIR}/debug.obj: ${DOSDIR}/debug.asm macros.mac -${DOSDIR}/joy.obj: ${DOSDIR}/joy.asm macros.mac -${DOSDIR}/vesa2.obj: ${DOSDIR}/vesa2.asm macros.mac -${DOSDIR}/gppro.o: ${DOSDIR}/gppro.asm macros.mac -${DOSDIR}/sw.o: ${DOSDIR}/sw.asm macros.mac -${DOSDIR}/vesa12.o: ${DOSDIR}/vesa12.asm macros.mac -fixsin.obj: fixsin.c -water.obj: water.c -smoke.obj: smoke.c -burn.obj: burn.c -${VIDEODIR}/2xsaiw.obj: ${VIDEODIR}/2xsaiw.asm macros.mac -${VIDEODIR}/procvid.obj: ${VIDEODIR}/procvid.asm macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xSaImmx.inc -${CHIPDIR}/sa1regs.obj: ${CHIPDIR}/sa1regs.asm macros.mac\ - ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac -${CHIPDIR}/sfxproc.obj: ${CHIPDIR}/sfxproc.asm macros.mac\ - ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac - -${CHIPDIR}/dsp1emu.obj: ${CHIPDIR}/dsp1emu.c - ${CC} ${CFLAGS} /Fo$@ $< -${CHIPDIR}/dsp1proc.obj: ${CHIPDIR}/dsp1proc.asm macros.mac -ui.obj: ui.asm macros.mac -cfgload.obj:cfgload.asm macros.mac -init.obj:init.asm macros.mac -initc.obj:initc.c -${DOSDIR}/debug.obj: ${DOSDIR}/debug.asm macros.mac -${CPUDIR}/addrni.obj: ${CPUDIR}/addrni.asm -${CPUDIR}/execute.obj: ${CPUDIR}/execute.asm macros.mac -${CPUDIR}/table.obj: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\ - ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816.inc\ - ${CPUDIR}/regs.mac ${CPUDIR}/regs.inc ${CPUDIR}/regsw.mac\ - ${CPUDIR}/regsw.inc macros.mac -${CPUDIR}/tableb.obj: ${CPUDIR}/tableb.asm ${CPUDIR}/65816db.inc\ - ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816b.inc\ - ${CPUDIR}/regs.mac macros.mac -${CPUDIR}/tablec.obj: ${CPUDIR}/tablec.asm ${CPUDIR}/65816dc.inc\ - ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816c.inc\ - ${CPUDIR}/regs.mac macros.mac -${CPUDIR}/stable.obj: ${CPUDIR}/stable.asm ${CPUDIR}/s65816d.inc\ - ${CPUDIR}/saddress.inc ${CPUDIR}/saddrni.inc ${CPUDIR}/se65816.inc\ - macros.mac -${CPUDIR}/memory.obj: ${CPUDIR}/memory.asm macros.mac -${CPUDIR}/dma.obj: ${CPUDIR}/dma.asm macros.mac -${DOSDIR}/dosintrf.obj: ${DOSDIR}/dosintrf.asm macros.mac -vcache.obj:vcache.asm macros.mac -${DOSDIR}/initvid.obj:${DOSDIR}/initvid.asm macros.mac -${VIDEODIR}/makevid.obj: ${VIDEODIR}/makevid.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/makev16b.obj: ${VIDEODIR}/makev16b.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/makev16t.obj: ${VIDEODIR}/makev16t.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/mv16tms.obj: ${VIDEODIR}/mv16tms.asm ${VIDEODIR}/vidmacro.mac\ - macros.mac -${VIDEODIR}/mode7.obj: ${VIDEODIR}/mode7.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode716.obj: ${VIDEODIR}/mode716.asm ${VIDEODIR}/mode716.mac\ - macros.mac -${VIDEODIR}/mode716b.obj:${VIDEODIR}/mode716b.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode716t.obj:${VIDEODIR}/mode716t.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode716d.obj:${VIDEODIR}/mode716d.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${VIDEODIR}/mode7ext.obj:${VIDEODIR}/mode7ext.asm macros.mac -${VIDEODIR}/mode716e.obj:${VIDEODIR}/mode716e.asm macros.mac -${VIDEODIR}/m716text.obj:${VIDEODIR}/m716text.asm ${VIDEODIR}/mode7.mac\ - macros.mac -${CPUDIR}/irq.obj: ${CPUDIR}/irq.asm macros.mac -${CPUDIR}/dspproc.obj: ${CPUDIR}/dspproc.asm macros.mac -${CPUDIR}/spc700.obj:${CPUDIR}/spc700.asm macros.mac\ - ${CPUDIR}/regsw.mac ${CPUDIR}/spcdef.inc ${CPUDIR}/spcaddr.inc -${CPUDIR}/dsp.obj: ${CPUDIR}/dsp.asm macros.mac -${DOSDIR}/vesa2.obj: ${DOSDIR}/vesa2.asm macros.mac -${DOSDIR}/vesa12.obj: ${DOSDIR}/vesa12.asm macros.mac -${DOSDIR}/joy.obj: ${DOSDIR}/joy.asm macros.mac -${DOSDIR}/sw.obj: ${DOSDIR}/sw.asm macros.mac -${GUIDIR}/gui.obj: ${GUIDIR}/gui.asm ${GUIDIR}/guitools.inc\ - ${GUIDIR}/guimisc.inc ${GUIDIR}/guimouse.inc ${GUIDIR}/guiwindp.inc\ - ${GUIDIR}/guinetpl.inc ${GUIDIR}/guikeys.inc ${GUIDIR}/guicheat.inc\ - ${GUIDIR}/guicombo.inc ${GUIDIR}/guiload.inc macros.mac -${GUIDIR}/menu.obj: ${GUIDIR}/menu.asm macros.mac -${VIDEODIR}/newgfx.obj:${VIDEODIR}/newgfx.asm ${VIDEODIR}/vidmacro.mac\ - ${VIDEODIR}/newgfx2.mac ${VIDEODIR}/newgfx.mac macros.mac -${VIDEODIR}/newgfx2.obj:${VIDEODIR}/newgfx2.asm ${VIDEODIR}/newgfxwn.mac\ - ${VIDEODIR}/newgfx.mac macros.mac -${VIDEODIR}/newgfx16.obj: ${VIDEODIR}/newgfx16.asm macros.mac ${VIDEODIR}/vidmacro.mac\ - ${VIDEODIR}/newgfx16.mac ${VIDEODIR}/newg162.mac -${VIDEODIR}/newg162.obj: macros.mac ${VIDEODIR}/newg162.asm ${VIDEODIR}/newg162.mac\ - ${VIDEODIR}/vidmacro.mac ${VIDEODIR}/newg16wn.mac -${CHIPDIR}/fxemu2.obj: ${CHIPDIR}/fxemu2.asm ${CHIPDIR}/fxemu2.mac\ - macros.mac -${CHIPDIR}/fxemu2b.obj: ${CHIPDIR}/fxemu2b.asm ${CHIPDIR}/fxemu2.mac\ - ${CHIPDIR}/fxemu2b.mac -${CHIPDIR}/fxemu2c.obj: ${CHIPDIR}/fxemu2c.asm macros.mac ${CHIPDIR}/fxemu2.mac\ - ${CHIPDIR}/fxemu2b.mac ${CHIPDIR}/fxemu2c.mac -${CHIPDIR}/fxtable.obj: ${CHIPDIR}/fxtable.asm macros.mac -${DOSDIR}/gppro.obj: ${DOSDIR}/gppro.asm macros.mac -${DOSDIR}/zsipx.obj: ${DOSDIR}/zsipx.asm -${CHIPDIR}/sa1proc.obj: ${CHIPDIR}/sa1proc.asm macros.mac -endmem.obj: endmem.asm macros.mac -${DOSDIR}/modemrtn.obj: ${DOSDIR}/modemrtn.asm macros.mac - -clean: - del *.obj - del ${CHIPDIR}\*.obj - del ${CPUDIR}\*.obj - del ${VIDEODIR}\*.obj - del ${GUIDIR}\*.obj - del ${WINDIR}\*.obj - del ${WINDIR}\zsnes.res - del ${ZIPDIR}\*.obj - del ${DOSDIR}\*.obj - del zsnesw.exe - - - +#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. + +#This file depends on link.win32 so if you modify this makefile, +#don't forget to update link.win32 +#it is quite ugly but without that trick, the compilation didn't +#work for me (command line too long) + +#put the correct path to your directx sdk here +DXDIR=c:\mssdk + +CHIPDIR=chips +CPUDIR=cpu +DOSDIR=dos +GUIDIR=gui +VIDEODIR=video +WINDIR=win +OBJDIR=obj +ZIPDIR=zip + +CHIPSOBJ=${CHIPDIR}/sfxproc.obj ${CHIPDIR}/fxemu2.obj ${CHIPDIR}/dsp1proc.obj\ + ${CHIPDIR}/fxemu2b.obj ${CHIPDIR}/fxemu2c.obj ${CHIPDIR}/fxtable.obj\ + ${CHIPDIR}/sa1proc.obj ${CHIPDIR}/sa1regs.obj ${CHIPDIR}/dsp1emu.obj + +CPUOBJ=${CPUDIR}/addrni.obj ${CPUDIR}/dma.obj ${CPUDIR}/dsp.obj ${CPUDIR}/dspproc.obj\ + ${CPUDIR}/execute.obj ${CPUDIR}/irq.obj ${CPUDIR}/memory.obj\ + ${CPUDIR}/spc700.obj ${CPUDIR}/stable.obj ${CPUDIR}/table.obj\ + ${CPUDIR}/tableb.obj ${CPUDIR}/tablec.obj + +GUIOBJ=${GUIDIR}/gui.obj ${GUIDIR}/menu.obj + +VIDEOBJ=${VIDEODIR}/makev16b.obj ${VIDEODIR}/makev16t.obj ${VIDEODIR}/makevid.obj\ + ${VIDEODIR}/mode716.obj ${VIDEODIR}/mode716b.obj ${VIDEODIR}/mode716d.obj\ + ${VIDEODIR}/mode716e.obj ${VIDEODIR}/mode716t.obj ${VIDEODIR}/mode7.obj\ + ${VIDEODIR}/mode7ext.obj ${VIDEODIR}/mv16tms.obj ${VIDEODIR}/newg162.obj\ + ${VIDEODIR}/newgfx16.obj ${VIDEODIR}/newgfx2.obj ${VIDEODIR}/newgfx.obj\ + ${VIDEODIR}/m716text.obj ${VIDEODIR}/2xsaiw.obj\ + ${VIDEODIR}/procvid.obj ${VIDEODIR}/sw_draw.obj + +WINOBJ=${WINDIR}/copyvwin.obj ${WINDIR}/winintrf.obj ${WINDIR}/winlink.obj\ + ${WINDIR}/zloaderw.obj ${WINDIR}/ztcp.obj ${WINDIR}/zipxw.obj\ + ${WINDIR}/zfilew.obj + +WINDOSOBJ=${DOSDIR}/debug.obj ${DOSDIR}/joy.obj ${DOSDIR}/modemrtn.obj ${DOSDIR}/vesa2.obj\ + ${DOSDIR}/initvid.obj ${DOSDIR}/sw.obj ${DOSDIR}/gppro.obj ${DOSDIR}/vesa12.obj\ + ${DOSDIR}/zsipx.obj + +PREOBJ= + +ZIPOBJ=${ZIPDIR}/zzip.obj ${ZIPDIR}/unzip.obj ${ZIPDIR}/zpng.obj + +MAINOBJ=cfgload.obj endmem.obj fixsin.obj init.obj initc.obj ui.obj vcache.obj water.obj smoke.obj burn.obj + +OBJS=${CHIPSOBJ} ${CPUOBJ} ${WINOBJ} ${GUIOBJ} ${VIDEOBJ} ${ZIPOBJ} ${MAINOBJ} ${WINDOSOBJ} +LIBS= +CFLAGS=/Ox /G6 /c /D__WIN32__ +ASM=nasm +ASMFLAGS=-O1 -f win32 -D__WIN32__ +CC=cl + +.SUFFIXES: .c .cpp .asm + +%.obj : %.c + ${CC} ${CFLAGS} /Fo$@ $< + +%.obj: %.cpp + ${CC} ${CFLAGS} /Fo$@ $< + +%.obj: %.asm + ${ASM} ${ASMFLAGS} -o $@ $< + +ALL: zsnesw.exe + +zsnesw.exe: ${OBJS} ${WINDIR}/zsnes.res + cl @link.win32 ${WINDIR}/zsnes.res /link /libpath:${DXDIR}\lib + +${WINDIR}/zsnes.res: ${WINDIR}/zsnes.rc + rc ${WINDIR}/zsnes.rc +${WINDIR}/copyvwin.obj: ${WINDIR}/copyvwin.asm macros.mac +${WINDIR}/winintrf.obj: ${WINDIR}/winintrf.asm macros.mac +${WINDIR}/zfilew.obj: ${WINDIR}/zfilew.c +${WINDIR}/zipxw.obj: ${WINDIR}/zipxw.c +${WINDIR}/zloaderw.obj: ${WINDIR}/zloaderw.c +${WINDIR}/ztcp.obj: ${WINDIR}/ztcp.c +${WINDIR}/winlink.obj: ${WINDIR}/winlink.cpp ${WINDIR}/resource.h +${ZIPDIR}/unzip.obj: ${ZIPDIR}/unzip.c ${ZIPDIR}/zunzip.h +${ZIPDIR}/zzip.obj: ${ZIPDIR}/zzip.c ${ZIPDIR}/zunzip.h +${ZIPDIR}/zpng.obj: ${ZIPDIR}/zpng.c ${ZIPDIR}/zpng.h +${DOSDIR}/initvid.o:${DOSDIR}/initvid.asm macros.mac +${DOSDIR}/modemrtn.o: ${DOSDIR}/modemrtn.asm macros.mac +${DOSDIR}/zsipx.o: ${DOSDIR}/zsipx.asm +${DOSDIR}/debug.obj: ${DOSDIR}/debug.asm macros.mac +${DOSDIR}/joy.obj: ${DOSDIR}/joy.asm macros.mac +${DOSDIR}/vesa2.obj: ${DOSDIR}/vesa2.asm macros.mac +${DOSDIR}/gppro.o: ${DOSDIR}/gppro.asm macros.mac +${DOSDIR}/sw.o: ${DOSDIR}/sw.asm macros.mac +${DOSDIR}/vesa12.o: ${DOSDIR}/vesa12.asm macros.mac +fixsin.obj: fixsin.c +water.obj: water.c +smoke.obj: smoke.c +burn.obj: burn.c +${VIDEODIR}/2xsaiw.obj: ${VIDEODIR}/2xsaiw.asm macros.mac +${VIDEODIR}/procvid.obj: ${VIDEODIR}/procvid.asm macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xSaImmx.inc +${CHIPDIR}/sa1regs.obj: ${CHIPDIR}/sa1regs.asm macros.mac\ + ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac +${CHIPDIR}/sfxproc.obj: ${CHIPDIR}/sfxproc.asm macros.mac\ + ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac + +${CHIPDIR}/dsp1emu.obj: ${CHIPDIR}/dsp1emu.c + ${CC} ${CFLAGS} /Fo$@ $< +${CHIPDIR}/dsp1proc.obj: ${CHIPDIR}/dsp1proc.asm macros.mac +ui.obj: ui.asm macros.mac +cfgload.obj:cfgload.asm macros.mac +init.obj:init.asm macros.mac +initc.obj:initc.c +${DOSDIR}/debug.obj: ${DOSDIR}/debug.asm macros.mac +${CPUDIR}/addrni.obj: ${CPUDIR}/addrni.asm +${CPUDIR}/execute.obj: ${CPUDIR}/execute.asm macros.mac +${CPUDIR}/table.obj: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\ + ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816.inc\ + ${CPUDIR}/regs.mac ${CPUDIR}/regs.inc ${CPUDIR}/regsw.mac\ + ${CPUDIR}/regsw.inc macros.mac +${CPUDIR}/tableb.obj: ${CPUDIR}/tableb.asm ${CPUDIR}/65816db.inc\ + ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816b.inc\ + ${CPUDIR}/regs.mac macros.mac +${CPUDIR}/tablec.obj: ${CPUDIR}/tablec.asm ${CPUDIR}/65816dc.inc\ + ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816c.inc\ + ${CPUDIR}/regs.mac macros.mac +${CPUDIR}/stable.obj: ${CPUDIR}/stable.asm ${CPUDIR}/s65816d.inc\ + ${CPUDIR}/saddress.inc ${CPUDIR}/saddrni.inc ${CPUDIR}/se65816.inc\ + macros.mac +${CPUDIR}/memory.obj: ${CPUDIR}/memory.asm macros.mac +${CPUDIR}/dma.obj: ${CPUDIR}/dma.asm macros.mac +${DOSDIR}/dosintrf.obj: ${DOSDIR}/dosintrf.asm macros.mac +vcache.obj:vcache.asm macros.mac +${DOSDIR}/initvid.obj:${DOSDIR}/initvid.asm macros.mac +${VIDEODIR}/makevid.obj: ${VIDEODIR}/makevid.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/makev16b.obj: ${VIDEODIR}/makev16b.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/makev16t.obj: ${VIDEODIR}/makev16t.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/mv16tms.obj: ${VIDEODIR}/mv16tms.asm ${VIDEODIR}/vidmacro.mac\ + macros.mac +${VIDEODIR}/mode7.obj: ${VIDEODIR}/mode7.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode716.obj: ${VIDEODIR}/mode716.asm ${VIDEODIR}/mode716.mac\ + macros.mac +${VIDEODIR}/mode716b.obj:${VIDEODIR}/mode716b.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode716t.obj:${VIDEODIR}/mode716t.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode716d.obj:${VIDEODIR}/mode716d.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${VIDEODIR}/mode7ext.obj:${VIDEODIR}/mode7ext.asm macros.mac +${VIDEODIR}/mode716e.obj:${VIDEODIR}/mode716e.asm macros.mac +${VIDEODIR}/m716text.obj:${VIDEODIR}/m716text.asm ${VIDEODIR}/mode7.mac\ + macros.mac +${CPUDIR}/irq.obj: ${CPUDIR}/irq.asm macros.mac +${CPUDIR}/dspproc.obj: ${CPUDIR}/dspproc.asm macros.mac +${CPUDIR}/spc700.obj:${CPUDIR}/spc700.asm macros.mac\ + ${CPUDIR}/regsw.mac ${CPUDIR}/spcdef.inc ${CPUDIR}/spcaddr.inc +${CPUDIR}/dsp.obj: ${CPUDIR}/dsp.asm macros.mac +${DOSDIR}/vesa2.obj: ${DOSDIR}/vesa2.asm macros.mac +${DOSDIR}/vesa12.obj: ${DOSDIR}/vesa12.asm macros.mac +${DOSDIR}/joy.obj: ${DOSDIR}/joy.asm macros.mac +${DOSDIR}/sw.obj: ${DOSDIR}/sw.asm macros.mac +${GUIDIR}/gui.obj: ${GUIDIR}/gui.asm ${GUIDIR}/guitools.inc\ + ${GUIDIR}/guimisc.inc ${GUIDIR}/guimouse.inc ${GUIDIR}/guiwindp.inc\ + ${GUIDIR}/guinetpl.inc ${GUIDIR}/guikeys.inc ${GUIDIR}/guicheat.inc\ + ${GUIDIR}/guicombo.inc ${GUIDIR}/guiload.inc macros.mac +${GUIDIR}/menu.obj: ${GUIDIR}/menu.asm macros.mac +${VIDEODIR}/newgfx.obj:${VIDEODIR}/newgfx.asm ${VIDEODIR}/vidmacro.mac\ + ${VIDEODIR}/newgfx2.mac ${VIDEODIR}/newgfx.mac macros.mac +${VIDEODIR}/newgfx2.obj:${VIDEODIR}/newgfx2.asm ${VIDEODIR}/newgfxwn.mac\ + ${VIDEODIR}/newgfx.mac macros.mac +${VIDEODIR}/newgfx16.obj: ${VIDEODIR}/newgfx16.asm macros.mac ${VIDEODIR}/vidmacro.mac\ + ${VIDEODIR}/newgfx16.mac ${VIDEODIR}/newg162.mac +${VIDEODIR}/newg162.obj: macros.mac ${VIDEODIR}/newg162.asm ${VIDEODIR}/newg162.mac\ + ${VIDEODIR}/vidmacro.mac ${VIDEODIR}/newg16wn.mac +${CHIPDIR}/fxemu2.obj: ${CHIPDIR}/fxemu2.asm ${CHIPDIR}/fxemu2.mac\ + macros.mac +${CHIPDIR}/fxemu2b.obj: ${CHIPDIR}/fxemu2b.asm ${CHIPDIR}/fxemu2.mac\ + ${CHIPDIR}/fxemu2b.mac +${CHIPDIR}/fxemu2c.obj: ${CHIPDIR}/fxemu2c.asm macros.mac ${CHIPDIR}/fxemu2.mac\ + ${CHIPDIR}/fxemu2b.mac ${CHIPDIR}/fxemu2c.mac +${CHIPDIR}/fxtable.obj: ${CHIPDIR}/fxtable.asm macros.mac +${DOSDIR}/gppro.obj: ${DOSDIR}/gppro.asm macros.mac +${DOSDIR}/zsipx.obj: ${DOSDIR}/zsipx.asm +${CHIPDIR}/sa1proc.obj: ${CHIPDIR}/sa1proc.asm macros.mac +endmem.obj: endmem.asm macros.mac +${DOSDIR}/modemrtn.obj: ${DOSDIR}/modemrtn.asm macros.mac + +clean: + del *.obj + del ${CHIPDIR}\*.obj + del ${CPUDIR}\*.obj + del ${VIDEODIR}\*.obj + del ${GUIDIR}\*.obj + del ${WINDIR}\*.obj + del ${WINDIR}\zsnes.res + del ${ZIPDIR}\*.obj + del ${DOSDIR}\*.obj + del zsnesw.exe + + +