BizHawk/waterbox/ngp/TLCS-900h/TLCS900h_disassemble_dst.cpp

241 lines
5.5 KiB
C++
Raw Normal View History

//---------------------------------------------------------------------------
// NEOPOP : Emulator as in Dreamland
//
// Copyright (c) 2001-2002 by neopop_uk
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version. See also the license.txt file for
// additional informations.
//---------------------------------------------------------------------------
/*
//---------------------------------------------------------------------------
//=========================================================================
TLCS900h_disassemble_dst.c
//=========================================================================
//---------------------------------------------------------------------------
History of changes:
===================
20 JUL 2002 - neopop_uk
=======================================
- Cleaned and tidied up for the source release
//---------------------------------------------------------------------------
*/
//=========================================================================
#include "../neopop.h"
#include "TLCS900h_disassemble.h"
#include "TLCS900h_registers.h"
#include "TLCS900h_interpret.h"
//=========================================================================
namespace TLCS900H
{
static void LDBi()
{
sprintf(instr, "LD (%s),0x%02X", extra, get8_dis());
}
static void LDWi()
{
sprintf(instr, "LD (%s),0x%04X", extra, get16_dis());
}
static void POPB()
{
sprintf(instr, "POP.b (%s)", extra);
}
static void POPW()
{
sprintf(instr, "POP.w (%s)", extra);
}
static void LDBm16()
{
sprintf(instr, "LD.b (%s),(0x%04X)", extra, get16_dis());
}
static void LDWm16()
{
sprintf(instr, "LD.w (%s),(0x%04X)", extra, get16_dis());
}
static void LDAW()
{
sprintf(instr, "LDA %s,%s", gprName[second & 7][1], extra);
}
static void LDAL()
{
sprintf(instr, "LDA %s,%s", gprName[second & 7][2], extra);
}
static void ANDCFA()
{
sprintf(instr, "ANDCF A,(%s)", extra);
}
static void ORCFA()
{
sprintf(instr, "ORCF A,(%s)", extra);
}
static void XORCFA()
{
sprintf(instr, "XORCF A,(%s)", extra);
}
static void LDCFA()
{
sprintf(instr, "LDCF A,(%s)", extra);
}
static void STCFA()
{
sprintf(instr, "STCF A,(%s)", extra);
}
static void LDBR()
{
sprintf(instr, "LD (%s),%s", extra, gprName[second&7][0]);
}
static void LDWR()
{
sprintf(instr, "LD (%s),%s", extra, gprName[second&7][1]);
}
static void LDLR()
{
sprintf(instr, "LD (%s),%s", extra, gprName[second&7][2]);
}
static void ANDCF()
{
sprintf(instr, "ANDCF %d,(%s)", second & 7, extra);
}
static void ORCF()
{
sprintf(instr, "ORCF %d,(%s)", second & 7, extra);
}
static void XORCF()
{
sprintf(instr, "XORCF %d,(%s)", second & 7, extra);
}
static void LDCF()
{
sprintf(instr, "LDCF %d,(%s)", second & 7, extra);
}
static void STCF()
{
sprintf(instr, "STCF %d,(%s)", second & 7, extra);
}
static void TSET()
{
sprintf(instr, "TSET %d,(%s)", second & 7, extra);
}
static void RES()
{
sprintf(instr, "RES %d,(%s)", second & 7, extra);
}
static void SET()
{
sprintf(instr, "SET %d,(%s)", second & 7, extra);
}
static void CHG()
{
sprintf(instr, "CHG %d,(%s)", second & 7, extra);
}
static void BIT()
{
sprintf(instr, "BIT %d,(%s)", second & 7, extra);
}
static void JP()
{
sprintf(instr, "JP %s,%s", ccName[second & 0xF], extra);
}
static void CALL()
{
sprintf(instr, "CALL %s,%s", ccName[second & 0xF], extra);
}
static void RET()
{
sprintf(instr, "RET %s", ccName[second & 0xF]);
}
//=========================================================================
//Secondary (DST) Instruction decode
static void (*decode[256])() =
{
/*0*/ LDBi, 0, LDWi, 0, POPB, 0, POPW, 0,
0, 0, 0, 0, 0, 0, 0, 0,
/*1*/ 0, 0, 0, 0, LDBm16, 0, LDWm16, 0,
0, 0, 0, 0, 0, 0, 0, 0,
/*2*/ LDAW, LDAW, LDAW, LDAW, LDAW, LDAW, LDAW, LDAW,
ANDCFA, ORCFA, XORCFA, LDCFA, STCFA, 0, 0, 0,
/*3*/ LDAL, LDAL, LDAL, LDAL, LDAL, LDAL, LDAL, LDAL,
0, 0, 0, 0, 0, 0, 0, 0,
/*4*/ LDBR, LDBR, LDBR, LDBR, LDBR, LDBR, LDBR, LDBR,
0, 0, 0, 0, 0, 0, 0, 0,
/*5*/ LDWR, LDWR, LDWR, LDWR, LDWR, LDWR, LDWR, LDWR,
0, 0, 0, 0, 0, 0, 0, 0,
/*6*/ LDLR, LDLR, LDLR, LDLR, LDLR, LDLR, LDLR, LDLR,
0, 0, 0, 0, 0, 0, 0, 0,
/*7*/ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
/*8*/ ANDCF, ANDCF, ANDCF, ANDCF, ANDCF, ANDCF, ANDCF, ANDCF,
ORCF, ORCF, ORCF, ORCF, ORCF, ORCF, ORCF, ORCF,
/*9*/ XORCF, XORCF, XORCF, XORCF, XORCF, XORCF, XORCF, XORCF,
LDCF, LDCF, LDCF, LDCF, LDCF, LDCF, LDCF, LDCF,
/*A*/ STCF, STCF, STCF, STCF, STCF, STCF, STCF, STCF,
TSET, TSET, TSET, TSET, TSET, TSET, TSET, TSET,
/*B*/ RES, RES, RES, RES, RES, RES, RES, RES,
SET, SET, SET, SET, SET, SET, SET, SET,
/*C*/ CHG, CHG, CHG, CHG, CHG, CHG, CHG, CHG,
BIT, BIT, BIT, BIT, BIT, BIT, BIT, BIT,
/*D*/ JP, JP, JP, JP, JP, JP, JP, JP,
JP, JP, JP, JP, JP, JP, JP, JP,
/*E*/ CALL, CALL, CALL, CALL, CALL, CALL, CALL, CALL,
CALL, CALL, CALL, CALL, CALL, CALL, CALL, CALL,
/*F*/ RET, RET, RET, RET, RET, RET, RET, RET,
RET, RET, RET, RET, RET, RET, RET, RET
};
//=============================================================================
void TLCS900h_disassemble_dst(void)
{
second = get8_dis(); //Get the second opcode
if (decode[second])
(*decode[second])();
else
sprintf(instr, "unknown dst instr. %02X", second);
}
};