/*
ucon64_defines.h - definitions for uCON64

Copyright (c) 2002 - 2005              NoisyB
Copyright (c) 2002 - 2005, 2015 - 2019 dbjh


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_DEFINES_H
#define UCON64_DEFINES_H

// Please make sure that NO definition except FALSE has 0 as value!
#if     (!defined TRUE || !defined FALSE)
#define FALSE 0
#define TRUE (!FALSE)
#endif

#if     (!defined MIN || !defined MAX)
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#endif

#ifndef LIB_VERSION
#define LIB_VERSION(ver, rel, seq) (((ver) << 16) | ((rel) << 8) | (seq))
#endif
#define NULL_TO_EMPTY(str) ((str) ? (str) : (""))
//#define RANDOM(min, max) ((rand () % (max - min)) + min)
#define OFFSET(a, offset) ((((unsigned char *) &(a)) + (offset))[0])

#define UCON64_UNKNOWN (-1)
#define UCON64_UNKNOWN_S "Unknown"
#define NULL_TO_UNKNOWN_S(str) ((str) ? (str) : (UCON64_UNKNOWN_S))

#define UCON64_VERSION_S "2.2.0"

/* program version counter */
//#define UCON64_VERSION 220

/* version of config file layout */
#define UCON64_CONFIG_VERSION 211

#define MBIT 131072
#define TOMBIT(x) ((int)(x) / MBIT)
#define TOMBIT_F(x) ((float)(x) / MBIT)

#define MAXROMSIZE (512 * MBIT)

#ifndef MAXBUFSIZE
#define MAXBUFSIZE 32768
#endif // MAXBUFSIZE

// maximum number of arguments uCON64 takes from the cmdline
#define UCON64_MAX_ARGS 512

#define UCON64_OPTION 1000
#define UCON64_CONSOLE 0


// options (consoles)
enum
{
  UCON64_3DO = UCON64_CONSOLE + 1,
  UCON64_ATA,
  UCON64_CD32,
  UCON64_CDI,
  UCON64_COLECO,
  UCON64_DC,
  UCON64_GB,
  UCON64_GBA,
  UCON64_GC,
  UCON64_GEN,
  UCON64_GP32,
  UCON64_INTELLI,
  UCON64_JAG,
  UCON64_LYNX,
  UCON64_ARCADE,
  UCON64_N64,
  UCON64_NDS,
  UCON64_NES,
  UCON64_NG,
  UCON64_NGP,
  UCON64_PCE,
  UCON64_PS2,
  UCON64_PSX,
  UCON64_S16,
  UCON64_SAT,
  UCON64_SMS,
  // don't mix the following with UCON64_GG (Game Genie), used only for --mgdgg
  UCON64_GAMEGEAR,
  UCON64_SNES,
  UCON64_SWAN,
  UCON64_VBOY,
  UCON64_VEC,
  UCON64_XBOX
};


// option strings (consoles)
#define UCON64_3DO_S      "3do"
#define UCON64_ATA_S      "ata"
#define UCON64_CD32_S     "cd32"
#define UCON64_CDI_S      "cdi"
#define UCON64_COLECO_S   "coleco"
#define UCON64_DC_S       "dc"
#define UCON64_GB_S       "gb"
#define UCON64_GBA_S      "gba"
#define UCON64_GC_S       "gc"
#define UCON64_GEN_S      "gen"
#define UCON64_GP32_S     "gp32"
#define UCON64_INTELLI_S  "intelli"
#define UCON64_JAG_S      "jag"
#define UCON64_LYNX_S     "lynx"
#define UCON64_ARCADE_S   "arcade"
#define UCON64_N64_S      "n64"
#define UCON64_NDS_S      "nds"
#define UCON64_NES_S      "nes"
#define UCON64_NG_S       "ng"
#define UCON64_NGP_S      "ngp"
#define UCON64_PCE_S      "pce"
#define UCON64_PS2_S      "ps2"
#define UCON64_PSX_S      "psx"
#define UCON64_S16_S      "s16"
#define UCON64_SAT_S      "sat"
#define UCON64_SMS_S      "sms"
#define UCON64_GAMEGEAR_S "gg"
#define UCON64_SNES_S     "snes"
#define UCON64_SWAN_S     "swan"
#define UCON64_VBOY_S     "vboy"
#define UCON64_VEC_S      "vec"
#define UCON64_XBOX_S     "xbox"


