summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2016-04-11 21:45:07 +0200
committer hap <happppp@users.noreply.github.com>2016-04-11 21:45:26 +0200
commitbac87f62fa4bb838f0dadaf1db115fce21bcc388 (patch)
tree6d7dac8e06ff608a9c4745914e3d2be6b9eb713e
parent5f05b2d39e04310821b7bb56681c990b875c0426 (diff)
sm510: added KB1013VK1-2 disasm
-rw-r--r--src/devices/cpu/sm510/kb1013vk1-2.h3
-rw-r--r--src/devices/cpu/sm510/kb1013vk1-2core.cpp94
-rw-r--r--src/devices/cpu/sm510/kb1013vk1-2op.cpp12
-rw-r--r--src/devices/cpu/sm510/sm510d.cpp70
-rw-r--r--src/tools/unidasm.cpp2
5 files changed, 135 insertions, 46 deletions
diff --git a/src/devices/cpu/sm510/kb1013vk1-2.h b/src/devices/cpu/sm510/kb1013vk1-2.h
index bc436fb1e9b..7e8c739354d 100644
--- a/src/devices/cpu/sm510/kb1013vk1-2.h
+++ b/src/devices/cpu/sm510/kb1013vk1-2.h
@@ -26,9 +26,12 @@ public:
kb1013vk12_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
protected:
+ virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
virtual void execute_one() override;
// opcode handlers
+ virtual void op_bs0();
+ virtual void op_bs1();
};
diff --git a/src/devices/cpu/sm510/kb1013vk1-2core.cpp b/src/devices/cpu/sm510/kb1013vk1-2core.cpp
index 8c65b908a9f..1aa40b87cdb 100644
--- a/src/devices/cpu/sm510/kb1013vk1-2core.cpp
+++ b/src/devices/cpu/sm510/kb1013vk1-2core.cpp
@@ -33,6 +33,14 @@ kb1013vk12_device::kb1013vk12_device(const machine_config &mconfig, const char *
{ }
+// disasm
+offs_t kb1013vk12_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
+{
+ extern CPU_DISASSEMBLE(kb1013vk12);
+ return CPU_DISASSEMBLE_NAME(kb1013vk12)(this, buffer, pc, oprom, opram, options);
+}
+
+
//-------------------------------------------------
// execute
@@ -42,75 +50,75 @@ void kb1013vk12_device::execute_one()
{
switch (m_op & 0xf0)
{
- case 0x20: op_lax(); break;
- case 0x30: op_adx(); break;
- case 0x40: op_lb(); break;
- case 0x70: op_ssr(); break;
+ case 0x20: op_lax(); break; // LC
+ case 0x30: op_adx(); break; // AS/A10
+ case 0x40: op_lb(); break; // LAS
+ case 0x70: op_ssr(); break; // LP
case 0x80: case 0x90: case 0xa0: case 0xb0:
- op_t(); break;
+ op_t(); break; // BR (LP+this=JMP)
case 0xc0: case 0xd0: case 0xe0: case 0xf0:
- op_trs(); break;
+ op_trs(); break; // CBR/CZP (LP+this=CAL)
default:
switch (m_op & 0xfc)
{
- case 0x04: op_rm(); break;
- case 0x0c: op_sm(); break;
- case 0x10: op_exc(); break;
- case 0x14: op_exci(); break;
- case 0x18: op_lda(); break;
- case 0x1c: op_excd(); break;
- case 0x54: op_tmi(); break;
+ case 0x04: op_rm(); break; // BM0
+ case 0x0c: op_sm(); break; // BM1
+ case 0x10: op_exc(); break; // XM/XE
+ case 0x14: op_exci(); break; // XI/XEI
+ case 0x18: op_lda(); break; // LE
+ case 0x1c: op_excd(); break; // XD/XED
+ case 0x54: op_tmi(); break; // SM1
default:
switch (m_op)
{
- case 0x00: op_skip(); break;
- case 0x01: op_atr(); break;
- case 0x02: op_exksa(); break;
+ case 0x00: op_skip(); break; // NOP
+ case 0x01: op_atr(); break; // OAR
+ case 0x02: op_bs1(); break; // *BS1
case 0x03: op_atbp(); break;
- case 0x08: op_add(); break;
- case 0x09: op_add11(); break;
- case 0x0a: op_coma(); break;
- case 0x0b: op_exbla(); break;
-
- case 0x50: op_tal(); break;
- case 0x51: op_tb(); break;
- case 0x52: op_tc(); break;
- case 0x53: op_tam(); break;
- case 0x58: op_tis(); break;
+ case 0x08: op_add(); break; // AM
+ case 0x09: op_add11(); break; // AC
+ case 0x0a: op_coma(); break; // COM
+ case 0x0b: op_exbla(); break; // XL
+
+ case 0x50: op_tal(); break; // SI1
+ case 0x51: op_tb(); break; // SI0
+ case 0x52: op_tc(); break; // SCO
+ case 0x53: op_tam(); break; // SAM
+ case 0x58: op_tis(); break; // TIM
case 0x59: op_ptw(); break;
- case 0x5a: op_ta0(); break;
- case 0x5b: op_tabl(); break;
+ case 0x5a: op_ta0(); break; // SAO
+ case 0x5b: op_tabl(); break; // SAL
case 0x5c: op_tw(); break;
case 0x5d: op_dtw(); break;
- case 0x5f: op_lbl(); break;
+ case 0x5f: op_lbl(); break; // LAF
case 0x60: op_comcn(); break;
case 0x61: op_pdtw(); break;
case 0x62: op_wr(); break;
case 0x63: op_ws(); break;
- case 0x64: op_incb(); break;
- case 0x65: op_idiv(); break;
- case 0x66: op_rc(); break;
- case 0x67: op_sc(); break;
- case 0x68: op_rmf(); break;
- case 0x69: op_smf(); break;
- case 0x6a: op_kta(); break;
- case 0x6b: op_exkfa(); break;
- case 0x6c: op_decb(); break;
- case 0x6d: op_comcb(); break;
- case 0x6e: op_rtn0(); break;
- case 0x6f: op_rtn1(); break;
+ case 0x64: op_incb(); break; // INC
+ case 0x65: op_idiv(); break; // SYN
+ case 0x66: op_rc(); break; // CLC
+ case 0x67: op_sc(); break; // STC
+ case 0x68: op_rmf(); break; // CLL
+ case 0x69: op_smf(); break; // LD0
+ case 0x6a: op_kta(); break; // ICD
+ case 0x6b: op_bs0(); break; // *BS0
+ case 0x6c: op_decb(); break; // DEC
+ case 0x6d: op_comcb(); break; // CMS
+ case 0x6e: op_rtn0(); break; // RT
+ case 0x6f: op_rtn1(); break; // RTS
// extended opcodes
case 0x5e:
m_op = m_op << 8 | m_param;
switch (m_param)
{
- case 0x00: op_cend(); break;
- case 0x04: op_dta(); break;
+ case 0x00: op_cend(); break; // HLT
+ case 0x04: op_dta(); break; // LDF
default: op_illegal(); break;
}
diff --git a/src/devices/cpu/sm510/kb1013vk1-2op.cpp b/src/devices/cpu/sm510/kb1013vk1-2op.cpp
index 8d05aacb45f..3c5fcc548e7 100644
--- a/src/devices/cpu/sm510/kb1013vk1-2op.cpp
+++ b/src/devices/cpu/sm510/kb1013vk1-2op.cpp
@@ -7,3 +7,15 @@
// instruction set
+
+void kb1013vk12_device::op_bs0()
+{
+ // BS0: reset RAM address high bit
+ m_bm &= ~4;
+}
+
+void kb1013vk12_device::op_bs1()
+{
+ // BS1: set RAM address high bit
+ m_bm |= 4;
+}
diff --git a/src/devices/cpu/sm510/sm510d.cpp b/src/devices/cpu/sm510/sm510d.cpp
index 81ede8e5cf4..7c78c33b318 100644
--- a/src/devices/cpu/sm510/sm510d.cpp
+++ b/src/devices/cpu/sm510/sm510d.cpp
@@ -32,9 +32,13 @@ enum e_mnemonics
mADDC, mPDTW, mTW, mDTW,
mATS, mEXKSA, mEXKFA,
mRMF, mSMF, mCOMCN,
- mTA, mTM2, mTG
+ mTA, mTM2, mTG,
// KB1013VK1-2 aliases
+ mLC, mLM, mLE, mLAF, mLAS, mLDF, mBS0, mBS1, mXL, mXM, mXI, mXEI, mXD, mXED, mXE, mBM0, mBM1, mSM1,
+ mAM, mAC, mA10, mAS, mCLL, mCOM, mCLC, mSTC, mSCO, mSAO, mINC, mDEC, mSAM, mSAL, mNOP,
+ mICD, mOAR, mOA0, mOA1, mDAF, mDAS, mABS, mABF, mCTB, mLD0, mEN,
+ mBR, mLP, mCBR, mCMS, mRT, mRTS, mSI1, mSI0, mSYN, mTIM, mHLT
};
static const char *const s_mnemonics[] =
@@ -56,6 +60,12 @@ static const char *const s_mnemonics[] =
"ATS", "EXKSA", "EXKFA",
"RMF", "SMF", "COMCN",
"TA", "TM", "TG"
+
+ //
+ "LC", "LM", "LE", "LAF", "LAS", "LDF", "BS0", "BS1", "XL", "XM", "XI", "XEI", "XD", "XED", "XE", "BM0", "BM1", "SM1",
+ "AM", "AC", "A10", "AS", "CLL", "COM", "CLC", "STC", "SCO", "SAO", "INC", "DEC", "SAM", "SAL", "NOP",
+ "ICD", "OAR", "OA0", "OA1", "DAF", "DAS", "ABS", "ABF", "CTB", "LD0", "EN",
+ "BR", "LP", "CBR", "CMS", "RT", "RTS", "SI1", "SI0", "SYN", "TIM", "HLT"
};
// number of bits per opcode parameter, 8 or larger means 2-byte opcode
@@ -77,7 +87,13 @@ static const UINT8 s_bits[] =
0, 0, 0, 0,
0, 0, 0,
0, 0, 0,
- 0, 2, 0
+ 0, 2, 0,
+
+ //
+ 4, 0, 2, 8, 4, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2,
+ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0
};
#define _OVER DASMFLAG_STEP_OVER
@@ -101,7 +117,13 @@ static const UINT32 s_flags[] =
0, 0, 0, 0,
0, 0, 0,
0, 0, 0,
- 0, 0, 0
+ 0, 0, 0,
+
+ //
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, _OVER, 0, _OUT, _OUT, 0, 0, 0, 0, _OVER
};
// next program counter in sequence (relative)
@@ -286,3 +308,45 @@ CPU_DISASSEMBLE(sm500)
return sm510_common_disasm(sm500_mnemonic, ext, buffer, pc, oprom, opram);
}
+
+
+// KB1013VK1-2 disasm
+
+static const UINT8 kb1013vk12_mnemonic[0x100] =
+{
+/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+ mNOP, mOAR, mBS1, mEN, mBM0, mBM0, mBM0, mBM0, mAM, mAC, mCOM, mXL, mBM1, mBM1, mBM1, mBM1, // 0
+ mXM, mXE, mXE, mXE, mXI, mXEI, mXEI, mXEI, mLE, mLE, mLE, mLDA, mXD, mXED, mXED, mXED, // 1
+ mLC, mLC, mLC, mLC, mLC, mLC, mLC, mLC, mLC, mLC, mLC, mLC, mLC, mLC, mLC, mLC, // 2
+ mAS, mAS, mAS, mAS, mAS, mAS, mAS, mAS, mAS, mAS, mA10, mAS, mAS, mAS, mAS, mAS, // 3
+
+ mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, mLAS, // 4
+ mSI1, mSI0, mSCO, mSAM, mSM1, mSM1, mSM1, mSM1, mTIM, mABS, mSAO, mSAL, mABF, mDAF, mEXT, mLAF, // 5
+ mCTB, mDAS, mOA1, mOA0, mINC, mSYN, mCLC, mSTC, mCLL, mLD0, mICD, mBS0, mDEC, mCMS, mRT, mRTS, // 6
+ mLP, mLP, mLP, mLP, mLP, mLP, mLP, mLP, mLP, mLP, mLP, mLP, mLP, mLP, mLP, mLP, // 7
+
+ mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, // 8
+ mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, // 9
+ mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, // A
+ mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, // B
+
+ mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, // C
+ mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, // D
+ mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, // E
+ mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR // F
+};
+
+static const UINT8 kb1013vk12_extended[0x10] =
+{
+ mHLT, 0, 0, 0, mLDF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 5E 0
+};
+
+CPU_DISASSEMBLE(kb1013vk12)
+{
+ // create extended opcode table
+ UINT8 ext[0x100];
+ memset(ext, 0, 0x100);
+ memcpy(ext + 0x00, kb1013vk12_extended, 0x10);
+
+ return sm510_common_disasm(kb1013vk12_mnemonic, ext, buffer, pc, oprom, opram);
+}
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp
index 05f622aa45a..e70f1fc13ac 100644
--- a/src/tools/unidasm.cpp
+++ b/src/tools/unidasm.cpp
@@ -110,6 +110,7 @@ CPU_DISASSEMBLE( i960 );
CPU_DISASSEMBLE( ie15 );
CPU_DISASSEMBLE( jaguardsp );
CPU_DISASSEMBLE( jaguargpu );
+CPU_DISASSEMBLE( kb1013vk12 );
CPU_DISASSEMBLE( konami );
CPU_DISASSEMBLE( lh5801 );
CPU_DISASSEMBLE( lr35902 );
@@ -266,6 +267,7 @@ static const dasm_table_entry dasm_table[] =
{ "ie15", _8bit, 0, CPU_DISASSEMBLE_NAME(ie15) },
{ "jaguardsp", _16be, 0, CPU_DISASSEMBLE_NAME(jaguardsp) },
{ "jaguargpu", _16be, 0, CPU_DISASSEMBLE_NAME(jaguargpu) },
+ { "kb1013vk12", _8bit, 0, CPU_DISASSEMBLE_NAME(kb1013vk12) },
{ "konami", _8bit, 0, CPU_DISASSEMBLE_NAME(konami) },
{ "lh5801", _8bit, 0, CPU_DISASSEMBLE_NAME(lh5801) },
{ "lr35902", _8bit, 0, CPU_DISASSEMBLE_NAME(lr35902) },