/*
 *   fetch.c
 *
 *   This file is part of Emu28
 *
 *   Copyright (C) 2002 Christoph Gießelink
 *
 */
#include "pch.h"
#include "Opcodes.h"

#define F	0xFF							// F = function

typedef const struct
{
	LPCVOID     pLnk;
	const DWORD dwTyp;
} JMPTAB, *PJMPTAB;

// jump tables
static JMPTAB oF_[] =
{
	(LPCVOID) oF0,			F,
	(LPCVOID) oF1,			F,
	(LPCVOID) oF2,			F,
	(LPCVOID) oF3,			F,
	(LPCVOID) oF4,			F,
	(LPCVOID) oF5,			F,
	(LPCVOID) oF6,			F,
	(LPCVOID) oF7,			F,
	(LPCVOID) oF8,			F,
	(LPCVOID) oF9,			F,
	(LPCVOID) oFA,			F,
	(LPCVOID) oFB,			F,
	(LPCVOID) oFC,			F,
	(LPCVOID) oFD,			F,
	(LPCVOID) oFE,			F,
	(LPCVOID) oFF,			F
};

static JMPTAB oE_[] =
{
	(LPCVOID) oE0,			F,
	(LPCVOID) oE1,			F,
	(LPCVOID) oE2,			F,
	(LPCVOID) oE3,			F,
	(LPCVOID) oE4,			F,
	(LPCVOID) oE5,			F,
	(LPCVOID) oE6,			F,
	(LPCVOID) oE7,			F,
	(LPCVOID) oE8,			F,
	(LPCVOID) oE9,			F,
	(LPCVOID) oEA,			F,
	(LPCVOID) oEB,			F,
	(LPCVOID) oEC,			F,
	(LPCVOID) oED,			F,
	(LPCVOID) oEE,			F,
	(LPCVOID) oEF,			F
};

static JMPTAB oD_[] =
{
	(LPCVOID) oD0,			F,
	(LPCVOID) oD1,			F,
	(LPCVOID) oD2,			F,
	(LPCVOID) oD3,			F,
	(LPCVOID) oD4,			F,
	(LPCVOID) oD5,			F,
	(LPCVOID) oD6,			F,
	(LPCVOID) oD7,			F,
	(LPCVOID) oD8,			F,
	(LPCVOID) oD9,			F,
	(LPCVOID) oDA,			F,
	(LPCVOID) oDB,			F,
	(LPCVOID) oDC,			F,
	(LPCVOID) oDD,			F,
	(LPCVOID) oDE,			F,
	(LPCVOID) oDF,			F
};

static JMPTAB oC_[] =
{
	(LPCVOID) oC0,			F,
	(LPCVOID) oC1,			F,
	(LPCVOID) oC2,			F,
	(LPCVOID) oC3,			F,
	(LPCVOID) oC4,			F,
	(LPCVOID) oC5,			F,
	(LPCVOID) oC6,			F,
	(LPCVOID) oC7,			F,
	(LPCVOID) oC8,			F,
	(LPCVOID) oC9,			F,
	(LPCVOID) oCA,			F,
	(LPCVOID) oCB,			F,
	(LPCVOID) oCC,			F,
	(LPCVOID) oCD,			F,
	(LPCVOID) oCE,			F,
	(LPCVOID) oCF,			F
};

static JMPTAB oBb_[] =
{
	(LPCVOID) oBb0,			F,
	(LPCVOID) oBb1,			F,
	(LPCVOID) oBb2,			F,
	(LPCVOID) oBb3,			F,
	(LPCVOID) oBb4,			F,
	(LPCVOID) oBb5,			F,
	(LPCVOID) oBb6,			F,
	(LPCVOID) oBb7,			F,
	(LPCVOID) oBb8,			F,
	(LPCVOID) oBb9,			F,
	(LPCVOID) oBbA,			F,
	(LPCVOID) oBbB,			F,
	(LPCVOID) oBbC,			F,
	(LPCVOID) oBbD,			F,
	(LPCVOID) oBbE,			F,
	(LPCVOID) oBbF,			F
};

