mirror of
https://github.com/libretro/beetle-psx-libretro.git
synced 2024-11-27 10:50:29 +00:00
171 lines
4.8 KiB
C
171 lines
4.8 KiB
C
/* dvdisaster: Additional error correction for optical media.
|
|
* Copyright (C) 2004-2007 Carsten Gnoerlich.
|
|
* Project home page: http://www.dvdisaster.com
|
|
* Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org
|
|
*
|
|
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA,
|
|
* or direct your browser at http://www.gnu.org.
|
|
*/
|
|
|
|
#ifndef DVDISASTER_H
|
|
#define DVDISASTER_H
|
|
|
|
/* "Dare to be gorgeous and unique.
|
|
* But don't ever be cryptic or otherwise unfathomable.
|
|
* Make it unforgettably great."
|
|
*
|
|
* From "A Final Note on Style",
|
|
* Amiga Intuition Reference Manual, 1986, p. 231
|
|
*/
|
|
|
|
/***
|
|
*** I'm too lazy to mess with #include dependencies.
|
|
*** Everything #includeable is rolled up herein...
|
|
*/
|
|
|
|
#include <sys/stat.h>
|
|
#include "../mednafen-types.h"
|
|
|
|
#include <ctype.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <math.h>
|
|
#include <stdarg.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
/***
|
|
*** dvdisaster.c
|
|
***/
|
|
|
|
void PrepareDeadSector(void);
|
|
|
|
void CreateEcc(void);
|
|
void FixEcc(void);
|
|
void Verify(void);
|
|
|
|
uint32 EDCCrc32(const unsigned char*, int);
|
|
|
|
/***
|
|
*** galois.c
|
|
***
|
|
* This is currently the hardcoded GF(2**8).
|
|
* int32 gives abundant space for the GF.
|
|
* Squeezing it down to uint8 won't probably gain much,
|
|
* so we implement this defensively here.
|
|
*
|
|
* Note that some performance critical stuff needs to
|
|
* be #included from galois-inlines.h
|
|
*/
|
|
|
|
/* Galois field parameters for 8bit symbol Reed-Solomon code */
|
|
|
|
#define GF_SYMBOLSIZE 8
|
|
#define GF_FIELDSIZE (1<<GF_SYMBOLSIZE)
|
|
#define GF_FIELDMAX (GF_FIELDSIZE-1)
|
|
#define GF_ALPHA0 GF_FIELDMAX
|
|
|
|
/* Lookup tables for Galois field arithmetic */
|
|
|
|
typedef struct _GaloisTables
|
|
{ int32 gfGenerator; /* GF generator polynomial */
|
|
int32 *indexOf; /* log */
|
|
int32 *alphaTo; /* inverse log */
|
|
int32 *encAlphaTo; /* inverse log optimized for encoder */
|
|
} GaloisTables;
|
|
|
|
/* Lookup and working tables for the ReedSolomon codecs */
|
|
|
|
typedef struct _ReedSolomonTables
|
|
{ GaloisTables *gfTables;/* from above */
|
|
int32 *gpoly; /* RS code generator polynomial */
|
|
int32 fcr; /* first consecutive root of RS generator polynomial */
|
|
int32 primElem; /* primitive field element */
|
|
int32 nroots; /* degree of RS generator polynomial */
|
|
int32 ndata; /* data bytes per ecc block */
|
|
} ReedSolomonTables;
|
|
|
|
GaloisTables* CreateGaloisTables(int32);
|
|
void FreeGaloisTables(GaloisTables*);
|
|
|
|
ReedSolomonTables *CreateReedSolomonTables(GaloisTables*, int32, int32, int);
|
|
void FreeReedSolomonTables(ReedSolomonTables*);
|
|
|
|
/***
|
|
*** l-ec.c
|
|
***/
|
|
|
|
#define N_P_VECTORS 86 /* 43 16bit p vectors */
|
|
#define P_VECTOR_SIZE 26 /* using RS(26,24) ECC */
|
|
|
|
#define N_Q_VECTORS 52 /* 26 16bit q vectors */
|
|
#define Q_VECTOR_SIZE 45 /* using RS(45,43) ECC */
|
|
|
|
#define P_PADDING 229 /* padding values for */
|
|
#define Q_PADDING 210 /* shortened RS code */
|
|
|
|
int PToByteIndex(int, int);
|
|
int QToByteIndex(int, int);
|
|
void ByteIndexToP(int, int*, int*);
|
|
void ByteIndexToQ(int, int*, int*);
|
|
|
|
void GetPVector(unsigned char*, unsigned char*, int);
|
|
void SetPVector(unsigned char*, unsigned char*, int);
|
|
void FillPVector(unsigned char*, unsigned char, int);
|
|
void AndPVector(unsigned char*, unsigned char, int);
|
|
void OrPVector(unsigned char*, unsigned char, int);
|
|
|
|
void GetQVector(unsigned char*, unsigned char*, int);
|
|
void SetQVector(unsigned char*, unsigned char*, int);
|
|
void FillQVector(unsigned char*, unsigned char, int);
|
|
void AndQVector(unsigned char*, unsigned char, int);
|
|
void OrQVector(unsigned char*, unsigned char, int);
|
|
|
|
int DecodePQ(ReedSolomonTables*, unsigned char*, int, int*, int);
|
|
|
|
int CountC2Errors(unsigned char*);
|
|
|
|
/***
|
|
*** misc.c
|
|
***/
|
|
|
|
char* sgettext(char*);
|
|
char* sgettext_utf8(char*);
|
|
|
|
int64 uchar_to_int64(unsigned char*);
|
|
void int64_to_uchar(unsigned char*, int64);
|
|
|
|
void CalcSectors(int64, int64*, int*);
|
|
|
|
/***
|
|
*** recover-raw.c
|
|
***/
|
|
|
|
#define CD_RAW_SECTOR_SIZE 2352
|
|
#define CD_RAW_C2_SECTOR_SIZE (2352+294) /* main channel plus C2 vector */
|
|
|
|
int CheckEDC(const unsigned char*, bool);
|
|
int CheckMSF(unsigned char*, int);
|
|
|
|
|
|
int ValidateRawSector(unsigned char *frame, bool xaMode);
|
|
bool Init_LEC_Correct(void);
|
|
void Kill_LEC_Correct(void);
|
|
|
|
|
|
#endif /* DVDISASTER_H */
|