// the other options
enum
{
  UCON64_1991 = UCON64_OPTION + 1,
  UCON64_A,
  UCON64_B,
  UCON64_B0,
  UCON64_B1,
  UCON64_BAT,
  UCON64_BIN,
  UCON64_BIOS,
  UCON64_BOT,
  UCON64_BS,
  UCON64_C,
  UCON64_CHK,
  UCON64_CODE,
  UCON64_COL,
  UCON64_CRC,
  UCON64_CRCHD,
  UCON64_CRP,
  UCON64_CS,
  UCON64_CTRL,
  UCON64_CTRL2,
  UCON64_CMNT,
  UCON64_DB,
  UCON64_DBS,
  UCON64_DBUH,
  UCON64_DBV,
  UCON64_DFIND,
  UCON64_DFINDR,
  UCON64_DINT,
  UCON64_DMIRR,
  UCON64_DNSRT,
  UCON64_DUAL,
  UCON64_DUMPINFO,
  UCON64_E,
  UCON64_EROM,
  UCON64_F,
  UCON64_FDS,
  UCON64_FDSL,
  UCON64_FFE,
  UCON64_FIG,
  UCON64_FIGS,
  UCON64_FILE,
  UCON64_FIND,
  UCON64_FINDI,
  UCON64_FINDR,
  UCON64_FRONTEND,
  UCON64_GBX,
  UCON64_GD3,
  UCON64_GD3S,
  UCON64_GG,
  UCON64_GGD,
  UCON64_GGE,
  UCON64_GP2BMP,
  UCON64_HD,
  UCON64_HDN,
  UCON64_HELP,
  UCON64_HEX,
  UCON64_HFIND,
  UCON64_HFINDR,
  UCON64_HI,
  UCON64_I,
  UCON64_IC2,
  UCON64_ID,
  UCON64_IDNUM,
  UCON64_IDPPF,
  UCON64_INES,
  UCON64_INESHD,
  UCON64_INS,
  UCON64_INSN,
  UCON64_INT,
  UCON64_INT2,
  UCON64_ISPAD,
  UCON64_J,
  UCON64_K,
  UCON64_L,
  UCON64_LNX,
  UCON64_LOGO,
  UCON64_LS,
  UCON64_LSD,
  UCON64_LSRAM,
  UCON64_LSV,
  UCON64_LYX,
  UCON64_MAPR,
  UCON64_MD5,
  UCON64_MGD,
  UCON64_MGDGG,
  UCON64_MGH,
  UCON64_MIRR,
  UCON64_MKA,
  UCON64_MKDAT,
  UCON64_MKI,
  UCON64_MKIP,
  UCON64_MKPPF,
  UCON64_MKSRM,
  UCON64_MSG,
  UCON64_MULTI,
//  UCON64_MVS,
  UCON64_N,
  UCON64_N2,
  UCON64_N2GB,
  UCON64_NA,
  UCON64_NBAK,
  UCON64_NBAT,
  UCON64_NBS,
  UCON64_NCOL,
  UCON64_NHD,
  UCON64_NHI,
  UCON64_NINT,
  UCON64_NPPF,
  UCON64_NROT,
  UCON64_NS,
  UCON64_NSWP,
  UCON64_NTSC,
  UCON64_NVRAM,
  UCON64_O,
  UCON64_P,
  UCON64_PAD,
  UCON64_PADHD,
  UCON64_PADN,
  UCON64_PAL,
  UCON64_PARSE,
  UCON64_PASOFAMI,
  UCON64_PATCH,
  UCON64_PATTERN,
  UCON64_POKE,
  UCON64_PORT,
  UCON64_PPF,
  UCON64_PRINT,
  UCON64_Q,
  UCON64_QQ,                                    // already reserved ;-)
  UCON64_R83,
  UCON64_RDAT,
  UCON64_R,
  UCON64_REGION,
  UCON64_RJOLIET,
  UCON64_RROM,
  UCON64_RL,
  UCON64_ROM,
  UCON64_ROTL,
  UCON64_ROTR,
  UCON64_RU,
  UCON64_S,
  UCON64_SAM,
  UCON64_SC,
  UCON64_SCAN,
  UCON64_SCR,
  UCON64_SGB,
  UCON64_SHA1,
  UCON64_SMC,
  UCON64_SMD,
  UCON64_SMDS,
  UCON64_SMGH,
  UCON64_SMINI2SRM,
  UCON64_SMINIS,
  UCON64_SPLIT,
  UCON64_SRAM,
  UCON64_SSC,
  UCON64_SSIZE,
  UCON64_STP,
  UCON64_STPN,
  UCON64_STRIP,
  UCON64_SWAP,
  UCON64_SWAP2,
  UCON64_SWC,
  UCON64_SWCS,
  UCON64_SWP,
  UCON64_TEST,
  UCON64_UFO,
  UCON64_UFOS,
  UCON64_UFOSD,
  UCON64_UFOSDS,
  UCON64_UNIF,
  UCON64_UNSCR,
  UCON64_USMS,
  UCON64_V,
  UCON64_V64,
  UCON64_VER,
  UCON64_VMS,
  UCON64_VRAM,
  UCON64_XCD64,
  UCON64_XCD64B,
  UCON64_XCD64C,
  UCON64_XCD64E,
  UCON64_XCD64F,
  UCON64_XCD64M,
  UCON64_XCD64P,
  UCON64_XCD64S,
  UCON64_XCMC,
  UCON64_XCMCM,
  UCON64_XCMCT,
  UCON64_XDEX,
  UCON64_XDJR,
  UCON64_XF2A,
  UCON64_XF2AB,
  UCON64_XF2AC,
  UCON64_XF2AMULTI,
  UCON64_XF2AS,
  UCON64_XFAL,
  UCON64_XFALB,
  UCON64_XFALC,
  UCON64_XFALMULTI,
  UCON64_XFALS,
  UCON64_XFALM,
  UCON64_XFIG,
  UCON64_XFIGS,
  UCON64_XFIGC,
  UCON64_XGBX,
  UCON64_XGBXB,
  UCON64_XGBXS,
  UCON64_XGBXM,
  UCON64_XGD3,
  UCON64_XGD3R,
  UCON64_XGD3S,
  UCON64_XGD6,
  UCON64_XGD6R,
  UCON64_XGD6S,
  UCON64_XGG,
  UCON64_XGGB,
  UCON64_XGGS,
  UCON64_XLIT,
  UCON64_XMCCL,
  UCON64_XMCD,
  UCON64_XMD,
  UCON64_XMDB,
  UCON64_XMDS,
  UCON64_XMSG,
  UCON64_XPCE,
  UCON64_XPL,
  UCON64_XPLI,
  UCON64_XPLM,
  UCON64_XQD16,
  UCON64_XRESET,
  UCON64_XSF,
  UCON64_XSFS,
  UCON64_XSMC,
  UCON64_XSMCR,
  UCON64_XSMD,
  UCON64_XSMDS,
  UCON64_XSWC,
  UCON64_XSWC2,
  UCON64_XSWC_IO,
  UCON64_XSWCR,
  UCON64_XSWCS,
  UCON64_XSWCC,
  UCON64_XUFOSD,
  UCON64_XV64,
  UCON64_Z64,

//  UCON64_FORCE63,
  UCON64_GUI,