static JMPTAB oBa_[] =
{
	(LPCVOID) oBa0,			F,
	(LPCVOID) oBa1,			F,
	(LPCVOID) oBa2,			F,
	(LPCVOID) oBa3,			F,
	(LPCVOID) oBa4,			F,
	(LPCVOID) oBa5,			F,
	(LPCVOID) oBa6,			F,
	(LPCVOID) oBa7,			F,
	(LPCVOID) oBa8,			F,
	(LPCVOID) oBa9,			F,
	(LPCVOID) oBaA,			F,
	(LPCVOID) oBaB,			F,
	(LPCVOID) oBaC,			F,
	(LPCVOID) oBaD,			F,
	(LPCVOID) oBaE,			F,
	(LPCVOID) oBaF,			F
};

static JMPTAB oB_[] =
{
	(LPCVOID) oBa_,			2,
	(LPCVOID) oBa_,			2,
	(LPCVOID) oBa_,			2,
	(LPCVOID) oBa_,			2,
	(LPCVOID) oBa_,			2,
	(LPCVOID) oBa_,			2,
	(LPCVOID) oBa_,			2,
	(LPCVOID) oBa_,			2,
	(LPCVOID) oBb_,			2,
	(LPCVOID) oBb_,			2,
	(LPCVOID) oBb_,			2,
	(LPCVOID) oBb_,			2,
	(LPCVOID) oBb_,			2,
	(LPCVOID) oBb_,			2,
	(LPCVOID) oBb_,			2,
	(LPCVOID) oBb_,			2
};

static JMPTAB oAb_[] =
{
	(LPCVOID) oAb0,			F,
	(LPCVOID) oAb1,			F,
	(LPCVOID) oAb2,			F,
	(LPCVOID) oAb3,			F,
	(LPCVOID) oAb4,			F,
	(LPCVOID) oAb5,			F,
	(LPCVOID) oAb6,			F,
	(LPCVOID) oAb7,			F,
	(LPCVOID) oAb8,			F,
	(LPCVOID) oAb9,			F,
	(LPCVOID) oAbA,			F,
	(LPCVOID) oAbB,			F,
	(LPCVOID) oAbC,			F,
	(LPCVOID) oAbD,			F,
	(LPCVOID) oAbE,			F,
	(LPCVOID) oAbF,			F
};

static JMPTAB oAa_[] =
{
	(LPCVOID) oAa0,			F,
	(LPCVOID) oAa1,			F,
	(LPCVOID) oAa2,			F,
	(LPCVOID) oAa3,			F,
	(LPCVOID) oAa4,			F,
	(LPCVOID) oAa5,			F,
	(LPCVOID) oAa6,			F,
	(LPCVOID) oAa7,			F,
	(LPCVOID) oAa8,			F,
	(LPCVOID) oAa9,			F,
	(LPCVOID) oAaA,			F,
	(LPCVOID) oAaB,			F,
	(LPCVOID) oAaC,			F,
	(LPCVOID) oAaD,			F,
	(LPCVOID) oAaE,			F,
	(LPCVOID) oAaF,			F
};

static JMPTAB oA_[] =
{
	(LPCVOID) oAa_,			2,
	(LPCVOID) oAa_,			2,
	(LPCVOID) oAa_,			2,
	(LPCVOID) oAa_,			2,
	(LPCVOID) oAa_,			2,
	(LPCVOID) oAa_,			2,
	(LPCVOID) oAa_,			2,
	(LPCVOID) oAa_,			2,
	(LPCVOID) oAb_,			2,
	(LPCVOID) oAb_,			2,
	(LPCVOID) oAb_,			2,
	(LPCVOID) oAb_,			2,
	(LPCVOID) oAb_,			2,
	(LPCVOID) oAb_,			2,
	(LPCVOID) oAb_,			2,
	(LPCVOID) oAb_,			2
};

