1 // Based on MAME sources by Nicola Salmoria, David Widel
2 
3 #include "burnint.h"
4 #include "bitswap.h"
5 
decrypt_type0(INT32 val,INT32 param,INT32 swap)6 static INT32 decrypt_type0(INT32 val,INT32 param,INT32 swap)
7 {
8 	if (swap == 0) val = BITSWAP08(val,7,5,3,1,2,0,6,4);
9 	if (swap == 1) val = BITSWAP08(val,5,3,7,2,1,0,4,6);
10 	if (swap == 2) val = BITSWAP08(val,0,3,4,6,7,1,5,2);
11 	if (swap == 3) val = BITSWAP08(val,0,7,3,2,6,4,1,5);
12 
13 	if (BIT(param,3) && BIT(val,7))
14 		val ^= (1<<5)|(1<<3)|(1<<0);
15 
16 	if (BIT(param,2) && BIT(val,6))
17 		val ^= (1<<7)|(1<<2)|(1<<1);
18 
19 	if (BIT(val,6)) val ^= (1<<7);
20 
21 	if (BIT(param,1) && BIT(val,7))
22 		val ^= (1<<6);
23 
24 	if (BIT(val,2)) val ^= (1<<5)|(1<<0);
25 
26 	val ^= (1<<4)|(1<<3)|(1<<1);
27 
28 	if (BIT(param,2)) val ^= (1<<5)|(1<<2)|(1<<0);
29 	if (BIT(param,1)) val ^= (1<<7)|(1<<6);
30 	if (BIT(param,0)) val ^= (1<<5)|(1<<0);
31 
32 	if (BIT(param,0)) val = BITSWAP08(val,7,6,5,1,4,3,2,0);
33 
34 	return val;
35 }
36 
37 
decrypt_type1a(INT32 val,INT32 param,INT32 swap)38 static INT32 decrypt_type1a(INT32 val,INT32 param,INT32 swap)
39 {
40 	if (swap == 0) val = BITSWAP08(val,4,2,6,5,3,7,1,0);
41 	if (swap == 1) val = BITSWAP08(val,6,0,5,4,3,2,1,7);
42 	if (swap == 2) val = BITSWAP08(val,2,3,6,1,4,0,7,5);
43 	if (swap == 3) val = BITSWAP08(val,6,5,1,3,2,7,0,4);
44 
45 	if (BIT(param,2)) val = BITSWAP08(val,7,6,1,5,3,2,4,0);
46 
47 	if (BIT(val,1)) val ^= (1<<0);
48 	if (BIT(val,6)) val ^= (1<<3);
49 	if (BIT(val,7)) val ^= (1<<6)|(1<<3);
50 	if (BIT(val,2)) val ^= (1<<6)|(1<<3)|(1<<1);
51 	if (BIT(val,4)) val ^= (1<<7)|(1<<6)|(1<<2);
52 
53 	if (BIT(val,7) ^ BIT(val,2))
54 		val ^= (1<<4);
55 
56 	val ^= (1<<6)|(1<<3)|(1<<1)|(1<<0);
57 
58 	if (BIT(param,3)) val ^= (1<<7)|(1<<2);
59 	if (BIT(param,1)) val ^= (1<<6)|(1<<3);
60 
61 	if (BIT(param,0)) val = BITSWAP08(val,7,6,1,4,3,2,5,0);
62 
63 	return val;
64 }
65 
decrypt_type1b(INT32 val,INT32 param,INT32 swap)66 static INT32 decrypt_type1b(INT32 val,INT32 param,INT32 swap)
67 {
68 	if (swap == 0) val = BITSWAP08(val,1,0,3,2,5,6,4,7);
69 	if (swap == 1) val = BITSWAP08(val,2,0,5,1,7,4,6,3);
70 	if (swap == 2) val = BITSWAP08(val,6,4,7,2,0,5,1,3);
71 	if (swap == 3) val = BITSWAP08(val,7,1,3,6,0,2,5,4);
72 
73 	if (BIT(val,2) && BIT(val,0))
74 		val ^= (1<<7)|(1<<4);
75 
76 	if (BIT(val,7)) val ^= (1<<2);
77 	if (BIT(val,5)) val ^= (1<<7)|(1<<2);
78 	if (BIT(val,1)) val ^= (1<<5);
79 	if (BIT(val,6)) val ^= (1<<1);
80 	if (BIT(val,4)) val ^= (1<<6)|(1<<5);
81 	if (BIT(val,0)) val ^= (1<<6)|(1<<2)|(1<<1);
82 	if (BIT(val,3)) val ^= (1<<7)|(1<<6)|(1<<2)|(1<<1)|(1<<0);
83 
84 	val ^= (1<<6)|(1<<4)|(1<<0);
85 
86 	if (BIT(param,3)) val ^= (1<<4)|(1<<1);
87 	if (BIT(param,2)) val ^= (1<<7)|(1<<6)|(1<<3)|(1<<0);
88 	if (BIT(param,1)) val ^= (1<<4)|(1<<3);
89 	if (BIT(param,0)) val ^= (1<<6)|(1<<2)|(1<<1)|(1<<0);
90 
91 	return val;
92 }
93 
decrypt_type2a(INT32 val,INT32 param,INT32 swap)94 static INT32 decrypt_type2a(INT32 val,INT32 param,INT32 swap)
95 {
96 	if (swap == 0) val = BITSWAP08(val,0,1,4,3,5,6,2,7);
97 	if (swap == 1) val = BITSWAP08(val,6,3,0,5,7,4,1,2);
98 	if (swap == 2) val = BITSWAP08(val,1,6,4,5,0,3,7,2);
99 	if (swap == 3) val = BITSWAP08(val,4,6,7,5,2,3,1,0);
100 
101 	if (BIT(val,3) || (BIT(param,1) && BIT(val,2)))
102 		val = BITSWAP08(val,6,0,7,4,3,2,1,5);
103 
104 	if (BIT(val,5)) val ^= (1<<7);
105 	if (BIT(val,6)) val ^= (1<<5);
106 	if (BIT(val,0)) val ^= (1<<6);
107 	if (BIT(val,4)) val ^= (1<<3)|(1<<0);
108 	if (BIT(val,1)) val ^= (1<<2);
109 
110 	val ^= (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<1);
111 
112 	if (BIT(param,2)) val ^= (1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
113 
114 	if (BIT(param,3))
115 	{
116 		if (BIT(param,0))
117 			val = BITSWAP08(val,7,6,5,3,4,1,2,0);
118 		else
119 			val = BITSWAP08(val,7,6,5,1,2,4,3,0);
120 	}
121 	else
122 	{
123 		if (BIT(param,0))
124 			val = BITSWAP08(val,7,6,5,2,1,3,4,0);
125 	}
126 
127 	return val;
128 }
129 
decrypt_type2b(INT32 val,INT32 param,INT32 swap)130 static INT32 decrypt_type2b(INT32 val,INT32 param,INT32 swap)
131 {
132 	// only 0x20 possible encryptions for this method - all others have 0x40
133 	// this happens because BIT(param,2) cancels the other three
134 
135 	if (swap == 0) val = BITSWAP08(val,1,3,4,6,5,7,0,2);
136 	if (swap == 1) val = BITSWAP08(val,0,1,5,4,7,3,2,6);
137 	if (swap == 2) val = BITSWAP08(val,3,5,4,1,6,2,0,7);
138 	if (swap == 3) val = BITSWAP08(val,5,2,3,0,4,7,6,1);
139 
140 	if (BIT(val,7) && BIT(val,3))
141 		val ^= (1<<6)|(1<<4)|(1<<0);
142 
143 	if (BIT(val,7)) val ^= (1<<2);
144 	if (BIT(val,5)) val ^= (1<<7)|(1<<3);
145 	if (BIT(val,1)) val ^= (1<<5);
146 	if (BIT(val,4)) val ^= (1<<7)|(1<<5)|(1<<3)|(1<<1);
147 
148 	if (BIT(val,7) && BIT(val,5))
149 		val ^= (1<<4)|(1<<0);
150 
151 	if (BIT(val,5) && BIT(val,1))
152 		val ^= (1<<4)|(1<<0);
153 
154 	if (BIT(val,6)) val ^= (1<<7)|(1<<5);
155 	if (BIT(val,3)) val ^= (1<<7)|(1<<6)|(1<<5)|(1<<1);
156 	if (BIT(val,2)) val ^= (1<<3)|(1<<1);
157 
158 	val ^= (1<<7)|(1<<3)|(1<<2)|(1<<1);
159 
160 	if (BIT(param,3)) val ^= (1<<6)|(1<<3)|(1<<1);
161 	if (BIT(param,2)) val ^= (1<<7)|(1<<6)|(1<<5)|(1<<3)|(1<<2)|(1<<1);	// same as the other three combined
162 	if (BIT(param,1)) val ^= (1<<7);
163 	if (BIT(param,0)) val ^= (1<<5)|(1<<2);
164 
165 	return val;
166 }
167 
decrypt_type3a(INT32 val,INT32 param,INT32 swap)168 static INT32 decrypt_type3a(INT32 val,INT32 param,INT32 swap)
169 {
170 	if (swap == 0) val = BITSWAP08(val,5,3,1,7,0,2,6,4);
171 	if (swap == 1) val = BITSWAP08(val,3,1,2,5,4,7,0,6);
172 	if (swap == 2) val = BITSWAP08(val,5,6,1,2,7,0,4,3);
173 	if (swap == 3) val = BITSWAP08(val,5,6,7,0,4,2,1,3);
174 
175 	if (BIT(val,2)) val ^= (1<<7)|(1<<5)|(1<<4);
176 	if (BIT(val,3)) val ^= (1<<0);
177 
178 	if (BIT(param,0)) val = BITSWAP08(val,7,2,5,4,3,1,0,6);
179 
180 	if (BIT(val,1)) val ^= (1<<6)|(1<<0);
181 	if (BIT(val,3)) val ^= (1<<4)|(1<<2)|(1<<1);
182 
183 	if (BIT(param,3)) val ^= (1<<4)|(1<<3);
184 
185 	if (BIT(val,3)) val = BITSWAP08(val,5,6,7,4,3,2,1,0);
186 
187 	if (BIT(val,5)) val ^= (1<<2)|(1<<1);
188 
189 	val ^= (1<<6)|(1<<5)|(1<<4)|(1<<3);
190 
191 	if (BIT(param,2)) val ^= (1<<7);
192 	if (BIT(param,1)) val ^= (1<<4);
193 	if (BIT(param,0)) val ^= (1<<0);
194 
195 	return val;
196 }
197 
decrypt_type3b(INT32 val,INT32 param,INT32 swap)198 static INT32 decrypt_type3b(INT32 val,INT32 param,INT32 swap)
199 {
200 	if (swap == 0) val = BITSWAP08(val,3,7,5,4,0,6,2,1);
201 	if (swap == 1) val = BITSWAP08(val,7,5,4,6,1,2,0,3);
202 	if (swap == 2) val = BITSWAP08(val,7,4,3,0,5,1,6,2);
203 	if (swap == 3) val = BITSWAP08(val,2,6,4,1,3,7,0,5);
204 
205 	if (BIT(val,2)) val ^= (1<<7);
206 
207 	if (BIT(val,7)) val = BITSWAP08(val,7,6,3,4,5,2,1,0);
208 
209 	if (BIT(param,3)) val ^= (1<<7);
210 
211 	if (BIT(val,4)) val ^= (1<<6);
212 	if (BIT(val,1)) val ^= (1<<6)|(1<<4)|(1<<2);
213 
214 	if (BIT(val,7) && BIT(val,6))
215 		val ^= (1<<1);
216 
217 	if (BIT(val,7)) val ^= (1<<1);
218 
219 	if (BIT(param,3)) val ^= (1<<7);
220 	if (BIT(param,2)) val ^= (1<<0);
221 
222 	if (BIT(param,3)) val = BITSWAP08(val,4,6,3,2,5,0,1,7);
223 
224 	if (BIT(val,4)) val ^= (1<<1);
225 	if (BIT(val,5)) val ^= (1<<4);
226 	if (BIT(val,7)) val ^= (1<<2);
227 
228 	val ^= (1<<5)|(1<<3)|(1<<2);
229 
230 	if (BIT(param,1)) val ^= (1<<7);
231 	if (BIT(param,0)) val ^= (1<<3);
232 
233 	return val;
234 }
235 
decrypt(INT32 val,INT32 key,INT32 opcode)236 static INT32 decrypt(INT32 val, INT32 key, INT32 opcode)
237 {
238 	INT32 type = 0;
239 	INT32 swap = 0;
240 	INT32 param = 0;
241 
242 	key ^= 0xff;
243 
244 	// no encryption
245 	if (key == 0x00)
246 		return val;
247 
248 	type ^= BIT(key,0) << 0;
249 	type ^= BIT(key,2) << 0;
250 	type ^= BIT(key,0) << 1;
251 	type ^= BIT(key,1) << 1;
252 	type ^= BIT(key,2) << 1;
253 	type ^= BIT(key,4) << 1;
254 	type ^= BIT(key,4) << 2;
255 	type ^= BIT(key,5) << 2;
256 
257 	swap ^= BIT(key,0) << 0;
258 	swap ^= BIT(key,1) << 0;
259 	swap ^= BIT(key,2) << 1;
260 	swap ^= BIT(key,3) << 1;
261 
262 	param ^= BIT(key,0) << 0;
263 	param ^= BIT(key,0) << 1;
264 	param ^= BIT(key,2) << 1;
265 	param ^= BIT(key,3) << 1;
266 	param ^= BIT(key,0) << 2;
267 	param ^= BIT(key,1) << 2;
268 	param ^= BIT(key,6) << 2;
269 	param ^= BIT(key,1) << 3;
270 	param ^= BIT(key,6) << 3;
271 	param ^= BIT(key,7) << 3;
272 
273 	if (!opcode)
274 	{
275 		param ^= 1 << 0;
276 		type ^= 1 << 0;
277 	}
278 
279 	switch (type)
280 	{
281 		default:
282 		case 0: return decrypt_type0(val,param,swap);
283 		case 1: return decrypt_type0(val,param,swap);
284 		case 2: return decrypt_type1a(val,param,swap);
285 		case 3: return decrypt_type1b(val,param,swap);
286 		case 4: return decrypt_type2a(val,param,swap);
287 		case 5: return decrypt_type2b(val,param,swap);
288 		case 6: return decrypt_type3a(val,param,swap);
289 		case 7: return decrypt_type3b(val,param,swap);
290 	}
291 }
292 
mc8123_decrypt(INT32 addr,UINT8 val,const UINT8 * key,INT32 opcode)293 static UINT8 mc8123_decrypt(INT32 addr,UINT8 val,const UINT8 *key,INT32 opcode)
294 {
295 	INT32 tbl_num;
296 
297 	/* pick the translation table from bits fd57 of the address */
298 	tbl_num = (addr & 7) + ((addr & 0x10)>>1) + ((addr & 0x40)>>2) + ((addr & 0x100)>>3) + ((addr & 0xc00)>>4) + ((addr & 0xf000)>>4) ;
299 
300 	return decrypt(val,key[tbl_num + (opcode ? 0 : 0x1000)],opcode);
301 }
302 
mc8123_decrypt_rom(INT32,INT32 numbanks,UINT8 * pRom,UINT8 * pFetch,UINT8 * pKey)303 void mc8123_decrypt_rom(INT32 /*banknum*/, INT32 numbanks, UINT8 *pRom, UINT8 *pFetch, UINT8 *pKey)
304 {
305 	UINT8 *decrypted1 = pFetch;
306 	UINT8 *decrypted2 = (numbanks > 1) ? decrypted1 + 0x10000 : decrypted1 + 0x8000;
307 	UINT16 main_len = (numbanks == 1) ? 0xc000 : 0x8000;
308 	UINT8 *rom = pRom;
309 	UINT8 *key = pKey;
310 	INT32 A, bank;
311 
312 	for (A = 0x0000;A < main_len;A++)
313 	{
314 		UINT8 src = rom[A];
315 
316 		/* decode the opcodes */
317 		decrypted1[A] = mc8123_decrypt(A,src,key,1);
318 
319 		/* decode the data */
320 		rom[A] = mc8123_decrypt(A,src,key,0);
321 	}
322 
323 	for (bank = 0; bank < numbanks; ++bank)
324 	{
325 		for (A = 0x8000;A < 0xc000;A++)
326 		{
327 			UINT8 src = rom[0x8000 + 0x4000*bank + A];
328 
329 			/* decode the opcodes */
330 			decrypted2[0x4000 * bank + (A-0x8000)] = mc8123_decrypt(A,src,key,1);
331 
332 			/* decode the data */
333 			rom[0x8000 + 0x4000*bank + A] = mc8123_decrypt(A,src,key,0);
334 		}
335 	}
336 }
337