https://bitbucket.org/daniel_fort/magic-lantern
Raw File
Tip revision: ca4dc9b26ece2c78103751c222413fa835a817ab authored by daniel_fort on 23 March 2019, 15:08:19 UTC
Close multiheaded iso-research branch
Tip revision: ca4dc9b
adtg_gui.c
/**
 * ADTG register editing GUI
 */

#undef ENGIO_USE_IO_TRACE        /* experimental backend for ENGIO writes */

#include <module.h>
#include <dryos.h>
#include <property.h>
#include <lens.h>
#include <bmp.h>
#include <menu.h>
#include <config.h>
#include <patch.h>

#include "avl.h"
#include "avl.c"    /* unusual include in order to avoid exporting the AVL symbols (keep the namespace clean) */

#ifdef ENGIO_USE_IO_TRACE
#include "io_trace.c"
#endif

#define DST_DFE     0xF000
#define DST_CMOS16  0x0F00
#define DST_CMOS    0x00F0
#define DST_ADTG    0x000F      /* any ADTG */
#define DST_ENGIO       0xC0F0
#define DST_ENGIO_MASK  0xFFF0

struct known_reg
{
    uint16_t dst;
    uint16_t reg;
    uint16_t is_nrzi;   /* this will override the default guess */
    char* description;
};

/* todo: check for duplicates */
static struct known_reg known_regs[] = {
    {DST_CMOS,      0, 0, "Analog ISO (most cameras)"},
    {DST_CMOS,      1, 0, "Vertical offset"},
    {DST_CMOS,      2, 0, "Horizontal offset / column skipping"},
    {DST_CMOS,      3, 0, "Analog ISO on 6D"},
    {DST_CMOS,      4, 0, "ISO-related?"},
    {DST_CMOS,      5, 0, "Fine vertical offset, black area maybe"},
    {DST_CMOS,      6, 0, "ISO 50 or timing related: FFF => darker image"},
    {DST_CMOS,      7, 0, "5D3: image fading out; 6D, 700D: vertical offset"},
    {DST_CMOS,      8, 0, "Unknown, used on 6D"},
    {DST_ADTG, 0x8000, 0, "6 = pixel binning (1x), 5 = 1:1 crop"},
    {DST_ADTG, 0x8806, 0, "Causes interlacing artifacts"},
    {DST_ADTG, 0x800C, 0, "Line skipping factor (2 = 1080p, 4 = 720p, 0 = zoom)"},
    {DST_ADTG, 0x805E, 1, "Shutter blanking for x5/x10 zoom"},
    {DST_ADTG, 0x805F, 1, "Shutter blanking for x5/x10 zoom"},
    {DST_ADTG, 0x8060, 1, "Shutter blanking for LiveView 1x"},
    {DST_ADTG, 0x8061, 1, "Shutter blanking for LiveView 1x"},
    {DST_ADTG, 0x8172, 1, "PowerSaveTiming 'on', set to Line count + 1"},   /* 6D, 700D */
    {DST_ADTG, 0x8178, 1, "PowerSaveTiming 'on', set to Line count + 1"},   /* 5D3, 6D, 700D */
    {DST_ADTG, 0x8196, 1, "PowerSaveTiming 'on', set to Line count + 1"},   /* 5D3 */
    {DST_ADTG, 0x82B6, 1, "PowerSaveTiming 'on'? set to Line count - 1"},   /* 700D */
    {DST_ADTG, 0x8173, 1, "PowerSaveTiming 'off', should be slightly below FPS timer B"},   /* 6D, 700D */
    {DST_ADTG, 0x8179, 1, "PowerSaveTiming 'off', should be slightly below FPS timer B"},   /* 5D3, 6D, 700D */
    {DST_ADTG, 0x8197, 1, "PowerSaveTiming 'off', should be slightly below FPS timer B"},   /* 5D3 */
    {DST_ADTG, 0x82F8, 1, "ReadOutTiming, set to Line count, darker image below"},
    {DST_ADTG, 0x82F9, 1, "ReadOutTiming related, set to FPS timer B - 1"},
    {DST_ADTG, 0x82F3, 1, "Line count that gets darker (top optical black related)"},
    {DST_ADTG, 0x8830, 0, "Only slightly changes the color of the image (g3gg0)"},
    {DST_ADTG, 0x8880, 0, "Black level (reference value for the feedback loop?)"},

    {DST_ADTG, 0x8882, 0, "ISO ADTG gain (per column, mod 4 or mod 8)"},
    {DST_ADTG, 0x8884, 0, "ISO ADTG gain (per column, mod 4 or mod 8)"},
    {DST_ADTG, 0x8886, 0, "ISO ADTG gain (per column, mod 4 or mod 8)"},
    {DST_ADTG, 0x8888, 0, "ISO ADTG gain (per column, mod 4 or mod 8)"},
    {DST_ADTG,    0x7, 0, "ADTG preamp (4 2-bit column gains; clean image at 00, 55, AA and FF)"},
    {DST_ADTG,    0x8, 0, "ADTG preamp (per column, mod 4 or mod 8)"},
    {DST_ADTG,    0x9, 0, "ADTG preamp (per column, mod 4 or mod 8)"},
    {DST_ADTG,    0xA, 0, "ADTG preamp (per column, mod 4 or mod 8)"},
    {DST_ADTG,    0xB, 0, "ADTG preamp (per column, mod 4 or mod 8)"},

    {DST_ADTG,   0xFE, 0, "Yet another ADTG gain"},

    {DST_ADTG,   0x1B, 0, "Strong negative gain (default 0x320, dark image with 0x310)"},

    {DST_ADTG, 0x105F, 1, "Shutter blanking for x5/x10 zoom"},
    {DST_ADTG, 0x106E, 1, "Shutter blanking for LiveView 1x"},

    {DST_ADTG,   0x14, 1, "ISO related"},
    {DST_ADTG,   0x15, 1, "ISO related"},

    {DST_ADTG, 0x1179, 1, "Top optical black bar size (5D2)"},

    {0xC021,   0x0000, 0, "Timer 0 (unused)"},
    {0xC021,   0x0100, 0, "Timer 1 (unused)"},
    {0xC021,   0x0200, 0, "Timer 2 (10ms system timer)"},
    {0xC021,   0x0204, 0, "Timer 2 related"},
    {0xC021,   0x0208, 0, "Timer 2 reload value (microseconds)"},
    {0xC021,   0x0210, 0, "Timer 2 interrupt enable?"},
    {0xC021,   0x0214, 0, "Timer 2 related"},

    {0xC024,   0x2010, 0, "Another timer"},
    {0xC024,   0x2014, 0, "12-bit counter, used for task load measurement"},

    {0xc040,   0x0004, 0, "Clock selection"},
    {0xc040,   0x0008, 0, "Clock control"},
    {0xc040,   0x0010, 0, "Timer 0?"},
    {0xc040,   0x0014, 0, "Timer 1?"},
    {0xc040,   0x0018, 0, "Timer 2?"},

    {0xc040,   0x0044, 0, "HClk (from 5D classic)"},
    {0xc040,   0x0048, 0, "LClk (from 5D classic)"},
    {0xc040,   0x004C, 0, "MClk (from 5D classic)"},

    {0xc040,   0x0088, 0, "USB PHY - written with 0x030101 (\"Xtalless DD\")"},
    {0xc040,   0x008C, 0, "USB PHY - written with 0x000001"},

    {0xc020,   0x3000, 0, "Timer 0 related?"},
    {0xc020,   0x3004, 0, "Timer 1 related?"},
    {0xc020,   0x3008, 0, "Timer 2 related?"},

    {0xC0F0,   0x3074, 0, "Playback: horizontal banding (500D only?)"},
    {0xC0F0,   0x3050, 0, "Playback: vertical banding / darken?"},

    {0xC0F0,   0x8024, 0, "ISO related? (SHAD_MODE) (5D2: used for ISO 25600)"},
    {0xC0F0,   0x8030, 0, "Digital gain for ISO (SHAD_GAIN)"},
    {0xC0F0,   0x8034, 0, "Black level in LiveView / BW offset in photo mode (SHAD_PRESETUP)"},
    //~ {0xC0F0,   0x8038, 0, "ISO related?"},
    //~ {0xC0F0,   0x8050, 0, "ISO related?"},
    //~ {0xC0F0,   0x814c, 0, "ISO related?"},
    {0xC0F0,   0x819c, 0, "Saturate Offset (photo mode) (HIV_POST_SETUP)"},
    {0xC0F1,   0x2054, 0, "White level?"},
    
    
    {0xC0F0,   0x6000, 0, "FPS register for confirming changes"},
    {0xC0F0,   0x6004, 0, "FPS related, SetHeadForReadout"},
    {0xC0F0,   0x6008, 0, "FPS register A"},
    {0xC0F0,   0x600C, 0, "FPS related"},
    {0xC0F0,   0x6010, 0, "FPS related"},
    {0xC0F0,   0x6014, 0, "FPS register B"},
    {0xC0F0,   0x6018, 0, "FPS related"},
    {0xC0F0,   0x601C, 0, "FPS related"},
    {0xC0F0,   0x6020, 0, "FPS related"},

    /* Resolution
     * 
     * 5D2 photo:
     * 0xC0F06088.hi - 0xC0F06084.hi is the vertical resolution (3804)
     * 0xC0F06084.hi shifts the image in one-line increments, so it must be the first scanned line
     * (0xC0F06088.lo - 0xC0F06084.lo) * 2 is the horizontal resolution (5792)
     * 
     * 600D movie:
     * (1070 - 0x7e) * 2 = 1888
     * (1102 - 0x7e) * 2 = 1952
     * Bingo :)
     */
    {0xC0F0,   0x6084, 0, "RAW first line|column. Column is / 2. 600D: 0x0001007E."},
    {0xC0F0,   0x6088, 0, "RAW last line|column. 600D: FHD 1182|1070, 3x 1048|1102, HD 720|1070"},

    {0xC0F0,   0x6800, 0, "RAW first line|column. Column is / 8 on 5D3 (parallel readout?)"},
    {0xC0F0,   0x6804, 0, "RAW last line|column. 5D3: f6e|2fe, first 1|18 => 5936x3950"},

    {0xc0f0,   0x7000, 0, "HEAD timers (SSG counter, 0x01 to restart)"},
    {0xc0f0,   0x7004, 0, "HEAD timers"},
    {0xc0f0,   0x700C, 0, "HEAD timers, 0x01 to stop/standby"},
    {0xc0f0,   0x7010, 0, "HEAD timers"},
    {0xc0f0,   0x7014, 0, "HEAD timers"},
    {0xc0f0,   0x7018, 0, "HEAD timers"},
    {0xc0f0,   0x701C, 0, "HEAD timers"},
    {0xc0f0,   0x7038, 0, "HEAD timers, 0x01 <- stops processing?"},
    {0xc0f0,   0x707C, 0, "HEAD timers"},
    {0xc0f0,   0x71AC, 0, "HEAD timers"},
    {0xc0f0,   0x70C8, 0, "HEAD timers, State 2 Register / VCount?"},

    {0xc0f0,   0x7048, 0, "HEAD1 timer (start?)"},
    {0xc0f0,   0x704C, 0, "HEAD1 timer"},
    {0xc0f0,   0x7050, 0, "HEAD1 timer (ticks?)"},

    {0xc0f0,   0x705C, 0, "HEAD2 timer (start?)"},
    {0xc0f0,   0x7060, 0, "HEAD2 timer"},
    {0xc0f0,   0x7064, 0, "HEAD2 timer (ticks?)"},

    {0xc0f0,   0x7134, 0, "HEAD3 timer (start?)"},
    {0xc0f0,   0x7138, 0, "HEAD3 timer"},
    {0xc0f0,   0x713C, 0, "HEAD3 timer (ticks?)"},

    {0xc0f0,   0x7148, 0, "HEAD4 timer (start?)"},
    {0xc0f0,   0x714c, 0, "HEAD4 timer"},
    {0xc0f0,   0x7150, 0, "HEAD4 timer (ticks?)"},

    {0xC0F0,   0x8D1C, 0, "Vignetting correction data (DIGIC V)"},
    {0xC0F0,   0x8D24, 0, "Vignetting correction data (DIGIC V)"},
    {0xC0F0,   0x8578, 0, "Vignetting correction data (DIGIC IV)"},
    {0xC0F0,   0x857C, 0, "Vignetting correction data (DIGIC IV)"},
    
    {0xC0F1,   0x40c4, 0, "Display saturation"},
    {0xC0F1,   0x41B8, 0, "Display brightness and contrast"},
    {0xC0F1,   0x4140, 0, "Display filter (EnableFilter, DIGIC peaking)"},
    {0xC0F1,   0x4164, 0, "Display position (vertical shift)"},
    {0xC0F1,   0x40cc, 0, "Display zebras (used for fast zebras in ML)"},
    
    {0xC0F3,   0x7ae4, 0, "ISO digital gain (5D3 photo mode)"},
    {0xC0F3,   0x7af0, 0, "ISO digital gain (5D3 photo mode)"},
    {0xC0F3,   0x7afc, 0, "ISO digital gain (5D3 photo mode)"},
    {0xC0F3,   0x7b08, 0, "ISO digital gain (5D3 photo mode)"},

    {0xC0F3,   0x7ae0, 0, "ISO black/white offset (5D3 photo mode)"},
    {0xC0F3,   0x7aec, 0, "ISO black/white offset (5D3 photo mode)"},
    {0xC0F3,   0x7af8, 0, "ISO black/white offset (5D3 photo mode)"},
    {0xC0F3,   0x7b04, 0, "ISO black/white offset (5D3 photo mode)"},
    
    /* from http://magiclantern.wikia.com/wiki/Register_Map#Misc_Registers */
    {0xC0F0,   0x8004, 0, "DARK_MODE (bitmask of bits 0x113117F)"},
    {0xC0F0,   0x8008, 0, "DARK_SETUP (mask 0x7FF signed) (brightns/darkens frame)"},
    {0xC0F0,   0x800C, 0, "DARK_LIMIT (mask 0x3FFF) (no noticeable change)"},
    {0xC0F0,   0x8010, 0, "DARK_SETUP_14_12 (mask 0x07FF) (brighten, overwrites DARK_SETUP)"},
    {0xC0F0,   0x8014, 0, "DARK_LIMIT_14_12 (0x0000 - 0x0FFF) (no noticeable change)"},
    {0xC0F0,   0x8018, 0, "DARK_SAT_LIMIT (0x0000 - 0x3FFF) (no noticeable change)"},
    {0xC0F0,   0x82A0, 0, "DARK_KZMK_SAV_A (0/1) (causes white or black screen)"},
    {0xC0F0,   0x82A4, 0, "DARK_KZMK_SAV_B (0/1) (no noticeable change)"},

    {0xC0F0,   0x8100, 0, "CCDSEL (0-1)"},
    {0xC0F0,   0x8104, 0, "DS_SEL (0-1)"},
    {0xC0F0,   0x8108, 0, "OBWB_ISEL (0-7)"},
    {0xC0F0,   0x810C, 0, "PROC24_ISEL (0-7)"},
    {0xC0F0,   0x8110, 0, "DPCME_ISEL (0-15)"},
    //{0xC0F0,   0x8114, 0, "PACK32_ISEL (0-15)"},
    {0xC0F0,   0x82D0, 0, "PACK16_ISEL (0-15)"},
    {0xC0F0,   0x82D4, 0, "WDMAC32_ISEL (0-7)"},
    {0xC0F0,   0x82D8, 0, "WDMAC16_ISEL (0-1)"},
    {0xC0F0,   0x82DC, 0, "OBINTG_ISEL (0-15)"},
    {0xC0F0,   0x82E0, 0, "AFFINE_ISEL (0-15)"},
    {0xC0F0,   0x8390, 0, "OBWB_ISEL2 (0-1)"},
    {0xC0F0,   0x8394, 0, "PROC24_ISEL2 (0-1)"},
    {0xC0F0,   0x8398, 0, "PACK32_ISEL2 (0-3)"},
    {0xC0F0,   0x839C, 0, "PACK16_ISEL2 (0-3)"},
    {0xC0F0,   0x83A0, 0, "TAIWAN_ISEL (0-3)"},

    {0xC0F0,   0x8220, 0, "ADKIZ_ENABLE?"},
    {0xC0F0,   0x8224, 0, "ADKIZ_THRESHOLD"},
    {0xC0F0,   0x8238, 0, "ADKIZ_INTR_CLR"},
    {0xC0F0,   0x825C, 0, "ADKIZ_THRESHOLD_14_12"},
    {0xC0F0,   0x8234, 0, "ADKIZ_TOTAL_SIZE"},
    {0xC0F0,   0x823C, 0, "ADKIZ_INTR_EN"},

    {0xC0F0,   0x8060, 0, "DSUNPACK_ENB?"},
    {0xC0F0,   0x8064, 0, "DSUNPACK_MODE"},
    {0xC0F0,   0x8274, 0, "DSUNPACK_DM_EN"},

    {0xC0F0,   0x8130, 0, "DEFM_ENABLE?"},
    {0xC0F0,   0x8138, 0, "DEFM_MODE"},
    {0xC0F0,   0x8140, 0, "DEFM_INTR_NUM"},
    {0xC0F0,   0x814C, 0, "DEFM_GRADE"},        // RealtimeDefectsGrade
    {0xC0F0,   0x8150, 0, "DEFM_DAT_TH"},
    {0xC0F0,   0x8154, 0, "DEFM_INTR_CLR"},
    {0xC0F0,   0x8158, 0, "DEFM_INTR_EN"},
    {0xC0F0,   0x815C, 0, "DEFM_14_12_SEL"},
    {0xC0F0,   0x8160, 0, "DEFM_DAT_TH_14_12"},
    {0xC0F0,   0x816C, 0, "DEFM_X2MODE"},

    {0xC0F0,   0x8180, 0, "HIV_ENB"},
    //~ {0xC0F0,   0x8184, 0, "HIV_V_SIZE"},
    //~ {0xC0F0,   0x8188, 0, "HIV_H_SIZE"},
    {0xC0F0,   0x818C, 0, "HIV_POS_V_OFST"},
    {0xC0F0,   0x8190, 0, "HIV_POS_H_OFST"},
    //{0xC0F0,   0x819C, 0, "HIV_POST_SETUP"},
    {0xC0F0,   0x8420, 0, "HIV_BASE_OFST"},
    {0xC0F0,   0x8428, 0, "HIV_GAIN_DIV"},
    {0xC0F0,   0x842C, 0, "HIV_PATH"},
    {0xC0F0,   0x8218, 0, "HIV_IN_SEL"},
    {0xC0F0,   0x8214, 0, "HIV_PPR_EZ"},
    {0xC0F0,   0x82C4, 0, "HIV_DEFMARK_CANCEL"},

    {0xC0F0,   0x8240, 0, "ADMERG_INTR_EN"},
    {0xC0F0,   0x8244, 0, "ADMERG_TOTAL_SIZE"},
    {0xC0F0,   0x8250, 0, "ADMERG_2_IN_SE"},

    {0xC0F0,   0x8020, 0, "SHAD_ENABLE?"},
    //{0xC0F0,   0x8024, 0, "SHAD_MODE"},
    {0xC0F0,   0x8028, 0, "SHADE_PRESETUP"},
    {0xC0F0,   0x802C, 0, "SHAD_POSTSETUP"},
    //{0xC0F0,   0x8030, 0, "SHAD_GAIN"},
    //{0xC0F0,   0x8034, 0, "SHAD_PRESETUP_14_12"},
    {0xC0F0,   0x8038, 0, "SHAD_POSTSETUP_14_12"},
    {0xC0F0,   0x8280, 0, "SHAD_CBIT"},
    {0xC0F0,   0x8284, 0, "SHAD_C8MODE"},
    {0xC0F0,   0x8288, 0, "SHAD_C12MODE"},
    {0xC0F0,   0x8290, 0, "SHAD_COF_SEL"},
    {0xC0F0,   0x828C, 0, "SHAD_RMODE"},
    {0xC0F0,   0x82A8, 0, "SHAD_KZMK_SAV"},

    {0xC0F0,   0x8040, 0, "TWOADD_ENABLE"},
    {0xC0F0,   0x8044, 0, "TWOADD_MODE"},
    {0xC0F0,   0x8050, 0, "TWOADD_SETUP_14_12"},
    {0xC0F0,   0x8054, 0, "TWOADD_LIMIT_14_12"},
    {0xC0F0,   0x8048, 0, "TWOADD_SETUP"},
    {0xC0F0,   0x804C, 0, "TWOADD_LIMIT"},
    {0xC0F0,   0x8058, 0, "TWOADD_SAT_LIMIT"},
    {0xC0F0,   0x82AC, 0, "TWOA_KZMK_SAV_A"},
    {0xC0F0,   0x82B0, 0, "TWOA_KZMK_SAV_B"},
    
    {0xc0f0,   0x8114, 0, "LV raw type (see lv_af_raw, lv_set_raw) - DIGIC IV (PACK32_ISEL)"},
    {0xc0f3,   0x7014, 0, "LV raw type (see lv_af_raw, lv_set_raw) - DIGIC V"},

/*
    550D:
              1080p     720p        5x          10x
    c0f10064: 49d075f   2cf075f     45109d7
    c0f080b0: 49d075f   2cf075f     45109d7
    c0f08184:     49d   2cf         451
    c0f08188:     75f   75f         9d7
    c0f08194:     75f   75f         9d7
    c0f08198:     75f   75f         9d7
    c0f0d014: 49d0760   2cf0760     2b30418
    c0f11394: 47706b7   2ab06b7     2af0407
    c0f1151c: 47706b7   2ab06b7     2af0407
    c0f1a00c: 6b70477   6b702ab     40702af
    c0f25054: 6b7       6b7         407
    c0f2500c: 6b7       6b7         407
    c0f1155c: 477041f   2ab03ff     2af03ff
    c0f112d4: 477035c   2ab035c     2af0408     1df0fff
    c0f11314: 47702cf   2ab02cf     2af02cf     fff0205

    c0f08548: dd7161d   e0b161d     45109d7
*/
    {0xC0F1,   0x0064, 0, "LV resolution (RAW.height | RAW.width)"},     // OK, full raw buffer including optial black
    {0xC0F0,   0x80B0, 0, "LV resolution (RAW.height | RAW.width)"},     // values matches EDMAC size
    {0xC0F0,   0x8184, 0, "LV resolution (RAW.height) aka HIV_V_SIZE "}, // however, changing them has either no effect or camera locks up :(
    {0xC0F0,   0x8188, 0, "LV resolution (RAW.width) aka HIV_H_SIZE "},
    {0xC0F0,   0x8194, 0, "LV resolution (RAW.width)"},
    {0xC0F0,   0x8198, 0, "LV resolution (RAW.width)"},
    
    {0xC0F1,   0xD014, 0, "LV resolution (raw.j.height? | raw.j.width?)"},  // values a little larger than active area (?)
    {0xC0F1,   0x1394, 0, "LV resolution (raw.j.height | raw.j.width)"},
    {0xC0F1,   0x151c, 0, "LV resolution (raw.j.height | raw.j.width)"},
    {0xC0F1,   0xa00c, 0, "LV resolution (raw.j.width | raw.j.height)"},
    {0xC0F2,   0x5054, 0, "LV resolution (raw.j.width)"},
    {0xC0F2,   0x500c, 0, "LV resolution (raw.j.width)"},
    {0xC0F1,   0x155c, 0, "LV resolution (raw.j.height | hd.width)"},
    {0xC0F1,   0x12d4, 0, "LV resolution (raw.j.height | ?) before upsampling?"},           // these two also change at 5x->10x zoom
    {0xC0F1,   0x1314, 0, "LV resolution (raw.j.height | lv.width) before upsampling?"},    // ratio is around 1.4, so maybe some upsampling is applied afterwards

    {0xC0F0,   0x8548, 0, "LV resolution * downsize factor? (RAW.height * D | RAW.width * D)"},

    {0xC0F0,   0x9050, 0, "Aewb metering area (y1|x1)"},
    {0xC0F0,   0x9054, 0, "Aewb metering area (y2|x2)"},

    {0xc0f3,   0x83d4, 0, "Preview area (y1 | x1/4)"},  /* similar to raw_info.active_area */
    {0xc0f3,   0x83dc, 0, "Preview area (y2 | x2/4)"},

    {DST_DFE,  0x180e, 0, "Blue LED"},
    {DST_DFE,  0x1810, 0, "LightMeasure"},
    {DST_DFE,  0x1d02, 0, "DFE gain (similar to ADTG 888x)"},
    {DST_DFE,  0x1d04, 0, "DFE gain (similar to ADTG 888x)"},
    {DST_DFE,  0x1d06, 0, "DFE gain (similar to ADTG 888x)"},
    {DST_DFE,  0x1d08, 0, "DFE gain (similar to ADTG 888x)"},
};

static int adtg_enabled = 0;
static int show_what = 0;

#define SHOW_ALL 0
#define SHOW_KNOWN_ONLY 1
#define SHOW_MODIFIED_SINCE_TIMESTAMP 2
#define SHOW_MODIFIED_AT_LEAST_TWICE 3
#define SHOW_UPDATED_IN_LIVEVIEW 4
#define SHOW_OVERRIDEN 5
#define SHOW_FPS_TIMERS 6
#define SHOW_DISPLAY_REGS 7
#define SHOW_CAPTURE_SIZE_REGS 8
#define SHOW_PREVIEW_SIZE_REGS 9
#define SHOW_ISO_GAIN_REGS 10
#define SHOW_ADTG_ONLY 11
#define SHOW_CMOS_ONLY 12

static int digic_intercept = 0;
static int photo_only = 0;
static int force_low_fps = 0;

static int unique_key = 0;
#define UNIQUE_REG 0
#define UNIQUE_REG_AND_CALLER_TASK 1
#define UNIQUE_REG_AND_CALLER_PC 2

static int random_pokes = 0;

/* number of LiveView frames captured with logging enabled */
static unsigned int adtg_lv_frames = 0;

/* last register changed from menu */
static uint32_t last_changed_reg = 0;
static uint32_t last_changed_val = 0;
static int skip_logging = 0;

static uint32_t ADTG_WRITE_FUNC = 0;
static uint32_t CMOS_WRITE_FUNC = 0;
static uint32_t CMOS2_WRITE_FUNC = 0;
static uint32_t CMOS16_WRITE_FUNC = 0;
static uint32_t ENGIO_WRITE_FUNC = 0;
static uint32_t ENG_DRV_OUT_FUNC = 0;
static uint32_t ENG_DRV_OUTS_FUNC = 0;
static uint32_t SEND_DATA_TO_DFE_FUNC = 0;
static uint32_t SCS_DUMMY_READOUT_DONE_FUNC = 0;

#define INVALID_VAL ((int)0xBADCAFFE)

struct reg_entry
{
    struct avl avl;
    union
    {
        struct
        {
            uint32_t context;   /* optional, place where this register was changed from (PC, task, whatever) */
            uint16_t reg;       /* register offset */
            uint16_t dst;       /* register "class" */
        };
        int64_t key;            /* key in the AVL tree */
    };
    int32_t val;
    int32_t ref_val;            /* reference value, used when diff'ing two configurations */
    int32_t prev_vals[4];       /* previous values (for registers modified multiple times) */
    int override;
    void* addr;
    uint32_t caller_task;
    uint32_t caller_pc;
    uint32_t num_pokes;         /* how many times a value was written to this register */
    uint32_t num_changes;       /* how many times a *different* value was written to this register */
    unsigned is_nrzi:1;
    unsigned override_enabled:1;
};

static int cmp_reg(void* a,void* b){
    /* simply returning the difference will overflow */
    if (((struct reg_entry*)a)->key > ((struct reg_entry*)b)->key) return 1;
    if (((struct reg_entry*)a)->key < ((struct reg_entry*)b)->key) return -1;
    return 0;
}

static struct reg_entry regs[4096];
static int reg_num = 0;

/* we need very fast insertion */
/* tiny delays in ADTG or ENGIO may result in broken images */
static struct avl_tree regs_tree;
static struct reg_entry * engio_regs[0x40000] = {0};