static JMPTAB o9b_[] =
{
	(LPCVOID) o9b0,			F,
	(LPCVOID) o9b1,			F,
	(LPCVOID) o9b2,			F,
	(LPCVOID) o9b3,			F,
	(LPCVOID) o9b4,			F,
	(LPCVOID) o9b5,			F,
	(LPCVOID) o9b6,			F,
	(LPCVOID) o9b7,			F,
	(LPCVOID) o9b8,			F,
	(LPCVOID) o9b9,			F,
	(LPCVOID) o9bA,			F,
	(LPCVOID) o9bB,			F,
	(LPCVOID) o9bC,			F,
	(LPCVOID) o9bD,			F,
	(LPCVOID) o9bE,			F,
	(LPCVOID) o9bF,			F
};

static JMPTAB o9a_[] =
{
	(LPCVOID) o9a0,			F,
	(LPCVOID) o9a1,			F,
	(LPCVOID) o9a2,			F,
	(LPCVOID) o9a3,			F,
	(LPCVOID) o9a4,			F,
	(LPCVOID) o9a5,			F,
	(LPCVOID) o9a6,			F,
	(LPCVOID) o9a7,			F,
	(LPCVOID) o9a8,			F,
	(LPCVOID) o9a9,			F,
	(LPCVOID) o9aA,			F,
	(LPCVOID) o9aB,			F,
	(LPCVOID) o9aC,			F,
	(LPCVOID) o9aD,			F,
	(LPCVOID) o9aE,			F,
	(LPCVOID) o9aF,			F
};

static JMPTAB o9_[] =
{
	(LPCVOID) o9a_,			2,
	(LPCVOID) o9a_,			2,
	(LPCVOID) o9a_,			2,
	(LPCVOID) o9a_,			2,
	(LPCVOID) o9a_,			2,
	(LPCVOID) o9a_,			2,
	(LPCVOID) o9a_,			2,
	(LPCVOID) o9a_,			2,
	(LPCVOID) o9b_,			2,
	(LPCVOID) o9b_,			2,
	(LPCVOID) o9b_,			2,
	(LPCVOID) o9b_,			2,
	(LPCVOID) o9b_,			2,
	(LPCVOID) o9b_,			2,
	(LPCVOID) o9b_,			2,
	(LPCVOID) o9b_,			2
};

static JMPTAB o8B_[] =
{
	(LPCVOID) o8B0,			F,
	(LPCVOID) o8B1,			F,
	(LPCVOID) o8B2,			F,
	(LPCVOID) o8B3,			F,
	(LPCVOID) o8B4,			F,
	(LPCVOID) o8B5,			F,
	(LPCVOID) o8B6,			F,
	(LPCVOID) o8B7,			F,
	(LPCVOID) o8B8,			F,
	(LPCVOID) o8B9,			F,
	(LPCVOID) o8BA,			F,
	(LPCVOID) o8BB,			F,
	(LPCVOID) o8BC,			F,
	(LPCVOID) o8BD,			F,
	(LPCVOID) o8BE,			F,
	(LPCVOID) o8BF,			F
};

static JMPTAB o8A_[] =
{
	(LPCVOID) o8A0,			F,
	(LPCVOID) o8A1,			F,
	(LPCVOID) o8A2,			F,
	(LPCVOID) o8A3,			F,
	(LPCVOID) o8A4,			F,
	(LPCVOID) o8A5,			F,
	(LPCVOID) o8A6,			F,
	(LPCVOID) o8A7,			F,
	(LPCVOID) o8A8,			F,
	(LPCVOID) o8A9,			F,
	(LPCVOID) o8AA,			F,
	(LPCVOID) o8AB,			F,
	(LPCVOID) o8AC,			F,
	(LPCVOID) o8AD,			F,
	(LPCVOID) o8AE,			F,
	(LPCVOID) o8AF,			F
};

static JMPTAB o81B_[] =
{
	(LPCVOID) o_invalid4,	F,
	(LPCVOID) o_invalid4,	F,
	(LPCVOID) o81B2,		F,
	(LPCVOID) o81B3,		F,
	(LPCVOID) o81B4,		F,
	(LPCVOID) o81B5,		F,
	(LPCVOID) o81B6,		F,
	(LPCVOID) o81B7,		F,
	(LPCVOID) o_invalid4,	F,
	(LPCVOID) o_invalid4,	F,
	(LPCVOID) o_invalid4,	F,
	(LPCVOID) o_invalid4,	F,
	(LPCVOID) o_invalid4,	F,
	(LPCVOID) o_invalid4,	F,
	(LPCVOID) o_invalid4,	F,
	(LPCVOID) o_invalid4,	F
};

