]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/blobdiff - drivers/iio/imu/nvi_mpu/nvi_dmp_icm.c
iio: imu: nvi v.333 ICM DMP FW v.2
[sojka/nv-tegra/linux-3.10.git] / drivers / iio / imu / nvi_mpu / nvi_dmp_icm.c
index 85da5457f572d72ccefca62a48354c36a1c317af..b7684f931c9878ff358812ed1e55a90d227aa023 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <linux/delay.h>
+#include <linux/kernel.h>
 #include "nvi.h"
 #include "nvi_dmp_icm.h"
 
                                         (1 << DEV_QTN) | \
                                         (1 << DEV_GMR) | \
                                         (1 << DEV_GYU))
+#define AUX_PORT_DEV_GMF               (0)
+#define MSK_AUX_PORTS_DEV_GMF          (0x3)
+#define AUX_PORT_DEV_PRS               (3)
+#define MSK_AUX_PORTS_DEV_PRS          (0x8)
+#define MSK_EN_AUX_PORTS               (((1 << (AUX_PORT_IO + DEV_N_AUX)) - \
+                                         1) & ~MSK_DEV_SNSR)
+
 #define DEFAULT_ACCEL_GAIN             (0x02000000)
 #define PED_ACCEL_GAIN                 (0x04000000)
 #define DMP_ACC_PERIOD_US_PED          (19608)
@@ -27,7 +35,6 @@
 #define DMP_HDR1_HDR2_MSK              (0x0008)
 #define DMP_HDR1_PUSH_MSK              (0xFEF0)
 #define DMP_DATA_OUT_CTL_HDR2_MSK      (0x0000FFFF)