static int known_match(int i, int reg)
{
    return
        (
            (known_regs[i].dst == regs[reg].dst) || 
            (known_regs[i].dst == DST_ADTG && regs[reg].dst == (regs[reg].dst & 0xF))
        )
        &&
        (
            (known_regs[i].reg == regs[reg].reg)
        )
    ;
}

static int32_t nrzi_decode( uint32_t in_val )
{
    uint32_t val = 0;
    if (in_val & 0x8000)
        val |= 0x8000;
    for (int num = 0; num < 31; num++)
    {
        uint32_t old_bit = (val & 1<<(30-num+1)) >> 1;
        val |= old_bit ^ (in_val & 1<<(30-num));
    }
    return val;
}

static uint32_t nrzi_encode( uint32_t in_val )
{
    uint32_t out_val = 0;
    uint32_t old_bit = 0;
    for (int num = 0; num < 31; num++)
    {
        uint32_t bit = in_val & 1<<(30-num) ? 1 : 0;
        if (bit != old_bit)
            out_val |= (1 << (30-num));
        old_bit = bit;
    }
    return out_val;
}

static int get_override_value(struct reg_entry * re)
{
    if (random_pokes == 1)
    {
        return rand();
    }

    if (random_pokes == 2)
    {
        int time = get_seconds_clock();
        int reg = re->reg;
        int dst = re->dst;
        int context = re->context;
        
        /* http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200101/homework10/hashfuncs.html */
        uint32_t k = time*123 + reg*456 + dst*789 + context * 357;
        uint32_t s = 2654435769;
        uint32_t x = k*s;
        return x >> 16;
    }

    return re->override;
}

static volatile struct reg_entry * found_reg = 0;

static int reg_iter(avl * a)
{
    found_reg = (struct reg_entry *) a;
    return 0;
}

static int reg_total = 0;
static struct reg_entry * reg_find(uint16_t dst, uint16_t reg, uint32_t context)
{
    reg_total++;

    if (unique_key == UNIQUE_REG && (dst & DST_ENGIO_MASK) == DST_ENGIO)
    {
        /* ENGIO registers are assumed to be from 0xC0F00000 to C0FFFFFF */
        /* store them outside the AVL for O(1) lookups (we need the extra speed in e.g. 1080p50) */
        uint32_t off = ((((uint32_t) dst << 16) | (uint32_t) reg) & 0x000FFFFC) >> 2;
        return engio_regs[off];
    }
    else
    {
        struct reg_entry ref = {{0}};
        ref.dst = dst;
        ref.reg = reg;
        ref.context = context;
        found_reg = 0;
        avl_search(&regs_tree, (struct avl *) &ref, reg_iter);
        return (struct reg_entry *) found_reg;
    }

    /* unoptimized code, for reference/troubleshooting */
    /*
    struct reg_entry * found = 0;
    int i = 0;
    for (i = 0; i < reg_num; i++)
    {
        if (regs[i].dst == dst && regs[i].reg == reg)
        {
            found = &regs[i];
            break;
        }
    }
    
    if (found != found_reg)
    {
        printf("%x %x (%d/%d) %x %x (%d) %d\n", found, found_reg, i, reg_num, found->key, found_reg->key, regs_tree.compar(found, &ref), checktree(regs_tree.root, regs_tree.compar));
    }
    return (struct reg_entry *) found;
    */
}

static void reg_update_unique(uint16_t dst, void* addr, uint32_t data, uint16_t* val_ptr, uint32_t reg_shift, uint32_t is_nrzi, uint32_t caller_task, uint32_t caller_pc)
{
    if (reg_num + 1 >= COUNT(regs))
    {
        return;
    }
    
    uint32_t reg = data >> reg_shift;
    int32_t val = data & ((1 << reg_shift) - 1);
    uint32_t context = 
        unique_key == UNIQUE_REG_AND_CALLER_PC ? caller_pc :
        unique_key == UNIQUE_REG_AND_CALLER_TASK ? caller_task : 0;
    
    uint32_t old = cli();
    struct reg_entry * re = reg_find(dst, reg, context);

    if (!re)
    {
        /* new entry */
        re = &regs[reg_num];
        re->dst = dst;
        re->reg = reg;
        re->override = INVALID_VAL;
        re->override_enabled = 0;
        re->is_nrzi = is_nrzi; /* initial guess; may be overriden */
        re->val = re->ref_val = INVALID_VAL;
        re->prev_vals[0] = re->prev_vals[1] = re->prev_vals[2] = re->prev_vals[3] = INVALID_VAL;
        re->num_changes = re->num_pokes = 0;
        re->context = context;
        /* all 16-bit registers are stored in the AVL */
        avl_insert(&regs_tree, (struct avl *) re);
        reg_num++;
    }
    sei(old);

    /* fill the data */
    if (re->override_enabled)
    {
        int ovr = get_override_value(re);
        ovr &= ((1 << reg_shift) - 1);
        *val_ptr &= ~((1 << reg_shift) - 1);
        *val_ptr |= ovr;
    }

    if (re->val != val)
    {
        int old = cli();
        re->num_changes++;
        re->prev_vals[3] = re->prev_vals[2];
        re->prev_vals[2] = re->prev_vals[1];
        re->prev_vals[1] = re->prev_vals[0];
        re->prev_vals[0] = re->val;
        re->val = val;
        if (!re->override_enabled)
        {
            re->override = val;
        }
        sei(old);
    }

    re->num_pokes++;
    re->addr = addr;
    re->caller_task = caller_task;
    re->caller_pc = caller_pc;
}

static void reg_update_unique_32(uint16_t dst, uint16_t reg, uint32_t* addr, uint32_t* val_ptr, uint32_t caller_task, uint32_t caller_pc)
{
    if (reg_num + 1 >= COUNT(regs))
    {
        return;
    }

    if ((dst == 0xC0F0 && (reg & 0xF000) == 0x4000) ||  /* EDMAC block 1: 0xC0F04xnn */
        (dst == 0xC0F2 && (reg & 0xF000) == 0x6000) ||  /* EDMAC block 2: 0xC0F26xnn */
        (dst == 0xC0F3 && (reg & 0xF000) == 0x0000) ||  /* EDMAC block 3: 0xC0F30xnn */
        0)
    {
        /* ignore EDMAC activity */
        return;
    }

    int32_t val = *(int32_t*)val_ptr;
    uint32_t context = 
        unique_key == UNIQUE_REG_AND_CALLER_PC ? caller_pc :
        unique_key == UNIQUE_REG_AND_CALLER_TASK ? caller_task : 0;

    uint32_t old = cli();
    struct reg_entry * re = reg_find(dst, reg, context);

    if (!re)
    {
        /* new entry */
        re = &regs[reg_num];
        re->dst = dst;
        re->reg = reg;
        re->override = INVALID_VAL;
        re->override_enabled = 0;
        re->is_nrzi = 0;
        re->val = re->ref_val = INVALID_VAL;
        re->prev_vals[0] = re->prev_vals[1] = re->prev_vals[2] = re->prev_vals[3] = INVALID_VAL;
        re->num_changes = re->num_pokes = 0;
        re->context = context;
        if (unique_key == UNIQUE_REG && (dst & DST_ENGIO_MASK) == DST_ENGIO) {
            uint32_t off = ((((uint32_t) dst << 16) | (uint32_t) reg) & 0x000FFFFC) >> 2;
            engio_regs[off] = re;
        } else {
            avl_insert(&regs_tree, (struct avl *) re);
        }
        reg_num++;
    }
    sei(old);
    
    if (force_low_fps)
    {
        /* override these registers before they get a chance to appear in the menu */
        if (re->dst == 0xC0F0 && re->reg == 0x6014)
        {
            *val_ptr = 8191;
        }
    }

    if (re->override_enabled)
    {
        int ovr = get_override_value(re);
        *val_ptr = ovr;
    }

    if (re->val != val)
    {
        int old = cli();
        re->num_changes++;
        re->prev_vals[3] = re->prev_vals[2];
        re->prev_vals[2] = re->prev_vals[1];
        re->prev_vals[1] = re->prev_vals[0];
        re->prev_vals[0] = re->val;
        re->val = val;
        if (!re->override_enabled)
        {
            re->override = val;
        }
        sei(old);
    }

    re->num_pokes++;
    re->addr = addr;
    re->caller_task = caller_task;
    re->caller_pc = caller_pc;
}

/* used in cmos/adtg/engio log functions */
#define INCREMENT(data_buf, copy_ptr, copy_end) {  \
        data_buf++;                                         \
        copy_ptr++;                                         \
        if (copy_ptr > copy_end) {                          \
            cli();                                          \
            while(1); /* on error, lock up the camera */    \
        }                                                   \
    }

static void adtg_log(uint32_t* regs, uint32_t* stack, uint32_t pc)
{
    if (skip_logging) return;
    if (photo_only && lv) return;
    
    uint32_t cs = regs[0];
    uint32_t *data_buf = (uint32_t *) regs[1];
    int dst = cs & 0xF;

    uint32_t caller_task = current_task->taskId;
    uint32_t caller_pc = PATCH_HOOK_CALLER();

    /* copy data into a buffer, to make the override temporary */
    static uint32_t copy[512];
    uint32_t* copy_end = &copy[COUNT(copy)];
    uint32_t* copy_ptr = copy;

    /* log all ADTG writes */
    while(*data_buf != 0xFFFFFFFF)
    {
        *copy_ptr = *data_buf;
        /* note: dst is a bit field (5D3: ADTG 2 and 4, some values written to both, others to just one of them) */
        reg_update_unique(dst, data_buf, *data_buf, (uint16_t*)copy_ptr, 16, 0, caller_task, caller_pc);
        INCREMENT(data_buf, copy_ptr, copy_end);
    }
    *copy_ptr = 0xFFFFFFFF;
    
    /* pass our modified register list to adtg_write */
    regs[1] = (uint32_t) copy;
}

static void cmos_log(uint32_t* regs, uint32_t* stack, uint32_t pc)
{
    if (skip_logging) return;
    if (photo_only && lv) return;

    uint16_t *data_buf = (uint16_t *) regs[0];
    
    uint32_t caller_task = current_task->taskId;
    uint32_t caller_pc = PATCH_HOOK_CALLER();

    /* copy data into a buffer, to make the override temporary */
    /* that means: as soon as we stop executing the hooks / overriding things,
     * values are back to normal */
    static uint16_t copy[512];
    uint16_t* copy_end = &copy[COUNT(copy)];
    uint16_t* copy_ptr = copy;

    /* log all CMOS writes */
    while(*data_buf != 0xFFFF)
    {
        *copy_ptr = *data_buf;
        reg_update_unique(DST_CMOS, data_buf, *data_buf, copy_ptr, 12, 0, caller_task, caller_pc);
        INCREMENT(data_buf, copy_ptr, copy_end);
    }
    *copy_ptr = 0xFFFF;

    /* pass our modified register list to cmos_write */
    regs[0] = (uint32_t) copy;
}

static void cmos16_log(uint32_t* regs, uint32_t* stack, uint32_t pc)
{
    if (skip_logging) return;
    if (photo_only && lv) return;

    uint16_t *data_buf = (uint16_t *) regs[0];
    
    uint32_t caller_task = current_task->taskId;
    uint32_t caller_pc = PATCH_HOOK_CALLER();

    /* copy data into a buffer, to make the override temporary */
    /* that means: as soon as we stop executing the hooks / overriding things,
     * values are back to normal */
    static uint16_t copy[512];
    uint16_t* copy_end = &copy[COUNT(copy)];
    uint16_t* copy_ptr = copy;

    /* log all CMOS writes */
    while(*data_buf != 0xFFFF)
    {
        *copy_ptr = *data_buf;
        reg_update_unique(DST_CMOS16, data_buf, *data_buf, copy_ptr, 12, 0, caller_task, caller_pc);
        INCREMENT(data_buf, copy_ptr, copy_end);
    }
    *copy_ptr = 0xFFFF;

    /* pass our modified register list to cmos16_write */
    regs[0] = (uint32_t) copy;
}

static void engio_write_log(uint32_t* regs, uint32_t* stack, uint32_t pc)
{
    if (skip_logging) return;
    if (photo_only && lv) return;
    if (!digic_intercept) return;
    
    uint32_t* data_buf = (uint32_t*) regs[0];

    /* copy data into a buffer, to make the override temporary */
    static uint32_t copy[512];
    uint32_t* copy_end = &copy[COUNT(copy)];
    uint32_t* copy_ptr = copy;

    uint32_t caller_task = current_task->taskId;
    uint32_t caller_pc = PATCH_HOOK_CALLER();

    /* log all ENGIO register writes */
    while(*data_buf != 0xFFFFFFFF)
    {
        *copy_ptr = *data_buf;
        uint16_t dst = ((*data_buf) & 0xFFFF0000) >> 16;
        uint16_t reg = (*data_buf) & 0x0000FFFF;
        INCREMENT(data_buf, copy_ptr, copy_end);
        *copy_ptr = *data_buf;
        reg_update_unique_32(dst, reg, data_buf, copy_ptr, caller_task, caller_pc);
        INCREMENT(data_buf, copy_ptr, copy_end);
    }
    *copy_ptr = 0xFFFFFFFF;

    /* pass our modified register list to engio_write */
    regs[0] = (uint32_t) copy;
}

static void EngDrvOut_log(uint32_t* regs, uint32_t* stack, uint32_t pc)
{
    if (skip_logging) return;
    if (photo_only && lv) return;
    if (!digic_intercept) return;

    uint32_t data = (uint32_t) regs[0];
    uint16_t dst = (data & 0xFFFF0000) >> 16;
    uint16_t reg = data & 0x0000FFFF;
    uint32_t val = (uint32_t) regs[1];

    uint32_t caller_task = current_task->taskId;
    uint32_t caller_pc = PATCH_HOOK_CALLER();
    
    reg_update_unique_32(dst, reg, &val, &val, caller_task, caller_pc);
    regs[1] = val;
}

static void EngDrvOuts_log(uint32_t* regs, uint32_t* stack, uint32_t pc)
{
    if (skip_logging) return;
    if (photo_only && lv) return;
    if (!digic_intercept) return;

    uint32_t data = (uint32_t) regs[0];
    uint16_t dst = (data & 0xFFFF0000) >> 16;
    uint16_t reg = data & 0x0000FFFF;
    uint32_t * values = (uint32_t *) regs[1];
    uint32_t num = (uint32_t) regs[2];

    uint32_t caller_task = current_task->taskId;
    uint32_t caller_pc = PATCH_HOOK_CALLER();
    
    /* fixme: copy the data to make sure our overrides are temporary */
    for (uint32_t i = 0; i < num; i++)
    {
        reg_update_unique_32(dst, reg + 4*i, &values[i], &values[i], caller_task, caller_pc);
    }
}

#ifdef ENGIO_USE_IO_TRACE
static void mmio_handler(uint32_t pc, uint32_t * regs)
{
    if (skip_logging) return;
    if (photo_only && lv) return;
    if (!digic_intercept) return;

    uint32_t reg, val, Rd;
    if (decode_mmio_str(pc, regs, &reg, &val, &Rd))
    {
        /* forward this MMIO write to adtg_gui */
        reg_update_unique_32(reg >> 16, reg & 0xFFFF, (void *) pc, &val, current_task->taskId, pc);

        /* override the value written to this register */
        regs[Rd] = val;
    }
}
#endif

static void SendDataToDfe_log(uint32_t* regs, uint32_t* stack, uint32_t pc)
{
    if (skip_logging) return;
    if (photo_only && lv) return;
    
    uint32_t *data_buf = (uint32_t *) regs[0];

    uint32_t caller_task = current_task->taskId;
    uint32_t caller_pc = PATCH_HOOK_CALLER();

    /* copy data into a buffer, to make the override temporary */
    static uint32_t copy[512];
    uint32_t* copy_end = &copy[COUNT(copy)];
    uint32_t* copy_ptr = copy;

    /* log all DFE writes */
    while(*data_buf != 0xFFFFFFFF)
    {
        *copy_ptr = *data_buf;
        reg_update_unique(DST_DFE, data_buf, *data_buf, (uint16_t*)copy_ptr, 16, 0, caller_task, caller_pc);
        INCREMENT(data_buf, copy_ptr, copy_end);
    }
    *copy_ptr = 0xFFFFFFFF;
    
    /* pass our modified register list to SendDataToDfe */
    regs[0] = (uint32_t) copy;
}

static void dummy_readout_log(uint32_t* _regs, uint32_t* stack, uint32_t pc)
{
    /* fixme: naming conflict */
    for (int reg = 0; reg < reg_num; reg++)
    {
        regs[reg].ref_val = regs[reg].val;
    }
}

/* called once every LiveView frame */
static unsigned int adtg_vsync_cbr(unsigned int unused)
{
    if (adtg_enabled)
    {
        adtg_lv_frames++;
    }
    return 0;
}

static unsigned int adtg_vsync_setparam_cbr(unsigned int unused)
{
    if (last_changed_reg)
    {
        uint16_t dst = last_changed_reg >> 16;
        if (dst == DST_DFE)
        {
            /* TODO? */
        }
        else if (dst == DST_CMOS)
        {
            /* not needed; these registers are refreshed continuously during LiveView */
        }
        else if ((dst & ~DST_ADTG) == 0)
        {
            int old = cli();
            skip_logging = 1;
            void (*adtg_write)(int, uint32_t *) = (void *) ADTG_WRITE_FUNC;
            adtg_write(dst, (uint32_t []) { (last_changed_reg << 16) | last_changed_val, 0xFFFFFFFF });
            skip_logging = 0;
            sei(old);
        }
        else if ((dst & DST_ENGIO_MASK) == DST_ENGIO)
        {
            int old = cli();
            skip_logging = 1;
            EngDrvOut(last_changed_reg, last_changed_val);
            if ((last_changed_reg & 0xFFFFFF00) == 0xC0F06000) /* 0xC0F060xx */
            {
                /* some models require this for overriding FPS and image capture resolution registers */
                MEM(0xC0F06000) = 1;
            }
            skip_logging = 0;
            sei(old);
        }
        last_changed_reg = 0;
    }
    return 0;
}

/* forward reference */
static struct menu_entry adtg_gui_menu[];

static int log_all_regs = 0;
static volatile int log_iso_regs_running = 0;

static void log_iso_regs()
{
    log_iso_regs_running = 1;
    
    msleep(1000);
    int size = 1024*1024;
    char* msg = fio_malloc(size);
    if (!msg) return;
    msg[0] = 0;
    int len = 0;
    int saved_regs = 0;

    len += snprintf(msg+len, size-len, "%s %s\n", camera_model, firmware_version);
    for (int i = 0; i < reg_num; i++)
    {
        /* XXX: change this if you ever add or remove menu entries */
        /* fixme: duplicate code */
        struct menu_entry * entry = &(adtg_gui_menu[0].children[i + 2]);
        
        if (entry->shidden)
            continue;

        len += snprintf(msg+len, size-len, "%04x%04x:%8x ", regs[i].dst, regs[i].reg, regs[i].val);
        if (regs[i].val != regs[i].ref_val)
        {
            snprintf(msg+len, size-len, "(was %x)         ", regs[i].ref_val);
            len += 5 + 8 + 2;
        }
        len += snprintf(msg+len, size-len, "ISO=%d Tv=%d Av=%d ", raw2iso(lens_info.raw_iso), lens_info.shutter, lens_info.aperture);
        len += snprintf(msg+len, size-len, "lv=%d zoom=%d mv=%d res=%d crop=%d ", lv, lv_dispsize, is_movie_mode(), is_movie_mode() ? video_mode_resolution : -1, is_movie_mode() ? video_mode_crop : -1);
        len += snprintf(msg+len, size-len, "task=%s pc=%x addr=%x ", get_task_name_from_id(regs[i].caller_task), regs[i].caller_pc, regs[i].addr);

        for (int j = 0; j < COUNT(known_regs); j++)
            if (known_match(j, i))
                len += snprintf(msg+len, size-len, "%s", known_regs[j].description);

        len += snprintf(msg+len, size-len, "\n");
        
        saved_regs++;
    }

    len += snprintf(msg+len, size-len, "==================================================================\n");

    FILE * f = FIO_CreateFileOrAppend("ML/LOGS/adtg.log");
    FIO_WriteFile(f, msg, len);
    FIO_CloseFile(f);
    fio_free(msg);
    NotifyBox(2000, "Saved %d regs, %d bytes", saved_regs, len);
    log_iso_regs_running = 0;
}

PROP_HANDLER(PROP_GUI_STATE)
{
    if (buf[0] == GUISTATE_QR)
    {
        if (log_all_regs && adtg_enabled && !log_iso_regs_running)
        {
            log_iso_regs_running = 1;
            task_create("log_iso_regs", 0x1c, 0x1000, log_iso_regs, 0);
        }
    }
}

static MENU_SELECT_FUNC(adtg_toggle)
{
    adtg_enabled = !adtg_enabled;

    if (adtg_enabled)
    {
        /* set hooks at ADTG and CMOS writes */
        if (ADTG_WRITE_FUNC)   patch_hook_function(ADTG_WRITE_FUNC, MEM(ADTG_WRITE_FUNC), &adtg_log, "adtg_log");
        if (CMOS_WRITE_FUNC)   patch_hook_function(CMOS_WRITE_FUNC, MEM(CMOS_WRITE_FUNC), &cmos_log, "cmos_log");
        if (CMOS2_WRITE_FUNC)  patch_hook_function(CMOS2_WRITE_FUNC, MEM(CMOS2_WRITE_FUNC), &cmos_log, "cmos_log");
        if (CMOS16_WRITE_FUNC) patch_hook_function(CMOS16_WRITE_FUNC, MEM(CMOS16_WRITE_FUNC), &cmos16_log, "cmos16_log");
#ifdef ENGIO_USE_IO_TRACE
        io_trace_install();
#else
        if (ENGIO_WRITE_FUNC)  patch_hook_function(ENGIO_WRITE_FUNC, MEM(ENGIO_WRITE_FUNC), &engio_write_log, "engio_write_log");
        if (ENG_DRV_OUT_FUNC)  patch_hook_function(ENG_DRV_OUT_FUNC, MEM(ENG_DRV_OUT_FUNC), &EngDrvOut_log, "EngDrvOut_log");
        if (ENG_DRV_OUTS_FUNC) patch_hook_function(ENG_DRV_OUTS_FUNC, MEM(ENG_DRV_OUTS_FUNC), &EngDrvOuts_log, "EngDrvOuts_log");
#endif
        if (SEND_DATA_TO_DFE_FUNC) patch_hook_function(SEND_DATA_TO_DFE_FUNC, MEM(SEND_DATA_TO_DFE_FUNC), &SendDataToDfe_log, "SendDataToDfe_log");
        if (SCS_DUMMY_READOUT_DONE_FUNC) patch_hook_function(SCS_DUMMY_READOUT_DONE_FUNC, MEM(SCS_DUMMY_READOUT_DONE_FUNC), &dummy_readout_log, "dummy_readout_log");

        if (lv)
        {
            /* set overridden registers, if any */
            /* FIXME: change all of them at once */
            for (int i = 0; i < reg_num; i++)
            {
                if (regs[i].override_enabled)
                {
                    while (last_changed_reg) msleep(10);
                    last_changed_reg = ((uint32_t) regs[i].dst << 16) | regs[i].reg;
                    last_changed_val = regs[i].override;
                    while (last_changed_reg) msleep(10);
                }
            }
        }
    }
    else
    {
        if (lv)
        {
            /* restore overridden registers, if any */
            /* FIXME: change all of them at once */
            for (int i = 0; i < reg_num; i++)
            {
                if (regs[i].override_enabled)
                {
                    while (last_changed_reg) msleep(10);
                    last_changed_reg = ((uint32_t) regs[i].dst << 16) | regs[i].reg;
                    last_changed_val = regs[i].val;
                    while (last_changed_reg) msleep(10);
                }
            }
        }

        /* uninstall watchpoints */
        if (ADTG_WRITE_FUNC)   unpatch_memory(ADTG_WRITE_FUNC);
        if (CMOS_WRITE_FUNC)   unpatch_memory(CMOS_WRITE_FUNC);
        if (CMOS2_WRITE_FUNC)  unpatch_memory(CMOS2_WRITE_FUNC);
        if (CMOS16_WRITE_FUNC) unpatch_memory(CMOS16_WRITE_FUNC);
#ifdef ENGIO_USE_IO_TRACE
        io_trace_uninstall();
#else
        if (ENGIO_WRITE_FUNC)  unpatch_memory(ENGIO_WRITE_FUNC);
        if (ENG_DRV_OUT_FUNC)  unpatch_memory(ENG_DRV_OUT_FUNC);
        if (ENG_DRV_OUTS_FUNC) unpatch_memory(ENG_DRV_OUTS_FUNC);
#endif
        if (SEND_DATA_TO_DFE_FUNC) unpatch_memory(SEND_DATA_TO_DFE_FUNC);
        if (SCS_DUMMY_READOUT_DONE_FUNC) unpatch_memory(SCS_DUMMY_READOUT_DONE_FUNC);
    }
}

static int get_reg_from_priv(void* priv)
{
    /* in order to use menu caret editing, entry->priv points to regs[reg].override */
    return ((intptr_t) priv - (intptr_t) &regs[0].override) / sizeof(regs[0]);
}

