From e144a0acc4854ad80f9e6945f4d94223ee865d78 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Mon, 9 Nov 2015 20:42:25 +0100 Subject: reindent all files. --- src/snapshot.c | 1375 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 690 insertions(+), 685 deletions(-) (limited to 'src/snapshot.c') diff --git a/src/snapshot.c b/src/snapshot.c index 72ed12d..f9cb9c4 100644 --- a/src/snapshot.c +++ b/src/snapshot.c @@ -4,7 +4,7 @@ * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and * Jerremy Koot (jkoot@snes9x.com) * - * Super FX C emulator code + * 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_. @@ -39,7 +39,7 @@ * Nintendo Co., Limited and its subsidiary companies. */ -#ifndef __GP32__ +#ifndef __GP32__ #include #include #include @@ -69,115 +69,120 @@ // notaz: file i/o function pointers for states, // changing funcs will allow to enable/disable gzipped saves -extern int (*statef_open)(const char *fname, const char *mode); -extern int (*statef_read)(void *p, int l); -extern int (*statef_write)(void *p, int l); +extern int (*statef_open)(const char* fname, const char* mode); +extern int (*statef_read)(void* p, int l); +extern int (*statef_write)(void* p, int l); extern void (*statef_close)(); -extern uint8 *SRAM; +extern uint8* SRAM; #ifdef ZSNES_FX START_EXTERN_C -void S9xSuperFXPreSaveState (); -void S9xSuperFXPostSaveState (); -void S9xSuperFXPostLoadState (); +void S9xSuperFXPreSaveState(); +void S9xSuperFXPostSaveState(); +void S9xSuperFXPostLoadState(); END_EXTERN_C #endif //bool8 S9xUnfreezeZSNES (const char *filename); -typedef struct { - int offset; - int size; - int type; +typedef struct +{ + int offset; + int size; + int type; } FreezeData; -enum { - INT_V, uint8_ARRAY_V, uint16_ARRAY_V, uint32_ARRAY_V +enum +{ + INT_V, uint8_ARRAY_V, uint16_ARRAY_V, uint32_ARRAY_V }; #define Offset(field,structure) \ - ((int) (((char *) (&(((structure)NULL)->field))) - ((char *) NULL))) + ((int) (((char *) (&(((structure)NULL)->field))) - ((char *) NULL))) #define COUNT(ARRAY) (sizeof (ARRAY) / sizeof (ARRAY[0])) #undef OFFSET #define OFFSET(f) Offset(f, SCPUState *) -static FreezeData SnapCPU [] = { - {OFFSET (Flags), 4, INT_V}, - {OFFSET (BranchSkip), 1, INT_V}, - {OFFSET (NMIActive), 1, INT_V}, - {OFFSET (IRQActive), 1, INT_V}, - {OFFSET (WaitingForInterrupt), 1, INT_V}, - {OFFSET (WhichEvent), 1, INT_V}, - {OFFSET (Cycles), 4, INT_V}, - {OFFSET (NextEvent), 4, INT_V}, - {OFFSET (V_Counter), 4, INT_V}, - {OFFSET (MemSpeed), 4, INT_V}, - {OFFSET (MemSpeedx2), 4, INT_V}, - {OFFSET (FastROMSpeed), 4, INT_V} +static FreezeData SnapCPU [] = +{ + {OFFSET(Flags), 4, INT_V}, + {OFFSET(BranchSkip), 1, INT_V}, + {OFFSET(NMIActive), 1, INT_V}, + {OFFSET(IRQActive), 1, INT_V}, + {OFFSET(WaitingForInterrupt), 1, INT_V}, + {OFFSET(WhichEvent), 1, INT_V}, + {OFFSET(Cycles), 4, INT_V}, + {OFFSET(NextEvent), 4, INT_V}, + {OFFSET(V_Counter), 4, INT_V}, + {OFFSET(MemSpeed), 4, INT_V}, + {OFFSET(MemSpeedx2), 4, INT_V}, + {OFFSET(FastROMSpeed), 4, INT_V} }; #undef OFFSET #define OFFSET(f) Offset(f, SRegisters *) -static FreezeData SnapRegisters [] = { - {OFFSET (PB), 1, INT_V}, - {OFFSET (DB), 1, INT_V}, - {OFFSET (P.W), 2, INT_V}, - {OFFSET (A.W), 2, INT_V}, - {OFFSET (D.W), 2, INT_V}, - {OFFSET (S.W), 2, INT_V}, - {OFFSET (X.W), 2, INT_V}, - {OFFSET (Y.W), 2, INT_V}, - {OFFSET (PC), 2, INT_V} +static FreezeData SnapRegisters [] = +{ + {OFFSET(PB), 1, INT_V}, + {OFFSET(DB), 1, INT_V}, + {OFFSET(P.W), 2, INT_V}, + {OFFSET(A.W), 2, INT_V}, + {OFFSET(D.W), 2, INT_V}, + {OFFSET(S.W), 2, INT_V}, + {OFFSET(X.W), 2, INT_V}, + {OFFSET(Y.W), 2, INT_V}, + {OFFSET(PC), 2, INT_V} }; #undef OFFSET #define OFFSET(f) Offset(f, SPPU *) -static FreezeData SnapPPU [] = { - {OFFSET (BGMode), 1, INT_V}, - {OFFSET (BG3Priority), 1, INT_V}, - {OFFSET (Brightness), 1, INT_V}, - {OFFSET (VMA.High), 1, INT_V}, - {OFFSET (VMA.Increment), 1, INT_V}, - {OFFSET (VMA.Address), 2, INT_V}, - {OFFSET (VMA.Mask1), 2, INT_V}, - {OFFSET (VMA.FullGraphicCount), 2, INT_V}, - {OFFSET (VMA.Shift), 2, INT_V}, - {OFFSET (BG[0].SCBase), 2, INT_V}, - {OFFSET (BG[0].VOffset), 2, INT_V}, - {OFFSET (BG[0].HOffset), 2, INT_V}, - {OFFSET (BG[0].BGSize), 1, INT_V}, - {OFFSET (BG[0].NameBase), 2, INT_V}, - {OFFSET (BG[0].SCSize), 2, INT_V}, - - {OFFSET (BG[1].SCBase), 2, INT_V}, - {OFFSET (BG[1].VOffset), 2, INT_V}, - {OFFSET (BG[1].HOffset), 2, INT_V}, - {OFFSET (BG[1].BGSize), 1, INT_V}, - {OFFSET (BG[1].NameBase), 2, INT_V}, - {OFFSET (BG[1].SCSize), 2, INT_V}, - - {OFFSET (BG[2].SCBase), 2, INT_V}, - {OFFSET (BG[2].VOffset), 2, INT_V}, - {OFFSET (BG[2].HOffset), 2, INT_V}, - {OFFSET (BG[2].BGSize), 1, INT_V}, - {OFFSET (BG[2].NameBase), 2, INT_V}, - {OFFSET (BG[2].SCSize), 2, INT_V}, - - {OFFSET (BG[3].SCBase), 2, INT_V}, - {OFFSET (BG[3].VOffset), 2, INT_V}, - {OFFSET (BG[3].HOffset), 2, INT_V}, - {OFFSET (BG[3].BGSize), 1, INT_V}, - {OFFSET (BG[3].NameBase), 2, INT_V}, - {OFFSET (BG[3].SCSize), 2, INT_V}, - - {OFFSET (CGFLIP), 1, INT_V}, - {OFFSET (CGDATA), 256, uint16_ARRAY_V}, - {OFFSET (FirstSprite), 1, INT_V}, +static FreezeData SnapPPU [] = +{ + {OFFSET(BGMode), 1, INT_V}, + {OFFSET(BG3Priority), 1, INT_V}, + {OFFSET(Brightness), 1, INT_V}, + {OFFSET(VMA.High), 1, INT_V}, + {OFFSET(VMA.Increment), 1, INT_V}, + {OFFSET(VMA.Address), 2, INT_V}, + {OFFSET(VMA.Mask1), 2, INT_V}, + {OFFSET(VMA.FullGraphicCount), 2, INT_V}, + {OFFSET(VMA.Shift), 2, INT_V}, + {OFFSET(BG[0].SCBase), 2, INT_V}, + {OFFSET(BG[0].VOffset), 2, INT_V}, + {OFFSET(BG[0].HOffset), 2, INT_V}, + {OFFSET(BG[0].BGSize), 1, INT_V}, + {OFFSET(BG[0].NameBase), 2, INT_V}, + {OFFSET(BG[0].SCSize), 2, INT_V}, + + {OFFSET(BG[1].SCBase), 2, INT_V}, + {OFFSET(BG[1].VOffset), 2, INT_V}, + {OFFSET(BG[1].HOffset), 2, INT_V}, + {OFFSET(BG[1].BGSize), 1, INT_V}, + {OFFSET(BG[1].NameBase), 2, INT_V}, + {OFFSET(BG[1].SCSize), 2, INT_V}, + + {OFFSET(BG[2].SCBase), 2, INT_V}, + {OFFSET(BG[2].VOffset), 2, INT_V}, + {OFFSET(BG[2].HOffset), 2, INT_V}, + {OFFSET(BG[2].BGSize), 1, INT_V}, + {OFFSET(BG[2].NameBase), 2, INT_V}, + {OFFSET(BG[2].SCSize), 2, INT_V}, + + {OFFSET(BG[3].SCBase), 2, INT_V}, + {OFFSET(BG[3].VOffset), 2, INT_V}, + {OFFSET(BG[3].HOffset), 2, INT_V}, + {OFFSET(BG[3].BGSize), 1, INT_V}, + {OFFSET(BG[3].NameBase), 2, INT_V}, + {OFFSET(BG[3].SCSize), 2, INT_V}, + + {OFFSET(CGFLIP), 1, INT_V}, + {OFFSET(CGDATA), 256, uint16_ARRAY_V}, + {OFFSET(FirstSprite), 1, INT_V}, #define O(N) \ {OFFSET (OBJ[N].HPos), 2, INT_V}, \ {OFFSET (OBJ[N].VPos), 2, INT_V}, \ @@ -188,66 +193,66 @@ static FreezeData SnapPPU [] = { {OFFSET (OBJ[N].Palette), 1, INT_V}, \ {OFFSET (OBJ[N].Size), 1, INT_V} - O( 0), O( 1), O( 2), O( 3), O( 4), O( 5), O( 6), O( 7), - O( 8), O( 9), O( 10), O( 11), O( 12), O( 13), O( 14), O( 15), - O( 16), O( 17), O( 18), O( 19), O( 20), O( 21), O( 22), O( 23), - O( 24), O( 25), O( 26), O( 27), O( 28), O( 29), O( 30), O( 31), - O( 32), O( 33), O( 34), O( 35), O( 36), O( 37), O( 38), O( 39), - O( 40), O( 41), O( 42), O( 43), O( 44), O( 45), O( 46), O( 47), - O( 48), O( 49), O( 50), O( 51), O( 52), O( 53), O( 54), O( 55), - O( 56), O( 57), O( 58), O( 59), O( 60), O( 61), O( 62), O( 63), - O( 64), O( 65), O( 66), O( 67), O( 68), O( 69), O( 70), O( 71), - O( 72), O( 73), O( 74), O( 75), O( 76), O( 77), O( 78), O( 79), - O( 80), O( 81), O( 82), O( 83), O( 84), O( 85), O( 86), O( 87), - O( 88), O( 89), O( 90), O( 91), O( 92), O( 93), O( 94), O( 95), - O( 96), O( 97), O( 98), O( 99), O(100), O(101), O(102), O(103), - O(104), O(105), O(106), O(107), O(108), O(109), O(110), O(111), - O(112), O(113), O(114), O(115), O(116), O(117), O(118), O(119), - O(120), O(121), O(122), O(123), O(124), O(125), O(126), O(127), + O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7), + O(8), O(9), O(10), O(11), O(12), O(13), O(14), O(15), + O(16), O(17), O(18), O(19), O(20), O(21), O(22), O(23), + O(24), O(25), O(26), O(27), O(28), O(29), O(30), O(31), + O(32), O(33), O(34), O(35), O(36), O(37), O(38), O(39), + O(40), O(41), O(42), O(43), O(44), O(45), O(46), O(47), + O(48), O(49), O(50), O(51), O(52), O(53), O(54), O(55), + O(56), O(57), O(58), O(59), O(60), O(61), O(62), O(63), + O(64), O(65), O(66), O(67), O(68), O(69), O(70), O(71), + O(72), O(73), O(74), O(75), O(76), O(77), O(78), O(79), + O(80), O(81), O(82), O(83), O(84), O(85), O(86), O(87), + O(88), O(89), O(90), O(91), O(92), O(93), O(94), O(95), + O(96), O(97), O(98), O(99), O(100), O(101), O(102), O(103), + O(104), O(105), O(106), O(107), O(108), O(109), O(110), O(111), + O(112), O(113), O(114), O(115), O(116), O(117), O(118), O(119), + O(120), O(121), O(122), O(123), O(124), O(125), O(126), O(127), #undef O - {OFFSET (OAMPriorityRotation), 1, INT_V}, - {OFFSET (OAMAddr), 2, INT_V}, - {OFFSET (OAMFlip), 1, INT_V}, - {OFFSET (OAMTileAddress), 2, INT_V}, - {OFFSET (IRQVBeamPos), 2, INT_V}, - {OFFSET (IRQHBeamPos), 2, INT_V}, - {OFFSET (VBeamPosLatched), 2, INT_V}, - {OFFSET (HBeamPosLatched), 2, INT_V}, - {OFFSET (HBeamFlip), 1, INT_V}, - {OFFSET (VBeamFlip), 1, INT_V}, - {OFFSET (HVBeamCounterLatched), 1, INT_V}, - {OFFSET (MatrixA), 2, INT_V}, - {OFFSET (MatrixB), 2, INT_V}, - {OFFSET (MatrixC), 2, INT_V}, - {OFFSET (MatrixD), 2, INT_V}, - {OFFSET (CentreX), 2, INT_V}, - {OFFSET (CentreY), 2, INT_V}, - {OFFSET (Joypad1ButtonReadPos), 1, INT_V}, - {OFFSET (Joypad2ButtonReadPos), 1, INT_V}, - {OFFSET (Joypad3ButtonReadPos), 1, INT_V}, - {OFFSET (CGADD), 1, INT_V}, - {OFFSET (FixedColourRed), 1, INT_V}, - {OFFSET (FixedColourGreen), 1, INT_V}, - {OFFSET (FixedColourBlue), 1, INT_V}, - {OFFSET (SavedOAMAddr), 2, INT_V}, - {OFFSET (ScreenHeight), 2, INT_V}, - {OFFSET (WRAM), 4, INT_V}, - {OFFSET (ForcedBlanking), 1, INT_V}, - {OFFSET (OBJNameSelect), 2, INT_V}, - {OFFSET (OBJSizeSelect), 1, INT_V}, - {OFFSET (OBJNameBase), 2, INT_V}, - {OFFSET (OAMReadFlip), 1, INT_V}, - {OFFSET (VTimerEnabled), 1, INT_V}, - {OFFSET (HTimerEnabled), 1, INT_V}, - {OFFSET (HTimerPosition), 2, INT_V}, - {OFFSET (Mosaic), 1, INT_V}, - {OFFSET (Mode7HFlip), 1, INT_V}, - {OFFSET (Mode7VFlip), 1, INT_V}, - {OFFSET (Mode7Repeat), 1, INT_V}, - {OFFSET (Window1Left), 1, INT_V}, - {OFFSET (Window1Right), 1, INT_V}, - {OFFSET (Window2Left), 1, INT_V}, - {OFFSET (Window2Right), 1, INT_V}, + {OFFSET(OAMPriorityRotation), 1, INT_V}, + {OFFSET(OAMAddr), 2, INT_V}, + {OFFSET(OAMFlip), 1, INT_V}, + {OFFSET(OAMTileAddress), 2, INT_V}, + {OFFSET(IRQVBeamPos), 2, INT_V}, + {OFFSET(IRQHBeamPos), 2, INT_V}, + {OFFSET(VBeamPosLatched), 2, INT_V}, + {OFFSET(HBeamPosLatched), 2, INT_V}, + {OFFSET(HBeamFlip), 1, INT_V}, + {OFFSET(VBeamFlip), 1, INT_V}, + {OFFSET(HVBeamCounterLatched), 1, INT_V}, + {OFFSET(MatrixA), 2, INT_V}, + {OFFSET(MatrixB), 2, INT_V}, + {OFFSET(MatrixC), 2, INT_V}, + {OFFSET(MatrixD), 2, INT_V}, + {OFFSET(CentreX), 2, INT_V}, + {OFFSET(CentreY), 2, INT_V}, + {OFFSET(Joypad1ButtonReadPos), 1, INT_V}, + {OFFSET(Joypad2ButtonReadPos), 1, INT_V}, + {OFFSET(Joypad3ButtonReadPos), 1, INT_V}, + {OFFSET(CGADD), 1, INT_V}, + {OFFSET(FixedColourRed), 1, INT_V}, + {OFFSET(FixedColourGreen), 1, INT_V}, + {OFFSET(FixedColourBlue), 1, INT_V}, + {OFFSET(SavedOAMAddr), 2, INT_V}, + {OFFSET(ScreenHeight), 2, INT_V}, + {OFFSET(WRAM), 4, INT_V}, + {OFFSET(ForcedBlanking), 1, INT_V}, + {OFFSET(OBJNameSelect), 2, INT_V}, + {OFFSET(OBJSizeSelect), 1, INT_V}, + {OFFSET(OBJNameBase), 2, INT_V}, + {OFFSET(OAMReadFlip), 1, INT_V}, + {OFFSET(VTimerEnabled), 1, INT_V}, + {OFFSET(HTimerEnabled), 1, INT_V}, + {OFFSET(HTimerPosition), 2, INT_V}, + {OFFSET(Mosaic), 1, INT_V}, + {OFFSET(Mode7HFlip), 1, INT_V}, + {OFFSET(Mode7VFlip), 1, INT_V}, + {OFFSET(Mode7Repeat), 1, INT_V}, + {OFFSET(Window1Left), 1, INT_V}, + {OFFSET(Window1Right), 1, INT_V}, + {OFFSET(Window2Left), 1, INT_V}, + {OFFSET(Window2Right), 1, INT_V}, #define O(N) \ {OFFSET (ClipWindowOverlapLogic[N]), 1, INT_V}, \ {OFFSET (ClipWindow1Enable[N]), 1, INT_V}, \ @@ -255,22 +260,23 @@ static FreezeData SnapPPU [] = { {OFFSET (ClipWindow1Inside[N]), 1, INT_V}, \ {OFFSET (ClipWindow2Inside[N]), 1, INT_V} - O(0), O(1), O(2), O(3), O(4), O(5), + O(0), O(1), O(2), O(3), O(4), O(5), #undef O - {OFFSET (CGFLIPRead), 1, INT_V}, - {OFFSET (Need16x8Mulitply), 1, INT_V}, - {OFFSET (BGMosaic), 4, uint8_ARRAY_V}, - {OFFSET (OAMData), 512 + 32, uint8_ARRAY_V}, - {OFFSET (Need16x8Mulitply), 1, INT_V}, - {OFFSET (MouseSpeed), 2, uint8_ARRAY_V} + {OFFSET(CGFLIPRead), 1, INT_V}, + {OFFSET(Need16x8Mulitply), 1, INT_V}, + {OFFSET(BGMosaic), 4, uint8_ARRAY_V}, + {OFFSET(OAMData), 512 + 32, uint8_ARRAY_V}, + {OFFSET(Need16x8Mulitply), 1, INT_V}, + {OFFSET(MouseSpeed), 2, uint8_ARRAY_V} }; #undef OFFSET #define OFFSET(f) Offset(f, SDMA *) -static FreezeData SnapDMA [] = { +static FreezeData SnapDMA [] = +{ #define O(N) \ {OFFSET (TransferDirection) + N * sizeof ( SDMA), 1, INT_V}, \ {OFFSET (AAddressFixed) + N * sizeof ( SDMA), 1, INT_V}, \ @@ -288,55 +294,58 @@ static FreezeData SnapDMA [] = { {OFFSET (LineCount) + N * sizeof ( SDMA), 1, INT_V}, \ {OFFSET (FirstLine) + N * sizeof ( SDMA), 1, INT_V} - O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7) + O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7) #undef O }; #undef OFFSET #define OFFSET(f) Offset(f, SAPU *) -static FreezeData SnapAPU [] = { - {OFFSET (Cycles), 4, INT_V}, - {OFFSET (ShowROM), 1, INT_V}, - {OFFSET (Flags), 1, INT_V}, - {OFFSET (KeyedChannels), 1, INT_V}, - {OFFSET (OutPorts), 4, uint8_ARRAY_V}, - {OFFSET (DSP), 0x80, uint8_ARRAY_V}, - {OFFSET (ExtraRAM), 64, uint8_ARRAY_V}, - {OFFSET (Timer), 3, uint16_ARRAY_V}, - {OFFSET (TimerTarget), 3, uint16_ARRAY_V}, - {OFFSET (TimerEnabled), 3, uint8_ARRAY_V}, - {OFFSET (TimerValueWritten), 3, uint8_ARRAY_V} +static FreezeData SnapAPU [] = +{ + {OFFSET(Cycles), 4, INT_V}, + {OFFSET(ShowROM), 1, INT_V}, + {OFFSET(Flags), 1, INT_V}, + {OFFSET(KeyedChannels), 1, INT_V}, + {OFFSET(OutPorts), 4, uint8_ARRAY_V}, + {OFFSET(DSP), 0x80, uint8_ARRAY_V}, + {OFFSET(ExtraRAM), 64, uint8_ARRAY_V}, + {OFFSET(Timer), 3, uint16_ARRAY_V}, + {OFFSET(TimerTarget), 3, uint16_ARRAY_V}, + {OFFSET(TimerEnabled), 3, uint8_ARRAY_V}, + {OFFSET(TimerValueWritten), 3, uint8_ARRAY_V} }; #undef OFFSET #define OFFSET(f) Offset(f, SAPURegisters *) -static FreezeData SnapAPURegisters [] = { - {OFFSET (P) , 1, INT_V}, - {OFFSET (YA.W), 2, INT_V}, - {OFFSET (X) , 1, INT_V}, - {OFFSET (S) , 1, INT_V}, - {OFFSET (PC) , 2, INT_V} +static FreezeData SnapAPURegisters [] = +{ + {OFFSET(P) , 1, INT_V}, + {OFFSET(YA.W), 2, INT_V}, + {OFFSET(X) , 1, INT_V}, + {OFFSET(S) , 1, INT_V}, + {OFFSET(PC) , 2, INT_V} }; #undef OFFSET #undef OFFSET1 #define OFFSET(f) Offset(f,SSoundData *) -static FreezeData SnapSoundData [] = { - {OFFSET (master_volume_left), 2, INT_V}, - {OFFSET (master_volume_right), 2, INT_V}, - {OFFSET (echo_volume_left), 2, INT_V}, - {OFFSET (echo_volume_right), 2, INT_V}, - {OFFSET (echo_enable), 4, INT_V}, - {OFFSET (echo_feedback), 4, INT_V}, - {OFFSET (echo_ptr), 4, INT_V}, - {OFFSET (echo_buffer_size), 4, INT_V}, - {OFFSET (echo_write_enabled), 4, INT_V}, - {OFFSET (echo_channel_enable), 4, INT_V}, - {OFFSET (pitch_mod), 4, INT_V}, - {OFFSET (dummy), 3, uint32_ARRAY_V}, +static FreezeData SnapSoundData [] = +{ + {OFFSET(master_volume_left), 2, INT_V}, + {OFFSET(master_volume_right), 2, INT_V}, + {OFFSET(echo_volume_left), 2, INT_V}, + {OFFSET(echo_volume_right), 2, INT_V}, + {OFFSET(echo_enable), 4, INT_V}, + {OFFSET(echo_feedback), 4, INT_V}, + {OFFSET(echo_ptr), 4, INT_V}, + {OFFSET(echo_buffer_size), 4, INT_V}, + {OFFSET(echo_write_enabled), 4, INT_V}, + {OFFSET(echo_channel_enable), 4, INT_V}, + {OFFSET(pitch_mod), 4, INT_V}, + {OFFSET(dummy), 3, uint32_ARRAY_V}, #define O(N) \ {OFFSET (channels [N].state), 4, INT_V}, \ {OFFSET (channels [N].type), 4, INT_V}, \ @@ -367,7 +376,7 @@ static FreezeData SnapSoundData [] = { {OFFSET (channels [N].sample_pointer), 4, INT_V}, \ {OFFSET (channels [N].mode), 4, INT_V} - O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7) + O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7) #undef O }; @@ -376,572 +385,568 @@ static FreezeData SnapSoundData [] = { #undef OFFSET #define OFFSET(f) Offset(f, SSA1Registers *) -static FreezeData SnapSA1Registers [] = { - {OFFSET (PB), 1, INT_V}, - {OFFSET (DB), 1, INT_V}, - {OFFSET (P.W), 2, INT_V}, - {OFFSET (A.W), 2, INT_V}, - {OFFSET (D.W), 2, INT_V}, - {OFFSET (S.W), 2, INT_V}, - {OFFSET (X.W), 2, INT_V}, - {OFFSET (Y.W), 2, INT_V}, - {OFFSET (PC), 2, INT_V} +static FreezeData SnapSA1Registers [] = +{ + {OFFSET(PB), 1, INT_V}, + {OFFSET(DB), 1, INT_V}, + {OFFSET(P.W), 2, INT_V}, + {OFFSET(A.W), 2, INT_V}, + {OFFSET(D.W), 2, INT_V}, + {OFFSET(S.W), 2, INT_V}, + {OFFSET(X.W), 2, INT_V}, + {OFFSET(Y.W), 2, INT_V}, + {OFFSET(PC), 2, INT_V} }; #undef OFFSET #define OFFSET(f) Offset(f, SSA1 *) -static FreezeData SnapSA1 [] = { - {OFFSET (Flags), 4, INT_V}, - {OFFSET (NMIActive), 1, INT_V}, - {OFFSET (IRQActive), 1, INT_V}, - {OFFSET (WaitingForInterrupt), 1, INT_V}, - {OFFSET (op1), 2, INT_V}, - {OFFSET (op2), 2, INT_V}, - {OFFSET (arithmetic_op), 4, INT_V}, - {OFFSET (sum), 8, INT_V}, - {OFFSET (overflow), 1, INT_V} +static FreezeData SnapSA1 [] = +{ + {OFFSET(Flags), 4, INT_V}, + {OFFSET(NMIActive), 1, INT_V}, + {OFFSET(IRQActive), 1, INT_V}, + {OFFSET(WaitingForInterrupt), 1, INT_V}, + {OFFSET(op1), 2, INT_V}, + {OFFSET(op2), 2, INT_V}, + {OFFSET(arithmetic_op), 4, INT_V}, + {OFFSET(sum), 8, INT_V}, + {OFFSET(overflow), 1, INT_V} }; #endif //static char ROMFilename [_MAX_PATH]; //static char SnapshotFilename [_MAX_PATH]; -static void Freeze (); -static int Unfreeze (); -void FreezeStruct (char *name, void *base, FreezeData *fields, - int num_fields); -void FreezeBlock (char *name, uint8 *block, int size); +static void Freeze(); +static int Unfreeze(); +void FreezeStruct(char* name, void* base, FreezeData* fields, + int num_fields); +void FreezeBlock(char* name, uint8* block, int size); -int UnfreezeStruct (char *name, void *base, FreezeData *fields, - int num_fields); -int UnfreezeBlock (char *name, uint8 *block, int size); +int UnfreezeStruct(char* name, void* base, FreezeData* fields, + int num_fields); +int UnfreezeBlock(char* name, uint8* block, int size); -bool8 Snapshot (const char *filename) +bool8 Snapshot(const char* filename) { - return (S9xFreezeGame (filename)); + return (S9xFreezeGame(filename)); } -bool8 S9xFreezeGame (const char *filename) +bool8 S9xFreezeGame(const char* filename) { - if(statef_open(filename, "wb")) - { - Freeze(); - statef_close(); - return (TRUE); - } - return (FALSE); + if (statef_open(filename, "wb")) + { + Freeze(); + statef_close(); + return (TRUE); + } + return (FALSE); } -bool8 S9xUnfreezeGame (const char *filename) +bool8 S9xUnfreezeGame(const char* filename) { - if(statef_open(filename, "rb")) - { - int result; - if ((result = Unfreeze()) != SUCCESS) - { - switch (result) - { - case WRONG_FORMAT: - S9xMessage (S9X_ERROR, S9X_WRONG_FORMAT, - "File not in Snes9x freeze format"); - S9xReset(); - break; - case WRONG_VERSION: - S9xMessage (S9X_ERROR, S9X_WRONG_VERSION, - "Incompatable Snes9x freeze file format version"); - S9xReset(); - break; - default: - // should never happen - break; - } - statef_close(); - return (FALSE); - } - statef_close(); - return (TRUE); - } - - - return (FALSE); + if (statef_open(filename, "rb")) + { + int result; + if ((result = Unfreeze()) != SUCCESS) + { + switch (result) + { + case WRONG_FORMAT: + S9xMessage(S9X_ERROR, S9X_WRONG_FORMAT, + "File not in Snes9x freeze format"); + S9xReset(); + break; + case WRONG_VERSION: + S9xMessage(S9X_ERROR, S9X_WRONG_VERSION, + "Incompatable Snes9x freeze file format version"); + S9xReset(); + break; + default: + // should never happen + break; + } + statef_close(); + return (FALSE); + } + statef_close(); + return (TRUE); + } + + + return (FALSE); } -static void Freeze () +static void Freeze() { - char buffer[1024]; - int i; + char buffer[1024]; + int i; - S9xSetSoundMute (TRUE); + S9xSetSoundMute(TRUE); #ifdef ZSNES_FX - if (Settings.SuperFX) - S9xSuperFXPreSaveState (); + if (Settings.SuperFX) + S9xSuperFXPreSaveState(); #endif - S9xSRTCPreSaveState (); - - for (i = 0; i < 8; i++) - { - SoundData.channels [i].previous16 [0] = (int16) SoundData.channels [i].previous [0]; - SoundData.channels [i].previous16 [1] = (int16) SoundData.channels [i].previous [1]; - } - sprintf (buffer, "%s:%04d\n", SNAPSHOT_MAGIC, SNAPSHOT_VERSION); - statef_write(buffer, strlen (buffer)); - sprintf (buffer, "NAM:%06d:%s%c", strlen (Memory.ROMFilename) + 1, - Memory.ROMFilename, 0); - statef_write(buffer, strlen (buffer) + 1); - FreezeStruct ("CPU", &CPU, SnapCPU, COUNT (SnapCPU)); - FreezeStruct ("REG", &Registers, SnapRegisters, COUNT (SnapRegisters)); - FreezeStruct ("PPU", &PPU, SnapPPU, COUNT (SnapPPU)); - FreezeStruct ("DMA", DMA, SnapDMA, COUNT (SnapDMA)); - -// RAM and VRAM - FreezeBlock ("VRA", Memory.VRAM, 0x10000); - FreezeBlock ("RAM", Memory.RAM, 0x20000); - FreezeBlock ("SRA", SRAM, 0x20000); - FreezeBlock ("FIL", Memory.FillRAM, 0x8000); - if (Settings.APUEnabled) - { -// APU - FreezeStruct ("APU", &APU, SnapAPU, COUNT (SnapAPU)); - // copy all SPC700 regs to savestate compatible struct - SAPURegisters spcregs; - spcregs.P = IAPU.P; - spcregs.YA.W = IAPU.YA.W; - spcregs.X = IAPU.X; - spcregs.S = IAPU.S; - spcregs.PC = IAPU.PC - IAPU.RAM; - FreezeStruct ("ARE", &spcregs, SnapAPURegisters, - COUNT (SnapAPURegisters)); - - FreezeBlock ("ARA", IAPU.RAM, 0x10000); - FreezeStruct ("SOU", &SoundData, SnapSoundData, - COUNT (SnapSoundData)); - } + S9xSRTCPreSaveState(); + + for (i = 0; i < 8; i++) + { + SoundData.channels [i].previous16 [0] = (int16) SoundData.channels [i].previous [0]; + SoundData.channels [i].previous16 [1] = (int16) SoundData.channels [i].previous [1]; + } + sprintf(buffer, "%s:%04d\n", SNAPSHOT_MAGIC, SNAPSHOT_VERSION); + statef_write(buffer, strlen(buffer)); + sprintf(buffer, "NAM:%06d:%s%c", strlen(Memory.ROMFilename) + 1, + Memory.ROMFilename, 0); + statef_write(buffer, strlen(buffer) + 1); + FreezeStruct("CPU", &CPU, SnapCPU, COUNT(SnapCPU)); + FreezeStruct("REG", &Registers, SnapRegisters, COUNT(SnapRegisters)); + FreezeStruct("PPU", &PPU, SnapPPU, COUNT(SnapPPU)); + FreezeStruct("DMA", DMA, SnapDMA, COUNT(SnapDMA)); + + // RAM and VRAM + FreezeBlock("VRA", Memory.VRAM, 0x10000); + FreezeBlock("RAM", Memory.RAM, 0x20000); + FreezeBlock("SRA", SRAM, 0x20000); + FreezeBlock("FIL", Memory.FillRAM, 0x8000); + if (Settings.APUEnabled) + { + // APU + FreezeStruct("APU", &APU, SnapAPU, COUNT(SnapAPU)); + // copy all SPC700 regs to savestate compatible struct + SAPURegisters spcregs; + spcregs.P = IAPU.P; + spcregs.YA.W = IAPU.YA.W; + spcregs.X = IAPU.X; + spcregs.S = IAPU.S; + spcregs.PC = IAPU.PC - IAPU.RAM; + FreezeStruct("ARE", &spcregs, SnapAPURegisters, + COUNT(SnapAPURegisters)); + + FreezeBlock("ARA", IAPU.RAM, 0x10000); + FreezeStruct("SOU", &SoundData, SnapSoundData, + COUNT(SnapSoundData)); + } #ifdef USE_SA1 - if (Settings.SA1) - { - SA1Registers.PC = SA1.PC - SA1.PCBase; - S9xSA1PackStatus (); - FreezeStruct ("SA1", &SA1, SnapSA1, COUNT (SnapSA1)); - FreezeStruct ("SAR", &SA1Registers, SnapSA1Registers, - COUNT (SnapSA1Registers)); - } + if (Settings.SA1) + { + SA1Registers.PC = SA1.PC - SA1.PCBase; + S9xSA1PackStatus(); + FreezeStruct("SA1", &SA1, SnapSA1, COUNT(SnapSA1)); + FreezeStruct("SAR", &SA1Registers, SnapSA1Registers, + COUNT(SnapSA1Registers)); + } #endif - S9xSetSoundMute (FALSE); + S9xSetSoundMute(FALSE); #ifdef ZSNES_FX - if (Settings.SuperFX) - S9xSuperFXPostSaveState (); + if (Settings.SuperFX) + S9xSuperFXPostSaveState(); #endif } static int Unfreeze() { - // notaz: overflowing the damn Symbian stack again - char buffer [16]; - char rom_filename [512]; - int result; - - int version; - - unsigned int len = strlen (SNAPSHOT_MAGIC) + 1 + 4 + 1; - if (statef_read(buffer, len) != (int)len) - { - return (WRONG_FORMAT); - } - if (strncmp (buffer, SNAPSHOT_MAGIC, strlen (SNAPSHOT_MAGIC)) != 0) - { - return (WRONG_FORMAT); - } - if ((version = atoi (&buffer [strlen (SNAPSHOT_MAGIC) + 1])) > SNAPSHOT_VERSION) - return (WRONG_VERSION); - - if ((result = UnfreezeBlock("NAM", (uint8 *) rom_filename, 512)) != SUCCESS) - return (result); - - if (strcasecmp (rom_filename, Memory.ROMFilename) != 0 && - strcasecmp (S9xBasename (rom_filename), S9xBasename (Memory.ROMFilename)) != 0) - { - S9xMessage (S9X_WARNING, S9X_FREEZE_ROM_NAME, - "Current loaded ROM image doesn't match that required by freeze-game file."); - } - - - - uint32 old_flags = CPU.Flags; + // notaz: overflowing the damn Symbian stack again + char buffer [16]; + char rom_filename [512]; + int result; + + int version; + + unsigned int len = strlen(SNAPSHOT_MAGIC) + 1 + 4 + 1; + if (statef_read(buffer, len) != (int)len) + return (WRONG_FORMAT); + if (strncmp(buffer, SNAPSHOT_MAGIC, strlen(SNAPSHOT_MAGIC)) != 0) + return (WRONG_FORMAT); + if ((version = atoi(&buffer [strlen(SNAPSHOT_MAGIC) + 1])) > SNAPSHOT_VERSION) + return (WRONG_VERSION); + + if ((result = UnfreezeBlock("NAM", (uint8*) rom_filename, 512)) != SUCCESS) + return (result); + + if (strcasecmp(rom_filename, Memory.ROMFilename) != 0 && + strcasecmp(S9xBasename(rom_filename), S9xBasename(Memory.ROMFilename)) != 0) + { + S9xMessage(S9X_WARNING, S9X_FREEZE_ROM_NAME, + "Current loaded ROM image doesn't match that required by freeze-game file."); + } + + + + uint32 old_flags = CPU.Flags; #ifdef USE_SA1 - uint32 sa1_old_flags = SA1.Flags; + uint32 sa1_old_flags = SA1.Flags; #endif - S9xReset (); - S9xSetSoundMute (TRUE); - - if ((result = UnfreezeStruct("CPU", &CPU, SnapCPU, - COUNT (SnapCPU))) != SUCCESS) - return (result); - - - FixROMSpeed (); - CPU.Flags |= old_flags & (DEBUG_MODE_FLAG | TRACE_FLAG | - SINGLE_STEP_FLAG | FRAME_ADVANCE_FLAG); - if ((result = UnfreezeStruct("REG", &Registers, SnapRegisters, COUNT (SnapRegisters))) != SUCCESS) - return (result); - if ((result = UnfreezeStruct("PPU", &PPU, SnapPPU, COUNT (SnapPPU))) != SUCCESS) - return (result); - - - IPPU.ColorsChanged = TRUE; - IPPU.OBJChanged = TRUE; - CPU.InDMA = FALSE; - // Restore colors from PPU - unsigned int i; - for (i = 0; i < 256; i++) { - IPPU.Red[i] = PPU.CGDATA[i] & 0x1f; - IPPU.Green[i] = (PPU.CGDATA[i] >> 5) & 0x1f; - IPPU.Blue[i] = (PPU.CGDATA[i] >> 10) & 0x1f; - } - - S9xFixColourBrightness (); - IPPU.RenderThisFrame = FALSE; - - if ((result = UnfreezeStruct ("DMA", DMA, SnapDMA, - COUNT (SnapDMA))) != SUCCESS) - return (result); - - if ((result = UnfreezeBlock ("VRA", Memory.VRAM, 0x10000)) != SUCCESS) - return (result); - - if ((result = UnfreezeBlock ("RAM", Memory.RAM, 0x20000)) != SUCCESS) - return (result); - - if ((result = UnfreezeBlock ("SRA", SRAM, 0x20000)) != SUCCESS) - return (result); - - if ((result = UnfreezeBlock ("FIL", Memory.FillRAM, 0x8000)) != SUCCESS) - return (result); - - // Restore graphics shadow registers - GFX.r212c_s = Memory.FillRAM[0x212c]; - GFX.r212d_s = Memory.FillRAM[0x212d]; - GFX.r212e_s = Memory.FillRAM[0x212e]; - GFX.r212f_s = Memory.FillRAM[0x212f]; - GFX.r2130_s = Memory.FillRAM[0x2130]; - GFX.r2131_s = Memory.FillRAM[0x2131]; - - if (UnfreezeStruct ("APU", &APU, SnapAPU, COUNT (SnapAPU)) == SUCCESS) - { - SAPURegisters spcregs; - if ((result = UnfreezeStruct ("ARE", &spcregs, SnapAPURegisters, - COUNT (SnapAPURegisters))) != SUCCESS) - return (result); - // reload all SPC700 regs from savestate compatible struct - IAPU.P = spcregs.P; - IAPU.YA.W = spcregs.YA.W; - IAPU.X = spcregs.X; - IAPU.S = spcregs.S; - IAPU.PC = IAPU.RAM + spcregs.PC; - - if ((result = UnfreezeBlock ("ARA", IAPU.RAM, 0x10000)) != SUCCESS) - return (result); - - if ((result = UnfreezeStruct ("SOU", &SoundData, SnapSoundData, - COUNT (SnapSoundData))) != SUCCESS) - return (result); - - // notaz: just to be sure + S9xReset(); + S9xSetSoundMute(TRUE); + + if ((result = UnfreezeStruct("CPU", &CPU, SnapCPU, + COUNT(SnapCPU))) != SUCCESS) + return (result); + + + FixROMSpeed(); + CPU.Flags |= old_flags & (DEBUG_MODE_FLAG | TRACE_FLAG | + SINGLE_STEP_FLAG | FRAME_ADVANCE_FLAG); + if ((result = UnfreezeStruct("REG", &Registers, SnapRegisters, COUNT(SnapRegisters))) != SUCCESS) + return (result); + if ((result = UnfreezeStruct("PPU", &PPU, SnapPPU, COUNT(SnapPPU))) != SUCCESS) + return (result); + + + IPPU.ColorsChanged = TRUE; + IPPU.OBJChanged = TRUE; + CPU.InDMA = FALSE; + // Restore colors from PPU + unsigned int i; + for (i = 0; i < 256; i++) + { + IPPU.Red[i] = PPU.CGDATA[i] & 0x1f; + IPPU.Green[i] = (PPU.CGDATA[i] >> 5) & 0x1f; + IPPU.Blue[i] = (PPU.CGDATA[i] >> 10) & 0x1f; + } + + S9xFixColourBrightness(); + IPPU.RenderThisFrame = FALSE; + + if ((result = UnfreezeStruct("DMA", DMA, SnapDMA, + COUNT(SnapDMA))) != SUCCESS) + return (result); + + if ((result = UnfreezeBlock("VRA", Memory.VRAM, 0x10000)) != SUCCESS) + return (result); + + if ((result = UnfreezeBlock("RAM", Memory.RAM, 0x20000)) != SUCCESS) + return (result); + + if ((result = UnfreezeBlock("SRA", SRAM, 0x20000)) != SUCCESS) + return (result); + + if ((result = UnfreezeBlock("FIL", Memory.FillRAM, 0x8000)) != SUCCESS) + return (result); + + // Restore graphics shadow registers + GFX.r212c_s = Memory.FillRAM[0x212c]; + GFX.r212d_s = Memory.FillRAM[0x212d]; + GFX.r212e_s = Memory.FillRAM[0x212e]; + GFX.r212f_s = Memory.FillRAM[0x212f]; + GFX.r2130_s = Memory.FillRAM[0x2130]; + GFX.r2131_s = Memory.FillRAM[0x2131]; + + if (UnfreezeStruct("APU", &APU, SnapAPU, COUNT(SnapAPU)) == SUCCESS) + { + SAPURegisters spcregs; + if ((result = UnfreezeStruct("ARE", &spcregs, SnapAPURegisters, + COUNT(SnapAPURegisters))) != SUCCESS) + return (result); + // reload all SPC700 regs from savestate compatible struct + IAPU.P = spcregs.P; + IAPU.YA.W = spcregs.YA.W; + IAPU.X = spcregs.X; + IAPU.S = spcregs.S; + IAPU.PC = IAPU.RAM + spcregs.PC; + + if ((result = UnfreezeBlock("ARA", IAPU.RAM, 0x10000)) != SUCCESS) + return (result); + + if ((result = UnfreezeStruct("SOU", &SoundData, SnapSoundData, + COUNT(SnapSoundData))) != SUCCESS) + return (result); + + // notaz: just to be sure int u; - for(u=0; u<8; u++) { - SoundData.channels[u].env_ind_attack &= 0xf; - SoundData.channels[u].env_ind_decay &= 0x7; - SoundData.channels[u].env_ind_sustain&= 0x1f; - } - - S9xSetSoundMute (FALSE); - S9xAPUUnpackStatus (); - if (APUCheckDirectPage ()) - IAPU.DirectPage = IAPU.RAM + 0x100; - else - IAPU.DirectPage = IAPU.RAM; - Settings.APUEnabled = TRUE; - /*IAPU.APUExecuting*/CPU.APU_APUExecuting = TRUE; - } - else - { - Settings.APUEnabled = FALSE; - /*IAPU.APUExecuting*/CPU.APU_APUExecuting = FALSE; - S9xSetSoundMute (TRUE); - } + for (u = 0; u < 8; u++) + { + SoundData.channels[u].env_ind_attack &= 0xf; + SoundData.channels[u].env_ind_decay &= 0x7; + SoundData.channels[u].env_ind_sustain &= 0x1f; + } + + S9xSetSoundMute(FALSE); + S9xAPUUnpackStatus(); + if (APUCheckDirectPage()) + IAPU.DirectPage = IAPU.RAM + 0x100; + else + IAPU.DirectPage = IAPU.RAM; + Settings.APUEnabled = TRUE; + /*IAPU.APUExecuting*/CPU.APU_APUExecuting = TRUE; + } + else + { + Settings.APUEnabled = FALSE; + /*IAPU.APUExecuting*/CPU.APU_APUExecuting = FALSE; + S9xSetSoundMute(TRUE); + } #ifdef USE_SA1 - if ((result = UnfreezeStruct ("SA1", &SA1, SnapSA1, - COUNT(SnapSA1))) == SUCCESS) - { - if ((result = UnfreezeStruct ("SAR", &SA1Registers, - SnapSA1Registers, COUNT (SnapSA1Registers))) != SUCCESS) - return (result); - - S9xFixSA1AfterSnapshotLoad (); - SA1.Flags |= sa1_old_flags & (TRACE_FLAG); - } + if ((result = UnfreezeStruct("SA1", &SA1, SnapSA1, + COUNT(SnapSA1))) == SUCCESS) + { + if ((result = UnfreezeStruct("SAR", &SA1Registers, + SnapSA1Registers, COUNT(SnapSA1Registers))) != SUCCESS) + return (result); + + S9xFixSA1AfterSnapshotLoad(); + SA1.Flags |= sa1_old_flags & (TRACE_FLAG); + } #endif - S9xFixSoundAfterSnapshotLoad (); - ICPU.ShiftedPB = Registers.PB << 16; - ICPU.ShiftedDB = Registers.DB << 16; - S9xSetPCBase (ICPU.ShiftedPB + Registers.PC); - -#ifndef ASMCPU - S9xUnpackStatus (); // not needed - S9xFixCycles (); // also not needed? + S9xFixSoundAfterSnapshotLoad(); + ICPU.ShiftedPB = Registers.PB << 16; + ICPU.ShiftedDB = Registers.DB << 16; + S9xSetPCBase(ICPU.ShiftedPB + Registers.PC); + +#ifndef ASMCPU + S9xUnpackStatus(); // not needed + S9xFixCycles(); // also not needed? #endif - S9xReschedule (); + S9xReschedule(); #ifdef ZSNES_FX - if (Settings.SuperFX) - S9xSuperFXPostLoadState (); + if (Settings.SuperFX) + S9xSuperFXPostLoadState(); #endif - S9xSRTCPostLoadState (); - if (Settings.SDD1) S9xSDD1PostLoadState (); + S9xSRTCPostLoadState(); + if (Settings.SDD1) S9xSDD1PostLoadState(); - return (SUCCESS); + return (SUCCESS); } -int FreezeSize (int size, int type) +int FreezeSize(int size, int type) { - switch (type) - { - case uint16_ARRAY_V: - return (size * 2); - case uint32_ARRAY_V: - return (size * 4); - default: - return (size); - } + switch (type) + { + case uint16_ARRAY_V: + return (size * 2); + case uint32_ARRAY_V: + return (size * 4); + default: + return (size); + } } -void FreezeStruct(char *name, void *base, FreezeData *fields, - int num_fields) +void FreezeStruct(char* name, void* base, FreezeData* fields, + int num_fields) { - // Work out the size of the required block - int len = 0; - int i; - int j; - - for (i = 0; i < num_fields; i++) - { - if (fields [i].offset + FreezeSize (fields [i].size, - fields [i].type) > len) - len = fields [i].offset + FreezeSize (fields [i].size, - fields [i].type); - } - -// uint8 *block = new uint8 [len]; - uint8 *block = (uint8*)malloc(len); - uint8 *ptr = block; - uint16 word; - uint32 dword; - int64 qword; - - // Build the block ready to be streamed out - for (i = 0; i < num_fields; i++) - { - switch (fields [i].type) - { - case INT_V: - switch (fields [i].size) - { - case 1: - *ptr++ = *((uint8 *) base + fields [i].offset); - break; - case 2: - word = *((uint16 *) ((uint8 *) base + fields [i].offset)); - *ptr++ = (uint8) (word >> 8); - *ptr++ = (uint8) word; - break; - case 4: - dword = *((uint32 *) ((uint8 *) base + fields [i].offset)); - *ptr++ = (uint8) (dword >> 24); - *ptr++ = (uint8) (dword >> 16); - *ptr++ = (uint8) (dword >> 8); - *ptr++ = (uint8) dword; - break; - case 8: - qword = *((int64 *) ((uint8 *) base + fields [i].offset)); - *ptr++ = (uint8) (qword >> 56); - *ptr++ = (uint8) (qword >> 48); - *ptr++ = (uint8) (qword >> 40); - *ptr++ = (uint8) (qword >> 32); - *ptr++ = (uint8) (qword >> 24); - *ptr++ = (uint8) (qword >> 16); - *ptr++ = (uint8) (qword >> 8); - *ptr++ = (uint8) qword; - break; - } - break; - case uint8_ARRAY_V: - memmove (ptr, (uint8 *) base + fields [i].offset, fields [i].size); - ptr += fields [i].size; - break; - case uint16_ARRAY_V: - for (j = 0; j < fields [i].size; j++) - { - word = *((uint16 *) ((uint8 *) base + fields [i].offset + j * 2)); - *ptr++ = (uint8) (word >> 8); - *ptr++ = (uint8) word; - } - break; - case uint32_ARRAY_V: - for (j = 0; j < fields [i].size; j++) - { - dword = *((uint32 *) ((uint8 *) base + fields [i].offset + j * 4)); - *ptr++ = (uint8) (dword >> 24); - *ptr++ = (uint8) (dword >> 16); - *ptr++ = (uint8) (dword >> 8); - *ptr++ = (uint8) dword; - } - break; - } - } - - FreezeBlock (name, block, len); - - free(block); + // Work out the size of the required block + int len = 0; + int i; + int j; + + for (i = 0; i < num_fields; i++) + { + if (fields [i].offset + FreezeSize(fields [i].size, + fields [i].type) > len) + len = fields [i].offset + FreezeSize(fields [i].size, + fields [i].type); + } + + // uint8 *block = new uint8 [len]; + uint8* block = (uint8*)malloc(len); + uint8* ptr = block; + uint16 word; + uint32 dword; + int64 qword; + + // Build the block ready to be streamed out + for (i = 0; i < num_fields; i++) + { + switch (fields [i].type) + { + case INT_V: + switch (fields [i].size) + { + case 1: + *ptr++ = *((uint8*) base + fields [i].offset); + break; + case 2: + word = *((uint16*)((uint8*) base + fields [i].offset)); + *ptr++ = (uint8)(word >> 8); + *ptr++ = (uint8) word; + break; + case 4: + dword = *((uint32*)((uint8*) base + fields [i].offset)); + *ptr++ = (uint8)(dword >> 24); + *ptr++ = (uint8)(dword >> 16); + *ptr++ = (uint8)(dword >> 8); + *ptr++ = (uint8) dword; + break; + case 8: + qword = *((int64*)((uint8*) base + fields [i].offset)); + *ptr++ = (uint8)(qword >> 56); + *ptr++ = (uint8)(qword >> 48); + *ptr++ = (uint8)(qword >> 40); + *ptr++ = (uint8)(qword >> 32); + *ptr++ = (uint8)(qword >> 24); + *ptr++ = (uint8)(qword >> 16); + *ptr++ = (uint8)(qword >> 8); + *ptr++ = (uint8) qword; + break; + } + break; + case uint8_ARRAY_V: + memmove(ptr, (uint8*) base + fields [i].offset, fields [i].size); + ptr += fields [i].size; + break; + case uint16_ARRAY_V: + for (j = 0; j < fields [i].size; j++) + { + word = *((uint16*)((uint8*) base + fields [i].offset + j * 2)); + *ptr++ = (uint8)(word >> 8); + *ptr++ = (uint8) word; + } + break; + case uint32_ARRAY_V: + for (j = 0; j < fields [i].size; j++) + { + dword = *((uint32*)((uint8*) base + fields [i].offset + j * 4)); + *ptr++ = (uint8)(dword >> 24); + *ptr++ = (uint8)(dword >> 16); + *ptr++ = (uint8)(dword >> 8); + *ptr++ = (uint8) dword; + } + break; + } + } + + FreezeBlock(name, block, len); + + free(block); } -void FreezeBlock (char *name, uint8 *block, int size) +void FreezeBlock(char* name, uint8* block, int size) { - char buffer [512]; - sprintf (buffer, "%s:%06d:", name, size); - statef_write(buffer, strlen (buffer)); - statef_write(block, size); - + char buffer [512]; + sprintf(buffer, "%s:%06d:", name, size); + statef_write(buffer, strlen(buffer)); + statef_write(block, size); + } -int UnfreezeStruct (char *name, void *base, FreezeData *fields, - int num_fields) +int UnfreezeStruct(char* name, void* base, FreezeData* fields, + int num_fields) { - // Work out the size of the required block - int len = 0; - int i; - int j; - - for (i = 0; i < num_fields; i++) - { - if (fields [i].offset + FreezeSize (fields [i].size, - fields [i].type) > len) - len = fields [i].offset + FreezeSize (fields [i].size, - fields [i].type); - } - - uint8 *block = (uint8*)malloc(len); - uint8 *ptr = block; - uint16 word; - uint32 dword; - int64 qword; - int result; - - if ((result = UnfreezeBlock (name, block, len)) != SUCCESS) - { - free(block); - return (result); - } - - // Unpack the block of data into a C structure - for (i = 0; i < num_fields; i++) - { - switch (fields [i].type) - { - case INT_V: - switch (fields [i].size) - { - case 1: - *((uint8 *) base + fields [i].offset) = *ptr++; - break; - case 2: - word = *ptr++ << 8; - word |= *ptr++; - *((uint16 *) ((uint8 *) base + fields [i].offset)) = word; - break; - case 4: - dword = *ptr++ << 24; - dword |= *ptr++ << 16; - dword |= *ptr++ << 8; - dword |= *ptr++; - *((uint32 *) ((uint8 *) base + fields [i].offset)) = dword; - break; - case 8: - qword = (int64) *ptr++ << 56; - qword |= (int64) *ptr++ << 48; - qword |= (int64) *ptr++ << 40; - qword |= (int64) *ptr++ << 32; - qword |= (int64) *ptr++ << 24; - qword |= (int64) *ptr++ << 16; - qword |= (int64) *ptr++ << 8; - qword |= (int64) *ptr++; - *((int64 *) ((uint8 *) base + fields [i].offset)) = qword; - break; - } - break; - case uint8_ARRAY_V: - memmove ((uint8 *) base + fields [i].offset, ptr, fields [i].size); - ptr += fields [i].size; - break; - case uint16_ARRAY_V: - for (j = 0; j < fields [i].size; j++) - { - word = *ptr++ << 8; - word |= *ptr++; - *((uint16 *) ((uint8 *) base + fields [i].offset + j * 2)) = word; - } - break; - case uint32_ARRAY_V: - for (j = 0; j < fields [i].size; j++) - { - dword = *ptr++ << 24; - dword |= *ptr++ << 16; - dword |= *ptr++ << 8; - dword |= *ptr++; - *((uint32 *) ((uint8 *) base + fields [i].offset + j * 4)) = dword; - } - break; - } - } - -// delete block; - free(block); - return (result); + // Work out the size of the required block + int len = 0; + int i; + int j; + + for (i = 0; i < num_fields; i++) + { + if (fields [i].offset + FreezeSize(fields [i].size, + fields [i].type) > len) + len = fields [i].offset + FreezeSize(fields [i].size, + fields [i].type); + } + + uint8* block = (uint8*)malloc(len); + uint8* ptr = block; + uint16 word; + uint32 dword; + int64 qword; + int result; + + if ((result = UnfreezeBlock(name, block, len)) != SUCCESS) + { + free(block); + return (result); + } + + // Unpack the block of data into a C structure + for (i = 0; i < num_fields; i++) + { + switch (fields [i].type) + { + case INT_V: + switch (fields [i].size) + { + case 1: + *((uint8*) base + fields [i].offset) = *ptr++; + break; + case 2: + word = *ptr++ << 8; + word |= *ptr++; + *((uint16*)((uint8*) base + fields [i].offset)) = word; + break; + case 4: + dword = *ptr++ << 24; + dword |= *ptr++ << 16; + dword |= *ptr++ << 8; + dword |= *ptr++; + *((uint32*)((uint8*) base + fields [i].offset)) = dword; + break; + case 8: + qword = (int64) * ptr++ << 56; + qword |= (int64) * ptr++ << 48; + qword |= (int64) * ptr++ << 40; + qword |= (int64) * ptr++ << 32; + qword |= (int64) * ptr++ << 24; + qword |= (int64) * ptr++ << 16; + qword |= (int64) * ptr++ << 8; + qword |= (int64) * ptr++; + *((int64*)((uint8*) base + fields [i].offset)) = qword; + break; + } + break; + case uint8_ARRAY_V: + memmove((uint8*) base + fields [i].offset, ptr, fields [i].size); + ptr += fields [i].size; + break; + case uint16_ARRAY_V: + for (j = 0; j < fields [i].size; j++) + { + word = *ptr++ << 8; + word |= *ptr++; + *((uint16*)((uint8*) base + fields [i].offset + j * 2)) = word; + } + break; + case uint32_ARRAY_V: + for (j = 0; j < fields [i].size; j++) + { + dword = *ptr++ << 24; + dword |= *ptr++ << 16; + dword |= *ptr++ << 8; + dword |= *ptr++; + *((uint32*)((uint8*) base + fields [i].offset + j * 4)) = dword; + } + break; + } + } + + // delete block; + free(block); + return (result); } -int UnfreezeBlock(char *name, uint8 *block, int size) +int UnfreezeBlock(char* name, uint8* block, int size) { - char buffer [20]; - int len = 0; - int rem = 0; - - if (statef_read(buffer, 11) != 11 || - strncmp (buffer, name, 3) != 0 || buffer [3] != ':' || - (len = atoi (&buffer [4])) == 0) - { - return (WRONG_FORMAT); - } - - if (len > size) - { - rem = len - size; - len = size; - } - - if (statef_read(block, len) != len) - { - return (WRONG_FORMAT); - } - - if (rem) - { - char *junk = (char*)malloc(rem); - statef_read(junk, rem); - free(junk); - } - - return (SUCCESS); + char buffer [20]; + int len = 0; + int rem = 0; + + if (statef_read(buffer, 11) != 11 || + strncmp(buffer, name, 3) != 0 || buffer [3] != ':' || + (len = atoi(&buffer [4])) == 0) + return (WRONG_FORMAT); + + if (len > size) + { + rem = len - size; + len = size; + } + + if (statef_read(block, len) != len) + return (WRONG_FORMAT); + + if (rem) + { + char* junk = (char*)malloc(rem); + statef_read(junk, rem); + free(junk); + } + + return (SUCCESS); } -- cgit v1.2.3