241 lines
5.5 KiB
C++
241 lines
5.5 KiB
C++
//---------------------------------------------------------------------------
|
|
// 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);
|
|
}
|
|
};
|