static MENU_UPDATE_FUNC(reg_update)
{
    int reg = get_reg_from_priv(entry->priv);
    if (reg < 0 || reg >= COUNT(regs))
        return;

    if (entry->selected && regs[reg].override_enabled)
    {
        last_changed_reg = ((uint32_t) regs[reg].dst << 16) | regs[reg].reg;
        last_changed_val = regs[reg].override;
    }

    if (entry->selected && regs[reg].override != regs[reg].val)
    {
        /* this assummes override and val are always kept in sync by the log functions (atomic updates) */
        /* so, in order to make sure they are identical, we need to check their equality in an atomic operation too */
        int old = cli();
        if (regs[reg].override != regs[reg].val)
        {
            regs[reg].override_enabled = 1;
        }
        sei(old);
    }
    
    char dst_name[10] = "";
    uint32_t reg_full = regs[reg].reg;

    if (regs[reg].dst == DST_DFE)
    {
        snprintf(dst_name, sizeof(dst_name), "DFE");
        entry->max = 0xFFFF;
    }
    else if (regs[reg].dst == DST_CMOS)
    {
        snprintf(dst_name, sizeof(dst_name), "CMOS");
        entry->max = 0xFFF;
    }
    else if (regs[reg].dst == DST_CMOS16)
    {
        snprintf(dst_name, sizeof(dst_name), "CMOS16");
        entry->max = 0xFFF;
    }
    else if (regs[reg].dst & 0xFFF0)
    {
        entry->max = 0x40000000; /* fixme: menu backend freezes at higher values */
        reg_full |= (uint32_t) regs[reg].dst << 16;
    }
    else
    {
        snprintf(dst_name, sizeof(dst_name), "ADTG");
        for (int i = 0; i < 4; i++)
        {
            if (regs[reg].dst & (1 << i))
            {
                STR_APPEND(dst_name, "%d", 1 << i);
            }
        }
        entry->max = 0xFFFF;
    }

    for (int i = 0; i < COUNT(known_regs); i++)
    {
        if (known_match(i, reg))
        {
            regs[reg].is_nrzi = known_regs[i].is_nrzi;
        }
    }

    if (dst_name[0]) {
        MENU_SET_NAME("%s[%x]%s", dst_name, reg_full, regs[reg].is_nrzi ? " N" : "");
    } else {
        MENU_SET_NAME("%x%s", reg_full, regs[reg].is_nrzi ? " N" : "");
    }

    char msg_prev_vals[128] = "";

    if (show_what == SHOW_MODIFIED_SINCE_TIMESTAMP && !regs[reg].override_enabled)
    {
        MENU_SET_VALUE(
            "%x (was %x)",
            regs[reg].is_nrzi ? nrzi_decode(regs[reg].val) : regs[reg].val,
            regs[reg].is_nrzi ? nrzi_decode(regs[reg].ref_val) : regs[reg].ref_val
        );
    }
    else
    {
        MENU_SET_VALUE(
            "0x%x",
            regs[reg].is_nrzi ? nrzi_decode(regs[reg].val) : regs[reg].val
        );

        if (regs[reg].val != regs[reg].prev_vals[0] && regs[reg].prev_vals[0] != INVALID_VAL)
        {
            STR_APPEND(msg_prev_vals, "Was");
            for (int i = 0; i < COUNT(regs[reg].prev_vals); i++)
            {
                if (regs[reg].prev_vals[i] != INVALID_VAL)
                {
                    int val = regs[reg].prev_vals[i];
                    int dec = regs[reg].is_nrzi ? nrzi_decode(val) : val;
                    STR_APPEND(msg_prev_vals, " %X,", dec);
                }
            }
            msg_prev_vals[strlen(msg_prev_vals)-1] = 0;
            STR_APPEND(msg_prev_vals, ". ");
        }
    }
    
    MENU_SET_HELP("%s:%x:%x v=%d(0x%x) nrzi_dec=%d(0x%x).", get_task_name_from_id(regs[reg].caller_task), regs[reg].caller_pc, regs[reg].addr, regs[reg].val, regs[reg].val, nrzi_decode(regs[reg].val), nrzi_decode(regs[reg].val));
    
    if (reg_num >= COUNT(regs)-1)
        MENU_SET_WARNING(MENU_WARN_ADVICE, "Too many registers.");

    MENU_SET_ICON(MNI_BOOL(regs[reg].override_enabled), 0);
    MENU_SET_ENABLED(1);

    if (regs[reg].override_enabled)
    {
        int ovr = get_override_value(&regs[reg]);
        if (get_menu_edit_mode() || menu_active_but_hidden())
        {
            int val = regs[reg].val;
            MENU_SET_RINFO("<- 0x%x", regs[reg].is_nrzi ? nrzi_decode(val) : val);
        }
        else
        {
            MENU_SET_RINFO("-> 0x%x", regs[reg].is_nrzi ? nrzi_decode(ovr) : ovr);
        }
        
        if (menu_active_and_not_hidden())
        {
            MENU_SET_WARNING(MENU_WARN_INFO, "Press Q to stop overriding this register.");
        }
    }
    else
    {
        for (int i = 0; i < COUNT(known_regs); i++)
        {
            if (known_match(i, reg))
            {
                MENU_SET_WARNING(MENU_WARN_INFO, "%s%s.", msg_prev_vals, known_regs[i].description);
                
                if (show_what != SHOW_MODIFIED_SINCE_TIMESTAMP) /* do we have enough space to show a shortened description? */
                {
                    char msg[12];
                    snprintf(msg, sizeof(msg), "%s", known_regs[i].description);
                    if (!streq(msg, known_regs[i].description))
                    {
                        int len = COUNT(msg);
                        msg[len-1] = 0;
                        msg[len-2] = '.';
                        msg[len-3] = '.';
                        msg[len-4] = '.';
                    }
                    MENU_SET_RINFO("%s", msg);
                }
            }
        }
        if (regs[reg].num_changes > 1)
        {
            int num = (regs[reg].num_changes * 10 + 5) / adtg_lv_frames;

            if (num % 10 && num < 5) {
                MENU_APPEND_RINFO(" "SYM_TIMES"%s%d.%d/f", FMT_FIXEDPOINT1(num));
            } else if (num > 0) {
                MENU_APPEND_RINFO(" "SYM_TIMES"%d/f", (num + 5) / 10);
            } else {
                MENU_APPEND_RINFO(" "SYM_TIMES"%d", regs[reg].num_changes);
            }
        }

        /* if it wasn't set earlier */
        MENU_SET_WARNING(MENU_WARN_INFO, "%s", msg_prev_vals);
    }
}

static MENU_SELECT_FUNC(reg_toggle_override)
{
    int reg = get_reg_from_priv(priv);
    if (reg < 0 || reg >= COUNT(regs))
        return;
    
    if (regs[reg].override_enabled)
    {
        regs[reg].override = regs[reg].val;
        regs[reg].override_enabled = 0;
        last_changed_reg = ((uint32_t) regs[reg].dst << 16) | regs[reg].reg;
        last_changed_val = regs[reg].val;
    }
    else
    {
        menu_close_submenu(); 
    }
}

#define REG_ENTRY(i) \
        { \
            .name = "(empty)", \
            .priv = &regs[i].override, \
            .select_Q = reg_toggle_override, \
            .update = reg_update, \
            .unit = UNIT_HEX, \
            .max = 0xFFFF, \
            .shidden = 1, \
            .edit_mode = EM_SHOW_LIVEVIEW, \
        }

static MENU_UPDATE_FUNC(show_update);

static MENU_UPDATE_FUNC(adtg_update)
{
    MENU_SET_ICON(MNI_BOOL(adtg_enabled), 0);
    if (adtg_enabled)
    {
        MENU_SET_WARNING(MENU_WARN_INFO, "ADTG hooks enabled. Press Q to start researching.");
        MENU_SET_RINFO("%d uniq / %d", reg_num, reg_total);
    }
}

static int unique_change_attempt = 0;
static MENU_SELECT_FUNC(unique_key_toggle)
{
    if (reg_num == 0)
    {
        menu_numeric_toggle(priv, delta, 0, 2);
    }
    else
    {
        unique_change_attempt = 5;
    }
}

static MENU_UPDATE_FUNC(unique_key_update)
{
    if (reg_num > 0 && unique_change_attempt)
    {
        MENU_SET_WARNING(MENU_WARN_ADVICE, "You can no longer change this, sorry. Restart the camera.");
        unique_change_attempt--;
    }
}

static MENU_SELECT_FUNC(lock_displayed_registers)
{
    for (int reg = 0; reg < reg_num; reg++)
    {
        /* XXX: change this if you ever add or remove menu entries */
        /* fixme: duplicate code */
        struct menu_entry * entry = &(adtg_gui_menu[0].children[reg + 2]);
        
        if (entry->shidden)
            continue;
        
        if (!regs[reg].override_enabled)
        {
            regs[reg].override = regs[reg].val;
            regs[reg].override_enabled = 1;
        }
    }
    
    menu_toggle_submenu();
}

/* pack two 6-bit values into a 12-bit one */
#define PACK12(lo,hi) ((((lo) & 0x3F) | ((hi) << 6)) & 0xFFF)

static int crop_mode_reg(int reg)
{
    if ((regs[reg].dst == DST_CMOS) || (regs[reg].dst == 0xC0F0))
    {
        switch (regs[reg].reg)
        {
            case 5: return 0x280;                    /* CMOS[1]: vertical position and size */
            case 7: return 0xaa9;

        case 0x6804: return 0x5b90319; // 3000x1432 24fps x5 Mode;

        case 0x6824: return 0x3ca;
        case 0x6828: return 0x3ca;
        case 0x682C: return 0x3ca;
        case 0x6830: return 0x3ca;
       
        case 0x6010: return 0x34b;
        case 0x6008: return 0x34b034b;
        case 0x600C: return 0x34b034b;

        case 0x6014: return 0x62c;
        case 0x713c: return 0x5b9;

        }
    }


    if (regs[reg].dst == 2)        /* ADTG 2 */
    {
        switch (regs[reg].reg)
        {
           /*  case 0x8000: return 5; */    /* it's 5 in zoom mode and 6 in 1080p; this also overrides ADTG4 */ 
           /*  case 0x8806: return 0x6088 */ /* without this, you get some weird artifacts; this should only go to ADTG2, not 4 */ 
        }
    }

    return 0;
}

static int res3k_reg(int reg)
{
    if (regs[reg].dst == 0xC0F0)
    {
        switch (regs[reg].reg)
        {
            case 0x6804:                /* C0F06804 - raw resolution */
                return 0x52801AB;       /* from 0x528011B -> 3072px in raw_rec */
        }
    }

    return 0;
}

static void apply_preset(int(*get_preset_reg)(int))
{
    for (int reg = 0; reg < reg_num; reg++)
    {
        int ovr = get_preset_reg(reg);
        if (ovr)
        {
            regs[reg].override = ovr;
            regs[reg].override_enabled = 1;
        }
    }
}

static MENU_SELECT_FUNC(crop_mode_overrides)
{
    apply_preset(crop_mode_reg);
    menu_toggle_submenu();
}

static MENU_SELECT_FUNC(crop_mode_overrides_3k)
{
    apply_preset(crop_mode_reg);
    apply_preset(res3k_reg);
    menu_toggle_submenu();
}