static JMPTAB o81Af2_[] =
{
	(LPCVOID) o81Af20,		F,
	(LPCVOID) o81Af21,		F,
	(LPCVOID) o81Af22,		F,
	(LPCVOID) o81Af23,		F,
	(LPCVOID) o81Af24,		F,
	(LPCVOID) o81Af21,		F,
	(LPCVOID) o81Af22,		F,
	(LPCVOID) o81Af23,		F,
	(LPCVOID) o81Af28,		F,
	(LPCVOID) o81Af29,		F,
	(LPCVOID) o81Af2A,		F,
	(LPCVOID) o81Af2B,		F,
	(LPCVOID) o81Af2C,		F,
	(LPCVOID) o81Af29,		F,
	(LPCVOID) o81Af2A,		F,
	(LPCVOID) o81Af2B,		F
};

static JMPTAB o81Af1_[] =
{
	(LPCVOID) o81Af10,		F,
	(LPCVOID) o81Af11,		F,
	(LPCVOID) o81Af12,		F,
	(LPCVOID) o81Af13,		F,
	(LPCVOID) o81Af14,		F,
	(LPCVOID) o81Af11,		F,
	(LPCVOID) o81Af12,		F,
	(LPCVOID) o81Af13,		F,
	(LPCVOID) o81Af18,		F,
	(LPCVOID) o81Af19,		F,
	(LPCVOID) o81Af1A,		F,
	(LPCVOID) o81Af1B,		F,
	(LPCVOID) o81Af1C,		F,
	(LPCVOID) o81Af19,		F,
	(LPCVOID) o81Af1A,		F,
	(LPCVOID) o81Af1B,		F
};

static JMPTAB o81Af0_[] =
{
	(LPCVOID) o81Af00,		F,
	(LPCVOID) o81Af01,		F,
	(LPCVOID) o81Af02,		F,
	(LPCVOID) o81Af03,		F,
	(LPCVOID) o81Af04,		F,
	(LPCVOID) o81Af01,		F,
	(LPCVOID) o81Af02,		F,
	(LPCVOID) o81Af03,		F,
	(LPCVOID) o81Af08,		F,
	(LPCVOID) o81Af09,		F,
	(LPCVOID) o81Af0A,		F,
	(LPCVOID) o81Af0B,		F,
	(LPCVOID) o81Af0C,		F,
	(LPCVOID) o81Af09,		F,
	(LPCVOID) o81Af0A,		F,
	(LPCVOID) o81Af0B,		F
};

static JMPTAB o81A_[] =
{
	(LPCVOID) o81Af0_,		5,
	(LPCVOID) o81Af1_,		5,
	(LPCVOID) o81Af2_,		5,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F
};

static JMPTAB o819_[] =
{
	(LPCVOID) o819f0,		F,
	(LPCVOID) o819f1,		F,
	(LPCVOID) o819f2,		F,
	(LPCVOID) o819f3,		F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F
};

static JMPTAB o818_[] =
{
	(LPCVOID) o818f0x,		F,
	(LPCVOID) o818f1x,		F,
	(LPCVOID) o818f2x,		F,
	(LPCVOID) o818f3x,		F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o818f8x,		F,
	(LPCVOID) o818f9x,		F,
	(LPCVOID) o818fAx,		F,
	(LPCVOID) o818fBx,		F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F,
	(LPCVOID) o_invalid6,	F
};

