Port of statesaver to C, new resolution for SDL port, fixed bilinear filter in GUI
This commit is contained in:
@@ -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\
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
540
zsnes/src/cpu/zstate.c
Executable 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();
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|
||||||
;*******************************************************
|
;*******************************************************
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
63
zsnes/src/video/procvidc.c
Normal file
63
zsnes/src/video/procvidc.c
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user