summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/8x300/8x300dasm.c
blob: e35b2b7cb41f8025135c24584d6c1f7bb6ce56f2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// license:BSD-3-Clause
// copyright-holders:Barry Rodewald
/*
 * 8x300dasm.c
 *  Implementation of the Scientific Micro Systems SMS300 / Signetics 8X300 Microcontroller
 *
 *  Created on: 18/12/2013
 */

#include "emu.h"
#include "8x300.h"

#define SRC    ((opcode & 0x1f00) >> 8)
#define DST    (opcode & 0x001f)
#define ROTLEN ((opcode & 0x00e0) >> 5)
#define IMM8   (opcode & 0x00ff)
#define IMM5   (opcode & 0x001f)

static const char *reg_names[32] =
{
	"AUX", "R1", "R2", "R3", "R4", "R5", "R6", "IVL", "OVF", "R11",
	"Unused12", "Unused13", "Unused14", "Unused15", "Unused16", "IVR",
	"LIV0", "LIV1", "LIV2", "LIV3", "LIV4", "LIV5", "LIV6", "LIV7",
	"RIV0", "RIV1", "RIV2", "RIV3", "RIV4", "RIV5", "RIV6", "RIV7"
};

// determines if right rotate or I/O field length is to be used
INLINE bool is_rot(UINT16 opcode)
{
	if((opcode & 0x1000) || (opcode & 0x0010))
		return false;
	else
		return true;
}

INLINE bool is_src_rot(UINT16 opcode)
{
	if((opcode & 0x1000))
		return false;
	else
		return true;
}

CPU_DISASSEMBLE( n8x300 )
{
	char tmp[16];
	unsigned startpc = pc;
	UINT16 opcode = (oprom[pc - startpc] << 8) | oprom[pc+1 - startpc];
	UINT8 inst = opcode >> 13;
	pc+=2;

	// determine instruction
	switch (inst)
	{
	case 0x00:
		sprintf(buffer,"MOVE ");
		strcat(buffer,reg_names[SRC]);
		if(is_rot(opcode))
			sprintf(tmp,"(%i),",ROTLEN);
		else
			sprintf(tmp,",%i,",ROTLEN);
		strcat(buffer,tmp);
		strcat(buffer,reg_names[DST]);
		break;
	case 0x01:
		sprintf(buffer,"ADD  ");
		strcat(buffer,reg_names[SRC]);
		if(is_rot(opcode))
			sprintf(tmp,"(%i),",ROTLEN);
		else
			sprintf(tmp,",%i,",ROTLEN);
		strcat(buffer,tmp);
		strcat(buffer,reg_names[DST]);
		break;
	case 0x02:
		sprintf(buffer,"AND  ");
		strcat(buffer,reg_names[SRC]);
		if(is_rot(opcode))
			sprintf(tmp,"(%i),",ROTLEN);
		else
			sprintf(tmp,",%i,",ROTLEN);
		strcat(buffer,tmp);
		strcat(buffer,reg_names[DST]);
		break;
	case 0x03:
		sprintf(buffer,"XOR  ");
		strcat(buffer,reg_names[SRC]);
		if(is_rot(opcode))
			sprintf(tmp,"(%i),",ROTLEN);
		else
			sprintf(tmp,",%i,",ROTLEN);
		strcat(buffer,tmp);
		strcat(buffer,reg_names[DST]);
		break;
	case 0x04:
		sprintf(buffer,"XEC  ");
		strcat(buffer,reg_names[SRC]);
		if(is_src_rot(opcode))
		{
			sprintf(tmp,",%02XH",IMM8);
			strcat(buffer,tmp);
		}
		else
		{
			sprintf(tmp,",%i",ROTLEN);
			strcat(buffer,tmp);
			sprintf(tmp,",%02XH",IMM5);
			strcat(buffer,tmp);
		}
		break;
	case 0x05:
		sprintf(buffer,"NZT  ");
		strcat(buffer,reg_names[SRC]);
		if(is_src_rot(opcode))
		{
			sprintf(tmp,",%02XH",IMM8);
			strcat(buffer,tmp);
		}
		else
		{
			sprintf(tmp,",%i",ROTLEN);
			strcat(buffer,tmp);
			sprintf(tmp,",%02XH",IMM5);
			strcat(buffer,tmp);
		}
		break;
	case 0x06:
		sprintf(buffer,"XMIT ");
		if(is_src_rot(opcode))
		{
			sprintf(tmp,"%02XH,",IMM8);
			strcat(buffer,tmp);
			strcat(buffer,reg_names[SRC]);
		}
		else
		{
			sprintf(tmp,"%02XH,",IMM5);
			strcat(buffer,tmp);
			strcat(buffer,reg_names[SRC]);
			sprintf(tmp,",%i",ROTLEN);
			strcat(buffer,tmp);
		}
		break;
	case 0x07:
		sprintf(buffer,"JMP  %04XH",opcode & 0x1fff);
		break;
	}


	return (pc - startpc);
}