static JMPTAB o81_[] =
{
	(LPCVOID) o810,			F,
	(LPCVOID) o811,			F,
	(LPCVOID) o812,			F,
	(LPCVOID) o813,			F,
	(LPCVOID) o814,			F,
	(LPCVOID) o815,			F,
	(LPCVOID) o816,			F,
	(LPCVOID) o817,			F,
//	(LPCVOID) o818_,		4,				// r=r+CON fs,n / r=r-CON fs,n group
	(LPCVOID) o_invalid3,	F,				// 1LK7
//	(LPCVOID) o819_,		4,				// rSRB.F fs group
	(LPCVOID) o_invalid3,	F,				// 1LK7
//	(LPCVOID) o81A_,		4,				// r=ss.F fs / ss=r.F fs / rssEX.F fs group
	(LPCVOID) o_invalid3,	F,				// 1LK7
//	(LPCVOID) o81B_,		3,				// PC=A / PC=C / A=PC / C=PC / APCEX / CPCEX group
	(LPCVOID) o_invalid3,	F,				// 1LK7
	(LPCVOID) o81C,			F,
	(LPCVOID) o81D,			F,
	(LPCVOID) o81E,			F,
	(LPCVOID) o81F,			F
};

static JMPTAB o8081_[] =
{
	(LPCVOID) o80810,		F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F,
	(LPCVOID) o_invalid5,	F
};

static JMPTAB o808_[] =
{
	(LPCVOID) o8080,		F,
	(LPCVOID) o8081_,		4,
//	(LPCVOID) o8082X,		F,				// LAHEX
	(LPCVOID) o_invalid4,	F,				// 1LK7
//	(LPCVOID) o8083,		F,				// BUSCB
	(LPCVOID) o_invalid4,	F,				// 1LK7
//	(LPCVOID) o8084n,		F,				// ABIT=0 n
	(LPCVOID) o_invalid4,	F,				// 1LK7
//	(LPCVOID) o8085n,		F,				// ABIT=1 n
	(LPCVOID) o_invalid4,	F,				// 1LK7
//	(LPCVOID) o8086n,		F,				// ?ABIT=0 n RTNYES/GOYES
	(LPCVOID) o_invalid4,	F,				// 1LK7
//	(LPCVOID) o8087n,		F,				// ?ABIT=1 n RTNYES/GOYES
	(LPCVOID) o_invalid4,	F,				// 1LK7
//	(LPCVOID) o8088n,		F,				// CBIT=0 n
	(LPCVOID) o_invalid4,	F,				// 1LK7
//	(LPCVOID) o8089n,		F,				// CBIT=1 n
	(LPCVOID) o_invalid4,	F,				// 1LK7
//	(LPCVOID) o808An,		F,				// ?CBIT=0 n RTNYES/GOYES
	(LPCVOID) o_invalid4,	F,				// 1LK7
//	(LPCVOID) o808Bn,		F,				// ?CBIT=1 n RTNYES/GOYES
	(LPCVOID) o_invalid4,	F,				// 1LK7
	(LPCVOID) o808C,		F,
//	(LPCVOID) o808D,		F,				// BUSCD
	(LPCVOID) o_invalid4,	F,				// 1LK7
//	(LPCVOID) o808E,		F,				// PC=(C)
	(LPCVOID) o_invalid4,	F,				// 1LK7
	(LPCVOID) o808F,		F
};

static JMPTAB o80_[] =
{
	(LPCVOID) o800,			F,
	(LPCVOID) o801,			F,
	(LPCVOID) o802,			F,
	(LPCVOID) o803,			F,
	(LPCVOID) o804,			F,
	(LPCVOID) o805,			F,
	(LPCVOID) o806,			F,
	(LPCVOID) o807,			F,
	(LPCVOID) o808_,		3,
	(LPCVOID) o809,			F,
	(LPCVOID) o80A,			F,
	(LPCVOID) o80B,			F,
	(LPCVOID) o80Cn,		F,
	(LPCVOID) o80Dn,		F,
	(LPCVOID) o80E,			F,
	(LPCVOID) o80Fn,		F
};

static JMPTAB o8_[] =
{
	(LPCVOID) o80_,			2,
	(LPCVOID) o81_,			2,
	(LPCVOID) o82n,			F,
	(LPCVOID) o83n,			F,
	(LPCVOID) o84n,			F,
	(LPCVOID) o85n,			F,
	(LPCVOID) o86n,			F,
	(LPCVOID) o87n,			F,
	(LPCVOID) o88n,			F,
	(LPCVOID) o89n,			F,
	(LPCVOID) o8A_,			2,
	(LPCVOID) o8B_,			2,
	(LPCVOID) o8Cd4,		F,
	(LPCVOID) o8Dd5,		F,
	(LPCVOID) o8Ed4,		F,
	(LPCVOID) o8Fd5,		F
};

