Port of statesaver to C, new resolution for SDL port, fixed bilinear filter in GUI

This commit is contained in:
grinvader
2005-01-26 01:00:54 +00:00
parent 908edb5c21
commit d19abb9283
18 changed files with 691 additions and 450 deletions

View File

@@ -36,9 +36,9 @@ CHIPSOBJ=${CHIPDIR}/sfxproc.o ${CHIPDIR}/fxemu2.o ${CHIPDIR}/dsp1proc.o\
${CHIPDIR}/sdd1emu.o ${CHIPDIR}/c4emu.o ${CHIPDIR}/sdd1emu.o ${CHIPDIR}/c4emu.o
CPUOBJ=${CPUDIR}/addrni.o ${CPUDIR}/dma.o ${CPUDIR}/dsp.o ${CPUDIR}/dspproc.o\ CPUOBJ=${CPUDIR}/addrni.o ${CPUDIR}/dma.o ${CPUDIR}/dsp.o ${CPUDIR}/dspproc.o\
${CPUDIR}/execute.o ${CPUDIR}/executec.o ${CPUDIR}/irq.o\ ${CPUDIR}/execute.o ${CPUDIR}/irq.o ${CPUDIR}/memory.o\
${CPUDIR}/memory.o ${CPUDIR}/spc700.o ${CPUDIR}/stable.o\ ${CPUDIR}/spc700.o ${CPUDIR}/stable.o ${CPUDIR}/table.o\
${CPUDIR}/table.o ${CPUDIR}/tableb.o ${CPUDIR}/tablec.o ${CPUDIR}/tableb.o ${CPUDIR}/tablec.o ${CPUDIR}/zstate.o
GUIOBJ=${GUIDIR}/gui.o ${GUIDIR}/menu.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}/mode7ext.o ${VIDEODIR}/mv16tms.o ${VIDEODIR}/newg162.o\
${VIDEODIR}/newgfx16.o ${VIDEODIR}/newgfx2.o ${VIDEODIR}/newgfx.o\ ${VIDEODIR}/newgfx16.o ${VIDEODIR}/newgfx2.o ${VIDEODIR}/newgfx.o\
${VIDEODIR}/m716text.o ${VIDEODIR}/2xsaiw.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}/hq2x16.o ${VIDEODIR}/hq2x32.o\
${VIDEODIR}/hq3x16.o ${VIDEODIR}/hq3x32.o\ ${VIDEODIR}/hq3x16.o ${VIDEODIR}/hq3x32.o\
${VIDEODIR}/hq4x16.o ${VIDEODIR}/hq4x32.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}/smoke.o: ${EFFECTSDIR}/smoke.c
${EFFECTSDIR}/burn.o: ${EFFECTSDIR}/burn.c ${EFFECTSDIR}/burn.o: ${EFFECTSDIR}/burn.c
${VIDEODIR}/procvid.o: ${VIDEODIR}/procvid.asm macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xsaimmx.inc ${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}/sw_draw.obj: ${VIDEODIR}/sw_draw.asm macros.mac
${VIDEODIR}/hq2x16.obj: ${VIDEODIR}/hq2x16.asm macros.mac ${VIDEODIR}/hq2x16.obj: ${VIDEODIR}/hq2x16.asm macros.mac
${VIDEODIR}/hq2x32.obj: ${VIDEODIR}/hq2x32.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 ${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac
${CPUDIR}/execute.o: ${CPUDIR}/execute.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}/table.o: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\
${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816.inc\ ${CPUDIR}/address.inc ${CPUDIR}/addrni.inc ${CPUDIR}/e65816.inc\
${CPUDIR}/regs.mac ${CPUDIR}/regs.inc ${CPUDIR}/regsw.mac\ ${CPUDIR}/regs.mac ${CPUDIR}/regs.inc ${CPUDIR}/regsw.mac\

View File

@@ -446,20 +446,21 @@ void DOScreatenewcfg()
#endif #endif
#ifdef __LINUX__ #ifdef __LINUX__
#ifdef __OPENGL__ #ifdef __OPENGL__
WRITE_LINE("; Video Mode, 0 - 15\r\n"); WRITE_LINE("; Video Mode, 0 - 18\r\n");
#else #else
WRITE_LINE("; Video Mode, 0 - 3\r\n"); WRITE_LINE("; Video Mode, 0 - 3\r\n");
#endif #endif
WRITE_LINE("; 0 = 256x224 R WIN 1 = 256x224 R FULL\r\n"); WRITE_LINE("; 0 = 256x224 R WIN 1 = 256x224 R FULL\r\n");
WRITE_LINE("; 2 = 512x448 DR WIN 3 = 640x480 DS FULL\r\n"); WRITE_LINE("; 2 = 512x448 DR WIN 3 = 640x480 DS FULL\r\n");
#ifdef __OPENGL__ #ifdef __OPENGL__
WRITE_LINE("; 4 = 256x224 OR WIN 5 = 512x448 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("; 6 = 640x480 ODS FULL 7 = 640x480 ODS WIN\r\n");
WRITE_LINE("; 8 = 640x576 ODR WIN 9 = 768x672 ODR 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("; 10 = 800x600 ODS FULL 11 = 800x600 ODS WIN\r\n");
WRITE_LINE("; 12 = 896x784 ODR WIN 13 = 1024x768 ODS FULL\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("; 14 = 1024x768 ODS WIN 15 = 1024x896 ODR WIN\r\n");
WRITE_LINE("; 16 = 1280x1024 ODS FULL 17 = VARIABLE 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 #endif
sprintf(buffer, "\r\nVideoModeLin = %d\r\n\r\n", cfgcvidmode); sprintf(buffer, "\r\nVideoModeLin = %d\r\n\r\n", cfgcvidmode);
SAVE_LINE(buffer); SAVE_LINE(buffer);

View File

@@ -1569,50 +1569,6 @@ NEWSYM %1
ret ret
%endmacro %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 NEWSYM SA1Reset
mov byte[SA1IRQData+1],0 mov byte[SA1IRQData+1],0
mov byte[SA1Mode],0 mov byte[SA1Mode],0
@@ -1649,20 +1605,6 @@ NEWSYM SA1Reset
mov word[SA1Overflow],0 mov word[SA1Overflow],0
ret 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 NEWSYM UpdateBanksSDD1
pushad pushad
cmp dword[SDD1BankA],0 cmp dword[SDD1BankA],0

View File

@@ -2732,61 +2732,6 @@ dspconvb equ marksave-Voice0Freq
NEWSYM PHdspsave, dd dspsave NEWSYM PHdspsave, dd dspsave
NEWSYM PHdspconvb, dd dspconvb 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 SECTION .bss
spc700temp resd 2 spc700temp resd 2
SECTION .text SECTION .text

View File

@@ -23,7 +23,7 @@
EXTSYM StringLength EXTSYM StringLength
EXTSYM Get_Time EXTSYM Get_Time
EXTSYM objhipr EXTSYM objhipr
EXTSYM KeyRewind EXTSYM KeyRewind, statesaver
EXTSYM xa,timer2upd,prevoamptr,ReadHead EXTSYM xa,timer2upd,prevoamptr,ReadHead
EXTSYM prevedi,SA1xpc,SA1RAMArea,sa1dmaptr EXTSYM prevedi,SA1xpc,SA1RAMArea,sa1dmaptr
EXTSYM DSP1COp,C4WFXVal,C41FXVal,Op00Multiplicand,Op10Coefficient,Op04Angle EXTSYM DSP1COp,C4WFXVal,C41FXVal,Op00Multiplicand,Op10Coefficient,Op04Angle
@@ -585,7 +585,9 @@ NetSaveState:
mov byte[csounddisable],1 mov byte[csounddisable],1
.skipsoundreinit .skipsoundreinit
pushad
call statesaver call statesaver
popad
; initialize variables (Copy from variables) ; initialize variables (Copy from variables)
call UpdateDPage call UpdateDPage
@@ -1192,191 +1194,8 @@ NEWSYM HIRQNextExe, db 0
SECTION .data SECTION .data
NEWSYM firstsaveinc, db 0 NEWSYM firstsaveinc, db 0
NEWSYM txtsavemsg, db 'STATE - SAVED.',0
SECTION .text NEWSYM txtsavemsgfail, db 'UNABLE TO SAVE.',0
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
SECTION .text SECTION .text
NEWSYM savestate NEWSYM savestate
@@ -1410,7 +1229,9 @@ NEWSYM savestate
mov byte[pressed+1],0 mov byte[pressed+1],0
mov eax,[KeySaveState] mov eax,[KeySaveState]
mov byte[pressed+eax],2 mov byte[pressed+eax],2
pushad
call statesaver call statesaver
popad
jmp reexecuteb jmp reexecuteb
SECTION .data SECTION .data
@@ -1545,9 +1366,9 @@ NEWSYM stateloader
mov edx,[SA1RAMArea] mov edx,[SA1RAMArea]
call Read_File call Read_File
; Convert back SA-1 stuff ; Convert back SA-1 stuff
push ebx pushad
call RestoreSA1 call RestoreSA1
pop ebx popad
call SA1UpdateDPage call SA1UpdateDPage
.nossa1 .nossa1
cmp byte[SDD1Enable],1 cmp byte[SDD1Enable],1
@@ -1678,7 +1499,9 @@ NEWSYM loadstate
add dword[Curtableaddr],tableA add dword[Curtableaddr],tableA
add dword[spcPCRam],spcRam add dword[spcPCRam],spcRam
add dword[spcRamDP],spcRam add dword[spcRamDP],spcRam
pushad
call ResetState call ResetState
popad
call procexecloop call procexecloop
stim stim
jmp reexecuteb jmp reexecuteb
@@ -1714,7 +1537,9 @@ NEWSYM loadstate3
add dword[Curtableaddr],tableA add dword[Curtableaddr],tableA
add dword[spcPCRam],spcRam add dword[spcPCRam],spcRam
add dword[spcRamDP],spcRam add dword[spcRamDP],spcRam
pushad
call ResetState call ResetState
popad
call procexecloop call procexecloop
ret ret
.nofile .nofile

View File

@@ -291,28 +291,6 @@ NEWSYM initregw
; video memory change buffer for caching (65536/16=4096) ; video memory change buffer for caching (65536/16=4096)
;vidmemch2, vidmemch4, vidmemch8. 4096 bytes each ;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 NEWSYM repackfunct
; Global/Echo Volumes ; Global/Echo Volumes
mov al,[DSPMem+0Ch] mov al,[DSPMem+0Ch]

540
zsnes/src/cpu/zstate.c Executable file
View File

@@ -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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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();
}

View File

@@ -173,7 +173,9 @@ NEWSYM loadtempstuff
call Close_File call Close_File
add dword[spcPCRam],spcRam add dword[spcPCRam],spcRam
add dword[spcRamDP],spcRam add dword[spcRamDP],spcRam
pushad
call ResetState call ResetState
popad
ret ret
mov dword[spcPCRam],0 mov dword[spcPCRam],0
xor eax,eax xor eax,eax
@@ -435,13 +437,17 @@ NEWSYM debugloadstate
add dword[Curtableaddr],tableA add dword[Curtableaddr],tableA
add dword[spcPCRam],spcRam add dword[spcPCRam],spcRam
add dword[spcRamDP],spcRam add dword[spcRamDP],spcRam
pushad
call ResetState call ResetState
popad
call procexecloop call procexecloop
.nofile .nofile
jmp debugloopa jmp debugloopa
NEWSYM debugsavestate NEWSYM debugsavestate
pushad
call statesaver call statesaver
popad
jmp debugloopb jmp debugloopb
;******************************************************* ;*******************************************************

View File

@@ -3677,7 +3677,9 @@ GUIProcStates:
popad popad
cmp byte[GUIStatesText5],1 cmp byte[GUIStatesText5],1
je .loadstate je .loadstate
pushad
call statesaver call statesaver
popad
jmp .changedir jmp .changedir
.loadstate .loadstate
cmp byte[CNetType],20 cmp byte[CNetType],20
@@ -3698,9 +3700,9 @@ SaveSecondState:
mov ebx,[statefileloc] mov ebx,[statefileloc]
mov al,[fnamest+ebx] mov al,[fnamest+ebx]
mov byte[fnamest+ebx],'s' mov byte[fnamest+ebx],'s'
push eax pushad
call statesaver call statesaver
pop eax popad
mov ebx,[statefileloc] mov ebx,[statefileloc]
mov [fnamest+ebx],al mov [fnamest+ebx],al
call ChangetoLOADdir call ChangetoLOADdir

View File

@@ -62,7 +62,9 @@ MovieRecord:
mov byte[NoPictureSave],1 mov byte[NoPictureSave],1
cmp byte[MovieProcessing],0 cmp byte[MovieProcessing],0
jne .nostatesaver jne .nostatesaver
pushad
call statesaver call statesaver
popad
.nostatesaver .nostatesaver
mov byte[NoPictureSave],0 mov byte[NoPictureSave],0
mov edx,fnamest+1 mov edx,fnamest+1

View File

@@ -18,12 +18,6 @@
;along with this program; if not, write to the Free Software ;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
; Tools for the GUI (string functions are also used elsewhere) ; Tools for the GUI (string functions are also used elsewhere)
NEWSYM CopyString NEWSYM CopyString

View File

@@ -857,7 +857,9 @@ NEWSYM savespcdata
ChangeDir SPCPath ChangeDir SPCPath
sub dword[spcPCRam],spcRam sub dword[spcPCRam],spcRam
sub dword[spcRamDP],spcRam sub dword[spcRamDP],spcRam
pushad
call PrepareSaveState call PrepareSaveState
popad
; Copy from fnames to .spcfname, replacing .srm with .spc ; Copy from fnames to .spcfname, replacing .srm with .spc
mov esi,fnames+1 mov esi,fnames+1
mov edi,.spcfname mov edi,.spcfname
@@ -1009,7 +1011,9 @@ NEWSYM savespcdata
add dword[spcPCRam],spcRam add dword[spcPCRam],spcRam
add dword[spcRamDP],spcRam add dword[spcRamDP],spcRam
pushad
call ResetState call ResetState
popad
%ifdef SPCDUMP %ifdef SPCDUMP

View File

@@ -46,7 +46,7 @@ extern DWORD BitDepth;
static unsigned short *glvidbuffer = 0; static unsigned short *glvidbuffer = 0;
static GLuint gltextures[4]; static GLuint gltextures[4];
static int gltexture256, gltexture512; static int gltexture256, gltexture512;
static int glfilters = GL_NEAREST; static int glfilters = GL_LINEAR;
static int glscanready = 0; static int glscanready = 0;
extern Uint8 En2xSaI, scanlines; extern Uint8 En2xSaI, scanlines;
extern Uint8 BilinearFilter; extern Uint8 BilinearFilter;
@@ -55,6 +55,7 @@ extern Uint8 GUIOn2;
extern unsigned int vidbuffer; extern unsigned int vidbuffer;
extern unsigned char curblank; extern unsigned char curblank;
extern BYTE GUIRESIZE[];
void gl_clearwin(); void gl_clearwin();
void UpdateVFrame(void); 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; SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_HWPALETTE | SDL_OPENGL;
int i; int i;
flags |= (cvidmode == 16 ? SDL_RESIZABLE : 0); flags |= (GUIRESIZE[cvidmode] ? SDL_RESIZABLE : 0);
flags |= (FullScreen ? SDL_FULLSCREEN : 0); flags |= (FullScreen ? SDL_FULLSCREEN : 0);

View File

@@ -893,7 +893,7 @@ SECTION .data
; Total Number of Video Modes ; Total Number of Video Modes
%ifdef __OPENGL__ %ifdef __OPENGL__
NEWSYM NumVideoModes, dd 18 NEWSYM NumVideoModes, dd 19
%else %else
NEWSYM NumVideoModes, dd 4 NEWSYM NumVideoModes, dd 4
%endif %endif
@@ -919,37 +919,38 @@ db '1024x768 ODS FULL',0 ;13
db '1024x768 ODS WIN ',0 ;14 db '1024x768 ODS WIN ',0 ;14
db '1024x896 ODR WIN ',0 ;15 db '1024x896 ODR WIN ',0 ;15
db '1280x1024ODS FULL',0 ;16 db '1280x1024ODS FULL',0 ;16
db 'VARIABLE ODR WIN ',0 ;17 db '1600x1200ODS FULL',0 ;17
db 'VARIABLE ODR WIN ',0 ;18
%endif %endif
; Video Mode Feature Availability (1 = Available, 0 = Not Available) ; Video Mode Feature Availability (1 = Available, 0 = Not Available)
; Left side starts with Video Mode 0 ; 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 ; 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 ; 16-bit mode 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 ; New Graphics Mode Available 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 ; Scanlines 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 ; Interpolation 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 ; Interpolation(w) 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 ; Eagle 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 ; (Interp | 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 ; Full Screen 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 ; (Full Scr. | Wide Scr.) 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 ; Small Screen 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 ; Triple Buffering 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 ; Half/Quarter Scanlines 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 ; 2xSaI/Super Eagle Engines 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 ; ?Mode 7 video thing? 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,0 ; If Windows Full Screen 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 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 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 ; binlinear = 1, nearest = 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 ; Triple Buffering (Win) 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 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 ; hq2x filter 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 ; hq3x 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 ; hq4x 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 SECTION .text

View File

@@ -87,6 +87,7 @@ extern BYTE GUIDSMODE[];
extern BYTE GUIHQ2X[]; extern BYTE GUIHQ2X[];
extern BYTE GUIHQ3X[]; extern BYTE GUIHQ3X[];
extern BYTE GUIHQ4X[]; extern BYTE GUIHQ4X[];
extern BYTE GUIRESIZE[];
/* JOYSTICK AND KEYBOARD INPUT */ /* JOYSTICK AND KEYBOARD INPUT */
SDL_Joystick *JoystickInput[5]; SDL_Joystick *JoystickInput[5];
@@ -388,7 +389,7 @@ int Main_Proc(void)
break; break;
#ifdef __OPENGL__ #ifdef __OPENGL__
case SDL_VIDEORESIZE: case SDL_VIDEORESIZE:
if(cvidmode != 17) { if(!GUIRESIZE[cvidmode]) {
surface = SDL_SetVideoMode(WindowWidth, WindowHeight, surface = SDL_SetVideoMode(WindowWidth, WindowHeight,
BitDepth, surface->flags & ~SDL_RESIZABLE); BitDepth, surface->flags & ~SDL_RESIZABLE);
adjustMouseXScale(); adjustMouseXScale();
@@ -830,7 +831,7 @@ void initwinvideo(void)
break; break;
case 2: case 2:
case 5: case 5:
case 17: // Variable case 18: // Variable
WindowWidth = 512; WindowWidth = 512;
WindowHeight = 448; WindowHeight = 448;
break; break;
@@ -870,6 +871,10 @@ void initwinvideo(void)
WindowWidth = 1280; WindowWidth = 1280;
WindowHeight = 1024; WindowHeight = 1024;
break; break;
case 17:
WindowWidth = 1600;
WindowHeight = 1200;
break;
} }
adjustMouseXScale(); adjustMouseXScale();
adjustMouseYScale(); adjustMouseYScale();

View File

@@ -113,9 +113,9 @@ CHIPSOBJ=${CHIPDIR}/dsp1emu${OE} ${CHIPDIR}/fxemu2${OE} ${CHIPDIR}/sfxproc${OE}\
${CHIPDIR}/sdd1emu${OE} ${CHIPDIR}/c4emu${OE} ${CHIPDIR}/sdd1emu${OE} ${CHIPDIR}/c4emu${OE}
CPUOBJ=${CPUDIR}/dma${OE} ${CPUDIR}/dsp${OE} ${CPUDIR}/dspproc${OE}\ CPUOBJ=${CPUDIR}/dma${OE} ${CPUDIR}/dsp${OE} ${CPUDIR}/dspproc${OE}\
${CPUDIR}/execute${OE} ${CPUDIR}/executec${OE} ${CPUDIR}/irq${OE}\ ${CPUDIR}/execute${OE} ${CPUDIR}/irq${OE} ${CPUDIR}/memory${OE}\
${CPUDIR}/memory${OE} ${CPUDIR}/spc700${OE} ${CPUDIR}/stable${OE}\ ${CPUDIR}/spc700${OE} ${CPUDIR}/stable${OE} ${CPUDIR}/table${OE}\
${CPUDIR}/table${OE} ${CPUDIR}/tableb${OE} ${CPUDIR}/tablec${OE} ${CPUDIR}/tableb${OE} ${CPUDIR}/tablec${OE} ${CPUDIR}/zstate${OE}
GUIOBJ=${GUIDIR}/gui${OE} ${GUIDIR}/menu${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}/mode716e${OE} ${VIDEODIR}/mode716t${OE} ${VIDEODIR}/mode7${OE}\
${VIDEODIR}/mode7ext${OE} ${VIDEODIR}/mv16tms${OE} ${VIDEODIR}/newg162${OE}\ ${VIDEODIR}/mode7ext${OE} ${VIDEODIR}/mv16tms${OE} ${VIDEODIR}/newg162${OE}\
${VIDEODIR}/newgfx16${OE} ${VIDEODIR}/newgfx2${OE} ${VIDEODIR}/newgfx${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 #only used on Win32
WINVIDOBJ=${VIDEODIR}/sw_draw${OE} ${VIDEODIR}/hq2x16${OE} ${VIDEODIR}/hq2x32${OE}\ WINVIDOBJ=${VIDEODIR}/sw_draw${OE} ${VIDEODIR}/hq2x16${OE} ${VIDEODIR}/hq2x32${OE}\
@@ -220,7 +220,7 @@ patch${OE}: $<
endmem${OE}: $< macros.mac endmem${OE}: $< macros.mac
${CPUDIR}/execute${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}/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}/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\ ${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}/mode716e${OE}: $< macros.mac
${VIDEODIR}/m716text${OE}: $< ${VIDEODIR}/mode7.mac macros.mac ${VIDEODIR}/m716text${OE}: $< ${VIDEODIR}/mode7.mac macros.mac
${VIDEODIR}/procvid${OE}: $< macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xsaimmx.inc ${VIDEODIR}/procvid${OE}: $< macros.mac ${VIDEODIR}/copyvid.inc ${VIDEODIR}/2xsaimmx.inc
${VIDEODIR}/procvidc${OE}: $<
${VIDEODIR}/2xsaiw${OE}: $< macros.mac ${VIDEODIR}/2xsaiw${OE}: $< macros.mac
${VIDEODIR}/sw_draw${OE}: $< macros.mac ${VIDEODIR}/sw_draw${OE}: $< macros.mac

View File

@@ -1283,76 +1283,6 @@ DetermineNewest:
determinenewhelp 9,'9' determinenewhelp 9,'9'
ret 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: GetPicture:
mov cl,[CurPictureVal] mov cl,[CurPictureVal]
cmp [PrevPictureVal],cl cmp [PrevPictureVal],cl

View File

@@ -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
}
}