1 /*
2 * Copyright (c) 2015, Marcos Medeiros
3 * Licensed under BSD 3-clause.
4 */
5 #ifndef TMS34010_CTRL_H
6 #define TMS34010_CTRL_H
7
8 #include "tms34010.h"
9 #include "tms34010_defs.h"
10
11
12 extern unsigned g_inputs[];
13 namespace tms { namespace ops {
14
dint(cpu_state * cpu,word opcode)15 void dint(cpu_state *cpu, word opcode)
16 {
17 _st &= ~ST_IE;
18
19 CONSUME_CYCLES(3);
20 }
21
eint(cpu_state * cpu,word opcode)22 void eint(cpu_state *cpu, word opcode)
23 {
24 _st |= ST_IE;
25
26 CONSUME_CYCLES(3);
27 }
28
emu(cpu_state * cpu,word opcode)29 void emu(cpu_state *cpu, word opcode)
30 {
31 // ???
32 CONSUME_CYCLES(6);
33 }
34
rev_rd(cpu_state * cpu,word opcode)35 void rev_rd(cpu_state *cpu, word opcode)
36 {
37 _rd = 0x8;
38
39 CONSUME_CYCLES(1);
40 }
41
setf_0(cpu_state * cpu,word opcode)42 void setf_0(cpu_state *cpu, word opcode)
43 {
44 unsigned fs = opcode & 0x1F;
45 _st &= ~(ST_FS0_MASK | ST_FE0);
46 _st |= fs | (opcode & 0x20);
47
48 CONSUME_CYCLES(1);
49 }
50
setf_1(cpu_state * cpu,word opcode)51 void setf_1(cpu_state *cpu, word opcode)
52 {
53 unsigned fs = opcode & 0x1F;
54 _st &= ~(ST_FS1_MASK | ST_FE1);
55 _st |= (fs | (opcode & 0x20)) << ST_FS1_SHIFT;
56
57 CONSUME_CYCLES(1);
58 }
59
exgf_rd_0(cpu_state * cpu,word opcode)60 void exgf_rd_0(cpu_state *cpu, word opcode)
61 {
62 word k = _rd & 0x3F;
63 _rd = FWEX(0);
64 _st &= ~(ST_FS0_MASK | ST_FE0);
65 _st |= k;
66
67 CONSUME_CYCLES(1);
68 }
69
70
exgf_rd_1(cpu_state * cpu,word opcode)71 void exgf_rd_1(cpu_state *cpu, word opcode)
72 {
73 word k = _rd & 0x3F;
74 _rd = FWEX(1);
75 _st &= ~(ST_FS1_MASK | ST_FE1);
76 _st |= (k << ST_FS1_SHIFT);
77
78 CONSUME_CYCLES(1);
79 }
80
mmtm(cpu_state * cpu,word opcode)81 void mmtm(cpu_state *cpu, word opcode)
82 {
83 word list = mem_read(_pc);
84 _pc += 16;
85
86 #if 0// TMS34020 ???
87 _st &= ~ST_N;
88 if (!_rd) _st |= ST_N;
89 else {
90 if (((0 - _rd) & SIGN_BIT32) && !(_rd == 0x80000000))
91 _st |= ST_N;
92 }
93 #endif
94 CONSUME_CYCLES(2);
95
96 for (int i = 0; i < 16; i++) {
97 if (list & 0x8000) {
98 _rd -= 32;
99 mem_write_d(_rd, cpu->r[i|R_BIT]->value);
100 CONSUME_CYCLES(4);
101 }
102 list <<= 1;
103 }
104 }
105
mmfm(cpu_state * cpu,word opcode)106 void mmfm(cpu_state *cpu, word opcode)
107 {
108 word list = mem_read(_pc);
109 _pc += 16;
110
111 CONSUME_CYCLES(3);
112
113 for (int i = 15; i >= 0; i--) {
114 if (list & 0x8000) {
115 cpu->r[i|R_BIT]->value = mem_read_d(_rd);
116 _rd += 32;
117 CONSUME_CYCLES(4);
118 }
119 list <<= 1;
120 }
121 }
122
reti(cpu_state * cpu,word opcode)123 void reti(cpu_state *cpu, word opcode)
124 {
125 _st = _pop();
126 _pc = _pop() & 0xFFFFFFF0;
127
128 CONSUME_CYCLES(11);
129 }
130
trap(cpu_state * cpu,word opcode)131 void trap(cpu_state *cpu, word opcode)
132 {
133 _push(_pc);
134 _push(_st);
135 _st &= ~ST_IE;
136 _pc = mem_read_d(0xFFFFFFE0 - (opcode & 0x1F) * 32) & 0xFFFFFFF0;
137
138 CONSUME_CYCLES(16);
139 }
140
exgpc(cpu_state * cpu,word opcode)141 void exgpc(cpu_state *cpu, word opcode)
142 {
143 dword tmp = _rd;
144 _rd = _pc;
145 _pc = tmp;
146
147 CONSUME_CYCLES(2);
148 }
149
getpc(cpu_state * cpu,word opcode)150 void getpc(cpu_state *cpu, word opcode)
151 {
152 _rd = _pc;
153
154 CONSUME_CYCLES(1);
155 }
156
putst(cpu_state * cpu,word opcode)157 void putst(cpu_state *cpu, word opcode)
158 {
159 _st = _rd;
160
161 CONSUME_CYCLES(3);
162 }
163
pushst(cpu_state * cpu,word opcode)164 void pushst(cpu_state *cpu, word opcode)
165 {
166 _push(_st);
167
168 CONSUME_CYCLES(2);
169 }
170
popst(cpu_state * cpu,word opcode)171 void popst(cpu_state *cpu, word opcode)
172 {
173 _st = _pop();
174
175 CONSUME_CYCLES(8);
176 }
177
getst(cpu_state * cpu,word opcode)178 void getst(cpu_state *cpu, word opcode)
179 {
180 _rd = _st;
181
182 CONSUME_CYCLES(1);
183 }
184
185 } // ops
186 } // tms
187
188 #endif // TMS34010_CTRL_H
189