static JMPTAB o15_[] =
{
	(LPCVOID) o150a,		F,
	(LPCVOID) o151a,		F,
	(LPCVOID) o152a,		F,
	(LPCVOID) o153a,		F,
	(LPCVOID) o154a,		F,
	(LPCVOID) o155a,		F,
	(LPCVOID) o156a,		F,
	(LPCVOID) o157a,		F,
	(LPCVOID) o158x,		F,
	(LPCVOID) o159x,		F,
	(LPCVOID) o15Ax,		F,
	(LPCVOID) o15Bx,		F,
	(LPCVOID) o15Cx,		F,
	(LPCVOID) o15Dx,		F,
	(LPCVOID) o15Ex,		F,
	(LPCVOID) o15Fx,		F
};

static JMPTAB o14_[] =
{
	(LPCVOID) o140,			F,
	(LPCVOID) o141,			F,
	(LPCVOID) o142,			F,
	(LPCVOID) o143,			F,
	(LPCVOID) o144,			F,
	(LPCVOID) o145,			F,
	(LPCVOID) o146,			F,
	(LPCVOID) o147,			F,
	(LPCVOID) o148,			F,
	(LPCVOID) o149,			F,
	(LPCVOID) o14A,			F,
	(LPCVOID) o14B,			F,
	(LPCVOID) o14C,			F,
	(LPCVOID) o14D,			F,
	(LPCVOID) o14E,			F,
	(LPCVOID) o14F,			F
};

static JMPTAB o13_[] =
{
	(LPCVOID) o130,			F,
	(LPCVOID) o131,			F,
	(LPCVOID) o132,			F,
	(LPCVOID) o133,			F,
	(LPCVOID) o134,			F,
	(LPCVOID) o135,			F,
	(LPCVOID) o136,			F,
	(LPCVOID) o137,			F,
	(LPCVOID) o138,			F,
	(LPCVOID) o139,			F,
	(LPCVOID) o13A,			F,
	(LPCVOID) o13B,			F,
	(LPCVOID) o13C,			F,
	(LPCVOID) o13D,			F,
	(LPCVOID) o13E,			F,
	(LPCVOID) o13F,			F
};

static JMPTAB o12_[] =
{
	(LPCVOID) o120,			F,
	(LPCVOID) o121,			F,
	(LPCVOID) o122,			F,
	(LPCVOID) o123,			F,
	(LPCVOID) o124,			F,
	(LPCVOID) o121,			F,
	(LPCVOID) o122,			F,
	(LPCVOID) o123,			F,
	(LPCVOID) o128,			F,
	(LPCVOID) o129,			F,
	(LPCVOID) o12A,			F,
	(LPCVOID) o12B,			F,
	(LPCVOID) o12C,			F,
	(LPCVOID) o129,			F,
	(LPCVOID) o12A,			F,
	(LPCVOID) o12B,			F
};

static JMPTAB o11_[] =
{
	(LPCVOID) o110,			F,
	(LPCVOID) o111,			F,
	(LPCVOID) o112,			F,
	(LPCVOID) o113,			F,
	(LPCVOID) o114,			F,
	(LPCVOID) o111,			F,
	(LPCVOID) o112,			F,
	(LPCVOID) o113,			F,
	(LPCVOID) o118,			F,
	(LPCVOID) o119,			F,
	(LPCVOID) o11A,			F,
	(LPCVOID) o11B,			F,
	(LPCVOID) o11C,			F,
	(LPCVOID) o119,			F,
	(LPCVOID) o11A,			F,
	(LPCVOID) o11B,			F
};