-#define DMP_DATA_OUT_CTL_HDR2_BIT      (0x00080000)
 
 
 struct nvi_dmp_dev {
@@ -38,12 +45,14 @@ struct nvi_dmp_dev {
        unsigned int period_us_dflt;
        unsigned int buf_n;
        int buf_shft;
-       u32 out_ctl;
-       u16 int_ctl;
+       u32 int_ctl;
        u16 odr_cfg;
        u16 odr_cntr;
-       int (*fn_init)(struct nvi_state *st, unsigned int en_msk,
-                      u32 *out_ctl);
+       unsigned int odr_src;
+       int (*fn_init)(struct nvi_state *st, u32 *out_ctl,
+                      unsigned int en_msk, unsigned int irq_msk);
+       int (*fn_initd)(struct nvi_state *st, u32 *out_ctl,
+                       unsigned int en_msk, unsigned int irq_msk);
 };
 
 struct nvi_dmp_hdr {
@@ -54,6 +63,64 @@ struct nvi_dmp_hdr {
 };
 
 
+struct inv_dmp_acc_scale {
+       u32 scale;
+       u32 scale2;
+};
+
+/* input param: fsr for accel parts
+ * 1: 1g. 2: 2g. 4: 4g. 8: 8g. 16: 16g. 32: 32g.
+ * The goal is to set 1g data to 2^25, 2g data to 2^26, etc.
+ * For 2g parts, raw accel data is 1g = 2^14, 2g = 2^15.
+ * DMP takes raw accel data and shifts by 16 bits, so this scale means to shift
+ * by -5 bits.
+ * In Q-30 math, >> 5 equals multiply by 2^25 = 33554432.
+ * For 8g parts, raw accel data is 4g = 2^14, 8g = 2^15.
+ * DMP takes raw accel data and shifts by 16 bits, so this scale means to shift
+ * by -3 bits.
+ * In Q-30 math, >> 3 equals multiply by 2^27 = 134217728.
+ */
+static struct inv_dmp_acc_scale inv_dmp_acc_scales[] = {
+       {
+               .scale                  = 0x02000000,
+               .scale2                 = 0x00080000,
+       },
+       {
+               .scale                  = 0x04000000,
+               .scale2                 = 0x00040000,
+       },
+       {
+               .scale                  = 0x08000000,
+               .scale2                 = 0x00020000,
+       },
+       {
+               .scale                  = 0x10000000,
+               .scale2                 = 0x00010000,
+       },
+};
+
+static int nvi_dmp_acc_init(struct nvi_state *st, u32 *out_ctl,
+                           unsigned int en_msk, unsigned int irq_msk)
+{
+       int ret = 0;
+#if ICM_DMP_FW_VER == 2
+       unsigned int i;
+
+       i = st->snsr[DEV_ACC].usr_cfg;
+       ret |= nvi_mem_wr_be_mc(st, ACC_SCALE, 4,
+                               inv_dmp_acc_scales[i].scale,
+                               &st->mc.icm.acc_scale);
+       ret |= nvi_mem_wr_be_mc(st, ACC_SCALE2, 4,
+                               inv_dmp_acc_scales[i].scale2,
+                               &st->mc.icm.acc_scale2);
+#endif /* ICM_DMP_FW_VER */
+       ret |= st->hal->fn->en_acc(st);
+       if (irq_msk & (1 << DEV_ACC) || en_msk & ((1 << DEV_QTN) |
+                                                 (1 << DEV_GMR)))
+               *out_ctl |= ACCEL_ACCURACY_SET;
+       return ret;
+}
+
 struct inv_dmp_acc_wtf {
        unsigned int period_us;
        unsigned int rate;
@@ -100,8 +167,8 @@ static struct inv_dmp_acc_wtf inv_dmp_acc_wtfs[] = {
        },
 };
 
-static int nvi_dmp_acc_init(struct nvi_state *st, unsigned int en_msk,
-                           u32 *out_ctl)
+static int nvi_dmp_acc_initd(struct nvi_state *st, u32 *out_ctl,
+                            unsigned int en_msk, unsigned int irq_msk)
 {
        unsigned int min_diff = -1;
        unsigned int tmp;
@@ -109,7 +176,6 @@ static int nvi_dmp_acc_init(struct nvi_state *st, unsigned int en_msk,
        unsigned int j;
        int ret;
 
-       ret = st->hal->fn->en_acc(st);
        i = ARRAY_SIZE(inv_dmp_acc_wtfs) - 1;
        if (st->src[SRC_ACC].period_us_src > inv_dmp_acc_wtfs[i].period_us) {
                /* i = ARRAY_SIZE(inv_dmp_acc_wtfs) - 1 */
@@ -127,9 +193,8 @@ static int nvi_dmp_acc_init(struct nvi_state *st, unsigned int en_msk,
                }
        }
 
-       ret |= nvi_mem_wr_be_mc(st, ACCEL_CAL_RATE, 2,
-                               inv_dmp_acc_wtfs[i].rate,
-                               &st->mc.icm.accel_cal_rate);
+       ret = nvi_mem_wr_be_mc(st, ACCEL_CAL_RATE, 2, inv_dmp_acc_wtfs[i].rate,
+                              &st->mc.icm.accel_cal_rate);
        ret |= nvi_mem_wr_be_mc(st, PED_RATE, 4, inv_dmp_acc_wtfs[i].rate,
                                &st->mc.icm.ped_rate);
        ret |= nvi_mem_wr_be_mc(st, ACCEL_ALPHA_VAR, 4,
@@ -143,6 +208,27 @@ static int nvi_dmp_acc_init(struct nvi_state *st, unsigned int en_msk,
        return ret;
 }
 
+/* gmf = GeoMagnetic Field (compass) */
+static int nvi_dmp_gmf_init(struct nvi_state *st, u32 *out_ctl,
+                           unsigned int en_msk, unsigned int irq_msk)
+{
+       if (st->aux.port[AUX_PORT_DEV_GMF].nmp.type !=
+                                                 SECONDARY_SLAVE_TYPE_COMPASS)
+               /* disable without error if no compass */
+               return 1;
+
+       if (!st->aux.port[AUX_PORT_DEV_GMF].nmp.handler)
+               /* no handler */
+               return 1;
+
+       st->src[SRC_AUX].period_us_max =
+                                      st->hal->src[SRC_AUX].period_us_min * 8;
+       if (irq_msk & (1 << (AUX_PORT_DEV_GMF + DEV_N_AUX)) ||
+                                                      en_msk & (1 << DEV_GMR))
+               *out_ctl |= CPASS_ACCURACY_SET;
+       return 0;
+}
+
 struct inv_dmp_gmf_wtf {
        unsigned int period_us;
        unsigned int ct;
@@ -196,8 +282,8 @@ static struct inv_dmp_gmf_wtf inv_dmp_gmf_wtfs[] = {
 };
 
 /* gmf = GeoMagnetic Field (compass) */
-static int nvi_dmp_gmf_init(struct nvi_state *st, unsigned int en_msk,
-                           u32 *out_ctl)
+static int nvi_dmp_gmf_initd(struct nvi_state *st, u32 *out_ctl,
+                            unsigned int en_msk, unsigned int irq_msk)
 {
        unsigned int min_diff = -1;
        unsigned int tmp;
@@ -205,10 +291,6 @@ static int nvi_dmp_gmf_init(struct nvi_state *st, unsigned int en_msk,
        unsigned int j;
        int ret;
 
-       if (st->aux.port[0].nmp.type != SECONDARY_SLAVE_TYPE_COMPASS)
-               /* DMP shouldn't run if AUX device not supported */
-               return -EINVAL;
-
        i = ARRAY_SIZE(inv_dmp_gmf_wtfs) - 1;
        if (st->src[SRC_AUX].period_us_src > inv_dmp_gmf_wtfs[i].period_us) {
                /* i = ARRAY_SIZE(inv_dmp_gmf_wtfs) - 1 */
@@ -229,38 +311,48 @@ static int nvi_dmp_gmf_init(struct nvi_state *st, unsigned int en_msk,
        ret = nvi_mem_wr_be_mc(st, CPASS_TIME_BUFFER, 2,
                               inv_dmp_gmf_wtfs[i].ct,
                               &st->mc.icm.cpass_time_buffer);
+       ret |= nvi_mem_wr_be_mc(st,
+                               CPASS_RADIUS_3D_THRESH_ANOMALY, 4,
+                               inv_dmp_gmf_wtfs[i].rad_3d,
+                               &st->mc.icm.cpass_rad_3d_thr);
+#if ICM_DMP_FW_VER == 0
        ret |= nvi_mem_wr_be_mc(st, CPASS_ALPHA_VAR, 4,
                                inv_dmp_gmf_wtfs[i].alpha_c,
                                &st->mc.icm.cpass_alpha_var);
        ret |= nvi_mem_wr_be_mc(st, CPASS_A_VAR, 4,
                                inv_dmp_gmf_wtfs[i].a_c,
                                &st->mc.icm.cpass_a_var);
-       ret |= nvi_mem_wr_be_mc(st,
-                               CPASS_RADIUS_3D_THRESH_ANOMALY, 4,
-                               inv_dmp_gmf_wtfs[i].rad_3d,
-                               &st->mc.icm.cpass_rad_3d_thr);
        ret |= nvi_mem_wr_be_mc(st, CPASS_NOMOT_VAR_THRESH, 4,
                                inv_dmp_gmf_wtfs[i].nomot_var_thr,
                                &st->mc.icm.cpass_nomot_var_thr);
+#endif /* ICM_DMP_FW_VER */
        return ret;
 }
 
 /* prs = pressure */
-static int nvi_dmp_prs_init(struct nvi_state *st, unsigned int en_msk,
-                           u32 *out_ctl)
+static int nvi_dmp_prs_init(struct nvi_state *st, u32 *out_ctl,
+                           unsigned int en_msk, unsigned int irq_msk)
 {
-       return 1;
+       if (st->aux.port[AUX_PORT_DEV_PRS].nmp.type !=
+                                                SECONDARY_SLAVE_TYPE_PRESSURE)
+               /* disable without error if no pressure */
+               return 1;
+
+       return 0;
 }
 
-static int nvi_dmp_gyr_init(struct nvi_state *st, unsigned int en_msk,
-                           u32 *out_ctl)
+static int nvi_dmp_gyr_init(struct nvi_state *st, u32 *out_ctl,
+                           unsigned int en_msk, unsigned int irq_msk)
 {
+       if (irq_msk & (1 << DEV_GYR) || en_msk & ((1 << DEV_QTN) |
+                                                 (1 << DEV_GMR)))
+               *out_ctl |= GYRO_ACCURACY_SET;
        st->snsr[DEV_GYR].sts = 1;
        return st->hal->fn->en_gyr(st);
 }
 
-static int nvi_dmp_sm_init(struct nvi_state *st, unsigned int en_msk,
-                          u32 *out_ctl)
+static int nvi_dmp_sm_init(struct nvi_state *st, u32 *out_ctl,
+                          unsigned int en_msk, unsigned int irq_msk)
 {
 #if ICM_DMP_FW_VER == 0
        int ret;
@@ -275,71 +367,79 @@ static int nvi_dmp_sm_init(struct nvi_state *st, unsigned int en_msk,
                                st->snsr[DEV_SM].cfg.delay_us_max,
                                &st->mc.icm.smd_delay2_thld);
        return ret;
-#else /* ICM_DMP_FW_VER */
-       /* ICM_DMP_FW_VER == 1 */
+#elif ICM_DMP_FW_VER == 1
        return nvi_mem_wr_be_mc(st, SMD_TIMER_THLD, 4,
                                st->snsr[DEV_SM].cfg.thresh_hi,
                                &st->mc.icm.smd_timer_thld);
+#elif ICM_DMP_FW_VER == 2
+       return nvi_mem_wr_be_mc(st, SMD_CNTR_TH, 4,
+                               st->snsr[DEV_SM].cfg.thresh_hi,
+                               &st->mc.icm.smd_timer_thld);
+#else
+       return 0;
 #endif /* ICM_DMP_FW_VER */
 }
 
-static int nvi_dmp_gmr_init(struct nvi_state *st, unsigned int en_msk,
-                           u32 *out_ctl)
+static int nvi_dmp_gmr_init(struct nvi_state *st, u32 *out_ctl,
+                           unsigned int en_msk, unsigned int irq_msk)
 {
-       if (out_ctl) {
-               if (en_msk & ((1 << DEV_GYR) | (1 << DEV_GYU)))
-                       /* if gyro is enabled GMR becomes QTN 9-axis */
-                       *out_ctl |= 0x04000000;
-               else
-                       *out_ctl |= 0x04000200;
-       }
+       if (en_msk & ((1 << DEV_GYR) | (1 << DEV_GYU)))
+               /* if gyro is enabled GMR becomes QTN 9-axis */
+               st->src[SRC_AUX].period_us_min =
+                                      st->hal->src[SRC_AUX].period_us_min * 2;
+       else
+               /* gyro not enabled so GMR enabled */
+               *out_ctl |= GEOMAG_EN;
        return 0;
 }
 
 static struct nvi_dmp_dev nvi_dmp_devs[] = {
        {
                .dev                    = DEV_ACC,
+#if ICM_DMP_FW_VER == 2
+               .buf_n                  = 6,
+               .buf_shft               = 0,
+#else /* ICM_DMP_FW_VER < 2 */
                .buf_n                  = 12,
                .buf_shft               = -11,
-               .out_ctl                = 0x80004000,
+#endif /* ICM_DMP_FW_VER */
                .int_ctl                = ACCEL_SET,
                .odr_cfg                = ODR_ACCEL,
                .odr_cntr               = ODR_CNTR_ACCEL,
+               .odr_src                = SRC_ACC,
                .fn_init                = &nvi_dmp_acc_init,
+               .fn_initd               = &nvi_dmp_acc_initd,
        },
        {
                .dev                    = DEV_GYR,
-               .depend_msk             = (1 << DEV_GYU),
                .buf_n                  = 12,
-               .out_ctl                = 0x00402000,
                .int_ctl                = GYRO_CALIBR_SET,
                .odr_cfg                = ODR_GYRO_CALIBR,
                .odr_cntr               = ODR_CNTR_GYRO_CALIBR,
+               .odr_src                = SRC_GYR,
                .fn_init                = &nvi_dmp_gyr_init,
        },
        {
                .dev                    = DEV_GYU,
                .depend_msk             = (1 << DEV_GYR),
                .buf_n                  = 6,
-               .out_ctl                = 0x40000000,
                .int_ctl                = GYRO_SET,
                .odr_cfg                = ODR_GYRO,
                .odr_cntr               = ODR_CNTR_GYRO,
+               .odr_src                = SRC_GYR,
        },
        {
                .dev                    = DEV_QTN,
                .depend_msk             = (1 << DEV_ACC) |
-                                         (1 << DEV_GYR) |
-                                         (1 << DEV_GYU),
+                                         (1 << DEV_GYR),
                .src_msk                = (1 << SRC_ACC) |
-                                         (1 << SRC_GYR) |
-                                         (1 << SRC_AUX),
+                                         (1 << SRC_GYR),
                .period_us_dflt         = ICM_DMP_PERIOD_US,
                .buf_n                  = 12,
-               .out_ctl                = 0x08000000,
                .int_ctl                = QUAT6_SET,
                .odr_cfg                = ODR_QUAT6,
                .odr_cntr               = ODR_CNTR_QUAT6,
+               .odr_src                = SRC_GYR,
        },
        {
                .dev                    = DEV_GMR,
@@ -353,6 +453,7 @@ static struct nvi_dmp_dev nvi_dmp_devs[] = {
                .int_ctl                = QUAT9_SET,
                .odr_cfg                = ODR_QUAT9,
                .odr_cntr               = ODR_CNTR_QUAT9,
+               .odr_src                = SRC_ACC,
                .fn_init                = &nvi_dmp_gmr_init,
        },
        {
@@ -365,24 +466,24 @@ static struct nvi_dmp_dev nvi_dmp_devs[] = {
        },
        {
                .dev                    = DEV_AUX,
-               .aux_port               = 0,
-               .depend_msk             = (0x03 << DEV_N_AUX),
+               .aux_port               = AUX_PORT_DEV_GMF,
+               .depend_msk             = (MSK_AUX_PORTS_DEV_GMF << DEV_N_AUX),
                .buf_n                  = 6,
-               .out_ctl                = 0x20001000,
                .int_ctl                = CPASS_SET,
                .odr_cfg                = ODR_CPASS,
                .odr_cntr               = ODR_CNTR_CPASS,
+               .odr_src                = SRC_AUX,
                .fn_init                = &nvi_dmp_gmf_init,
+               .fn_initd               = &nvi_dmp_gmf_initd,
        },
        {
                .dev                    = DEV_AUX,
-               .aux_port               = 2,
-               .depend_msk             = (0x0C << DEV_N_AUX),
+               .aux_port               = AUX_PORT_DEV_PRS,
                .buf_n                  = 6,
-               .out_ctl                = 0x00800000,
                .int_ctl                = PRESSURE_SET,
                .odr_cfg                = ODR_PRESSURE,
                .odr_cntr               = ODR_CNTR_PRESSURE,
+               .odr_src                = SRC_AUX,
                .fn_init                = &nvi_dmp_prs_init,
        },
 };
@@ -392,23 +493,23 @@ static struct nvi_dmp_hdr nvi_dmp_hdr2s[] = {
        {
                .dev                    = DEV_ACC,
                .data_n                 = 2,
-               .hdr_msk                = 0x4000,
+               .hdr_msk                = ACCEL_ACCURACY_SET,
        },
        {
                .dev                    = DEV_GYR,
                .data_n                 = 2,
-               .hdr_msk                = 0x2000,
+               .hdr_msk                = GYRO_ACCURACY_SET,
        },
        {
                .dev                    = DEV_AUX,
-               .aux_port               = 0,
+               .aux_port               = AUX_PORT_DEV_GMF,
                .data_n                 = 2,
-               .hdr_msk                = 0x1000,
+               .hdr_msk                = CPASS_ACCURACY_SET,
        },
        {
-               .dev                    = -1,
+               .dev                    = -1, /* WTF */
                .data_n                 = 6,
-               .hdr_msk                = 0x0080,
+               .hdr_msk                = ACT_RECOG_SET,
        },
 };
 
@@ -416,61 +517,65 @@ static struct nvi_dmp_hdr nvi_dmp_hdr2s[] = {
 static struct nvi_dmp_hdr nvi_dmp_hdr1s[] = {
        {
                .dev                    = DEV_ACC,
+#if ICM_DMP_FW_VER == 2
+               .data_n                 = 6,
+#else /* ICM_DMP_FW_VER < 2 */
                .data_n                 = 12,
-               .hdr_msk                = 0x8000,
+#endif /* ICM_DMP_FW_VER */
+               .hdr_msk                = ACCEL_SET,
        },
        {
                .dev                    = DEV_GYU,
                .data_n                 = 6,
-               .hdr_msk                = 0x4000,
+               .hdr_msk                = GYRO_SET,
        },
        {
                .dev                    = DEV_AUX,
-               .aux_port               = 0,
+               .aux_port               = AUX_PORT_DEV_GMF,
                .data_n                 = 6,
-               .hdr_msk                = 0x2000,
+               .hdr_msk                = CPASS_SET,
        },
        {
                .dev                    = DEV_AUX,
-               .aux_port               = -1,
+               .aux_port               = -1, /* ALS */
                .data_n                 = 8,
-               .hdr_msk                = 0x1000,
+               .hdr_msk                = ALS_SET,
        },
        {
                .dev                    = DEV_QTN,
                .data_n                 = 12,
-               .hdr_msk                = 0x0800,
+               .hdr_msk                = QUAT6_SET,
        },
        {
                .dev                    = DEV_GMR,
                .data_n                 = 14,
-               .hdr_msk                = 0x0400,
+               .hdr_msk                = QUAT9_SET,
        },
        {
                .dev                    = -1, /* PQUAT6 */
                .data_n                 = 6,
-               .hdr_msk                = 0x0200,
+               .hdr_msk                = PQUAT6_SET,
        },
        {
                .dev                    = DEV_AUX,
-               .aux_port               = 2,
+               .aux_port               = AUX_PORT_DEV_PRS,
                .data_n                 = 6,
-               .hdr_msk                = 0x0080,
+               .hdr_msk                = PRESSURE_SET,
        },
        {
                .dev                    = DEV_GYR,
                .data_n                 = 12,
-               .hdr_msk                = 0x0040,
+               .hdr_msk                = GYRO_CALIBR_SET,
        },
        {
                .dev                    = -1, /* CPASS_CALIBR */
                .data_n                 = 12,
-               .hdr_msk                = 0x0020,
+               .hdr_msk                = CPASS_CALIBR_SET,
        },
        {
                .dev                    = DEV_STP,
                .data_n                 = 4,
-               .hdr_msk                = 0x0010,
+               .hdr_msk                = PED_STEPDET_SET,
        },
 };
 
@@ -652,30 +757,62 @@ static int nvi_dmp_clk_n(struct nvi_state *st, u32 *clk_n)
        return nvi_mem_rd_le(st, DMPRATE_CNTR, 4, clk_n);
 }
 
-static int nvi_dmp_period(struct nvi_state *st, unsigned int en_msk)
+static unsigned int nvi_dmp_gmf_us_periods[] = {
+       200000,
+       166667,
+       142857,
+       125000,
+       111111,
+       100000,
+       90909,
+       83333,
+       76923,
+       71429,
+       66667,
+       58824,
+       55556,
+       45455,
+       40000,
+       35714,
+       31250,
+       27027,
+       22222,
+       19608,
+       13333,
+       9804,
+       4444,
+};
+
+static int nvi_dmp_period(struct nvi_state *st, u32 *out_ctl,
+                         unsigned int en_msk, unsigned int irq_msk)
 {
        struct nvi_dmp_dev *dd;
-       u16 int_ctl = 0;
+       u32 int_ctl;
        u16 odr_cfg;
        unsigned int period_us_req[SRC_N];
        unsigned int period_us;
-       unsigned int period_us_int = -1;
+       unsigned int period_us_int;
+       unsigned int dev_msk;
        unsigned int src_msk;
        unsigned int src;
        unsigned int i;
-       unsigned int j = -1;
+       unsigned int j;
        int ret;
        int ret_t = 0;
 
+       /* sensor enabled = sensor enabled by HAL (irq_msk)
+        * sensor active = sensor on as dependency to another sensor
+        */
        /* initialize source period */
        for (src = 0; src < st->hal->src_n; src++)
                period_us_req[src] = st->hal->src[src].period_us_max;
 
-       /* set source's period_us_req[] to fastest DMP device */
+       /* set source's period_us_req[] to fastest enabled sensor */
        for (i = 0; i < ARRAY_SIZE(nvi_dmp_devs); i++) {
                dd = &nvi_dmp_devs[i];
-               if ((!st->snsr[dd->dev].period_us) || !(en_msk &
+               if ((!st->snsr[dd->dev].period_us) || !(irq_msk &
                                                        (1 << dd->dev)))
+                       /* sensor not enabled or non-valid period */
                        continue;
 
                src_msk = dd->src_msk; /* use all of device's sources */
@@ -683,27 +820,18 @@ static int nvi_dmp_period(struct nvi_state *st, unsigned int en_msk)
                        src_msk |= (1 << st->hal->dev[dd->dev]->src);
                for (src = 0; src < st->hal->src_n; src++) {
                        if (!(src_msk & (1 << src)))
+                               /* sensor doesn't use this source */
                                continue;
 
                        if (st->snsr[dd->dev].period_us < period_us_req[src])
                                period_us_req[src] =
                                                   st->snsr[dd->dev].period_us;
-               }
-       }
-
-       /* override above fastest speeds with any faster defaults */
-       for (i = 0; i < ARRAY_SIZE(nvi_dmp_devs); i++) {
-               dd = &nvi_dmp_devs[i];
-               if ((!dd->period_us_dflt) || !(en_msk & (1 << dd->dev)))
-                       continue;
-
-               src_msk = dd->src_msk; /* use all of device's sources */
-               if (st->hal->dev[dd->dev]->src >= 0)
-                       src_msk |= (1 << st->hal->dev[dd->dev]->src);
-               for (src = 0; src < st->hal->src_n; src++) {
-                       if (src_msk & (1 << src) && (dd->period_us_dflt <
-                                                    period_us_req[src]))
-                               period_us_req[src] = dd->period_us_dflt;
+                       /* override above speeds with any faster defaults */
+                       if (dd->period_us_dflt) {
+                               if (dd->period_us_dflt < period_us_req[src])
+                                       period_us_req[src] =
+                                                           dd->period_us_dflt;
+                       }
                }
        }
 
@@ -711,24 +839,42 @@ static int nvi_dmp_period(struct nvi_state *st, unsigned int en_msk)
         * SRC_AUX has timestamps set to ts_now = 0 since SRC_AUX has fixed
         * rates and can't sync with the other sources.
         */
-       period_us = -1;
-       for (src = 0; src < st->hal->src_n; src++) {
-               if (period_us_req[src] < period_us)
-                       period_us = period_us_req[src];
+       period_us = min(period_us_req[SRC_GYR], period_us_req[SRC_ACC]);
+       /* The latest INV driver implements this WAR with a twist: the gmf
+        * lookup table, nvi_dmp_gmf_us_periods.
+        */
+       if (en_msk & (1 << (DEV_N_AUX + AUX_PORT_DEV_GMF))) {
+               /* compass is enabled */
+               if (period_us_req[SRC_AUX] <= period_us) {
+                       j = ARRAY_SIZE(nvi_dmp_gmf_us_periods) - 1;
+                       for (i = 0; i < j; i++) {
+                               if (period_us_req[SRC_AUX] >=
+                                                    nvi_dmp_gmf_us_periods[i])
+                                       break;
+                       }
+                       period_us = nvi_dmp_gmf_us_periods[i];
+               }
+
+               period_us_req[SRC_AUX] = period_us;
        }
-       for (src = 0; src < st->hal->src_n; src++)
-               period_us_req[src] = period_us;
+
+       period_us_req[SRC_GYR] = period_us;
+       period_us_req[SRC_ACC] = period_us;
        /* WAR: end */
 
        /* program the sources */
        for (src = 0; src < st->hal->src_n; src++) {
-               if (!(st->hal->src[src].dev_msk & en_msk))
+               dev_msk = st->hal->src[src].dev_msk;
+               if (dev_msk & (1 << DEV_AUX))
+                       dev_msk |= MSK_EN_AUX_PORTS;
+               if (!(dev_msk & en_msk))
+                       /* no active sensors use this source */
                        continue;
 
-               if (period_us_req[src] < st->hal->src[src].period_us_min)
-                       period_us_req[src] = st->hal->src[src].period_us_min;
-               if (period_us_req[src] > st->hal->src[src].period_us_max)
-                       period_us_req[src] = st->hal->src[src].period_us_max;
+               if (period_us_req[src] < st->src[src].period_us_min)
+                       period_us_req[src] = st->src[src].period_us_min;
+               if (period_us_req[src] > st->src[src].period_us_max)
+                       period_us_req[src] = st->src[src].period_us_max;
                st->src[src].period_us_req = period_us_req[src];
                switch (src) {
                case SRC_GYR:
@@ -737,6 +883,10 @@ static int nvi_dmp_period(struct nvi_state *st, unsigned int en_msk)
                                                           st->src[src].base_t;
                        if (i)
                                i--;
+/* WAR: start
+ * It appears that the latest INV ICM DMP FW runs everything off of the SRC_GYR
+ */
+#if 0 /* WAR: must program both SRC_ACC & SRC_GYR regardless if used*/
                        ret = nvi_i2c_write_rc(st, &st->hal->reg->smplrt[src],
                                               i, __func__,
                                              (u8 *)&st->rc.smplrt[src], true);
@@ -745,6 +895,26 @@ static int nvi_dmp_period(struct nvi_state *st, unsigned int en_msk)
                        else
                                st->src[src].period_us_src = ((i + 1) *
                                                   st->src[src].base_t) / 1000;
+#endif /* WAR */
+                       ret = nvi_i2c_write_rc(st,
+                                              &st->hal->reg->smplrt[SRC_GYR],
+                                              i, __func__,
+                                         (u8 *)&st->rc.smplrt[SRC_GYR], true);
+                       if (ret)
+                               ret_t |= ret;
+                       else
+                               st->src[SRC_GYR].period_us_src = ((i + 1) *
+                                              st->src[SRC_GYR].base_t) / 1000;
+                       ret = nvi_i2c_write_rc(st,
+                                              &st->hal->reg->smplrt[SRC_ACC],
+                                              i, __func__,
+                                         (u8 *)&st->rc.smplrt[SRC_ACC], true);
+                       if (ret)
+                               ret_t |= ret;
+                       else
+                               st->src[SRC_ACC].period_us_src = ((i + 1) *
+                                              st->src[SRC_ACC].base_t) / 1000;
+/* WAR: end */
                        break;
 
                case SRC_AUX:
@@ -753,43 +923,54 @@ static int nvi_dmp_period(struct nvi_state *st, unsigned int en_msk)
                }
        }
 
-       /* now set each DMP device's ODR based on their source */
+       /* now set each DMP device's ODR based on their period */
+       int_ctl = 0;
+       period_us_int = -1;
+       j = -1;
        for (i = 0; i < ARRAY_SIZE(nvi_dmp_devs); i++) {
                dd = &nvi_dmp_devs[i];
-               if (dd->dev >= DEV_N_AUX || !(dd->odr_cfg | dd->odr_cntr))
-                       /* dd (DMP Device) is not ODR configurable */
+               if (!(en_msk & (1 << dd->dev)))
+                       /* device disabled */
                        continue;
 
-               if (!(en_msk & (1 << dd->dev)))
+               if (dd->fn_initd)
+                       /* settings after src initialized (initd) */
+                       ret |= dd->fn_initd(st, out_ctl, en_msk, irq_msk);
+               if (dd->dev >= DEV_N_AUX || !(dd->odr_cfg | dd->odr_cntr))
+                       /* dd (DMP Device) is not ODR configurable */
                        continue;
 
                if (dd->dev == DEV_AUX) {
                        if (!(en_msk & (1 << (dd->aux_port + DEV_N_AUX))))
+                               /* AUX sensor not enabled */
                                continue;
 
                        period_us = st->aux.port[dd->aux_port].period_us;
                } else {
                        period_us = st->snsr[dd->dev].period_us;
                }
+
                if (st->bm_timeout_us) {
                        /* batch mode on */
                        int_ctl |= dd->int_ctl;
                } else {
-                       if (dd->int_ctl && period_us) {
-                               /* IRQ on fastest period */
+                       if (*out_ctl & (dd->int_ctl << 16) && period_us) {
+                               /* IRQ on fastest period with data out */
                                if (period_us < period_us_int) {
                                        period_us_int = period_us;
                                        j = i;
                                }
                        }
                }
-               src = st->hal->dev[dd->dev]->src;
-               if (src < st->hal->src_n) {
-                       odr_cfg = period_us / st->src[src].period_us_src;
+               if (irq_msk & (1 << dd->dev)) {
+                       /* ODR rate for sent sensor data */
+                       odr_cfg = period_us /
+                                           st->src[dd->odr_src].period_us_src;
                        if (odr_cfg)
                                odr_cfg--;
                } else {
-                       odr_cfg = -1;
+                       /* data is not sent so timing is synced to src */
+                       odr_cfg = 0;
                }
                if (dd->dev == DEV_AUX)
                        st->aux.port[dd->aux_port].odr = odr_cfg;
@@ -800,9 +981,9 @@ static int nvi_dmp_period(struct nvi_state *st, unsigned int en_msk)
                ret_t |= nvi_mem_wr_be(st, dd->odr_cntr, 2, 0);
        }
 
-       if (j != -1)
+       if (j < ARRAY_SIZE(nvi_dmp_devs))
                int_ctl |= nvi_dmp_devs[j].int_ctl;
-       if (en_msk & (1 << DEV_STP))
+       if (irq_msk & (1 << DEV_STP))
                int_ctl |= PED_STEPDET_SET;
        ret_t |= nvi_mem_wr_be_mc(st, DATA_INTR_CTL, 2, int_ctl,
                                  &st->mc.icm.data_intr_ctl);
@@ -848,15 +1029,19 @@ static struct nvi_dmp_dev *nvi_dd(struct nvi_state *st,
 static int nvi_dd_init(struct nvi_state *st, unsigned int dev)
 {
        struct nvi_dmp_dev *dd;
+       unsigned int en_msk;
        int ret = -EINVAL;
+       u32 out_ctl = 0;
 
        dd = nvi_dd(st, dev, -1);
        if (dd == NULL)
                return -EINVAL;
 
-       if (dd->fn_init)
-               ret = dd->fn_init(st, st->en_msk | (st->aux.dmp_en_msk <<
-                                                   DEV_N_AUX), NULL);
+       if (dd->fn_init) {
+               en_msk = st->en_msk & MSK_DEV_ALL;
+               en_msk |= (st->aux.dmp_en_msk << DEV_N_AUX);
+               ret = dd->fn_init(st, &out_ctl, en_msk, 0);
+       }
        return ret;
 }
 
@@ -893,10 +1078,11 @@ static int nvi_dmp_init_gmf(struct nvi_state *st)
        unsigned int j;
        unsigned int k;
 
-       if (st->aux.port[0].nmp.type != SECONDARY_SLAVE_TYPE_COMPASS)
+       if (st->aux.port[AUX_PORT_DEV_GMF].nmp.type !=
+                                                 SECONDARY_SLAVE_TYPE_COMPASS)
                return -EINVAL;
 
-       nmp = &st->aux.port[0].nmp;
+       nmp = &st->aux.port[AUX_PORT_DEV_GMF].nmp;
        for (i = 0; i < AXIS_N; i++) {
                for (j = 0; j < AXIS_N; j++)
                        mtrx[AXIS_N * j + i] =
@@ -970,7 +1156,10 @@ static int nvi_dmp_init(struct nvi_state *st)
 static int nvi_dd_able(struct nvi_state *st,
                       unsigned int en_msk, unsigned int irq_msk)
 {
-       u16 evnt_ctl = 0;
+#if ICM_DMP_FW_VER == 2
+       u32 wtf_8a = 0;
+#endif /* ICM_DMP_FW_VER == 2 */
+       u32 evnt_ctl = 0;
        u32 out_ctl = 0;
        struct nvi_dmp_dev *dd;
        bool en;
@@ -978,9 +1167,10 @@ static int nvi_dd_able(struct nvi_state *st,
        int ret;
 
        st->en_msk &= ~MSK_DEV_SNSR;
-       ret = nvi_dmp_period(st, en_msk);
-       if (ret)
-               return ret;
+       for (i = 0; i < st->hal->src_n; i++) {
+               st->src[i].period_us_min = st->hal->src[i].period_us_min;
+               st->src[i].period_us_max = st->hal->src[i].period_us_max;
+       }
 
        for (i = 0; i < ARRAY_SIZE(nvi_dmp_devs); i++) {
                dd = &nvi_dmp_devs[i];
@@ -997,7 +1187,8 @@ static int nvi_dd_able(struct nvi_state *st,
                }
                if (en) {
                        if (dd->fn_init) {
-                               ret = dd->fn_init(st, en_msk, &out_ctl);
+                               ret = dd->fn_init(st, &out_ctl,
+                                                 en_msk, irq_msk);
                                if (ret < 0)
                                        return ret;
 
@@ -1008,8 +1199,8 @@ static int nvi_dd_able(struct nvi_state *st,
                }
 
                if (en) {
-                       if (dd->out_ctl && (irq_msk & (1 << dd->dev)))
-                               out_ctl |= dd->out_ctl;
+                       if (dd->int_ctl && (irq_msk & (1 << dd->dev)))
+                               out_ctl |= (dd->int_ctl << 16);
                        st->snsr[dd->dev].buf_n = dd->buf_n;
                        st->snsr[dd->dev].buf_shft = dd->buf_shft;
                } else {
@@ -1021,6 +1212,12 @@ static int nvi_dd_able(struct nvi_state *st,
        }
 
        st->aux.dmp_en_msk = en_msk >> DEV_N_AUX;
+       /* WAR: run all timestamp/IRQ timing off SRC_ACC (always on) */
+       en_msk |= (1 << DEV_ACC);
+       ret = nvi_dmp_period(st, &out_ctl, en_msk, irq_msk);
+       if (ret)
+               return ret;
+
        if (st->aux.dmp_en_msk) {
                ret = nvi_aux_enable(st, __func__, true, true);
                if (ret)
@@ -1029,21 +1226,23 @@ static int nvi_dd_able(struct nvi_state *st,
 
        if (out_ctl & DMP_DATA_OUT_CTL_HDR2_MSK)
                /* header 2 needs to be enabled */
-               out_ctl |= DMP_DATA_OUT_CTL_HDR2_BIT;
+               out_ctl |= (HEADER2_SET << 16);
        ret = nvi_mem_wr_be_mc(st, DATA_OUT_CTL1, 4, out_ctl,
                               &st->mc.icm.data_out_ctl);
        if (ret)
                return ret;
 
        /* inv_enable_accel_cal_V3 */
-       /* inv_enable_gyro_cal_V3 */
        if (en_msk & (1 << DEV_ACC))
-               evnt_ctl |= (ACCEL_CAL_EN | GYRO_CAL_EN);
+               evnt_ctl |= ACCEL_CAL_EN;
+       /* inv_enable_gyro_cal_V3 */
+       if (en_msk & (1 << DEV_GYR))
+               evnt_ctl |= GYRO_CAL_EN;
        /* inv_enable_compass_cal_V3 */
-       if (en_msk & (0x03 << DEV_N_AUX))
+       if (en_msk & (1 << (DEV_N_AUX + AUX_PORT_DEV_GMF)))
                evnt_ctl |= COMPASS_CAL_EN;
        /* inv_enable_9axes_V3 */
-       if (out_ctl & CPASS_ACCURACY_MASK || en_msk & (1 << DEV_GMR))
+       if (out_ctl & CPASS_ACCURACY_SET || en_msk & (1 << DEV_GMR))
                evnt_ctl |= NINE_AXIS_EN;
        /* inv_setup_events */
        if (en_msk & (1 << DEV_STP))
@@ -1055,7 +1254,17 @@ static int nvi_dd_able(struct nvi_state *st,
        /* SMD_EN is self-clearing so we don't want it in the cache */
        st->mc.icm.motion_event_ctl &= ~SMD_EN;
        /* inv_set_wom */
-       ret |= nvi_dmp_irq(st, irq_msk & en_msk);
+       ret |= nvi_dmp_irq(st, irq_msk);
+#if ICM_DMP_FW_VER == 2
+       if (en_msk & (1 << DEV_ACC))
+               wtf_8a |= 0x02;
+       if (en_msk & (1 << DEV_GYR))
+               wtf_8a |= 0x01;
+       if (en_msk & MSK_EN_AUX_PORTS)
+               wtf_8a |= 0x08;
+       ret |= nvi_mem_wr_be_mc(st, 0x8A, 2, wtf_8a,
+                               &st->mc.icm.wtf_8a);
+#endif /* ICM_DMP_FW_VER == 2 */
        if (!ret)
                st->en_msk |= (en_msk & ((1 << DEV_N_AUX) - 1));
        return ret;
@@ -1074,6 +1283,7 @@ static int nvi_dmp_en(struct nvi_state *st)
                if (dd->dev == DEV_AUX) {
                        if (st->snsr[DEV_AUX].enable & (1 << dd->aux_port)) {
                                irq_msk |= (1 << DEV_AUX);
+                               irq_msk |= (1 << (dd->aux_port + DEV_N_AUX));
                                en_msk |= (1 << DEV_AUX);
                                en_msk |= (1 << (dd->aux_port + DEV_N_AUX));
                                en_msk |= dd->depend_msk;
@@ -1089,7 +1299,9 @@ static int nvi_dmp_en(struct nvi_state *st)
 
        if (!st->icm_dmp_war) {
                st->icm_dmp_war = true;
+               st->mc_dis = true; /* initialize cache */
                ret = nvi_dd_able(st, ICM_DMP_DEV_MSK | MSK_DEV_MPU, irq_msk);
+               st->mc_dis = false; /* enable cache */
        }
        ret |= nvi_dd_able(st, en_msk, irq_msk);
        if (!ret) {
@@ -2009,8 +2221,7 @@ static const u8 const dmp_fw_20628[] = {
        0xCA, 0xF2, 0x35, 0xF1, 0x96, 0x8F, 0xA6, 0xD9,
        0x00, 0xD8, 0xF1, 0xFF
 };
-#else /* ICM_DMP_FW_VER */
-/* ICM_DMP_FW_VER == 1 */
+#elif ICM_DMP_FW_VER == 1
 static const u8 const dmp_fw_20628[] = {
        /* bank 0: 0x0090 */
        0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -2920,6 +3131,916 @@ static const u8 const dmp_fw_20628[] = {
        0xF1, 0xCA, 0xF2, 0x35, 0xF1, 0x96, 0x8F, 0xA6,
        0xD9, 0x00, 0xD8, 0xF1, 0xFF
 };
+#else /* ICM_DMP_FW_VER == 2 */
+static const u8 const dmp_fw_20628[] = {
+       /* bank 0: 0x0090 */
+       0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
+       0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0xFF,
+       0xFF, 0xF7, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05,
+       0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05,
+       0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00,
+       0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00,
+       0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00,
+       0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00,
+       0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40,
+       0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10,
+       0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04,
+       0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01,
+       /* bank 1: 0x0100 */
+       0x00, 0x00, 0x03, 0x84, 0x00, 0x00, 0x9C, 0x40,
+       0xFE, 0xF8, 0x56, 0xBE, 0x04, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x13, 0x5C, 0x28, 0xF6, 0x0C, 0xF5, 0xC2, 0x8F,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x38,
+       0x04, 0xF6, 0xE8, 0xF4, 0x00, 0x00, 0x68, 0x00,
+       0x00, 0x01, 0xFF, 0xC7, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x01, 0x47, 0xAE, 0x14,
+       0x3E, 0xB8, 0x51, 0xEC, 0x00, 0x0F, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x0C, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x2B, 0x80,
+       0x00, 0x00, 0x00, 0x52, 0x00, 0x57, 0x0A, 0x3D,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC,
+       0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x50, 0x50, 0x50, 0x3F, 0xAF, 0xAF, 0xB0,
+       0x02, 0x00, 0x00, 0x00, 0x36, 0x66, 0x66, 0x66,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x2B, 0x80,
+       0x8E, 0x17, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* bank 2: 0x0200 */
+       0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80,
+       0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x3E, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x9C, 0x40, 0x0C, 0xCC, 0xCC, 0xCD,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x3E, 0xB8, 0x51, 0xEC, 0x01, 0x47, 0xAE, 0x14,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x33, 0x33, 0x33, 0x33, 0x0C, 0xCC, 0xCC, 0xCD,
+       0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4B, 0xD1,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
+       0x06, 0xD5, 0x8E, 0x27, 0xE1, 0x05, 0x86, 0xB2,
+       0x38, 0xB3, 0x8D, 0x1F, 0xCF, 0x87, 0xC3, 0x8F,
+       0x06, 0xD5, 0x8E, 0x27, 0x1F, 0xA1, 0xAB, 0x12,
+       0x3A, 0x50, 0xFF, 0xCB, 0x31, 0x7D, 0xD5, 0x43,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* bank 3: 0x0300 */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
+       0x00, 0x06, 0x36, 0x38, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x8D, 0xF2,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x07, 0x00, 0x10, 0x00, 0x96, 0x00, 0x3C,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x0C, 0xC1, 0xD5, 0x21, 0xCB, 0xCF, 0x2A, 0x67,
+       0x51, 0xF6, 0x2F, 0x9C, 0xC5, 0x87, 0x95, 0xAC,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3D,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x20, 0x31, 0x88, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x0E, 0x49, 0x6E, 0x64, 0xC5, 0x92, 0x24, 0x82,
+       0x59, 0xFA, 0xEE, 0x8D, 0xC2, 0x29, 0xFE, 0xD7,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+       0x00, 0x00, 0x00, 0x14, 0x00, 0x28, 0xCC, 0xCC,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* bank 4: 0x0400 */
+       0x00, 0x00, 0x00, 0xA3, 0x00, 0x00, 0x00, 0x02,
+       0x00, 0x00, 0x00, 0x3A, 0x03, 0xE8, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x03, 0x3F, 0xC1, 0xA7, 0x68,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x01, 0x5E, 0x00, 0x00, 0x00, 0xFA,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x13, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x05,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+       0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x20, 0x00,
+       /* bank 5: 0x0500 */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00,
+       0x00, 0x00, 0x61, 0xA8, 0x00, 0x00, 0x00, 0x10,
+       0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
+       0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+       0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
+       0x00, 0x00, 0x2E, 0xE0, 0x00, 0x06, 0x40, 0x00,
+       0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+       0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x0C, 0xCC, 0xCC, 0xCD, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x9D, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* bank 6: 0x0600 */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00,
+       0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00,
+       0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x01, 0x49, 0x1B, 0x75,
+       0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x0C, 0xCD,
+       0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* bank 7: 0x0700 */
+       0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01,
+       0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x46,
+       0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+       0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xD4, 0xC0,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+       0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3C,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* bank 8: 0x0800 */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x3A, 0x98,
+       0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x4E,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x01, 0x47, 0xAE, 0x14, 0x4E, 0x40, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x01, 0x00, 0x00, 0x4E, 0x40, 0x00, 0x00,
+       0x4A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x06,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0xD8, 0xDC, 0xB8, 0xB0, 0xB4, 0xF3, 0xAA, 0xF8,
+       0xF9, 0xD1, 0xD9, 0x88, 0x9A, 0xF8, 0xF7, 0x3E,
+       0xD8, 0xF3, 0x8A, 0x9A, 0xA7, 0x31, 0xD1, 0xD9,
+       0xF4, 0x08, 0xF7, 0xD8, 0xF3, 0x9F, 0x31, 0xD1,
+       0xD9, 0xF4, 0x08, 0xF7, 0xDA, 0xF1, 0xFF, 0xD8,
+       0xF1, 0xA4, 0xDF, 0xA5, 0xDE, 0xF3, 0xA8, 0xDE,
+       /* bank 8: 0x0800 */
+       0xD0, 0xDF, 0xA4, 0x84, 0x9F, 0x24, 0xF2, 0xA9,
+       0xF8, 0xF9, 0xD1, 0xDA, 0xDE, 0xA8, 0xDE, 0xDF,
+       0xDF, 0xDF, 0xD8, 0xF4, 0xB1, 0x8D, 0xF3, 0xA8,
+       0xD0, 0xB0, 0xB4, 0x8F, 0xF4, 0xB9, 0xAF, 0xD0,
+       0xC7, 0xBE, 0xBE, 0xB8, 0xAE, 0xD0, 0xF3, 0x9F,
+       0x75, 0xB2, 0x86, 0xF4, 0xBE, 0xB9, 0xAF, 0xD0,
+       0xC3, 0xF1, 0xBE, 0xB8, 0xB0, 0xA3, 0xDE, 0xDF,
+       0xDF, 0xDF, 0xF2, 0xA3, 0x81, 0xC0, 0x80, 0xCD,
+       0xC7, 0xCF, 0xBC, 0xBD, 0xB4, 0xA3, 0x88, 0x93,
+       0xF1, 0x62, 0x6E, 0x76, 0x7E, 0xBE, 0xA2, 0x42,
+       0xA0, 0x4E, 0x56, 0x5E, 0xBE, 0xBE, 0xBC, 0xA3,
+       0x8B, 0x93, 0x2D, 0x55, 0x7D, 0xA2, 0x86, 0x9D,
+       0x08, 0xFD, 0x0F, 0xBC, 0xBC, 0xA3, 0x83, 0x92,
+       0x01, 0xA9, 0x9E, 0x0E, 0x16, 0x1E, 0xBE, 0xBE,
+       0x99, 0xA5, 0x2C, 0x54, 0x7C, 0xBA, 0xA5, 0x2C,
+       0x54, 0x7C, 0xBD, 0xBD, 0xBC, 0xBC, 0xB1, 0xB6,
+       0x83, 0x95, 0xA5, 0xF1, 0x0E, 0x16, 0x1E, 0xB2,
+       0xA7, 0x85, 0x95, 0x2A, 0xF0, 0x50, 0x78, 0x87,
+       0x93, 0xF1, 0x01, 0xDA, 0xA5, 0xDF, 0xDF, 0xDF,
+       0xD8, 0xA4, 0xDF, 0xDF, 0xDF, 0xB0, 0x80, 0xF2,
+       0xA4, 0xC3, 0xCB, 0xC5, 0xF1, 0xB1, 0x8E, 0x94,
+       0xA4, 0x0E, 0x16, 0x1E, 0xB2, 0x86, 0xBE, 0xA0,
+       0x2C, 0x34, 0x3C, 0xBD, 0xBD, 0xB4, 0x96, 0xB8,
+       0xA1, 0x2C, 0x34, 0x3C, 0xBD, 0xB6, 0x94, 0xBE,
+       0xA6, 0x2C, 0xFD, 0x35, 0x34, 0xFD, 0x35, 0x3C,
+       0xFD, 0x35, 0xBE, 0xBC, 0xB2, 0x8E, 0x94, 0xA6,
+       0x2D, 0x55, 0x7D, 0xBA, 0xA4, 0x2D, 0x55, 0x7D,
+       0xB8, 0xB0, 0xB4, 0xA6, 0x8F, 0x96, 0x2E, 0x36,
+       0x3E, 0xBC, 0xBC, 0xBD, 0xA6, 0x86, 0x9F, 0xF5,
+       0x34, 0x54, 0x74, 0xBC, 0xBE, 0xF1, 0x90, 0xFC,
+       0xC3, 0x00, 0xD9, 0xF4, 0x0A, 0x5A, 0xD8, 0xF3,
+       0xA0, 0xDF, 0xF1, 0xBC, 0x86, 0x91, 0xA9, 0x2D,
+       /* bank 9: 0x0900 */
+       0x55, 0x7D, 0xBC, 0xBC, 0xA9, 0x80, 0x90, 0xFC,
+       0x51, 0x00, 0x10, 0xFC, 0x51, 0x00, 0x10, 0xFC,
+       0x51, 0x00, 0x10, 0xFC, 0xC1, 0x04, 0xD9, 0xF2,
+       0xA0, 0xDF, 0xF4, 0x0A, 0x5A, 0xD8, 0xF6, 0xA0,
+       0xFA, 0x80, 0x90, 0x38, 0xF3, 0xDE, 0xDA, 0xF8,
+       0xF4, 0x0A, 0x5A, 0xD8, 0xF1, 0xBD, 0x95, 0xFC,
+       0xC1, 0x04, 0xD9, 0xBD, 0xBD, 0xF4, 0x0A, 0x5A,
+       0xDA, 0xBD, 0xBD, 0xD8, 0xF6, 0xBC, 0xBC, 0xBD,
+       0xBD, 0xBE, 0xBE, 0xB5, 0xA7, 0x84, 0x92, 0x1A,
+       0xF8, 0xF9, 0xD1, 0xDB, 0x84, 0x93, 0xF7, 0x6A,
+       0xB6, 0x87, 0x96, 0xF3, 0x09, 0xFF, 0xDA, 0xBC,
+       0xBD, 0xBE, 0xD8, 0xF3, 0xBC, 0xBC, 0xBD, 0xBD,
+       0xBE, 0xBE, 0xB9, 0xB2, 0xA9, 0x80, 0xCD, 0xF2,
+       0xC4, 0xC5, 0xBA, 0xF3, 0xA0, 0xD0, 0xDE, 0xB1,
+       0xB4, 0xF7, 0xA7, 0x89, 0x91, 0x72, 0x89, 0x91,
+       0x47, 0xB6, 0x97, 0x4A, 0xB9, 0xF2, 0xA9, 0xD0,
+       0xFA, 0xF9, 0xD1, 0xD9, 0xF4, 0x0A, 0x8E, 0xD8,
+       0xF3, 0xBA, 0xA7, 0xF9, 0xDB, 0xFB, 0xD9, 0xF1,
+       0xB9, 0xB0, 0x81, 0xA9, 0xC3, 0xF2, 0xC5, 0xF3,
+       0xBA, 0xA0, 0xD0, 0xF8, 0xD8, 0xF1, 0xB1, 0x89,
+       0xA7, 0xDF, 0xDF, 0xDF, 0xF2, 0xA7, 0xC3, 0xCB,
+       0xC5, 0xF1, 0xB2, 0xB5, 0xB9, 0x87, 0x97, 0xA5,
+       0x22, 0xF0, 0x48, 0x70, 0x3C, 0x98, 0x40, 0x68,
+       0x34, 0x58, 0x99, 0x60, 0xF1, 0xBC, 0xB3, 0x8E,
+       0x95, 0xAA, 0x25, 0x4D, 0x75, 0xBC, 0xBC, 0xB8,
+       0xB0, 0xB4, 0xA7, 0x88, 0x9F, 0xF7, 0x5A, 0xF9,
+       0xD9, 0xF1, 0xBA, 0xA5, 0xDF, 0xDF, 0xDF, 0xB8,
+       0xDA, 0xF3, 0xA8, 0xF8, 0x88, 0x9D, 0xD0, 0x7C,
+       0xD8, 0xF7, 0xA7, 0x88, 0x9F, 0x52, 0xF9, 0xD9,
+       0xF1, 0xBA, 0xA4, 0xDF, 0xDF, 0xDF, 0xB8, 0xDA,
+       0xF3, 0xA8, 0x88, 0x9C, 0xD0, 0xDF, 0x68, 0x70,
+       0x9D, 0x60, 0x70, 0x78, 0xD8, 0xF7, 0xA7, 0x88,
+       /* bank 10: 0x0A00 */
+       0x9F, 0x42, 0xF9, 0xBA, 0xA0, 0xD0, 0xF3, 0xD9,
+       0xDE, 0xD8, 0xF8, 0xF9, 0xD1, 0xB8, 0xDA, 0xA8,
+       0x88, 0x9E, 0xD0, 0x64, 0x68, 0xD8, 0xA8, 0x84,
+       0x98, 0xD0, 0xF7, 0x7E, 0xF0, 0xB2, 0xB6, 0xBA,
+       0x85, 0x91, 0xA7, 0x24, 0x70, 0x59, 0x44, 0x69,
+       0x38, 0x64, 0x48, 0x31, 0x2D, 0x51, 0x79, 0x87,
+       0xF1, 0xA1, 0x00, 0x2C, 0x54, 0x7C, 0xF0, 0x81,
+       0xA7, 0x04, 0x28, 0x50, 0x78, 0xFD, 0x7F, 0xF1,
+       0xA7, 0x87, 0x96, 0x59, 0x91, 0xA1, 0x02, 0x0E,
+       0x16, 0x1E, 0xF0, 0x84, 0x91, 0xA7, 0x24, 0x70,
+       0x59, 0x44, 0x69, 0x38, 0x64, 0x48, 0x31, 0x2D,
+       0x51, 0x79, 0xA2, 0x87, 0x0D, 0x20, 0x59, 0x70,
+       0x15, 0x38, 0x40, 0x69, 0xA4, 0xF1, 0x62, 0xF0,
+       0x19, 0x31, 0x48, 0xB8, 0xB1, 0xB4, 0xF1, 0xA6,
+       0x80, 0xC6, 0xF4, 0xB0, 0x81, 0xF3, 0xA7, 0xC6,
+       0xB1, 0x8F, 0x97, 0xF7, 0x02, 0xF9, 0xDA, 0xF4,
+       0x0B, 0xBD, 0xD8, 0xB0, 0xF7, 0xA7, 0x88, 0x9F,
+       0x52, 0xF9, 0xD9, 0xF4, 0x0B, 0xB6, 0xD8, 0xF1,
+       0xB2, 0xB6, 0xA6, 0x82, 0x92, 0x2A, 0xF0, 0x50,
+       0xFD, 0x08, 0xF1, 0xA7, 0x84, 0x94, 0x02, 0xFD,
+       0x08, 0xB0, 0xB4, 0x86, 0x97, 0x00, 0xB1, 0xBA,
+       0xA7, 0x81, 0x61, 0xD9, 0xF4, 0x0B, 0xF3, 0xD8,
+       0xF1, 0x41, 0xDA, 0xF4, 0x0B, 0xF3, 0xD8, 0xF1,
+       0xB8, 0xB2, 0xA6, 0x82, 0xC0, 0xD8, 0xF1, 0xB0,
+       0xB6, 0x86, 0x92, 0xA7, 0x16, 0xFD, 0x04, 0x0F,
+       0xFD, 0x04, 0xF0, 0xBA, 0x87, 0x91, 0xA7, 0x24,
+       0x58, 0x3D, 0x40, 0x34, 0x49, 0x2D, 0x51, 0xB2,
+       0x87, 0xF1, 0xA1, 0x00, 0x2C, 0x54, 0x7C, 0xF0,
+       0x81, 0xA7, 0x04, 0x28, 0x50, 0x78, 0xFD, 0x7F,
+       0xF1, 0xA7, 0x87, 0x96, 0x59, 0x91, 0xA1, 0x02,
+       0x0E, 0x16, 0x1E, 0xD8, 0xF7, 0xB0, 0xB4, 0xBA,
+       0x88, 0x9E, 0xA7, 0x6A, 0xF9, 0xD9, 0xF4, 0x0D,
+       /* bank 11: 0x0B00 */
+       0x0B, 0xD8, 0xF0, 0xB1, 0xB5, 0x8A, 0x9A, 0xA3,
+       0x2C, 0x50, 0x78, 0xF2, 0xA5, 0xDE, 0xF8, 0xF8,
+       0xF1, 0xB5, 0xB2, 0xA7, 0x83, 0x90, 0x21, 0xDB,
+       0xB6, 0xB1, 0x80, 0x93, 0x29, 0xD9, 0xF2, 0xA5,
+       0xF8, 0xD8, 0xF1, 0xB2, 0xB6, 0xA7, 0x83, 0x93,
+       0x31, 0xF3, 0xA5, 0xDE, 0xD9, 0xF8, 0xF8, 0xD8,
+       0xF1, 0xA9, 0x89, 0x99, 0xF0, 0x34, 0x83, 0x38,
+       0xF1, 0xA7, 0x29, 0xF5, 0x87, 0x90, 0x18, 0xD9,
+       0xF3, 0xA5, 0xF8, 0xD8, 0xA8, 0x80, 0x91, 0xF0,
+       0x0C, 0x31, 0x14, 0x28, 0x1C, 0x20, 0x04, 0x39,
+       0xA7, 0x88, 0x98, 0x04, 0x28, 0x51, 0x79, 0x1D,
+       0x30, 0x14, 0x38, 0xB1, 0xB8, 0x8A, 0xA7, 0xD0,
+       0x97, 0x2C, 0x50, 0x50, 0x78, 0x78, 0xBC, 0xBA,
+       0xB0, 0xA7, 0x85, 0x98, 0x04, 0x28, 0x50, 0x78,
+       0xF1, 0x84, 0x97, 0x29, 0xD9, 0xBE, 0xB8, 0xA5,
+       0x8D, 0x98, 0x20, 0x2C, 0x34, 0x3C, 0xBE, 0xBE,
+       0xBA, 0xAA, 0xDE, 0xDF, 0xF8, 0xF4, 0x0C, 0x95,
+       0xD8, 0xF1, 0xBA, 0xAA, 0xF8, 0xA7, 0x84, 0x9A,
+       0x01, 0xD9, 0xAA, 0xDF, 0xF8, 0xD8, 0xF1, 0xBC,
+       0xBC, 0x9A, 0xFC, 0xC1, 0x04, 0xD9, 0xAA, 0xFB,
+       0xA6, 0xB2, 0x89, 0x96, 0x42, 0xB4, 0x97, 0xF0,
+       0x78, 0xA7, 0x86, 0xF1, 0x38, 0xFD, 0x01, 0xB6,
+       0x97, 0x01, 0xA6, 0xD0, 0xB6, 0x9A, 0x52, 0x87,
+       0xF0, 0x18, 0xD8, 0xBD, 0xB0, 0xB4, 0xBA, 0x87,
+       0x96, 0xA7, 0xF5, 0x78, 0xBD, 0xBD, 0xF3, 0xD9,
+       0xA5, 0xF8, 0xD8, 0xB2, 0xB6, 0xF1, 0xA9, 0x89,
+       0x93, 0x1A, 0xB0, 0x87, 0x99, 0x60, 0xB8, 0xA7,
+       0xD0, 0xB2, 0x89, 0xC1, 0xB0, 0xBA, 0xF3, 0xA5,
+       0xF9, 0xF9, 0xB8, 0xF1, 0xDA, 0xA7, 0xD0, 0xDF,
+       0xD8, 0xA7, 0xD0, 0xFA, 0xF9, 0xD1, 0xBA, 0xDA,
+       0xA7, 0x87, 0x90, 0x6A, 0x66, 0xB2, 0xA0, 0x87,
+       0x01, 0x2C, 0xF0, 0xA7, 0x80, 0x90, 0x04, 0x28,
+       /* bank 12: 0x0C00 */
+       0xFD, 0x7F, 0xF1, 0xA7, 0x87, 0x96, 0x59, 0x90,
+       0xA0, 0x02, 0x0E, 0xD8, 0xF0, 0xBA, 0xB2, 0xB6,
+       0xA8, 0x80, 0x91, 0x0C, 0x31, 0x14, 0x28, 0x1C,
+       0x20, 0x04, 0x39, 0xD8, 0xF7, 0xB8, 0xB4, 0xB0,
+       0xA7, 0x9D, 0x88, 0x72, 0xF9, 0xBC, 0xBD, 0xBE,
+       0xD9, 0xF4, 0x0E, 0x72, 0xD8, 0xF2, 0xB8, 0xAD,
+       0xF8, 0xF9, 0xD1, 0xDA, 0xDE, 0xBA, 0xA1, 0xDE,
+       0xAE, 0xDE, 0xF8, 0xD8, 0xF2, 0xB1, 0xB5, 0xB9,
+       0xAE, 0xF9, 0xDA, 0xF4, 0x0E, 0x59, 0xD8, 0xF2,
+       0x8E, 0xC2, 0xF1, 0xB2, 0x80, 0x9A, 0xF5, 0xAF,
+       0x24, 0xD9, 0xF4, 0x0E, 0x59, 0xD8, 0xF5, 0x44,
+       0xD9, 0xF4, 0x0E, 0x59, 0xD8, 0xF5, 0x64, 0xD9,
+       0xF4, 0x0E, 0x59, 0xD8, 0xF1, 0xB1, 0xB6, 0x8B,
+       0x90, 0xAF, 0x2D, 0x55, 0x7D, 0xB5, 0x8C, 0x9F,
+       0xAD, 0x0E, 0x16, 0x1E, 0x8B, 0x9D, 0xAB, 0x2C,
+       0x54, 0x7C, 0x8D, 0x9F, 0xAA, 0x2E, 0x56, 0x7E,
+       0x8A, 0x9C, 0xAA, 0x2C, 0x54, 0x7C, 0x9B, 0xAC,
+       0x26, 0x46, 0x66, 0xAF, 0x8D, 0x9D, 0x00, 0x9C,
+       0x0D, 0xDB, 0x11, 0x8F, 0x19, 0xF4, 0x0D, 0x9B,
+       0xD8, 0x0E, 0x59, 0xD8, 0xF1, 0xB2, 0x81, 0xB6,
+       0x90, 0xAF, 0x2D, 0x55, 0x7D, 0xB1, 0x8F, 0xB5,
+       0x9F, 0xAF, 0xF5, 0x2C, 0x54, 0x7C, 0xF1, 0xB2,
+       0x8C, 0x9F, 0xAD, 0x6D, 0xDB, 0x71, 0x79, 0xF4,
+       0x0D, 0xC9, 0xD8, 0xF3, 0xBA, 0xA1, 0xDE, 0xF8,
+       0xF1, 0x80, 0xA1, 0xC3, 0xC5, 0xC7, 0xF4, 0x0D,
+       0xD8, 0xD8, 0xF3, 0xB6, 0xBA, 0x91, 0xFC, 0xC0,
+       0x28, 0xDA, 0xA1, 0xF8, 0xD9, 0xF4, 0x0E, 0x59,
+       0xD8, 0xF3, 0xB9, 0xAE, 0xF8, 0xF9, 0xD1, 0xD9,
+       0xF8, 0xF4, 0x0E, 0x59, 0xD8, 0xF1, 0xBA, 0xB1,
+       0xB5, 0xA0, 0x8B, 0x93, 0x3E, 0x5E, 0x7E, 0xAB,
+       0x83, 0xC0, 0xC5, 0xB2, 0xB6, 0xA3, 0x87, 0xC0,
+       0xC3, 0xC5, 0xC7, 0xA2, 0x88, 0xC0, 0xC3, 0xC5,
+       /* bank 13: 0x0D00 */
+       0xC7, 0xA4, 0x86, 0xC0, 0xC3, 0xC5, 0xC7, 0xA5,
+       0x85, 0xC4, 0xC7, 0xAC, 0x8D, 0xC0, 0xF3, 0xAE,
+       0xDE, 0xF8, 0xF4, 0x11, 0x36, 0xD8, 0xF1, 0xA7,
+       0x83, 0xC0, 0xC3, 0xC5, 0xC7, 0xA8, 0x82, 0xC0,
+       0xC3, 0xC5, 0xC7, 0xA6, 0x84, 0xC0, 0xC3, 0xC5,
+       0xC7, 0xA5, 0x85, 0xD0, 0xC0, 0xC3, 0x8D, 0x9D,
+       0xAF, 0x39, 0xD9, 0xF4, 0x0E, 0x59, 0xD8, 0xF1,
+       0x83, 0xB5, 0x9E, 0xAE, 0x34, 0xFD, 0x0A, 0x54,
+       0xFD, 0x0A, 0x74, 0xFD, 0x0A, 0xF2, 0xAF, 0xDE,
+       0xF8, 0xF8, 0xF8, 0xB6, 0x81, 0x9F, 0x05, 0xF8,
+       0xF9, 0xD1, 0xDA, 0x8F, 0xA1, 0xC0, 0xF4, 0x0E,
+       0x60, 0xD8, 0xF2, 0xBA, 0xAE, 0xF8, 0xF9, 0xD1,
+       0xDA, 0xF3, 0xBE, 0xBE, 0xBC, 0xBC, 0xBD, 0xBD,
+       0xB8, 0xB0, 0xB4, 0xA5, 0x85, 0x9C, 0x08, 0xBE,
+       0xBC, 0xBD, 0xD8, 0xF7, 0xBC, 0xBC, 0xBD, 0xBD,
+       0xBB, 0xB4, 0xB0, 0xAF, 0x9E, 0x88, 0x62, 0xF9,
+       0xBC, 0xBD, 0xD9, 0xF4, 0x10, 0xB4, 0xD8, 0xF1,
+       0xBC, 0xBC, 0xB1, 0x85, 0xBA, 0xB5, 0xA0, 0x98,
+       0x06, 0x26, 0x46, 0xBC, 0xB9, 0xB3, 0xB6, 0xF1,
+       0xAF, 0x81, 0x90, 0x2D, 0x55, 0x7D, 0xB1, 0xB5,
+       0xAF, 0x8F, 0x9F, 0xF5, 0x2C, 0x54, 0x7C, 0xF1,
+       0xBB, 0xAF, 0x86, 0x9F, 0x69, 0xDB, 0x71, 0x79,
+       0xDA, 0xF3, 0xA0, 0xDF, 0xF8, 0xF1, 0xA1, 0xDE,
+       0xF2, 0xF8, 0xD8, 0xB3, 0xB7, 0xF1, 0x8C, 0x9B,
+       0xAF, 0x19, 0xD9, 0xAC, 0xDE, 0xF3, 0xA0, 0xDF,
+       0xF8, 0xD8, 0xAF, 0x80, 0x90, 0x69, 0xD9, 0xA0,
+       0xFA, 0xF1, 0xB2, 0x80, 0xA1, 0xC3, 0xC5, 0xC7,
+       0xF2, 0xA0, 0xD0, 0xDF, 0xF8, 0xF4, 0x10, 0x9E,
+       0xD8, 0xF2, 0xA0, 0xD0, 0xDF, 0xF1, 0xBC, 0xBC,
+       0xB1, 0xAD, 0x8A, 0x9E, 0x26, 0x46, 0x66, 0xBC,
+       0xB3, 0xB3, 0xF3, 0xA2, 0xDE, 0xF8, 0xF4, 0x10,
+       0xBF, 0xD8, 0xF1, 0xAA, 0x8D, 0xC1, 0xF2, 0xA1,
+       /* bank 14: 0x0E00 */
+       0xF8, 0xF9, 0xD1, 0xDA, 0xF4, 0x0F, 0x2A, 0xD8,
+       0xF1, 0xAF, 0x8A, 0x9A, 0x21, 0x8F, 0x90, 0xF5,
+       0x10, 0xDA, 0xF4, 0x0F, 0x2A, 0xD8, 0xF1, 0x91,
+       0xFC, 0xC0, 0x04, 0xD9, 0xF4, 0x0F, 0x71, 0xD8,
+       0xF3, 0xA1, 0xDE, 0xF8, 0xA0, 0xDF, 0xF8, 0xF4,
+       0x10, 0x9E, 0xF3, 0x91, 0xFC, 0xC0, 0x07, 0xD9,
+       0xF4, 0x0F, 0x71, 0xD8, 0xF1, 0xAF, 0xB1, 0x84,
+       0x9C, 0x01, 0xB3, 0xB5, 0x80, 0x97, 0xDB, 0xF3,
+       0x21, 0xB9, 0xA7, 0xD9, 0xF8, 0xF4, 0x0F, 0x71,
+       0xD8, 0xF3, 0xB9, 0xA7, 0xDE, 0xF8, 0xBB, 0xF1,
+       0xA3, 0x87, 0xC0, 0xC3, 0xC5, 0xC7, 0xA4, 0x88,
+       0xC0, 0xC3, 0xC5, 0xC7, 0xA5, 0x89, 0xC0, 0xC3,
+       0xC5, 0xC7, 0xA6, 0x86, 0xC4, 0xC7, 0xA1, 0x82,
+       0xC3, 0xC5, 0xC7, 0xF3, 0xA1, 0xDE, 0xF4, 0x10,
+       0xB4, 0xD8, 0xF1, 0xBB, 0xB3, 0xB7, 0xA1, 0xF8,
+       0xF9, 0xD1, 0xDA, 0xF2, 0xA0, 0xD0, 0xDF, 0xF8,
+       0xD8, 0xF1, 0xB9, 0xB1, 0xB6, 0xA8, 0x87, 0x90,
+       0x2D, 0x55, 0x7D, 0xF5, 0xB5, 0xA8, 0x88, 0x98,
+       0x2C, 0x54, 0x7C, 0xF1, 0xAF, 0x86, 0x98, 0x29,
+       0xDB, 0x31, 0x39, 0xF4, 0x10, 0xB4, 0xD8, 0xF1,
+       0xB3, 0xB6, 0xA7, 0x8A, 0x90, 0x4C, 0x54, 0x5C,
+       0xBA, 0xA0, 0x81, 0x90, 0x2D, 0x55, 0x7D, 0xBB,
+       0xF2, 0xA2, 0xF8, 0xF9, 0xD1, 0xDA, 0xDE, 0xF4,
+       0x10, 0xB4, 0xD8, 0xF1, 0xBA, 0xB0, 0xAB, 0x8F,
+       0xC0, 0xC7, 0xB3, 0xA3, 0x83, 0xC0, 0xC3, 0xC5,
+       0xC7, 0xA2, 0x84, 0xC0, 0xC3, 0xC5, 0xC7, 0xA4,
+       0x85, 0xC0, 0xC3, 0xC5, 0xC7, 0xA5, 0x86, 0xC0,
+       0xC3, 0xAC, 0x8C, 0xC2, 0xF3, 0xAE, 0xDE, 0xF8,
+       0xF8, 0xF4, 0x11, 0x36, 0xD8, 0xF1, 0xB2, 0xBB,
+       0xA3, 0x83, 0xC0, 0xC3, 0xC5, 0xC7, 0xA4, 0x82,
+       0xC0, 0xC3, 0xC5, 0xC7, 0xA5, 0x84, 0xC0, 0xC3,
+       0xC5, 0xC7, 0xA6, 0x85, 0xC0, 0xC3, 0xAC, 0x8C,
+       /* bank 15: 0x0F00 */
+       0xC4, 0xB3, 0xB7, 0xAF, 0x85, 0x95, 0x56, 0xFD,
+       0x0F, 0x86, 0x96, 0x06, 0xFD, 0x0F, 0xF0, 0x84,
+       0x9F, 0xAF, 0x4C, 0x70, 0xFD, 0x0F, 0xF1, 0x86,
+       0x96, 0x2E, 0xFD, 0x0F, 0x84, 0x9F, 0x72, 0xFD,
+       0x0F, 0xDF, 0xAF, 0x2C, 0x54, 0x7C, 0xAF, 0x8C,
+       0x69, 0xDB, 0x71, 0x79, 0x8B, 0x9C, 0x61, 0xF4,
+       0x10, 0x35, 0xDA, 0x10, 0xB4, 0xD8, 0xF1, 0xAB,
+       0x83, 0x91, 0x28, 0xFD, 0x05, 0x54, 0xFD, 0x05,
+       0x7C, 0xFD, 0x05, 0xB8, 0xBD, 0xBD, 0xB5, 0xA3,
+       0x8B, 0x95, 0x05, 0x2D, 0x55, 0xBD, 0xB4, 0xBB,
+       0xAD, 0x8E, 0x93, 0x0E, 0x16, 0x1E, 0xB7, 0xF3,
+       0xA2, 0xDE, 0xF8, 0xF8, 0xF4, 0x10, 0xBF, 0xD8,
+       0xF2, 0xA1, 0xF8, 0xF9, 0xD1, 0xD9, 0xF1, 0xAF,
+       0x8D, 0x9A, 0x01, 0xF5, 0x8F, 0x90, 0xDB, 0x00,
+       0xF4, 0x10, 0xB4, 0xDA, 0xF1, 0xAA, 0x8D, 0xC0,
+       0xAE, 0x8B, 0xC1, 0xC3, 0xC5, 0xA1, 0xDE, 0xA7,
+       0x83, 0xC0, 0xC3, 0xC5, 0xC7, 0xA8, 0x84, 0xC0,
+       0xC3, 0xC5, 0xC7, 0xA9, 0x85, 0xC0, 0xC3, 0xC5,
+       0xC7, 0xA6, 0x86, 0xD0, 0xC0, 0xC3, 0xA2, 0x81,
+       0xC3, 0xC5, 0xC7, 0xF4, 0x10, 0xB4, 0xF1, 0xBB,
+       0xB3, 0xA3, 0xDE, 0xDF, 0xDF, 0xDF, 0xA4, 0x8C,
+       0xC4, 0xC5, 0xC5, 0xC5, 0xA5, 0xDE, 0xDF, 0xDF,
+       0xDF, 0xA6, 0xDE, 0xDF, 0xD8, 0xF3, 0xB9, 0xAE,
+       0xDF, 0xBA, 0xAE, 0xDE, 0xBB, 0xA2, 0xDE, 0xD8,
+       0xF3, 0xA2, 0xF8, 0xF9, 0xD1, 0xD9, 0xF4, 0x11,
+       0x34, 0xD8, 0xF5, 0xAD, 0x8D, 0x9D, 0x2C, 0x54,
+       0x7C, 0xF1, 0xAF, 0x49, 0xDA, 0xC3, 0xC5, 0xD9,
+       0xC5, 0xC3, 0xD8, 0xAF, 0x9F, 0x69, 0xD0, 0xDA,
+       0xC7, 0xD9, 0x8F, 0xC3, 0x8D, 0xAF, 0xC7, 0xD8,
+       0xB9, 0xA9, 0x8F, 0x9F, 0xF0, 0x54, 0x78, 0xF1,
+       0xFD, 0x0F, 0xA6, 0xB1, 0x89, 0xC2, 0xB3, 0xAF,
+       0x8F, 0x9F, 0x2E, 0xFD, 0x11, 0xB1, 0xB5, 0xA9,
+       /* bank 16: 0x1000 */
+       0x89, 0x9F, 0x2C, 0xF3, 0xAE, 0xDF, 0xF8, 0xF8,
+       0xF4, 0x12, 0xEB, 0xD8, 0xF1, 0xAD, 0x86, 0x99,
+       0x06, 0xFD, 0x10, 0xDF, 0xF8, 0xFD, 0x0F, 0xAD,
+       0x8D, 0x9D, 0x4C, 0xBB, 0xB3, 0xAD, 0x8F, 0x9D,
+       0x2A, 0xFD, 0x0F, 0xB7, 0x92, 0xFC, 0xC0, 0x04,
+       0xD9, 0xF4, 0x0E, 0xF9, 0xD8, 0xFC, 0xC0, 0x08,
+       0xD9, 0xF4, 0x10, 0x5F, 0xD8, 0xF1, 0xD8, 0xF3,
+       0xBA, 0xB2, 0xB6, 0xAE, 0xF8, 0xF9, 0xD1, 0xD9,
+       0xF4, 0x12, 0xE9, 0xD8, 0xF1, 0xAF, 0xDE, 0xF9,
+       0xFD, 0x0F, 0x80, 0x90, 0x2C, 0x54, 0x7C, 0xA0,
+       0x2A, 0xF0, 0x50, 0x78, 0xFD, 0x0F, 0xF1, 0xA2,
+       0x82, 0x9C, 0x00, 0x24, 0x44, 0x64, 0xA9, 0x8F,
+       0x94, 0xF0, 0x04, 0xFD, 0x0F, 0x0C, 0x30, 0xFD,
+       0x0F, 0x1C, 0x95, 0x20, 0x48, 0xFD, 0x0F, 0xF1,
+       0x99, 0xC1, 0x2C, 0x54, 0x7C, 0xAA, 0x82, 0x99,
+       0x02, 0xFD, 0x0F, 0x2E, 0xFD, 0x0F, 0x56, 0xFD,
+       0x0F, 0x7E, 0xFD, 0x0F, 0xAC, 0x83, 0x9F, 0xF0,
+       0x04, 0x28, 0x50, 0x78, 0xFD, 0x0F, 0x8C, 0x90,
+       0xF1, 0x21, 0xF5, 0x8C, 0x9C, 0x2C, 0xF1, 0xAF,
+       0xDE, 0xF1, 0x89, 0xAF, 0x9F, 0xFC, 0xC0, 0x00,
+       0xD9, 0xC1, 0x8A, 0xC1, 0x82, 0xC1, 0xD8, 0xFC,
+       0xC0, 0x04, 0xD9, 0xC3, 0x8A, 0xC3, 0x82, 0xC3,
+       0xD8, 0xFC, 0xC0, 0x08, 0xD9, 0xC5, 0x8A, 0xC5,
+       0x82, 0xC5, 0xD8, 0xFC, 0xC0, 0x0C, 0xD9, 0xC7,
+       0x8A, 0xC7, 0x82, 0xC7, 0xD8, 0xFC, 0xC0, 0x10,
+       0xD9, 0xF4, 0x12, 0xA3, 0xD8, 0xF1, 0x8B, 0xAB,
+       0xD0, 0xC0, 0x9F, 0x2E, 0xFD, 0x0F, 0xA0, 0xDE,
+       0xAB, 0xD0, 0x90, 0x65, 0xA0, 0x8F, 0x9F, 0x4A,
+       0xFD, 0x0F, 0xAB, 0x8B, 0x90, 0x00, 0xB9, 0xA9,
+       0xC1, 0xF3, 0xAE, 0xDF, 0xF8, 0xF4, 0x12, 0xEB,
+       0xD8, 0xF1, 0xBA, 0xB1, 0xB6, 0x89, 0xAB, 0xC1,
+       0xB2, 0xAF, 0xD0, 0x8B, 0x9F, 0x3E, 0xFD, 0x0F,
+       /* bank 17: 0x1100 */
+       0x5A, 0xFD, 0x0F, 0x9F, 0xFC, 0xC0, 0x00, 0xD9,
+       0xF1, 0x8F, 0xA2, 0xC6, 0xD8, 0xFC, 0xC0, 0x04,
+       0xD9, 0x8F, 0xA2, 0xC7, 0x84, 0xAB, 0xD0, 0xC0,
+       0xAF, 0x8A, 0x9B, 0x1E, 0xFD, 0x0F, 0x36, 0xFD,
+       0x0F, 0xA4, 0x8F, 0x30, 0xAA, 0x9A, 0x40, 0xD8,
+       0x9F, 0xFC, 0xC0, 0x08, 0xD9, 0x8F, 0xA2, 0xD0,
+       0xC6, 0x84, 0xAB, 0xD0, 0xC2, 0xAF, 0x8A, 0x9B,
+       0x1E, 0xFD, 0x0F, 0x56, 0xFD, 0x0F, 0xA4, 0x8F,
+       0x34, 0xAA, 0x9A, 0x40, 0x84, 0xAB, 0xD0, 0xC4,
+       0xAF, 0x8A, 0x9B, 0x3E, 0xFD, 0x0F, 0x56, 0xFD,
+       0x0F, 0xA4, 0xD0, 0x8F, 0x30, 0xAA, 0x9A, 0x4C,
+       0xD8, 0x9F, 0xFC, 0xC0, 0x0C, 0xD9, 0x8F, 0xA2,
+       0xD0, 0xC7, 0x84, 0xAB, 0xD0, 0xC6, 0xAF, 0x8A,
+       0x9B, 0x1E, 0xFD, 0x0F, 0x76, 0xFD, 0x0F, 0xA4,
+       0xD0, 0x8F, 0x34, 0xAA, 0x9A, 0x40, 0x85, 0xAB,
+       0xD0, 0xC0, 0xAF, 0x8A, 0x9B, 0x3E, 0xFD, 0x0F,
+       0x76, 0xFD, 0x0F, 0xA5, 0x8F, 0x30, 0xAA, 0x9A,
+       0x4C, 0x85, 0xAB, 0xD0, 0xC2, 0xAF, 0x8A, 0x9B,
+       0x5E, 0xFD, 0x0F, 0x76, 0xFD, 0x0F, 0xA5, 0x8F,
+       0x34, 0xAA, 0xD0, 0x9A, 0x50, 0xD8, 0xAF, 0xF8,
+       0xF4, 0x11, 0x99, 0xF1, 0xD8, 0x8B, 0x9C, 0xAF,
+       0x2A, 0xFD, 0x0F, 0x8A, 0x9F, 0xB9, 0xAF, 0x02,
+       0xFD, 0x0F, 0x26, 0xFD, 0x0F, 0x46, 0xFD, 0x0F,
+       0x66, 0xFD, 0x0F, 0x83, 0xB5, 0x9F, 0xBA, 0xA3,
+       0x00, 0x2C, 0x54, 0x7C, 0xB6, 0x82, 0x92, 0xA0,
+       0x31, 0xD9, 0xAD, 0xC3, 0xDA, 0xAD, 0xC5, 0xD8,
+       0x8D, 0xA0, 0x39, 0xDA, 0x82, 0xAD, 0xC7, 0xD8,
+       0xF3, 0x9E, 0xFC, 0xC0, 0x04, 0xD9, 0xF4, 0x0E,
+       0x15, 0xD8, 0xFC, 0xC0, 0x08, 0xD9, 0xF4, 0x0F,
+       0xE4, 0xD8, 0xF1, 0xD8, 0xF1, 0xB9, 0xB1, 0xB5,
+       0xA9, 0xDE, 0xF8, 0x89, 0x99, 0xAF, 0x31, 0xD9,
+       0xF4, 0x13, 0x3F, 0xD8, 0xF1, 0x85, 0xAF, 0x29,
+       /* bank 18: 0x1200 */
+       0xD9, 0x84, 0xA9, 0xC2, 0xD8, 0x85, 0xAF, 0x49,
+       0xD9, 0x84, 0xA9, 0xC4, 0xD8, 0x85, 0xAF, 0x69,
+       0xD9, 0x84, 0xA9, 0xC6, 0xD8, 0x89, 0xAF, 0x39,
+       0xDA, 0x8E, 0xA9, 0x50, 0xF4, 0x13, 0x3F, 0xD8,
+       0xF1, 0x89, 0xAA, 0x7C, 0xFD, 0x02, 0x9A, 0x68,
+       0xD8, 0xF1, 0xAA, 0xFB, 0xDA, 0x89, 0x99, 0xAF,
+       0x26, 0xFD, 0x0F, 0x8F, 0x95, 0x25, 0x89, 0x9F,
+       0xA9, 0x12, 0xFD, 0x0F, 0xF4, 0x13, 0x28, 0xD8,
+       0xF3, 0x9E, 0xFC, 0xC1, 0x04, 0xD9, 0xF4, 0x11,
+       0xF0, 0xD8, 0xFC, 0xC1, 0x08, 0xD9, 0xF4, 0x11,
+       0x0B, 0xD8, 0xF1, 0xBE, 0xBC, 0xBC, 0xBD, 0xBD,
+       0xF7, 0xB8, 0xB4, 0xB0, 0xAC, 0x84, 0x9D, 0x12,
+       0xF9, 0xF2, 0xBC, 0xBC, 0x8A, 0xA7, 0xD0, 0xD9,
+       0xC3, 0xDA, 0xC5, 0xD8, 0xBC, 0xBD, 0xBD, 0xF3,
+       0x8F, 0xA8, 0xC0, 0xF9, 0xAC, 0x84, 0x97, 0xF5,
+       0x1A, 0xF1, 0xF8, 0xF9, 0xD1, 0xDA, 0xA8, 0xDE,
+       0xD8, 0x95, 0xFC, 0xC1, 0x03, 0xD9, 0xA8, 0xDE,
+       0xD8, 0xBC, 0xBC, 0xF1, 0x98, 0xFC, 0xC0, 0x1C,
+       0xDB, 0x95, 0xFC, 0xC0, 0x03, 0xA5, 0xDE, 0xA4,
+       0xDE, 0xD8, 0xAC, 0x88, 0x95, 0x00, 0xD1, 0xD9,
+       0xA5, 0xF8, 0xD8, 0xA4, 0xFC, 0x80, 0x04, 0x88,
+       0x95, 0xA4, 0xFC, 0x08, 0x04, 0x20, 0xF7, 0xBC,
+       0xBD, 0xB5, 0xAC, 0x84, 0x9F, 0xF6, 0x02, 0xF8,
+       0xF9, 0xD1, 0xDB, 0x84, 0x93, 0xF7, 0x6A, 0xF9,
+       0xD9, 0xF3, 0xBC, 0xBC, 0xA8, 0x88, 0x92, 0x18,
+       0xBC, 0xD8, 0xBC, 0xBC, 0xB4, 0xA8, 0x88, 0x9E,
+       0x08, 0xF4, 0xBE, 0xA1, 0xD0, 0xBC, 0xF7, 0xBE,
+       0xBE, 0xB5, 0xAC, 0x84, 0x93, 0x6A, 0xF9, 0xBD,
+       0xBD, 0xB4, 0xD9, 0xF2, 0xAC, 0x8C, 0x97, 0x18,
+       0xF6, 0x84, 0x9C, 0x02, 0xF8, 0xF9, 0xDB, 0xD1,
+       0xF1, 0xA5, 0xDF, 0xD8, 0xF7, 0xBE, 0xBD, 0xA7,
+       0x9D, 0x88, 0x7A, 0xF9, 0xD9, 0xF4, 0x15, 0x8B,
+       /* bank 19: 0x1300 */
+       0xD8, 0xF1, 0xBE, 0xBE, 0xAC, 0xDE, 0xDF, 0xAC,
+       0x88, 0x9F, 0xF7, 0x5A, 0x56, 0xF1, 0xBC, 0xBC,
+       0xBD, 0xBD, 0x95, 0xFC, 0xC0, 0x07, 0xDA, 0xF4,
+       0x15, 0x2C, 0xD8, 0xF1, 0xFC, 0xC0, 0x00, 0xDB,
+       0x9C, 0xFC, 0xC1, 0x00, 0xF4, 0x15, 0x51, 0xD8,
+       0xF1, 0xAC, 0x95, 0xFC, 0xC0, 0x08, 0xDA, 0xF4,
+       0x14, 0x72, 0xD8, 0xF1, 0x82, 0x90, 0x79, 0x2D,
+       0x55, 0xF5, 0x8C, 0x9C, 0x04, 0xAC, 0x2C, 0x54,
+       0xF1, 0xBC, 0xBC, 0x80, 0x5D, 0xDB, 0x49, 0x51,
+       0xF4, 0xBC, 0x14, 0x50, 0xDA, 0xBC, 0x15, 0x28,
+       0xD8, 0xF5, 0x86, 0x98, 0x38, 0xD9, 0xF1, 0x82,
+       0x90, 0x2D, 0xD8, 0xAC, 0xD0, 0x86, 0x98, 0xF5,
+       0x5C, 0xD9, 0xF1, 0x82, 0x90, 0x55, 0xD8, 0xAC,
+       0x8C, 0x9C, 0x00, 0x00, 0xA5, 0xDF, 0xF8, 0xF4,
+       0x14, 0x7D, 0xD8, 0xF1, 0x82, 0x96, 0x2D, 0x55,
+       0x7D, 0x8C, 0x9C, 0x34, 0x18, 0xF1, 0xAC, 0x95,
+       0xF5, 0x1C, 0xD9, 0xF4, 0x15, 0x28, 0xD8, 0xF1,
+       0xAC, 0x83, 0x90, 0x45, 0xD9, 0xA0, 0xF8, 0xAC,
+       0x8C, 0x9C, 0x06, 0xD2, 0xA1, 0x91, 0x00, 0x2C,
+       0x81, 0xD6, 0xF0, 0xA1, 0xD0, 0x8C, 0x9C, 0x28,
+       0xD3, 0x87, 0xD4, 0xA7, 0x8C, 0x20, 0xD3, 0xF1,
+       0xA4, 0x84, 0x90, 0x2C, 0x54, 0x7C, 0xD8, 0xAC,
+       0x83, 0x90, 0x45, 0xD9, 0xF4, 0x15, 0x51, 0xD8,
+       0xF1, 0xAC, 0x81, 0x91, 0x02, 0xFD, 0x18, 0x85,
+       0x66, 0xFD, 0x1F, 0x88, 0x4E, 0xFD, 0x1D, 0x87,
+       0xD4, 0xFD, 0x56, 0xF0, 0x81, 0x9C, 0xAB, 0xD6,
+       0xFD, 0x08, 0x31, 0x8C, 0x10, 0x10, 0x01, 0x01,
+       0x01, 0x39, 0xAC, 0x8B, 0x98, 0xF5, 0x08, 0xD9,
+       0xF4, 0x15, 0x28, 0xD8, 0xF1, 0xA9, 0x82, 0x96,
+       0x01, 0x95, 0xFC, 0xC1, 0x00, 0xDA, 0xF4, 0x15,
+       0x00, 0xDB, 0xF1, 0xAC, 0x89, 0x93, 0xF5, 0x18,
+       0xF1, 0xA5, 0xDF, 0xF8, 0xD8, 0xF4, 0x15, 0x2C,
+       /* bank 20: 0x1400 */
+       0xD8, 0xF1, 0xA4, 0x84, 0x95, 0x34, 0xFD, 0x08,
+       0x54, 0xFD, 0x08, 0x74, 0xFD, 0x08, 0xA9, 0x94,
+       0xF5, 0x2C, 0x54, 0x7C, 0xF1, 0xAC, 0x87, 0x99,
+       0x49, 0xDB, 0x51, 0x59, 0x84, 0xAB, 0xC3, 0xC5,
+       0xC7, 0x82, 0xA6, 0xC0, 0xF3, 0xAA, 0xDF, 0xF8,
+       0xD8, 0xF1, 0xA5, 0xDF, 0xD8, 0xF1, 0xA0, 0xDE,
+       0xA1, 0xDE, 0xDF, 0xDF, 0xDF, 0xA7, 0xDE, 0xDF,
+       0xA4, 0xDF, 0xDF, 0xDF, 0xA2, 0x95, 0xFC, 0xC0,
+       0x01, 0xD9, 0x80, 0xC3, 0xC5, 0xC7, 0xA8, 0x83,
+       0xC1, 0xDA, 0x86, 0xC3, 0xC5, 0xC7, 0xA8, 0x83,
+       0xC3, 0xD8, 0xF1, 0x9A, 0xFC, 0xC1, 0x04, 0xD9,
+       0xAC, 0x82, 0x96, 0x01, 0xF3, 0xAA, 0xDE, 0xF8,
+       0xF8, 0xF8, 0xDB, 0xF5, 0xAC, 0x8C, 0x9A, 0x18,
+       0xF3, 0xAA, 0xF9, 0xD8, 0xAC, 0x8A, 0x9A, 0x41,
+       0xD1, 0xAA, 0xD0, 0xC0, 0xD9, 0xF2, 0xAC, 0x85,
+       0x9A, 0x41, 0xDB, 0xD1, 0xBC, 0xBD, 0xBE, 0xF4,
+       0x15, 0x8B, 0xD8, 0xF3, 0xBC, 0xBD, 0xBE, 0xA5,
+       0x85, 0x9C, 0x10, 0xD8, 0xF1, 0xBB, 0xB2, 0xB6,
+       0xF2, 0xBE, 0xA1, 0xF8, 0xF9, 0xD1, 0xBE, 0xBE,
+       0xBA, 0xDA, 0xA5, 0xDE, 0xD8, 0xA7, 0x82, 0x95,
+       0x65, 0xD1, 0x85, 0xA2, 0xD0, 0xC1, 0xD9, 0xB5,
+       0xA7, 0x86, 0x93, 0x31, 0xDB, 0xD1, 0xF4, 0x15,
+       0xBA, 0xD8, 0xF3, 0xB8, 0xB0, 0xB4, 0xA5, 0x85,
+       0x9C, 0x18, 0xD8, 0xF1, 0xBA, 0xB2, 0xB6, 0x81,
+       0x96, 0xA1, 0xF8, 0xF9, 0xB9, 0xA6, 0xDA, 0xC3,
+       0xC5, 0xC7, 0xD9, 0x2D, 0x4D, 0x6D, 0xD8, 0xBA,
+       0x88, 0xA8, 0xF8, 0xF9, 0xA7, 0xDA, 0xC3, 0xC5,
+       0xC7, 0xD9, 0x2D, 0x4D, 0x6D, 0xD8, 0xF2, 0xB0,
+       0xB9, 0xA3, 0xFA, 0xF9, 0xD1, 0xDA, 0xB8, 0x8F,
+       0xA7, 0xC0, 0xF9, 0xB5, 0x87, 0x93, 0xF6, 0x0A,
+       0xF2, 0xB4, 0xA4, 0x84, 0x97, 0x24, 0xA4, 0x84,
+       0x9E, 0x3C, 0xD8, 0xF7, 0xB9, 0xB0, 0xB5, 0xA6,
+       /* bank 21: 0x1500 */
+       0x88, 0x95, 0x5A, 0xF9, 0xDA, 0xF1, 0xAB, 0xF8,
+       0xD8, 0xB8, 0xB4, 0xF3, 0x98, 0xFC, 0xC0, 0x04,
+       0xDA, 0xF4, 0x16, 0x64, 0xD8, 0xF2, 0xA9, 0xD0,
+       0xF8, 0x89, 0x9B, 0xA7, 0x51, 0xD9, 0xA9, 0xD0,
+       0xDE, 0xA4, 0x84, 0x9E, 0x2C, 0xD8, 0xA8, 0xFA,
+       0x88, 0x9A, 0xA7, 0x29, 0xD9, 0xA8, 0xDF, 0xA4,
+       0x84, 0x9D, 0x34, 0xD8, 0xA8, 0xD0, 0xF8, 0x88,
+       0x9A, 0xA7, 0x51, 0xD9, 0xA8, 0xD0, 0xDE, 0xA4,
+       0x84, 0x9D, 0x2C, 0xD8, 0xA8, 0xD0, 0xFA, 0x88,
+       0x9A, 0xA7, 0x79, 0xD9, 0xA8, 0xD0, 0xDF, 0xA4,
+       0x84, 0x9D, 0x24, 0xD8, 0xF3, 0xA9, 0xD0, 0xF8,
+       0x89, 0x9B, 0xA7, 0x51, 0xD9, 0xA9, 0xD0, 0xDE,
+       0xA4, 0x84, 0x9C, 0x2C, 0xD8, 0xF7, 0xA7, 0x88,
+       0x9F, 0x52, 0xF9, 0xD9, 0xF4, 0x16, 0xA1, 0xD8,
+       0xF1, 0xB9, 0xA2, 0xFA, 0xF3, 0xB8, 0xA9, 0xD0,
+       0xFA, 0x89, 0x9B, 0xA7, 0x79, 0xD9, 0xA9, 0xD0,
+       0xDF, 0xA4, 0x84, 0x9C, 0x24, 0xD8, 0xA7, 0x84,
+       0x9D, 0xF7, 0x12, 0xF9, 0xD9, 0xF4, 0x16, 0xA1,
+       0xD8, 0xF2, 0xA8, 0xD0, 0xF8, 0x88, 0x9A, 0xA7,
+       0x51, 0xD9, 0xA8, 0xD0, 0xDE, 0xA4, 0x84, 0x9D,
+       0x2C, 0xD8, 0xF7, 0xA7, 0x88, 0x9F, 0x42, 0xF9,
+       0xD9, 0xF4, 0x16, 0xE8, 0xD8, 0xF3, 0xA9, 0xF8,
+       0x89, 0x9B, 0xA7, 0x01, 0xD9, 0xA9, 0xDE, 0xA4,
+       0x84, 0x9C, 0x3C, 0xD8, 0xA9, 0xFA, 0x89, 0x9B,
+       0xA7, 0x29, 0xD9, 0xA9, 0xDF, 0xA4, 0x84, 0x9C,
+       0x34, 0xD8, 0xF2, 0xA9, 0xFA, 0x89, 0x9B, 0xA7,
+       0x29, 0xD9, 0xA9, 0xDF, 0xA4, 0x84, 0x9E, 0x34,
+       0xD8, 0xA9, 0xD0, 0xFA, 0x89, 0x9B, 0xA7, 0x79,
+       0xD9, 0xA9, 0xD0, 0xDF, 0xA4, 0x84, 0x9E, 0x24,
+       0xD8, 0xF2, 0xA4, 0x84, 0x9D, 0x3C, 0xF1, 0xA7,
+       0xDE, 0xF2, 0x84, 0xCA, 0x97, 0xA4, 0x24, 0xA5,
+       0x94, 0xF6, 0x0A, 0xF7, 0x85, 0x02, 0xF8, 0xF9,
+       /* bank 22: 0x1600 */
+       0xD1, 0xD9, 0xF6, 0x9B, 0x02, 0xD8, 0xA7, 0xB1,
+       0x80, 0x95, 0x42, 0xF8, 0xF9, 0xD1, 0xD9, 0xF4,
+       0x18, 0x5B, 0xD8, 0xF0, 0xB0, 0x85, 0xA4, 0xD0,
+       0xC0, 0xDD, 0xF2, 0xC0, 0xDC, 0xF6, 0xA7, 0x9F,
+       0x02, 0xF9, 0xD9, 0xF3, 0xA5, 0xDE, 0xDA, 0xF0,
+       0xDD, 0xF2, 0xC8, 0xDC, 0xD8, 0x85, 0x95, 0xA5,
+       0x00, 0xD9, 0x86, 0xF0, 0xDD, 0xF2, 0xCA, 0xCC,
+       0xCE, 0xDC, 0xD8, 0x85, 0x00, 0xD9, 0x80, 0xF0,
+       0xDD, 0xF2, 0xCC, 0xC6, 0xCE, 0xDC, 0xD8, 0x85,
+       0x00, 0xD9, 0xB1, 0x89, 0xF0, 0xDD, 0xF2, 0xC2,
+       0xCA, 0xC4, 0xDC, 0xD8, 0xB0, 0x85, 0x00, 0xD9,
+       0x81, 0xF0, 0xDD, 0xF2, 0xC6, 0xCE, 0x82, 0xC0,
+       0xC8, 0xDC, 0xD8, 0x85, 0x00, 0xB1, 0xD9, 0x86,
+       0xF0, 0xDD, 0xF1, 0xC2, 0xC4, 0xC6, 0xDC, 0xD8,
+       0xB0, 0xF2, 0x85, 0x00, 0xD9, 0xB2, 0x87, 0xF0,
+       0xDD, 0xF1, 0xC2, 0xC4, 0xC6, 0xF2, 0xB2, 0x86,
+       0xC4, 0xDC, 0xD8, 0xB0, 0x85, 0x00, 0xB1, 0xD9,
+       0x8F, 0xF0, 0xDD, 0xF2, 0xC2, 0xC4, 0xC6, 0xDC,
+       0xD8, 0xB0, 0x85, 0x00, 0x00, 0xD9, 0x82, 0xF0,
+       0xDD, 0xF2, 0xC2, 0xCA, 0xC4, 0xDC, 0xD8, 0x85,
+       0x00, 0xD9, 0x85, 0xF0, 0xDD, 0xF1, 0xC2, 0xC4,
+       0xC6, 0xDC, 0xD8, 0xF2, 0x85, 0x00, 0xD9, 0xB1,
+       0x8A, 0xF0, 0xDD, 0xF1, 0xC2, 0xC4, 0xC6, 0xDC,
+       0xD8, 0xB0, 0xF2, 0x85, 0x00, 0xD9, 0xB1, 0xF0,
+       0xDD, 0xF1, 0x82, 0xC4, 0xDC, 0xD8, 0xB0, 0xF3,
+       0xA5, 0xF8, 0xF9, 0xD1, 0xD9, 0xF4, 0x18, 0x10,
+       0xD8, 0xF3, 0x85, 0x95, 0xA5, 0x00, 0x00, 0xD9,
+       0xBE, 0xF2, 0xBA, 0xAE, 0xDE, 0xBE, 0xBE, 0xBC,
+       0xB2, 0x81, 0xF0, 0xDD, 0xF3, 0xC8, 0xDC, 0xBC,
+       0xBC, 0xD8, 0xB0, 0xB8, 0x85, 0xA5, 0x00, 0xD9,
+       0xF2, 0xBE, 0xBE, 0xAA, 0xDE, 0xBE, 0xBC, 0xBC,
+       0x8A, 0xF0, 0xDD, 0xF3, 0xC0, 0xDC, 0xBC, 0xD8,
+       /* bank 23: 0x1700 */
+       0x85, 0xA5, 0x00, 0xD9, 0xB9, 0xF2, 0xA3, 0xD0,
+       0xDE, 0xB2, 0x85, 0xF0, 0xDD, 0xF3, 0xC8, 0xDC,
+       0xD8, 0xF6, 0xB8, 0xB0, 0xA7, 0x84, 0x9D, 0x5A,
+       0xF8, 0xF9, 0xD1, 0xDA, 0xB1, 0x80, 0xF0, 0xDD,
+       0xF3, 0xC4, 0xDC, 0xD8, 0xF2, 0x86, 0xB9, 0xAF,
+       0xC3, 0xC5, 0xC7, 0xF2, 0xB9, 0xA3, 0xDF, 0xB8,
+       0xB0, 0xB4, 0xA7, 0x84, 0x9D, 0xF7, 0x1A, 0xF9,
+       0xD9, 0xF4, 0x18, 0x49, 0xD8, 0xF1, 0xB9, 0xB1,
+       0xB5, 0xA6, 0x83, 0x9B, 0x61, 0xD9, 0xF4, 0x18,
+       0x5B, 0xD8, 0xF6, 0xB8, 0xB0, 0xB4, 0xA7, 0x84,
+       0x94, 0x5A, 0xF8, 0xF9, 0xD1, 0xDA, 0xFE, 0xF1,
+       0xB9, 0xAB, 0xDE, 0xD8, 0xF1, 0xB8, 0xB0, 0xB4,
+       0xA7, 0x88, 0x9C, 0xF7, 0x6A, 0xF9, 0xD9, 0xFF,
+       0xD8, 0xF1, 0xBB, 0xAA, 0xF9, 0xDA, 0xFF, 0xD8,
+       0xB3, 0x8A, 0xC2, 0xB2, 0x8B, 0xB6, 0x94, 0xBA,
+       0xA7, 0x22, 0xB7, 0x93, 0xF0, 0x31, 0x31, 0x20,
+       0xD3, 0x8F, 0xB6, 0x9C, 0xAB, 0x01, 0x29, 0x51,
+       0x79, 0xAF, 0xC2, 0xC5, 0xC7, 0x8B, 0x9B, 0xF1,
+       0x04, 0xFD, 0x01, 0x87, 0xD4, 0x8E, 0x9D, 0xAB,
+       0xF0, 0x01, 0x29, 0x51, 0x79, 0xAE, 0xC2, 0xC5,
+       0xC7, 0x8B, 0x9B, 0xF1, 0x04, 0xFD, 0x01, 0xB3,
+       0x81, 0x94, 0xBB, 0xA7, 0x62, 0xB7, 0x93, 0xF0,
+       0x71, 0x71, 0x60, 0x85, 0x94, 0x01, 0x29, 0x51,
+       0x79, 0xA5, 0xC2, 0xC5, 0xC7, 0x87, 0x97, 0xF1,
+       0x04, 0xFD, 0x01, 0x81, 0xB6, 0x94, 0xA7, 0x02,
+       0xB7, 0x93, 0xF0, 0x11, 0x11, 0x00, 0x8E, 0x9B,
+       0x01, 0x29, 0x51, 0x79, 0xAE, 0xC2, 0xC5, 0xC7,
+       0x87, 0x97, 0xF1, 0x04, 0xFD, 0x01, 0x83, 0xA3,
+       0xC2, 0xC5, 0xC7, 0xB2, 0x84, 0xC1, 0xB0, 0xB4,
+       0xB8, 0x88, 0x9D, 0xA7, 0xF7, 0x62, 0xF9, 0xD9,
+       0xF4, 0x19, 0x5E, 0xD8, 0xF1, 0xBE, 0xAA, 0xF8,
+       0xFA, 0xAB, 0xDE, 0xBC, 0x8B, 0xBD, 0x9B, 0xBE,
+       /* bank 24: 0x1800 */
+       0xBE, 0xBA, 0xAF, 0xD0, 0xFC, 0x58, 0x00, 0x10,
+       0xBE, 0xB8, 0xFC, 0xC0, 0x04, 0xDB, 0xFC, 0xC1,
+       0x00, 0xAA, 0xDE, 0xDF, 0xAC, 0xDE, 0xDF, 0xAB,
+       0xDF, 0xF8, 0xD8, 0xAC, 0xFC, 0x90, 0x00, 0x8C,
+       0xFC, 0x09, 0x04, 0x00, 0x8A, 0x9C, 0xA9, 0x31,
+       0xD9, 0xAA, 0xDF, 0xAC, 0xDF, 0xD8, 0x9B, 0xFC,
+       0xC0, 0x04, 0xDB, 0x9A, 0xA9, 0x19, 0xAC, 0xF8,
+       0xD8, 0x9B, 0xFC, 0xC1, 0x04, 0xDB, 0x9A, 0xA9,
+       0x11, 0xAB, 0xDF, 0x8C, 0x9C, 0xA9, 0x19, 0xD9,
+       0xF3, 0xBC, 0xBC, 0xBD, 0xBD, 0xBE, 0xBE, 0x8D,
+       0x94, 0xA4, 0xD0, 0x1D, 0xF4, 0x42, 0xDA, 0xF1,
+       0xBC, 0xBC, 0xBD, 0xBD, 0xBE, 0xBE, 0xD8, 0xF1,
+       0xB1, 0x8B, 0xB5, 0x9A, 0xB9, 0xA6, 0x41, 0xD9,
+       0xAA, 0xF8, 0xF5, 0xB2, 0x8F, 0xB6, 0x9F, 0xA6,
+       0x78, 0x8E, 0x9E, 0x7C, 0xF1, 0xB1, 0x81, 0xB5,
+       0x96, 0x05, 0x2D, 0x8E, 0xA6, 0x72, 0x7E, 0x81,
+       0xA1, 0x00, 0x2C, 0xF4, 0x19, 0xAA, 0xD8, 0xF1,
+       0xAA, 0xDE, 0x81, 0x91, 0xA6, 0x2C, 0xFD, 0x02,
+       0x96, 0x29, 0x92, 0xFC, 0xC0, 0x03, 0xD9, 0x96,
+       0x29, 0xD8, 0xA2, 0xDE, 0xF8, 0x86, 0x91, 0xA6,
+       0x21, 0xDB, 0x8B, 0x61, 0xA2, 0xDE, 0xB3, 0x86,
+       0xA4, 0xC0, 0xD8, 0xF3, 0xBB, 0xB3, 0xB7, 0xA2,
+       0xF8, 0xF2, 0xF8, 0xF1, 0x80, 0x9D, 0xAD, 0xD0,
+       0x7C, 0xF2, 0xA2, 0xFA, 0xF9, 0xD1, 0xF1, 0xB9,
+       0xAC, 0xD9, 0xDE, 0xDA, 0xF8, 0xD8, 0xF2, 0xA6,
+       0x82, 0x92, 0x49, 0xF9, 0xDB, 0xF1, 0xB1, 0x8C,
+       0xB5, 0x9C, 0x21, 0xD9, 0xF5, 0xB3, 0x85, 0xB7,
+       0x95, 0x78, 0x8E, 0x9E, 0x7C, 0xF1, 0xB1, 0x8D,
+       0xB5, 0x9D, 0xAD, 0x1A, 0xF0, 0x96, 0x40, 0x9D,
+       0x3C, 0x96, 0x48, 0xD8, 0xF1, 0xB1, 0x8E, 0xB5,
+       0x9D, 0xB9, 0xA6, 0x2A, 0x8D, 0x96, 0x05, 0xD9,
+       0xF4, 0x1A, 0x23, 0xD8, 0xF2, 0xB3, 0x82, 0xB7,
+       /* bank 25: 0x1900 */
+       0x92, 0xBB, 0xAF, 0x49, 0xF9, 0xF9, 0xDB, 0xF1,
+       0xB1, 0x8C, 0xB5, 0x9C, 0xB9, 0xA6, 0x21, 0xF4,
+       0x1A, 0x23, 0xD8, 0xF1, 0xB3, 0x8E, 0xBB, 0xA8,
+       0xD0, 0xC4, 0xC7, 0xF3, 0xB9, 0xAC, 0xD0, 0xDE,
+       0xF4, 0x1A, 0x34, 0xD8, 0xF1, 0xB3, 0x85, 0xBB,
+       0xA8, 0xD0, 0xC4, 0xC7, 0xF3, 0xB9, 0xAC, 0xD0,
+       0xDE, 0xF8, 0xDF, 0xF8, 0xD8, 0xF3, 0xB5, 0x9C,
+       0xFC, 0xC3, 0x04, 0xDB, 0xFC, 0xC2, 0x00, 0xD9,
+       0xF2, 0xAC, 0xD0, 0xDE, 0xD8, 0xF2, 0xBB, 0xAF,
+       0xB7, 0x92, 0xB3, 0x82, 0x19, 0x80, 0xA2, 0xD9,
+       0x26, 0xF3, 0xA7, 0xD0, 0xDF, 0xD8, 0xF1, 0xAF,
+       0x89, 0x98, 0x19, 0xA9, 0x80, 0xD9, 0x38, 0xD8,
+       0xAF, 0x89, 0x39, 0xA9, 0x80, 0xDA, 0x3C, 0xD8,
+       0xAF, 0x2E, 0x88, 0xF5, 0x75, 0xDA, 0xFF, 0xD8,
+       0x71, 0xDA, 0xF1, 0xFF, 0xD8, 0x82, 0xA7, 0xF3,
+       0xC1, 0xF2, 0x80, 0xC2, 0xF1, 0x97, 0x86, 0x49,
+       0x2E, 0xA6, 0xD0, 0x50, 0x96, 0x86, 0xAF, 0x75,
+       0xD9, 0x88, 0xA2, 0xD0, 0xF3, 0xC0, 0xC3, 0xF1,
+       0xDA, 0x8F, 0x96, 0xA2, 0xD0, 0xF3, 0xC2, 0xC3,
+       0x82, 0xB6, 0x9B, 0x78, 0x78, 0xF1, 0xD8, 0xB7,
+       0xAF, 0xDF, 0xF9, 0x89, 0x99, 0xAF, 0x10, 0x80,
+       0x9F, 0x21, 0xDA, 0x2E, 0xD8, 0x89, 0x99, 0xAF,
+       0x31, 0xDA, 0xDF, 0xD8, 0xAF, 0x82, 0x92, 0xF3,
+       0x41, 0xD9, 0xF1, 0xDF, 0xD8, 0xAF, 0x82, 0xF3,
+       0x19, 0xD9, 0xF1, 0xDF, 0xD8, 0xF1, 0x89, 0x90,
+       0xAF, 0xD0, 0x09, 0x8F, 0x99, 0xAF, 0x51, 0xDB,
+       0x89, 0x31, 0xF3, 0x82, 0x92, 0x19, 0xF2, 0xB1,
+       0x8C, 0xB5, 0x9C, 0x71, 0xD9, 0xF1, 0xDF, 0xF9,
+       0xF2, 0xB9, 0xAC, 0xD0, 0xF8, 0xF8, 0xF3, 0xDF,
+       0xD8, 0xB3, 0xB7, 0xBB, 0x82, 0xAC, 0xF3, 0xC0,
+       0xA2, 0x80, 0x22, 0xF1, 0xA9, 0x22, 0x26, 0x9F,
+       0xAF, 0x29, 0xDA, 0xAC, 0xDE, 0xFF, 0xD8, 0xA2,
+       /* bank 26: 0x1A00 */
+       0xF2, 0xDE, 0xF1, 0xA9, 0xDF, 0xB5, 0x92, 0xFC,
+       0xC0, 0x00, 0xD9, 0xFF, 0xD8, 0xAD, 0xD0, 0xDE,
+       0xF8, 0xB1, 0x84, 0xB6, 0x96, 0xBA, 0xA7, 0xD0,
+       0x7E, 0xB7, 0x96, 0xA7, 0x01, 0xB2, 0x87, 0x9D,
+       0x05, 0xDB, 0xB3, 0x8D, 0xB6, 0x97, 0x79, 0xF3,
+       0xB1, 0x8C, 0x96, 0x49, 0xF1, 0xBB, 0xAD, 0xD0,
+       0xF8, 0xD8, 0xF3, 0xB9, 0xAC, 0xD0, 0xF8, 0xF9,
+       0xD1, 0xD9, 0xF1, 0xBB, 0xAD, 0xD0, 0xF8, 0xD8,
+       0xB3, 0xB7, 0xBB, 0x97, 0x8C, 0xAF, 0xF3, 0x79,
+       0xD9, 0xF4, 0x1B, 0x6D, 0xD8, 0xF1, 0xB1, 0x82,
+       0xB9, 0xA2, 0xD0, 0xC2, 0xB3, 0xF2, 0xB9, 0xA3,
+       0xFA, 0xF1, 0xBB, 0xAA, 0xD0, 0xF8, 0xB8, 0xB0,
+       0xB4, 0xA7, 0x88, 0x9C, 0xF7, 0x72, 0xF9, 0xF4,
+       0xDA, 0x44, 0xD8, 0x1B, 0x80, 0xD8, 0xF3, 0xB3,
+       0xB7, 0xBB, 0xA7, 0xD0, 0xFA, 0x97, 0x8C, 0xAF,
+       0x79, 0xDA, 0xF1, 0x87, 0x9A, 0xAA, 0xD0, 0x70,
+       0xD8, 0xF2, 0xBB, 0xB3, 0xB7, 0x82, 0x92, 0xAF,
+       0x31, 0xDA, 0xF4, 0x1B, 0xBD, 0xD8, 0xF1, 0x8D,
+       0x96, 0xA6, 0x40, 0xAC, 0x8C, 0x9C, 0x0C, 0x30,
+       0xBA, 0x8D, 0x9D, 0xA7, 0x39, 0xDB, 0xF3, 0xB1,
+       0x8C, 0xB6, 0x96, 0x49, 0xD9, 0xF1, 0x84, 0xB5,
+       0x94, 0xB9, 0xA4, 0xD0, 0x5E, 0xF0, 0xB7, 0x9D,
+       0x38, 0xD8, 0xF1, 0xBB, 0xAC, 0xDE, 0xD0, 0xDE,
+       0xAD, 0xD0, 0xDF, 0xF1, 0xFF, 0xD8, 0xF3, 0xB9,
+       0xAC, 0xD0, 0xF8, 0xF9, 0xD1, 0xD9, 0xF2, 0xBB,
+       0xA2, 0xFA, 0xF8, 0xDA, 0xF2, 0xBB, 0xA2, 0xFA,
+       0xD8, 0xF2, 0xBB, 0x82, 0xAF, 0xC2, 0xF9, 0xD1,
+       0xD9, 0xF1, 0xB9, 0xAC, 0xDE, 0xAD, 0xDE, 0xDF,
+       0xD8, 0xF1, 0x8C, 0x9C, 0xBB, 0xAC, 0xD0, 0x10,
+       0xAC, 0xDE, 0xAD, 0xD0, 0xDF, 0x92, 0x82, 0xAF,
+       0xF1, 0xCA, 0xF2, 0x35, 0xF1, 0x96, 0x8F, 0xA6,
+       0xD9, 0x00, 0xD8, 0xF1, 0xFF,
+       /* bank 27: 0x1B00 */
+};
 #endif /* ICM_DMP_FW_VER */
 
 struct nvi_dmp nvi_dmp_icm = {
@@ -2930,6 +4051,7 @@ struct nvi_dmp nvi_dmp_icm = {
        .fw_mem_addr                    = 0x90,
        .fw_start                       = 0x08D0,
        .dmp_reset_delay_ms             = 25,
+       .fifo_mode                      = ICM_DMP_FIFO_MODE,
        .dev_msk                        = ICM_DMP_DEV_MSK,
        .en_msk                         = MSK_DEV_ALL,
        .dd_n                           = ARRAY_SIZE(nvi_dmp_devs),