From e427bd55eaed673c940649e43a83bb5febf57db3 Mon Sep 17 00:00:00 2001 From: n-a-c-h <> Date: Wed, 9 Jul 2003 21:02:33 +0000 Subject: [PATCH] Major updates! --- zsnes/src/Makefile.in | 365 +- zsnes/src/gui/gui.asm | 11134 +++++++++++++++--------------- zsnes/src/gui/guiload.inc | 3262 +++++---- zsnes/src/init.asm | 13144 ++++++++++++++++++------------------ zsnes/src/initc.c | 318 + zsnes/src/makefile.dos | 397 +- zsnes/src/makefile.win | 441 +- 7 files changed, 14485 insertions(+), 14576 deletions(-) create mode 100755 zsnes/src/initc.c diff --git a/zsnes/src/Makefile.in b/zsnes/src/Makefile.in index f11d5faf..fa61627e 100644 --- a/zsnes/src/Makefile.in +++ b/zsnes/src/Makefile.in @@ -1,182 +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 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 -${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 610aecb9..521c51b1 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 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 ea1b9f07..ba5052be 100644 --- a/zsnes/src/gui/guiload.inc +++ b/zsnes/src/gui/guiload.inc @@ -1,1662 +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 CheckROMType - cmp byte[ROMTypeNOTFound],0 - je .foundromtype - mov byte[romtype],1 -.foundromtype - call SetIRQVectors - call ClearScreen - cmp byte[cbitmode],0 - jne .nomakepal - call makepal -.nomakepal - ; get sram size - mov esi,[romdata] - add esi,7FD8h - cmp byte[romtype],2 - jne .nohirom2 - add esi,8000h -.nohirom2 - 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 al,1 - jbe .nopal - cmp al,0Dh - je .nopal - mov byte[romispal],1 - mov word[totlines],314 - mov dword[MsgCount],100 -.nopal - 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 07ab5a7f..bcd023b6 100644 --- a/zsnes/src/init.asm +++ b/zsnes/src/init.asm @@ -1,6747 +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 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,32704+22 - cmp byte[romtype],2 - jne .nohirom2b - add esi,8000h -.nohirom2b - mov byte[MultiTap],1 - cmp byte[pl12s34],1 - je .nomtap - cmp byte[pl3contrl],0 - jne .mtap - cmp byte[pl4contrl],0 - jne .mtap - cmp byte[pl5contrl],0 - jne .mtap -.nomtap - mov byte[MultiTap],0 -.mtap - - 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 - ; 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 - -NEWSYM UnInterleave - pushad - - ; NumofBanks contains # of 32k banks - - ; make table 2 (0 .. 255) - mov edi,mode7tab+256 - mov ecx,256 - xor al,al -.nextlb2 - mov [edi],al - inc al - inc edi - dec ecx - jnz .nextlb2 - - mov eax,[NumofBanks] - shr eax,1 - mov edi,mode7tab+256 - mov ecx,eax - mov bl,al - xor bh,bh -.nextl - mov [edi],bl - mov [edi+1],bh - inc bl - inc bh - add edi,2 - dec ecx - jnz .nextl - - call SwapTable256 - popad - ret - -SwapTable256: - ; make table 1 (0 .. 255) - mov edi,mode7tab - mov ecx,256 - xor al,al -.nextlb - mov [edi],al - inc al - inc edi - dec ecx - jnz .nextlb - - xor eax,eax - xor ebx,ebx - ; sort memory - ; start at first entry in table 2 - mov esi,mode7tab+256 - mov ecx,[NumofBanks] - shr ecx,1 - add ecx,ecx -.nextentry - ; find which blocks to swap - ; search entry from table 2 in table 1 - mov al,[esi] - mov edi,mode7tab -.findnext - mov bl,[edi] - cmp bl,al - je .foundit - inc edi - jmp .findnext -.foundit - mov bl,[esi-256] - mov [esi-256],al - mov [edi],bl - - mov eax,edi - add eax,256 - cmp eax,esi - je near .skipthis - - mov eax,esi - sub eax,mode7tab+256 - mov ebx,edi - sub ebx,mode7tab - ; swap blocks at memory location $200000+al*8000h with $200000+bl*8000h - shl eax,15 - add eax,[romdata] - shl ebx,15 - add ebx,[romdata] - push esi - mov esi,eax - mov edi,ebx - mov edx,2000h -.loopa - mov eax,[esi] - mov ebx,[edi] - mov [esi],ebx - mov [edi],eax - add esi,4 - add edi,4 - dec edx - jnz .loopa - pop esi -.skipthis - xor eax,eax - xor ebx,ebx - inc esi - dec ecx - jnz near .nextentry -.endthis - call Makemode7Table - ret - -;******************************************************* -; Copy execloop -;******************************************************* - -NEWSYM copyexecloop - ret - -;******************************************************* -; Process execloop -;******************************************************* -NEWSYM procexecloop - cmp byte[spcon],0 - jne .noprocloop - mov byte[curexecstate],1 - ret -.noprocloop - mov byte[curexecstate],3 - ret - -;******************************************************* -; Change execloop -;******************************************************* -NEWSYM changeexecloop - ret - -;******************************************************* -; Clear Memory -;******************************************************* -;vidbuffera resb 131072 -;romdataa resb 4194304+32768+2097152 -;wramdataa resb 65536 -;ram7fa resb 65536 -;vrama resb 65536 -;srama resb 32768 -;debugbufa resb 80000 -;regptra resb 49152 -;regptwa resb 49152 -;vcache2ba resb 262144 -;vcache4ba resb 131072 -;vcache8ba resb 65536 - -%macro helpclearmem2 2 - mov edi,%1 - mov ecx,%2 - rep stosd -%endmacro - - -NEWSYM clearmem - xor eax,eax - helpclearmem [vidbuffer], 131072 - helpclearmem wramdataa, 65536 - helpclearmem ram7fa, 65536 - helpclearmem [vram], 65536 - helpclearmem srama, 65536 - helpclearmem debugbufa, 80000 - helpclearmem regptra, 49152 - helpclearmem regptwa, 49152 - helpclearmem [vcache2b], 262144 - helpclearmem [vcache4b], 131072 - helpclearmem [vcache8b], 65536 - helpclearmem vidmemch2, 4096 - helpclearmem vidmemch4, 4096 - helpclearmem vidmemch8, 4096 - helpclearmem pal16b, 1024 - helpclearmem pal16bcl, 1024 - helpclearmem pal16bclha, 1024 - mov eax,0FFFFh - helpclearmem2 pal16bxcl, 256 - xor al,al - mov al,0FFh - mov edi,[romdata] - mov ecx,4194304+32768 - cmp byte[Sup48mbit],0 - je .no48mb - add ecx,2097152 -.no48mb - cmp byte[Sup16mbit],0 - je .no16mb - sub ecx,2097152 -.no16mb - rep stosb -; ret -NEWSYM clearmem2 - mov edi,[sram] - mov eax,0FFFFFFFFh - mov ecx,8192*2 - rep stosd - mov al,0FFh - mov edi,spcRam - mov ecx,65472 - rep stosb - ret - -;******************************************************* -; Print Hexadecimal (16-bit/8-bit) -;******************************************************* -NEWSYM printhex - mov ecx,4 - xor ebx,ebx -.loopa - mov bx,ax - and bx,0F000h - shr bx,12 - mov dl,[.hexdat+ebx] - push ax - mov ah,02h - call Output_Text - pop ax - shl ax,4 - 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 -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 - - ; mirror image - mov eax,[.curromspace] - cmp dword[.maxromspace],eax - jbe .nomir - mov edx,[romdata] - mov ebx,[romdata] - add edx,[.curromspace] - mov ecx,[.curromspace] -.nextmir - mov al,[ebx] - mov [edx],al - inc ebx - inc edx - inc ecx - cmp ecx,[.maxromspace] - jne .nextmir - .nomir - - ; calculate checksum - mov eax,1 -.nextcr - add eax,eax - cmp eax,[.curromspace] - jb .nextcr - - mov ecx,eax - mov esi,[romdata] - xor eax,eax - xor ebx,ebx - xor edi,edi - mov edx,ecx - shr edx,1 -.nextcs - mov al,[esi+edi] - inc edi - add ebx,eax - cmp edi,[.curromspace] - jne .notcrs - mov edi,edx -.notcrs - dec ecx - jnz .nextcs - mov [Checksumvalue],bx - - mov esi,[romdata] - mov ecx,[.curfileofs] - xor eax,eax - xor ebx,ebx - xor edi,edi -.nextcs3 - mov al,[esi+edi] - inc edi - add ebx,eax - cmp edi,ecx - jne .nextcs3 - mov [Checksumvalue2],bx - - - 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] - cmp byte[NumofBanks],128 - jbe .notEHi1 - mov ax,word[esi + 040FFDEh] - xor ax,word[esi + 040FFDCh] - cmp ax,0FFFFh - jne .notEHi1 - add esi,040FFC0h - mov dword[CSStatus2+23], 'EHi ' - jmp .nohiromrn -.notEHi1 - add esi,7FC0h - mov dword[CSStatus2+23], 'Lo ' - cmp byte[romtype],2 - jne .nohiromrn - mov dword[CSStatus2+23], 'Hi ' - add esi,8000h -.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' - ;Get checksum of header alone for subtraction - sub esi,41 - xor eax,eax - mov ecx,48 -.bssubloop - movzx ebx,byte[esi] - add ax,bx - inc esi - dec ecx - jnz .bssubloop - mov bx,[Checksumvalue] - sub bx,ax - mov [Checksumvalue],bx - ;dummy out date so CRC32 matches - sub esi,10 - 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 - - mov esi,[romdata] - cmp byte[NumofBanks],128 - jbe .notEHi2 - mov ax,word[esi + 040FFDEh] - xor ax,word[esi + 040FFDCh] - cmp ax,0FFFFh - jne .notEHi2 - add esi,040FFDEh - jmp .nohirom3 -.notEHi2 - add esi,7FDEh - cmp byte[romtype],2 - jne .nohirom3 - add esi,8000h -.nohirom3 - mov ax,[Checksumvalue] - cmp ax,[esi] - jne .failed -.passed2 - mov dword[CSStatus2+36],'OK ' - jmp .passed -.failed - mov ax,[Checksumvalue2] - cmp byte[SPC7110Enable],1 - jne .nospc7110en - cmp byte[NumofBanks],96 - jne .nospc7110en - shl ax,1 -.nospc7110en - cmp ax,[esi] - je .passed2 - mov dword[CSStatus2+36],'FAIL' -.passed - cmp byte[NumofBanks],128 - jbe .notopint - mov esi,[romdata] - mov ax,word[esi + 0207FDEh] - xor ax,word[esi + 0207FDCh] - cmp ax,0FFFFh - jne .notopint - mov dword[CSStatus2+12],'Yes ' - mov dword[CSStatus3+32],'????' - mov dword[CSStatus3+36],'????' - mov dword[CSStatus2+23], 'EHi ' - cmp word[Checksumvalue2],047C9h - jne .notopint - mov dword[CSStatus2+36],'OK ' -.notopint - 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 - -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,7FC0h - cmp byte[romtype],2 - jne .nohirom2 - add esi,8000h -.nohirom2 - mov ecx,21 -.loopb - lodsb - mov dl,al - mov ah,2 - call Output_Text - 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 - -NEWSYM CheckROMType - call SetAddressingModes - call GenerateBank0Table - - mov byte[intldone],0 - mov byte[ROMTypeNOTFound],0 - ; check reset vectors -; RES Hardware 00FFFC.D 00FFFC,D 1 - mov esi,[romdata] - mov ax,[esi+0FFFCh] - mov bx,[esi+07FFCh] - cmp bx,8000h - jne .notrv1 - cmp ax,8011h - je .yeslorom -.notrv1 - test ax,8000h - jnz .checkloarea - test bx,8000h - jz .notfound2 -.yeslorom - mov byte[romtype],1 - jmp .donecheck -.checkloarea - test bx,8000h - jnz .notfound2 - mov byte[romtype],2 - jmp .donecheck -.notfound2 - - mov esi,[romdata] - add esi,7FECh -; cmp word[esi],8000h -; jb .checkhirom - mov esi,[romdata] - add esi,32704+23 - cmp byte[esi],32 - ja .checkhirom - mov esi,[romdata] - add esi,7FDCh - lodsw - mov bx,ax - lodsw - xor bx,ax - cmp bx,0FFFFh - jne .checkhirom - cmp ax,0 - je .checkhirom - cmp ax,0FFFFh - je .checkhirom - mov byte[romtype],1 - jmp .donecheck -.checkhirom - mov esi,[romdata] - add esi,32704+23+32768 - cmp byte[esi],32 - ja .cantcheck - mov esi,[romdata] - add esi,0FFDCh - lodsw - mov bx,ax - lodsw - xor bx,ax - cmp bx,0FFFFh - jne .cantcheck - mov byte[romtype],2 - jmp .donecheck -.cantcheck - ; check for a header with mostly letters or spaces - mov esi,[romdata] - add esi,32704 - mov ecx,21 - mov al,0 -.nextletter - cmp byte[esi],32 - je .yesletter - cmp byte[esi],'0' - jb .noletter - cmp byte[esi],'9' - jbe .yesletter - cmp byte[esi],'A' - jb .noletter - cmp byte[esi],'Z' - jbe .yesletter - cmp byte[esi],'a' - jb .noletter - cmp byte[esi],'z' - ja .noletter -.yesletter - inc al -.noletter - inc esi - dec ecx - jnz .nextletter - cmp al,12 - jna .checkhiromletter - mov byte[romtype],1 - jmp .donecheck -.checkhiromletter - mov esi,[romdata] - add esi,65472 - mov ecx,21 - mov al,0 -.nextletterb - cmp byte[esi],32 - je .yesletterb - cmp byte[esi],'0' - jb .noletterb - cmp byte[esi],'9' - jbe .yesletterb - cmp byte[esi],'A' - jb .noletterb - cmp byte[esi],'Z' - jbe .yesletterb - cmp byte[esi],'a' - jb .noletterb - cmp byte[esi],'z' - ja .noletterb -.yesletterb - inc al -.noletterb - inc esi - dec ecx - jnz .nextletterb - cmp al,12 - jna .notfound - mov byte[romtype],2 - jmp .donecheck -.notfound - - mov esi,[romdata] - mov ax,[esi+0FFFCh] - mov bx,[esi+07FFCh] - cmp ax,8000h - jne .checkloarea8000 - cmp bx,8000h - je .notfound28000 - mov byte[romtype],2 - jmp .donecheck -.checkloarea8000 - cmp bx,8000h - jne .notfound28000 - mov byte[romtype],1 - jmp .donecheck -.notfound28000 - - mov byte[ROMTypeNOTFound],1 -.donecheck - - cmp byte[ForceHiLoROM],0 - je .noguiforce - mov al,[ForceHiLoROM] - mov byte[forceromtype],al - xor al,al -.noguiforce - - cmp byte[forceromtype],0 - je .noforce - mov al,[forceromtype] - mov [romtype],al - mov byte[forceromtype],0 - mov byte[ROMTypeNOTFound],0 -.noforce - - - ; Interleave Detection - mov byte[Interleaved],0 - cmp byte[NumofBanks],128 - ja near .nointerlcheck - - ;LoROM interleaved check - mov esi,[romdata] - add esi,07FDCh ;Checksum area - mov bx,[esi] - xor bx,[esi + 2] - cmp bx,0FFFFh ;Good LoROM? - je .interlcheck2 ;Forget it then - mov eax,[NumofBanks] - imul eax,32768 - shr eax,1 - add esi,eax ;Add midpoint - mov bx,[esi] - xor bx,[esi + 2] - cmp bx,0FFFFh - jne .interlcheck2 - sub esi,3 ;Country code - cmp byte[esi],14 - jae .interlcheck2 - jmp .interleaved - - ;HiROM interleaved check -.interlcheck2 - mov esi,[romdata] - add esi,07FDCh ;Checksum area - mov bx,[esi] - xor bx,[esi + 2] - cmp bx,0FFFFh - jne near .nointerlcheck - sub esi,3 ;Country code - cmp byte[esi],14 - jae .nointerlcheck - sub esi,4 ;ROM makeup - cmp byte[esi],33 - je .overflowcheck - cmp byte[esi],49 - je .overflowcheck - cmp byte[esi],53 - je .overflowcheck - cmp byte[esi],58 - je .overflowcheck - jmp .nointerlcheck - -.overflowcheck - mov edx,[esi] - dec esi - cmp byte[esi],32 - je .interleaved - cmp byte[esi],dl - je .nointerlcheck - dec esi - cmp byte[esi],dl - je .nointerlcheck - dec esi - cmp byte[esi],dl - je .nointerlcheck - dec esi - cmp byte[esi],dl - je .nointerlcheck - -.interleaved - cmp byte[finterleave],1 - je .doneinterl -.interleaved2 - mov byte[intldone],1 - call UnInterleave - mov byte[Interleaved],1 - mov byte[romtype],2 - jmp .doneinterl -.nointerlcheck - cmp byte[finterleave],1 - je .interleaved2 -.doneinterl - - mov esi,[romdata] - add esi,0FFC0h - mov byte[disablespcclr],0 - mov eax,50205040h - or eax,0A000302h - cmp dword[esi],eax - jne .nospcdis - mov byte[disablespcclr],1 -.nospcdis - ; 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] - cmp byte[NumofBanks],128 - jbe .notEHi - mov ax,word[esi + 040FFDEh] - xor ax,word[esi + 040FFDCh] - cmp ax,0FFFFh - jne .notEHi - add esi,040FFD5h - jmp .cntnchpdtct -.notEHi - cmp byte[romtype],2 ;HiROM? - jne .nohirom2b - add esi,0FFD5h - jmp .cntnchpdtct -.nohirom2b - add esi,07FD5h -.cntnchpdtct - 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,32704+21 - cmp byte[romtype],2 - jne .nohirom9 - add esi,8000h -.nohirom9 - mov al,[esi] - test al,0F0h - jnz .yesfastrom - mov al,[opexec268] - mov [opexec358],al - mov al,[opexec268cph] - mov [opexec358cph],al - mov al,[cycpb268] - mov [cycpb358],al -.yesfastrom - mov esi,[romdata] - add esi,7FE4h - cmp byte[romtype],2 - jne .nohirom - add esi,8000h -.nohirom - cmp word[esi+24],0FFFFh - jne .notreseterror - mov word[esi+6],0FF9Ch - mov word[esi+24],0FF80h -.notreseterror - lodsw - mov [copv],ax - lodsw - mov [brkv],ax - lodsw - mov [abortv],ax - lodsw - mov [nmiv],ax - mov [nmiv2],ax - add esi,2 - lodsw - mov [irqv],ax - mov [irqv2],ax - add esi,4 - ; 8-bit and reset - lodsw - mov [copv8],ax - inc esi - inc esi - lodsw - mov [abortv8],ax - lodsw - mov [nmiv8],ax - lodsw - mov [resetv],ax - lodsw - mov [brkv8],ax - mov [irqv8],ax - cmp byte[yesoutofmemory],0 - je .notfailed - mov word[resetv],8000h - mov esi,[romdata] - mov word[esi],0FE80h - mov word[esi+8000h],0FE80h -.notfailed - ret - -NEWSYM outofmemfix - mov esi,[romdata] - cmp byte[romtype],2 - je .hirom - mov word[resetv],8000h - mov word[xpc],8000h - mov byte[esi],58h - mov byte[esi+1],80h - mov byte[esi+2],0FEh - mov dword[Msgptr],outofmemoryerror - cmp byte[newgfx16b],1 - jne .notso - mov dword[Msgptr],outofmemoryerror2 -.notso - mov dword[MessageOn],0FFFFFFFFh - ret -.hirom - add esi,8000h - mov word[resetv],8000h - mov word[xpc],8000h - mov byte[esi],58h - mov byte[esi+1],80h - mov byte[esi+2],0FEh - mov dword[Msgptr],outofmemoryerror - cmp byte[newgfx16b],1 - jne .notso2 - mov dword[Msgptr],outofmemoryerror2 -.notso2 - mov dword[MessageOn],0FFFFFFFFh - ret - -SECTION .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/initc.c b/zsnes/src/initc.c new file mode 100755 index 00000000..afa0d840 --- /dev/null +++ b/zsnes/src/initc.c @@ -0,0 +1,318 @@ +/* +Copyright (C) 2003 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. +*/ + +//C++ style code in C +#define bool unsigned char +#define true 1 +#define false 0 + +#define Lo 0x7FC0 +#define Hi 0xFFC0 +#define EHi 0x40FFC0 + + +//I want to port over the more complicated +//functions from init.asm, or replace with +//better versions from NSRT. -Nach + + +//init.asm goodnes +extern unsigned int NumofBanks; +extern unsigned int NumofBytes; +extern unsigned int *romdata; +extern unsigned char romtype; +extern unsigned char Interleaved; + + + + + +unsigned int infoloc; + +//Deinterleave functions +bool validChecksum(unsigned char *ROM, int BankLoc) +{ + if (ROM[BankLoc + 28] + (ROM[BankLoc + 29] << 8) + + ROM[BankLoc + 30] + (ROM[BankLoc + 31] << 8) == 0xFFFF) + { + return(true); + } + return(false); +} + +void swapBlocks(char *blocks) +{ + int i,j,k; + for (i = 0; i < NumofBanks; i++) + { + for (j = 0; j < NumofBanks; j++) + { + if (blocks[j] == i) + { + char b; + unsigned int temp, + *loc1 = romdata + blocks[i]*0x2000, + *loc2 = romdata + blocks[j]*0x2000; + for (k = 0; k < 0x2000; k++) + { + temp = loc1[k]; + loc1[k] = loc2[k]; + loc2[k] = temp; + } + b = blocks[j]; + blocks[j] = blocks[i]; + blocks[i] = b; + break; + } + } + } +} + +void deintlv1() +{ + int i, numblocks = NumofBanks/2; + char blocks[256]; + for (i = 0; i < numblocks; i++) + { + blocks[i * 2] = i + numblocks; + blocks[i * 2 + 1] = i; + } + swapBlocks(blocks); +} + +void CheckIntl1(unsigned char *ROM) +{ + unsigned int ROMmidPoint = NumofBytes / 2; + if (validChecksum(ROM, ROMmidPoint + Lo) && + !validChecksum(ROM, Lo) && + ROM[ROMmidPoint+Lo+25] < 14) //Country Code + { + deintlv1(); + Interleaved = true; + } + else if (validChecksum(ROM, Lo) && !validChecksum(ROM, Hi) && + ROM[Lo+25] < 14 && //Country code + //Rom make up + (ROM[Lo+21] == 33 || ROM[Lo+21] == 49 || ROM[Lo+21] == 53)) + { + if (ROM[Lo+20] == 32 ||//Check that Header name did not overflow + !(ROM[Lo+21] == ROM[Lo+20] || ROM[Lo+21] == ROM[Lo+19] || + ROM[Lo+21] == ROM[Lo+18] || ROM[Lo+21] == ROM[Lo+17])) + { + deintlv1(); + Interleaved = true; + } + } +} + +//It would be nice to find a way to eliminate the 2MB here +//Then we can also drop the includes of these two +#include +#include +void deintToP() +{ + int i; + char blocks[256]; + char *ROM = (char *)romdata; + char *ROMSwap = (char *)malloc(0x200000); + if (ROMSwap) + { + memmove(ROMSwap, ROM, 0x200000); //Copy Small ROM to RAM + memmove(ROM, &ROM[0x200000], 0x400000); //Move Large ROM to front + memmove(&ROM[0x400000], ROMSwap, 0x200000); //Place Small ROM after + free(ROMSwap); + } + + //Deinterleave the 4MB ROM first + NumofBanks = 128; + deintlv1(); + + //Now the 2MB one + NumofBanks = 64; + romdata += 0x100000; //Ofset pointer + deintlv1(); + + //Now fix the data and we're done + NumofBanks = 192; + romdata -= 0x100000; +} + + +//ROM loading functions, which some strangly enough were in guiload.inc +bool AllASCII(char *b, int size) +{ + int i; + for (i = 0; i < size; i++) + { + if (b[i] < 32 || b[i] > 126) + { + return(false); + } + } + return(true); +} + +int InfoScore(char *Buffer) +{ + int score = 0; + if (Buffer[26] == 0x33) { score += 2; } + if ((Buffer[21] & 0xf) < 4) { score += 2; } + if (!(Buffer[61] & 0x80)) { score -= 4; } + if ((1 << (Buffer[23] - 7)) > 48) { score -= 1; } + if (Buffer[25] < 14) { score += 1; } + if (!AllASCII(Buffer, 20)) { score -= 1; } + return(score); +} + +extern unsigned char ForceHiLoROM; +extern unsigned char forceromtype; + +void BankCheck() +{ + unsigned char *ROM = (unsigned char *)romdata; + infoloc = 0; + Interleaved = false; + + if (NumofBytes >= 0x500000) + { + if (validChecksum(ROM, 0x207FC0)) + { + deintToP(); + Interleaved = true; + } + if (validChecksum(ROM, EHi)) + { + romtype = 2; + infoloc = EHi; + } + } + + if (!infoloc) + { + int loscore, hiscore; + + //Deinterleave if neccesary + CheckIntl1(ROM); + + loscore = InfoScore(ROM+Lo); + if (validChecksum(ROM, Lo)) { loscore += 3; } + + hiscore = InfoScore(ROM+Hi); + if (validChecksum(ROM, Hi)) { hiscore += 3; } + + switch(ROM[Lo + 21]) + { + case 32: case 35: case 48: case 50: + case 128: case 156: case 176: case 188: case 252: //BS + loscore += 1; + break; + } + switch(ROM[Hi + 21]) + { + case 33: case 49: case 53: + case 128: case 156: case 176: case 188: case 252: //BS + hiscore += 1; + break; + } + + if(ForceHiLoROM) + { + //asm volatile("int $3"); + if (forceromtype == 1) { loscore += 50; } + else if (forceromtype == 2) { hiscore += 50; } + } + + if (hiscore > loscore) + { + romtype = 2; + infoloc = Hi; + } + else + { + romtype = 1; + infoloc = Lo; + } + } + +} + + +//Checksum functions +unsigned short sum(unsigned char *array, unsigned int size) +{ + unsigned short theSum = 0; + unsigned int i; + for (i = 0; i < size; i++) + { + theSum += array[i]; + } + return(theSum); +} + +//Not entirely accurate pow, but good for our needs and very fast +unsigned int npow(register unsigned int base, register unsigned int exponent) +{ + register unsigned int total = base; + register unsigned int i; + for (i = 1; i < exponent; i++) + { + total *= base; + } + return(total); +} + +extern unsigned char SPC7110Enable; +extern unsigned char BSEnable; +extern unsigned short Checksumvalue; +void CalcChecksum() +{ + unsigned char *ROM = (unsigned char *)romdata; + unsigned short Mbit = NumofBanks >> 2, Checksum; + unsigned int ROMSize = NumofBytes; + unsigned int Bank = infoloc; + + + if ((Mbit == 10 || Mbit == 20 || Mbit == 40) && !SPC7110Enable) + { + unsigned int P1Size = npow(2, ROM[Bank + 23] - 7) * 65536; + unsigned short part1 = sum(ROM, P1Size), + part2 = sum(ROM+P1Size, ROMSize-P1Size); + Checksumvalue = part1 + part2*4; + } + else if ((Mbit == 12 || Mbit == 24 || Mbit == 48) && !SPC7110Enable) + { + unsigned int P1Size = npow(2, ROM[Bank + 23] - 7) * 65536; + unsigned short part1 = sum(ROM, P1Size), + part2 = sum(ROM+P1Size, ROMSize-P1Size); + Checksumvalue = part1 + part2 + part2; + } + else + { + Checksumvalue = sum(ROM, ROMSize); + if (BSEnable) + { + Checksumvalue -= sum(&ROM[Bank - 16], 48); //Fix for BS Dumps + } + else if (Mbit == 24) + { + Checksumvalue += Checksumvalue; //Fix for 24Mb SPC7110 ROMs + } + } +} + diff --git a/zsnes/src/makefile.dos b/zsnes/src/makefile.dos index 2db3c0a5..30686ebf 100644 --- a/zsnes/src/makefile.dos +++ b/zsnes/src/makefile.dos @@ -1,198 +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 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 -${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 c88bdb3d..29644bb3 100644 --- a/zsnes/src/makefile.win +++ b/zsnes/src/makefile.win @@ -1,220 +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 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 -${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 + + +