quickdev16/tools/ucon64/src/ucon64_misc.h
2009-08-28 08:54:46 +02:00

304 lines
9.6 KiB
C

/*
ucon64_misc.h - miscellaneous functions for uCON64
Copyright (c) 1999 - 2004 NoisyB <noisyb@gmx.net>
Copyright (c) 2001 - 2004 dbjh
Copyright (c) 2001 Caz
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.
*/
#ifndef UCON64_MISC_H
#define UCON64_MISC_H
#ifdef HAVE_CONFIG_H
#include "config.h" // USE_DISCMAGE
#endif
#include "ucon64.h" // st_rominfo_t
/*
UCON64_DM_VERSION_MAJOR
UCON64_DM_VERSION_MINOR
UCON64_DM_VERSION_STEP min. version of libdiscmage supported by uCON64
ucon64_load_discmage() load libdiscmage
libdm_usage usage for libdiscmage
libdm_gauge gauge for libdiscmage
*/
#ifdef USE_DISCMAGE
#include "libdiscmage/libdiscmage.h" // dm_image_t
#define UCON64_DM_VERSION_MAJOR 0
#define UCON64_DM_VERSION_MINOR 0
#define UCON64_DM_VERSION_STEP 7
extern const st_getopt2_t libdm_usage[];
extern int ucon64_load_discmage (void);
extern int libdm_gauge (int pos, int size);
#endif
/*
defines for unknown backup units/emulators
*/
typedef struct // st_unknown_header
{
/*
Don't create fields that are larger than one byte! For example size_low and
size_high could be combined in one unsigned short int. However, this gives
problems with little endian vs. big endian machines (e.g. writing the header
to disk).
*/
unsigned char size_low;
unsigned char size_high;
unsigned char emulation;
unsigned char hirom;
unsigned char emulation1;
unsigned char emulation2;
unsigned char pad[2];
unsigned char id1;
unsigned char id2;
unsigned char type;
unsigned char pad2[501];
} st_unknown_header_t;
#define UNKNOWN_HEADER_START 0
#define UNKNOWN_HEADER_LEN (sizeof (st_unknown_header_t))
extern int unknown_init (st_rominfo_t *rominfo);
/*
usage for consoles not directly supported by uCON64
*/
extern const st_getopt2_t unknown_usage[],
atari_usage[],
cd32_usage[],
cdi_usage[],
channelf_usage[],
coleco_usage[],
gamecom_usage[],
gc_usage[],
gp32_usage[],
intelli_usage[],
odyssey2_usage[],
odyssey_usage[],
ps2_usage[],
real3do_usage[],
s16_usage[],
sat_usage[],
vboy_usage[],
vc4000_usage[],
vectrex_usage[],
xbox_usage[],
mame_usage[],
ucon64_options_usage[],
ucon64_options_without_usage[],
ucon64_padding_usage[],
ucon64_patching_usage[];
#define NINTENDO_MAKER_LEN 684
extern const char *nintendo_maker[];
/*
uCON64 "workflow" objects
We want to do things compile-time. Using ucon64_wf is necessary for VC 6. GCC
(3) accepts casts in struct initialisations.
*/
enum
{
WF_OBJ_ALL_SWITCH = 0,
WF_OBJ_ALL_DEFAULT,
WF_OBJ_ALL_DEFAULT_NO_SPLIT,
WF_OBJ_ALL_STOP,
WF_OBJ_ALL_STOP_NO_ROM,
WF_OBJ_ALL_DEFAULT_STOP_NO_ROM,
WF_OBJ_ALL_INIT,
WF_OBJ_ALL_INIT_PROBE,
WF_OBJ_ALL_INIT_PROBE_STOP,
WF_OBJ_ALL_INIT_PROBE_NO_ROM,
WF_OBJ_ALL_INIT_PROBE_NO_SPLIT,
WF_OBJ_ALL_INIT_PROBE_NO_CRC32,
WF_OBJ_ALL_INIT_NO_SPLIT,
WF_OBJ_DC_SWITCH,
WF_OBJ_DC_DEFAULT,
WF_OBJ_DC_NO_ROM,
WF_OBJ_GB_SWITCH,
WF_OBJ_GB_DEFAULT,
WF_OBJ_GBA_SWITCH,
WF_OBJ_GBA_DEFAULT,
WF_OBJ_GEN_SWITCH,
WF_OBJ_GEN_DEFAULT,
WF_OBJ_GEN_DEFAULT_NO_SPLIT,
WF_OBJ_JAG_SWITCH,
WF_OBJ_LYNX_SWITCH,
WF_OBJ_LYNX_DEFAULT,
WF_OBJ_N64_SWITCH,
WF_OBJ_N64_DEFAULT,
WF_OBJ_N64_INIT_PROBE,
WF_OBJ_NG_SWITCH,
WF_OBJ_NG_DEFAULT,
WF_OBJ_NES_SWITCH,
WF_OBJ_NES_DEFAULT,
WF_OBJ_NGP_SWITCH,
WF_OBJ_PCE_SWITCH,
WF_OBJ_PCE_DEFAULT,
WF_OBJ_PSX_SWITCH,
WF_OBJ_SMS_SWITCH,
WF_OBJ_SMS_DEFAULT_NO_SPLIT,
WF_OBJ_SNES_SWITCH,
WF_OBJ_SNES_DEFAULT,
WF_OBJ_SNES_DEFAULT_NO_SPLIT,
WF_OBJ_SNES_NO_ROM,
WF_OBJ_SNES_INIT_PROBE,
WF_OBJ_SWAN_SWITCH,
WF_OBJ_N64_STOP_NO_ROM,
WF_OBJ_N64_DEFAULT_STOP,
WF_OBJ_N64_DEFAULT_STOP_NO_ROM,
WF_OBJ_GEN_STOP_NO_ROM,
WF_OBJ_GEN_DEFAULT_STOP_NO_SPLIT_NO_ROM,
WF_OBJ_GBA_STOP_NO_ROM,
WF_OBJ_GBA_DEFAULT_STOP,
WF_OBJ_GBA_DEFAULT_STOP_NO_ROM,
WF_OBJ_SNES_STOP_NO_ROM,
WF_OBJ_SNES_DEFAULT_STOP_NO_ROM,
WF_OBJ_SNES_DEFAULT_STOP_NO_SPLIT_NO_ROM,
WF_OBJ_GB_STOP_NO_ROM,
WF_OBJ_GB_DEFAULT_STOP_NO_ROM,
WF_OBJ_LYNX_STOP_NO_ROM,
WF_OBJ_PCE_DEFAULT_STOP_NO_SPLIT_NO_ROM,
WF_OBJ_NGP_STOP_NO_ROM,
WF_OBJ_NGP_DEFAULT_STOP_NO_ROM,
WF_OBJ_NES_STOP_NO_ROM,
WF_OBJ_NES_DEFAULT_STOP_NO_SPLIT,
WF_OBJ_SMS_STOP_NO_ROM,
WF_OBJ_SMS_DEFAULT_STOP_NO_SPLIT_NO_ROM,
WF_OBJ_GC_SWITCH,
WF_OBJ_S16_SWITCH,
WF_OBJ_ATA_SWITCH,
WF_OBJ_COLECO_SWITCH,
WF_OBJ_VBOY_SWITCH,
WF_OBJ_VEC_SWITCH,
WF_OBJ_INTELLI_SWITCH,
WF_OBJ_GP32_SWITCH,
WF_OBJ_PS2_SWITCH,
WF_OBJ_XBOX_SWITCH,
WF_OBJ_SAT_SWITCH,
WF_OBJ_3DO_SWITCH,
WF_OBJ_CD32_SWITCH,
WF_OBJ_CDI_SWITCH,
};
extern st_ucon64_obj_t ucon64_wf[];
/*
uCON64 messages
usage example: fprintf (stdout, ucon64_msg[WROTE], filename);
*/
enum
{
PARPORT_ERROR = 0,
CONSOLE_ERROR,
WROTE,
OPEN_READ_ERROR,
OPEN_WRITE_ERROR,
READ_ERROR,
WRITE_ERROR,
BUFFER_ERROR, // not enough memory
ROM_BUFFER_ERROR,
FILE_BUFFER_ERROR,
DAT_NOT_FOUND,
DAT_NOT_ENABLED,
READ_CONFIG_FILE,
NO_LIB
};
extern const char *ucon64_msg[];
/*
ucon64_file_handler() handles backups (before modifying the ROM) and ROMs
inside archives. Read the comment at the header to
see how it and the flags work
remove_temp_file() remove possible temp file created by ucon64_file_handler()
ucon64_output_fname()
ucon64_gauge() wrapper for misc.c/gauge()
ucon64_testpad() test if ROM is padded
ucon64_testsplit() test if ROM is split
ucon64_configfile() configfile handling
ucon64_rename() DAT or internal header based rename
ucon64_e() emulator "frontend"
ucon64_pattern() change file based on patterns specified in pattern_fname
*/
#define OF_FORCE_BASENAME 1
#define OF_FORCE_SUFFIX 2
extern int ucon64_file_handler (char *dest, char *src, int flags);
extern void remove_temp_file (void);
extern char *ucon64_output_fname (char *requested_fname, int flags);
extern int ucon64_gauge (time_t init_time, int pos, int size);
extern int ucon64_testpad (const char *filename);
extern int ucon64_testsplit (const char *filename);
extern int ucon64_configfile ();
extern int ucon64_rename (int mode);
extern int ucon64_e (void);
extern int ucon64_pattern (st_rominfo_t *rominfo, const char *pattern_fname);
extern char *ucon64_temp_file;
extern int (*ucon64_testsplit_callback) (const char *filename);
/*
Some general file stuff that MUST NOT and WILL NOT be written again and again
ucon64_fread() same as fread but takes start and src is a filename
ucon64_fwrite() same as fwrite but takes start and dest is a filename; mode
is the same as fopen() modes
ucon64_fgetc() same as fgetc but takes filename instead of FILE and a pos
ucon64_fputc() same as fputc but takes filename instead of FILE and a pos
buf,s,bs,b,f,m == buffer,start,blksize,blks,filename,mode
ucon64_bswap16_n() bswap16() n bytes of buffer
ucon64_fbswap16() bswap16() len bytes of file from start
ucon64_fwswap32() wswap32() len bytes of file from start
ucon64_dump() file oriented wrapper for memdump() (uses the same flags)
ucon64_find() file oriented wrapper for memsearch() (uses the same flags)
ucon64_chksum() file oriented wrapper for chksum()
if (!sha1) {sha1 won't be calculated!}
ucon64_filefile() compare two files for similarities or differencies
*/
#define ucon64_fgetc(f, p) (quick_io_c(0, p, f, "rb"))
#define ucon64_fputc(f, p, b, m) (quick_io_c(b, p, f, m))
#define ucon64_fread(b, s, l, f) (quick_io(b, s, l, f, "rb"))
#define ucon64_fwrite(b, s, l, f, m) (quick_io((void *) b, s, l, f, m))
extern int ucon64_bswap16_n (void *buffer, int n);
extern void ucon64_fbswap16 (const char *fname, size_t start, size_t len);
extern void ucon64_fwswap32 (const char *fname, size_t start, size_t len);
extern void ucon64_dump (FILE *output, const char *filename, size_t start,
size_t len, uint32_t flags);
// Be sure the following constant doesn't conflict with the MEMCMP2_* constants
#define UCON64_FIND_QUIET (1 << 31)
extern int ucon64_find (const char *filename, size_t start, size_t len,
const char *search, int searchlen, uint32_t flags);
extern int ucon64_chksum (char *sha1, char *md5, unsigned int *crc32, // uint16_t *crc16,
const char *filename, size_t start);
extern void ucon64_filefile (const char *filename1, int start1,
const char *filename2, int start2, int similar);
#endif // #ifndef UCON64_MISC_H