static MENU_UPDATE_FUNC(show_update)
{
    static struct tm tm;
    if (show_what == SHOW_MODIFIED_SINCE_TIMESTAMP)
        MENU_SET_VALUE("Modified since %02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec);
    else
        LoadCalendarFromRTC(&tm);

    int changed = 0;
    
    //~ int err = checktree(regs_tree.root, regs_tree.compar);
    //~ MENU_SET_WARNING(MENU_WARN_ADVICE, "AVL tree %x", err);
    
    int current_time = get_ms_clock();
    static int last_update = 0;
    static int prev_show_what = 0;
    int show_what_changed = show_what != prev_show_what;
    prev_show_what = show_what;
    
    for (int reg = 0; reg < reg_num; reg++)
    {
        /* XXX: change this if you ever add or remove menu entries */
        struct menu_entry * entry = &(adtg_gui_menu[0].children[reg + 2]);
        
        if (get_reg_from_priv(entry->priv) != reg)
            break;

        int visible = 0;

        switch (show_what)
        {
            case SHOW_KNOWN_ONLY:
            {
                for (int i = 0; i < COUNT(known_regs); i++)
                {
                    if (known_match(i, reg))
                    {
                        visible = 1;
                        break;
                    }
                }
                break;
            }
            case SHOW_MODIFIED_SINCE_TIMESTAMP:
            {
                visible = regs[reg].val != regs[reg].ref_val;
                break;
            }
            case SHOW_MODIFIED_AT_LEAST_TWICE:
            {
                visible = regs[reg].num_changes > 1;
                break;
            }
            case SHOW_UPDATED_IN_LIVEVIEW:
            {
                visible = regs[reg].num_pokes >= adtg_lv_frames / 10;
                break;
            }
            case SHOW_OVERRIDEN:
            {
                visible = regs[reg].override_enabled;
                break;
            }
            case SHOW_FPS_TIMERS:
            {
                visible = (regs[reg].dst == 0xC0F0) && (regs[reg].reg == 0x6014 || regs[reg].reg == 0x6008);
                break;
            }
            case SHOW_DISPLAY_REGS:
            {
                /* C0F14nnn */
                visible = (regs[reg].dst == 0xC0F1) && ((regs[reg].reg & 0xF000) == 0x4000);
                break;
            }
            case SHOW_CAPTURE_SIZE_REGS:
            case SHOW_PREVIEW_SIZE_REGS:
            {
                if (regs[reg].dst == 0xC0F0)
                {
                    if (
                        regs[reg].reg == 0x6008 ||  /* timer A */
                        regs[reg].reg == 0x600C ||  /* timer A mirror */
                        regs[reg].reg == 0x6010 ||  /* timer A mirror */
                        regs[reg].reg == 0x6824 ||  /* timer A related? */
                        regs[reg].reg == 0x6828 ||  /* timer A related? */
                        regs[reg].reg == 0x682C ||  /* timer A related? */
                        regs[reg].reg == 0x6830 ||  /* timer A related? */
                        regs[reg].reg == 0x6014 ||  /* timer B */
                        regs[reg].reg == 0x6084 ||  /* first line/column (D4) */
                        regs[reg].reg == 0x6088 ||  /* last line/column (D4) */
                        regs[reg].reg == 0x6800 ||  /* first line/column (D5) */
                        regs[reg].reg == 0x6804 ||  /* last line/column (D4) */
                        regs[reg].reg == 0x713C ||  /* HEAD3 */
                        regs[reg].reg == 0x7150 ||  /* HEAD4 */
                        regs[reg].reg == 0x7050 ||  /* HEAD1 (used?) */
                        regs[reg].reg == 0x7064 ||  /* HEAD2 (used?) */
                    0)
                    {
                        visible = 1;
                    }
                }
                else if ((regs[reg].dst & ~DST_ADTG) == 0)
                {
                    if (
                        regs[reg].reg == 0x8172 ||  /* PowerSaveTiming ON (6D/700D) */
                        regs[reg].reg == 0x8178 ||  /* PowerSaveTiming ON (5D3/6D/700D) */
                        regs[reg].reg == 0x8196 ||  /* PowerSaveTiming ON (5D3) */
                        regs[reg].reg == 0x8173 ||  /* PowerSaveTiming OFF (6D/700D) */
                        regs[reg].reg == 0x8179 ||  /* PowerSaveTiming OFF (5D3/6D/700D) */
                        regs[reg].reg == 0x8197 ||  /* PowerSaveTiming OFF (5D3) */
                        regs[reg].reg == 0x82B6 ||  /* PowerSaveTiming ON? (700D) */
                        regs[reg].reg == 0x82F8 ||  /* ReadOutTiming */
                        regs[reg].reg == 0x82F9 ||  /* ReadOutTiming end? */
                        regs[reg].reg == 0x8000 ||  /* 6 = pixel binning, 5 = 1:1 crop */
                        regs[reg].reg == 0x800C ||  /* number of lines skipped / binned */
                        regs[reg].reg == 0x1000 ||  /* equivalent of 0x8000 for old DIGIC 4 */
                        regs[reg].reg == 0x100C ||  /* equivalent of 0x800C for old DIGIC 4 */
                    0)
                    {
                        visible = 1;
                    }
                }
                else if (regs[reg].dst == DST_CMOS)
                {
                    /* show these, too */
                    visible = 1;
                }

                if (show_what == SHOW_PREVIEW_SIZE_REGS)
                {
                    if (visible)
                    {
                        /* selected for capture size? skip it */
                        visible = 0;
                        break;
                    }

                    /* heuristic to select registers possibly related to preview size */
                    if ((regs[reg].dst & DST_ENGIO_MASK) == DST_ENGIO)
                    {
                        if ((regs[reg].dst == 0xC0F1) && ((regs[reg].reg & 0xF000) == 0x4000))
                        {
                            /* display register; not interested */
                        }
                        else
                        {
                            uint32_t val = regs[reg].val;
                            if ((val & 0xFFFFE000) == 0 && ((val & 0x1FF0) != 0))
                            {
                                /* one small value (but not tiny numbers) */
                                visible = 1;
                            }
                            if ((val & 0xE000E000) == 0 && ((val & 0x1FF0) != 0) && ((val & 0x1FF00000) != 0))
                            {
                                /* two values that might be resolution-related */
                                visible = 1;
                            }
                        }
                    }
                }
                break;
            }
            case SHOW_ISO_GAIN_REGS:
            {
                for (int i = 0; i < COUNT(known_regs); i++)
                {
                    if (known_match(i, reg))
                    {
                        if (
                            strstr(known_regs[i].description, "ISO") ||
                            strstr(known_regs[i].description, "gain") ||
                            strstr(known_regs[i].description, "preamp") ||
                        0)
                        {
                            visible = 1;
                            break;
                        }
                    }
                }
                break;
            }
            case SHOW_ADTG_ONLY:
            {
                visible = (regs[reg].dst & ~DST_ADTG) == 0;
                break;
            }
            case SHOW_CMOS_ONLY:
            {
                visible = (regs[reg].dst == DST_CMOS) || (regs[reg].dst == DST_CMOS16);
                break;
            }
            case SHOW_ALL:
            {
                visible = 1;
                break;
            }
        }

        if (show_what == SHOW_MODIFIED_SINCE_TIMESTAMP &&
            regs[reg].num_changes > 100 &&
            !regs[reg].override_enabled)
        {
            /* possibly noise; double-checking */
            int is_known = 0;

            for (int i = 0; i < COUNT(known_regs); i++)
            {
                if (known_match(i, reg))
                {
                    is_known = 1;
                    break;
                }
            }

            if (!is_known)
            {
                /* very likely to be noise */
                visible = 0;
            }
        }

        if (!digic_intercept && (regs[reg].dst & 0xF000) == 0xC000)
        {
            /* hide previously-intercepted DIGIC registers if we disabled the option */
            visible = 0;
        }

        if (entry->shidden != !visible)
        {
            if (current_time - last_update < 3000 && !show_what_changed)
            {
                /* prevent update flood in menu */
                MENU_SET_RINFO("Wait");
                return;
            }

            entry->shidden = !visible;
            changed = 1;
        }

        if (show_what != SHOW_MODIFIED_SINCE_TIMESTAMP)
        {
            regs[reg].ref_val = regs[reg].val;
        }
    }
    
    if (changed && info->can_custom_draw)
    {
        /* just a little trick to avoid transient redrawing artifacts */
        /* todo: better backend support for dynamic menus? */
        info->custom_drawing = CUSTOM_DRAW_THIS_MENU;
        bmp_printf(FONT_LARGE, info->x, info->y, "Updating...");
        last_update = current_time;
    }
}

static struct menu_entry adtg_gui_menu[] =
{
    {
        .name           = "ADTG Registers",
        .priv           = &adtg_enabled,
        .select         = &adtg_toggle,
        .max            = 1,
        .update         = adtg_update,
        .help           = "Edit ADTG/CMOS register values.",
        .submenu_width  = 710,
        .children       = (struct menu_entry[])
        {
            {
                .name           = "Show",
                .priv           = &show_what,
                .update         = show_update,
                .max            = 12,
                .choices        = CHOICES(
                                    "Everything",
                                    "Known regs only",
                                    "Modified from now on",
                                    "Modified at least twice",
                                    "Updated in LiveView",
                                    "Overriden regs only",
                                    "FPS timers only",
                                    "Display registers only",
                                    "Capture size regs only",
                                    "Preview size regs only",
                                    "ISO gain regs only",
                                    "ADTG regs only",
                                    "CMOS regs only",
                                  ),
                .help2          =  "Everything: show all registers as soon as they are written.\n"
                                   "Known: show only the registers with a known description.\n"
                                   "Modified from now on: only regs where final value was modified.\n"
                                   "Modified at least twice: only regs that were changed more than once.\n"
                                   "Updated in LiveView: regs touched (not necessarily changed) in LV.\n"
                                   "Overriden: show only regs where you have changed the value.\n"
                                   "FPS timers only: show only FPS timer A and B.\n"
                                   "Display registers only: C0F14000 ... C0F14FFF.\n"
                                   "Capture size regs only: for overriding resolution of captured image.\n"
                                   "Preview size regs only: for overriding resolution of LiveView image.\n"
                                   "ISO gain regs only: registers known to adjust image capture gains.\n"
                                   "ADTG: registers labeled as such in Canon firmware.\n"
                                   "CMOS: registers labeled as such in Canon firmware.\n"
            },
            {
                .name           = "Advanced",
                .select         = menu_open_submenu,
                .children       = (struct menu_entry[])
                {
                    {
                        .name           = "ENGIO Registers",
                        .priv           = &digic_intercept,
                        .max            = 1,
                        .help           = "Also intercept ENGIO registers (EngDrvOut and engio_write).",
                        #ifdef ENGIO_USE_IO_TRACE
                        .help2          = "Backend: io_trace.",
                        #else
                        .help2          = "Backend: function hooks.",
                        #endif
                    },
                    {
                        .name           = "Unique Key",
                        .priv           = &unique_key,
                        .select         = unique_key_toggle,
                        .update         = unique_key_update,
                        .max            = 2,
                        .icon_type      = IT_DICE_OFF,
                        .choices        = CHOICES("Register", "Register + caller task", "Register + caller PC"),
                        .help           = "When two register operations are identical? (for grouping).",
                        .help2          = "When register number and type (family, class) are equal.\n"
                                           "When reg num/type are equal AND changed from the same task.\n"
                                           "When reg num/type equal AND changed from same prog counter.\n"
                    },
                    {
                        .name           = "Force low FPS",
                        .priv           = &force_low_fps,
                        .max            = 1,
                        .help           = "Try enabling this if it locks up in LiveView.",
                        .help2          = "Also enable 'DIGIC Registers'.",
                    },
                    {
                        .name           = "Disable Logging",
                        .priv           = &photo_only,
                        .max            = 1,
                        .icon_type      = IT_DICE_OFF,
                        .choices        = CHOICES("OFF", "in LiveView"),
                        .help           = "You may disable logging in LiveView.",
                    },
                    {
                        .name           = "Auto Log Registers",
                        .priv           = &log_all_regs,
                        .max            = 1,
                        .choices        = CHOICES("OFF", "After taking a pic"),
                        .help           = "Save visible registers to a log file (adtg.log) after taking a picture.",
                    },
                    {
                        .name           = "Log Registers Now",
                        .priv           = &log_iso_regs,
                        .select         = (void (*)(void*,int))run_in_separate_task,
                        .help           = "Save visible registers to a log file (adtg.log) right now.",
                    }, 
                    {
                        .name           = "Random Pokes",
                        .priv           = &random_pokes,
                        .choices        = CHOICES("OFF", "Every update", "Every second"),
                        .max            = 2,
                        .help           = "Use a random value when overriding the registers.",
                    },
                    {
                        .name           = "Lock Displayed Registers",
                        .select         = lock_displayed_registers,
                        .help           = "Override all displayed registers to their current value.",
                        .help2          = "Registers already overriden will not be changed.",
                    },
                    {
                        .name           = "1:1 crop mode (5D3)",
                        .select         = crop_mode_overrides,
                        .help           = "Turns regular 1080p into 1:1 crop mode. For other cameras:",
                        .help2          = "magiclantern.fm/forum/index.php?topic=10111.msg145036#msg145036",
                    },
                    {
                        .name           = "1:1 3K crop mode (5D3)",
                        .select         = crop_mode_overrides_3k,
                        .help           = "Experimental 3K video mode with 1:1 crop. Preview broken.",
                    },
                    MENU_EOL,
                },
            },
            // for i in range(512): print "            REG_ENTRY(%d)," % i
            REG_ENTRY(0),
            REG_ENTRY(1),
            REG_ENTRY(2),
            REG_ENTRY(3),
            REG_ENTRY(4),
            REG_ENTRY(5),
            REG_ENTRY(6),
            REG_ENTRY(7),
            REG_ENTRY(8),
            REG_ENTRY(9),
            REG_ENTRY(10),
            REG_ENTRY(11),
            REG_ENTRY(12),
            REG_ENTRY(13),
            REG_ENTRY(14),
            REG_ENTRY(15),
            REG_ENTRY(16),
            REG_ENTRY(17),
            REG_ENTRY(18),
            REG_ENTRY(19),
            REG_ENTRY(20),
            REG_ENTRY(21),
            REG_ENTRY(22),
            REG_ENTRY(23),
            REG_ENTRY(24),
            REG_ENTRY(25),
            REG_ENTRY(26),
            REG_ENTRY(27),
            REG_ENTRY(28),
            REG_ENTRY(29),
            REG_ENTRY(30),
            REG_ENTRY(31),
            REG_ENTRY(32),
            REG_ENTRY(33),
            REG_ENTRY(34),
            REG_ENTRY(35),
            REG_ENTRY(36),
            REG_ENTRY(37),
            REG_ENTRY(38),
            REG_ENTRY(39),
            REG_ENTRY(40),
            REG_ENTRY(41),
            REG_ENTRY(42),
            REG_ENTRY(43),
            REG_ENTRY(44),
            REG_ENTRY(45),
            REG_ENTRY(46),
            REG_ENTRY(47),
            REG_ENTRY(48),
            REG_ENTRY(49),
            REG_ENTRY(50),
            REG_ENTRY(51),
            REG_ENTRY(52),
            REG_ENTRY(53),
            REG_ENTRY(54),
            REG_ENTRY(55),
            REG_ENTRY(56),
            REG_ENTRY(57),
            REG_ENTRY(58),
            REG_ENTRY(59),
            REG_ENTRY(60),
            REG_ENTRY(61),
            REG_ENTRY(62),
            REG_ENTRY(63),
            REG_ENTRY(64),
            REG_ENTRY(65),
            REG_ENTRY(66),
            REG_ENTRY(67),
            REG_ENTRY(68),
            REG_ENTRY(69),
            REG_ENTRY(70),
            REG_ENTRY(71),
            REG_ENTRY(72),
            REG_ENTRY(73),
            REG_ENTRY(74),
            REG_ENTRY(75),
            REG_ENTRY(76),
            REG_ENTRY(77),
            REG_ENTRY(78),
            REG_ENTRY(79),
            REG_ENTRY(80),
            REG_ENTRY(81),
            REG_ENTRY(82),
            REG_ENTRY(83),
            REG_ENTRY(84),
            REG_ENTRY(85),
            REG_ENTRY(86),
            REG_ENTRY(87),
            REG_ENTRY(88),
            REG_ENTRY(89),
            REG_ENTRY(90),
            REG_ENTRY(91),
            REG_ENTRY(92),
            REG_ENTRY(93),
            REG_ENTRY(94),
            REG_ENTRY(95),
            REG_ENTRY(96),
            REG_ENTRY(97),
            REG_ENTRY(98),
            REG_ENTRY(99),
            REG_ENTRY(100),
            REG_ENTRY(101),
            REG_ENTRY(102),
            REG_ENTRY(103),
            REG_ENTRY(104),
            REG_ENTRY(105),
            REG_ENTRY(106),
            REG_ENTRY(107),
            REG_ENTRY(108),
            REG_ENTRY(109),
            REG_ENTRY(110),
            REG_ENTRY(111),
            REG_ENTRY(112),
            REG_ENTRY(113),
            REG_ENTRY(114),
            REG_ENTRY(115),
            REG_ENTRY(116),
            REG_ENTRY(117),
            REG_ENTRY(118),
            REG_ENTRY(119),
            REG_ENTRY(120),
            REG_ENTRY(121),
            REG_ENTRY(122),
            REG_ENTRY(123),
            REG_ENTRY(124),
            REG_ENTRY(125),
            REG_ENTRY(126),
            REG_ENTRY(127),
            REG_ENTRY(128),
            REG_ENTRY(129),
            REG_ENTRY(130),
            REG_ENTRY(131),
            REG_ENTRY(132),
            REG_ENTRY(133),
            REG_ENTRY(134),
            REG_ENTRY(135),
            REG_ENTRY(136),
            REG_ENTRY(137),
            REG_ENTRY(138),
            REG_ENTRY(139),
            REG_ENTRY(140),
            REG_ENTRY(141),
            REG_ENTRY(142),
            REG_ENTRY(143),
            REG_ENTRY(144),
            REG_ENTRY(145),
            REG_ENTRY(146),
            REG_ENTRY(147),
            REG_ENTRY(148),
            REG_ENTRY(149),
            REG_ENTRY(150),
            REG_ENTRY(151),
            REG_ENTRY(152),
            REG_ENTRY(153),
            REG_ENTRY(154),
            REG_ENTRY(155),
            REG_ENTRY(156),
            REG_ENTRY(157),
            REG_ENTRY(158),
            REG_ENTRY(159),
            REG_ENTRY(160),
            REG_ENTRY(161),
            REG_ENTRY(162),
            REG_ENTRY(163),
            REG_ENTRY(164),
            REG_ENTRY(165),
            REG_ENTRY(166),
            REG_ENTRY(167),
            REG_ENTRY(168),
            REG_ENTRY(169),
            REG_ENTRY(170),
            REG_ENTRY(171),
            REG_ENTRY(172),
            REG_ENTRY(173),
            REG_ENTRY(174),
            REG_ENTRY(175),
            REG_ENTRY(176),
            REG_ENTRY(177),
            REG_ENTRY(178),
            REG_ENTRY(179),
            REG_ENTRY(180),
            REG_ENTRY(181),
            REG_ENTRY(182),
            REG_ENTRY(183),
            REG_ENTRY(184),
            REG_ENTRY(185),
            REG_ENTRY(186),
            REG_ENTRY(187),
            REG_ENTRY(188),
            REG_ENTRY(189),
            REG_ENTRY(190),
            REG_ENTRY(191),
            REG_ENTRY(192),
            REG_ENTRY(193),
            REG_ENTRY(194),
            REG_ENTRY(195),
            REG_ENTRY(196),
            REG_ENTRY(197),
            REG_ENTRY(198),
            REG_ENTRY(199),
            REG_ENTRY(200),
            REG_ENTRY(201),
            REG_ENTRY(202),
            REG_ENTRY(203),
            REG_ENTRY(204),
            REG_ENTRY(205),
            REG_ENTRY(206),
            REG_ENTRY(207),
            REG_ENTRY(208),
            REG_ENTRY(209),
            REG_ENTRY(210),
            REG_ENTRY(211),
            REG_ENTRY(212),
            REG_ENTRY(213),
            REG_ENTRY(214),
            REG_ENTRY(215),
            REG_ENTRY(216),
            REG_ENTRY(217),
            REG_ENTRY(218),
            REG_ENTRY(219),
            REG_ENTRY(220),
            REG_ENTRY(221),
            REG_ENTRY(222),
            REG_ENTRY(223),
            REG_ENTRY(224),
            REG_ENTRY(225),
            REG_ENTRY(226),
            REG_ENTRY(227),
            REG_ENTRY(228),
            REG_ENTRY(229),
            REG_ENTRY(230),
            REG_ENTRY(231),
            REG_ENTRY(232),
            REG_ENTRY(233),
            REG_ENTRY(234),
            REG_ENTRY(235),
            REG_ENTRY(236),
            REG_ENTRY(237),
            REG_ENTRY(238),
            REG_ENTRY(239),
            REG_ENTRY(240),
            REG_ENTRY(241),
            REG_ENTRY(242),
            REG_ENTRY(243),
            REG_ENTRY(244),
            REG_ENTRY(245),
            REG_ENTRY(246),
            REG_ENTRY(247),
            REG_ENTRY(248),
            REG_ENTRY(249),
            REG_ENTRY(250),
            REG_ENTRY(251),
            REG_ENTRY(252),
            REG_ENTRY(253),
            REG_ENTRY(254),
            REG_ENTRY(255),
            REG_ENTRY(256),
            REG_ENTRY(257),
            REG_ENTRY(258),
            REG_ENTRY(259),
            REG_ENTRY(260),
            REG_ENTRY(261),
            REG_ENTRY(262),
            REG_ENTRY(263),
            REG_ENTRY(264),
            REG_ENTRY(265),
            REG_ENTRY(266),
            REG_ENTRY(267),
            REG_ENTRY(268),
            REG_ENTRY(269),
            REG_ENTRY(270),
            REG_ENTRY(271),
            REG_ENTRY(272),
            REG_ENTRY(273),
            REG_ENTRY(274),
            REG_ENTRY(275),
            REG_ENTRY(276),
            REG_ENTRY(277),
            REG_ENTRY(278),
            REG_ENTRY(279),
            REG_ENTRY(280),
            REG_ENTRY(281),
            REG_ENTRY(282),
            REG_ENTRY(283),
            REG_ENTRY(284),
            REG_ENTRY(285),
            REG_ENTRY(286),
            REG_ENTRY(287),
            REG_ENTRY(288),
            REG_ENTRY(289),
            REG_ENTRY(290),
            REG_ENTRY(291),
            REG_ENTRY(292),
            REG_ENTRY(293),
            REG_ENTRY(294),
            REG_ENTRY(295),
            REG_ENTRY(296),
            REG_ENTRY(297),
            REG_ENTRY(298),
            REG_ENTRY(299),
            REG_ENTRY(300),
            REG_ENTRY(301),
            REG_ENTRY(302),
            REG_ENTRY(303),
            REG_ENTRY(304),
            REG_ENTRY(305),
            REG_ENTRY(306),
            REG_ENTRY(307),
            REG_ENTRY(308),
            REG_ENTRY(309),
            REG_ENTRY(310),
            REG_ENTRY(311),
            REG_ENTRY(312),
            REG_ENTRY(313),
            REG_ENTRY(314),
            REG_ENTRY(315),
            REG_ENTRY(316),
            REG_ENTRY(317),
            REG_ENTRY(318),
            REG_ENTRY(319),
            REG_ENTRY(320),
            REG_ENTRY(321),
            REG_ENTRY(322),
            REG_ENTRY(323),
            REG_ENTRY(324),
            REG_ENTRY(325),
            REG_ENTRY(326),
            REG_ENTRY(327),
            REG_ENTRY(328),
            REG_ENTRY(329),
            REG_ENTRY(330),
            REG_ENTRY(331),
            REG_ENTRY(332),
            REG_ENTRY(333),
            REG_ENTRY(334),
            REG_ENTRY(335),
            REG_ENTRY(336),
            REG_ENTRY(337),
            REG_ENTRY(338),
            REG_ENTRY(339),
            REG_ENTRY(340),
            REG_ENTRY(341),
            REG_ENTRY(342),
            REG_ENTRY(343),
            REG_ENTRY(344),
            REG_ENTRY(345),
            REG_ENTRY(346),
            REG_ENTRY(347),
            REG_ENTRY(348),
            REG_ENTRY(349),
            REG_ENTRY(350),
            REG_ENTRY(351),
            REG_ENTRY(352),
            REG_ENTRY(353),
            REG_ENTRY(354),
            REG_ENTRY(355),
            REG_ENTRY(356),
            REG_ENTRY(357),
            REG_ENTRY(358),
            REG_ENTRY(359),
            REG_ENTRY(360),
            REG_ENTRY(361),
            REG_ENTRY(362),
            REG_ENTRY(363),
            REG_ENTRY(364),
            REG_ENTRY(365),
            REG_ENTRY(366),
            REG_ENTRY(367),
            REG_ENTRY(368),
            REG_ENTRY(369),
            REG_ENTRY(370),
            REG_ENTRY(371),
            REG_ENTRY(372),
            REG_ENTRY(373),
            REG_ENTRY(374),
            REG_ENTRY(375),
            REG_ENTRY(376),
            REG_ENTRY(377),
            REG_ENTRY(378),
            REG_ENTRY(379),
            REG_ENTRY(380),
            REG_ENTRY(381),
            REG_ENTRY(382),
            REG_ENTRY(383),
            REG_ENTRY(384),
            REG_ENTRY(385),
            REG_ENTRY(386),
            REG_ENTRY(387),
            REG_ENTRY(388),
            REG_ENTRY(389),
            REG_ENTRY(390),
            REG_ENTRY(391),
            REG_ENTRY(392),
            REG_ENTRY(393),
            REG_ENTRY(394),
            REG_ENTRY(395),
            REG_ENTRY(396),
            REG_ENTRY(397),
            REG_ENTRY(398),
            REG_ENTRY(399),
            REG_ENTRY(400),
            REG_ENTRY(401),
            REG_ENTRY(402),
            REG_ENTRY(403),
            REG_ENTRY(404),
            REG_ENTRY(405),
            REG_ENTRY(406),
            REG_ENTRY(407),
            REG_ENTRY(408),
            REG_ENTRY(409),
            REG_ENTRY(410),
            REG_ENTRY(411),
            REG_ENTRY(412),
            REG_ENTRY(413),
            REG_ENTRY(414),
            REG_ENTRY(415),
            REG_ENTRY(416),
            REG_ENTRY(417),
            REG_ENTRY(418),
            REG_ENTRY(419),
            REG_ENTRY(420),
            REG_ENTRY(421),
            REG_ENTRY(422),
            REG_ENTRY(423),
            REG_ENTRY(424),
            REG_ENTRY(425),
            REG_ENTRY(426),
            REG_ENTRY(427),
            REG_ENTRY(428),
            REG_ENTRY(429),
            REG_ENTRY(430),
            REG_ENTRY(431),
            REG_ENTRY(432),
            REG_ENTRY(433),
            REG_ENTRY(434),
            REG_ENTRY(435),
            REG_ENTRY(436),
            REG_ENTRY(437),
            REG_ENTRY(438),
            REG_ENTRY(439),
            REG_ENTRY(440),
            REG_ENTRY(441),
            REG_ENTRY(442),
            REG_ENTRY(443),
            REG_ENTRY(444),
            REG_ENTRY(445),
            REG_ENTRY(446),
            REG_ENTRY(447),
            REG_ENTRY(448),
            REG_ENTRY(449),
            REG_ENTRY(450),
            REG_ENTRY(451),
            REG_ENTRY(452),
            REG_ENTRY(453),
            REG_ENTRY(454),
            REG_ENTRY(455),
            REG_ENTRY(456),
            REG_ENTRY(457),
            REG_ENTRY(458),
            REG_ENTRY(459),
            REG_ENTRY(460),
            REG_ENTRY(461),
            REG_ENTRY(462),
            REG_ENTRY(463),
            REG_ENTRY(464),
            REG_ENTRY(465),
            REG_ENTRY(466),
            REG_ENTRY(467),
            REG_ENTRY(468),
            REG_ENTRY(469),
            REG_ENTRY(470),
            REG_ENTRY(471),
            REG_ENTRY(472),
            REG_ENTRY(473),
            REG_ENTRY(474),
            REG_ENTRY(475),
            REG_ENTRY(476),
            REG_ENTRY(477),
            REG_ENTRY(478),
            REG_ENTRY(479),
            REG_ENTRY(480),
            REG_ENTRY(481),
            REG_ENTRY(482),
            REG_ENTRY(483),
            REG_ENTRY(484),
            REG_ENTRY(485),
            REG_ENTRY(486),
            REG_ENTRY(487),
            REG_ENTRY(488),
            REG_ENTRY(489),
            REG_ENTRY(490),
            REG_ENTRY(491),
            REG_ENTRY(492),
            REG_ENTRY(493),
            REG_ENTRY(494),
            REG_ENTRY(495),
            REG_ENTRY(496),
            REG_ENTRY(497),
            REG_ENTRY(498),
            REG_ENTRY(499),
            REG_ENTRY(500),
            REG_ENTRY(501),
            REG_ENTRY(502),
            REG_ENTRY(503),
            REG_ENTRY(504),
            REG_ENTRY(505),
            REG_ENTRY(506),
            REG_ENTRY(507),
            REG_ENTRY(508),
            REG_ENTRY(509),
            REG_ENTRY(510),
            REG_ENTRY(511),
            REG_ENTRY(512),
            REG_ENTRY(513),
            REG_ENTRY(514),
            REG_ENTRY(515),
            REG_ENTRY(516),
            REG_ENTRY(517),
            REG_ENTRY(518),
            REG_ENTRY(519),
            REG_ENTRY(520),
            REG_ENTRY(521),
            REG_ENTRY(522),
            REG_ENTRY(523),
            REG_ENTRY(524),
            REG_ENTRY(525),
            REG_ENTRY(526),
            REG_ENTRY(527),
            REG_ENTRY(528),
            REG_ENTRY(529),
            REG_ENTRY(530),
            REG_ENTRY(531),
            REG_ENTRY(532),
            REG_ENTRY(533),
            REG_ENTRY(534),
            REG_ENTRY(535),
            REG_ENTRY(536),
            REG_ENTRY(537),
            REG_ENTRY(538),
            REG_ENTRY(539),
            REG_ENTRY(540),
            REG_ENTRY(541),
            REG_ENTRY(542),
            REG_ENTRY(543),
            REG_ENTRY(544),
            REG_ENTRY(545),
            REG_ENTRY(546),
            REG_ENTRY(547),
            REG_ENTRY(548),
            REG_ENTRY(549),
            REG_ENTRY(550),
            REG_ENTRY(551),
            REG_ENTRY(552),
            REG_ENTRY(553),
            REG_ENTRY(554),
            REG_ENTRY(555),
            REG_ENTRY(556),
            REG_ENTRY(557),
            REG_ENTRY(558),
            REG_ENTRY(559),
            REG_ENTRY(560),
            REG_ENTRY(561),
            REG_ENTRY(562),
            REG_ENTRY(563),
            REG_ENTRY(564),
            REG_ENTRY(565),
            REG_ENTRY(566),
            REG_ENTRY(567),
            REG_ENTRY(568),
            REG_ENTRY(569),
            REG_ENTRY(570),
            REG_ENTRY(571),
            REG_ENTRY(572),
            REG_ENTRY(573),
            REG_ENTRY(574),
            REG_ENTRY(575),
            REG_ENTRY(576),
            REG_ENTRY(577),
            REG_ENTRY(578),
            REG_ENTRY(579),
            REG_ENTRY(580),
            REG_ENTRY(581),
            REG_ENTRY(582),
            REG_ENTRY(583),
            REG_ENTRY(584),
            REG_ENTRY(585),
            REG_ENTRY(586),
            REG_ENTRY(587),
            REG_ENTRY(588),
            REG_ENTRY(589),
            REG_ENTRY(590),
            REG_ENTRY(591),
            REG_ENTRY(592),
            REG_ENTRY(593),
            REG_ENTRY(594),
            REG_ENTRY(595),
            REG_ENTRY(596),
            REG_ENTRY(597),
            REG_ENTRY(598),
            REG_ENTRY(599),
            REG_ENTRY(600),
            REG_ENTRY(601),
            REG_ENTRY(602),
            REG_ENTRY(603),
            REG_ENTRY(604),
            REG_ENTRY(605),
            REG_ENTRY(606),
            REG_ENTRY(607),
            REG_ENTRY(608),
            REG_ENTRY(609),
            REG_ENTRY(610),
            REG_ENTRY(611),
            REG_ENTRY(612),
            REG_ENTRY(613),
            REG_ENTRY(614),
            REG_ENTRY(615),
            REG_ENTRY(616),
            REG_ENTRY(617),
            REG_ENTRY(618),
            REG_ENTRY(619),
            REG_ENTRY(620),
            REG_ENTRY(621),
            REG_ENTRY(622),
            REG_ENTRY(623),
            REG_ENTRY(624),
            REG_ENTRY(625),
            REG_ENTRY(626),
            REG_ENTRY(627),
            REG_ENTRY(628),
            REG_ENTRY(629),
            REG_ENTRY(630),
            REG_ENTRY(631),
            REG_ENTRY(632),
            REG_ENTRY(633),
            REG_ENTRY(634),
            REG_ENTRY(635),
            REG_ENTRY(636),
            REG_ENTRY(637),
            REG_ENTRY(638),
            REG_ENTRY(639),
            REG_ENTRY(640),
            REG_ENTRY(641),
            REG_ENTRY(642),
            REG_ENTRY(643),
            REG_ENTRY(644),
            REG_ENTRY(645),
            REG_ENTRY(646),
            REG_ENTRY(647),
            REG_ENTRY(648),
            REG_ENTRY(649),
            REG_ENTRY(650),
            REG_ENTRY(651),
            REG_ENTRY(652),
            REG_ENTRY(653),
            REG_ENTRY(654),
            REG_ENTRY(655),
            REG_ENTRY(656),
            REG_ENTRY(657),
            REG_ENTRY(658),
            REG_ENTRY(659),
            REG_ENTRY(660),
            REG_ENTRY(661),
            REG_ENTRY(662),
            REG_ENTRY(663),
            REG_ENTRY(664),
            REG_ENTRY(665),
            REG_ENTRY(666),
            REG_ENTRY(667),
            REG_ENTRY(668),
            REG_ENTRY(669),
            REG_ENTRY(670),
            REG_ENTRY(671),
            REG_ENTRY(672),
            REG_ENTRY(673),
            REG_ENTRY(674),
            REG_ENTRY(675),
            REG_ENTRY(676),
            REG_ENTRY(677),
            REG_ENTRY(678),
            REG_ENTRY(679),
            REG_ENTRY(680),
            REG_ENTRY(681),
            REG_ENTRY(682),
            REG_ENTRY(683),
            REG_ENTRY(684),
            REG_ENTRY(685),
            REG_ENTRY(686),
            REG_ENTRY(687),
            REG_ENTRY(688),
            REG_ENTRY(689),
            REG_ENTRY(690),
            REG_ENTRY(691),
            REG_ENTRY(692),
            REG_ENTRY(693),
            REG_ENTRY(694),
            REG_ENTRY(695),
            REG_ENTRY(696),
            REG_ENTRY(697),
            REG_ENTRY(698),
            REG_ENTRY(699),
            REG_ENTRY(700),
            REG_ENTRY(701),
            REG_ENTRY(702),
            REG_ENTRY(703),
            REG_ENTRY(704),
            REG_ENTRY(705),
            REG_ENTRY(706),
            REG_ENTRY(707),
            REG_ENTRY(708),
            REG_ENTRY(709),
            REG_ENTRY(710),
            REG_ENTRY(711),
            REG_ENTRY(712),
            REG_ENTRY(713),
            REG_ENTRY(714),
            REG_ENTRY(715),
            REG_ENTRY(716),
            REG_ENTRY(717),
            REG_ENTRY(718),
            REG_ENTRY(719),
            REG_ENTRY(720),
            REG_ENTRY(721),
            REG_ENTRY(722),
            REG_ENTRY(723),
            REG_ENTRY(724),
            REG_ENTRY(725),
            REG_ENTRY(726),
            REG_ENTRY(727),
            REG_ENTRY(728),
            REG_ENTRY(729),
            REG_ENTRY(730),
            REG_ENTRY(731),
            REG_ENTRY(732),
            REG_ENTRY(733),
            REG_ENTRY(734),
            REG_ENTRY(735),
            REG_ENTRY(736),
            REG_ENTRY(737),
            REG_ENTRY(738),
            REG_ENTRY(739),
            REG_ENTRY(740),
            REG_ENTRY(741),
            REG_ENTRY(742),
            REG_ENTRY(743),
            REG_ENTRY(744),
            REG_ENTRY(745),
            REG_ENTRY(746),
            REG_ENTRY(747),
            REG_ENTRY(748),
            REG_ENTRY(749),
            REG_ENTRY(750),
            REG_ENTRY(751),
            REG_ENTRY(752),
            REG_ENTRY(753),
            REG_ENTRY(754),
            REG_ENTRY(755),
            REG_ENTRY(756),
            REG_ENTRY(757),
            REG_ENTRY(758),
            REG_ENTRY(759),
            REG_ENTRY(760),
            REG_ENTRY(761),
            REG_ENTRY(762),
            REG_ENTRY(763),
            REG_ENTRY(764),
            REG_ENTRY(765),
            REG_ENTRY(766),
            REG_ENTRY(767),
            REG_ENTRY(768),
            REG_ENTRY(769),
            REG_ENTRY(770),
            REG_ENTRY(771),
            REG_ENTRY(772),
            REG_ENTRY(773),
            REG_ENTRY(774),
            REG_ENTRY(775),
            REG_ENTRY(776),
            REG_ENTRY(777),
            REG_ENTRY(778),
            REG_ENTRY(779),
            REG_ENTRY(780),
            REG_ENTRY(781),
            REG_ENTRY(782),
            REG_ENTRY(783),
            REG_ENTRY(784),
            REG_ENTRY(785),
            REG_ENTRY(786),
            REG_ENTRY(787),
            REG_ENTRY(788),
            REG_ENTRY(789),
            REG_ENTRY(790),
            REG_ENTRY(791),
            REG_ENTRY(792),
            REG_ENTRY(793),
            REG_ENTRY(794),
            REG_ENTRY(795),
            REG_ENTRY(796),
            REG_ENTRY(797),
            REG_ENTRY(798),
            REG_ENTRY(799),
            REG_ENTRY(800),
            REG_ENTRY(801),
            REG_ENTRY(802),
            REG_ENTRY(803),
            REG_ENTRY(804),
            REG_ENTRY(805),
            REG_ENTRY(806),
            REG_ENTRY(807),
            REG_ENTRY(808),
            REG_ENTRY(809),
            REG_ENTRY(810),
            REG_ENTRY(811),
            REG_ENTRY(812),
            REG_ENTRY(813),
            REG_ENTRY(814),
            REG_ENTRY(815),
            REG_ENTRY(816),
            REG_ENTRY(817),
            REG_ENTRY(818),
            REG_ENTRY(819),
            REG_ENTRY(820),
            REG_ENTRY(821),
            REG_ENTRY(822),
            REG_ENTRY(823),
            REG_ENTRY(824),
            REG_ENTRY(825),
            REG_ENTRY(826),
            REG_ENTRY(827),
            REG_ENTRY(828),
            REG_ENTRY(829),
            REG_ENTRY(830),
            REG_ENTRY(831),
            REG_ENTRY(832),
            REG_ENTRY(833),
            REG_ENTRY(834),
            REG_ENTRY(835),
            REG_ENTRY(836),
            REG_ENTRY(837),
            REG_ENTRY(838),
            REG_ENTRY(839),
            REG_ENTRY(840),
            REG_ENTRY(841),
            REG_ENTRY(842),
            REG_ENTRY(843),
            REG_ENTRY(844),
            REG_ENTRY(845),
            REG_ENTRY(846),
            REG_ENTRY(847),
            REG_ENTRY(848),
            REG_ENTRY(849),
            REG_ENTRY(850),
            REG_ENTRY(851),
            REG_ENTRY(852),
            REG_ENTRY(853),
            REG_ENTRY(854),
            REG_ENTRY(855),
            REG_ENTRY(856),
            REG_ENTRY(857),
            REG_ENTRY(858),
            REG_ENTRY(859),
            REG_ENTRY(860),
            REG_ENTRY(861),
            REG_ENTRY(862),
            REG_ENTRY(863),
            REG_ENTRY(864),
            REG_ENTRY(865),
            REG_ENTRY(866),
            REG_ENTRY(867),
            REG_ENTRY(868),
            REG_ENTRY(869),
            REG_ENTRY(870),
            REG_ENTRY(871),
            REG_ENTRY(872),
            REG_ENTRY(873),
            REG_ENTRY(874),
            REG_ENTRY(875),
            REG_ENTRY(876),
            REG_ENTRY(877),
            REG_ENTRY(878),
            REG_ENTRY(879),
            REG_ENTRY(880),
            REG_ENTRY(881),
            REG_ENTRY(882),
            REG_ENTRY(883),
            REG_ENTRY(884),
            REG_ENTRY(885),
            REG_ENTRY(886),
            REG_ENTRY(887),
            REG_ENTRY(888),
            REG_ENTRY(889),
            REG_ENTRY(890),
            REG_ENTRY(891),
            REG_ENTRY(892),
            REG_ENTRY(893),
            REG_ENTRY(894),
            REG_ENTRY(895),
            REG_ENTRY(896),
            REG_ENTRY(897),
            REG_ENTRY(898),
            REG_ENTRY(899),
            REG_ENTRY(900),
            REG_ENTRY(901),
            REG_ENTRY(902),
            REG_ENTRY(903),
            REG_ENTRY(904),
            REG_ENTRY(905),
            REG_ENTRY(906),
            REG_ENTRY(907),
            REG_ENTRY(908),
            REG_ENTRY(909),
            REG_ENTRY(910),
            REG_ENTRY(911),
            REG_ENTRY(912),
            REG_ENTRY(913),
            REG_ENTRY(914),
            REG_ENTRY(915),
            REG_ENTRY(916),
            REG_ENTRY(917),
            REG_ENTRY(918),
            REG_ENTRY(919),
            REG_ENTRY(920),
            REG_ENTRY(921),
            REG_ENTRY(922),
            REG_ENTRY(923),
            REG_ENTRY(924),
            REG_ENTRY(925),
            REG_ENTRY(926),
            REG_ENTRY(927),
            REG_ENTRY(928),
            REG_ENTRY(929),
            REG_ENTRY(930),
            REG_ENTRY(931),
            REG_ENTRY(932),
            REG_ENTRY(933),
            REG_ENTRY(934),
            REG_ENTRY(935),
            REG_ENTRY(936),
            REG_ENTRY(937),
            REG_ENTRY(938),
            REG_ENTRY(939),
            REG_ENTRY(940),
            REG_ENTRY(941),
            REG_ENTRY(942),
            REG_ENTRY(943),
            REG_ENTRY(944),
            REG_ENTRY(945),
            REG_ENTRY(946),
            REG_ENTRY(947),
            REG_ENTRY(948),
            REG_ENTRY(949),
            REG_ENTRY(950),
            REG_ENTRY(951),
            REG_ENTRY(952),
            REG_ENTRY(953),
            REG_ENTRY(954),
            REG_ENTRY(955),
            REG_ENTRY(956),
            REG_ENTRY(957),
            REG_ENTRY(958),
            REG_ENTRY(959),
            REG_ENTRY(960),
            REG_ENTRY(961),
            REG_ENTRY(962),
            REG_ENTRY(963),
            REG_ENTRY(964),
            REG_ENTRY(965),
            REG_ENTRY(966),
            REG_ENTRY(967),
            REG_ENTRY(968),
            REG_ENTRY(969),
            REG_ENTRY(970),
            REG_ENTRY(971),
            REG_ENTRY(972),
            REG_ENTRY(973),
            REG_ENTRY(974),
            REG_ENTRY(975),
            REG_ENTRY(976),
            REG_ENTRY(977),
            REG_ENTRY(978),
            REG_ENTRY(979),
            REG_ENTRY(980),
            REG_ENTRY(981),
            REG_ENTRY(982),
            REG_ENTRY(983),
            REG_ENTRY(984),
            REG_ENTRY(985),
            REG_ENTRY(986),
            REG_ENTRY(987),
            REG_ENTRY(988),
            REG_ENTRY(989),
            REG_ENTRY(990),
            REG_ENTRY(991),
            REG_ENTRY(992),
            REG_ENTRY(993),
            REG_ENTRY(994),
            REG_ENTRY(995),
            REG_ENTRY(996),
            REG_ENTRY(997),
            REG_ENTRY(998),
            REG_ENTRY(999),
            REG_ENTRY(1000),
            REG_ENTRY(1001),
            REG_ENTRY(1002),
            REG_ENTRY(1003),
            REG_ENTRY(1004),
            REG_ENTRY(1005),
            REG_ENTRY(1006),
            REG_ENTRY(1007),
            REG_ENTRY(1008),
            REG_ENTRY(1009),
            REG_ENTRY(1010),
            REG_ENTRY(1011),
            REG_ENTRY(1012),
            REG_ENTRY(1013),
            REG_ENTRY(1014),
            REG_ENTRY(1015),
            REG_ENTRY(1016),
            REG_ENTRY(1017),
            REG_ENTRY(1018),
            REG_ENTRY(1019),
            REG_ENTRY(1020),
            REG_ENTRY(1021),
            REG_ENTRY(1022),
            REG_ENTRY(1023),
            REG_ENTRY(1024),
            REG_ENTRY(1025),
            REG_ENTRY(1026),
            REG_ENTRY(1027),
            REG_ENTRY(1028),
            REG_ENTRY(1029),
            REG_ENTRY(1030),
            REG_ENTRY(1031),
            REG_ENTRY(1032),
            REG_ENTRY(1033),
            REG_ENTRY(1034),
            REG_ENTRY(1035),
            REG_ENTRY(1036),
            REG_ENTRY(1037),
            REG_ENTRY(1038),
            REG_ENTRY(1039),
            REG_ENTRY(1040),
            REG_ENTRY(1041),
            REG_ENTRY(1042),
            REG_ENTRY(1043),
            REG_ENTRY(1044),
            REG_ENTRY(1045),
            REG_ENTRY(1046),
            REG_ENTRY(1047),
            REG_ENTRY(1048),
            REG_ENTRY(1049),
            REG_ENTRY(1050),
            REG_ENTRY(1051),
            REG_ENTRY(1052),
            REG_ENTRY(1053),
            REG_ENTRY(1054),
            REG_ENTRY(1055),
            REG_ENTRY(1056),
            REG_ENTRY(1057),
            REG_ENTRY(1058),
            REG_ENTRY(1059),
            REG_ENTRY(1060),
            REG_ENTRY(1061),
            REG_ENTRY(1062),
            REG_ENTRY(1063),
            REG_ENTRY(1064),
            REG_ENTRY(1065),
            REG_ENTRY(1066),
            REG_ENTRY(1067),
            REG_ENTRY(1068),
            REG_ENTRY(1069),
            REG_ENTRY(1070),
            REG_ENTRY(1071),
            REG_ENTRY(1072),
            REG_ENTRY(1073),
            REG_ENTRY(1074),
            REG_ENTRY(1075),
            REG_ENTRY(1076),
            REG_ENTRY(1077),
            REG_ENTRY(1078),
            REG_ENTRY(1079),
            REG_ENTRY(1080),
            REG_ENTRY(1081),
            REG_ENTRY(1082),
            REG_ENTRY(1083),
            REG_ENTRY(1084),
            REG_ENTRY(1085),
            REG_ENTRY(1086),
            REG_ENTRY(1087),
            REG_ENTRY(1088),
            REG_ENTRY(1089),
            REG_ENTRY(1090),
            REG_ENTRY(1091),
            REG_ENTRY(1092),
            REG_ENTRY(1093),
            REG_ENTRY(1094),
            REG_ENTRY(1095),
            REG_ENTRY(1096),
            REG_ENTRY(1097),
            REG_ENTRY(1098),
            REG_ENTRY(1099),
            REG_ENTRY(1100),
            REG_ENTRY(1101),
            REG_ENTRY(1102),
            REG_ENTRY(1103),
            REG_ENTRY(1104),
            REG_ENTRY(1105),
            REG_ENTRY(1106),
            REG_ENTRY(1107),
            REG_ENTRY(1108),
            REG_ENTRY(1109),
            REG_ENTRY(1110),
            REG_ENTRY(1111),
            REG_ENTRY(1112),
            REG_ENTRY(1113),
            REG_ENTRY(1114),
            REG_ENTRY(1115),
            REG_ENTRY(1116),
            REG_ENTRY(1117),
            REG_ENTRY(1118),
            REG_ENTRY(1119),
            REG_ENTRY(1120),
            REG_ENTRY(1121),
            REG_ENTRY(1122),
            REG_ENTRY(1123),
            REG_ENTRY(1124),
            REG_ENTRY(1125),
            REG_ENTRY(1126),
            REG_ENTRY(1127),
            REG_ENTRY(1128),
            REG_ENTRY(1129),
            REG_ENTRY(1130),
            REG_ENTRY(1131),
            REG_ENTRY(1132),
            REG_ENTRY(1133),
            REG_ENTRY(1134),
            REG_ENTRY(1135),
            REG_ENTRY(1136),
            REG_ENTRY(1137),
            REG_ENTRY(1138),
            REG_ENTRY(1139),
            REG_ENTRY(1140),
            REG_ENTRY(1141),
            REG_ENTRY(1142),
            REG_ENTRY(1143),
            REG_ENTRY(1144),
            REG_ENTRY(1145),
            REG_ENTRY(1146),
            REG_ENTRY(1147),
            REG_ENTRY(1148),
            REG_ENTRY(1149),
            REG_ENTRY(1150),
            REG_ENTRY(1151),
            REG_ENTRY(1152),
            REG_ENTRY(1153),
            REG_ENTRY(1154),
            REG_ENTRY(1155),
            REG_ENTRY(1156),
            REG_ENTRY(1157),
            REG_ENTRY(1158),
            REG_ENTRY(1159),
            REG_ENTRY(1160),
            REG_ENTRY(1161),
            REG_ENTRY(1162),
            REG_ENTRY(1163),
            REG_ENTRY(1164),
            REG_ENTRY(1165),
            REG_ENTRY(1166),
            REG_ENTRY(1167),
            REG_ENTRY(1168),
            REG_ENTRY(1169),
            REG_ENTRY(1170),
            REG_ENTRY(1171),
            REG_ENTRY(1172),
            REG_ENTRY(1173),
            REG_ENTRY(1174),
            REG_ENTRY(1175),
            REG_ENTRY(1176),
            REG_ENTRY(1177),
            REG_ENTRY(1178),
            REG_ENTRY(1179),
            REG_ENTRY(1180),
            REG_ENTRY(1181),
            REG_ENTRY(1182),
            REG_ENTRY(1183),
            REG_ENTRY(1184),
            REG_ENTRY(1185),
            REG_ENTRY(1186),
            REG_ENTRY(1187),
            REG_ENTRY(1188),
            REG_ENTRY(1189),
            REG_ENTRY(1190),
            REG_ENTRY(1191),
            REG_ENTRY(1192),
            REG_ENTRY(1193),
            REG_ENTRY(1194),
            REG_ENTRY(1195),
            REG_ENTRY(1196),
            REG_ENTRY(1197),
            REG_ENTRY(1198),
            REG_ENTRY(1199),
            REG_ENTRY(1200),
            REG_ENTRY(1201),
            REG_ENTRY(1202),
            REG_ENTRY(1203),
            REG_ENTRY(1204),
            REG_ENTRY(1205),
            REG_ENTRY(1206),
            REG_ENTRY(1207),
            REG_ENTRY(1208),
            REG_ENTRY(1209),
            REG_ENTRY(1210),
            REG_ENTRY(1211),
            REG_ENTRY(1212),
            REG_ENTRY(1213),
            REG_ENTRY(1214),
            REG_ENTRY(1215),
            REG_ENTRY(1216),
            REG_ENTRY(1217),
            REG_ENTRY(1218),
            REG_ENTRY(1219),
            REG_ENTRY(1220),
            REG_ENTRY(1221),
            REG_ENTRY(1222),
            REG_ENTRY(1223),
            REG_ENTRY(1224),
            REG_ENTRY(1225),
            REG_ENTRY(1226),
            REG_ENTRY(1227),
            REG_ENTRY(1228),
            REG_ENTRY(1229),
            REG_ENTRY(1230),
            REG_ENTRY(1231),
            REG_ENTRY(1232),
            REG_ENTRY(1233),
            REG_ENTRY(1234),
            REG_ENTRY(1235),
            REG_ENTRY(1236),
            REG_ENTRY(1237),
            REG_ENTRY(1238),
            REG_ENTRY(1239),
            REG_ENTRY(1240),
            REG_ENTRY(1241),
            REG_ENTRY(1242),
            REG_ENTRY(1243),
            REG_ENTRY(1244),
            REG_ENTRY(1245),
            REG_ENTRY(1246),
            REG_ENTRY(1247),
            REG_ENTRY(1248),
            REG_ENTRY(1249),
            REG_ENTRY(1250),
            REG_ENTRY(1251),
            REG_ENTRY(1252),
            REG_ENTRY(1253),
            REG_ENTRY(1254),
            REG_ENTRY(1255),
            REG_ENTRY(1256),
            REG_ENTRY(1257),
            REG_ENTRY(1258),
            REG_ENTRY(1259),
            REG_ENTRY(1260),
            REG_ENTRY(1261),
            REG_ENTRY(1262),
            REG_ENTRY(1263),
            REG_ENTRY(1264),
            REG_ENTRY(1265),
            REG_ENTRY(1266),
            REG_ENTRY(1267),
            REG_ENTRY(1268),
            REG_ENTRY(1269),
            REG_ENTRY(1270),
            REG_ENTRY(1271),
            REG_ENTRY(1272),
            REG_ENTRY(1273),
            REG_ENTRY(1274),
            REG_ENTRY(1275),
            REG_ENTRY(1276),
            REG_ENTRY(1277),
            REG_ENTRY(1278),
            REG_ENTRY(1279),
            REG_ENTRY(1280),
            REG_ENTRY(1281),
            REG_ENTRY(1282),
            REG_ENTRY(1283),
            REG_ENTRY(1284),
            REG_ENTRY(1285),
            REG_ENTRY(1286),
            REG_ENTRY(1287),
            REG_ENTRY(1288),
            REG_ENTRY(1289),
            REG_ENTRY(1290),
            REG_ENTRY(1291),
            REG_ENTRY(1292),
            REG_ENTRY(1293),
            REG_ENTRY(1294),
            REG_ENTRY(1295),
            REG_ENTRY(1296),
            REG_ENTRY(1297),
            REG_ENTRY(1298),
            REG_ENTRY(1299),
            REG_ENTRY(1300),
            REG_ENTRY(1301),
            REG_ENTRY(1302),
            REG_ENTRY(1303),
            REG_ENTRY(1304),
            REG_ENTRY(1305),
            REG_ENTRY(1306),
            REG_ENTRY(1307),
            REG_ENTRY(1308),
            REG_ENTRY(1309),
            REG_ENTRY(1310),
            REG_ENTRY(1311),
            REG_ENTRY(1312),
            REG_ENTRY(1313),
            REG_ENTRY(1314),
            REG_ENTRY(1315),
            REG_ENTRY(1316),
            REG_ENTRY(1317),
            REG_ENTRY(1318),
            REG_ENTRY(1319),
            REG_ENTRY(1320),
            REG_ENTRY(1321),
            REG_ENTRY(1322),
            REG_ENTRY(1323),
            REG_ENTRY(1324),
            REG_ENTRY(1325),
            REG_ENTRY(1326),
            REG_ENTRY(1327),
            REG_ENTRY(1328),
            REG_ENTRY(1329),
            REG_ENTRY(1330),
            REG_ENTRY(1331),
            REG_ENTRY(1332),
            REG_ENTRY(1333),
            REG_ENTRY(1334),
            REG_ENTRY(1335),
            REG_ENTRY(1336),
            REG_ENTRY(1337),
            REG_ENTRY(1338),
            REG_ENTRY(1339),
            REG_ENTRY(1340),
            REG_ENTRY(1341),
            REG_ENTRY(1342),
            REG_ENTRY(1343),
            REG_ENTRY(1344),
            REG_ENTRY(1345),
            REG_ENTRY(1346),
            REG_ENTRY(1347),
            REG_ENTRY(1348),
            REG_ENTRY(1349),
            REG_ENTRY(1350),
            REG_ENTRY(1351),
            REG_ENTRY(1352),
            REG_ENTRY(1353),
            REG_ENTRY(1354),
            REG_ENTRY(1355),
            REG_ENTRY(1356),
            REG_ENTRY(1357),
            REG_ENTRY(1358),
            REG_ENTRY(1359),
            REG_ENTRY(1360),
            REG_ENTRY(1361),
            REG_ENTRY(1362),
            REG_ENTRY(1363),
            REG_ENTRY(1364),
            REG_ENTRY(1365),
            REG_ENTRY(1366),
            REG_ENTRY(1367),
            REG_ENTRY(1368),
            REG_ENTRY(1369),
            REG_ENTRY(1370),
            REG_ENTRY(1371),
            REG_ENTRY(1372),
            REG_ENTRY(1373),
            REG_ENTRY(1374),
            REG_ENTRY(1375),
            REG_ENTRY(1376),
            REG_ENTRY(1377),
            REG_ENTRY(1378),
            REG_ENTRY(1379),
            REG_ENTRY(1380),
            REG_ENTRY(1381),
            REG_ENTRY(1382),
            REG_ENTRY(1383),
            REG_ENTRY(1384),
            REG_ENTRY(1385),
            REG_ENTRY(1386),
            REG_ENTRY(1387),
            REG_ENTRY(1388),
            REG_ENTRY(1389),
            REG_ENTRY(1390),
            REG_ENTRY(1391),
            REG_ENTRY(1392),
            REG_ENTRY(1393),
            REG_ENTRY(1394),
            REG_ENTRY(1395),
            REG_ENTRY(1396),
            REG_ENTRY(1397),
            REG_ENTRY(1398),
            REG_ENTRY(1399),
            REG_ENTRY(1400),
            REG_ENTRY(1401),
            REG_ENTRY(1402),
            REG_ENTRY(1403),
            REG_ENTRY(1404),
            REG_ENTRY(1405),
            REG_ENTRY(1406),
            REG_ENTRY(1407),
            REG_ENTRY(1408),
            REG_ENTRY(1409),
            REG_ENTRY(1410),
            REG_ENTRY(1411),
            REG_ENTRY(1412),
            REG_ENTRY(1413),
            REG_ENTRY(1414),
            REG_ENTRY(1415),
            REG_ENTRY(1416),
            REG_ENTRY(1417),
            REG_ENTRY(1418),
            REG_ENTRY(1419),
            REG_ENTRY(1420),
            REG_ENTRY(1421),
            REG_ENTRY(1422),
            REG_ENTRY(1423),
            REG_ENTRY(1424),
            REG_ENTRY(1425),
            REG_ENTRY(1426),
            REG_ENTRY(1427),
            REG_ENTRY(1428),
            REG_ENTRY(1429),
            REG_ENTRY(1430),
            REG_ENTRY(1431),
            REG_ENTRY(1432),
            REG_ENTRY(1433),
            REG_ENTRY(1434),
            REG_ENTRY(1435),
            REG_ENTRY(1436),
            REG_ENTRY(1437),
            REG_ENTRY(1438),
            REG_ENTRY(1439),
            REG_ENTRY(1440),
            REG_ENTRY(1441),
            REG_ENTRY(1442),
            REG_ENTRY(1443),
            REG_ENTRY(1444),
            REG_ENTRY(1445),
            REG_ENTRY(1446),
            REG_ENTRY(1447),
            REG_ENTRY(1448),
            REG_ENTRY(1449),
            REG_ENTRY(1450),
            REG_ENTRY(1451),
            REG_ENTRY(1452),
            REG_ENTRY(1453),
            REG_ENTRY(1454),
            REG_ENTRY(1455),
            REG_ENTRY(1456),
            REG_ENTRY(1457),
            REG_ENTRY(1458),
            REG_ENTRY(1459),
            REG_ENTRY(1460),
            REG_ENTRY(1461),
            REG_ENTRY(1462),
            REG_ENTRY(1463),
            REG_ENTRY(1464),
            REG_ENTRY(1465),
            REG_ENTRY(1466),
            REG_ENTRY(1467),
            REG_ENTRY(1468),
            REG_ENTRY(1469),
            REG_ENTRY(1470),
            REG_ENTRY(1471),
            REG_ENTRY(1472),
            REG_ENTRY(1473),
            REG_ENTRY(1474),
            REG_ENTRY(1475),
            REG_ENTRY(1476),
            REG_ENTRY(1477),
            REG_ENTRY(1478),
            REG_ENTRY(1479),
            REG_ENTRY(1480),
            REG_ENTRY(1481),
            REG_ENTRY(1482),
            REG_ENTRY(1483),
            REG_ENTRY(1484),
            REG_ENTRY(1485),
            REG_ENTRY(1486),
            REG_ENTRY(1487),
            REG_ENTRY(1488),
            REG_ENTRY(1489),
            REG_ENTRY(1490),
            REG_ENTRY(1491),
            REG_ENTRY(1492),
            REG_ENTRY(1493),
            REG_ENTRY(1494),
            REG_ENTRY(1495),
            REG_ENTRY(1496),
            REG_ENTRY(1497),
            REG_ENTRY(1498),
            REG_ENTRY(1499),
            REG_ENTRY(1500),
            REG_ENTRY(1501),
            REG_ENTRY(1502),
            REG_ENTRY(1503),
            REG_ENTRY(1504),
            REG_ENTRY(1505),
            REG_ENTRY(1506),
            REG_ENTRY(1507),
            REG_ENTRY(1508),
            REG_ENTRY(1509),
            REG_ENTRY(1510),
            REG_ENTRY(1511),
            REG_ENTRY(1512),
            REG_ENTRY(1513),
            REG_ENTRY(1514),
            REG_ENTRY(1515),
            REG_ENTRY(1516),
            REG_ENTRY(1517),
            REG_ENTRY(1518),
            REG_ENTRY(1519),
            REG_ENTRY(1520),
            REG_ENTRY(1521),
            REG_ENTRY(1522),
            REG_ENTRY(1523),
            REG_ENTRY(1524),
            REG_ENTRY(1525),
            REG_ENTRY(1526),
            REG_ENTRY(1527),
            REG_ENTRY(1528),
            REG_ENTRY(1529),
            REG_ENTRY(1530),
            REG_ENTRY(1531),
            REG_ENTRY(1532),
            REG_ENTRY(1533),
            REG_ENTRY(1534),
            REG_ENTRY(1535),
            REG_ENTRY(1536),
            REG_ENTRY(1537),
            REG_ENTRY(1538),
            REG_ENTRY(1539),
            REG_ENTRY(1540),
            REG_ENTRY(1541),
            REG_ENTRY(1542),
            REG_ENTRY(1543),
            REG_ENTRY(1544),
            REG_ENTRY(1545),
            REG_ENTRY(1546),
            REG_ENTRY(1547),
            REG_ENTRY(1548),
            REG_ENTRY(1549),
            REG_ENTRY(1550),
            REG_ENTRY(1551),
            REG_ENTRY(1552),
            REG_ENTRY(1553),
            REG_ENTRY(1554),
            REG_ENTRY(1555),
            REG_ENTRY(1556),
            REG_ENTRY(1557),
            REG_ENTRY(1558),
            REG_ENTRY(1559),
            REG_ENTRY(1560),
            REG_ENTRY(1561),
            REG_ENTRY(1562),
            REG_ENTRY(1563),
            REG_ENTRY(1564),
            REG_ENTRY(1565),
            REG_ENTRY(1566),
            REG_ENTRY(1567),
            REG_ENTRY(1568),
            REG_ENTRY(1569),
            REG_ENTRY(1570),
            REG_ENTRY(1571),
            REG_ENTRY(1572),
            REG_ENTRY(1573),
            REG_ENTRY(1574),
            REG_ENTRY(1575),
            REG_ENTRY(1576),
            REG_ENTRY(1577),
            REG_ENTRY(1578),
            REG_ENTRY(1579),
            REG_ENTRY(1580),
            REG_ENTRY(1581),
            REG_ENTRY(1582),
            REG_ENTRY(1583),
            REG_ENTRY(1584),
            REG_ENTRY(1585),
            REG_ENTRY(1586),
            REG_ENTRY(1587),
            REG_ENTRY(1588),
            REG_ENTRY(1589),
            REG_ENTRY(1590),
            REG_ENTRY(1591),
            REG_ENTRY(1592),
            REG_ENTRY(1593),
            REG_ENTRY(1594),
            REG_ENTRY(1595),
            REG_ENTRY(1596),
            REG_ENTRY(1597),
            REG_ENTRY(1598),
            REG_ENTRY(1599),
            REG_ENTRY(1600),
            REG_ENTRY(1601),
            REG_ENTRY(1602),
            REG_ENTRY(1603),
            REG_ENTRY(1604),
            REG_ENTRY(1605),
            REG_ENTRY(1606),
            REG_ENTRY(1607),
            REG_ENTRY(1608),
            REG_ENTRY(1609),
            REG_ENTRY(1610),
            REG_ENTRY(1611),
            REG_ENTRY(1612),
            REG_ENTRY(1613),
            REG_ENTRY(1614),
            REG_ENTRY(1615),
            REG_ENTRY(1616),
            REG_ENTRY(1617),
            REG_ENTRY(1618),
            REG_ENTRY(1619),
            REG_ENTRY(1620),
            REG_ENTRY(1621),
            REG_ENTRY(1622),
            REG_ENTRY(1623),
            REG_ENTRY(1624),
            REG_ENTRY(1625),
            REG_ENTRY(1626),
            REG_ENTRY(1627),
            REG_ENTRY(1628),
            REG_ENTRY(1629),
            REG_ENTRY(1630),
            REG_ENTRY(1631),
            REG_ENTRY(1632),
            REG_ENTRY(1633),
            REG_ENTRY(1634),
            REG_ENTRY(1635),
            REG_ENTRY(1636),
            REG_ENTRY(1637),
            REG_ENTRY(1638),
            REG_ENTRY(1639),
            REG_ENTRY(1640),
            REG_ENTRY(1641),
            REG_ENTRY(1642),
            REG_ENTRY(1643),
            REG_ENTRY(1644),
            REG_ENTRY(1645),
            REG_ENTRY(1646),
            REG_ENTRY(1647),
            REG_ENTRY(1648),
            REG_ENTRY(1649),
            REG_ENTRY(1650),
            REG_ENTRY(1651),
            REG_ENTRY(1652),
            REG_ENTRY(1653),
            REG_ENTRY(1654),
            REG_ENTRY(1655),
            REG_ENTRY(1656),
            REG_ENTRY(1657),
            REG_ENTRY(1658),
            REG_ENTRY(1659),
            REG_ENTRY(1660),
            REG_ENTRY(1661),
            REG_ENTRY(1662),
            REG_ENTRY(1663),
            REG_ENTRY(1664),
            REG_ENTRY(1665),
            REG_ENTRY(1666),
            REG_ENTRY(1667),
            REG_ENTRY(1668),
            REG_ENTRY(1669),
            REG_ENTRY(1670),
            REG_ENTRY(1671),
            REG_ENTRY(1672),
            REG_ENTRY(1673),
            REG_ENTRY(1674),
            REG_ENTRY(1675),
            REG_ENTRY(1676),
            REG_ENTRY(1677),
            REG_ENTRY(1678),
            REG_ENTRY(1679),
            REG_ENTRY(1680),
            REG_ENTRY(1681),
            REG_ENTRY(1682),
            REG_ENTRY(1683),
            REG_ENTRY(1684),
            REG_ENTRY(1685),
            REG_ENTRY(1686),
            REG_ENTRY(1687),
            REG_ENTRY(1688),
            REG_ENTRY(1689),
            REG_ENTRY(1690),
            REG_ENTRY(1691),
            REG_ENTRY(1692),
            REG_ENTRY(1693),
            REG_ENTRY(1694),
            REG_ENTRY(1695),
            REG_ENTRY(1696),
            REG_ENTRY(1697),
            REG_ENTRY(1698),
            REG_ENTRY(1699),
            REG_ENTRY(1700),
            REG_ENTRY(1701),
            REG_ENTRY(1702),
            REG_ENTRY(1703),
            REG_ENTRY(1704),
            REG_ENTRY(1705),
            REG_ENTRY(1706),
            REG_ENTRY(1707),
            REG_ENTRY(1708),
            REG_ENTRY(1709),
            REG_ENTRY(1710),
            REG_ENTRY(1711),
            REG_ENTRY(1712),
            REG_ENTRY(1713),
            REG_ENTRY(1714),
            REG_ENTRY(1715),
            REG_ENTRY(1716),
            REG_ENTRY(1717),
            REG_ENTRY(1718),
            REG_ENTRY(1719),
            REG_ENTRY(1720),
            REG_ENTRY(1721),
            REG_ENTRY(1722),
            REG_ENTRY(1723),
            REG_ENTRY(1724),
            REG_ENTRY(1725),
            REG_ENTRY(1726),
            REG_ENTRY(1727),
            REG_ENTRY(1728),
            REG_ENTRY(1729),
            REG_ENTRY(1730),
            REG_ENTRY(1731),
            REG_ENTRY(1732),
            REG_ENTRY(1733),
            REG_ENTRY(1734),
            REG_ENTRY(1735),
            REG_ENTRY(1736),
            REG_ENTRY(1737),
            REG_ENTRY(1738),
            REG_ENTRY(1739),
            REG_ENTRY(1740),
            REG_ENTRY(1741),
            REG_ENTRY(1742),
            REG_ENTRY(1743),
            REG_ENTRY(1744),
            REG_ENTRY(1745),
            REG_ENTRY(1746),
            REG_ENTRY(1747),
            REG_ENTRY(1748),
            REG_ENTRY(1749),
            REG_ENTRY(1750),
            REG_ENTRY(1751),
            REG_ENTRY(1752),
            REG_ENTRY(1753),
            REG_ENTRY(1754),
            REG_ENTRY(1755),
            REG_ENTRY(1756),
            REG_ENTRY(1757),
            REG_ENTRY(1758),
            REG_ENTRY(1759),
            REG_ENTRY(1760),
            REG_ENTRY(1761),
            REG_ENTRY(1762),
            REG_ENTRY(1763),
            REG_ENTRY(1764),
            REG_ENTRY(1765),
            REG_ENTRY(1766),
            REG_ENTRY(1767),
            REG_ENTRY(1768),
            REG_ENTRY(1769),
            REG_ENTRY(1770),
            REG_ENTRY(1771),
            REG_ENTRY(1772),
            REG_ENTRY(1773),
            REG_ENTRY(1774),
            REG_ENTRY(1775),
            REG_ENTRY(1776),
            REG_ENTRY(1777),
            REG_ENTRY(1778),
            REG_ENTRY(1779),
            REG_ENTRY(1780),
            REG_ENTRY(1781),
            REG_ENTRY(1782),
            REG_ENTRY(1783),
            REG_ENTRY(1784),
            REG_ENTRY(1785),
            REG_ENTRY(1786),
            REG_ENTRY(1787),
            REG_ENTRY(1788),
            REG_ENTRY(1789),
            REG_ENTRY(1790),
            REG_ENTRY(1791),
            REG_ENTRY(1792),
            REG_ENTRY(1793),
            REG_ENTRY(1794),
            REG_ENTRY(1795),
            REG_ENTRY(1796),
            REG_ENTRY(1797),
            REG_ENTRY(1798),
            REG_ENTRY(1799),
            REG_ENTRY(1800),
            REG_ENTRY(1801),
            REG_ENTRY(1802),
            REG_ENTRY(1803),
            REG_ENTRY(1804),
            REG_ENTRY(1805),
            REG_ENTRY(1806),
            REG_ENTRY(1807),
            REG_ENTRY(1808),
            REG_ENTRY(1809),
            REG_ENTRY(1810),
            REG_ENTRY(1811),
            REG_ENTRY(1812),
            REG_ENTRY(1813),
            REG_ENTRY(1814),
            REG_ENTRY(1815),
            REG_ENTRY(1816),
            REG_ENTRY(1817),
            REG_ENTRY(1818),
            REG_ENTRY(1819),
            REG_ENTRY(1820),
            REG_ENTRY(1821),
            REG_ENTRY(1822),
            REG_ENTRY(1823),
            REG_ENTRY(1824),
            REG_ENTRY(1825),
            REG_ENTRY(1826),
            REG_ENTRY(1827),
            REG_ENTRY(1828),
            REG_ENTRY(1829),
            REG_ENTRY(1830),
            REG_ENTRY(1831),
            REG_ENTRY(1832),
            REG_ENTRY(1833),
            REG_ENTRY(1834),
            REG_ENTRY(1835),
            REG_ENTRY(1836),
            REG_ENTRY(1837),
            REG_ENTRY(1838),
            REG_ENTRY(1839),
            REG_ENTRY(1840),
            REG_ENTRY(1841),
            REG_ENTRY(1842),
            REG_ENTRY(1843),
            REG_ENTRY(1844),
            REG_ENTRY(1845),
            REG_ENTRY(1846),
            REG_ENTRY(1847),
            REG_ENTRY(1848),
            REG_ENTRY(1849),
            REG_ENTRY(1850),
            REG_ENTRY(1851),
            REG_ENTRY(1852),
            REG_ENTRY(1853),
            REG_ENTRY(1854),
            REG_ENTRY(1855),
            REG_ENTRY(1856),
            REG_ENTRY(1857),
            REG_ENTRY(1858),
            REG_ENTRY(1859),
            REG_ENTRY(1860),
            REG_ENTRY(1861),
            REG_ENTRY(1862),
            REG_ENTRY(1863),
            REG_ENTRY(1864),
            REG_ENTRY(1865),
            REG_ENTRY(1866),
            REG_ENTRY(1867),
            REG_ENTRY(1868),
            REG_ENTRY(1869),
            REG_ENTRY(1870),
            REG_ENTRY(1871),
            REG_ENTRY(1872),
            REG_ENTRY(1873),
            REG_ENTRY(1874),
            REG_ENTRY(1875),
            REG_ENTRY(1876),
            REG_ENTRY(1877),
            REG_ENTRY(1878),
            REG_ENTRY(1879),
            REG_ENTRY(1880),
            REG_ENTRY(1881),
            REG_ENTRY(1882),
            REG_ENTRY(1883),
            REG_ENTRY(1884),
            REG_ENTRY(1885),
            REG_ENTRY(1886),
            REG_ENTRY(1887),
            REG_ENTRY(1888),
            REG_ENTRY(1889),
            REG_ENTRY(1890),
            REG_ENTRY(1891),
            REG_ENTRY(1892),
            REG_ENTRY(1893),
            REG_ENTRY(1894),
            REG_ENTRY(1895),
            REG_ENTRY(1896),
            REG_ENTRY(1897),
            REG_ENTRY(1898),
            REG_ENTRY(1899),
            REG_ENTRY(1900),
            REG_ENTRY(1901),
            REG_ENTRY(1902),
            REG_ENTRY(1903),
            REG_ENTRY(1904),
            REG_ENTRY(1905),
            REG_ENTRY(1906),
            REG_ENTRY(1907),
            REG_ENTRY(1908),
            REG_ENTRY(1909),
            REG_ENTRY(1910),
            REG_ENTRY(1911),
            REG_ENTRY(1912),
            REG_ENTRY(1913),
            REG_ENTRY(1914),
            REG_ENTRY(1915),
            REG_ENTRY(1916),
            REG_ENTRY(1917),
            REG_ENTRY(1918),
            REG_ENTRY(1919),
            REG_ENTRY(1920),
            REG_ENTRY(1921),
            REG_ENTRY(1922),
            REG_ENTRY(1923),
            REG_ENTRY(1924),
            REG_ENTRY(1925),
            REG_ENTRY(1926),
            REG_ENTRY(1927),
            REG_ENTRY(1928),
            REG_ENTRY(1929),
            REG_ENTRY(1930),
            REG_ENTRY(1931),
            REG_ENTRY(1932),
            REG_ENTRY(1933),
            REG_ENTRY(1934),
            REG_ENTRY(1935),
            REG_ENTRY(1936),
            REG_ENTRY(1937),
            REG_ENTRY(1938),
            REG_ENTRY(1939),
            REG_ENTRY(1940),
            REG_ENTRY(1941),
            REG_ENTRY(1942),
            REG_ENTRY(1943),
            REG_ENTRY(1944),
            REG_ENTRY(1945),
            REG_ENTRY(1946),
            REG_ENTRY(1947),
            REG_ENTRY(1948),
            REG_ENTRY(1949),
            REG_ENTRY(1950),
            REG_ENTRY(1951),
            REG_ENTRY(1952),
            REG_ENTRY(1953),
            REG_ENTRY(1954),
            REG_ENTRY(1955),
            REG_ENTRY(1956),
            REG_ENTRY(1957),
            REG_ENTRY(1958),
            REG_ENTRY(1959),
            REG_ENTRY(1960),
            REG_ENTRY(1961),
            REG_ENTRY(1962),
            REG_ENTRY(1963),
            REG_ENTRY(1964),
            REG_ENTRY(1965),
            REG_ENTRY(1966),
            REG_ENTRY(1967),
            REG_ENTRY(1968),
            REG_ENTRY(1969),
            REG_ENTRY(1970),
            REG_ENTRY(1971),
            REG_ENTRY(1972),
            REG_ENTRY(1973),
            REG_ENTRY(1974),
            REG_ENTRY(1975),
            REG_ENTRY(1976),
            REG_ENTRY(1977),
            REG_ENTRY(1978),
            REG_ENTRY(1979),
            REG_ENTRY(1980),
            REG_ENTRY(1981),
            REG_ENTRY(1982),
            REG_ENTRY(1983),
            REG_ENTRY(1984),
            REG_ENTRY(1985),
            REG_ENTRY(1986),
            REG_ENTRY(1987),
            REG_ENTRY(1988),
            REG_ENTRY(1989),
            REG_ENTRY(1990),
            REG_ENTRY(1991),
            REG_ENTRY(1992),
            REG_ENTRY(1993),
            REG_ENTRY(1994),
            REG_ENTRY(1995),
            REG_ENTRY(1996),
            REG_ENTRY(1997),
            REG_ENTRY(1998),
            REG_ENTRY(1999),
            REG_ENTRY(2000),
            REG_ENTRY(2001),
            REG_ENTRY(2002),
            REG_ENTRY(2003),
            REG_ENTRY(2004),
            REG_ENTRY(2005),
            REG_ENTRY(2006),
            REG_ENTRY(2007),
            REG_ENTRY(2008),
            REG_ENTRY(2009),
            REG_ENTRY(2010),
            REG_ENTRY(2011),
            REG_ENTRY(2012),
            REG_ENTRY(2013),
            REG_ENTRY(2014),
            REG_ENTRY(2015),
            REG_ENTRY(2016),
            REG_ENTRY(2017),
            REG_ENTRY(2018),
            REG_ENTRY(2019),
            REG_ENTRY(2020),
            REG_ENTRY(2021),
            REG_ENTRY(2022),
            REG_ENTRY(2023),
            REG_ENTRY(2024),
            REG_ENTRY(2025),
            REG_ENTRY(2026),
            REG_ENTRY(2027),
            REG_ENTRY(2028),
            REG_ENTRY(2029),
            REG_ENTRY(2030),
            REG_ENTRY(2031),
            REG_ENTRY(2032),
            REG_ENTRY(2033),
            REG_ENTRY(2034),
            REG_ENTRY(2035),
            REG_ENTRY(2036),
            REG_ENTRY(2037),
            REG_ENTRY(2038),
            REG_ENTRY(2039),
            REG_ENTRY(2040),
            REG_ENTRY(2041),
            REG_ENTRY(2042),
            REG_ENTRY(2043),
            REG_ENTRY(2044),
            REG_ENTRY(2045),
            REG_ENTRY(2046),
            REG_ENTRY(2047),
            REG_ENTRY(2048),
            REG_ENTRY(2049),
            REG_ENTRY(2050),
            REG_ENTRY(2051),
            REG_ENTRY(2052),
            REG_ENTRY(2053),
            REG_ENTRY(2054),
            REG_ENTRY(2055),
            REG_ENTRY(2056),
            REG_ENTRY(2057),
            REG_ENTRY(2058),
            REG_ENTRY(2059),
            REG_ENTRY(2060),
            REG_ENTRY(2061),
            REG_ENTRY(2062),
            REG_ENTRY(2063),
            REG_ENTRY(2064),
            REG_ENTRY(2065),
            REG_ENTRY(2066),
            REG_ENTRY(2067),
            REG_ENTRY(2068),
            REG_ENTRY(2069),
            REG_ENTRY(2070),
            REG_ENTRY(2071),
            REG_ENTRY(2072),
            REG_ENTRY(2073),
            REG_ENTRY(2074),
            REG_ENTRY(2075),
            REG_ENTRY(2076),
            REG_ENTRY(2077),
            REG_ENTRY(2078),
            REG_ENTRY(2079),
            REG_ENTRY(2080),
            REG_ENTRY(2081),
            REG_ENTRY(2082),
            REG_ENTRY(2083),
            REG_ENTRY(2084),
            REG_ENTRY(2085),
            REG_ENTRY(2086),
            REG_ENTRY(2087),
            REG_ENTRY(2088),
            REG_ENTRY(2089),
            REG_ENTRY(2090),
            REG_ENTRY(2091),
            REG_ENTRY(2092),
            REG_ENTRY(2093),
            REG_ENTRY(2094),
            REG_ENTRY(2095),
            REG_ENTRY(2096),
            REG_ENTRY(2097),
            REG_ENTRY(2098),
            REG_ENTRY(2099),
            REG_ENTRY(2100),
            REG_ENTRY(2101),
            REG_ENTRY(2102),
            REG_ENTRY(2103),
            REG_ENTRY(2104),
            REG_ENTRY(2105),
            REG_ENTRY(2106),
            REG_ENTRY(2107),
            REG_ENTRY(2108),
            REG_ENTRY(2109),
            REG_ENTRY(2110),
            REG_ENTRY(2111),
            REG_ENTRY(2112),
            REG_ENTRY(2113),
            REG_ENTRY(2114),
            REG_ENTRY(2115),
            REG_ENTRY(2116),
            REG_ENTRY(2117),
            REG_ENTRY(2118),
            REG_ENTRY(2119),
            REG_ENTRY(2120),
            REG_ENTRY(2121),
            REG_ENTRY(2122),
            REG_ENTRY(2123),
            REG_ENTRY(2124),
            REG_ENTRY(2125),
            REG_ENTRY(2126),
            REG_ENTRY(2127),
            REG_ENTRY(2128),
            REG_ENTRY(2129),
            REG_ENTRY(2130),
            REG_ENTRY(2131),
            REG_ENTRY(2132),
            REG_ENTRY(2133),
            REG_ENTRY(2134),
            REG_ENTRY(2135),
            REG_ENTRY(2136),
            REG_ENTRY(2137),
            REG_ENTRY(2138),
            REG_ENTRY(2139),
            REG_ENTRY(2140),
            REG_ENTRY(2141),
            REG_ENTRY(2142),
            REG_ENTRY(2143),
            REG_ENTRY(2144),
            REG_ENTRY(2145),
            REG_ENTRY(2146),
            REG_ENTRY(2147),
            REG_ENTRY(2148),
            REG_ENTRY(2149),
            REG_ENTRY(2150),
            REG_ENTRY(2151),
            REG_ENTRY(2152),
            REG_ENTRY(2153),
            REG_ENTRY(2154),
            REG_ENTRY(2155),
            REG_ENTRY(2156),
            REG_ENTRY(2157),
            REG_ENTRY(2158),
            REG_ENTRY(2159),
            REG_ENTRY(2160),
            REG_ENTRY(2161),
            REG_ENTRY(2162),
            REG_ENTRY(2163),
            REG_ENTRY(2164),
            REG_ENTRY(2165),
            REG_ENTRY(2166),
            REG_ENTRY(2167),
            REG_ENTRY(2168),
            REG_ENTRY(2169),
            REG_ENTRY(2170),
            REG_ENTRY(2171),
            REG_ENTRY(2172),
            REG_ENTRY(2173),
            REG_ENTRY(2174),
            REG_ENTRY(2175),
            REG_ENTRY(2176),
            REG_ENTRY(2177),
            REG_ENTRY(2178),
            REG_ENTRY(2179),
            REG_ENTRY(2180),
            REG_ENTRY(2181),
            REG_ENTRY(2182),
            REG_ENTRY(2183),
            REG_ENTRY(2184),
            REG_ENTRY(2185),
            REG_ENTRY(2186),
            REG_ENTRY(2187),
            REG_ENTRY(2188),
            REG_ENTRY(2189),
            REG_ENTRY(2190),
            REG_ENTRY(2191),
            REG_ENTRY(2192),
            REG_ENTRY(2193),
            REG_ENTRY(2194),
            REG_ENTRY(2195),
            REG_ENTRY(2196),
            REG_ENTRY(2197),
            REG_ENTRY(2198),
            REG_ENTRY(2199),
            REG_ENTRY(2200),
            REG_ENTRY(2201),
            REG_ENTRY(2202),
            REG_ENTRY(2203),
            REG_ENTRY(2204),
            REG_ENTRY(2205),
            REG_ENTRY(2206),
            REG_ENTRY(2207),
            REG_ENTRY(2208),
            REG_ENTRY(2209),
            REG_ENTRY(2210),
            REG_ENTRY(2211),
            REG_ENTRY(2212),
            REG_ENTRY(2213),
            REG_ENTRY(2214),
            REG_ENTRY(2215),
            REG_ENTRY(2216),
            REG_ENTRY(2217),
            REG_ENTRY(2218),
            REG_ENTRY(2219),
            REG_ENTRY(2220),
            REG_ENTRY(2221),
            REG_ENTRY(2222),
            REG_ENTRY(2223),
            REG_ENTRY(2224),
            REG_ENTRY(2225),
            REG_ENTRY(2226),
            REG_ENTRY(2227),
            REG_ENTRY(2228),
            REG_ENTRY(2229),
            REG_ENTRY(2230),
            REG_ENTRY(2231),
            REG_ENTRY(2232),
            REG_ENTRY(2233),
            REG_ENTRY(2234),
            REG_ENTRY(2235),
            REG_ENTRY(2236),
            REG_ENTRY(2237),
            REG_ENTRY(2238),
            REG_ENTRY(2239),
            REG_ENTRY(2240),
            REG_ENTRY(2241),
            REG_ENTRY(2242),
            REG_ENTRY(2243),
            REG_ENTRY(2244),
            REG_ENTRY(2245),
            REG_ENTRY(2246),
            REG_ENTRY(2247),
            REG_ENTRY(2248),
            REG_ENTRY(2249),
            REG_ENTRY(2250),
            REG_ENTRY(2251),
            REG_ENTRY(2252),
            REG_ENTRY(2253),
            REG_ENTRY(2254),
            REG_ENTRY(2255),
            REG_ENTRY(2256),
            REG_ENTRY(2257),
            REG_ENTRY(2258),
            REG_ENTRY(2259),
            REG_ENTRY(2260),
            REG_ENTRY(2261),
            REG_ENTRY(2262),
            REG_ENTRY(2263),
            REG_ENTRY(2264),
            REG_ENTRY(2265),
            REG_ENTRY(2266),
            REG_ENTRY(2267),
            REG_ENTRY(2268),
            REG_ENTRY(2269),
            REG_ENTRY(2270),
            REG_ENTRY(2271),
            REG_ENTRY(2272),
            REG_ENTRY(2273),
            REG_ENTRY(2274),
            REG_ENTRY(2275),
            REG_ENTRY(2276),
            REG_ENTRY(2277),
            REG_ENTRY(2278),
            REG_ENTRY(2279),
            REG_ENTRY(2280),
            REG_ENTRY(2281),
            REG_ENTRY(2282),
            REG_ENTRY(2283),
            REG_ENTRY(2284),
            REG_ENTRY(2285),
            REG_ENTRY(2286),
            REG_ENTRY(2287),
            REG_ENTRY(2288),
            REG_ENTRY(2289),
            REG_ENTRY(2290),
            REG_ENTRY(2291),
            REG_ENTRY(2292),
            REG_ENTRY(2293),
            REG_ENTRY(2294),
            REG_ENTRY(2295),
            REG_ENTRY(2296),
            REG_ENTRY(2297),
            REG_ENTRY(2298),
            REG_ENTRY(2299),
            REG_ENTRY(2300),
            REG_ENTRY(2301),
            REG_ENTRY(2302),
            REG_ENTRY(2303),
            REG_ENTRY(2304),
            REG_ENTRY(2305),
            REG_ENTRY(2306),
            REG_ENTRY(2307),
            REG_ENTRY(2308),
            REG_ENTRY(2309),
            REG_ENTRY(2310),
            REG_ENTRY(2311),
            REG_ENTRY(2312),
            REG_ENTRY(2313),
            REG_ENTRY(2314),
            REG_ENTRY(2315),
            REG_ENTRY(2316),
            REG_ENTRY(2317),
            REG_ENTRY(2318),
            REG_ENTRY(2319),
            REG_ENTRY(2320),
            REG_ENTRY(2321),
            REG_ENTRY(2322),
            REG_ENTRY(2323),
            REG_ENTRY(2324),
            REG_ENTRY(2325),
            REG_ENTRY(2326),
            REG_ENTRY(2327),
            REG_ENTRY(2328),
            REG_ENTRY(2329),
            REG_ENTRY(2330),
            REG_ENTRY(2331),
            REG_ENTRY(2332),
            REG_ENTRY(2333),
            REG_ENTRY(2334),
            REG_ENTRY(2335),
            REG_ENTRY(2336),
            REG_ENTRY(2337),
            REG_ENTRY(2338),
            REG_ENTRY(2339),
            REG_ENTRY(2340),
            REG_ENTRY(2341),
            REG_ENTRY(2342),
            REG_ENTRY(2343),
            REG_ENTRY(2344),
            REG_ENTRY(2345),
            REG_ENTRY(2346),
            REG_ENTRY(2347),
            REG_ENTRY(2348),
            REG_ENTRY(2349),
            REG_ENTRY(2350),
            REG_ENTRY(2351),
            REG_ENTRY(2352),
            REG_ENTRY(2353),
            REG_ENTRY(2354),
            REG_ENTRY(2355),
            REG_ENTRY(2356),
            REG_ENTRY(2357),
            REG_ENTRY(2358),
            REG_ENTRY(2359),
            REG_ENTRY(2360),
            REG_ENTRY(2361),
            REG_ENTRY(2362),
            REG_ENTRY(2363),
            REG_ENTRY(2364),
            REG_ENTRY(2365),
            REG_ENTRY(2366),
            REG_ENTRY(2367),
            REG_ENTRY(2368),
            REG_ENTRY(2369),
            REG_ENTRY(2370),
            REG_ENTRY(2371),
            REG_ENTRY(2372),
            REG_ENTRY(2373),
            REG_ENTRY(2374),
            REG_ENTRY(2375),
            REG_ENTRY(2376),
            REG_ENTRY(2377),
            REG_ENTRY(2378),
            REG_ENTRY(2379),
            REG_ENTRY(2380),
            REG_ENTRY(2381),
            REG_ENTRY(2382),
            REG_ENTRY(2383),
            REG_ENTRY(2384),
            REG_ENTRY(2385),
            REG_ENTRY(2386),
            REG_ENTRY(2387),
            REG_ENTRY(2388),
            REG_ENTRY(2389),
            REG_ENTRY(2390),
            REG_ENTRY(2391),
            REG_ENTRY(2392),
            REG_ENTRY(2393),
            REG_ENTRY(2394),
            REG_ENTRY(2395),
            REG_ENTRY(2396),
            REG_ENTRY(2397),
            REG_ENTRY(2398),
            REG_ENTRY(2399),
            REG_ENTRY(2400),
            REG_ENTRY(2401),
            REG_ENTRY(2402),
            REG_ENTRY(2403),
            REG_ENTRY(2404),
            REG_ENTRY(2405),
            REG_ENTRY(2406),
            REG_ENTRY(2407),
            REG_ENTRY(2408),
            REG_ENTRY(2409),
            REG_ENTRY(2410),
            REG_ENTRY(2411),
            REG_ENTRY(2412),
            REG_ENTRY(2413),
            REG_ENTRY(2414),
            REG_ENTRY(2415),
            REG_ENTRY(2416),
            REG_ENTRY(2417),
            REG_ENTRY(2418),
            REG_ENTRY(2419),
            REG_ENTRY(2420),
            REG_ENTRY(2421),
            REG_ENTRY(2422),
            REG_ENTRY(2423),
            REG_ENTRY(2424),
            REG_ENTRY(2425),
            REG_ENTRY(2426),
            REG_ENTRY(2427),
            REG_ENTRY(2428),
            REG_ENTRY(2429),
            REG_ENTRY(2430),
            REG_ENTRY(2431),
            REG_ENTRY(2432),
            REG_ENTRY(2433),
            REG_ENTRY(2434),
            REG_ENTRY(2435),
            REG_ENTRY(2436),
            REG_ENTRY(2437),
            REG_ENTRY(2438),
            REG_ENTRY(2439),
            REG_ENTRY(2440),
            REG_ENTRY(2441),
            REG_ENTRY(2442),
            REG_ENTRY(2443),
            REG_ENTRY(2444),
            REG_ENTRY(2445),
            REG_ENTRY(2446),
            REG_ENTRY(2447),
            REG_ENTRY(2448),
            REG_ENTRY(2449),
            REG_ENTRY(2450),
            REG_ENTRY(2451),
            REG_ENTRY(2452),
            REG_ENTRY(2453),
            REG_ENTRY(2454),
            REG_ENTRY(2455),
            REG_ENTRY(2456),
            REG_ENTRY(2457),
            REG_ENTRY(2458),
            REG_ENTRY(2459),
            REG_ENTRY(2460),
            REG_ENTRY(2461),
            REG_ENTRY(2462),
            REG_ENTRY(2463),
            REG_ENTRY(2464),
            REG_ENTRY(2465),
            REG_ENTRY(2466),
            REG_ENTRY(2467),
            REG_ENTRY(2468),
            REG_ENTRY(2469),
            REG_ENTRY(2470),
            REG_ENTRY(2471),
            REG_ENTRY(2472),
            REG_ENTRY(2473),
            REG_ENTRY(2474),
            REG_ENTRY(2475),
            REG_ENTRY(2476),
            REG_ENTRY(2477),
            REG_ENTRY(2478),
            REG_ENTRY(2479),
            REG_ENTRY(2480),
            REG_ENTRY(2481),
            REG_ENTRY(2482),
            REG_ENTRY(2483),
            REG_ENTRY(2484),
            REG_ENTRY(2485),
            REG_ENTRY(2486),
            REG_ENTRY(2487),
            REG_ENTRY(2488),
            REG_ENTRY(2489),
            REG_ENTRY(2490),
            REG_ENTRY(2491),
            REG_ENTRY(2492),
            REG_ENTRY(2493),
            REG_ENTRY(2494),
            REG_ENTRY(2495),
            REG_ENTRY(2496),
            REG_ENTRY(2497),
            REG_ENTRY(2498),
            REG_ENTRY(2499),
            REG_ENTRY(2500),
            REG_ENTRY(2501),
            REG_ENTRY(2502),
            REG_ENTRY(2503),
            REG_ENTRY(2504),
            REG_ENTRY(2505),
            REG_ENTRY(2506),
            REG_ENTRY(2507),
            REG_ENTRY(2508),
            REG_ENTRY(2509),
            REG_ENTRY(2510),
            REG_ENTRY(2511),
            REG_ENTRY(2512),
            REG_ENTRY(2513),
            REG_ENTRY(2514),
            REG_ENTRY(2515),
            REG_ENTRY(2516),
            REG_ENTRY(2517),
            REG_ENTRY(2518),
            REG_ENTRY(2519),
            REG_ENTRY(2520),
            REG_ENTRY(2521),
            REG_ENTRY(2522),
            REG_ENTRY(2523),
            REG_ENTRY(2524),
            REG_ENTRY(2525),
            REG_ENTRY(2526),
            REG_ENTRY(2527),
            REG_ENTRY(2528),
            REG_ENTRY(2529),
            REG_ENTRY(2530),
            REG_ENTRY(2531),
            REG_ENTRY(2532),
            REG_ENTRY(2533),
            REG_ENTRY(2534),
            REG_ENTRY(2535),
            REG_ENTRY(2536),
            REG_ENTRY(2537),
            REG_ENTRY(2538),
            REG_ENTRY(2539),
            REG_ENTRY(2540),
            REG_ENTRY(2541),
            REG_ENTRY(2542),
            REG_ENTRY(2543),
            REG_ENTRY(2544),
            REG_ENTRY(2545),
            REG_ENTRY(2546),
            REG_ENTRY(2547),
            REG_ENTRY(2548),
            REG_ENTRY(2549),
            REG_ENTRY(2550),
            REG_ENTRY(2551),
            REG_ENTRY(2552),
            REG_ENTRY(2553),
            REG_ENTRY(2554),
            REG_ENTRY(2555),
            REG_ENTRY(2556),
            REG_ENTRY(2557),
            REG_ENTRY(2558),
            REG_ENTRY(2559),
            REG_ENTRY(2560),
            REG_ENTRY(2561),
            REG_ENTRY(2562),
            REG_ENTRY(2563),
            REG_ENTRY(2564),
            REG_ENTRY(2565),
            REG_ENTRY(2566),
            REG_ENTRY(2567),
            REG_ENTRY(2568),
            REG_ENTRY(2569),
            REG_ENTRY(2570),
            REG_ENTRY(2571),
            REG_ENTRY(2572),
            REG_ENTRY(2573),
            REG_ENTRY(2574),
            REG_ENTRY(2575),
            REG_ENTRY(2576),
            REG_ENTRY(2577),
            REG_ENTRY(2578),
            REG_ENTRY(2579),
            REG_ENTRY(2580),
            REG_ENTRY(2581),
            REG_ENTRY(2582),
            REG_ENTRY(2583),
            REG_ENTRY(2584),
            REG_ENTRY(2585),
            REG_ENTRY(2586),
            REG_ENTRY(2587),
            REG_ENTRY(2588),
            REG_ENTRY(2589),
            REG_ENTRY(2590),
            REG_ENTRY(2591),
            REG_ENTRY(2592),
            REG_ENTRY(2593),
            REG_ENTRY(2594),
            REG_ENTRY(2595),
            REG_ENTRY(2596),
            REG_ENTRY(2597),
            REG_ENTRY(2598),
            REG_ENTRY(2599),
            REG_ENTRY(2600),
            REG_ENTRY(2601),
            REG_ENTRY(2602),
            REG_ENTRY(2603),
            REG_ENTRY(2604),
            REG_ENTRY(2605),
            REG_ENTRY(2606),
            REG_ENTRY(2607),
            REG_ENTRY(2608),
            REG_ENTRY(2609),
            REG_ENTRY(2610),
            REG_ENTRY(2611),
            REG_ENTRY(2612),
            REG_ENTRY(2613),
            REG_ENTRY(2614),
            REG_ENTRY(2615),
            REG_ENTRY(2616),
            REG_ENTRY(2617),
            REG_ENTRY(2618),
            REG_ENTRY(2619),
            REG_ENTRY(2620),
            REG_ENTRY(2621),
            REG_ENTRY(2622),
            REG_ENTRY(2623),
            REG_ENTRY(2624),
            REG_ENTRY(2625),
            REG_ENTRY(2626),
            REG_ENTRY(2627),
            REG_ENTRY(2628),
            REG_ENTRY(2629),
            REG_ENTRY(2630),
            REG_ENTRY(2631),
            REG_ENTRY(2632),
            REG_ENTRY(2633),
            REG_ENTRY(2634),
            REG_ENTRY(2635),
            REG_ENTRY(2636),
            REG_ENTRY(2637),
            REG_ENTRY(2638),
            REG_ENTRY(2639),
            REG_ENTRY(2640),
            REG_ENTRY(2641),
            REG_ENTRY(2642),
            REG_ENTRY(2643),
            REG_ENTRY(2644),
            REG_ENTRY(2645),
            REG_ENTRY(2646),
            REG_ENTRY(2647),
            REG_ENTRY(2648),
            REG_ENTRY(2649),
            REG_ENTRY(2650),
            REG_ENTRY(2651),
            REG_ENTRY(2652),
            REG_ENTRY(2653),
            REG_ENTRY(2654),
            REG_ENTRY(2655),
            REG_ENTRY(2656),
            REG_ENTRY(2657),
            REG_ENTRY(2658),
            REG_ENTRY(2659),
            REG_ENTRY(2660),
            REG_ENTRY(2661),
            REG_ENTRY(2662),
            REG_ENTRY(2663),
            REG_ENTRY(2664),
            REG_ENTRY(2665),
            REG_ENTRY(2666),
            REG_ENTRY(2667),
            REG_ENTRY(2668),
            REG_ENTRY(2669),
            REG_ENTRY(2670),
            REG_ENTRY(2671),
            REG_ENTRY(2672),
            REG_ENTRY(2673),
            REG_ENTRY(2674),
            REG_ENTRY(2675),
            REG_ENTRY(2676),
            REG_ENTRY(2677),
            REG_ENTRY(2678),
            REG_ENTRY(2679),
            REG_ENTRY(2680),
            REG_ENTRY(2681),
            REG_ENTRY(2682),
            REG_ENTRY(2683),
            REG_ENTRY(2684),
            REG_ENTRY(2685),
            REG_ENTRY(2686),
            REG_ENTRY(2687),
            REG_ENTRY(2688),
            REG_ENTRY(2689),
            REG_ENTRY(2690),
            REG_ENTRY(2691),
            REG_ENTRY(2692),
            REG_ENTRY(2693),
            REG_ENTRY(2694),
            REG_ENTRY(2695),
            REG_ENTRY(2696),
            REG_ENTRY(2697),
            REG_ENTRY(2698),
            REG_ENTRY(2699),
            REG_ENTRY(2700),
            REG_ENTRY(2701),
            REG_ENTRY(2702),
            REG_ENTRY(2703),
            REG_ENTRY(2704),
            REG_ENTRY(2705),
            REG_ENTRY(2706),
            REG_ENTRY(2707),
            REG_ENTRY(2708),
            REG_ENTRY(2709),
            REG_ENTRY(2710),
            REG_ENTRY(2711),
            REG_ENTRY(2712),
            REG_ENTRY(2713),
            REG_ENTRY(2714),
            REG_ENTRY(2715),
            REG_ENTRY(2716),
            REG_ENTRY(2717),
            REG_ENTRY(2718),
            REG_ENTRY(2719),
            REG_ENTRY(2720),
            REG_ENTRY(2721),
            REG_ENTRY(2722),
            REG_ENTRY(2723),
            REG_ENTRY(2724),
            REG_ENTRY(2725),
            REG_ENTRY(2726),
            REG_ENTRY(2727),
            REG_ENTRY(2728),
            REG_ENTRY(2729),
            REG_ENTRY(2730),
            REG_ENTRY(2731),
            REG_ENTRY(2732),
            REG_ENTRY(2733),
            REG_ENTRY(2734),
            REG_ENTRY(2735),
            REG_ENTRY(2736),
            REG_ENTRY(2737),
            REG_ENTRY(2738),
            REG_ENTRY(2739),
            REG_ENTRY(2740),
            REG_ENTRY(2741),
            REG_ENTRY(2742),
            REG_ENTRY(2743),
            REG_ENTRY(2744),
            REG_ENTRY(2745),
            REG_ENTRY(2746),
            REG_ENTRY(2747),
            REG_ENTRY(2748),
            REG_ENTRY(2749),
            REG_ENTRY(2750),
            REG_ENTRY(2751),
            REG_ENTRY(2752),
            REG_ENTRY(2753),
            REG_ENTRY(2754),
            REG_ENTRY(2755),
            REG_ENTRY(2756),
            REG_ENTRY(2757),
            REG_ENTRY(2758),
            REG_ENTRY(2759),
            REG_ENTRY(2760),
            REG_ENTRY(2761),
            REG_ENTRY(2762),
            REG_ENTRY(2763),
            REG_ENTRY(2764),
            REG_ENTRY(2765),
            REG_ENTRY(2766),
            REG_ENTRY(2767),
            REG_ENTRY(2768),
            REG_ENTRY(2769),
            REG_ENTRY(2770),
            REG_ENTRY(2771),
            REG_ENTRY(2772),
            REG_ENTRY(2773),
            REG_ENTRY(2774),
            REG_ENTRY(2775),
            REG_ENTRY(2776),
            REG_ENTRY(2777),
            REG_ENTRY(2778),
            REG_ENTRY(2779),
            REG_ENTRY(2780),
            REG_ENTRY(2781),
            REG_ENTRY(2782),
            REG_ENTRY(2783),
            REG_ENTRY(2784),
            REG_ENTRY(2785),
            REG_ENTRY(2786),
            REG_ENTRY(2787),
            REG_ENTRY(2788),
            REG_ENTRY(2789),
            REG_ENTRY(2790),
            REG_ENTRY(2791),
            REG_ENTRY(2792),
            REG_ENTRY(2793),
            REG_ENTRY(2794),
            REG_ENTRY(2795),
            REG_ENTRY(2796),
            REG_ENTRY(2797),
            REG_ENTRY(2798),
            REG_ENTRY(2799),
            REG_ENTRY(2800),
            REG_ENTRY(2801),
            REG_ENTRY(2802),
            REG_ENTRY(2803),
            REG_ENTRY(2804),
            REG_ENTRY(2805),
            REG_ENTRY(2806),
            REG_ENTRY(2807),
            REG_ENTRY(2808),
            REG_ENTRY(2809),
            REG_ENTRY(2810),
            REG_ENTRY(2811),
            REG_ENTRY(2812),
            REG_ENTRY(2813),
            REG_ENTRY(2814),
            REG_ENTRY(2815),
            REG_ENTRY(2816),
            REG_ENTRY(2817),
            REG_ENTRY(2818),
            REG_ENTRY(2819),
            REG_ENTRY(2820),
            REG_ENTRY(2821),
            REG_ENTRY(2822),
            REG_ENTRY(2823),
            REG_ENTRY(2824),
            REG_ENTRY(2825),
            REG_ENTRY(2826),
            REG_ENTRY(2827),
            REG_ENTRY(2828),
            REG_ENTRY(2829),
            REG_ENTRY(2830),
            REG_ENTRY(2831),
            REG_ENTRY(2832),
            REG_ENTRY(2833),
            REG_ENTRY(2834),
            REG_ENTRY(2835),
            REG_ENTRY(2836),
            REG_ENTRY(2837),
            REG_ENTRY(2838),
            REG_ENTRY(2839),
            REG_ENTRY(2840),
            REG_ENTRY(2841),
            REG_ENTRY(2842),
            REG_ENTRY(2843),
            REG_ENTRY(2844),
            REG_ENTRY(2845),
            REG_ENTRY(2846),
            REG_ENTRY(2847),
            REG_ENTRY(2848),
            REG_ENTRY(2849),
            REG_ENTRY(2850),
            REG_ENTRY(2851),
            REG_ENTRY(2852),
            REG_ENTRY(2853),
            REG_ENTRY(2854),
            REG_ENTRY(2855),
            REG_ENTRY(2856),
            REG_ENTRY(2857),
            REG_ENTRY(2858),
            REG_ENTRY(2859),
            REG_ENTRY(2860),
            REG_ENTRY(2861),
            REG_ENTRY(2862),
            REG_ENTRY(2863),
            REG_ENTRY(2864),
            REG_ENTRY(2865),
            REG_ENTRY(2866),
            REG_ENTRY(2867),
            REG_ENTRY(2868),
            REG_ENTRY(2869),
            REG_ENTRY(2870),
            REG_ENTRY(2871),
            REG_ENTRY(2872),
            REG_ENTRY(2873),
            REG_ENTRY(2874),
            REG_ENTRY(2875),
            REG_ENTRY(2876),
            REG_ENTRY(2877),
            REG_ENTRY(2878),
            REG_ENTRY(2879),
            REG_ENTRY(2880),
            REG_ENTRY(2881),
            REG_ENTRY(2882),
            REG_ENTRY(2883),
            REG_ENTRY(2884),
            REG_ENTRY(2885),
            REG_ENTRY(2886),
            REG_ENTRY(2887),
            REG_ENTRY(2888),
            REG_ENTRY(2889),
            REG_ENTRY(2890),
            REG_ENTRY(2891),
            REG_ENTRY(2892),
            REG_ENTRY(2893),
            REG_ENTRY(2894),
            REG_ENTRY(2895),
            REG_ENTRY(2896),
            REG_ENTRY(2897),
            REG_ENTRY(2898),
            REG_ENTRY(2899),
            REG_ENTRY(2900),
            REG_ENTRY(2901),
            REG_ENTRY(2902),
            REG_ENTRY(2903),
            REG_ENTRY(2904),
            REG_ENTRY(2905),
            REG_ENTRY(2906),
            REG_ENTRY(2907),
            REG_ENTRY(2908),
            REG_ENTRY(2909),
            REG_ENTRY(2910),
            REG_ENTRY(2911),
            REG_ENTRY(2912),
            REG_ENTRY(2913),
            REG_ENTRY(2914),
            REG_ENTRY(2915),
            REG_ENTRY(2916),
            REG_ENTRY(2917),
            REG_ENTRY(2918),
            REG_ENTRY(2919),
            REG_ENTRY(2920),
            REG_ENTRY(2921),
            REG_ENTRY(2922),
            REG_ENTRY(2923),
            REG_ENTRY(2924),
            REG_ENTRY(2925),
            REG_ENTRY(2926),
            REG_ENTRY(2927),
            REG_ENTRY(2928),
            REG_ENTRY(2929),
            REG_ENTRY(2930),
            REG_ENTRY(2931),
            REG_ENTRY(2932),
            REG_ENTRY(2933),
            REG_ENTRY(2934),
            REG_ENTRY(2935),
            REG_ENTRY(2936),
            REG_ENTRY(2937),
            REG_ENTRY(2938),
            REG_ENTRY(2939),
            REG_ENTRY(2940),
            REG_ENTRY(2941),
            REG_ENTRY(2942),
            REG_ENTRY(2943),
            REG_ENTRY(2944),
            REG_ENTRY(2945),
            REG_ENTRY(2946),
            REG_ENTRY(2947),
            REG_ENTRY(2948),
            REG_ENTRY(2949),
            REG_ENTRY(2950),
            REG_ENTRY(2951),
            REG_ENTRY(2952),
            REG_ENTRY(2953),
            REG_ENTRY(2954),
            REG_ENTRY(2955),
            REG_ENTRY(2956),
            REG_ENTRY(2957),
            REG_ENTRY(2958),
            REG_ENTRY(2959),
            REG_ENTRY(2960),
            REG_ENTRY(2961),
            REG_ENTRY(2962),
            REG_ENTRY(2963),
            REG_ENTRY(2964),
            REG_ENTRY(2965),
            REG_ENTRY(2966),
            REG_ENTRY(2967),
            REG_ENTRY(2968),
            REG_ENTRY(2969),
            REG_ENTRY(2970),
            REG_ENTRY(2971),
            REG_ENTRY(2972),
            REG_ENTRY(2973),
            REG_ENTRY(2974),
            REG_ENTRY(2975),
            REG_ENTRY(2976),
            REG_ENTRY(2977),
            REG_ENTRY(2978),
            REG_ENTRY(2979),
            REG_ENTRY(2980),
            REG_ENTRY(2981),
            REG_ENTRY(2982),
            REG_ENTRY(2983),
            REG_ENTRY(2984),
            REG_ENTRY(2985),
            REG_ENTRY(2986),
            REG_ENTRY(2987),
            REG_ENTRY(2988),
            REG_ENTRY(2989),
            REG_ENTRY(2990),
            REG_ENTRY(2991),
            REG_ENTRY(2992),
            REG_ENTRY(2993),
            REG_ENTRY(2994),
            REG_ENTRY(2995),
            REG_ENTRY(2996),
            REG_ENTRY(2997),
            REG_ENTRY(2998),
            REG_ENTRY(2999),
            REG_ENTRY(3000),
            REG_ENTRY(3001),
            REG_ENTRY(3002),
            REG_ENTRY(3003),
            REG_ENTRY(3004),
            REG_ENTRY(3005),
            REG_ENTRY(3006),
            REG_ENTRY(3007),
            REG_ENTRY(3008),
            REG_ENTRY(3009),
            REG_ENTRY(3010),
            REG_ENTRY(3011),
            REG_ENTRY(3012),
            REG_ENTRY(3013),
            REG_ENTRY(3014),
            REG_ENTRY(3015),
            REG_ENTRY(3016),
            REG_ENTRY(3017),
            REG_ENTRY(3018),
            REG_ENTRY(3019),
            REG_ENTRY(3020),
            REG_ENTRY(3021),
            REG_ENTRY(3022),
            REG_ENTRY(3023),
            REG_ENTRY(3024),
            REG_ENTRY(3025),
            REG_ENTRY(3026),
            REG_ENTRY(3027),
            REG_ENTRY(3028),
            REG_ENTRY(3029),
            REG_ENTRY(3030),
            REG_ENTRY(3031),
            REG_ENTRY(3032),
            REG_ENTRY(3033),
            REG_ENTRY(3034),
            REG_ENTRY(3035),
            REG_ENTRY(3036),
            REG_ENTRY(3037),
            REG_ENTRY(3038),
            REG_ENTRY(3039),
            REG_ENTRY(3040),
            REG_ENTRY(3041),
            REG_ENTRY(3042),
            REG_ENTRY(3043),
            REG_ENTRY(3044),
            REG_ENTRY(3045),
            REG_ENTRY(3046),
            REG_ENTRY(3047),
            REG_ENTRY(3048),
            REG_ENTRY(3049),
            REG_ENTRY(3050),
            REG_ENTRY(3051),
            REG_ENTRY(3052),
            REG_ENTRY(3053),
            REG_ENTRY(3054),
            REG_ENTRY(3055),
            REG_ENTRY(3056),
            REG_ENTRY(3057),
            REG_ENTRY(3058),
            REG_ENTRY(3059),
            REG_ENTRY(3060),
            REG_ENTRY(3061),
            REG_ENTRY(3062),
            REG_ENTRY(3063),
            REG_ENTRY(3064),
            REG_ENTRY(3065),
            REG_ENTRY(3066),
            REG_ENTRY(3067),
            REG_ENTRY(3068),
            REG_ENTRY(3069),
            REG_ENTRY(3070),
            REG_ENTRY(3071),
            REG_ENTRY(3072),
            REG_ENTRY(3073),
            REG_ENTRY(3074),
            REG_ENTRY(3075),
            REG_ENTRY(3076),
            REG_ENTRY(3077),
            REG_ENTRY(3078),
            REG_ENTRY(3079),
            REG_ENTRY(3080),
            REG_ENTRY(3081),
            REG_ENTRY(3082),
            REG_ENTRY(3083),
            REG_ENTRY(3084),
            REG_ENTRY(3085),
            REG_ENTRY(3086),
            REG_ENTRY(3087),
            REG_ENTRY(3088),
            REG_ENTRY(3089),
            REG_ENTRY(3090),
            REG_ENTRY(3091),
            REG_ENTRY(3092),
            REG_ENTRY(3093),
            REG_ENTRY(3094),
            REG_ENTRY(3095),
            REG_ENTRY(3096),
            REG_ENTRY(3097),
            REG_ENTRY(3098),
            REG_ENTRY(3099),
            REG_ENTRY(3100),
            REG_ENTRY(3101),
            REG_ENTRY(3102),
            REG_ENTRY(3103),
            REG_ENTRY(3104),
            REG_ENTRY(3105),
            REG_ENTRY(3106),
            REG_ENTRY(3107),
            REG_ENTRY(3108),
            REG_ENTRY(3109),
            REG_ENTRY(3110),
            REG_ENTRY(3111),
            REG_ENTRY(3112),
            REG_ENTRY(3113),
            REG_ENTRY(3114),
            REG_ENTRY(3115),
            REG_ENTRY(3116),
            REG_ENTRY(3117),
            REG_ENTRY(3118),
            REG_ENTRY(3119),
            REG_ENTRY(3120),
            REG_ENTRY(3121),
            REG_ENTRY(3122),
            REG_ENTRY(3123),
            REG_ENTRY(3124),
            REG_ENTRY(3125),
            REG_ENTRY(3126),
            REG_ENTRY(3127),
            REG_ENTRY(3128),
            REG_ENTRY(3129),
            REG_ENTRY(3130),
            REG_ENTRY(3131),
            REG_ENTRY(3132),
            REG_ENTRY(3133),
            REG_ENTRY(3134),
            REG_ENTRY(3135),
            REG_ENTRY(3136),
            REG_ENTRY(3137),
            REG_ENTRY(3138),
            REG_ENTRY(3139),
            REG_ENTRY(3140),
            REG_ENTRY(3141),
            REG_ENTRY(3142),
            REG_ENTRY(3143),
            REG_ENTRY(3144),
            REG_ENTRY(3145),
            REG_ENTRY(3146),
            REG_ENTRY(3147),
            REG_ENTRY(3148),
            REG_ENTRY(3149),
            REG_ENTRY(3150),
            REG_ENTRY(3151),
            REG_ENTRY(3152),
            REG_ENTRY(3153),
            REG_ENTRY(3154),
            REG_ENTRY(3155),
            REG_ENTRY(3156),
            REG_ENTRY(3157),
            REG_ENTRY(3158),
            REG_ENTRY(3159),
            REG_ENTRY(3160),
            REG_ENTRY(3161),
            REG_ENTRY(3162),
            REG_ENTRY(3163),
            REG_ENTRY(3164),
            REG_ENTRY(3165),
            REG_ENTRY(3166),
            REG_ENTRY(3167),
            REG_ENTRY(3168),
            REG_ENTRY(3169),
            REG_ENTRY(3170),
            REG_ENTRY(3171),
            REG_ENTRY(3172),
            REG_ENTRY(3173),
            REG_ENTRY(3174),
            REG_ENTRY(3175),
            REG_ENTRY(3176),
            REG_ENTRY(3177),
            REG_ENTRY(3178),
            REG_ENTRY(3179),
            REG_ENTRY(3180),
            REG_ENTRY(3181),
            REG_ENTRY(3182),
            REG_ENTRY(3183),
            REG_ENTRY(3184),
            REG_ENTRY(3185),
            REG_ENTRY(3186),
            REG_ENTRY(3187),
            REG_ENTRY(3188),
            REG_ENTRY(3189),
            REG_ENTRY(3190),
            REG_ENTRY(3191),
            REG_ENTRY(3192),
            REG_ENTRY(3193),
            REG_ENTRY(3194),
            REG_ENTRY(3195),
            REG_ENTRY(3196),
            REG_ENTRY(3197),
            REG_ENTRY(3198),
            REG_ENTRY(3199),
            REG_ENTRY(3200),
            REG_ENTRY(3201),
            REG_ENTRY(3202),
            REG_ENTRY(3203),
            REG_ENTRY(3204),
            REG_ENTRY(3205),
            REG_ENTRY(3206),
            REG_ENTRY(3207),
            REG_ENTRY(3208),
            REG_ENTRY(3209),
            REG_ENTRY(3210),
            REG_ENTRY(3211),
            REG_ENTRY(3212),
            REG_ENTRY(3213),
            REG_ENTRY(3214),
            REG_ENTRY(3215),
            REG_ENTRY(3216),
            REG_ENTRY(3217),
            REG_ENTRY(3218),
            REG_ENTRY(3219),
            REG_ENTRY(3220),
            REG_ENTRY(3221),
            REG_ENTRY(3222),
            REG_ENTRY(3223),
            REG_ENTRY(3224),
            REG_ENTRY(3225),
            REG_ENTRY(3226),
            REG_ENTRY(3227),
            REG_ENTRY(3228),
            REG_ENTRY(3229),
            REG_ENTRY(3230),
            REG_ENTRY(3231),
            REG_ENTRY(3232),
            REG_ENTRY(3233),
            REG_ENTRY(3234),
            REG_ENTRY(3235),
            REG_ENTRY(3236),
            REG_ENTRY(3237),
            REG_ENTRY(3238),
            REG_ENTRY(3239),
            REG_ENTRY(3240),
            REG_ENTRY(3241),
            REG_ENTRY(3242),
            REG_ENTRY(3243),
            REG_ENTRY(3244),
            REG_ENTRY(3245),
            REG_ENTRY(3246),
            REG_ENTRY(3247),
            REG_ENTRY(3248),
            REG_ENTRY(3249),
            REG_ENTRY(3250),
            REG_ENTRY(3251),
            REG_ENTRY(3252),
            REG_ENTRY(3253),
            REG_ENTRY(3254),
            REG_ENTRY(3255),
            REG_ENTRY(3256),
            REG_ENTRY(3257),
            REG_ENTRY(3258),
            REG_ENTRY(3259),
            REG_ENTRY(3260),
            REG_ENTRY(3261),
            REG_ENTRY(3262),
            REG_ENTRY(3263),
            REG_ENTRY(3264),
            REG_ENTRY(3265),
            REG_ENTRY(3266),
            REG_ENTRY(3267),
            REG_ENTRY(3268),
            REG_ENTRY(3269),
            REG_ENTRY(3270),
            REG_ENTRY(3271),
            REG_ENTRY(3272),
            REG_ENTRY(3273),
            REG_ENTRY(3274),
            REG_ENTRY(3275),
            REG_ENTRY(3276),
            REG_ENTRY(3277),
            REG_ENTRY(3278),
            REG_ENTRY(3279),
            REG_ENTRY(3280),
            REG_ENTRY(3281),
            REG_ENTRY(3282),
            REG_ENTRY(3283),
            REG_ENTRY(3284),
            REG_ENTRY(3285),
            REG_ENTRY(3286),
            REG_ENTRY(3287),
            REG_ENTRY(3288),
            REG_ENTRY(3289),
            REG_ENTRY(3290),
            REG_ENTRY(3291),
            REG_ENTRY(3292),
            REG_ENTRY(3293),
            REG_ENTRY(3294),
            REG_ENTRY(3295),
            REG_ENTRY(3296),
            REG_ENTRY(3297),
            REG_ENTRY(3298),
            REG_ENTRY(3299),
            REG_ENTRY(3300),
            REG_ENTRY(3301),
            REG_ENTRY(3302),
            REG_ENTRY(3303),
            REG_ENTRY(3304),
            REG_ENTRY(3305),
            REG_ENTRY(3306),
            REG_ENTRY(3307),
            REG_ENTRY(3308),
            REG_ENTRY(3309),
            REG_ENTRY(3310),
            REG_ENTRY(3311),
            REG_ENTRY(3312),
            REG_ENTRY(3313),
            REG_ENTRY(3314),
            REG_ENTRY(3315),
            REG_ENTRY(3316),
            REG_ENTRY(3317),
            REG_ENTRY(3318),
            REG_ENTRY(3319),
            REG_ENTRY(3320),
            REG_ENTRY(3321),
            REG_ENTRY(3322),
            REG_ENTRY(3323),
            REG_ENTRY(3324),
            REG_ENTRY(3325),
            REG_ENTRY(3326),
            REG_ENTRY(3327),
            REG_ENTRY(3328),
            REG_ENTRY(3329),
            REG_ENTRY(3330),
            REG_ENTRY(3331),
            REG_ENTRY(3332),
            REG_ENTRY(3333),
            REG_ENTRY(3334),
            REG_ENTRY(3335),
            REG_ENTRY(3336),
            REG_ENTRY(3337),
            REG_ENTRY(3338),
            REG_ENTRY(3339),
            REG_ENTRY(3340),
            REG_ENTRY(3341),
            REG_ENTRY(3342),
            REG_ENTRY(3343),
            REG_ENTRY(3344),
            REG_ENTRY(3345),
            REG_ENTRY(3346),
            REG_ENTRY(3347),
            REG_ENTRY(3348),
            REG_ENTRY(3349),
            REG_ENTRY(3350),
            REG_ENTRY(3351),
            REG_ENTRY(3352),
            REG_ENTRY(3353),
            REG_ENTRY(3354),
            REG_ENTRY(3355),
            REG_ENTRY(3356),
            REG_ENTRY(3357),
            REG_ENTRY(3358),
            REG_ENTRY(3359),
            REG_ENTRY(3360),
            REG_ENTRY(3361),
            REG_ENTRY(3362),
            REG_ENTRY(3363),
            REG_ENTRY(3364),
            REG_ENTRY(3365),
            REG_ENTRY(3366),
            REG_ENTRY(3367),
            REG_ENTRY(3368),
            REG_ENTRY(3369),
            REG_ENTRY(3370),
            REG_ENTRY(3371),
            REG_ENTRY(3372),
            REG_ENTRY(3373),
            REG_ENTRY(3374),
            REG_ENTRY(3375),
            REG_ENTRY(3376),
            REG_ENTRY(3377),
            REG_ENTRY(3378),
            REG_ENTRY(3379),
            REG_ENTRY(3380),
            REG_ENTRY(3381),
            REG_ENTRY(3382),
            REG_ENTRY(3383),
            REG_ENTRY(3384),
            REG_ENTRY(3385),
            REG_ENTRY(3386),
            REG_ENTRY(3387),
            REG_ENTRY(3388),
            REG_ENTRY(3389),
            REG_ENTRY(3390),
            REG_ENTRY(3391),
            REG_ENTRY(3392),
            REG_ENTRY(3393),
            REG_ENTRY(3394),
            REG_ENTRY(3395),
            REG_ENTRY(3396),
            REG_ENTRY(3397),
            REG_ENTRY(3398),
            REG_ENTRY(3399),
            REG_ENTRY(3400),
            REG_ENTRY(3401),
            REG_ENTRY(3402),
            REG_ENTRY(3403),
            REG_ENTRY(3404),
            REG_ENTRY(3405),
            REG_ENTRY(3406),
            REG_ENTRY(3407),
            REG_ENTRY(3408),
            REG_ENTRY(3409),
            REG_ENTRY(3410),
            REG_ENTRY(3411),
            REG_ENTRY(3412),
            REG_ENTRY(3413),
            REG_ENTRY(3414),
            REG_ENTRY(3415),
            REG_ENTRY(3416),
            REG_ENTRY(3417),
            REG_ENTRY(3418),
            REG_ENTRY(3419),
            REG_ENTRY(3420),
            REG_ENTRY(3421),
            REG_ENTRY(3422),
            REG_ENTRY(3423),
            REG_ENTRY(3424),
            REG_ENTRY(3425),
            REG_ENTRY(3426),
            REG_ENTRY(3427),
            REG_ENTRY(3428),
            REG_ENTRY(3429),
            REG_ENTRY(3430),
            REG_ENTRY(3431),
            REG_ENTRY(3432),
            REG_ENTRY(3433),
            REG_ENTRY(3434),
            REG_ENTRY(3435),
            REG_ENTRY(3436),
            REG_ENTRY(3437),
            REG_ENTRY(3438),
            REG_ENTRY(3439),
            REG_ENTRY(3440),
            REG_ENTRY(3441),
            REG_ENTRY(3442),
            REG_ENTRY(3443),
            REG_ENTRY(3444),
            REG_ENTRY(3445),
            REG_ENTRY(3446),
            REG_ENTRY(3447),
            REG_ENTRY(3448),
            REG_ENTRY(3449),
            REG_ENTRY(3450),
            REG_ENTRY(3451),
            REG_ENTRY(3452),
            REG_ENTRY(3453),
            REG_ENTRY(3454),
            REG_ENTRY(3455),
            REG_ENTRY(3456),
            REG_ENTRY(3457),
            REG_ENTRY(3458),
            REG_ENTRY(3459),
            REG_ENTRY(3460),
            REG_ENTRY(3461),
            REG_ENTRY(3462),
            REG_ENTRY(3463),
            REG_ENTRY(3464),
            REG_ENTRY(3465),
            REG_ENTRY(3466),
            REG_ENTRY(3467),
            REG_ENTRY(3468),
            REG_ENTRY(3469),
            REG_ENTRY(3470),
            REG_ENTRY(3471),
            REG_ENTRY(3472),
            REG_ENTRY(3473),
            REG_ENTRY(3474),
            REG_ENTRY(3475),
            REG_ENTRY(3476),
            REG_ENTRY(3477),
            REG_ENTRY(3478),
            REG_ENTRY(3479),
            REG_ENTRY(3480),
            REG_ENTRY(3481),
            REG_ENTRY(3482),
            REG_ENTRY(3483),
            REG_ENTRY(3484),
            REG_ENTRY(3485),
            REG_ENTRY(3486),
            REG_ENTRY(3487),
            REG_ENTRY(3488),
            REG_ENTRY(3489),
            REG_ENTRY(3490),
            REG_ENTRY(3491),
            REG_ENTRY(3492),
            REG_ENTRY(3493),
            REG_ENTRY(3494),
            REG_ENTRY(3495),
            REG_ENTRY(3496),
            REG_ENTRY(3497),
            REG_ENTRY(3498),
            REG_ENTRY(3499),
            REG_ENTRY(3500),
            REG_ENTRY(3501),
            REG_ENTRY(3502),
            REG_ENTRY(3503),
            REG_ENTRY(3504),
            REG_ENTRY(3505),
            REG_ENTRY(3506),
            REG_ENTRY(3507),
            REG_ENTRY(3508),
            REG_ENTRY(3509),
            REG_ENTRY(3510),
            REG_ENTRY(3511),
            REG_ENTRY(3512),
            REG_ENTRY(3513),
            REG_ENTRY(3514),
            REG_ENTRY(3515),
            REG_ENTRY(3516),
            REG_ENTRY(3517),
            REG_ENTRY(3518),
            REG_ENTRY(3519),
            REG_ENTRY(3520),
            REG_ENTRY(3521),
            REG_ENTRY(3522),
            REG_ENTRY(3523),
            REG_ENTRY(3524),
            REG_ENTRY(3525),
            REG_ENTRY(3526),
            REG_ENTRY(3527),
            REG_ENTRY(3528),
            REG_ENTRY(3529),
            REG_ENTRY(3530),
            REG_ENTRY(3531),
            REG_ENTRY(3532),
            REG_ENTRY(3533),
            REG_ENTRY(3534),
            REG_ENTRY(3535),
            REG_ENTRY(3536),
            REG_ENTRY(3537),
            REG_ENTRY(3538),
            REG_ENTRY(3539),
            REG_ENTRY(3540),
            REG_ENTRY(3541),
            REG_ENTRY(3542),
            REG_ENTRY(3543),
            REG_ENTRY(3544),
            REG_ENTRY(3545),
            REG_ENTRY(3546),
            REG_ENTRY(3547),
            REG_ENTRY(3548),
            REG_ENTRY(3549),
            REG_ENTRY(3550),
            REG_ENTRY(3551),
            REG_ENTRY(3552),
            REG_ENTRY(3553),
            REG_ENTRY(3554),
            REG_ENTRY(3555),
            REG_ENTRY(3556),
            REG_ENTRY(3557),
            REG_ENTRY(3558),
            REG_ENTRY(3559),
            REG_ENTRY(3560),
            REG_ENTRY(3561),
            REG_ENTRY(3562),
            REG_ENTRY(3563),
            REG_ENTRY(3564),
            REG_ENTRY(3565),
            REG_ENTRY(3566),
            REG_ENTRY(3567),
            REG_ENTRY(3568),
            REG_ENTRY(3569),
            REG_ENTRY(3570),
            REG_ENTRY(3571),
            REG_ENTRY(3572),
            REG_ENTRY(3573),
            REG_ENTRY(3574),
            REG_ENTRY(3575),
            REG_ENTRY(3576),
            REG_ENTRY(3577),
            REG_ENTRY(3578),
            REG_ENTRY(3579),
            REG_ENTRY(3580),
            REG_ENTRY(3581),
            REG_ENTRY(3582),
            REG_ENTRY(3583),
            REG_ENTRY(3584),
            REG_ENTRY(3585),
            REG_ENTRY(3586),
            REG_ENTRY(3587),
            REG_ENTRY(3588),
            REG_ENTRY(3589),
            REG_ENTRY(3590),
            REG_ENTRY(3591),
            REG_ENTRY(3592),
            REG_ENTRY(3593),
            REG_ENTRY(3594),
            REG_ENTRY(3595),
            REG_ENTRY(3596),
            REG_ENTRY(3597),
            REG_ENTRY(3598),
            REG_ENTRY(3599),
            REG_ENTRY(3600),
            REG_ENTRY(3601),
            REG_ENTRY(3602),
            REG_ENTRY(3603),
            REG_ENTRY(3604),
            REG_ENTRY(3605),
            REG_ENTRY(3606),
            REG_ENTRY(3607),
            REG_ENTRY(3608),
            REG_ENTRY(3609),
            REG_ENTRY(3610),
            REG_ENTRY(3611),
            REG_ENTRY(3612),
            REG_ENTRY(3613),
            REG_ENTRY(3614),
            REG_ENTRY(3615),
            REG_ENTRY(3616),
            REG_ENTRY(3617),
            REG_ENTRY(3618),
            REG_ENTRY(3619),
            REG_ENTRY(3620),
            REG_ENTRY(3621),
            REG_ENTRY(3622),
            REG_ENTRY(3623),
            REG_ENTRY(3624),
            REG_ENTRY(3625),
            REG_ENTRY(3626),
            REG_ENTRY(3627),
            REG_ENTRY(3628),
            REG_ENTRY(3629),
            REG_ENTRY(3630),
            REG_ENTRY(3631),
            REG_ENTRY(3632),
            REG_ENTRY(3633),
            REG_ENTRY(3634),
            REG_ENTRY(3635),
            REG_ENTRY(3636),
            REG_ENTRY(3637),
            REG_ENTRY(3638),
            REG_ENTRY(3639),
            REG_ENTRY(3640),
            REG_ENTRY(3641),
            REG_ENTRY(3642),
            REG_ENTRY(3643),
            REG_ENTRY(3644),
            REG_ENTRY(3645),
            REG_ENTRY(3646),
            REG_ENTRY(3647),
            REG_ENTRY(3648),
            REG_ENTRY(3649),
            REG_ENTRY(3650),
            REG_ENTRY(3651),
            REG_ENTRY(3652),
            REG_ENTRY(3653),
            REG_ENTRY(3654),
            REG_ENTRY(3655),
            REG_ENTRY(3656),
            REG_ENTRY(3657),
            REG_ENTRY(3658),
            REG_ENTRY(3659),
            REG_ENTRY(3660),
            REG_ENTRY(3661),
            REG_ENTRY(3662),
            REG_ENTRY(3663),
            REG_ENTRY(3664),
            REG_ENTRY(3665),
            REG_ENTRY(3666),
            REG_ENTRY(3667),
            REG_ENTRY(3668),
            REG_ENTRY(3669),
            REG_ENTRY(3670),
            REG_ENTRY(3671),
            REG_ENTRY(3672),
            REG_ENTRY(3673),
            REG_ENTRY(3674),
            REG_ENTRY(3675),
            REG_ENTRY(3676),
            REG_ENTRY(3677),
            REG_ENTRY(3678),
            REG_ENTRY(3679),
            REG_ENTRY(3680),
            REG_ENTRY(3681),
            REG_ENTRY(3682),
            REG_ENTRY(3683),
            REG_ENTRY(3684),
            REG_ENTRY(3685),
            REG_ENTRY(3686),
            REG_ENTRY(3687),
            REG_ENTRY(3688),
            REG_ENTRY(3689),
            REG_ENTRY(3690),
            REG_ENTRY(3691),
            REG_ENTRY(3692),
            REG_ENTRY(3693),
            REG_ENTRY(3694),
            REG_ENTRY(3695),
            REG_ENTRY(3696),
            REG_ENTRY(3697),
            REG_ENTRY(3698),
            REG_ENTRY(3699),
            REG_ENTRY(3700),
            REG_ENTRY(3701),
            REG_ENTRY(3702),
            REG_ENTRY(3703),
            REG_ENTRY(3704),
            REG_ENTRY(3705),
            REG_ENTRY(3706),
            REG_ENTRY(3707),
            REG_ENTRY(3708),
            REG_ENTRY(3709),
            REG_ENTRY(3710),
            REG_ENTRY(3711),
            REG_ENTRY(3712),
            REG_ENTRY(3713),
            REG_ENTRY(3714),
            REG_ENTRY(3715),
            REG_ENTRY(3716),
            REG_ENTRY(3717),
            REG_ENTRY(3718),
            REG_ENTRY(3719),
            REG_ENTRY(3720),
            REG_ENTRY(3721),
            REG_ENTRY(3722),
            REG_ENTRY(3723),
            REG_ENTRY(3724),
            REG_ENTRY(3725),
            REG_ENTRY(3726),
            REG_ENTRY(3727),
            REG_ENTRY(3728),
            REG_ENTRY(3729),
            REG_ENTRY(3730),
            REG_ENTRY(3731),
            REG_ENTRY(3732),
            REG_ENTRY(3733),
            REG_ENTRY(3734),
            REG_ENTRY(3735),
            REG_ENTRY(3736),
            REG_ENTRY(3737),
            REG_ENTRY(3738),
            REG_ENTRY(3739),
            REG_ENTRY(3740),
            REG_ENTRY(3741),
            REG_ENTRY(3742),
            REG_ENTRY(3743),
            REG_ENTRY(3744),
            REG_ENTRY(3745),
            REG_ENTRY(3746),
            REG_ENTRY(3747),
            REG_ENTRY(3748),
            REG_ENTRY(3749),
            REG_ENTRY(3750),
            REG_ENTRY(3751),
            REG_ENTRY(3752),
            REG_ENTRY(3753),
            REG_ENTRY(3754),
            REG_ENTRY(3755),
            REG_ENTRY(3756),
            REG_ENTRY(3757),
            REG_ENTRY(3758),
            REG_ENTRY(3759),
            REG_ENTRY(3760),
            REG_ENTRY(3761),
            REG_ENTRY(3762),
            REG_ENTRY(3763),
            REG_ENTRY(3764),
            REG_ENTRY(3765),
            REG_ENTRY(3766),
            REG_ENTRY(3767),
            REG_ENTRY(3768),
            REG_ENTRY(3769),
            REG_ENTRY(3770),
            REG_ENTRY(3771),
            REG_ENTRY(3772),
            REG_ENTRY(3773),
            REG_ENTRY(3774),
            REG_ENTRY(3775),
            REG_ENTRY(3776),
            REG_ENTRY(3777),
            REG_ENTRY(3778),
            REG_ENTRY(3779),
            REG_ENTRY(3780),
            REG_ENTRY(3781),
            REG_ENTRY(3782),
            REG_ENTRY(3783),
            REG_ENTRY(3784),
            REG_ENTRY(3785),
            REG_ENTRY(3786),
            REG_ENTRY(3787),
            REG_ENTRY(3788),
            REG_ENTRY(3789),
            REG_ENTRY(3790),
            REG_ENTRY(3791),
            REG_ENTRY(3792),
            REG_ENTRY(3793),
            REG_ENTRY(3794),
            REG_ENTRY(3795),
            REG_ENTRY(3796),
            REG_ENTRY(3797),
            REG_ENTRY(3798),
            REG_ENTRY(3799),
            REG_ENTRY(3800),
            REG_ENTRY(3801),
            REG_ENTRY(3802),
            REG_ENTRY(3803),
            REG_ENTRY(3804),
            REG_ENTRY(3805),
            REG_ENTRY(3806),
            REG_ENTRY(3807),
            REG_ENTRY(3808),
            REG_ENTRY(3809),
            REG_ENTRY(3810),
            REG_ENTRY(3811),
            REG_ENTRY(3812),
            REG_ENTRY(3813),
            REG_ENTRY(3814),
            REG_ENTRY(3815),
            REG_ENTRY(3816),
            REG_ENTRY(3817),
            REG_ENTRY(3818),
            REG_ENTRY(3819),
            REG_ENTRY(3820),
            REG_ENTRY(3821),
            REG_ENTRY(3822),
            REG_ENTRY(3823),
            REG_ENTRY(3824),
            REG_ENTRY(3825),
            REG_ENTRY(3826),
            REG_ENTRY(3827),
            REG_ENTRY(3828),
            REG_ENTRY(3829),
            REG_ENTRY(3830),
            REG_ENTRY(3831),
            REG_ENTRY(3832),
            REG_ENTRY(3833),
            REG_ENTRY(3834),
            REG_ENTRY(3835),
            REG_ENTRY(3836),
            REG_ENTRY(3837),
            REG_ENTRY(3838),
            REG_ENTRY(3839),
            REG_ENTRY(3840),
            REG_ENTRY(3841),
            REG_ENTRY(3842),
            REG_ENTRY(3843),
            REG_ENTRY(3844),
            REG_ENTRY(3845),
            REG_ENTRY(3846),
            REG_ENTRY(3847),
            REG_ENTRY(3848),
            REG_ENTRY(3849),
            REG_ENTRY(3850),
            REG_ENTRY(3851),
            REG_ENTRY(3852),
            REG_ENTRY(3853),
            REG_ENTRY(3854),
            REG_ENTRY(3855),
            REG_ENTRY(3856),
            REG_ENTRY(3857),
            REG_ENTRY(3858),
            REG_ENTRY(3859),
            REG_ENTRY(3860),
            REG_ENTRY(3861),
            REG_ENTRY(3862),
            REG_ENTRY(3863),
            REG_ENTRY(3864),
            REG_ENTRY(3865),
            REG_ENTRY(3866),
            REG_ENTRY(3867),
            REG_ENTRY(3868),
            REG_ENTRY(3869),
            REG_ENTRY(3870),
            REG_ENTRY(3871),
            REG_ENTRY(3872),
            REG_ENTRY(3873),
            REG_ENTRY(3874),
            REG_ENTRY(3875),
            REG_ENTRY(3876),
            REG_ENTRY(3877),
            REG_ENTRY(3878),
            REG_ENTRY(3879),
            REG_ENTRY(3880),
            REG_ENTRY(3881),
            REG_ENTRY(3882),
            REG_ENTRY(3883),
            REG_ENTRY(3884),
            REG_ENTRY(3885),
            REG_ENTRY(3886),
            REG_ENTRY(3887),
            REG_ENTRY(3888),
            REG_ENTRY(3889),
            REG_ENTRY(3890),
            REG_ENTRY(3891),
            REG_ENTRY(3892),
            REG_ENTRY(3893),
            REG_ENTRY(3894),
            REG_ENTRY(3895),
            REG_ENTRY(3896),
            REG_ENTRY(3897),
            REG_ENTRY(3898),
            REG_ENTRY(3899),
            REG_ENTRY(3900),
            REG_ENTRY(3901),
            REG_ENTRY(3902),
            REG_ENTRY(3903),
            REG_ENTRY(3904),
            REG_ENTRY(3905),
            REG_ENTRY(3906),
            REG_ENTRY(3907),
            REG_ENTRY(3908),
            REG_ENTRY(3909),
            REG_ENTRY(3910),
            REG_ENTRY(3911),
            REG_ENTRY(3912),
            REG_ENTRY(3913),
            REG_ENTRY(3914),
            REG_ENTRY(3915),
            REG_ENTRY(3916),
            REG_ENTRY(3917),
            REG_ENTRY(3918),
            REG_ENTRY(3919),
            REG_ENTRY(3920),
            REG_ENTRY(3921),
            REG_ENTRY(3922),
            REG_ENTRY(3923),
            REG_ENTRY(3924),
            REG_ENTRY(3925),
            REG_ENTRY(3926),
            REG_ENTRY(3927),
            REG_ENTRY(3928),
            REG_ENTRY(3929),
            REG_ENTRY(3930),
            REG_ENTRY(3931),
            REG_ENTRY(3932),
            REG_ENTRY(3933),
            REG_ENTRY(3934),
            REG_ENTRY(3935),
            REG_ENTRY(3936),
            REG_ENTRY(3937),
            REG_ENTRY(3938),
            REG_ENTRY(3939),
            REG_ENTRY(3940),
            REG_ENTRY(3941),
            REG_ENTRY(3942),
            REG_ENTRY(3943),
            REG_ENTRY(3944),
            REG_ENTRY(3945),
            REG_ENTRY(3946),
            REG_ENTRY(3947),
            REG_ENTRY(3948),
            REG_ENTRY(3949),
            REG_ENTRY(3950),
            REG_ENTRY(3951),
            REG_ENTRY(3952),
            REG_ENTRY(3953),
            REG_ENTRY(3954),
            REG_ENTRY(3955),
            REG_ENTRY(3956),
            REG_ENTRY(3957),
            REG_ENTRY(3958),
            REG_ENTRY(3959),
            REG_ENTRY(3960),
            REG_ENTRY(3961),
            REG_ENTRY(3962),
            REG_ENTRY(3963),
            REG_ENTRY(3964),
            REG_ENTRY(3965),
            REG_ENTRY(3966),
            REG_ENTRY(3967),
            REG_ENTRY(3968),
            REG_ENTRY(3969),
            REG_ENTRY(3970),
            REG_ENTRY(3971),
            REG_ENTRY(3972),
            REG_ENTRY(3973),
            REG_ENTRY(3974),
            REG_ENTRY(3975),
            REG_ENTRY(3976),
            REG_ENTRY(3977),
            REG_ENTRY(3978),
            REG_ENTRY(3979),
            REG_ENTRY(3980),
            REG_ENTRY(3981),
            REG_ENTRY(3982),
            REG_ENTRY(3983),
            REG_ENTRY(3984),
            REG_ENTRY(3985),
            REG_ENTRY(3986),
            REG_ENTRY(3987),
            REG_ENTRY(3988),
            REG_ENTRY(3989),
            REG_ENTRY(3990),
            REG_ENTRY(3991),
            REG_ENTRY(3992),
            REG_ENTRY(3993),
            REG_ENTRY(3994),
            REG_ENTRY(3995),
            REG_ENTRY(3996),
            REG_ENTRY(3997),
            REG_ENTRY(3998),
            REG_ENTRY(3999),
            REG_ENTRY(4000),
            REG_ENTRY(4001),
            REG_ENTRY(4002),
            REG_ENTRY(4003),
            REG_ENTRY(4004),
            REG_ENTRY(4005),
            REG_ENTRY(4006),
            REG_ENTRY(4007),
            REG_ENTRY(4008),
            REG_ENTRY(4009),
            REG_ENTRY(4010),
            REG_ENTRY(4011),
            REG_ENTRY(4012),
            REG_ENTRY(4013),
            REG_ENTRY(4014),
            REG_ENTRY(4015),
            REG_ENTRY(4016),
            REG_ENTRY(4017),
            REG_ENTRY(4018),
            REG_ENTRY(4019),
            REG_ENTRY(4020),
            REG_ENTRY(4021),
            REG_ENTRY(4022),
            REG_ENTRY(4023),
            REG_ENTRY(4024),
            REG_ENTRY(4025),
            REG_ENTRY(4026),
            REG_ENTRY(4027),
            REG_ENTRY(4028),
            REG_ENTRY(4029),
            REG_ENTRY(4030),
            REG_ENTRY(4031),
            REG_ENTRY(4032),
            REG_ENTRY(4033),
            REG_ENTRY(4034),
            REG_ENTRY(4035),
            REG_ENTRY(4036),
            REG_ENTRY(4037),
            REG_ENTRY(4038),
            REG_ENTRY(4039),
            REG_ENTRY(4040),
            REG_ENTRY(4041),
            REG_ENTRY(4042),
            REG_ENTRY(4043),
            REG_ENTRY(4044),
            REG_ENTRY(4045),
            REG_ENTRY(4046),
            REG_ENTRY(4047),
            REG_ENTRY(4048),
            REG_ENTRY(4049),
            REG_ENTRY(4050),
            REG_ENTRY(4051),
            REG_ENTRY(4052),
            REG_ENTRY(4053),
            REG_ENTRY(4054),
            REG_ENTRY(4055),
            REG_ENTRY(4056),
            REG_ENTRY(4057),
            REG_ENTRY(4058),
            REG_ENTRY(4059),
            REG_ENTRY(4060),
            REG_ENTRY(4061),
            REG_ENTRY(4062),
            REG_ENTRY(4063),
            REG_ENTRY(4064),
            REG_ENTRY(4065),
            REG_ENTRY(4066),
            REG_ENTRY(4067),
            REG_ENTRY(4068),
            REG_ENTRY(4069),
            REG_ENTRY(4070),
            REG_ENTRY(4071),
            REG_ENTRY(4072),
            REG_ENTRY(4073),
            REG_ENTRY(4074),
            REG_ENTRY(4075),
            REG_ENTRY(4076),
            REG_ENTRY(4077),
            REG_ENTRY(4078),
            REG_ENTRY(4079),
            REG_ENTRY(4080),
            REG_ENTRY(4081),
            REG_ENTRY(4082),
            REG_ENTRY(4083),
            REG_ENTRY(4084),
            REG_ENTRY(4085),
            REG_ENTRY(4086),
            REG_ENTRY(4087),
            REG_ENTRY(4088),
            REG_ENTRY(4089),
            REG_ENTRY(4090),
            REG_ENTRY(4091),
            REG_ENTRY(4092),
            REG_ENTRY(4093),
            REG_ENTRY(4094),
            REG_ENTRY(4095),
            /* sorry for this; but since it's a hacker module, it shouldn't be that bad */
            /* 256 is not enough... */
            MENU_EOL,
        }
    }
};

static unsigned int adtg_gui_init()
{
    if (is_camera("5D3", "1.1.3"))
    {
        ADTG_WRITE_FUNC = 0x11640;
        CMOS_WRITE_FUNC = 0x119CC;
        CMOS2_WRITE_FUNC = 0x11784;
        CMOS16_WRITE_FUNC = 0x11AB8;
        ENGIO_WRITE_FUNC = 0xff28cc3c;
        ENG_DRV_OUT_FUNC = 0xff28c92c;
    }
    else if (is_camera("5D3", "1.2.3"))
    {
        ADTG_WRITE_FUNC = 0x11640;
        CMOS_WRITE_FUNC = 0x119CC;
        CMOS2_WRITE_FUNC = 0x11784;
        CMOS16_WRITE_FUNC = 0x11AB8;
        ENGIO_WRITE_FUNC = 0xFF290F98;
        ENG_DRV_OUT_FUNC = 0xFF290C80;
    }
    else if (is_camera("5D2", "2.1.2"))
    {
        ADTG_WRITE_FUNC = 0xffa35cbc;
        CMOS_WRITE_FUNC = 0xffa35e70;
        ENGIO_WRITE_FUNC = 0xFF9A5618;  // from stubs
        //~ ENG_DRV_OUT_FUNC = 0xff9a54a8;  /* this causes ADTG hook to stop working (why?) */
        ENG_DRV_OUTS_FUNC = 0xff9a5554;
        SEND_DATA_TO_DFE_FUNC = 0xff9b1d94;
        //~ SCS_DUMMY_READOUT_DONE_FUNC = 0xff880600;
    }
    else if (is_camera("7D", "2.0.3"))
    {
        ADTG_WRITE_FUNC = 0xFF2C0944; //"[REG] @@@@@@@@@@@@ Start ADTG[CS:%lx]"
        CMOS_WRITE_FUNC = 0xFF2C0B3C; //"[REG] ############ Start CMOS"
        ENGIO_WRITE_FUNC = 0xFF1F6B20;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF1F675C;
        SEND_DATA_TO_DFE_FUNC = 0xFF32B800; //"[REG] DFE:[%#lx]"
    }
    else if (is_camera("500D", "1.1.1")) // http://www.magiclantern.fm/forum/index.php?topic=6751.msg70325#msg70325
    {
        ADTG_WRITE_FUNC = 0xFF22F8F4; //"[REG] @@@@@@@@@@@@ Start ADTG[CS:%lx]"
        CMOS_WRITE_FUNC = 0xFF22F9DC; //"[REG] ############ Start CMOS"
        ENGIO_WRITE_FUNC = 0xFF190CF4;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF190B84;
    }
    else if (is_camera("550D", "1.0.9")) // http://www.magiclantern.fm/forum/index.php?topic=6751.msg61551#msg61551
    {
        ADTG_WRITE_FUNC = 0xff27ee34;
        CMOS_WRITE_FUNC = 0xff27f028;
        ENGIO_WRITE_FUNC = 0xFF1C15CC;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF1C1260;
    }
    else if (is_camera("60D", "1.1.1")) // http://www.magiclantern.fm/forum/index.php?topic=6751.msg69719#msg69719
    {
        ADTG_WRITE_FUNC = 0xFF2C9788; //"[REG] @@@@@@@@@@@@ Start ADTG[CS:%lx]"
        CMOS_WRITE_FUNC = 0xFF2C997C; //"[REG] ############ Start CMOS"
        ENGIO_WRITE_FUNC = 0xFF1C5A68;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF1C56A4;
    }
    else if (is_camera("70D", "1.1.2"))
    {
        ADTG_WRITE_FUNC = 0x2684c; //"[REG] @@@@@@@@@@@@ Start ADTG[CS:%lx]"
        CMOS_WRITE_FUNC = 0x26B54; //"[REG] ############ Start CMOS"
        ENGIO_WRITE_FUNC = 0xFF2BC6C4;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF2BC3AC;
    }
    else if (is_camera("50D", "1.0.9")) // http://www.magiclantern.fm/forum/index.php?topic=6751.msg63322#msg63322
    {
        ADTG_WRITE_FUNC = 0xFFA11FDC;
        CMOS_WRITE_FUNC = 0xFFA12190;
        ENGIO_WRITE_FUNC = 0xFF97D904;  // from stubs
        ENG_DRV_OUT_FUNC = 0xff97d794;
        SEND_DATA_TO_DFE_FUNC = 0xffa71598;
    }
    else if (is_camera("6D", "1.1.6")) // from 1% (match 6D.113), JL, checked by Maqs
    {
        CMOS_WRITE_FUNC = 0x2445C; //"[REG] ############ Start CMOS OC_KICK"
        CMOS2_WRITE_FUNC = 0x2420C; //"[REG] ############ Start CMOS"
        ADTG_WRITE_FUNC = 0x24108; //"[REG] @@@@@@@@@@@@ Start ADTG[CS:%lx]"
        CMOS16_WRITE_FUNC = 0x24548; //"[REG] ############ Start CMOS16 OC_KICK"
        ENGIO_WRITE_FUNC = 0xFF2AE134;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF2ADE1C;
    }
    else if (is_camera("EOSM", "2.0.2")) // from 1%
    {
        ADTG_WRITE_FUNC = 0x2986C;
        CMOS_WRITE_FUNC = 0x2998C;
        ENGIO_WRITE_FUNC = 0xFF2C19AC;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF2C1694;
    }
    else if (is_camera("EOSM2", "1.0.3"))
    {
        ADTG_WRITE_FUNC = 0x42E34;
        CMOS_WRITE_FUNC = 0x432A4; /* missing */
        ENGIO_WRITE_FUNC = 0xFF2C6F44;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF2C6C2C; 
    }
    else if (is_camera("600D", "1.0.2")) // from 1% TL 2.0
    {
        ADTG_WRITE_FUNC = 0xFF2DCEF4; //"[REG] @@@@@@@@@@@@ Start ADTG[CS:%lx]"
        CMOS_WRITE_FUNC = 0xFF2DD0E8; //"[REG] ############ Start CMOS"
        ENGIO_WRITE_FUNC = 0xFF1E1D20;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF1E195C;
    }
    else if (is_camera("650D", "1.0.4"))
    {
        ADTG_WRITE_FUNC = 0x178FC; //"[REG] @@@@@@@@@@@@ Start ADTG[CS:%lx]"
        CMOS_WRITE_FUNC = 0x17A1C; //"[REG] ############ Start CMOS"
        ENGIO_WRITE_FUNC = 0xFF2C0778;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF2C0460;
    }
    else if (is_camera("700D", "1.1.5"))
    {
        ADTG_WRITE_FUNC = 0x178FC; //"[REG] @@@@@@@@@@@@ Start ADTG[CS:%lx]"
        CMOS_WRITE_FUNC = 0x17A1C; //"[REG] ############ Start CMOS"
        ENGIO_WRITE_FUNC = 0xFF2C2D00;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF2C29E8;
    }
    else if (is_camera("100D", "1.0.1"))
    {
        ADTG_WRITE_FUNC = 0x47144; //"[REG] @@@@@@@@@@@@ Start ADTG[CS:%lx]"
        CMOS_WRITE_FUNC = 0x475B8; //"[REG] ############ Start CMOS"
        ENGIO_WRITE_FUNC = 0xFF2B2460;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF2B2148;
    }
    else if (is_camera("1100D", "1.0.5"))
    {
        ADTG_WRITE_FUNC = 0xFF2DBB28;
        CMOS_WRITE_FUNC = 0xFF2DBD1C;
        ENGIO_WRITE_FUNC = 0xFF1D4C8C;  // from stubs
        ENG_DRV_OUT_FUNC = 0xFF1D48C8;
    }
    else return CBR_RET_ERROR;

    regs_tree.compar = cmp_reg;
    regs_tree.root = 0;

    menu_add("Debug", adtg_gui_menu, COUNT(adtg_gui_menu));
    ASSERT(adtg_gui_menu->children->parent_menu);
    adtg_gui_menu->children->parent_menu->no_name_lookup = 1;

    /* check known registers for duplicates */
    for (int i = 0; i < COUNT(known_regs); i++)
    {
        for (int j = 0; j < i; j++)
        {
            if ((known_regs[i].dst == known_regs[j].dst) &&
                (known_regs[i].reg == known_regs[j].reg))
            {
                NotifyBox(2000, "Duplicate reg: %x %x\n", known_regs[i].dst, known_regs[i].reg);
                return CBR_RET_ERROR;
            }
        }
    }

    return 0;
}

static unsigned int adtg_gui_deinit()
{
    return 0;
}

MODULE_INFO_START()
    MODULE_INIT(adtg_gui_init)
    MODULE_DEINIT(adtg_gui_deinit)
MODULE_INFO_END()

MODULE_CBRS_START()
    MODULE_CBR(CBR_VSYNC, adtg_vsync_cbr, 0)
    MODULE_CBR(CBR_VSYNC_SETPARAM, adtg_vsync_setparam_cbr, 0)
MODULE_CBRS_END()

MODULE_PROPHANDLERS_START()
    MODULE_PROPHANDLER(PROP_GUI_STATE)
MODULE_PROPHANDLERS_END()
back to top