emu48plus-mirror/source/FETCH.C
Gwenhael Le Moine edf519e5a1
2013-09-14: Updated to version 53
Signed-off-by: Gwenhael Le Moine <gwenhael.le.moine@gmail.com>
2024-03-20 07:46:28 +01:00

778 lines
12 KiB
C

/*
* fetch.c
*
* This file is part of Emu48
*
* Copyright (C) 1999 Christoph Gießelink
*
*/
#include "pch.h"
#include "Opcodes.h"
#define F 0xFF // F = function
typedef struct
{
const VOID *pLnk;
const DWORD dwTyp;
} JMPTAB, *PJMPTAB;
// jump tables
static const JMPTAB oF_[] =
{
oF0, F,
oF1, F,
oF2, F,
oF3, F,
oF4, F,
oF5, F,
oF6, F,
oF7, F,
oF8, F,
oF9, F,
oFA, F,
oFB, F,
oFC, F,
oFD, F,
oFE, F,
oFF, F
};
static const JMPTAB oE_[] =
{
oE0, F,
oE1, F,
oE2, F,
oE3, F,
oE4, F,
oE5, F,
oE6, F,
oE7, F,
oE8, F,
oE9, F,
oEA, F,
oEB, F,
oEC, F,
oED, F,
oEE, F,
oEF, F
};
static const JMPTAB oD_[] =
{
oD0, F,
oD1, F,
oD2, F,
oD3, F,
oD4, F,
oD5, F,
oD6, F,
oD7, F,
oD8, F,
oD9, F,
oDA, F,
oDB, F,
oDC, F,
oDD, F,
oDE, F,
oDF, F
};
static const JMPTAB oC_[] =
{
oC0, F,
oC1, F,
oC2, F,
oC3, F,
oC4, F,
oC5, F,
oC6, F,
oC7, F,
oC8, F,
oC9, F,
oCA, F,
oCB, F,
oCC, F,
oCD, F,
oCE, F,
oCF, F
};
static const JMPTAB oBb_[] =
{
oBb0, F,
oBb1, F,
oBb2, F,
oBb3, F,
oBb4, F,
oBb5, F,
oBb6, F,
oBb7, F,
oBb8, F,
oBb9, F,
oBbA, F,
oBbB, F,
oBbC, F,
oBbD, F,
oBbE, F,
oBbF, F
};
static const JMPTAB oBa_[] =
{
oBa0, F,
oBa1, F,
oBa2, F,
oBa3, F,
oBa4, F,
oBa5, F,
oBa6, F,
oBa7, F,
oBa8, F,
oBa9, F,
oBaA, F,
oBaB, F,
oBaC, F,
oBaD, F,
oBaE, F,
oBaF, F
};
static const JMPTAB oB_[] =
{
oBa_, 2,
oBa_, 2,
oBa_, 2,
oBa_, 2,
oBa_, 2,
oBa_, 2,
oBa_, 2,
oBa_, 2,
oBb_, 2,
oBb_, 2,
oBb_, 2,
oBb_, 2,
oBb_, 2,
oBb_, 2,
oBb_, 2,
oBb_, 2
};
static const JMPTAB oAb_[] =
{
oAb0, F,
oAb1, F,
oAb2, F,
oAb3, F,
oAb4, F,
oAb5, F,
oAb6, F,
oAb7, F,
oAb8, F,
oAb9, F,
oAbA, F,
oAbB, F,
oAbC, F,
oAbD, F,
oAbE, F,
oAbF, F
};
static const JMPTAB oAa_[] =
{
oAa0, F,
oAa1, F,
oAa2, F,
oAa3, F,
oAa4, F,
oAa5, F,
oAa6, F,
oAa7, F,
oAa8, F,
oAa9, F,
oAaA, F,
oAaB, F,
oAaC, F,
oAaD, F,
oAaE, F,
oAaF, F
};
static const JMPTAB oA_[] =
{
oAa_, 2,
oAa_, 2,
oAa_, 2,
oAa_, 2,
oAa_, 2,
oAa_, 2,
oAa_, 2,
oAa_, 2,
oAb_, 2,
oAb_, 2,
oAb_, 2,
oAb_, 2,
oAb_, 2,
oAb_, 2,
oAb_, 2,
oAb_, 2
};
static const JMPTAB o9b_[] =
{
o9b0, F,
o9b1, F,
o9b2, F,
o9b3, F,
o9b4, F,
o9b5, F,
o9b6, F,
o9b7, F,
o9b8, F,
o9b9, F,
o9bA, F,
o9bB, F,
o9bC, F,
o9bD, F,
o9bE, F,
o9bF, F
};
static const JMPTAB o9a_[] =
{
o9a0, F,
o9a1, F,
o9a2, F,
o9a3, F,
o9a4, F,
o9a5, F,
o9a6, F,
o9a7, F,
o9a8, F,
o9a9, F,
o9aA, F,
o9aB, F,
o9aC, F,
o9aD, F,
o9aE, F,
o9aF, F
};
static const JMPTAB o9_[] =
{
o9a_, 2,
o9a_, 2,
o9a_, 2,
o9a_, 2,
o9a_, 2,
o9a_, 2,
o9a_, 2,
o9a_, 2,
o9b_, 2,
o9b_, 2,
o9b_, 2,
o9b_, 2,
o9b_, 2,
o9b_, 2,
o9b_, 2,
o9b_, 2
};
static const JMPTAB o8B_[] =
{
o8B0, F,
o8B1, F,
o8B2, F,
o8B3, F,
o8B4, F,
o8B5, F,
o8B6, F,
o8B7, F,
o8B8, F,
o8B9, F,
o8BA, F,
o8BB, F,
o8BC, F,
o8BD, F,
o8BE, F,
o8BF, F
};
static const JMPTAB o8A_[] =
{
o8A0, F,
o8A1, F,
o8A2, F,
o8A3, F,
o8A4, F,
o8A5, F,
o8A6, F,
o8A7, F,
o8A8, F,
o8A9, F,
o8AA, F,
o8AB, F,
o8AC, F,
o8AD, F,
o8AE, F,
o8AF, F
};
static const JMPTAB o81B_[] =
{
o_invalid4, F,
o81B1, F, // normally o_invalid4, beep patch, Apple: LOOP
o81B2, F,
o81B3, F,
o81B4, F,
o81B5, F,
o81B6, F,
o81B7, F,
o_invalid4, F, // Apple: SKPTOP
o_invalid4, F, // Apple: SKBOT
o_invalid4, F, // Apple: SKIP
o_invalid4, F, // Apple: SKPLEN
o_invalid4, F, // Apple: SKPID
o_invalid4, F, // Apple: $SEMI
o_invalid4, F, // Apple: DOCOL
o_invalid4, F
};
static const JMPTAB o81Af2_[] =
{
o81Af20, F,
o81Af21, F,
o81Af22, F,
o81Af23, F,
o81Af24, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o81Af28, F,
o81Af29, F,
o81Af2A, F,
o81Af2B, F,
o81Af2C, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F
};
static const JMPTAB o81Af1_[] =
{
o81Af10, F,
o81Af11, F,
o81Af12, F,
o81Af13, F,
o81Af14, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o81Af18, F,
o81Af19, F,
o81Af1A, F,
o81Af1B, F,
o81Af1C, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F
};
static const JMPTAB o81Af0_[] =
{
o81Af00, F,
o81Af01, F,
o81Af02, F,
o81Af03, F,
o81Af04, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o81Af08, F,
o81Af09, F,
o81Af0A, F,
o81Af0B, F,
o81Af0C, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F
};
static const JMPTAB o81A_[] =
{
o81Af0_, 5,
o81Af1_, 5,
o81Af2_, 5,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F
};
static const JMPTAB o819_[] =
{
o819f0, F,
o819f1, F,
o819f2, F,
o819f3, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F
};
static const JMPTAB o818_[] =
{
o818f0x, F,
o818f1x, F,
o818f2x, F,
o818f3x, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o818f8x, F,
o818f9x, F,
o818fAx, F,
o818fBx, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F,
o_invalid6, F
};
static const JMPTAB o81_[] =
{
o810, F,
o811, F,
o812, F,
o813, F,
o814, F,
o815, F,
o816, F,
o817, F,
o818_, 4,
o819_, 4,
o81A_, 4,
o81B_, 3,
o81C, F,
o81D, F,
o81E, F,
o81F, F
};
static const JMPTAB o8081_[] =
{
o80810, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F,
o_invalid5, F
};
static const JMPTAB o808_[] =
{
o8080, F,
o8081_, 4,
o8082X, F,
o8083, F,
o8084n, F,
o8085n, F,
o8086n, F,
o8087n, F,
o8088n, F,
o8089n, F,
o808An, F,
o808Bn, F,
o808C, F,
o808D, F,
o808E, F,
o808F, F
};
static const JMPTAB o80_[] =
{
o800, F,
o801, F,
o802, F,
o803, F,
o804, F,
o805, F,
o806, F,
o807, F,
o808_, 3,
o809, F,
o80A, F,
o80B, F,
o80Cn, F,
o80Dn, F,
o80E, F,
o80Fn, F
};
static const JMPTAB o8_[] =
{
o80_, 2,
o81_, 2,
o82n, F,
o83n, F,
o84n, F,
o85n, F,
o86n, F,
o87n, F,
o88n, F,
o89n, F,
o8A_, 2,
o8B_, 2,
o8Cd4, F,
o8Dd5, F,
o8Ed4, F,
o8Fd5, F
};
static const JMPTAB o15_[] =
{
o150a, F,
o151a, F,
o152a, F,
o153a, F,
o154a, F,
o155a, F,
o156a, F,
o157a, F,
o158x, F,
o159x, F,
o15Ax, F,
o15Bx, F,
o15Cx, F,
o15Dx, F,
o15Ex, F,
o15Fx, F
};
static const JMPTAB o14_[] =
{
o140, F,
o141, F,
o142, F,
o143, F,
o144, F,
o145, F,
o146, F,
o147, F,
o148, F,
o149, F,
o14A, F,
o14B, F,
o14C, F,
o14D, F,
o14E, F,
o14F, F
};
static const JMPTAB o13_[] =
{
o130, F,
o131, F,
o132, F,
o133, F,
o134, F,
o135, F,
o136, F,
o137, F,
o138, F,
o139, F,
o13A, F,
o13B, F,
o13C, F,
o13D, F,
o13E, F,
o13F, F
};
static const JMPTAB o12_[] =
{
o120, F,
o121, F,
o122, F,
o123, F,
o124, F,
o_invalid3, F,
o_invalid3, F,
o_invalid3, F,
o128, F,
o129, F,
o12A, F,
o12B, F,
o12C, F,
o_invalid3, F,
o_invalid3, F,
o_invalid3, F
};
static const JMPTAB o11_[] =
{
o110, F,
o111, F,
o112, F,
o113, F,
o114, F,
o_invalid3, F,
o_invalid3, F,
o_invalid3, F,
o118, F,
o119, F,
o11A, F,
o11B, F,
o11C, F,
o_invalid3, F,
o_invalid3, F,
o_invalid3, F
};
static const JMPTAB o10_[] =
{
o100, F,
o101, F,
o102, F,
o103, F,
o104, F,
o_invalid3, F,
o_invalid3, F,
o_invalid3, F,
o108, F,
o109, F,
o10A, F,
o10B, F,
o10C, F,
o_invalid3, F,
o_invalid3, F,
o_invalid3, F
};
static const JMPTAB o1_[] =
{
o10_, 2,
o11_, 2,
o12_, 2,
o13_, 2,
o14_, 2,
o15_, 2,
o16x, F,
o17x, F,
o18x, F,
o19d2, F,
o1Ad4, F,
o1Bd5, F,
o1Cx, F,
o1Dd2, F,
o1Ed4, F,
o1Fd5, F
};
static const JMPTAB o0E_[] =
{
o0Ef0, F,
o0Ef1, F,
o0Ef2, F,
o0Ef3, F,
o0Ef4, F,
o0Ef5, F,
o0Ef6, F,
o0Ef7, F,
o0Ef8, F,
o0Ef9, F,
o0EfA, F,
o0EfB, F,
o0EfC, F,
o0EfD, F,
o0EfE, F,
o0EfF, F
};
static const JMPTAB o0_[] =
{
o00, F,
o01, F,
o02, F,
o03, F,
o04, F,
o05, F,
o06, F,
o07, F,
o08, F,
o09, F,
o0A, F,
o0B, F,
o0C, F,
o0D, F,
o0E_, 3,
o0F, F
};
static const JMPTAB o_[] =
{
o0_, 1,
o1_, 1,
o2n, F,
o3X, F,
o4d2, F,
o5d2, F,
o6d3, F,
o7d3, F,
o8_, 1,
o9_, 1,
oA_, 1,
oB_, 1,
oC_, 1,
oD_, 1,
oE_, 1,
oF_, 1
};
// opcode dispatcher
VOID EvalOpcode(LPBYTE I)
{
DWORD dwTemp,dwIndex = 0;
JMPTAB const *pJmpTab = o_;
do
{
dwTemp = I[dwIndex]; // table entry
_ASSERT(dwTemp <= 0xf); // found packed data
dwIndex = pJmpTab[dwTemp].dwTyp; // next pointer type
pJmpTab = (PJMPTAB) pJmpTab[dwTemp].pLnk; // next pointer to table/function
}
while (dwIndex != F); // reference to table? -> again
((VOID (*)(LPBYTE)) pJmpTab)(I); // call function
return;
}