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