diff --git a/zsnes/src/Makefile.in b/zsnes/src/Makefile.in index b63da08f..5a19a82b 100644 --- a/zsnes/src/Makefile.in +++ b/zsnes/src/Makefile.in @@ -36,9 +36,9 @@ CHIPSOBJ=${CHIPDIR}/sfxproc.o ${CHIPDIR}/fxemu2.o ${CHIPDIR}/dsp1proc.o\ ${CHIPDIR}/sdd1emu.o ${CHIPDIR}/c4emu.o CPUOBJ=${CPUDIR}/addrni.o ${CPUDIR}/dma.o ${CPUDIR}/dsp.o ${CPUDIR}/dspproc.o\ - ${CPUDIR}/execute.o ${CPUDIR}/executec.o ${CPUDIR}/irq.o\ - ${CPUDIR}/memory.o ${CPUDIR}/spc700.o ${CPUDIR}/stable.o\ - ${CPUDIR}/table.o ${CPUDIR}/tableb.o ${CPUDIR}/tablec.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 ${CPUDIR}/zstate.o GUIOBJ=${GUIDIR}/gui.o ${GUIDIR}/menu.o @@ -48,7 +48,7 @@ VIDEOBJ=${VIDEODIR}/makev16b.o ${VIDEODIR}/makev16t.o ${VIDEODIR}/makevid.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\ + ${VIDEODIR}/procvid.o ${VIDEODIR}/procvidc.o ${VIDEODIR}/sw_draw.o\ ${VIDEODIR}/hq2x16.o ${VIDEODIR}/hq2x32.o\ ${VIDEODIR}/hq3x16.o ${VIDEODIR}/hq3x32.o\ ${VIDEODIR}/hq4x16.o ${VIDEODIR}/hq4x32.o @@ -96,6 +96,7 @@ ${EFFECTSDIR}/water.o: ${EFFECTSDIR}/water.c ${EFFECTSDIR}/fixsin.h gblhdr.h ${EFFECTSDIR}/smoke.o: ${EFFECTSDIR}/smoke.c ${EFFECTSDIR}/burn.o: ${EFFECTSDIR}/burn.c ${VIDEODIR}/procvid.o: ${VIDEODIR}/procvid.asm macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xsaimmx.inc +${VIDEODIR}/procvidc.o: ${VIDEODIR}/procvidc.c ${VIDEODIR}/sw_draw.obj: ${VIDEODIR}/sw_draw.asm macros.mac ${VIDEODIR}/hq2x16.obj: ${VIDEODIR}/hq2x16.asm macros.mac ${VIDEODIR}/hq2x32.obj: ${VIDEODIR}/hq2x32.asm macros.mac @@ -124,7 +125,7 @@ version.o:version.c ${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac ${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac -${CPUDIR}/executec.o: ${CPUDIR}/executec.c +${CPUDIR}/zstate.o: ${CPUDIR}/zstate.c ${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\ diff --git a/zsnes/src/cfgload.c b/zsnes/src/cfgload.c index e77e34f1..96483921 100644 --- a/zsnes/src/cfgload.c +++ b/zsnes/src/cfgload.c @@ -446,20 +446,21 @@ void DOScreatenewcfg() #endif #ifdef __LINUX__ #ifdef __OPENGL__ - WRITE_LINE("; Video Mode, 0 - 15\r\n"); + WRITE_LINE("; Video Mode, 0 - 18\r\n"); #else WRITE_LINE("; Video Mode, 0 - 3\r\n"); #endif WRITE_LINE("; 0 = 256x224 R WIN 1 = 256x224 R FULL\r\n"); WRITE_LINE("; 2 = 512x448 DR WIN 3 = 640x480 DS FULL\r\n"); #ifdef __OPENGL__ - WRITE_LINE("; 4 = 256x224 OR WIN 5 = 512x448 ODR WIN\r\n"); - WRITE_LINE("; 6 = 640x480 ODS FULL 7 = 640x480 ODS WIN\r\n"); - WRITE_LINE("; 8 = 640x576 ODR WIN 9 = 768x672 ODR WIN\r\n"); - WRITE_LINE("; 10 = 800x600 ODS FULL 11 = 800x600 ODS WIN\r\n"); - WRITE_LINE("; 12 = 896x784 ODR WIN 13 = 1024x768 ODS FULL\r\n"); - WRITE_LINE("; 14 = 1024x768 ODS WIN 15 = 1024x896 ODR WIN\r\n"); - WRITE_LINE("; 16 = 1280x1024 ODS FULL 17 = VARIABLE ODR WIN\r\n"); + WRITE_LINE("; 4 = 256x224 OR WIN 5 = 512x448 ODR WIN\r\n"); + WRITE_LINE("; 6 = 640x480 ODS FULL 7 = 640x480 ODS WIN\r\n"); + WRITE_LINE("; 8 = 640x576 ODR WIN 9 = 768x672 ODR WIN\r\n"); + WRITE_LINE("; 10 = 800x600 ODS FULL 11 = 800x600 ODS WIN\r\n"); + WRITE_LINE("; 12 = 896x784 ODR WIN 13 = 1024x768 ODS FULL\r\n"); + WRITE_LINE("; 14 = 1024x768 ODS WIN 15 = 1024x896 ODR WIN\r\n"); + WRITE_LINE("; 16 = 1280x1024 ODS FULL 17 = 1600x1200 ODR FULL\r\n"); + WRITE_LINE("; 18 = VARIABLE ODS WIN\r\n"); #endif sprintf(buffer, "\r\nVideoModeLin = %d\r\n\r\n", cfgcvidmode); SAVE_LINE(buffer); diff --git a/zsnes/src/chips/sa1regs.asm b/zsnes/src/chips/sa1regs.asm index a04740ed..6da6cbdf 100644 --- a/zsnes/src/chips/sa1regs.asm +++ b/zsnes/src/chips/sa1regs.asm @@ -1569,50 +1569,6 @@ NEWSYM %1 ret %endmacro -NEWSYM RestoreSA1 - mov eax,[romdata] - add [SA1RegPCS],eax - add [CurBWPtr],eax - add [SA1BWPtr],eax - add [SNSBWPtr],eax - cmp byte[SA1Stat],1 - jne .notsa1stat - mov dword[SA1RegPCS],IRAM -.notsa1stat - cmp byte[SA1Stat],2 - jne .notsa1stat2 - mov dword[SA1RegPCS],IRAM-3000h -.notsa1stat2 - mov eax,[SA1RegPCS] - add [SA1Ptr],eax - mov eax,[romdata] - add eax,4096*1024 - mov [SA1RAMArea],eax - pushad - call UpdateBanks - popad - ret - -NEWSYM SaveSA1 - mov byte[SA1Stat],0 - mov eax,[SA1RegPCS] - sub [SA1Ptr],eax - cmp dword[SA1RegPCS],IRAM - jne .notiram - mov byte[SA1Stat],1 -.notiram - cmp dword[SA1RegPCS],IRAM-3000h - jne .notiram2 - mov byte[SA1Stat],2 -.notiram2 - mov eax,[romdata] - sub [SA1RegPCS],eax - sub [CurBWPtr],eax - sub [SA1BWPtr],eax - sub [SNSBWPtr],eax - ret - - NEWSYM SA1Reset mov byte[SA1IRQData+1],0 mov byte[SA1Mode],0 @@ -1649,20 +1605,6 @@ NEWSYM SA1Reset mov word[SA1Overflow],0 ret -NEWSYM UpdateBanks - cmp byte[SA1BankSw],1 - jne .noswap - mov al,[SA1BankVal] - call sa12220w - mov al,[SA1BankVal+1] - call sa12221w - mov al,[SA1BankVal+2] - call sa12222w - mov al,[SA1BankVal+3] - call sa12223w -.noswap - ret - NEWSYM UpdateBanksSDD1 pushad cmp dword[SDD1BankA],0 diff --git a/zsnes/src/cpu/dspproc.asm b/zsnes/src/cpu/dspproc.asm index f6fa86ac..cc27964b 100644 --- a/zsnes/src/cpu/dspproc.asm +++ b/zsnes/src/cpu/dspproc.asm @@ -2732,61 +2732,6 @@ dspconvb equ marksave-Voice0Freq NEWSYM PHdspsave, dd dspsave NEWSYM PHdspconvb, dd dspconvb -section .text - -NEWSYM PrepareSaveState - push edi - mov edi,[Voice0BufPtr] - sub edi,[spcBuffera] - mov [Voice0BufPtr],edi - mov edi,[Voice1BufPtr] - sub edi,[spcBuffera] - mov [Voice1BufPtr],edi - mov edi,[Voice2BufPtr] - sub edi,[spcBuffera] - mov [Voice2BufPtr],edi - mov edi,[Voice3BufPtr] - sub edi,[spcBuffera] - mov [Voice3BufPtr],edi - mov edi,[Voice4BufPtr] - sub edi,[spcBuffera] - mov [Voice4BufPtr],edi - mov edi,[Voice5BufPtr] - sub edi,[spcBuffera] - mov [Voice5BufPtr],edi - mov edi,[Voice6BufPtr] - sub edi,[spcBuffera] - mov [Voice6BufPtr],edi - mov edi,[Voice7BufPtr] - sub edi,[spcBuffera] - mov [Voice7BufPtr],edi - pop edi - ret - -%macro ResState 1 - mov edi,%1 - add edi,[spcBuffera] - mov eax,[spcBuffera] - add eax,65536*4 - cmp edi,eax - jb %%noof - mov edi,[spcBuffera] -%%noof - mov %1,edi -%endmacro -NEWSYM ResetState - push edi - ResState [Voice0BufPtr] - ResState [Voice1BufPtr] - ResState [Voice2BufPtr] - ResState [Voice3BufPtr] - ResState [Voice4BufPtr] - ResState [Voice5BufPtr] - ResState [Voice6BufPtr] - ResState [Voice7BufPtr] - pop edi - ret - SECTION .bss spc700temp resd 2 SECTION .text diff --git a/zsnes/src/cpu/execute.asm b/zsnes/src/cpu/execute.asm index e105b8ee..cab33af8 100644 --- a/zsnes/src/cpu/execute.asm +++ b/zsnes/src/cpu/execute.asm @@ -23,7 +23,7 @@ EXTSYM StringLength EXTSYM Get_Time EXTSYM objhipr -EXTSYM KeyRewind +EXTSYM KeyRewind, statesaver EXTSYM xa,timer2upd,prevoamptr,ReadHead EXTSYM prevedi,SA1xpc,SA1RAMArea,sa1dmaptr EXTSYM DSP1COp,C4WFXVal,C41FXVal,Op00Multiplicand,Op10Coefficient,Op04Angle @@ -585,7 +585,9 @@ NetSaveState: mov byte[csounddisable],1 .skipsoundreinit + pushad call statesaver + popad ; initialize variables (Copy from variables) call UpdateDPage @@ -1192,191 +1194,8 @@ NEWSYM HIRQNextExe, db 0 SECTION .data NEWSYM firstsaveinc, db 0 - -SECTION .text - -NEWSYM statesaver - clim - - sub dword[Curtableaddr],tableA - sub dword[spcPCRam],spcRam - sub dword[spcRamDP],spcRam - call PrepareSaveState - call unpackfunct - - ; Auto increment save state slot - - cmp byte[AutoIncSaveSlot],0 - je .donesaveinc - cmp byte[firstsaveinc],1 - je .clearfirstinc - mov eax,[statefileloc] - mov dh,[fnamest+eax] - cmp dh,'t' - je .secondstate - cmp dh,'9' - je .jumptofirststate - inc dh - jmp .donextstate -.secondstate - mov dh,'1' - jmp .donextstate -.jumptofirststate - mov dh,'t' -.donextstate - mov byte[fnamest+eax],dh - xor dh,dh - jmp .donesaveinc -.clearfirstinc - mov byte[firstsaveinc],0 -.donesaveinc - -; jmp .skipsaves - ; Save State -%ifdef __LINUX__ - pushad - call SRAMChdir - popad -%endif - mov edx,fnamest+1 - call Create_File - jc near .nosavestuff - ; Save 65816 status, etc. - mov bx,ax - mov ecx,[PHnum2writecpureg] - mov edx,zsmesg - call Write_File - mov ecx,8 - mov edx,cycpbl - call Write_File - ; Save SNES PPU Register status - mov ecx,3019 - mov edx,sndrot - call Write_File - ; Save RAM (WRAM(128k),VRAM(64k),SRAM) -; xor ecx,ecx -; mov cx,[ramsize] - mov ecx,65536+65536 - mov edx,[wramdata] - call Write_File - mov ecx,65536 - mov edx,[vram] - call Write_File - cmp byte[spcon],0 - je .nospcon - ; Save SPC stuff - mov ecx,[PHspcsave] - mov edx,spcRam - call Write_File - ; Save DSP stuff - mov ecx,[PHdspsave] - mov edx,BRRBuffer - call Write_File - ; Save DSP Mem - mov ecx,256 - mov edx,DSPMem - call Write_File -.nospcon - cmp byte[C4Enable],1 - jne .noc4 - mov ecx,2000h - mov edx,[C4Ram] - call Write_File -.noc4 - cmp byte[SFXEnable],1 - jne .nosfx - mov ecx,[SfxCROM] - sub [SfxRomBuffer],ecx - mov ecx,[SfxRAMMem] - sub [SfxLastRamAdr],ecx - mov ecx,65536*2 - mov edx,[sfxramdata] - call Write_File - ; uncomment the following - mov ecx,[PHnum2writesfxreg] - mov edx,SfxR0 - call Write_File - mov ecx,[SfxCROM] - add [SfxRomBuffer],ecx - mov ecx,[SfxRAMMem] - add [SfxLastRamAdr],ecx -.nosfx - - cmp byte[SETAEnable],1 - jne .noseta - mov ecx,4096 - mov edx,[setaramdata] - call Write_File -.noseta - - cmp byte[SPC7110Enable],1 - jne .nospc7110 - mov edx,[romdata] - add edx,510000h - mov ecx,65536 - call Write_File - mov edx,SPCMultA - mov ecx,[PHnum2writespc7110reg] - call Write_File -.nospc7110 - cmp byte[SA1Enable],1 - jne .nossa1 - ; Convert SA-1 stuff to standard, non displacement format - call SaveSA1 - mov ecx,[PHnum2writesa1reg] - mov edx,SA1Mode - call Write_File - mov ecx,65536*2 - mov edx,[SA1RAMArea] - call Write_File - ; Convert back SA-1 stuff - call RestoreSA1 -.nossa1 - cmp byte[cbitmode],0 - je .nocapturepicture - cmp byte[NoPictureSave],1 - je .nocapturepicture - call CapturePicture - mov ecx,64*56*2 - mov edx,PrevPicture - call Write_File -.nocapturepicture - - call Close_File - add dword[Curtableaddr],tableA - add dword[spcPCRam],spcRam - add dword[spcRamDP],spcRam - call ResetState - stim - - ; Get the state number - mov ebx,[statefileloc] - mov cl,[fnamest+ebx] - cmp cl,'t' - jne .writewhichstate - mov cl,'0' -.writewhichstate - mov [.savemsg+6],cl - - mov dword[Msgptr],.savemsg - mov eax,[MsgCount] - mov [MessageOn],eax - ret - -.nosavestuff - add dword[Curtableaddr],tableA - add dword[spcPCRam],spcRam - add dword[spcRamDP],spcRam - call ResetState - stim - mov dword[Msgptr],.savemsgfail - mov eax,[MsgCount] - mov [MessageOn],eax - ret - -SECTION .data -.savemsg db 'STATE - SAVED.',0 -.savemsgfail db 'UNABLE TO SAVE.',0 +NEWSYM txtsavemsg, db 'STATE - SAVED.',0 +NEWSYM txtsavemsgfail, db 'UNABLE TO SAVE.',0 SECTION .text NEWSYM savestate @@ -1410,7 +1229,9 @@ NEWSYM savestate mov byte[pressed+1],0 mov eax,[KeySaveState] mov byte[pressed+eax],2 + pushad call statesaver + popad jmp reexecuteb SECTION .data @@ -1545,9 +1366,9 @@ NEWSYM stateloader mov edx,[SA1RAMArea] call Read_File ; Convert back SA-1 stuff - push ebx + pushad call RestoreSA1 - pop ebx + popad call SA1UpdateDPage .nossa1 cmp byte[SDD1Enable],1 @@ -1678,7 +1499,9 @@ NEWSYM loadstate add dword[Curtableaddr],tableA add dword[spcPCRam],spcRam add dword[spcRamDP],spcRam + pushad call ResetState + popad call procexecloop stim jmp reexecuteb @@ -1714,7 +1537,9 @@ NEWSYM loadstate3 add dword[Curtableaddr],tableA add dword[spcPCRam],spcRam add dword[spcRamDP],spcRam + pushad call ResetState + popad call procexecloop ret .nofile diff --git a/zsnes/src/cpu/regsw.inc b/zsnes/src/cpu/regsw.inc index 9418b71f..3199ee26 100644 --- a/zsnes/src/cpu/regsw.inc +++ b/zsnes/src/cpu/regsw.inc @@ -291,28 +291,6 @@ NEWSYM initregw ; video memory change buffer for caching (65536/16=4096) ;vidmemch2, vidmemch4, vidmemch8. 4096 bytes each - -NEWSYM unpackfunct - mov ebx,[oamaddr] - mov [oamaddrt],bx - - mov ax,[xa] - mov [xat],ax - mov al,[xdb] - mov [xdbt],al - mov al,[xpb] - mov [xpbt],al - mov ax,[xs] - mov [xst],ax - mov ax,[xd] - mov [xdt],ax - mov ax,[xx] - mov [xxt],ax - mov ax,[xy] - mov [xyt],ax - ret - - NEWSYM repackfunct ; Global/Echo Volumes mov al,[DSPMem+0Ch] diff --git a/zsnes/src/cpu/zstate.c b/zsnes/src/cpu/zstate.c new file mode 100755 index 00000000..a8276681 --- /dev/null +++ b/zsnes/src/cpu/zstate.c @@ -0,0 +1,540 @@ +/* +Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach ) + +http://www.zsnes.com +http://sourceforge.net/projects/zsnes + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +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. +*/ + + + +#ifdef __LINUX__ +#include "gblhdr.h" +#define DIR_SLASH "/" +#else +#include +#include +#include +#define DIR_SLASH "\\" +#endif + +#ifdef __MSDOS__ +#define clim() __asm__ __volatile__ ("cli"); +#define stim() __asm__ __volatile__ ("sti"); +#else +#define clim() +#define stim() +#endif + +#define memcpyinc(dest, src, size) memcpy(dest, src, size); dest += size; +#define memcpyrinc(src, dest, size) memcpy(dest, src, size); src += size; + +/*Let's start converting stuff from execute.asm ^_^; +Big thanks to Nach, TRAC and anomie for helping me out on porting !!*/ + +extern unsigned int CBackupPos, PHnum2writecpureg, cycpbl; +extern unsigned int *wramdata, *vram, PHspcsave, *C4Ram, *sfxramdata; +extern unsigned int PHnum2writesa1reg, SA1Mode, prevedi, SA1xpc; +extern unsigned int sa1dmaptr, soundcycleft, spc700read, timer2upd, xa; +extern unsigned int spcnumread, spchalted, opcd, HIRQCycNext, oamaddr; +extern unsigned int ReadHead, *setaramdata, ramsize, *sram; +extern unsigned int tempesi, tempedi, tempedx, tempebp; + +extern unsigned char *StateBackup, zsmesg[26], sndrot, spcon, spcRam[65472]; +extern unsigned char DSPMem[256], C4Enable, SFXEnable, SA1Enable, SA1Status; +extern unsigned char *SA1RAMArea, DSP1Type, DSP1COp, prevoamptr, SETAEnable; + +extern short C4WFXVal, C41FXVal, Op00Multiplicand, Op04Angle, Op08X, Op18X; +extern short Op28X, Op0CA, Op02FX, Op0AVS, Op06X, Op01m, Op0DX, Op03F, Op14Zr; +extern short Op0EH; +extern signed short Op10Coefficient; + +void BackupCVFrame() +{ + unsigned char *curpos; + + curpos = StateBackup + (CBackupPos << 19) + 1024; + memcpyinc (curpos, zsmesg, PHnum2writecpureg); + memcpyinc (curpos, &cycpbl, 2*4); + memcpyinc (curpos, &sndrot, 3019); + memcpyinc (curpos, wramdata, 8192*16); + memcpyinc (curpos, vram, 4096*16); + + if (spcon) + { + memcpyinc (curpos, spcRam, PHspcsave); + memcpyinc (curpos, DSPMem, 16*16); + } + + if (C4Enable) { memcpyinc (curpos, C4Ram, 2048*4); } + + if (SFXEnable) { memcpyinc (curpos, sfxramdata, 8192*16); } + + if (SA1Enable) + { + memcpyinc (curpos, &SA1Mode, PHnum2writesa1reg); + memcpyinc (curpos, SA1RAMArea, 8192*16); + memcpyinc (curpos, &SA1Status, 3); + memcpyinc (curpos, &prevedi, 1*4); + memcpyinc (curpos, &SA1xpc, 1*4); + memcpyinc (curpos, &SA1RAMArea, 6*4); + memcpyinc (curpos, &sa1dmaptr, 2*4); + } + + if (DSP1Type) + { + memcpyinc (curpos, &DSP1COp, 70+128); + memcpyinc (curpos, &C4WFXVal, 7*4+7*8+128); + memcpyinc (curpos, &C41FXVal, 5*4+128); + memcpyinc (curpos, &Op00Multiplicand, 3*4+128); + memcpyinc (curpos, &Op10Coefficient, 4*4+128); + memcpyinc (curpos, &Op04Angle, 4*4+128); + memcpyinc (curpos, &Op08X, 5*4+128); + memcpyinc (curpos, &Op18X, 5*4+128); + memcpyinc (curpos, &Op28X, 4*4+128); + memcpyinc (curpos, &Op0CA, 5*4+128); + memcpyinc (curpos, &Op02FX, 11*4+3*4+28*8+128); + memcpyinc (curpos, &Op0AVS, 5*4+14*8+128); + memcpyinc (curpos, &Op06X, 6*4+10*8+4+128); + memcpyinc (curpos, &Op01m, 4*4+128); + memcpyinc (curpos, &Op0DX, 6*4+128); + memcpyinc (curpos, &Op03F, 6*4+128); + memcpyinc (curpos, &Op14Zr, 9*4+128); + memcpyinc (curpos, &Op0EH, 4*4+128); + } + + memcpyinc (curpos, &soundcycleft, 33); + memcpyinc (curpos, &spc700read, 10*4); + memcpyinc (curpos, &timer2upd, 1*4); + memcpyinc (curpos, &xa, 14*4); + memcpyinc (curpos, &spcnumread, 4); + memcpyinc (curpos, &spchalted, 4); + memcpyinc (curpos, &opcd, 6*4); + memcpyinc (curpos, &HIRQCycNext, 5); + memcpyinc (curpos, &oamaddr, 14*4); + memcpyinc (curpos, &prevoamptr, 1); + memcpyinc (curpos, &ReadHead, 1*4); + + if (SETAEnable) { memcpyinc (curpos, setaramdata, 256*16); } + + memcpyinc (curpos, sram, ramsize); + memcpyinc (curpos, &tempesi, 4); + memcpyinc (curpos, &tempedi, 4); + memcpyinc (curpos, &tempedx, 4); + memcpyinc (curpos, &tempebp, 4); +} + +extern unsigned int Bank0datr8[256], Bank0datr16[256], Bank0datw8[256]; +extern unsigned int Bank0datw16[256], xd, DPageR8, DPageR16, DPageW8; +extern unsigned int DPageW16; + +void UpdateDPageC() +{ + DPageR8 = Bank0datr8[(xd >> 8) & 0xFF]; + DPageR16 = Bank0datr16[(xd >> 8) & 0xFF]; + DPageW8 = Bank0datw8[(xd >> 8) & 0xFF]; + DPageW16 = Bank0datw16[(xd >> 8) & 0xFF]; +} + +extern unsigned int SA1xd, SA1DPageR8, SA1DPageR16, SA1DPageW8, SA1DPageW16; + +void SA1UpdateDPageC() +{ + SA1DPageR8 = Bank0datr8[(SA1xd >> 8) & 0xFF]; + SA1DPageR16 = Bank0datr16[(SA1xd >> 8) & 0xFF]; + SA1DPageW8 = Bank0datw8[(SA1xd >> 8) & 0xFF]; + SA1DPageW16 = Bank0datw16[(SA1xd >> 8) & 0xFF]; +} + +extern unsigned int PBackupPos; + +void RestoreCVFrame() +{ + unsigned char *curpos; + + curpos = StateBackup + (PBackupPos << 19) + 1024; + memcpyrinc (curpos, zsmesg, PHnum2writecpureg); + memcpyrinc (curpos, &cycpbl, 2*4); + memcpyrinc (curpos, &sndrot, 3019); + memcpyrinc (curpos, wramdata, 8192*16); + memcpyrinc (curpos, vram, 4096*16); + + if (spcon) + { + memcpyrinc (curpos, spcRam, PHspcsave); + memcpyrinc (curpos, DSPMem, 16*16); + } + + if (C4Enable) { memcpyrinc (curpos, C4Ram, 2048*4); } + + if (SFXEnable) { memcpyrinc (curpos, sfxramdata, 8192*16); } + + if (SA1Enable) + { + memcpyrinc (curpos, &SA1Mode, PHnum2writesa1reg); + memcpyrinc (curpos, SA1RAMArea, 8192*16); + memcpyrinc (curpos, &SA1Status, 3); + memcpyrinc (curpos, &prevedi, 1*4); + memcpyrinc (curpos, &SA1xpc, 1*4); + memcpyrinc (curpos, &SA1RAMArea, 6*4); + memcpyrinc (curpos, &sa1dmaptr, 2*4); + } + + if (DSP1Type) + { + memcpyrinc (curpos, &DSP1COp, 70+128); + memcpyrinc (curpos, &C4WFXVal, 7*4+7*8+128); + memcpyrinc (curpos, &C41FXVal, 5*4+128); + memcpyrinc (curpos, &Op00Multiplicand, 3*4+128); + memcpyrinc (curpos, &Op10Coefficient, 4*4+128); + memcpyrinc (curpos, &Op04Angle, 4*4+128); + memcpyrinc (curpos, &Op08X, 5*4+128); + memcpyrinc (curpos, &Op18X, 5*4+128); + memcpyrinc (curpos, &Op28X, 4*4+128); + memcpyrinc (curpos, &Op0CA, 5*4+128); + memcpyrinc (curpos, &Op02FX, 11*4+3*4+28*8+128); + memcpyrinc (curpos, &Op0AVS, 5*4+14*8+128); + memcpyrinc (curpos, &Op06X, 6*4+10*8+4+128); + memcpyrinc (curpos, &Op01m, 4*4+128); + memcpyrinc (curpos, &Op0DX, 6*4+128); + memcpyrinc (curpos, &Op03F, 6*4+128); + memcpyrinc (curpos, &Op14Zr, 9*4+128); + memcpyrinc (curpos, &Op0EH, 4*4+128); + } + + memcpyrinc (curpos, &soundcycleft, 33); + memcpyrinc (curpos, &spc700read, 10*4); + memcpyrinc (curpos, &timer2upd, 1*4); + memcpyrinc (curpos, &xa, 14*4); + memcpyrinc (curpos, &spcnumread, 4); + memcpyrinc (curpos, &spchalted, 4); + memcpyrinc (curpos, &opcd, 6*4); + memcpyrinc (curpos, &HIRQCycNext, 5); + memcpyrinc (curpos, &oamaddr, 14*4); + memcpyrinc (curpos, &prevoamptr, 1); + memcpyrinc (curpos, &ReadHead, 1*4); + + if (SETAEnable) { memcpyrinc (curpos, setaramdata, 256*16); } + + memcpyrinc (curpos, sram, ramsize); + memcpyrinc (curpos, &tempesi, 4); + memcpyrinc (curpos, &tempedi, 4); + memcpyrinc (curpos, &tempedx, 4); + memcpyrinc (curpos, &tempebp, 4); + + UpdateDPageC(); + SA1UpdateDPageC(); +} + +extern unsigned int spcBuffera; +extern unsigned int Voice0BufPtr, Voice1BufPtr, Voice2BufPtr, Voice3BufPtr; +extern unsigned int Voice4BufPtr, Voice5BufPtr, Voice6BufPtr, Voice7BufPtr; + +void PrepareSaveState() +{ + Voice0BufPtr -= spcBuffera; + Voice1BufPtr -= spcBuffera; + Voice2BufPtr -= spcBuffera; + Voice3BufPtr -= spcBuffera; + Voice4BufPtr -= spcBuffera; + Voice5BufPtr -= spcBuffera; + Voice6BufPtr -= spcBuffera; + Voice7BufPtr -= spcBuffera; +} + +extern unsigned int xdb, xpb, xs, xx, xy; +extern unsigned short oamaddrt, xat, xst, xdt, xxt, xyt; +extern unsigned char xdbt, xpbt; + +void unpackfunct() +{ + oamaddrt = (oamaddr & 0xFFFF); + xat = (xa & 0xFFFF); + xdbt = (xdb & 0xFF); + xpbt = (xpb & 0xFF); + xst = (xs & 0xFFFF); + xdt = (xd & 0xFFFF); + xxt = (xx & 0xFFFF); + xyt = (xy & 0xFFFF); +} + +extern unsigned int SA1Stat; +extern unsigned char IRAM[2049], *SA1Ptr, *SA1RegPCS, *CurBWPtr, *SA1BWPtr; +extern unsigned char *SNSBWPtr, *romdata; + +void SaveSA1() +{ + unsigned int off1=(unsigned int)SA1RegPCS, off2=(unsigned int)romdata; + + SA1Stat &= 0xFFFFFF00; + SA1Ptr -= off1; + + if (SA1RegPCS == IRAM) + { + SA1Stat = (SA1Stat & 0xFFFFFF00) + 1; + } + + if (SA1RegPCS == IRAM-0x3000) + { + SA1Stat = (SA1Stat & 0xFFFFFF00) + 2; + } + + SA1RegPCS -= off2; + CurBWPtr -= off2; + SA1BWPtr -= off2; + SNSBWPtr -= off2; +} + +extern unsigned int NumofBanks, snesmmap[256], snesmap2[256]; +extern unsigned char SA1BankVal[4]; + +void BankSwitchC (unsigned char bank, unsigned short offset1, unsigned int offset2, unsigned int pointer) +{ + unsigned int curbankval=SA1BankVal[bank], membankval, i; + + if ((NumofBanks & 0xFF) == 64) { curbankval &= 1 ; } + + curbankval &= 7; + curbankval <<= 20; + + if (SA1BankVal[bank] & 0x80) + { + membankval = (pointer + (unsigned int)romdata - 0x8000); + } + else + { + membankval = (curbankval + (unsigned int)romdata - 0x8000); + } + + for (i=0 ; i<32 ; i++) + { + snesmmap[offset1+i] = membankval; + membankval += 0x8000; + } + + membankval = curbankval + (unsigned int)romdata; + + for (i=0 ; i<16 ; i++) + { + snesmap2[offset2+i] = membankval; + snesmmap[offset2+i] = membankval; + membankval += 0x10000; + } +} + +extern unsigned int SA1BankSw; + +void UpdateBanks() +{ + if ((SA1BankSw & 0xFF) == 1) + { + BankSwitchC (0, 0x000, 0x0C0, 0x000000) ; + BankSwitchC (1, 0x020, 0x0D0, 0x100000) ; + BankSwitchC (2, 0x080, 0x0E0, 0x200000) ; + BankSwitchC (3, 0x0A0, 0x0F0, 0x300000) ; + } +} + +void RestoreSA1() +{ + unsigned int off1, off2=(unsigned int)romdata; + + SA1RegPCS += off2; + CurBWPtr += off2; + SA1BWPtr += off2; + SNSBWPtr += off2; + + if ((SA1Stat & 0xFF) == 1) + { + SA1RegPCS = IRAM; + } + + if ((SA1Stat & 0xFF) == 2) + { + SA1RegPCS = IRAM-0x3000; + } + + off1 = (unsigned int)SA1RegPCS; + SA1Ptr += off1; + SA1RAMArea = romdata + 4096*1024; + + UpdateBanks(); +} + +#define ResState(Voice_BufPtr) \ + Voice_BufPtr += spcBuffera; \ + if (Voice_BufPtr >= spcBuffera + 65536*4) \ + { \ + Voice_BufPtr = spcBuffera; \ + } + +void ResetState() +{ + ResState(Voice0BufPtr); + ResState(Voice1BufPtr); + ResState(Voice2BufPtr); + ResState(Voice3BufPtr); + ResState(Voice4BufPtr); + ResState(Voice5BufPtr); + ResState(Voice6BufPtr); + ResState(Voice7BufPtr); +} + +extern unsigned int Curtableaddr, tableA[256], spcPCRam, spcRamDP; +extern unsigned int statefileloc, CurrentHandle, PHdspsave, SfxRomBuffer; +extern unsigned int SfxCROM, SfxLastRamAdr, SfxRAMMem, PHnum2writesfxreg; +extern unsigned int *SfxR0, *SPCMultA, PHnum2writespc7110reg; +extern unsigned int MsgCount, MessageOn; + +extern unsigned char AutoIncSaveSlot, firstsaveinc, fnamest[512], BRRBuffer[32]; +extern unsigned char SPC7110Enable, cbitmode, NoPictureSave, txtsavemsg[15]; +extern unsigned char *Msgptr, txtsavemsgfail[16]; + +extern unsigned short PrevPicture[64*56]; + +FILE *fhandle; +void SRAMChdir(); +void CapturePicture(); + +void statesaver() +{ + unsigned int offst; + + clim(); + + offst = (unsigned int)tableA; + Curtableaddr -= offst; + offst = (unsigned int)spcRam; + spcPCRam -= offst; + spcRamDP -= offst; + + PrepareSaveState(); + unpackfunct(); + +// 'Auto increment savestate slot' code + + if (AutoIncSaveSlot) + { + if (firstsaveinc) + { + firstsaveinc = 0; + } + else + { + switch (fnamest[statefileloc]) + { + case 't': + fnamest[statefileloc] = '1'; + break; + case '9': + fnamest[statefileloc] = 't'; + break; + default: + fnamest[statefileloc]++; + } + } + } + +// Save State code + + #ifdef __LINUX__ + SRAMChdir() ; + #endif + + if ((fhandle = fopen(fnamest+1,"wb")) != NULL) + { + // Save 65816 status, etc. + + fwrite (zsmesg, 1, PHnum2writecpureg, fhandle); + fwrite (&cycpbl, 1, 2*4, fhandle); + fwrite (&sndrot, 1, 3019, fhandle); // Save SNES PPU Register status + fwrite (wramdata, 1, 8192*16, fhandle); + fwrite (vram, 1, 4096*16, fhandle); + + if (spcon) // SPC stuff, DSP stuff + { + fwrite (spcRam, 1, PHspcsave, fhandle); + fwrite (BRRBuffer, 1, PHdspsave, fhandle); + fwrite (DSPMem, 1, 16*16, fhandle); + } + + if (C4Enable) { fwrite (C4Ram, 1, 2048*4, fhandle); } + + if (SFXEnable) + { + SfxRomBuffer -= SfxCROM; + SfxLastRamAdr -= SfxRAMMem; + fwrite (sfxramdata, 1, 8192*16, fhandle); + fwrite (SfxR0, 1, PHnum2writesfxreg, fhandle); + SfxRomBuffer += SfxCROM; + SfxLastRamAdr += SfxRAMMem; + } + + if (SETAEnable) { fwrite (setaramdata, 1, 256*16, fhandle); } + + if (SPC7110Enable) + { + fwrite (romdata+0x510000, 1, 65536, fhandle); + fwrite (SPCMultA, 1, PHnum2writespc7110reg, fhandle); + } + + if (SA1Enable) + { + SaveSA1();// Convert SA-1 stuff to standard, non displacement format + + fwrite (&SA1Mode, 1, PHnum2writesa1reg, fhandle); + fwrite (SA1RAMArea, 1, 8192*16, fhandle); + + RestoreSA1(); // Convert back SA-1 stuff + } + + if (cbitmode && !NoPictureSave) + { + CapturePicture(); + + fwrite (PrevPicture, 1, 64*56*2, fhandle); + } + + fclose (fhandle); + + if (fnamest[statefileloc] == 't') + { + txtsavemsg[6]='0'; + } + else + { + txtsavemsg[6]=fnamest[statefileloc]; + } + + Msgptr = txtsavemsg; + MessageOn = MsgCount; + } + else + { + Msgptr = txtsavemsgfail; + MessageOn = MsgCount; + } + + offst = (unsigned int)tableA; + Curtableaddr += offst; + offst = (unsigned int)spcRam; + spcPCRam += offst; + spcRamDP += offst; + + ResetState(); + stim(); +} diff --git a/zsnes/src/dos/debug.asm b/zsnes/src/dos/debug.asm index 45cc9e34..0b2cff0c 100644 --- a/zsnes/src/dos/debug.asm +++ b/zsnes/src/dos/debug.asm @@ -173,7 +173,9 @@ NEWSYM loadtempstuff call Close_File add dword[spcPCRam],spcRam add dword[spcRamDP],spcRam + pushad call ResetState + popad ret mov dword[spcPCRam],0 xor eax,eax @@ -435,13 +437,17 @@ NEWSYM debugloadstate add dword[Curtableaddr],tableA add dword[spcPCRam],spcRam add dword[spcRamDP],spcRam + pushad call ResetState + popad call procexecloop .nofile jmp debugloopa NEWSYM debugsavestate + pushad call statesaver + popad jmp debugloopb ;******************************************************* diff --git a/zsnes/src/gui/gui.asm b/zsnes/src/gui/gui.asm index b5fafee2..61d8d770 100644 --- a/zsnes/src/gui/gui.asm +++ b/zsnes/src/gui/gui.asm @@ -3677,7 +3677,9 @@ GUIProcStates: popad cmp byte[GUIStatesText5],1 je .loadstate + pushad call statesaver + popad jmp .changedir .loadstate cmp byte[CNetType],20 @@ -3698,9 +3700,9 @@ SaveSecondState: mov ebx,[statefileloc] mov al,[fnamest+ebx] mov byte[fnamest+ebx],'s' - push eax + pushad call statesaver - pop eax + popad mov ebx,[statefileloc] mov [fnamest+ebx],al call ChangetoLOADdir diff --git a/zsnes/src/gui/guimisc.inc b/zsnes/src/gui/guimisc.inc index 110fb79a..d756ef59 100644 --- a/zsnes/src/gui/guimisc.inc +++ b/zsnes/src/gui/guimisc.inc @@ -62,7 +62,9 @@ MovieRecord: mov byte[NoPictureSave],1 cmp byte[MovieProcessing],0 jne .nostatesaver + pushad call statesaver + popad .nostatesaver mov byte[NoPictureSave],0 mov edx,fnamest+1 diff --git a/zsnes/src/gui/guitools.inc b/zsnes/src/gui/guitools.inc index 59fd8849..14eb5bb5 100644 --- a/zsnes/src/gui/guitools.inc +++ b/zsnes/src/gui/guitools.inc @@ -18,12 +18,6 @@ ;along with this program; if not, write to the Free Software ;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - - - - - ; Tools for the GUI (string functions are also used elsewhere) NEWSYM CopyString diff --git a/zsnes/src/gui/menu.asm b/zsnes/src/gui/menu.asm index 2922cf55..0b5fb544 100644 --- a/zsnes/src/gui/menu.asm +++ b/zsnes/src/gui/menu.asm @@ -857,7 +857,9 @@ NEWSYM savespcdata ChangeDir SPCPath sub dword[spcPCRam],spcRam sub dword[spcRamDP],spcRam + pushad call PrepareSaveState + popad ; Copy from fnames to .spcfname, replacing .srm with .spc mov esi,fnames+1 mov edi,.spcfname @@ -1009,7 +1011,9 @@ NEWSYM savespcdata add dword[spcPCRam],spcRam add dword[spcRamDP],spcRam + pushad call ResetState + popad %ifdef SPCDUMP diff --git a/zsnes/src/linux/gl_draw.c b/zsnes/src/linux/gl_draw.c index 83d7aad6..5d4adbf5 100644 --- a/zsnes/src/linux/gl_draw.c +++ b/zsnes/src/linux/gl_draw.c @@ -46,7 +46,7 @@ extern DWORD BitDepth; static unsigned short *glvidbuffer = 0; static GLuint gltextures[4]; static int gltexture256, gltexture512; -static int glfilters = GL_NEAREST; +static int glfilters = GL_LINEAR; static int glscanready = 0; extern Uint8 En2xSaI, scanlines; extern Uint8 BilinearFilter; @@ -55,6 +55,7 @@ extern Uint8 GUIOn2; extern unsigned int vidbuffer; extern unsigned char curblank; +extern BYTE GUIRESIZE[]; void gl_clearwin(); void UpdateVFrame(void); @@ -67,7 +68,7 @@ int gl_start(int width, int height, int req_depth, int FullScreen) SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_HWPALETTE | SDL_OPENGL; int i; - flags |= (cvidmode == 16 ? SDL_RESIZABLE : 0); + flags |= (GUIRESIZE[cvidmode] ? SDL_RESIZABLE : 0); flags |= (FullScreen ? SDL_FULLSCREEN : 0); diff --git a/zsnes/src/linux/sdlintrf.asm b/zsnes/src/linux/sdlintrf.asm index 4e45be47..04c2b5c7 100644 --- a/zsnes/src/linux/sdlintrf.asm +++ b/zsnes/src/linux/sdlintrf.asm @@ -893,7 +893,7 @@ SECTION .data ; Total Number of Video Modes %ifdef __OPENGL__ -NEWSYM NumVideoModes, dd 18 +NEWSYM NumVideoModes, dd 19 %else NEWSYM NumVideoModes, dd 4 %endif @@ -919,38 +919,39 @@ db '1024x768 ODS FULL',0 ;13 db '1024x768 ODS WIN ',0 ;14 db '1024x896 ODR WIN ',0 ;15 db '1280x1024ODS FULL',0 ;16 -db 'VARIABLE ODR WIN ',0 ;17 +db '1600x1200ODS FULL',0 ;17 +db 'VARIABLE ODR WIN ',0 ;18 %endif ; Video Mode Feature Availability (1 = Available, 0 = Not Available) ; Left side starts with Video Mode 0 -; vid mode column = 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7 -NEWSYM GUI16VID, db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; 16-bit mode -NEWSYM GUINGVID, db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; New Graphics Mode Available -NEWSYM GUISLVID, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1 ; Scanlines -NEWSYM GUIINVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Interpolation -NEWSYM GUII2VID, db 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Interpolation(w) -NEWSYM GUIEAVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Eagle -NEWSYM GUIIEVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; (Interp | Eagle) -NEWSYM GUIFSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Full Screen -NEWSYM GUIWSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; (Full Scr. | Wide Scr.) -NEWSYM GUISSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Small Screen -NEWSYM GUITBVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Triple Buffering -NEWSYM GUIHSVID, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1 ; Half/Quarter Scanlines -NEWSYM GUI2xVID, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1 ; 2xSaI/Super Eagle Engines -NEWSYM GUIM7VID, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1 ; ?Mode 7 video thing? -NEWSYM GUIWFVID, db 0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0 ; If Windows Full Screen -NEWSYM GUIDSIZE, db 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -NEWSYM GUIRATIO, db 0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 -NEWSYM GUIBIFIL, db 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; binlinear = 1, nearest = 0 -NEWSYM GUITBWVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Triple Buffering (Win) -NEWSYM GUIMBVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -NEWSYM GUIHQ2X, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1 ; hq2x filter -NEWSYM GUIHQ3X, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; hq3x filter -NEWSYM GUIHQ4X, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; hq4x filter +; vid mode column = 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8 +NEWSYM GUI16VID, db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; 16-bit mode +NEWSYM GUINGVID, db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; New Graphics Mode Available +NEWSYM GUISLVID, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; Scanlines +NEWSYM GUIINVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Interpolation +NEWSYM GUII2VID, db 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Interpolation(w) +NEWSYM GUIEAVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Eagle +NEWSYM GUIIEVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; (Interp | Eagle) +NEWSYM GUIFSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Full Screen +NEWSYM GUIWSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; (Full Scr. | Wide Scr.) +NEWSYM GUISSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Small Screen +NEWSYM GUITBVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Triple Buffering +NEWSYM GUIHSVID, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; Half/Quarter Scanlines +NEWSYM GUI2xVID, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; 2xSaI/Super Eagle Engines +NEWSYM GUIM7VID, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; ?Mode 7 video thing? +NEWSYM GUIWFVID, db 0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,1,0 ; If Windows Full Screen +NEWSYM GUIDSIZE, db 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +NEWSYM GUIRATIO, db 0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +NEWSYM GUIBIFIL, db 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; binlinear = 1, nearest = 0 +NEWSYM GUITBWVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Triple Buffering (Win) +NEWSYM GUIMBVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +NEWSYM GUIHQ2X, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1 ; hq2x filter +NEWSYM GUIHQ3X, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; hq3x filter +NEWSYM GUIHQ4X, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; hq4x filter +NEWSYM GUIRESIZE, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 ; resizable - SECTION .text ; **************************** diff --git a/zsnes/src/linux/sdllink.c b/zsnes/src/linux/sdllink.c index 48774941..6fef6a9c 100644 --- a/zsnes/src/linux/sdllink.c +++ b/zsnes/src/linux/sdllink.c @@ -87,6 +87,7 @@ extern BYTE GUIDSMODE[]; extern BYTE GUIHQ2X[]; extern BYTE GUIHQ3X[]; extern BYTE GUIHQ4X[]; +extern BYTE GUIRESIZE[]; /* JOYSTICK AND KEYBOARD INPUT */ SDL_Joystick *JoystickInput[5]; @@ -388,7 +389,7 @@ int Main_Proc(void) break; #ifdef __OPENGL__ case SDL_VIDEORESIZE: - if(cvidmode != 17) { + if(!GUIRESIZE[cvidmode]) { surface = SDL_SetVideoMode(WindowWidth, WindowHeight, BitDepth, surface->flags & ~SDL_RESIZABLE); adjustMouseXScale(); @@ -830,7 +831,7 @@ void initwinvideo(void) break; case 2: case 5: - case 17: // Variable + case 18: // Variable WindowWidth = 512; WindowHeight = 448; break; @@ -870,6 +871,10 @@ void initwinvideo(void) WindowWidth = 1280; WindowHeight = 1024; break; + case 17: + WindowWidth = 1600; + WindowHeight = 1200; + break; } adjustMouseXScale(); adjustMouseYScale(); diff --git a/zsnes/src/makefile.ms b/zsnes/src/makefile.ms index 68008089..071fa1b3 100644 --- a/zsnes/src/makefile.ms +++ b/zsnes/src/makefile.ms @@ -113,9 +113,9 @@ CHIPSOBJ=${CHIPDIR}/dsp1emu${OE} ${CHIPDIR}/fxemu2${OE} ${CHIPDIR}/sfxproc${OE}\ ${CHIPDIR}/sdd1emu${OE} ${CHIPDIR}/c4emu${OE} CPUOBJ=${CPUDIR}/dma${OE} ${CPUDIR}/dsp${OE} ${CPUDIR}/dspproc${OE}\ - ${CPUDIR}/execute${OE} ${CPUDIR}/executec${OE} ${CPUDIR}/irq${OE}\ - ${CPUDIR}/memory${OE} ${CPUDIR}/spc700${OE} ${CPUDIR}/stable${OE}\ - ${CPUDIR}/table${OE} ${CPUDIR}/tableb${OE} ${CPUDIR}/tablec${OE} + ${CPUDIR}/execute${OE} ${CPUDIR}/irq${OE} ${CPUDIR}/memory${OE}\ + ${CPUDIR}/spc700${OE} ${CPUDIR}/stable${OE} ${CPUDIR}/table${OE}\ + ${CPUDIR}/tableb${OE} ${CPUDIR}/tablec${OE} ${CPUDIR}/zstate${OE} GUIOBJ=${GUIDIR}/gui${OE} ${GUIDIR}/menu${OE} @@ -124,7 +124,7 @@ VIDEOBJ=${VIDEODIR}/makev16b${OE} ${VIDEODIR}/makev16t${OE} ${VIDEODIR}/makevid$ ${VIDEODIR}/mode716e${OE} ${VIDEODIR}/mode716t${OE} ${VIDEODIR}/mode7${OE}\ ${VIDEODIR}/mode7ext${OE} ${VIDEODIR}/mv16tms${OE} ${VIDEODIR}/newg162${OE}\ ${VIDEODIR}/newgfx16${OE} ${VIDEODIR}/newgfx2${OE} ${VIDEODIR}/newgfx${OE}\ - ${VIDEODIR}/m716text${OE} ${VIDEODIR}/procvid${OE} + ${VIDEODIR}/m716text${OE} ${VIDEODIR}/procvid${OE} ${VIDEODIR}/procvidc${OE} #only used on Win32 WINVIDOBJ=${VIDEODIR}/sw_draw${OE} ${VIDEODIR}/hq2x16${OE} ${VIDEODIR}/hq2x32${OE}\ @@ -220,7 +220,7 @@ patch${OE}: $< endmem${OE}: $< macros.mac ${CPUDIR}/execute${OE}: $< macros.mac -${CPUDIR}/executec${OE}: $< +${CPUDIR}/zstate${OE}: $< ${CPUDIR}/table${OE}: $< ${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${OE}: $< ${CPUDIR}/65816db.inc ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816b.inc\ @@ -249,6 +249,7 @@ ${VIDEODIR}/mode7ext${OE}: $< macros.mac ${VIDEODIR}/mode716e${OE}: $< macros.mac ${VIDEODIR}/m716text${OE}: $< ${VIDEODIR}/mode7.mac macros.mac ${VIDEODIR}/procvid${OE}: $< macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xsaimmx.inc +${VIDEODIR}/procvidc${OE}: $< ${VIDEODIR}/2xsaiw${OE}: $< macros.mac ${VIDEODIR}/sw_draw${OE}: $< macros.mac diff --git a/zsnes/src/video/procvid.asm b/zsnes/src/video/procvid.asm index 58bd576d..91dc0199 100644 --- a/zsnes/src/video/procvid.asm +++ b/zsnes/src/video/procvid.asm @@ -1283,76 +1283,6 @@ DetermineNewest: determinenewhelp 9,'9' ret -NEWSYM CapturePicture - pushad - mov esi,[vidbuffer] - add esi,288*2+16*2 - mov edi,PrevPicture - mov edx,56 -.next - push esi - push edx - mov dx,1111011111011110b - cmp byte[newengen],0 - je .noneweng2 - cmp byte[nggposng],5 - jne .noneweng2 - mov dx,0111101111011110b -.noneweng2 - mov ecx,64 -.loop - mov ax,[esi] - mov bx,[esi+4] - and ax,dx - and bx,dx - shr ax,1 - shr bx,1 - add ax,bx - push ax - mov ax,[esi+288*2] - mov bx,[esi+4+288*2] - and ax,dx - and bx,dx - shr ax,1 - shr bx,1 - add bx,ax - pop ax - and ax,dx - and bx,dx - shr ax,1 - shr bx,1 - add ax,bx - mov [edi],ax - add esi,8 - add edi,2 - dec ecx - jnz .loop - pop edx - pop esi - add esi,288*2*4 - dec edx - jnz near .next - cmp byte[newengen],0 - je .noneweng - cmp byte[nggposng],5 - jne .noneweng - mov edx,PrevPicture - mov ecx,64*56 -.loop2 - mov ax,[edx] - mov bx,ax - and ax,0111111111100000b - and bx,0000000000011111b - shl ax,1 - or bx,ax - mov [edx],bx - add edx,2 - dec ecx - jnz .loop2 -.noneweng - popad - ret - GetPicture: mov cl,[CurPictureVal] cmp [PrevPictureVal],cl diff --git a/zsnes/src/video/procvidc.c b/zsnes/src/video/procvidc.c new file mode 100644 index 00000000..8f5d47a1 --- /dev/null +++ b/zsnes/src/video/procvidc.c @@ -0,0 +1,63 @@ +/* +Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach ) + +http://www.zsnes.com +http://sourceforge.net/projects/zsnes + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +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. +*/ + + + +extern unsigned int newengen, nggposng[2]; +extern unsigned short PrevPicture[64*56], *vidbuffer; + +void CapturePicture() +{ + unsigned short work1, work2, filter; + unsigned int i, j, offset, pppos=0; + + if ((newengen & 0xFF) && ((nggposng[0] & 0xFF) == 5)) + { + filter = 0x7BDE; // 0111 1011 1101 1110 + } + else + { + filter = 0xF7DE; // 1111 0111 1101 1110 + } + + for (j=0 ; j<56 ; j++) + { + offset = 288+16+j*288*4; + + for (i=0 ; i<64 ; i++) + { + work1 = ((vidbuffer[offset] & filter)>>1) + ((vidbuffer[offset+2] & filter)>>1); + work2 = ((vidbuffer[offset+288] & filter)>>1) + ((vidbuffer[offset+288+2] & filter)>>1); + PrevPicture[pppos] = ((work1 & filter)>>1) + ((work2 & filter)>>1); + offset += 4; + pppos++; + } + } + + if ((newengen & 0xFF) && ((nggposng[0] & 0xFF) == 5)) + { + for (pppos=0 ; pppos<64*56 ; pppos++) + { + PrevPicture[pppos] = ((PrevPicture[pppos] & 0x7FE0)<<1)|(PrevPicture[pppos] & 0x001F); + } // 0111 1111 1110 0000 and 0000 0000 0001 1111 + } +}