/* * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. * * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and * Jerremy Koot (jkoot@snes9x.com) * * Super FX C emulator code * (c) Copyright 1997 - 1999 Ivar (ivar@snes9x.com) and * Gary Henderson. * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. * * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson. * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_. * C4 C code (c) Copyright 2001 Gary Henderson (gary.henderson@ntlworld.com). * * DOS port code contains the works of other authors. See headers in * individual files. * * Snes9x homepage: http://www.snes9x.com * * Permission to use, copy, modify and distribute Snes9x in both binary and * source form, for non-commercial purposes, is hereby granted without fee, * providing that this license information and copyright notice appear with * all copies and any derived work. * * This software is provided 'as-is', without any express or implied * warranty. In no event shall the authors be held liable for any damages * arising from the use of this software. * * Snes9x is freeware for PERSONAL USE only. Commercial users should * seek permission of the copyright holders first. Commercial use includes * charging money for Snes9x or software derived from Snes9x. * * The copyright holders request that bug fixes and improvements to the code * should be forwarded to them so everyone can benefit from the modifications * in future versions. * * Super NES and Super Nintendo Entertainment System are trademarks of * Nintendo Co., Limited and its subsidiary companies. */ #ifndef _SNAPORIG_H_ #define _SNAPORIG_H_ #define ORIG_SNAPSHOT_MAGIC "#!snes96" #define ORIG_SNAPSHOT_VERSION 4 EXTERN_C bool8_32 S9xLoadOrigSnapshot(const char* filename); struct SOrigCPUState { uint32 Flags; short Cycles_old; short NextEvent_old; uint8 CurrentFrame; uint8 FastROMSpeed_old_old; uint16 V_Counter_old; bool8_32 BranchSkip; bool8_32 NMIActive; bool8_32 IRQActive; bool8_32 WaitingForInterrupt; bool8_32 InDMA; uint8 WhichEvent; uint8* PC; uint8* PCBase; uint16 MemSpeed_old; uint16 MemSpeedx2_old; uint16 FastROMSpeed_old; bool8_32 FastDP; uint8* PCAtOpcodeStart; uint8* WaitAddress; uint32 WaitCounter; long Cycles; long NextEvent; long V_Counter; long MemSpeed; long MemSpeedx2; long FastROMSpeed; }; struct SOrigAPU { uint32 Cycles; bool8_32 ShowROM; uint8 Flags; uint8 KeyedChannels; uint8 OutPorts [4]; uint8 DSP [0x80]; uint8 ExtraRAM [64]; uint16 Timer [3]; uint16 TimerTarget [3]; bool8_32 TimerEnabled [3]; bool8_32 TimerValueWritten [3]; }; typedef union { #ifdef MSB_FIRST struct { uint8 Y, A; } B; #else struct { uint8 A, Y; } B; #endif uint16 W; } OrigYAndA; struct SOrigAPURegisters { uint8 P; OrigYAndA YA; uint8 X; uint8 S; uint16 PC; }; #define ORIG_MAX_BUFFER_SIZE (1024 * 4) #define NUM_CHANNELS 8 typedef struct { int state; int type; short volume_left; short volume_right; int frequency; int count; signed short wave [ORIG_MAX_BUFFER_SIZE]; bool8_32 loop; int envx; short left_vol_level; short right_vol_level; short envx_target; unsigned long int env_error; unsigned long erate; int direction; unsigned long attack_rate; unsigned long decay_rate; unsigned long sustain_rate; unsigned long release_rate; unsigned long sustain_level; signed short sample; signed short decoded [16]; signed short previous [2]; uint16 sample_number; bool8_32 last_block; bool8_32 needs_decode; uint32 block_pointer; uint32 sample_pointer; int* echo_buf_ptr; int mode; uint32 dummy [8]; } OrigChannel; typedef struct { short master_volume_left; short master_volume_right; short echo_volume_left; short echo_volume_right; int echo_enable; int echo_feedback; int echo_ptr; int echo_buffer_size; int echo_write_enabled; int echo_channel_enable; int pitch_mod; // Just incase they are needed in the future, for snapshot compatibility. uint32 dummy [3]; OrigChannel channels [NUM_CHANNELS]; } SOrigSoundData; struct SOrigOBJ { short HPos; uint16 VPos; uint16 Name; uint8 VFlip; uint8 HFlip; uint8 Priority; uint8 Palette; uint8 Size; uint8 Prev; uint8 Next; }; struct SOrigPPU { uint8 BGMode; uint8 BG3Priority; uint8 Brightness; struct { bool8_32 High; uint8 Increment; uint16 Address; uint16 Mask1; uint16 FullGraphicCount; uint16 Shift; } VMA; struct { uint8 TileSize; uint16 TileAddress; uint8 Width; uint8 Height; uint16 SCBase; uint16 VOffset; uint16 HOffset; bool8_32 ThroughMain; bool8_32 ThroughSub; uint8 BGSize; uint16 NameBase; uint16 SCSize; bool8_32 Addition; } BG [4]; bool8_32 CGFLIP; uint16 CGDATA [256]; uint8 FirstSprite; uint8 LastSprite; struct SOrigOBJ OBJ [129]; uint8 OAMPriorityRotation; uint16 OAMAddr; uint8 OAMFlip; uint16 OAMTileAddress; uint16 IRQVBeamPos; uint16 IRQHBeamPos; uint16 VBeamPosLatched; uint16 HBeamPosLatched; uint8 HBeamFlip; uint8 VBeamFlip; uint8 HVBeamCounterLatched; short MatrixA; short MatrixB; short MatrixC; short MatrixD; short CentreX; short CentreY; uint8 Joypad1ButtonReadPos; uint8 Joypad2ButtonReadPos; uint8 CGADD; uint8 FixedColourRed; uint8 FixedColourGreen; uint8 FixedColourBlue; uint16 SavedOAMAddr; uint16 ScreenHeight; uint32 WRAM; uint8 BG_Forced; bool8_32 ForcedBlanking; bool8_32 OBJThroughMain; bool8_32 OBJThroughSub; uint8 OBJSizeSelect; uint8 OBJNameSelect_old; uint16 OBJNameBase; bool8_32 OBJAddition; uint8 OAMReadFlip; uint8 OAMData [512 + 32]; bool8_32 VTimerEnabled; bool8_32 HTimerEnabled; short HTimerPosition; uint8 Mosaic; bool8_32 BGMosaic [4]; bool8_32 Mode7HFlip; bool8_32 Mode7VFlip; uint8 Mode7Repeat; uint8 Window1Left; uint8 Window1Right; uint8 Window2Left; uint8 Window2Right; uint8 ClipCounts [6]; uint8 ClipLeftEdges [3][6]; uint8 ClipRightEdges [3][6]; uint8 ClipWindowOverlapLogic [6]; uint8 ClipWindow1Enable [6]; uint8 ClipWindow2Enable [6]; bool8_32 ClipWindow1Inside [6]; bool8_32 ClipWindow2Inside [6]; bool8_32 RecomputeClipWindows; uint8 CGFLIPRead; uint16 OBJNameSelect; bool8_32 Need16x8Mulitply; uint8 Joypad3ButtonReadPos; uint8 MouseSpeed[2]; }; struct SOrigDMA { bool8_32 TransferDirection; bool8_32 AAddressFixed; bool8_32 AAddressDecrement; uint8 TransferMode; uint8 ABank; uint16 AAddress; uint16 Address; uint8 BAddress; // General DMA only: uint16 TransferBytes; // H-DMA only: bool8_32 HDMAIndirectAddressing; uint16 IndirectAddress; uint8 IndirectBank; uint8 Repeat; uint8 LineCount; uint8 FirstLine; bool8_32 JustStarted; }; typedef union { #ifdef MSB_FIRST struct { uint8 h, l; } B; #else struct { uint8 l, h; } B; #endif uint16 W; } OrigPair; struct SOrigRegisters { uint8 PB; uint8 DB; OrigPair P; OrigPair A; OrigPair D; OrigPair S; OrigPair X; OrigPair Y; uint16 PC; }; #endif