#pragma once

#include <cstdint>

namespace InternalEmulator
{

    //CPUInstruction has OPCODE, OPERAND, bytes, and an ACTION.
    struct CPUInstruction
    {
        uint8_t OPCODE;
        char OPERAND[16];
        uint8_t bytes;
        int(*ACTION)(int bytes);
    };

    //All 246 instructions.

    inline int ACIData(int bytes);
    inline int ADCA(int bytes);
    inline int ADCB(int bytes);
    inline int ADCC(int bytes);
    inline int ADCD(int bytes);
    inline int ADCE(int bytes);
    inline int ADCH(int bytes);
    inline int ADCL(int bytes);
    inline int ADCM(int bytes);
    inline int ADDA(int bytes);
    inline int ADDB(int bytes);
    inline int ADDC(int bytes);
    inline int ADDD(int bytes);
    inline int ADDE(int bytes);
    inline int ADDH(int bytes);
    inline int ADDL(int bytes);
    inline int ADDM(int bytes);
    inline int ADIData(int bytes);
    inline int ANAA(int bytes);
    inline int ANAB(int bytes);
    inline int ANAC(int bytes);
    inline int ANAD(int bytes);
    inline int ANAE(int bytes);
    inline int ANAH(int bytes);
    inline int ANAL(int bytes);
    inline int ANAM(int bytes);
    inline int ANIData(int bytes);
    inline int CALLLabel(int bytes);
    inline int CCLabel(int bytes);
    inline int CMLabel(int bytes);
    inline int CMA(int bytes);
    inline int CMC(int bytes);
    inline int CMPA(int bytes);
    inline int CMPB(int bytes);
    inline int CMPC(int bytes);
    inline int CMPD(int bytes);
    inline int CMPE(int bytes);
    inline int CMPH(int bytes);
    inline int CMPL(int bytes);
    inline int CMPM(int bytes);
    inline int CNCLabel(int bytes);
    inline int CNZLabel(int bytes);
    inline int CPLabel(int bytes);
    inline int CPELabel(int bytes);
    inline int CPIData(int bytes);
    inline int CPOLabel(int bytes);
    inline int CZLabel(int bytes);
    inline int DAA(int bytes);
    inline int DADB(int bytes);
    inline int DADD(int bytes);
    inline int DADH(int bytes);
    inline int DADSP(int bytes);
    inline int DCRA(int bytes);
    inline int DCRB(int bytes);
    inline int DCRC(int bytes);
    inline int DCRD(int bytes);
    inline int DCRE(int bytes);
    inline int DCRH(int bytes);
    inline int DCRL(int bytes);
    inline int DCRM(int bytes);
    inline int DCXB(int bytes);
    inline int DCXD(int bytes);
    inline int DCXH(int bytes);
    inline int DCXSP(int bytes);
    inline int DI(int bytes);
    inline int EI(int bytes);
    inline int HLT(int bytes);
    inline int INPortAddress(int bytes);
    inline int INRA(int bytes);
    inline int INRB(int bytes);
    inline int INRC(int bytes);
    inline int INRD(int bytes);
    inline int INRE(int bytes);
    inline int INRH(int bytes);
    inline int INRL(int bytes);
    inline int INRM(int bytes);
    inline int INXB(int bytes);
    inline int INXD(int bytes);
    inline int INXH(int bytes);
    inline int INXSP(int bytes);
    inline int JCLabel(int bytes);
    inline int JMLabel(int bytes);
    inline int JMPLabel(int bytes);
    inline int JNCLabel(int bytes);
    inline int JNZLabel(int bytes);
    inline int JPLabel(int bytes);
    inline int JPELabel(int bytes);
    inline int JPOLabel(int bytes);
    inline int JZLabel(int bytes);
    inline int LDAAddress(int bytes);
    inline int LDAXB(int bytes);
    inline int LDAXD(int bytes);
    inline int LHLDAddress(int bytes);
    inline int LXIB(int bytes);
    inline int LXID(int bytes);
    inline int LXIH(int bytes);
    inline int LXISP(int bytes);
    inline int MOVAA(int bytes);
    inline int MOVAB(int bytes);
    inline int MOVAC(int bytes);
    inline int MOVAD(int bytes);
    inline int MOVAE(int bytes);
    inline int MOVAH(int bytes);
    inline int MOVAL(int bytes);
    inline int MOVAM(int bytes);
    inline int MOVBA(int bytes);
    inline int MOVBB(int bytes);
    inline int MOVBC(int bytes);
    inline int MOVBD(int bytes);
    inline int MOVBE(int bytes);
    inline int MOVBH(int bytes);
    inline int MOVBL(int bytes);
    inline int MOVBM(int bytes);
    inline int MOVCA(int bytes);
    inline int MOVCB(int bytes);
    inline int MOVCC(int bytes);
    inline int MOVCD(int bytes);
    inline int MOVCE(int bytes);
    inline int MOVCH(int bytes);
    inline int MOVCL(int bytes);
    inline int MOVCM(int bytes);
    inline int MOVDA(int bytes);
    inline int MOVDB(int bytes);
    inline int MOVDC(int bytes);
    inline int MOVDD(int bytes);
    inline int MOVDE(int bytes);
    inline int MOVDH(int bytes);
    inline int MOVDL(int bytes);
    inline int MOVDM(int bytes);
    inline int MOVEA(int bytes);
    inline int MOVEB(int bytes);
    inline int MOVEC(int bytes);
    inline int MOVED(int bytes);
    inline int MOVEE(int bytes);
    inline int MOVEH(int bytes);
    inline int MOVEL(int bytes);
    inline int MOVEM(int bytes);
    inline int MOVHA(int bytes);
    inline int MOVHB(int bytes);
    inline int MOVHC(int bytes);
    inline int MOVHD(int bytes);
    inline int MOVHE(int bytes);
    inline int MOVHH(int bytes);
    inline int MOVHL(int bytes);
    inline int MOVHM(int bytes);
    inline int MOVLA(int bytes);
    inline int MOVLB(int bytes);
    inline int MOVLC(int bytes);
    inline int MOVLD(int bytes);
    inline int MOVLE(int bytes);
    inline int MOVLH(int bytes);
    inline int MOVLL(int bytes);
    inline int MOVLM(int bytes);
    inline int MOVMA(int bytes);
    inline int MOVMB(int bytes);
    inline int MOVMC(int bytes);
    inline int MOVMD(int bytes);
    inline int MOVME(int bytes);
    inline int MOVMH(int bytes);
    inline int MOVML(int bytes);
    inline int MVIAData(int bytes);
    inline int MVIBData(int bytes);
    inline int MVICData(int bytes);
    inline int MVIDData(int bytes);
    inline int MVIEData(int bytes);
    inline int MVIHData(int bytes);
    inline int MVILData(int bytes);
    inline int MVIMData(int bytes);
    inline int NOP(int bytes);
    inline int ORAA(int bytes);
    inline int ORAB(int bytes);
    inline int ORAC(int bytes);
    inline int ORAD(int bytes);
    inline int ORAE(int bytes);
    inline int ORAH(int bytes);
    inline int ORAL(int bytes);
    inline int ORAM(int bytes);
    inline int ORIData(int bytes);
    inline int OUTPortAddress(int bytes);
    inline int PCHL(int bytes);
    inline int POPB(int bytes);
    inline int POPD(int bytes);
    inline int POPH(int bytes);
    inline int POPPSW(int bytes);
    inline int PUSHB(int bytes);
    inline int PUSHD(int bytes);
    inline int PUSHH(int bytes);
    inline int PUSHPSW(int bytes);
    inline int RAL(int bytes);
    inline int RAR(int bytes);
    inline int RC(int bytes);
    inline int RET(int bytes);
    inline int RIM(int bytes);
    inline int RLC(int bytes);
    inline int DSUB(int bytes);
    inline int RM(int bytes);
    inline int RNC(int bytes);
    inline int RNZ(int bytes);
    inline int RP(int bytes);
    inline int RPE(int bytes);
    inline int RPO(int bytes);
    inline int RRC(int bytes);
    inline int RST0(int bytes);
    inline int RST1(int bytes);
    inline int RST2(int bytes);
    inline int RST3(int bytes);
    inline int RST4(int bytes);
    inline int RST5(int bytes);
    inline int RST6(int bytes);
    inline int RST7(int bytes);
    inline int RZ(int bytes);
    inline int SBBA(int bytes);
    inline int SBBB(int bytes);
    inline int SBBC(int bytes);
    inline int SBBD(int bytes);
    inline int SBBE(int bytes);
    inline int SBBH(int bytes);
    inline int SBBL(int bytes);
    inline int SBBM(int bytes);
    inline int SBIData(int bytes);
    inline int SHLDAddress(int bytes);
    inline int SIM(int bytes);
    inline int SPHL(int bytes);
    inline int STAAddress(int bytes);
    inline int STAXB(int bytes);
    inline int STAXD(int bytes);
    inline int STC(int bytes);
    inline int SUBA(int bytes);
    inline int SUBB(int bytes);
    inline int SUBC(int bytes);
    inline int SUBD(int bytes);
    inline int SUBE(int bytes);
    inline int SUBH(int bytes);
    inline int SUBL(int bytes);
    inline int SUBM(int bytes);
    inline int SUIData(int bytes);
    inline int XCHG(int bytes);
    inline int XRAA(int bytes);
    inline int XRAB(int bytes);
    inline int XRAC(int bytes);
    inline int XRAD(int bytes);
    inline int XRAE(int bytes);
    inline int XRAH(int bytes);
    inline int XRAL(int bytes);
    inline int XRAM(int bytes);
    inline int XRIData(int bytes);
    inline int XTHL(int bytes);

    //List of instructions declared in .cpp file.
    extern CPUInstruction CPUInstructions[256];

}