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