  // Keep these (libdiscmage) options separate
  UCON64_DISC = UCON64_OPTION + 250,
  UCON64_MKCUE,
  UCON64_MKSHEET,
  UCON64_MKTOC,
  UCON64_RIP,
  UCON64_BIN2ISO,
  UCON64_ISOFIX,
  UCON64_XCDRW,
  UCON64_CDMAGE
};

/*
  uCON64 workflow flags

  WF_PROBE          probe for console type
  WF_INIT           init ROM info (ucon64_init()) necessary
                      w/o this flag WF_NFO will be ignored
  WF_NFO            show info output before processing rom
  WF_NO_ROM         for this option no ROM is required
  WF_NO_CRC32       no CRC32 calculation necessary for this option; this
                      overrides even WF_INIT and WF_NFO
  WF_STOP           a "stop" option:
                    - -multi (and -xfalmulti) takes more than one file as
                      argument, but should be executed only once.
                    - stop after sending one ROM to a copier ("multizip")
                    - stop after applying a patch so that the patch file won't
                      be interpreted as ROM
  WF_PAR            this option requires a parallel port
  WF_USB            this option requires a USB port
  WF_SERIAL         this option requires a serial port
  WF_NO_SPLIT       this option does not work with split ROMs
  WF_DEFAULT        same as WF_INIT | WF_PROBE | WF_NFO
*/
#define WF_PROBE      (1)
#define WF_INIT       (1 << 1)
#define WF_NFO        (1 << 2)
#define WF_STOP       (1 << 3)
#define WF_NO_ROM     (1 << 5)
//#define WF_PAR        (1 << 6)
//#define WF_USB        (1 << 7)
//#define WF_SERIAL     (1 << 8)
#define WF_NO_CRC32   (1 << 9)
#define WF_NO_SPLIT   (1 << 10)
#define WF_SWITCH     (1 << 11)
#define WF_NO_ARCHIVE (1 << 12)
#define WF_DEFAULT    (WF_PROBE | WF_INIT | WF_NFO)

#endif // UCON64_DEFINES_H