static JMPTAB o10_[] =
{
	(LPCVOID) o100,			F,
	(LPCVOID) o101,			F,
	(LPCVOID) o102,			F,
	(LPCVOID) o103,			F,
	(LPCVOID) o104,			F,
	(LPCVOID) o101,			F,
	(LPCVOID) o102,			F,
	(LPCVOID) o103,			F,
	(LPCVOID) o108,			F,
	(LPCVOID) o109,			F,
	(LPCVOID) o10A,			F,
	(LPCVOID) o10B,			F,
	(LPCVOID) o10C,			F,
	(LPCVOID) o109,			F,
	(LPCVOID) o10A,			F,
	(LPCVOID) o10B,			F
};

static JMPTAB o1_[] =
{
	(LPCVOID) o10_,			2,
	(LPCVOID) o11_,			2,
	(LPCVOID) o12_,			2,
	(LPCVOID) o13_,			2,
	(LPCVOID) o14_,			2,
	(LPCVOID) o15_,			2,
	(LPCVOID) o16x,			F,
	(LPCVOID) o17x,			F,
	(LPCVOID) o18x,			F,
	(LPCVOID) o19d2,		F,
	(LPCVOID) o1Ad4,		F,
	(LPCVOID) o1Bd5,		F,
	(LPCVOID) o1Cx,			F,
	(LPCVOID) o1Dd2,		F,
	(LPCVOID) o1Ed4,		F,
	(LPCVOID) o1Fd5,		F
};

static JMPTAB o0E_[] =
{
	(LPCVOID) o0Ef0,		F,
	(LPCVOID) o0Ef1,		F,
	(LPCVOID) o0Ef2,		F,
	(LPCVOID) o0Ef3,		F,
	(LPCVOID) o0Ef4,		F,
	(LPCVOID) o0Ef5,		F,
	(LPCVOID) o0Ef6,		F,
	(LPCVOID) o0Ef7,		F,
	(LPCVOID) o0Ef8,		F,
	(LPCVOID) o0Ef9,		F,
	(LPCVOID) o0EfA,		F,
	(LPCVOID) o0EfB,		F,
	(LPCVOID) o0EfC,		F,
	(LPCVOID) o0EfD,		F,
	(LPCVOID) o0EfE,		F,
	(LPCVOID) o0EfF,		F
};

static JMPTAB o0_[] =
{
	(LPCVOID) o00,			F,
	(LPCVOID) o01,			F,
	(LPCVOID) o02,			F,
	(LPCVOID) o03,			F,
	(LPCVOID) o04,			F,
	(LPCVOID) o05,			F,
	(LPCVOID) o06,			F,
	(LPCVOID) o07,			F,
	(LPCVOID) o08,			F,
	(LPCVOID) o09,			F,
	(LPCVOID) o0A,			F,
	(LPCVOID) o0B,			F,
	(LPCVOID) o0C,			F,
	(LPCVOID) o0D,			F,
	(LPCVOID) o0E_,			3,
	(LPCVOID) o0F,			F
};

static JMPTAB o_[] =
{
	(LPCVOID) o0_,			1,
	(LPCVOID) o1_,			1,
	(LPCVOID) o2n,			F,
	(LPCVOID) o3X,			F,
	(LPCVOID) o4d2,			F,
	(LPCVOID) o5d2,			F,
	(LPCVOID) o6d3,			F,
	(LPCVOID) o7d3,			F,
	(LPCVOID) o8_,			1,
	(LPCVOID) o9_,			1,
	(LPCVOID) oA_,			1,
	(LPCVOID) oB_,			1,
	(LPCVOID) oC_,			1,
	(LPCVOID) oD_,			1,
	(LPCVOID) oE_,			1,
	(LPCVOID) oF_,			1
};

// opcode dispatcher
VOID EvalOpcode(LPBYTE I)
{
	DWORD   dwIndex = 0;
	PJMPTAB pJmpTab = o_;

	do
	{
		_ASSERT(I[dwIndex] <= 0xf);			// found packed data
		pJmpTab = &pJmpTab[I[dwIndex]];		// table entry by opcode
		dwIndex = pJmpTab->dwTyp;			// next pointer type
		pJmpTab = (PJMPTAB) pJmpTab->pLnk;	// next pointer to table/function
	}
	while (dwIndex != F);					// reference to table? -> again

	((VOID (*)(LPBYTE)) pJmpTab)(I);		// call function
	return;
}
