OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gdb/] [gdb-6.8/] [sim/] [mn10300/] [mn10300.igen] - Blame information for rev 26

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 26 jlechner
// -*- C -*-
2
:option:::insn-bit-size:8
3
:option:::insn-specifying-widths:true
4
:option:::hi-bit-nr:7
5
:model:::mn10300:mn10300:
6
:model:::am33:am33:
7
:model:::am33_2:am33_2:
8
 
9
// What do we do with an illegal instruction?
10
:internal::::illegal:
11
{
12
  PC = cia;
13
  program_interrupt(SD, CPU, cia, SIM_SIGILL);
14
}
15
 
16
// 1000 DnDn imm8....; mov imm8,Dn (imm8 is sign extended)
17
4.0x8,2.DM1,2.DN0=DM1+8.IMM8:S0i:::mov
18
"mov"
19
*mn10300
20
*am33
21
*am33_2
22
{
23
  /*  OP_8000 (); */
24
  signed32 immed = EXTEND8 (IMM8);
25
  State.regs[REG_D0+DN0] = immed;
26
  PC = cia;
27
}
28
 
29
// 1000 DmDn; mov Dm,Dn (Dm != Dn, see above when Dm == Dn)
30
4.0x8,2.DM1,2.DN0!DM1:S0:::mov
31
"mov"
32
*mn10300
33
*am33
34
*am33_2
35
{
36
  PC = cia;
37
  /* OP_80 (); */
38
  State.regs[REG_D0+DN0] = State.regs[REG_D0+DM1];
39
}
40
 
41
 
42
// 1111 0001 1110 DmAn; mov Dm,An
43
8.0xf1+1110,2.DM1,2.AN0:D0:::mov
44
"mov"
45
*mn10300
46
*am33
47
*am33_2
48
{
49
  /* OP_F1E0 (); */
50
  PC = cia;
51
  State.regs[REG_A0 + AN0] = State.regs[REG_D0 + DM1];
52
}
53
 
54
 
55
// 1111 0001 1101 AmDn; mov Am,Dn
56
8.0xf1+1101,2.AM1,2.DN0:D0a:::mov
57
"mov"
58
*mn10300
59
*am33
60
*am33_2
61
{
62
  /* OP_F1D0 (); */
63
  PC = cia;
64
  State.regs[REG_D0 + DN0] = State.regs[REG_A0 + AM1];
65
}
66
 
67
 
68
// 1001 AnAn imm8....; mov imm8,An (imm8 is zero-extended)
69
4.0x9,2.AM1,2.AN0=AM1+8.IMM8:S0ai:::mov
70
"mov"
71
*mn10300
72
*am33
73
*am33_2
74
{
75
   PC = cia;
76
   /* OP_9000 (); */
77
   State.regs[REG_A0+AN0] = IMM8;
78
}
79
 
80
 
81
// 1001 AmAn; mov Am,An (Am != An, save above when Am == An)
82
4.0x9,2.AM1,2.AN0!AM1:S0a:::mov
83
"mov"
84
*mn10300
85
*am33
86
*am33_2
87
{
88
   PC = cia;
89
   /* OP_90 (); */
90
   State.regs[REG_A0+AN0] = State.regs[REG_A0+AM1];
91
}
92
 
93
 
94
// 0011 11An; mov SP,An
95
4.0x3,11,2.AN0:S0b:::mov
96
"mov"
97
*mn10300
98
*am33
99
*am33_2
100
{
101
  /* OP_3C (); */
102
  PC = cia;
103
  State.regs[REG_A0 + AN0] = State.regs[REG_SP];
104
}
105
 
106
 
107
// 1111 0010 1111 Am00; mov Am,SP
108
8.0xf2+4.0xf,2.AM1,00:D0b:::mov
109
"mov"
110
*mn10300
111
*am33
112
*am33_2
113
{
114
  /* OP_F2F0 (); */
115
  PC = cia;
116
  State.regs[REG_SP] = State.regs[REG_A0 + AM1];
117
}
118
 
119
 
120
// 1111 0010 1110 01Dn; mov PSW,Dn
121
8.0xf2+4.0xe,01,2.DN0:D0c:::mov
122
"mov"
123
*mn10300
124
*am33
125
*am33_2
126
{
127
  /* OP_F2E4 (); */
128
  PC = cia;
129
  State.regs[REG_D0 + DN0] = PSW;
130
}
131
 
132
 
133
// 1111 0010 1111 Dm11; mov Dm,PSW
134
8.0xf2+4.0xf,2.DM1,11:D0d:::mov
135
"mov"
136
*mn10300
137
*am33
138
*am33_2
139
{
140
  /* OP_F2F3 (); */
141
  PC = cia;
142
  PSW = State.regs[REG_D0 + DM1];
143
}
144
 
145
 
146
// 1111 0010 1110 00Dn; mov MDR,Dn
147
8.0xf2+4.0xe,00,2.DN0:D0e:::mov
148
"mov"
149
*mn10300
150
*am33
151
*am33_2
152
{
153
  /* OP_F2E0 (); */
154
  PC = cia;
155
  State.regs[REG_D0 + DN0] = State.regs[REG_MDR];
156
}
157
 
158
 
159
// 1111 0010 1111 Dm10; mov Dm,MDR
160
8.0xf2+4.0xf,2.DM1,10:D0f:::mov
161
"mov"
162
*mn10300
163
*am33
164
*am33_2
165
{
166
  /* OP_F2F2 (); */
167
  PC = cia;
168
  State.regs[REG_MDR] = State.regs[REG_D0 + DM1];
169
}
170
 
171
 
172
// 0111 DnAm; mov (Am),Dn
173
4.0x7,2.DN1,2.AM0:S0c:::mov
174
"mov"
175
*mn10300
176
*am33
177
*am33_2
178
{
179
  /* OP_70 (); */
180
  PC = cia;
181
  State.regs[REG_D0 + DN1] = load_word (State.regs[REG_A0 + AM0]);
182
}
183
 
184
 
185
// 1111 1000 0000 DnAm d8......; mov (d8,Am),Dn (d8 is sign-extended)
186
8.0xf8+4.0x0,2.DN1,2.AM0+8.D8:D1:::mov
187
"mov"
188
*mn10300
189
*am33
190
*am33_2
191
{
192
  /* OP_F80000 (); */
193
  PC = cia;
194
  State.regs[REG_D0 + DN1]
195
    = load_word ((State.regs[REG_A0 + AM0] + EXTEND8 (D8)));
196
}
197
 
198
 
199
// 1111 1010 0000 DnAm d16.....; mov (d16,Am),Dn (d16 is sign-extended.)
200
8.0xfa+4.0x0,2.DN1,2.AM0+8.D16A+8.D16B:D2:::mov
201
"mov"
202
*mn10300
203
*am33
204
*am33_2
205
{
206
  /* OP_FA000000 (); */
207
  PC = cia;
208
  State.regs[REG_D0 + DN1]
209
    = load_word ((State.regs[REG_A0 + AM0] + EXTEND16 (FETCH16(D16A, D16B))));
210
}
211
 
212
 
213
// 1111 1100 0000 DnAm d32.....; mov (d32,Am),Dn
214
8.0xfc+4.0x0,2.DN1,2.AM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::mov
215
"mov"
216
*mn10300
217
*am33
218
*am33_2
219
{
220
  /* OP_FC000000 (); */
221
  PC = cia;
222
  State.regs[REG_D0 + DN1]
223
    = load_word ((State.regs[REG_A0 + AM0]
224
                  + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
225
}
226
 
227
 
228
// 0101 10Dn d8......; mov (d8,SP),Dn (d8 is zero-extended)
229
4.0x5,10,2.DN0+8.D8:S1:::mov
230
"mov"
231
*mn10300
232
*am33
233
*am33_2
234
{
235
  /* OP_5800 (); */
236
  PC = cia;
237
  State.regs[REG_D0 + DN0] = load_word (State.regs[REG_SP] + D8);
238
}
239
 
240
 
241
// 1111 1010 1011 01Dn d16.....; mov (d16,SP),Dn (d16 is zero-extended.)
242
8.0xfa+4.0xb,01,2.DN0+8.IMM16A+8.IMM16B:D2a:::mov
243
"mov"
244
*mn10300
245
*am33
246
*am33_2
247
{
248
  /* OP_FAB40000 (); */
249
  PC = cia;
250
  State.regs[REG_D0 + DN0]
251
    = load_word (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B));
252
}
253
 
254
 
255
// 1111 1010 1011 01Dn d32.....; mov (d32,SP),Dn
256
8.0xfc+4.0xb,01,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::mov
257
"mov"
258
*mn10300
259
*am33
260
*am33_2
261
{
262
  /* OP_FCB40000 (); */
263
  PC = cia;
264
  State.regs[REG_D0 + DN0]
265
     = load_word (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
266
}
267
 
268
 
269
// 1111 0011 00Dn DiAm; mov (Di,Am),Dn
270
8.0xf3+00,2.DN2,2.DI,2.AM0:D0g:::mov
271
"mov"
272
*mn10300
273
*am33
274
*am33_2
275
{
276
  /* OP_F300 (); */
277
  PC = cia;
278
  State.regs[REG_D0 + DN2]
279
    = load_word ((State.regs[REG_A0 + AM0] + State.regs[REG_D0 + DI]));
280
}
281
 
282
 
283
// 0011 00Dn abs16...; mov (abs16),Dn (abs16 is zero-extended)
284
4.0x3,00,2.DN0+8.IMM16A+8.IMM16B:S2:::mov
285
"mov"
286
*mn10300
287
*am33
288
*am33_2
289
{
290
  /* OP_300000 (); */
291
  PC = cia;
292
  State.regs[REG_D0 + DN0] = load_word (FETCH16(IMM16A, IMM16B));
293
}
294
 
295
// 1111 1100 1010 01Dn abs32...; mov (abs32),Dn
296
8.0xfc+4.0xa,01,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4b:::mov
297
"mov"
298
*mn10300
299
*am33
300
*am33_2
301
{
302
  /* OP_FCA40000 (); */
303
  PC = cia;
304
  State.regs[REG_D0 + DN0] = load_word (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
305
}
306
 
307
 
308
// 1111 0000 0000 AnAm; mov (Am),An
309
8.0xf0+4.0x0,2.AN1,2.AM0:D0h:::mov
310
"mov"
311
*mn10300
312
*am33
313
*am33_2
314
{
315
  /* OP_F000 (); */
316
  PC = cia;
317
  State.regs[REG_A0 + AN1] = load_word (State.regs[REG_A0 + AM0]);
318
}
319
 
320
 
321
// 1111 1000 0010 AnAm d8......; mov (d8,Am),An (d8 is sign-extended)
322
8.0xf8+4.0x2,2.AN1,2.AM0+8.D8:D1a:::mov
323
"mov"
324
*mn10300
325
*am33
326
*am33_2
327
{
328
  /* OP_F82000 (); */
329
  PC = cia;
330
  State.regs[REG_A0 + AN1]
331
    = load_word ((State.regs[REG_A0 + AM0] + EXTEND8 (D8)));
332
}
333
 
334
 
335
// 1111 1010 0010 AnAm d16.....; mov (d16,Am),An (d16 is sign-extended.)
336
8.0xfa+4.0x2,2.AN1,2.AM0+8.D16A+8.D16B:D2b:::mov
337
"mov"
338
*mn10300
339
*am33
340
*am33_2
341
{
342
  /* OP_FA200000 (); */
343
  PC = cia;
344
  State.regs[REG_A0 + AN1]
345
    = load_word ((State.regs[REG_A0 + AM0]
346
                  + EXTEND16 (FETCH16(D16A, D16B))));
347
}
348
 
349
 
350
// 1111 1100 0010 AnAm d32.....; mov (d32,Am),An
351
8.0xfc+4.0x2,2.AN1,2.AM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4c:::mov
352
"mov"
353
*mn10300
354
*am33
355
*am33_2
356
{
357
  /* OP_FC200000 (); */
358
  PC = cia;
359
  State.regs[REG_A0 + AN1]
360
    = load_word ((State.regs[REG_A0 + AM0]
361
                  + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
362
}
363
 
364
 
365
// 0101 11An d8......; mov (d8,SP),An (d8 is zero-extended)
366
4.0x5,11,2.AN0+8.D8:S1a:::mov
367
"mov"
368
*mn10300
369
*am33
370
*am33_2
371
{
372
  /* OP_5C00 (); */
373
  PC = cia;
374
  State.regs[REG_A0 + AN0]
375
    = load_word (State.regs[REG_SP] + D8);
376
}
377
 
378
 
379
// 1111 1010 1011 00An d16.....; mov (d16,SP),An (d16 is zero-extended.)
380
8.0xfa+4.0xb,00,2.AN0+8.IMM16A+8.IMM16B:D2c:::mov
381
"mov"
382
*mn10300
383
*am33
384
*am33_2
385
{
386
  /* OP_FAB00000 (); */
387
  PC = cia;
388
  State.regs[REG_A0 + AN0]
389
    = load_word (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B));
390
}
391
 
392
 
393
// 1111 1100 1011 00An d32.....; mov (d32,SP),An
394
8.0xfc+4.0xb,00,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4d:::mov
395
"mov"
396
*mn10300
397
*am33
398
*am33_2
399
{
400
  /* OP_FCB00000 (); */
401
  PC = cia;
402
  State.regs[REG_A0 + AN0]
403
    = load_word (State.regs[REG_SP]
404
                 + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
405
}
406
 
407
 
408
// 1111 0011 10An DiAm; mov (Di,Am),An
409
8.0xf3+10,2.AN2,2.DI,2.AM0:D0i:::mov
410
"mov"
411
*mn10300
412
*am33
413
*am33_2
414
{
415
  /* OP_F380 (); */
416
  PC = cia;
417
  State.regs[REG_A0 + AN2]
418
    = load_word ((State.regs[REG_A0 + AM0]
419
                 + State.regs[REG_D0 + DI]));
420
}
421
 
422
 
423
// 1111 1010 1010 00An abs16...; mov (abs16),An (abs16 is zero-extended)
424
8.0xfa+4.0xa,00,2.AN0+8.IMM16A+8.IMM16B:D2d:::mov
425
"mov"
426
*mn10300
427
*am33
428
*am33_2
429
{
430
  /* OP_FAA00000 (); */
431
  PC = cia;
432
  State.regs[REG_A0 + AN0] = load_word (FETCH16(IMM16A, IMM16B));
433
}
434
 
435
 
436
// 1111 1100 1010 00An abs32...; mov (abs32),An
437
8.0xfc+4.0xa,00,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4e:::mov
438
"mov"
439
*mn10300
440
*am33
441
*am33_2
442
{
443
  /* OP_FCA00000 (); */
444
  PC = cia;
445
  State.regs[REG_A0 + AN0]
446
    = load_word (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
447
}
448
 
449
 
450
// 1111 1000 1111 00Am d8......; mov (d8,Am),SP (d8 is sign-extended)
451
8.0xf8+4.0xf,00,2.AM0+8.D8:D1b:::mov
452
"mov"
453
*mn10300
454
*am33
455
*am33_2
456
{
457
  /* OP_F8F000 (); */
458
  PC = cia;
459
  State.regs[REG_SP]
460
    = load_word ((State.regs[REG_A0 + AM0] + EXTEND8 (D8)));
461
}
462
 
463
 
464
// 0110 DmAn; mov Dm,(An)
465
4.0x6,2.DM1,2.AN0:S0d:::mov
466
"mov"
467
*mn10300
468
*am33
469
*am33_2
470
{
471
  /* OP_60 (); */
472
  PC = cia;
473
  store_word (State.regs[REG_A0 + AN0], State.regs[REG_D0 + DM1]);
474
}
475
 
476
 
477
// 1111 1000 0001 DmAn d8......; mov Dm,(d8,An) (d8 is sign-extended)
478
8.0xf8+4.0x1,2.DM1,2.AN0+8.D8:D1c:::mov
479
"mov"
480
*mn10300
481
*am33
482
*am33_2
483
{
484
  /* OP_F81000 (); */
485
  PC = cia;
486
  store_word ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)),
487
              State.regs[REG_D0 + DM1]);
488
}
489
 
490
 
491
// 1111 1010 0001 DmAn d16.....; mov Dm,(d16,An) (d16 is sign-extended.)
492
8.0xfa+4.0x1,2.DM1,2.AN0+8.D16A+8.D16B:D2e:::mov
493
"mov"
494
*mn10300
495
*am33
496
*am33_2
497
{
498
  /* OP_FA100000 (); */
499
  PC = cia;
500
  store_word ((State.regs[REG_A0 + AN0] + EXTEND16 (FETCH16(D16A, D16B))),
501
              State.regs[REG_D0 + DM1]);
502
}
503
 
504
 
505
// 1111 1100 0001 DmAn d32.....; mov Dm,(d32,An)
506
8.0xfc+4.0x1,2.DM1,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4f:::mov
507
"mov"
508
*mn10300
509
*am33
510
*am33_2
511
{
512
  /* OP_FC100000 (); */
513
  PC = cia;
514
  store_word ((State.regs[REG_A0 + AN0]
515
               + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)),
516
              State.regs[REG_D0 + DM1]);
517
}
518
 
519
 
520
// 0100 Dm10 d8......; mov Dm,(d8,SP) (d8 is zero-extended)
521
4.0x4,2.DM1,10+8.D8:S1b:::mov
522
"mov"
523
*mn10300
524
*am33
525
*am33_2
526
{
527
  /* OP_4200 (); */
528
  PC = cia;
529
  store_word (State.regs[REG_SP] + D8, State.regs[REG_D0 + DM1]);
530
}
531
 
532
 
533
// 1111 1010 1001 Dm01 d16.....; mov Dm,(d16,SP) (d16 is zero-extended.)
534
8.0xfa+4.0x9,2.DM1,01+8.IMM16A+8.IMM16B:D2f:::mov
535
"mov"
536
*mn10300
537
*am33
538
*am33_2
539
{
540
  /* OP_FA910000 (); */
541
  PC = cia;
542
  store_word (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B),
543
              State.regs[REG_D0 + DM1]);
544
}
545
 
546
 
547
// 1111 1100 1001 Dm01 d32.....; mov Dm,(d32,SP)
548
8.0xfc+4.0x9,2.DM1,01+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4g:::mov
549
"mov"
550
*mn10300
551
*am33
552
*am33_2
553
{
554
  /* OP_FC910000 (); */
555
  PC = cia;
556
  store_word (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
557
              State.regs[REG_D0 + DM1]);
558
}
559
 
560
 
561
// 1111 0011 01Dm DiAn; mov Dm,(Di,An)
562
8.0xf3+01,2.DM2,2.DI,2.AN0:D0j:::mov
563
"mov"
564
*mn10300
565
*am33
566
*am33_2
567
{
568
  /* OP_F340 (); */
569
  PC = cia;
570
  store_word ((State.regs[REG_A0 + AN0] + State.regs[REG_D0 + DI]),
571
              State.regs[REG_D0 + DM2]);
572
}
573
 
574
 
575
// 0000 Dm01 abs16..., mov Dm,(abs16) (abs16 is zero-extended).
576
4.0x0,2.DM1,01+8.IMM16A+8.IMM16B:S2a:::mov
577
"mov"
578
*mn10300
579
*am33
580
*am33_2
581
{
582
  /* OP_10000 (); */
583
  PC = cia;
584
  store_word (FETCH16(IMM16A, IMM16B), State.regs[REG_D0 + DM1]);
585
}
586
 
587
 
588
// 1111 1100 1000 Dm01 abs32...; mov Dm,(abs32)
589
8.0xfc+4.0x8,2.DM1,01+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4h:::mov
590
"mov"
591
*mn10300
592
*am33
593
*am33_2
594
{
595
  /* OP_FC810000 (); */
596
  PC = cia;
597
  store_word (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
598
              State.regs[REG_D0 + DM1]);
599
}
600
 
601
 
602
// 1111 0000 0001 AmAn; mov Am,(An)
603
8.0xf0+4.0x1,2.AM1,2.AN0:D0k:::mov
604
"mov"
605
*mn10300
606
*am33
607
*am33_2
608
{
609
  /* OP_F010 (); */
610
  PC = cia;
611
  store_word (State.regs[REG_A0 + AN0], State.regs[REG_A0 + AM1]);
612
}
613
 
614
 
615
// 1111 1000 0011 AmAn d8......; mov Am,(d8,An) (d8 is sign-extended)
616
8.0xf8+4.0x3,2.AM1,2.AN0+8.D8:D1d:::mov
617
"mov"
618
*mn10300
619
*am33
620
*am33_2
621
{
622
  /* OP_F83000 (); */
623
  PC = cia;
624
  store_word ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)),
625
              State.regs[REG_A0 + AM1]);
626
}
627
 
628
 
629
// 1111 1010 0011 AmAn d16.....; mov Am,(d16,An) (d16 is sign-extended.)
630
8.0xfa+4.0x3,2.AM1,2.AN0+8.D16A+8.D16B:D2g:::mov
631
"mov"
632
*mn10300
633
*am33
634
*am33_2
635
{
636
  /* OP_FA300000 (); */
637
  PC = cia;
638
  store_word ((State.regs[REG_A0 + AN0] + EXTEND16 (FETCH16(D16A, D16B))),
639
              State.regs[REG_A0 + AM1]);
640
}
641
 
642
 
643
// 1111 1100 0011 AmAn d32.....; mov Am,(d32,An)
644
8.0xfc+4.0x3,2.AM1,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4i:::mov
645
"mov"
646
*mn10300
647
*am33
648
*am33_2
649
{
650
  /* OP_FC300000 (); */
651
  PC = cia;
652
  store_word ((State.regs[REG_A0 + AN0]
653
               + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)),
654
              State.regs[REG_A0 + AM1]);
655
}
656
 
657
 
658
// 0100 Am11 d8......; mov Am,(d8,SP) (d8 is zero-extended)
659
4.0x4,2.AM1,11+8.D8:S1c:::mov
660
"mov"
661
*mn10300
662
 
663
*am33
664
*am33_2
665
 
666
{
667
  /* OP_4300 (); */
668
  PC = cia;
669
  store_word (State.regs[REG_SP] + (D8), State.regs[REG_A0 + (AM1)]);
670
}
671
 
672
 
673
// 1111 1010 1001 Am00 d16.....; mov Am,(d16,SP) (d16 is zero-extended.)
674
8.0xfa+4.0x9,2.AM1,00+8.IMM16A+8.IMM16B:D2h:::mov
675
"mov"
676
*mn10300
677
 
678
*am33
679
*am33_2
680
 
681
{
682
  /* OP_FA900000 (); */
683
  PC = cia;
684
  store_word (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B),
685
              State.regs[REG_A0 + AM1]);
686
}
687
 
688
 
689
// 1111 1100 1001 Am00 d32.....; mov Am,(d32,SP)
690
8.0xfc+4.0x9,2.AM1,00+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4j:::mov
691
"mov"
692
*mn10300
693
 
694
*am33
695
*am33_2
696
 
697
{
698
  /* OP_FC900000 (); */
699
  PC = cia;
700
  store_word (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
701
              State.regs[REG_A0 + AM1]);
702
}
703
 
704
 
705
// 1111 0011 11Am DiAn; mov Am,(Di,An)
706
8.0xf3+11,2.AM2,2.DI,2.AN0:D0l:::mov
707
"mov"
708
*mn10300
709
 
710
*am33
711
*am33_2
712
 
713
{
714
  /* OP_F3C0 (); */
715
  PC = cia;
716
  store_word ((State.regs[REG_A0 + AN0] + State.regs[REG_D0 + DI]),
717
              State.regs[REG_A0 + AM2]);
718
}
719
 
720
 
721
// 1111 1010 1000 Am00 abs16...; mov Am,(abs16) (abs16 is zero-extended)
722
8.0xfa+4.0x8,2.AM1,00+8.IMM16A+8.IMM16B:D2i:::mov
723
"mov"
724
*mn10300
725
 
726
*am33
727
*am33_2
728
 
729
{
730
  /* OP_FA800000 (); */
731
  PC = cia;
732
  store_word (FETCH16(IMM16A, IMM16B),
733
              State.regs[REG_A0 + AM1]);
734
}
735
 
736
 
737
// 1111 1100 1000 Am00 abs32...; mov Am,(abs32)
738
8.0xfc+4.0x8,2.AM1,00+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4k:::mov
739
"mov"
740
*mn10300
741
 
742
*am33
743
*am33_2
744
 
745
{
746
  /* OP_FC800000 (); */
747
  PC = cia;
748
  store_word (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
749
              State.regs[REG_A0 + AM1]);
750
}
751
 
752
 
753
// 1111 1000 1111 01An d8......; mov SP,(d8,An) (d8 is sign-extended)
754
8.0xf8+4.0xf,01,2.AN0+8.D8:D1e:::mov
755
"mov"
756
*mn10300
757
 
758
*am33
759
*am33_2
760
 
761
{
762
  /* OP_F8F400 (); */
763
  PC = cia;
764
  store_word (State.regs[REG_A0 + AN0] + EXTEND8 (D8),
765
              State.regs[REG_SP]);
766
}
767
 
768
 
769
// 0010 11Dn imm16...; mov imm16,Dn (imm16 is sign-extended)
770
4.0x2,11,2.DN0+8.IMM16A+8.IMM16B:S2b:::mov
771
"mov"
772
*mn10300
773
 
774
*am33
775
*am33_2
776
 
777
{
778
  /* OP_2C0000 (); */
779
  unsigned32 value;
780
 
781
  PC = cia;
782
  value = EXTEND16 (FETCH16(IMM16A, IMM16B));
783
  State.regs[REG_D0 + DN0] = value;
784
}
785
 
786
 
787
// 1111 1100 1100 11Dn imm32...; mov imm32,Dn
788
8.0xfc+4.0xc,11,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4l:::mov
789
"mov"
790
*mn10300
791
 
792
*am33
793
*am33_2
794
 
795
{
796
  /* OP_FCCC0000 (); */
797
  unsigned32 value;
798
 
799
  PC = cia;
800
  value = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
801
  State.regs[REG_D0 + DN0] = value;
802
}
803
 
804
 
805
// 0010 01An imm16...; mov imm16,An (imm16 is zero-extended)
806
4.0x2,01,2.AN0+8.IMM16A+8.IMM16B:S2c:::mov
807
"mov"
808
*mn10300
809
 
810
*am33
811
*am33_2
812
 
813
{
814
  /* OP_240000 (); */
815
  unsigned32 value;
816
 
817
  PC = cia;
818
  value = FETCH16(IMM16A, IMM16B);
819
  State.regs[REG_A0 + AN0] = value;
820
}
821
 
822
 
823
// 1111 1100 1101 11An imm32...; mov imm32,An
824
8.0xfc+4.0xd,11,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4m:::mov
825
"mov"
826
*mn10300
827
 
828
*am33
829
*am33_2
830
 
831
{
832
    /* OP_FCDC0000 (); */
833
    PC = cia;
834
    State.regs[REG_A0 + AN0] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
835
}
836
 
837
 
838
// 1111 0000 0100 DnAm; movbu (Am),Dn
839
8.0xf0+4.0x4,2.DN1,2.AM0:D0:::movbu
840
"movbu"
841
*mn10300
842
 
843
*am33
844
*am33_2
845
 
846
{
847
  /* OP_F040 (); */
848
  PC = cia;
849
  State.regs[REG_D0 + DN1]
850
    = load_byte (State.regs[REG_A0 + AM0]);
851
}
852
 
853
 
854
// 1111 1000 0100 DnAm d8......; movbu (d8,Am),Dn (d8 is sign-extended)
855
8.0xf8+4.0x4,2.DN1,2.AM0+8.D8:D1f:::movbu
856
"movbu"
857
*mn10300
858
 
859
*am33
860
*am33_2
861
 
862
{
863
  /* OP_F84000 (); */
864
  PC = cia;
865
  State.regs[REG_D0 + DN1]
866
    = load_byte ((State.regs[REG_A0 + AM0] + EXTEND8 (D8)));
867
}
868
 
869
 
870
// 1111 1010 0100 DnAm d16.....; movbu (d16,Am),Dn (d16 is sign-extended.)
871
8.0xfa+4.0x4,2.DN1,2.AM0+8.D16A+8.D16B:D2:::movbu
872
"movbu"
873
*mn10300
874
 
875
*am33
876
*am33_2
877
 
878
{
879
  /* OP_FA400000 (); */
880
  PC = cia;
881
  State.regs[REG_D0 + DN1]
882
    = load_byte ((State.regs[REG_A0 + AM0]
883
                  + EXTEND16 (FETCH16(D16A, D16B))));
884
}
885
 
886
 
887
// 1111 1100 0100 DnAm d32.....; movbu (d32,Am),Dn
888
8.0xfc+4.0x4,2.DN1,2.AM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::movbu
889
"movbu"
890
*mn10300
891
 
892
*am33
893
*am33_2
894
 
895
{
896
  /* OP_FC400000 (); */
897
  PC = cia;
898
  State.regs[REG_D0 + DN1]
899
    = load_byte ((State.regs[REG_A0 + AM0]
900
                  + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
901
}
902
 
903
 
904
// 1111 1000 1011 10Dn d8......; movbu (d8,SP),Dn (d8 is zero-extended)
905
8.0xf8+4.0xb,10,2.DN0+8.D8:D1a:::movbu
906
"movbu"
907
*mn10300
908
 
909
*am33
910
*am33_2
911
 
912
{
913
  /* OP_F8B800 (); */
914
  PC = cia;
915
  State.regs[REG_D0 + DN0]
916
    = load_byte ((State.regs[REG_SP] + (D8)));
917
}
918
 
919
 
920
// 1111 1010 1011 10Dn d16.....; movbu (d16,SP),Dn (d16 is zero-extended.)
921
8.0xfa+4.0xb,10,2.DN0+8.IMM16A+8.IMM16B:D2a:::movbu
922
"movbu"
923
*mn10300
924
 
925
*am33
926
*am33_2
927
 
928
{
929
  /* OP_FAB80000 (); */
930
  PC = cia;
931
  State.regs[REG_D0 + DN0]
932
    = load_byte ((State.regs[REG_SP]
933
                  + FETCH16(IMM16A, IMM16B)));
934
}
935
 
936
 
937
// 1111 1100 1011 10Dn d32.....; movbu (d32,SP),Dn
938
8.0xfc+4.0xb,10,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::movbu
939
"movbu"
940
*mn10300
941
 
942
*am33
943
*am33_2
944
 
945
{
946
  /* OP_FCB80000 (); */
947
  PC = cia;
948
  State.regs[REG_D0 + DN0]
949
    = load_byte (State.regs[REG_SP]
950
                 + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
951
}
952
 
953
 
954
// 1111 0100 00Dn DiAm; movbu (Di,Am),Dn
955
8.0xf4+00,2.DN2,2.DI,2.AM0:D0a:::movbu
956
"movbu"
957
*mn10300
958
 
959
*am33
960
*am33_2
961
 
962
{
963
  /* OP_F400 (); */
964
  PC = cia;
965
  State.regs[REG_D0 + DN2]
966
    = load_byte ((State.regs[REG_A0 + AM0]
967
                  + State.regs[REG_D0 + DI]));
968
}
969
 
970
 
971
// 0011 01Dn abs16...; movbu (abs16),Dn (abs16 is zero-extended)
972
4.0x3,01,2.DN0+8.IMM16A+8.IMM16B:S2:::movbu
973
"movbu"
974
*mn10300
975
 
976
*am33
977
*am33_2
978
 
979
{
980
  /* OP_340000 (); */
981
  PC = cia;
982
  State.regs[REG_D0 + DN0] = load_byte (FETCH16(IMM16A, IMM16B));
983
}
984
 
985
 
986
// 1111 1100 1010 10Dn abs32...; movbu (abs32),Dn
987
8.0xfc+4.0xa,10,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4b:::movbu
988
"movbu"
989
*mn10300
990
 
991
*am33
992
*am33_2
993
 
994
{
995
  /* OP_FCA80000 (); */
996
  PC = cia;
997
  State.regs[REG_D0 + DN0]
998
    = load_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
999
}
1000
 
1001
 
1002
// 1111 0000 0101 DmAn; movbu Dm,(An)
1003
8.0xf0+4.0x5,2.DM1,2.AN0:D0b:::movbu
1004
"movbu"
1005
*mn10300
1006
 
1007
*am33
1008
*am33_2
1009
 
1010
{
1011
  /* OP_F050 (); */
1012
  PC = cia;
1013
  store_byte (State.regs[REG_A0 + AN0], State.regs[REG_D0 + DM1]);
1014
}
1015
 
1016
 
1017
// 1111 1000 0101 DmAn d8......; movbu Dm,(d8,An) (d8 is sign-extended)
1018
8.0xf8+4.0x5,2.DM1,2.AN0+8.D8:D1b:::movbu
1019
"movbu"
1020
*mn10300
1021
 
1022
*am33
1023
*am33_2
1024
 
1025
{
1026
  /* OP_F85000 (); */
1027
  PC = cia;
1028
  store_byte ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)),
1029
              State.regs[REG_D0 + DM1]);
1030
}
1031
 
1032
 
1033
// 1111 1010 0101 DmAn d16.....; movbu Dm,(d16,An) (d16 is sign-extended.)
1034
8.0xfa+4.0x5,2.DM1,2.AN0+8.D16A+8.D16B:D2b:::movbu
1035
"movbu"
1036
*mn10300
1037
 
1038
*am33
1039
*am33_2
1040
 
1041
{
1042
  /* OP_FA500000 (); */
1043
  PC = cia;
1044
  store_byte ((State.regs[REG_A0 + AN0] + EXTEND16 (FETCH16(D16A, D16B))),
1045
              State.regs[REG_D0 + DM1]);
1046
}
1047
 
1048
 
1049
// 1111 1100 0101 DmAn d32.....; movbu Dm,(d32,An)
1050
8.0xfc+4.0x5,2.DM1,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4c:::movbu
1051
"movbu"
1052
*mn10300
1053
 
1054
*am33
1055
*am33_2
1056
 
1057
{
1058
  /* OP_FC500000 (); */
1059
  PC = cia;
1060
  store_byte ((State.regs[REG_A0 + AN0]
1061
               + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)),
1062
              State.regs[REG_D0 + DM1]);
1063
}
1064
 
1065
 
1066
// 1111 1000 1001 Dm10 d8......; movbu Dm,(d8,SP) (d8 is zero-extended)
1067
8.0xf8+4.0x9,2.DM1,10+8.D8:D1c:::movbu
1068
"movbu"
1069
*mn10300
1070
 
1071
*am33
1072
*am33_2
1073
 
1074
{
1075
  /* OP_F89200 (); */
1076
  PC = cia;
1077
  store_byte (State.regs[REG_SP] + (D8), State.regs[REG_D0 + DM1]);
1078
}
1079
 
1080
 
1081
// 1111 1010 1001 Dm10 d16.....; movbu Dm,(d16,SP) (d16 is zero-extended.)
1082
8.0xfa+4.0x9,2.DM1,10+8.IMM16A+8.IMM16B:D2c:::movbu
1083
"movbu"
1084
*mn10300
1085
 
1086
*am33
1087
*am33_2
1088
 
1089
{
1090
  /* OP_FA920000 (); */
1091
  PC = cia;
1092
  store_byte (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B),
1093
              State.regs[REG_D0 + DM1]);
1094
}
1095
 
1096
 
1097
// 1111 1100 1001 Dm10 d32.....; movbu Dm,(d32,SP)
1098
8.0xfc+4.0x9,2.DM1,10+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4d:::movbu
1099
"movbu"
1100
*mn10300
1101
 
1102
*am33
1103
*am33_2
1104
 
1105
{
1106
  /* OP_FC920000 (); */
1107
  PC = cia;
1108
  store_byte (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
1109
              State.regs[REG_D0 + DM1]);
1110
}
1111
 
1112
 
1113
// 1111 0100 01Dm DiAn; movbu Dm,(Di,An)
1114
8.0xf4+01,2.DM2,2.DI,2.AN0:D0c:::movbu
1115
"movbu"
1116
*mn10300
1117
 
1118
*am33
1119
*am33_2
1120
 
1121
{
1122
  /* OP_F440 (); */
1123
  PC = cia;
1124
  store_byte ((State.regs[REG_A0 + AN0] + State.regs[REG_D0 + DI]),
1125
              State.regs[REG_D0 + DM2]);
1126
}
1127
 
1128
 
1129
// 0000 Dm10 abs16...; movbu Dm,(abs16) (abs16 is zero-extended)
1130
4.0x0,2.DM1,10+8.IMM16A+8.IMM16B:S2a:::movbu
1131
"movbu"
1132
*mn10300
1133
 
1134
*am33
1135
*am33_2
1136
 
1137
{
1138
  /* OP_20000 (); */
1139
  PC = cia;
1140
  store_byte (FETCH16(IMM16A, IMM16B),
1141
              State.regs[REG_D0 + DM1]);
1142
}
1143
 
1144
 
1145
// 1111 1100 1000 Dm10 abs32...; movbu Dm,(abs32)
1146
8.0xfc+4.0x8,2.DM1,10+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4e:::movbu
1147
"movbu"
1148
*mn10300
1149
 
1150
*am33
1151
*am33_2
1152
 
1153
{
1154
  /* OP_FC820000 (); */
1155
  PC = cia;
1156
  store_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
1157
              State.regs[REG_D0 + DM1]);
1158
}
1159
 
1160
 
1161
// 1111 0000 0110 DnAm; movhu (Am),Dn
1162
8.0xf0+4.0x6,2.DN1,2.AM0:D0:::movhu
1163
"movhu"
1164
*mn10300
1165
 
1166
*am33
1167
*am33_2
1168
 
1169
{
1170
  /* OP_F060 (); */
1171
  PC = cia;
1172
  State.regs[REG_D0 + DN1]
1173
    = load_half (State.regs[REG_A0 + AM0]);
1174
}
1175
 
1176
 
1177
// 1111 1000 0110 DnAm d8......; movhu (d8,Am),Dn (d8 is sign-extended)
1178
8.0xf8+4.0x6,2.DN1,2.AM0+8.D8:D1d:::movhu
1179
"movhu"
1180
*mn10300
1181
 
1182
*am33
1183
*am33_2
1184
 
1185
{
1186
  /* OP_F86000 (); */
1187
  PC = cia;
1188
  State.regs[REG_D0 + DN1]
1189
    = load_half ((State.regs[REG_A0 + AM0] + EXTEND8 (D8)));
1190
}
1191
 
1192
 
1193
// 1111 1010 0110 DnAm d16.....; movhu (d16,Am),Dn (d16 is sign-extended.)
1194
8.0xfa+4.0x6,2.DN1,2.AM0+8.D16A+8.D16B:D2:::movhu
1195
"movhu"
1196
*mn10300
1197
 
1198
*am33
1199
*am33_2
1200
 
1201
{
1202
  /* OP_FA600000 (); */
1203
  PC = cia;
1204
  State.regs[REG_D0 + DN1]
1205
    = load_half ((State.regs[REG_A0 + AM0]
1206
                  + EXTEND16 (FETCH16(D16A, D16B))));
1207
}
1208
 
1209
 
1210
// 1111 1100 0110 DnAm d32.....; movhu (d32,Am),Dn
1211
8.0xfc+4.0x6,2.DN1,2.AM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::movhu
1212
"movhu"
1213
*mn10300
1214
 
1215
*am33
1216
*am33_2
1217
 
1218
{
1219
  /* OP_FC600000 (); */
1220
  PC = cia;
1221
  State.regs[REG_D0 + DN1]
1222
    = load_half ((State.regs[REG_A0 + AM0]
1223
                  + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
1224
}
1225
 
1226
 
1227
// 1111 1000 1011 11Dn d8.....; movhu (d8,SP),Dn (d8 is zero-extended)
1228
8.0xf8+4.0xb,11,2.DN0+8.D8:D1a:::movhu
1229
"movhu"
1230
*mn10300
1231
 
1232
*am33
1233
*am33_2
1234
 
1235
{
1236
  /* OP_F8BC00 (); */
1237
  PC = cia;
1238
  State.regs[REG_D0 + DN0]
1239
    = load_half ((State.regs[REG_SP] + (D8)));
1240
}
1241
 
1242
 
1243
// 1111 1010 1011 11Dn d16.....; movhu (d16,SP),Dn (d16 is zero-extended.)
1244
8.0xfa+4.0xb,11,2.DN0+8.IMM16A+8.IMM16B:D2a:::movhu
1245
"movhu"
1246
*mn10300
1247
 
1248
*am33
1249
*am33_2
1250
 
1251
{
1252
  /* OP_FABC0000 (); */
1253
  PC = cia;
1254
  State.regs[REG_D0 + DN0]
1255
    = load_half ((State.regs[REG_SP] + FETCH16(IMM16A, IMM16B)));
1256
}
1257
 
1258
 
1259
// 1111 1100 1011 11Dn d32.....; movhu (d32,SP),Dn
1260
8.0xfc+4.0xb,11,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::movhu
1261
"movhu"
1262
*mn10300
1263
 
1264
*am33
1265
*am33_2
1266
 
1267
{
1268
  /* OP_FCBC0000 (); */
1269
  PC = cia;
1270
  State.regs[REG_D0 + DN0]
1271
    = load_half (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
1272
}
1273
 
1274
 
1275
// 1111 0100 10Dn DiAm; movhu (Di,Am),Dn
1276
8.0xf4+10,2.DN2,2.DI,2.AM0:D0a:::movhu
1277
"movhu"
1278
*mn10300
1279
 
1280
*am33
1281
*am33_2
1282
 
1283
{
1284
  /* OP_F480 (); */
1285
  PC = cia;
1286
  State.regs[REG_D0 + DN2]
1287
    = load_half ((State.regs[REG_A0 + AM0] + State.regs[REG_D0 + DI]));
1288
}
1289
 
1290
 
1291
// 0011 10Dn abs16...; movhu (abs16),Dn (abs16 is zero-extended)
1292
4.0x3,10,2.DN0+8.IMM16A+8.IMM16B:S2:::movhu
1293
"movhu"
1294
*mn10300
1295
 
1296
*am33
1297
*am33_2
1298
 
1299
{
1300
  /* OP_380000 (); */
1301
  PC = cia;
1302
  State.regs[REG_D0 + DN0] = load_half (FETCH16(IMM16A, IMM16B));
1303
}
1304
 
1305
 
1306
// 1111 1100 1010 11Dn abs32...; movhu (abs32),Dn
1307
8.0xfc+4.0xa,11,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4b:::movhu
1308
"movhu"
1309
*mn10300
1310
 
1311
*am33
1312
*am33_2
1313
 
1314
{
1315
  /* OP_FCAC0000 (); */
1316
  PC = cia;
1317
  State.regs[REG_D0 + DN0]
1318
    = load_half (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
1319
}
1320
 
1321
 
1322
// 1111 0000 0111 DmAn; movhu Dm,(An)
1323
8.0xf0+4.0x7,2.DM1,2.AN0:D0b:::movhu
1324
"movhu"
1325
*mn10300
1326
 
1327
*am33
1328
*am33_2
1329
 
1330
{
1331
  /* OP_F070 (); */
1332
  PC = cia;
1333
  store_half (State.regs[REG_A0 + AN0],
1334
              State.regs[REG_D0 + DM1]);
1335
}
1336
 
1337
 
1338
// 1111 1000 0111 DmAn d8......; movhu Dm,(d8,An) (d8 is sign-extended)
1339
8.0xf8+4.0x7,2.DM1,2.AN0+8.D8:D1b:::movhu
1340
"movhu"
1341
*mn10300
1342
 
1343
*am33
1344
*am33_2
1345
 
1346
{
1347
  /* OP_F87000 (); */
1348
  PC = cia;
1349
  store_half ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)),
1350
              State.regs[REG_D0 + DM1]);
1351
}
1352
 
1353
 
1354
// 1111 1010 0111 DnAm d16.....; movhu Dm,(d16,An) (d16 is sign-extended.)
1355
8.0xfa+4.0x7,2.DM1,2.AN0+8.D16A+8.D16B:D2b:::movhu
1356
"movhu"
1357
*mn10300
1358
 
1359
*am33
1360
*am33_2
1361
 
1362
{
1363
  /* OP_FA700000 (); */
1364
  PC = cia;
1365
  store_half ((State.regs[REG_A0 + AN0] + EXTEND16 (FETCH16(D16A, D16B))),
1366
              State.regs[REG_D0 + DM1]);
1367
}
1368
 
1369
 
1370
// 1111 1100 0111 DmAn d32.....; movhu Dm,(d32,An)
1371
8.0xfc+4.0x7,2.DM1,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4c:::movhu
1372
"movhu"
1373
*mn10300
1374
 
1375
*am33
1376
*am33_2
1377
 
1378
{
1379
  /* OP_FC700000 (); */
1380
  PC = cia;
1381
  store_half ((State.regs[REG_A0 + AN0]
1382
               + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)),
1383
              State.regs[REG_D0 + DM1]);
1384
}
1385
 
1386
 
1387
// 1111 1000 1001 Dm11 d8....; movhu Dm,(d8,SP) (d8 is zero-extended)
1388
8.0xf8+4.0x9,2.DM1,11+8.D8:D1c:::movhu
1389
"movhu"
1390
*mn10300
1391
 
1392
*am33
1393
*am33_2
1394
 
1395
{
1396
  /* OP_F89300 (); */
1397
  PC = cia;
1398
  store_half (State.regs[REG_SP] + (D8),
1399
              State.regs[REG_D0 + DM1]);
1400
}
1401
 
1402
 
1403
// 1111 1010 1001 Dm11 d16.....; movhu Dm,(d16,SP) (d16 is zero-extended.)
1404
8.0xfa+4.0x9,2.DM1,11+8.IMM16A+8.IMM16B:D2c:::movhu
1405
"movhu"
1406
*mn10300
1407
 
1408
*am33
1409
*am33_2
1410
 
1411
{
1412
  /* OP_FA930000 (); */
1413
  PC = cia;
1414
  store_half (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B),
1415
              State.regs[REG_D0 + DM1]);
1416
}
1417
 
1418
 
1419
// 1111 1100 1001 Dm11 d32.....; movhu Dm,(d32,SP)
1420
8.0xfc+4.0x9,2.DM1,11+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4d:::movhu
1421
"movhu"
1422
*mn10300
1423
 
1424
*am33
1425
*am33_2
1426
 
1427
{
1428
  /* OP_FC930000 (); */
1429
  PC = cia;
1430
  store_half (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
1431
              State.regs[REG_D0 + DM1]);
1432
}
1433
 
1434
 
1435
// 1111 0100 11Dm DiAn; movhu Dm,(Di,An)
1436
8.0xf4+11,2.DM2,2.DI,2.AN0:D0c:::movhu
1437
"movhu"
1438
*mn10300
1439
 
1440
*am33
1441
*am33_2
1442
 
1443
{
1444
  /* OP_F4C0 (); */
1445
  PC = cia;
1446
  store_half ((State.regs[REG_A0 + AN0] + State.regs[REG_D0 + DI]),
1447
              State.regs[REG_D0 + DM2]);
1448
}
1449
 
1450
 
1451
// 0000 Dm11 abs16...; movhu Dm,(abs16) (abs16 is zero-extended)
1452
4.0x0,2.DM1,11+8.IMM16A+8.IMM16B:S2a:::movhu
1453
"movhu"
1454
*mn10300
1455
 
1456
*am33
1457
*am33_2
1458
 
1459
{
1460
  /* OP_30000 (); */
1461
  PC = cia;
1462
  store_half (FETCH16(IMM16A, IMM16B), State.regs[REG_D0 + DM1]);
1463
}
1464
 
1465
 
1466
// 1111 1100 1000 Dm11 abs32...; movhu Dm,(abs32)
1467
8.0xfc+4.0x8,2.DM1,11+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4e:::movhu
1468
"movhu"
1469
*mn10300
1470
 
1471
*am33
1472
*am33_2
1473
 
1474
{
1475
  /* OP_FC830000 (); */
1476
  PC = cia;
1477
  store_half (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
1478
              State.regs[REG_D0 + DM1]);
1479
}
1480
 
1481
 
1482
// 1111 0010 1101 00Dn; ext Dn
1483
8.0xf2+4.0xd,00,2.DN0:D0:::ext
1484
"ext"
1485
*mn10300
1486
 
1487
*am33
1488
*am33_2
1489
 
1490
{
1491
  /* OP_F2D0 (); */
1492
  PC = cia;
1493
  if (State.regs[REG_D0 + DN0] & 0x80000000)
1494
    State.regs[REG_MDR] = -1;
1495
  else
1496
    State.regs[REG_MDR] = 0;
1497
}
1498
 
1499
 
1500
// 0001 00Dn; extb Dn
1501
4.0x1,00,2.DN0:S0:::extb
1502
"extb"
1503
*mn10300
1504
 
1505
*am33
1506
*am33_2
1507
 
1508
{
1509
  /* OP_10 (); */
1510
  PC = cia;
1511
  State.regs[REG_D0 + DN0] = EXTEND8 (State.regs[REG_D0 + DN0]);
1512
}
1513
 
1514
 
1515
// 0001 01Dn; extbu Dn
1516
4.0x1,01,2.DN0:S0:::extbu
1517
"extbu"
1518
*mn10300
1519
 
1520
*am33
1521
*am33_2
1522
 
1523
{
1524
  /* OP_14 (); */
1525
  PC = cia;
1526
  State.regs[REG_D0 + DN0] &= 0xff;
1527
}
1528
 
1529
 
1530
// 0001 10Dn; exth Dn
1531
4.0x1,10,2.DN0:S0:::exth
1532
"exth"
1533
*mn10300
1534
 
1535
*am33
1536
*am33_2
1537
 
1538
{
1539
  /* OP_18 (); */
1540
  PC = cia;
1541
  State.regs[REG_D0 + DN0] = EXTEND16 (State.regs[REG_D0 + DN0]);
1542
}
1543
 
1544
 
1545
// 0001 11Dn; exthu Dn
1546
4.0x1,11,2.DN0:S0:::exthu
1547
"exthu"
1548
*mn10300
1549
 
1550
*am33
1551
*am33_2
1552
 
1553
{
1554
  /* OP_1C (); */
1555
  PC = cia;
1556
  State.regs[REG_D0 + DN0] &= 0xffff;
1557
}
1558
 
1559
 
1560
// 0000 Dn00; clr Dn
1561
4.0x0,2.DN1,00:S0:::clr
1562
"clr"
1563
*mn10300
1564
 
1565
*am33
1566
*am33_2
1567
 
1568
{
1569
  /* OP_0 (); */
1570
  PC = cia;
1571
  State.regs[REG_D0 + DN1] = 0;
1572
 
1573
  PSW |= PSW_Z;
1574
  PSW &= ~(PSW_V | PSW_C | PSW_N);
1575
}
1576
 
1577
 
1578
// 1110 DmDn; add Dm,Dn
1579
4.0xe,2.DM1,2.DN0:S0:::add
1580
"add"
1581
*mn10300
1582
 
1583
*am33
1584
*am33_2
1585
 
1586
{
1587
  /* OP_E0 (); */
1588
  PC = cia;
1589
  genericAdd(State.regs[REG_D0 + DM1], REG_D0 + DN0);
1590
}
1591
 
1592
// 1111 0001 0110 DmAn; add Dm,An
1593
8.0xf1+4.0x6,2.DM1,2.AN0:D0:::add
1594
"add"
1595
*mn10300
1596
 
1597
*am33
1598
*am33_2
1599
 
1600
{
1601
  /* OP_F160 (); */
1602
  PC = cia;
1603
  genericAdd(State.regs[REG_D0 + DM1], REG_A0 + AN0);
1604
}
1605
 
1606
 
1607
// 1111 0001 0101 AmDn; add Am,Dn
1608
8.0xf1+4.0x5,2.AM1,2.DN0:D0a:::add
1609
"add"
1610
*mn10300
1611
 
1612
*am33
1613
*am33_2
1614
 
1615
{
1616
  /* OP_F150 (); */
1617
  PC = cia;
1618
  genericAdd(State.regs[REG_A0 + AM1], REG_D0 + DN0);
1619
}
1620
 
1621
 
1622
// 1111 0001 0111 AmAn; add Am,An
1623
8.0xf1+4.0x7,2.AM1,2.AN0:D0b:::add
1624
"add"
1625
*mn10300
1626
 
1627
*am33
1628
*am33_2
1629
 
1630
{
1631
  /* OP_F170 (); */
1632
  PC = cia;
1633
  genericAdd(State.regs[REG_A0 + AM1], REG_A0 + AN0);
1634
}
1635
 
1636
 
1637
// 0010 10Dn imm8....; add imm8,Dn (imm8 is sign-extended)
1638
4.0x2,10,2.DN0+8.IMM8:S1:::add
1639
"add"
1640
*mn10300
1641
 
1642
*am33
1643
*am33_2
1644
 
1645
{
1646
  /* OP_2800 (); */
1647
  PC = cia;
1648
  genericAdd(EXTEND8(IMM8), REG_D0 + DN0);
1649
}
1650
 
1651
 
1652
// 1111 1010 1100 00Dn imm16...; add imm16,Dn
1653
8.0xfa+4.0xc,00,2.DN0+8.IMM16A+8.IMM16B:D2:::add
1654
"add"
1655
*mn10300
1656
 
1657
*am33
1658
*am33_2
1659
 
1660
{
1661
  /* OP_FAC00000 (); */
1662
  PC = cia;
1663
  genericAdd(EXTEND16(FETCH16(IMM16A, IMM16B)), REG_D0 + DN0);
1664
}
1665
 
1666
 
1667
// 1111 1100 1100 00Dn imm32...; add imm32,Dn
1668
8.0xfc+4.0xc,00,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::add
1669
"add"
1670
*mn10300
1671
 
1672
*am33
1673
*am33_2
1674
 
1675
{
1676
  /* OP_FCC00000 (); */
1677
  PC = cia;
1678
  genericAdd(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_D0 + DN0);
1679
}
1680
 
1681
 
1682
// 0010 00An imm8....; add imm8,An (imm8 is sign-extended)
1683
4.0x2,00,2.AN0+8.IMM8:S1a:::add
1684
"add"
1685
*mn10300
1686
 
1687
*am33
1688
*am33_2
1689
 
1690
{
1691
  /* OP_2000 (); */
1692
  PC = cia;
1693
  genericAdd(EXTEND8(IMM8), REG_A0 + AN0);
1694
}
1695
 
1696
 
1697
// 1111 1010 1101 00An imm16...; add imm16,An (imm16 is sign-extended.)
1698
8.0xfa+4.0xd,00,2.AN0+8.IMM16A+8.IMM16B:D2a:::add
1699
"add"
1700
*mn10300
1701
 
1702
*am33
1703
*am33_2
1704
 
1705
{
1706
  /* OP_FAD00000 (); */
1707
  PC = cia;
1708
  genericAdd(EXTEND16(FETCH16(IMM16A, IMM16B)), REG_A0 + AN0);
1709
}
1710
 
1711
 
1712
// 1111 1100 1101 00An imm32...; add imm32,An
1713
8.0xfc+4.0xd,00,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::add
1714
"add"
1715
*mn10300
1716
 
1717
*am33
1718
*am33_2
1719
 
1720
{
1721
  /* OP_FCD00000 (); */
1722
  PC = cia;
1723
  genericAdd(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_A0 + AN0);
1724
}
1725
 
1726
 
1727
// 1111 1000 1111 1110 imm8....; add imm8,SP (imm8 is sign-extended.)
1728
8.0xf8+8.0xfe+8.IMM8:D1:::add
1729
"add"
1730
*mn10300
1731
 
1732
*am33
1733
*am33_2
1734
 
1735
{
1736
  /* OP_F8FE00 (); */
1737
  unsigned32 imm;
1738
 
1739
  /* Note: no PSW changes. */
1740
  PC = cia;
1741
  imm = EXTEND8 (IMM8);
1742
  State.regs[REG_SP] += imm;
1743
}
1744
 
1745
 
1746
// 1111 1010 1111 1110 imm16...; add imm16,SP (imm16 is sign-extended.)
1747
8.0xfa+8.0xfe+8.IMM16A+8.IMM16B:D2b:::add
1748
"add"
1749
*mn10300
1750
 
1751
*am33
1752
*am33_2
1753
 
1754
{
1755
  /* OP_FAFE0000 (); */
1756
  unsigned32 imm;
1757
 
1758
  /* Note: no PSW changes. */
1759
  PC = cia;
1760
  imm = EXTEND16 (FETCH16(IMM16A, IMM16B));
1761
  State.regs[REG_SP] += imm;
1762
}
1763
 
1764
 
1765
// 1111 1100 1111 1110 imm32...; add imm32,SP
1766
8.0xfc+8.0xfe+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4b:::add
1767
"add"
1768
*mn10300
1769
 
1770
*am33
1771
*am33_2
1772
 
1773
{
1774
  /* OP_FCFE0000 (); */
1775
  unsigned32 imm;
1776
 
1777
  /* Note: no PSW changes. */
1778
  PC = cia;
1779
  imm = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
1780
  State.regs[REG_SP] += imm;
1781
}
1782
 
1783
 
1784
// 1111 0001 0100 DmDn; addc Dm,Dn
1785
8.0xf1+4.0x4,2.DM1,2.DN0:D0:::addc
1786
"addc"
1787
*mn10300
1788
 
1789
*am33
1790
*am33_2
1791
 
1792
{
1793
  /* OP_F140 (); */
1794
  int z, c, n, v;
1795
  unsigned32 reg1, reg2, sum;
1796
 
1797
  PC = cia;
1798
  reg1 = State.regs[REG_D0 + DM1];
1799
  reg2 = State.regs[REG_D0 + DN0];
1800
  sum = reg1 + reg2 + ((PSW & PSW_C) != 0);
1801
  State.regs[REG_D0 + DN0] = sum;
1802
 
1803
  z = ((PSW & PSW_Z) != 0) && (sum == 0);
1804
  n = (sum & 0x80000000);
1805
  c = (sum < reg1) || (sum < reg2);
1806
  v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
1807
       && (reg2 & 0x80000000) != (sum & 0x80000000));
1808
 
1809
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1810
  PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1811
          | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1812
}
1813
 
1814
 
1815
// 1111 0001 0000 DmDn; sub Dm,Dn
1816
8.0xf1+4.0x0,2.DM1,2.DN0:D0:::sub
1817
"sub"
1818
*mn10300
1819
 
1820
*am33
1821
*am33_2
1822
 
1823
{
1824
  /* OP_F100 (); */
1825
  PC = cia;
1826
  genericSub(State.regs[REG_D0 + DM1], REG_D0 + DN0);
1827
}
1828
 
1829
// 1111 0001 0010 DmAn; sub DmAn
1830
8.0xf1+4.0x2,2.DM1,2.AN0:D0a:::sub
1831
"sub"
1832
*mn10300
1833
 
1834
*am33
1835
*am33_2
1836
 
1837
{
1838
  /* OP_F120 (); */
1839
  PC = cia;
1840
  genericSub(State.regs[REG_D0 + DM1], REG_A0 + AN0);
1841
}
1842
 
1843
 
1844
// 1111 0001 0001 AmDn; sub AmDn
1845
8.0xf1+4.0x1,2.AM1,2.DN0:D0b:::sub
1846
"sub"
1847
*mn10300
1848
 
1849
*am33
1850
*am33_2
1851
 
1852
{
1853
  /* OP_F110 (); */
1854
  PC = cia;
1855
  genericSub(State.regs[REG_A0 + AM1], REG_D0 + DN0);
1856
}
1857
 
1858
 
1859
// 1111 0001 0011 AmAn; sub Am,An
1860
8.0xf1+4.0x3,2.AM1,2.AN0:D0c:::sub
1861
"sub"
1862
*mn10300
1863
 
1864
*am33
1865
*am33_2
1866
 
1867
{
1868
  /* OP_F130 (); */
1869
  PC = cia;
1870
  genericSub(State.regs[REG_A0 + AM1], REG_A0 + AN0);
1871
}
1872
 
1873
 
1874
// 1111 1100 1100 01Dn imm32...; sub imm32,Dn
1875
8.0xfc+4.0xc,01,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::sub
1876
"sub"
1877
*mn10300
1878
 
1879
*am33
1880
*am33_2
1881
 
1882
{
1883
  /* OP_FCC40000 (); */
1884
  PC = cia;
1885
  genericSub(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_D0 + DN0);
1886
}
1887
 
1888
 
1889
// 1111 1100 1101 01An imm32...; sub imm32,An
1890
8.0xfc+4.0xd,01,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::sub
1891
"sub"
1892
*mn10300
1893
 
1894
*am33
1895
*am33_2
1896
 
1897
{
1898
  /* OP_FCD40000 (); */
1899
  PC = cia;
1900
  genericSub(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_A0 + AN0);
1901
}
1902
 
1903
 
1904
// 1111 0001 1000 DmDn; subc Dm,Dn
1905
8.0xf1+4.0x8,2.DM1,2.DN0:D0:::subc
1906
"subc"
1907
*mn10300
1908
 
1909
*am33
1910
*am33_2
1911
 
1912
{
1913
  /* OP_F180 (); */
1914
  int z, c, n, v;
1915
  unsigned32 reg1, reg2, difference;
1916
 
1917
  PC = cia;
1918
  reg1 = State.regs[REG_D0 + DM1];
1919
  reg2 = State.regs[REG_D0 + DN0];
1920
  difference = reg2 - reg1 - ((PSW & PSW_C) != 0);
1921
  State.regs[REG_D0 + DN0] = difference;
1922
 
1923
  z = ((PSW & PSW_Z) != 0) && (difference == 0);
1924
  n = (difference & 0x80000000);
1925
  c = (reg1 > reg2);
1926
  v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1927
       && (reg2 & 0x80000000) != (difference & 0x80000000));
1928
 
1929
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1930
  PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1931
          | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1932
}
1933
 
1934
 
1935
// 1111 0010 0100 DmDn; mul Dm,Dn
1936
8.0xf2+4.0x4,2.DM1,2.DN0:D0:::mul
1937
"mul"
1938
*mn10300
1939
 
1940
*am33
1941
*am33_2
1942
 
1943
{
1944
  /* OP_F240 (); */
1945
  unsigned64 temp;
1946
  int n, z;
1947
 
1948
  PC = cia;
1949
  temp = ((signed64)(signed32)State.regs[REG_D0 + DN0]
1950
          *  (signed64)(signed32)State.regs[REG_D0 + DM1]);
1951
  State.regs[REG_D0 + DN0] = temp & 0xffffffff;
1952
  State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
1953
  z = (State.regs[REG_D0 + DN0] == 0);
1954
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
1955
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1956
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1957
}
1958
 
1959
 
1960
// 1111 0010 0101 DmDn; mulu Dm,Dn
1961
8.0xf2+4.0x5,2.DM1,2.DN0:D0:::mulu
1962
"mulu"
1963
*mn10300
1964
 
1965
*am33
1966
*am33_2
1967
 
1968
{
1969
  /* OP_F250 (); */
1970
  unsigned64 temp;
1971
  int n, z;
1972
 
1973
  PC = cia;
1974
  temp = ((unsigned64)State.regs[REG_D0 + DN0]
1975
          * (unsigned64)State.regs[REG_D0 + DM1]);
1976
  State.regs[REG_D0 + DN0] = temp & 0xffffffff;
1977
  State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
1978
  z = (State.regs[REG_D0 + DN0] == 0);
1979
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
1980
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1981
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1982
}
1983
 
1984
 
1985
// 1111 0010 0110 DmDn; div Dm,Dn
1986
8.0xf2+4.0x6,2.DM1,2.DN0:D0:::div
1987
"div"
1988
*mn10300
1989
 
1990
*am33
1991
*am33_2
1992
 
1993
{
1994
  /* OP_F260 (); */
1995
  signed64 temp;
1996
  signed32 denom;
1997
  int n, z, v;
1998
 
1999
  PC = cia;
2000
  denom = (signed32)State.regs[REG_D0 + DM1];
2001
 
2002
  temp = State.regs[REG_MDR];
2003
  temp <<= 32;
2004
  temp |= State.regs[REG_D0 + DN0];
2005
  if ( !(v = (0 == denom)) )
2006
    {
2007
      State.regs[REG_MDR] = temp % (signed32)State.regs[REG_D0 + DM1];
2008
      temp /= (signed32)State.regs[REG_D0 + DM1];
2009
      State.regs[REG_D0 + DN0] = temp & 0xffffffff;
2010
    }
2011
  else
2012
    {
2013
      State.regs[REG_MDR] = temp;
2014
      State.regs[REG_D0 + DN0] = 0xff;
2015
    }
2016
  z = (State.regs[REG_D0 + DN0] == 0);
2017
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2018
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2019
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (v ? PSW_V : 0));
2020
}
2021
 
2022
 
2023
// 1111 0010 0111 DmDn; divu Dm,Dn
2024
8.0xf2+4.0x7,2.DM1,2.DN0:D0:::divu
2025
"divu"
2026
*mn10300
2027
 
2028
*am33
2029
*am33_2
2030
 
2031
{
2032
  /* OP_F270 (); */
2033
  unsigned64 temp;
2034
  unsigned32 denom;
2035
  int n, z, v;
2036
 
2037
  PC = cia;
2038
  denom = (unsigned32)State.regs[REG_D0 + DM1];
2039
  temp = State.regs[REG_MDR];
2040
  temp <<= 32;
2041
  temp |= State.regs[REG_D0 + DN0];
2042
  if ( !(v = (0 == denom)) )
2043
    {
2044
      State.regs[REG_MDR] = temp % State.regs[REG_D0 + DM1];
2045
      temp /= State.regs[REG_D0 + DM1];
2046
      State.regs[REG_D0 + DN0] = temp & 0xffffffff;
2047
    }
2048
  else
2049
    {
2050
      State.regs[REG_MDR] = temp;
2051
      State.regs[REG_D0 + DN0] = 0xff;
2052
    }
2053
  z = (State.regs[REG_D0 + DN0] == 0);
2054
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2055
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2056
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (v ? PSW_V : 0));
2057
}
2058
 
2059
 
2060
// 0100 Dn00; inc Dn
2061
4.0x4,2.DN1,00:S0:::inc
2062
"inc"
2063
*mn10300
2064
 
2065
*am33
2066
*am33_2
2067
 
2068
{
2069
  /* OP_40 (); */
2070
  unsigned32 imm;
2071
 
2072
  PC = cia;
2073
  imm = 1;
2074
  genericAdd(imm, REG_D0 + DN1);
2075
}
2076
 
2077
 
2078
// 0100 An01
2079
4.0x4,2.AN1,01:S0a:::inc
2080
"inc"
2081
*mn10300
2082
 
2083
*am33
2084
*am33_2
2085
 
2086
{
2087
  /* OP_41 (); */
2088
  PC = cia;
2089
  State.regs[REG_A0 + AN1] += 1;
2090
}
2091
 
2092
 
2093
// 0101 00An; inc4 An
2094
4.0x5,00,2.AN0:S0:::inc4
2095
"inc4"
2096
*mn10300
2097
 
2098
*am33
2099
*am33_2
2100
 
2101
{
2102
  /* OP_50 (); */
2103
  PC = cia;
2104
  State.regs[REG_A0 + AN0] += 4;
2105
}
2106
 
2107
 
2108
// 1010 DnDn imm8....; cmp imm8,Dn (imm8 is sign-extended.)
2109
4.0xa,2.DM1,2.DN0=DM1+IMM8:S0i:::cmp
2110
"cmp"
2111
*mn10300
2112
 
2113
*am33
2114
*am33_2
2115
 
2116
{
2117
  PC = cia;
2118
  /* OP_A000 (); */
2119
  genericCmp(EXTEND8 (IMM8), State.regs[REG_D0 + DN0]);
2120
}
2121
 
2122
 
2123
// 1010 DmDn; cmp Dm,Dn (Dm != Dn, see above when Dm == Dn)
2124
4.0xa,2.DM1,2.DN0!DM1:S0:::cmp
2125
"cmp"
2126
*mn10300
2127
 
2128
*am33
2129
*am33_2
2130
 
2131
{
2132
  PC = cia;
2133
  /* OP_A0 (); */
2134
  genericCmp(State.regs[REG_D0 + DM1], State.regs[REG_D0 + DN0]);
2135
}
2136
 
2137
 
2138
// 1111 0001 1010 DmAn; cmp Dm,An
2139
8.0xf1+4.0xa,2.DM1,2.AN0:D0:::cmp
2140
"cmp"
2141
*mn10300
2142
 
2143
*am33
2144
*am33_2
2145
 
2146
{
2147
  /* OP_F1A0 (); */
2148
  PC = cia;
2149
  genericCmp(State.regs[REG_D0 + DM1], State.regs[REG_A0 + AN0]);
2150
}
2151
 
2152
 
2153
// 1111 0001 1001 AmDn; cmp Am,Dn
2154
8.0xf1+4.0x9,2.AM1,2.DN0:D0a:::cmp
2155
"cmp"
2156
*mn10300
2157
 
2158
*am33
2159
*am33_2
2160
 
2161
{
2162
  /* OP_F190 (); */
2163
  PC = cia;
2164
  genericCmp(State.regs[REG_A0 + AM1], State.regs[REG_D0 + DN0]);
2165
}
2166
 
2167
 
2168
// 1011 AnAn imm8....; cmp imm8,An (imm8 is zero-extended.)
2169
4.0xb,2.AM1,2.AN0=AM1+IMM8:S0ai:::cmp
2170
"cmp"
2171
*mn10300
2172
 
2173
*am33
2174
*am33_2
2175
 
2176
{
2177
  PC = cia;
2178
  /* OP_B000 (); */
2179
  genericCmp(IMM8,
2180
             State.regs[REG_A0 + AN0]);
2181
}
2182
 
2183
 
2184
// 1011 AmAn; cmp Am,An (Dm != Dn, see above when Dm == Dn)
2185
4.0xb,2.AM1,2.AN0!AM1:S0a:::cmp
2186
"cmp"
2187
*mn10300
2188
 
2189
*am33
2190
*am33_2
2191
 
2192
{
2193
  PC = cia;
2194
  /* OP_B0 (); */
2195
  genericCmp(State.regs[REG_A0 + AM1], State.regs[REG_A0 + AN0]);
2196
}
2197
 
2198
 
2199
// 1111 1010 1100 10Dn imm16...; cmp imm16,Dn (imm16 is sign-extended.)
2200
8.0xfa+4.0xc,10,2.DN0+8.IMM16A+8.IMM16B:D2:::cmp
2201
"cmp"
2202
*mn10300
2203
 
2204
*am33
2205
*am33_2
2206
 
2207
{
2208
  /* OP_FAC80000 (); */
2209
  PC = cia;
2210
  genericCmp(EXTEND16(FETCH16(IMM16A, IMM16B)),
2211
             State.regs[REG_D0 + DN0]);
2212
}
2213
 
2214
 
2215
// 1111 1100 1100 10Dn imm32...; cmp imm32,Dn
2216
8.0xfc+4.0xc,10,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::cmp
2217
"cmp"
2218
*mn10300
2219
 
2220
*am33
2221
*am33_2
2222
 
2223
{
2224
  /* OP_FCC80000 (); */
2225
  PC = cia;
2226
  genericCmp(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
2227
             State.regs[REG_D0 + DN0]);
2228
}
2229
 
2230
 
2231
// 1111 1010 1101 10An imm16...; cmp imm16,An (imm16 is zero-extended.)
2232
8.0xfa+4.0xd,10,2.AN0+8.IMM16A+8.IMM16B:D2a:::cmp
2233
"cmp"
2234
*mn10300
2235
 
2236
*am33
2237
*am33_2
2238
 
2239
{
2240
  /* OP_FAD80000 (); */
2241
  PC = cia;
2242
  genericCmp(FETCH16(IMM16A, IMM16B),
2243
             State.regs[REG_A0 + AN0]);
2244
}
2245
 
2246
 
2247
// 1111 1100 1101 10An imm32...; cmp imm32,An
2248
8.0xfc+4.0xd,10,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::cmp
2249
"cmp"
2250
*mn10300
2251
 
2252
*am33
2253
*am33_2
2254
 
2255
{
2256
  /* OP_FCD80000 (); */
2257
  PC = cia;
2258
  genericCmp(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
2259
             State.regs[REG_A0 + AN0]);
2260
}
2261
 
2262
 
2263
// 1111 0010 0000 DmDn; and Dm,Dn
2264
8.0xf2+4.0x0,2.DM1,2.DN0:D0:::and
2265
"and"
2266
*mn10300
2267
 
2268
*am33
2269
*am33_2
2270
 
2271
{
2272
  /* OP_F200 (); */
2273
  int n, z;
2274
 
2275
  PC = cia;
2276
  State.regs[REG_D0 + DN0] &= State.regs[REG_D0 + DM1];
2277
  z = (State.regs[REG_D0 + DN0] == 0);
2278
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2279
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2280
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2281
}
2282
 
2283
 
2284
// 1111 1000 1110 00Dn imm8....; and imm8,Dn (imm8 is zero-extended.)
2285
8.0xf8+4.0xe,00,2.DN0+8.IMM8:D1:::and
2286
"and"
2287
*mn10300
2288
 
2289
*am33
2290
*am33_2
2291
 
2292
{
2293
  /* OP_F8E000 (); */
2294
  int n, z;
2295
 
2296
  PC = cia;
2297
  State.regs[REG_D0 + DN0] &= IMM8;
2298
  z = (State.regs[REG_D0 + DN0] == 0);
2299
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2300
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2301
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2302
}
2303
 
2304
 
2305
// 1111 1010 1110 00Dn imm16...; and imm16,Dn (imm16 is zero-extended.)
2306
8.0xfa+4.0xe,00,2.DN0+8.IMM16A+8.IMM16B:D2:::and
2307
"and"
2308
*mn10300
2309
 
2310
*am33
2311
*am33_2
2312
 
2313
{
2314
  /* OP_FAE00000 (); */
2315
  int n, z;
2316
 
2317
  PC = cia;
2318
  State.regs[REG_D0 + DN0] &= FETCH16(IMM16A, IMM16B);
2319
  z = (State.regs[REG_D0 + DN0] == 0);
2320
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2321
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2322
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2323
}
2324
 
2325
 
2326
// 1111 1100 1110 00Dn imm32...; and imm32,Dn
2327
8.0xfc+4.0xe,00,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::and
2328
"and"
2329
*mn10300
2330
 
2331
*am33
2332
*am33_2
2333
 
2334
{
2335
  /* OP_FCE00000 (); */
2336
  int n, z;
2337
 
2338
  PC = cia;
2339
  State.regs[REG_D0 + DN0]
2340
    &= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
2341
  z = (State.regs[REG_D0 + DN0] == 0);
2342
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2343
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2344
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2345
}
2346
 
2347
 
2348
// 1111 1010 1111 1100 imm16...; and imm16,PSW (imm16 is zero-extended.)
2349
8.0xfa+8.0xfc+8.IMM16A+8.IMM16B:D2a:::and
2350
"and"
2351
*mn10300
2352
 
2353
*am33
2354
*am33_2
2355
 
2356
{
2357
  /* OP_FAFC0000 (); */
2358
  PC = cia;
2359
  PSW &= FETCH16(IMM16A, IMM16B);
2360
}
2361
 
2362
 
2363
 
2364
// 1111 0010 0001 DmDn; or DmDn
2365
8.0xf2+4.0x1,2.DM1,2.DN0:D0:::or
2366
"or"
2367
*mn10300
2368
 
2369
*am33
2370
*am33_2
2371
 
2372
{
2373
  /* OP_F210 (); */
2374
  PC = cia;
2375
  genericOr(State.regs[REG_D0 + DM1], REG_D0 + DN0);
2376
}
2377
 
2378
 
2379
// 1111 1000 1110 01Dn imm8....; or imm8,Dn (imm8 is zero-extended.)n
2380
8.0xf8+4.0xe,01,2.DN0+8.IMM8:D1:::or
2381
"or"
2382
*mn10300
2383
 
2384
*am33
2385
*am33_2
2386
 
2387
{
2388
  /* OP_F8E400 (); */
2389
  PC = cia;
2390
  genericOr(IMM8, REG_D0 + DN0);
2391
}
2392
 
2393
 
2394
// 1111 1010 1110 01Dn imm16...; or imm16,DN (imm16 is zero-extended.)
2395
8.0xfa+4.0xe,01,2.DN0+8.IMM16A+8.IMM16B:D2:::or
2396
"or"
2397
*mn10300
2398
 
2399
*am33
2400
*am33_2
2401
 
2402
{
2403
  /* OP_FAE40000 (); */
2404
  PC = cia;
2405
  genericOr(FETCH16(IMM16A, IMM16B), REG_D0 + DN0);
2406
}
2407
 
2408
 
2409
// 1111 1100 1110 01Dn imm32...; or imm32,Dn
2410
8.0xfc+4.0xe,01,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::or
2411
"or"
2412
*mn10300
2413
 
2414
*am33
2415
*am33_2
2416
 
2417
{
2418
  /* OP_FCE40000 (); */
2419
  PC = cia;
2420
  genericOr(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_D0 + DN0);
2421
}
2422
 
2423
 
2424
// 1111 1010 1111 1101 imm16...; or imm16,PSW (imm16 is zero-extended.)
2425
8.0xfa+8.0xfd+8.IMM16A+8.IMM16B:D2a:::or
2426
"or"
2427
*mn10300
2428
 
2429
*am33
2430
*am33_2
2431
 
2432
{
2433
  /* OP_FAFD0000 (); */
2434
  PC = cia;
2435
  PSW |= FETCH16(IMM16A, IMM16B);
2436
}
2437
 
2438
 
2439
// 1111 0010 0010 DmDn; xor Dm,Dn
2440
8.0xf2+4.0x2,2.DM1,2.DN0:D0:::xor
2441
"xor"
2442
*mn10300
2443
 
2444
*am33
2445
*am33_2
2446
 
2447
{
2448
  /* OP_F220 (); */
2449
  PC = cia;
2450
  genericXor(State.regs[REG_D0 + DM1], REG_D0 + DN0);
2451
}
2452
 
2453
 
2454
// 1111 1010 1110 10Dn imm16...; xor imm16,Dn (imm16 is zero-extended.)
2455
8.0xfa+4.0xe,10,2.DN0+8.IMM16A+8.IMM16B:D2:::xor
2456
"xor"
2457
*mn10300
2458
 
2459
*am33
2460
*am33_2
2461
 
2462
{
2463
  /* OP_FAE80000 (); */
2464
  PC = cia;
2465
  genericXor(FETCH16(IMM16A, IMM16B), REG_D0 + DN0);
2466
}
2467
 
2468
 
2469
// 1111 1100 1110 10Dn imm32...; xor imm32,Dn
2470
8.0xfc+4.0xe,10,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::xor
2471
"xor"
2472
*mn10300
2473
 
2474
*am33
2475
*am33_2
2476
 
2477
{
2478
  /* OP_FCE80000 (); */
2479
  PC = cia;
2480
  genericXor(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_D0 + DN0);
2481
}
2482
 
2483
 
2484
// 1111 0010 0011 00Dn; not Dn
2485
8.0xf2+4.0x3,00,2.DN0:D0:::not
2486
"not"
2487
*mn10300
2488
 
2489
*am33
2490
*am33_2
2491
 
2492
{
2493
  /* OP_F230 (); */
2494
  int n, z;
2495
 
2496
  PC = cia;
2497
  State.regs[REG_D0 + DN0] = ~State.regs[REG_D0 + DN0];
2498
  z = (State.regs[REG_D0 + DN0] == 0);
2499
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2500
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2501
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2502
}
2503
 
2504
 
2505
// 1111 1000 1110 11Dn imm8....; btst imm8,Dn (imm8 is zero-extended.)
2506
8.0xf8+4.0xe,11,2.DN0+8.IMM8:D1:::btst
2507
"btst"
2508
*mn10300
2509
 
2510
*am33
2511
*am33_2
2512
 
2513
{
2514
  /* OP_F8EC00 (); */
2515
  PC = cia;
2516
  genericBtst(IMM8, State.regs[REG_D0 + DN0]);
2517
}
2518
 
2519
 
2520
// 1111 1010 1110 11Dn imm16.....; btst imm16,Dn (imm16 is zero-extended.)
2521
8.0xfa+4.0xe,11,2.DN0+8.IMM16A+8.IMM16B:D2:::btst
2522
"btst"
2523
*mn10300
2524
 
2525
*am33
2526
*am33_2
2527
 
2528
{
2529
  /* OP_FAEC0000 (); */
2530
  PC = cia;
2531
  genericBtst(FETCH16(IMM16A, IMM16B), State.regs[REG_D0 + DN0]);
2532
}
2533
 
2534
 
2535
// 1111 1100 1110 11Dn imm32...; btst imm32,Dn
2536
8.0xfc+4.0xe,11,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::btst
2537
"btst"
2538
*mn10300
2539
 
2540
*am33
2541
*am33_2
2542
 
2543
{
2544
  /* OP_FCEC0000 (); */
2545
  PC = cia;
2546
  genericBtst(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
2547
              State.regs[REG_D0 + DN0]);
2548
}
2549
 
2550
 
2551
// 1111 1110 0000 0010 abs32... imm8....; btst imm8,(abs32) (imm8 is zero-extended., processing unit: byte)
2552
8.0xfe+8.0x02+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D+8.IMM8:D5:::btst
2553
"btst"
2554
*mn10300
2555
 
2556
*am33
2557
*am33_2
2558
 
2559
{
2560
  /* OP_FE020000 (); */
2561
  PC = cia;
2562
  genericBtst(IMM8,
2563
              load_byte(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
2564
}
2565
 
2566
 
2567
// 1111 1010 1111 10An d8...... imm8....;
2568
// btst imm8,(d8,An) (d8 is sign-extended,imm8 is zero-extended., processing unit: byte)
2569
8.0xfa+4.0xf,10,2.AN0+8.D8+8.IMM8:D2a:::btst
2570
"btst"
2571
*mn10300
2572
 
2573
*am33
2574
*am33_2
2575
 
2576
{
2577
  /* OP_FAF80000 (); */
2578
  PC = cia;
2579
  genericBtst(IMM8,
2580
              load_byte(State.regs[REG_A0 + AN0] + EXTEND8(D8)));
2581
}
2582
 
2583
 
2584
// 1111 0000 1000 DmAn; bset Dm,(An) (Processing unit byte)
2585
8.0xf0+4.8,2.DM1,2.AN0:D0:::bset
2586
"bset"
2587
*mn10300
2588
 
2589
*am33
2590
*am33_2
2591
 
2592
{
2593
  /* OP_F080 (); */
2594
  unsigned32 temp;
2595
  int z;
2596
 
2597
  PC = cia;
2598
  temp = load_byte (State.regs[REG_A0 + AN0]);
2599
  z = (temp & State.regs[REG_D0 + DM1]) == 0;
2600
  temp |= State.regs[REG_D0 + DM1];
2601
  store_byte (State.regs[REG_A0 + AN0], temp);
2602
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2603
  PSW |= (z ? PSW_Z : 0);
2604
}
2605
 
2606
 
2607
// 1111 1110 0000 0000 abs32... imm8....;
2608
// bset imm8,(abs32) (imm8 is zero-extended., processing unit: byte)
2609
8.0xfe+8.0x00+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D+8.IMM8:D5:::bset
2610
"bset"
2611
*mn10300
2612
 
2613
*am33
2614
*am33_2
2615
 
2616
{
2617
  /* OP_FE000000 (); */
2618
  unsigned32 temp;
2619
  int z;
2620
 
2621
  PC = cia;
2622
  temp = load_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
2623
  z = (temp & IMM8) == 0;
2624
  temp |= IMM8;
2625
  store_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), temp);
2626
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2627
  PSW |= (z ? PSW_Z : 0);
2628
}
2629
 
2630
 
2631
// 1111 1010 1111 00AnAn d8...... imm8....;
2632
// bset imm8,(d8,An) (d8 is sign-extended, imm8 is zero-extended., processing unit: byte)
2633
8.0xfa+4.0xf,00,2.AN0+8.D8+8.IMM8:D2:::bset
2634
"bset"
2635
*mn10300
2636
 
2637
*am33
2638
*am33_2
2639
 
2640
{
2641
  /* OP_FAF00000 (); */
2642
  unsigned32 temp;
2643
  int z;
2644
 
2645
  PC = cia;
2646
  temp = load_byte ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)));
2647
  z = (temp & (IMM8)) == 0;
2648
  temp |= (IMM8);
2649
  store_byte ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)), temp);
2650
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2651
  PSW |= (z ? PSW_Z : 0);
2652
}
2653
 
2654
 
2655
// 1111 0000 1001 DmAn; bclr Dm,(An) (Processing unit byte)
2656
8.0xf0+4.0x9,2.DM1,2.AN0:D0:::bclr
2657
"bclr"
2658
*mn10300
2659
 
2660
*am33
2661
*am33_2
2662
 
2663
{
2664
  /* OP_F090 (); */
2665
  unsigned32 temp;
2666
  int z;
2667
 
2668
  PC = cia;
2669
  temp = load_byte (State.regs[REG_A0 + AN0]);
2670
  z = (temp & State.regs[REG_D0 + DM1]) == 0;
2671
  temp = temp & ~State.regs[REG_D0 + DM1];
2672
  store_byte (State.regs[REG_A0 + AN0], temp);
2673
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2674
  PSW |= (z ? PSW_Z : 0);
2675
}
2676
 
2677
 
2678
// 1111 1110 0000 0001 abs32... imm8....;
2679
// bclr imm8,(abs32) (imm8 is zero-extended., processing unit: byte)
2680
8.0xfe+8.0x01+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D+8.IMM8:D5:::bclr
2681
"bclr"
2682
*mn10300
2683
 
2684
*am33
2685
*am33_2
2686
 
2687
{
2688
  /* OP_FE010000 (); */
2689
  unsigned32 temp;
2690
  int z;
2691
 
2692
  PC = cia;
2693
  temp = load_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
2694
  z = (temp & IMM8) == 0;
2695
  temp = temp & ~(IMM8);
2696
  store_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), temp);
2697
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2698
  PSW |= (z ? PSW_Z : 0);
2699
}
2700
 
2701
 
2702
// 1111 1010 1111 01An d8...... imm8....;
2703
// bclr imm8,(d8,An) (d8 is sign-extended, imm8 is zero-extended., processing unit: byte)
2704
8.0xfa+4.0xf,01,2.AN0+8.D8+8.IMM8:D2:::bclr
2705
"bclr"
2706
*mn10300
2707
 
2708
*am33
2709
*am33_2
2710
 
2711
{
2712
  /* OP_FAF40000 (); */
2713
  unsigned32 temp;
2714
  int z;
2715
 
2716
  PC = cia;
2717
  temp = load_byte ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)));
2718
  z = (temp & (IMM8)) == 0;
2719
  temp = temp & ~(IMM8);
2720
  store_byte ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)), temp);
2721
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2722
  PSW |= (z ? PSW_Z : 0);
2723
}
2724
 
2725
 
2726
// 1111 0010 1011 DmDn; asr Dm,Dn
2727
8.0xf2+4.0xb,2.DM1,2.DN0:D0:::asr
2728
"asr"
2729
*mn10300
2730
 
2731
*am33
2732
*am33_2
2733
 
2734
{
2735
  /* OP_F2B0 (); */
2736
  signed32 temp;
2737
  int z, n, c;
2738
 
2739
  PC = cia;
2740
  temp = State.regs[REG_D0 + DN0];
2741
  c = temp & 1;
2742
  temp >>= State.regs[REG_D0 + DM1];
2743
  State.regs[REG_D0 + DN0] = temp;
2744
  z = (State.regs[REG_D0 + DN0] == 0);
2745
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2746
  PSW &= ~(PSW_Z | PSW_N | PSW_C);
2747
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2748
}
2749
 
2750
 
2751
// 1111 1000 1100 10Dn imm8...; asr imm8,Dn (imm8 is zero-extended.)
2752
8.0xf8+4.0xc,10,2.DN0+8.IMM8:D1:::asr
2753
"asr"
2754
*mn10300
2755
 
2756
*am33
2757
*am33_2
2758
 
2759
{
2760
  /* OP_F8C800 (); */
2761
  signed32 temp;
2762
  int z, n, c;
2763
 
2764
  PC = cia;
2765
  temp = State.regs[REG_D0 + DN0];
2766
  c = temp & 1;
2767
  temp >>= IMM8;
2768
  State.regs[REG_D0 + DN0] = temp;
2769
  z = (State.regs[REG_D0 + DN0] == 0);
2770
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2771
  PSW &= ~(PSW_Z | PSW_N | PSW_C);
2772
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2773
}
2774
 
2775
 
2776
// 1111 0010 1010 DmDn; lsr Dm,Dn
2777
8.0xf2+4.0xa,2.DM1,2.DN0:D0:::lsr
2778
"lsr"
2779
*mn10300
2780
 
2781
*am33
2782
*am33_2
2783
 
2784
{
2785
  /* OP_F2A0 (); */
2786
  int z, n, c;
2787
 
2788
  PC = cia;
2789
  c = State.regs[REG_D0 + DN0] & 1;
2790
  State.regs[REG_D0 + DN0]
2791
    >>= State.regs[REG_D0 + DM1];
2792
  z = (State.regs[REG_D0 + DN0] == 0);
2793
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2794
  PSW &= ~(PSW_Z | PSW_N | PSW_C);
2795
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2796
}
2797
 
2798
 
2799
// 1111 1000 1100 01Dn imm8...; lsr imm8,Dn (imm8 is zero-extended.)
2800
8.0xf8+4.0xc,01,2.DN0+8.IMM8:D1:::lsr
2801
"lsr"
2802
*mn10300
2803
 
2804
*am33
2805
*am33_2
2806
 
2807
{
2808
  /* OP_F8C400 (); */
2809
  int z, n, c;
2810
 
2811
  PC = cia;
2812
  c = State.regs[REG_D0 + DN0] & 1;
2813
  State.regs[REG_D0 + DN0] >>=  IMM8;
2814
  z = (State.regs[REG_D0 + DN0] == 0);
2815
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2816
  PSW &= ~(PSW_Z | PSW_N | PSW_C);
2817
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2818
}
2819
 
2820
 
2821
// 1111 0010 1001 DmDn; asl Dm,Dn
2822
8.0xf2+4.0x9,2.DM1,2.DN0:D0:::asl
2823
"asl"
2824
*mn10300
2825
 
2826
*am33
2827
*am33_2
2828
 
2829
{
2830
  /* OP_F290 (); */
2831
  int n, z;
2832
 
2833
  PC = cia;
2834
  State.regs[REG_D0 + DN0]
2835
    <<= State.regs[REG_D0 + DM1];
2836
  z = (State.regs[REG_D0 + DN0] == 0);
2837
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2838
  PSW &= ~(PSW_Z | PSW_N);
2839
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2840
}
2841
 
2842
 
2843
// 1111 1000 1100 00Dn imm8...; asl imm8,Dn (imm8 is zero-extended.)
2844
8.0xf8+4.0xc,00,2.DN0+8.IMM8:D1:::asl
2845
"asl"
2846
*mn10300
2847
 
2848
*am33
2849
*am33_2
2850
 
2851
{
2852
  /* OP_F8C000 (); */
2853
  int n, z;
2854
 
2855
  PC = cia;
2856
  State.regs[REG_D0 + DN0] <<= IMM8;
2857
  z = (State.regs[REG_D0 + DN0] == 0);
2858
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2859
  PSW &= ~(PSW_Z | PSW_N);
2860
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2861
}
2862
 
2863
 
2864
// 0101 01Dn; als2 Dn
2865
4.0x5,01,2.DN0:S0:::asl2
2866
"asl2"
2867
*mn10300
2868
 
2869
*am33
2870
*am33_2
2871
 
2872
{
2873
  /* OP_54 (); */
2874
  int n, z;
2875
  PC = cia;
2876
 
2877
  State.regs[REG_D0 + DN0] <<= 2;
2878
  z = (State.regs[REG_D0 + DN0] == 0);
2879
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2880
  PSW &= ~(PSW_Z | PSW_N);
2881
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2882
}
2883
 
2884
 
2885
// 1111 0010 1000 01Dn; ror Dn
2886
8.0xf2+4.0x8,01,2.DN0:D0:::ror
2887
"ror"
2888
*mn10300
2889
 
2890
*am33
2891
*am33_2
2892
 
2893
{
2894
  /* OP_F284 (); */
2895
  unsigned32 value;
2896
  int c,n,z;
2897
 
2898
  PC = cia;
2899
  value = State.regs[REG_D0 + DN0];
2900
  c = (value & 0x1);
2901
 
2902
  value >>= 1;
2903
  value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
2904
  State.regs[REG_D0 + DN0] = value;
2905
  z = (value == 0);
2906
  n = (value & 0x80000000) != 0;
2907
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2908
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2909
}
2910
 
2911
 
2912
// 1111 0010 1000 00Dn; rol Dn
2913
8.0xf2+4.0x8,00,2.DN0:D0:::rol
2914
"rol"
2915
*mn10300
2916
 
2917
*am33
2918
*am33_2
2919
 
2920
{
2921
  /* OP_F280 (); */
2922
  unsigned32 value;
2923
  int c,n,z;
2924
 
2925
  PC = cia;
2926
  value = State.regs[REG_D0 + DN0];
2927
  c = (value & 0x80000000) ? 1 : 0;
2928
 
2929
  value <<= 1;
2930
  value |= ((PSW & PSW_C) != 0);
2931
  State.regs[REG_D0 + DN0] = value;
2932
  z = (value == 0);
2933
  n = (value & 0x80000000) != 0;
2934
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2935
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2936
}
2937
 
2938
 
2939
// 1100 1000 d8......; beq (d8,PC) (d8 is sign-extended)
2940
8.0xc8+8.D8:S1:::beq
2941
"beq"
2942
*mn10300
2943
 
2944
*am33
2945
*am33_2
2946
 
2947
{
2948
  /* OP_C800 (); */
2949
  PC = cia;
2950
  if ((PSW & PSW_Z))
2951
    {
2952
      State.regs[REG_PC] += EXTEND8 (D8);
2953
      nia = PC;
2954
    }
2955
}
2956
 
2957
 
2958
// 1100 1001 d8......; bne (d8,PC) (d8 is sign-extended)
2959
8.0xc9+8.D8:S1:::bne
2960
"bne"
2961
*mn10300
2962
 
2963
*am33
2964
*am33_2
2965
 
2966
{
2967
  /* OP_C900 (); */
2968
  PC = cia;
2969
  if (!(PSW & PSW_Z))
2970
    {
2971
      State.regs[REG_PC] += EXTEND8 (D8);
2972
      nia = PC;
2973
    }
2974
}
2975
 
2976
 
2977
// 1100 0001 d8......; bgt (d8,PC) (d8 is sign-extended)
2978
8.0xc1+8.D8:S1:::bgt
2979
"bgt"
2980
*mn10300
2981
 
2982
*am33
2983
*am33_2
2984
 
2985
{
2986
  /* OP_C100 (); */
2987
  PC = cia;
2988
  if (!((PSW & PSW_Z)
2989
        || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
2990
    {
2991
      State.regs[REG_PC] += EXTEND8 (D8);
2992
      nia = PC;
2993
    }
2994
}
2995
 
2996
 
2997
// 1100 0010 d8......; bge (d8,PC) (d8 is sign-extended)
2998
8.0xc2+8.D8:S1:::bge
2999
"bge"
3000
*mn10300
3001
 
3002
*am33
3003
*am33_2
3004
 
3005
{
3006
  /* OP_C200 (); */
3007
  PC = cia;
3008
  if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
3009
    {
3010
      State.regs[REG_PC] += EXTEND8 (D8);
3011
      nia = PC;
3012
    }
3013
}
3014
 
3015
 
3016
// 1100 0011 d8......; ble (d8,PC) (d8 is sign-extended)
3017
8.0xc3+8.D8:S1:::ble
3018
"ble"
3019
*mn10300
3020
 
3021
*am33
3022
*am33_2
3023
 
3024
{
3025
  /* OP_C300 (); */
3026
  PC = cia;
3027
  if ((PSW & PSW_Z)
3028
      || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
3029
    {
3030
      State.regs[REG_PC] += EXTEND8 (D8);
3031
      nia = PC;
3032
    }
3033
}
3034
 
3035
 
3036
// 1100 0000 d8......; blt (d8,PC) (d8 is sign-extended)
3037
8.0xc0+8.D8:S1:::blt
3038
"blt"
3039
*mn10300
3040
 
3041
*am33
3042
*am33_2
3043
 
3044
{
3045
  /* OP_C000 (); */
3046
  PC = cia;
3047
  if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
3048
    {
3049
      State.regs[REG_PC] += EXTEND8 (D8);
3050
      nia = PC;
3051
    }
3052
}
3053
 
3054
 
3055
// 1100 0101 d8......; bhi (d8,PC) (d8 is sign-extended)
3056
8.0xc5+8.D8:S1:::bhi
3057
"bhi"
3058
*mn10300
3059
 
3060
*am33
3061
*am33_2
3062
 
3063
{
3064
  /* OP_C500 (); */
3065
  PC = cia;
3066
  if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
3067
    {
3068
      State.regs[REG_PC] += EXTEND8 (D8);
3069
      nia = PC;
3070
    }
3071
}
3072
 
3073
 
3074
// 1100 0110 d8......; bcc (d8,PC) (d8 is sign-extended)
3075
8.0xc6+8.D8:S1:::bcc
3076
"bcc"
3077
*mn10300
3078
 
3079
*am33
3080
*am33_2
3081
 
3082
{
3083
  /* OP_C600 (); */
3084
  PC = cia;
3085
  if (!(PSW & PSW_C))
3086
    {
3087
      State.regs[REG_PC] += EXTEND8 (D8);
3088
      nia = PC;
3089
    }
3090
}
3091
 
3092
 
3093
// 1100 0101 d8......; bls (d8,PC) (d8 is sign-extended)
3094
8.0xc7+8.D8:S1:::bls
3095
"bls"
3096
*mn10300
3097
 
3098
*am33
3099
*am33_2
3100
 
3101
{
3102
  /* OP_C700 (); */
3103
  PC = cia;
3104
  if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
3105
    {
3106
      State.regs[REG_PC] += EXTEND8 (D8);
3107
      nia = PC;
3108
    }
3109
}
3110
 
3111
 
3112
// 1100 0100 d8......; bcs (d8,PC) (d8 is sign-extended)
3113
8.0xc4+8.D8:S1:::bcs
3114
"bcs"
3115
*mn10300
3116
 
3117
*am33
3118
*am33_2
3119
 
3120
{
3121
  /* OP_C400 (); */
3122
  PC = cia;
3123
  if (PSW & PSW_C)
3124
    {
3125
      State.regs[REG_PC] += EXTEND8 (D8);
3126
      nia = PC;
3127
    }
3128
}
3129
 
3130
 
3131
// 1111 1000 1110 1000 d8......; bvc (d8,PC) (d8 is sign-extended)
3132
8.0xf8+8.0xe8+8.D8:D1:::bvc
3133
"bvc"
3134
*mn10300
3135
 
3136
*am33
3137
*am33_2
3138
 
3139
{
3140
  /* OP_F8E800 (); */
3141
  PC = cia;
3142
  if (!(PSW & PSW_V))
3143
    {
3144
      State.regs[REG_PC] += EXTEND8 (D8);
3145
      nia = PC;
3146
    }
3147
}
3148
 
3149
 
3150
// 1111 1000 1110 1001 d8......; bvs (d8,PC) (d8 is sign-extended)
3151
8.0xf8+8.0xe9+8.D8:D1:::bvs
3152
"bvs"
3153
*mn10300
3154
 
3155
*am33
3156
*am33_2
3157
 
3158
{
3159
  /* OP_F8E900 (); */
3160
  PC = cia;
3161
  if (PSW & PSW_V)
3162
    {
3163
      State.regs[REG_PC] += EXTEND8 (D8);
3164
      nia = PC;
3165
    }
3166
}
3167
 
3168
 
3169
// 1111 1000 1110 1010 d8......; bnc (d8,PC) (d8 is sign-extended)
3170
8.0xf8+8.0xea+8.D8:D1:::bnc
3171
"bnc"
3172
*mn10300
3173
 
3174
*am33
3175
*am33_2
3176
 
3177
{
3178
  /* OP_F8EA00 (); */
3179
  PC = cia;
3180
  if (!(PSW & PSW_N))
3181
    {
3182
      State.regs[REG_PC] += EXTEND8 (D8);
3183
      nia = PC;
3184
    }
3185
}
3186
 
3187
 
3188
// 1111 1000 1110 1010 d8......; bns (d8,PC) (d8 is sign-extended)
3189
8.0xf8+8.0xeb+8.D8:D1:::bns
3190
"bns"
3191
*mn10300
3192
 
3193
*am33
3194
*am33_2
3195
 
3196
{
3197
  /* OP_F8EB00 (); */
3198
  PC = cia;
3199
  if (PSW & PSW_N)
3200
    {
3201
      State.regs[REG_PC] += EXTEND8 (D8);
3202
      nia = PC;
3203
    }
3204
}
3205
 
3206
 
3207
// 1100 1010 d8......; bra (d8,PC) (d8 is sign-extended)
3208
8.0xca+8.D8:S1:::bra
3209
"bra"
3210
*mn10300
3211
 
3212
*am33
3213
*am33_2
3214
 
3215
{
3216
  /* OP_CA00 (); */
3217
  PC = cia;
3218
  State.regs[REG_PC] += EXTEND8 (D8);
3219
  nia = PC;
3220
}
3221
 
3222
 
3223
// 1101 1000; leq
3224
8.0xd8:S0:::leq
3225
"leq"
3226
*mn10300
3227
 
3228
*am33
3229
*am33_2
3230
 
3231
{
3232
  /* OP_D8 (); */
3233
  PC = cia;
3234
  if (PSW & PSW_Z)
3235
    {
3236
      State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3237
      nia = PC;
3238
    }
3239
}
3240
 
3241
 
3242
// 1101 1001; lne
3243
8.0xd9:S0:::lne
3244
"lne"
3245
*mn10300
3246
 
3247
*am33
3248
*am33_2
3249
 
3250
{
3251
  /* OP_D9 (); */
3252
  PC = cia;
3253
  if (!(PSW & PSW_Z))
3254
    {
3255
      State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3256
      nia = PC;
3257
    }
3258
}
3259
 
3260
 
3261
// 1101 0001; lgt
3262
8.0xd1:S0:::lgt
3263
"lgt"
3264
*mn10300
3265
 
3266
*am33
3267
*am33_2
3268
 
3269
{
3270
  /* OP_D1 (); */
3271
  PC = cia;
3272
  if (!((PSW & PSW_Z)
3273
        || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
3274
    {
3275
      State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3276
      nia = PC;
3277
    }
3278
}
3279
 
3280
 
3281
// 1101 0010; lge
3282
8.0xd2:S0:::lge
3283
"lge"
3284
*mn10300
3285
 
3286
*am33
3287
*am33_2
3288
 
3289
{
3290
  /* OP_D2 (); */
3291
  PC = cia;
3292
  if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
3293
    {
3294
      State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3295
      nia = PC;
3296
    }
3297
}
3298
 
3299
 
3300
// 1101 0011; lle
3301
8.0xd3:S0:::lle
3302
"lle"
3303
*mn10300
3304
 
3305
*am33
3306
*am33_2
3307
 
3308
{
3309
  /* OP_D3 (); */
3310
  PC = cia;
3311
  if ((PSW & PSW_Z)
3312
      || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
3313
    {
3314
      State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3315
      nia = PC;
3316
    }
3317
}
3318
 
3319
 
3320
// 1101 0000; llt
3321
8.0xd0:S0:::llt
3322
"llt"
3323
*mn10300
3324
 
3325
*am33
3326
*am33_2
3327
 
3328
{
3329
  /* OP_D0 (); */
3330
  PC = cia;
3331
  if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
3332
    {
3333
      State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3334
      nia = PC;
3335
    }
3336
}
3337
 
3338
 
3339
// 1101 0101; lhi
3340
8.0xd5:S0:::lhi
3341
"lhi"
3342
*mn10300
3343
 
3344
*am33
3345
*am33_2
3346
 
3347
{
3348
  /* OP_D5 (); */
3349
  PC = cia;
3350
  if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
3351
    {
3352
      State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3353
      nia = PC;
3354
    }
3355
}
3356
 
3357
 
3358
// 1101 0110; lcc
3359
8.0xd6:S0:::lcc
3360
"lcc"
3361
*mn10300
3362
 
3363
*am33
3364
*am33_2
3365
 
3366
{
3367
  /* OP_D6 (); */
3368
  PC = cia;
3369
  if (!(PSW & PSW_C))
3370
    {
3371
      State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3372
      nia = PC;
3373
    }
3374
}
3375
 
3376
 
3377
// 1101 0111; lls
3378
8.0xd7:S0:::lls
3379
"lls"
3380
*mn10300
3381
 
3382
*am33
3383
*am33_2
3384
 
3385
{
3386
  /* OP_D7 (); */
3387
  PC = cia;
3388
  if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
3389
    {
3390
      State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3391
      nia = PC;
3392
    }
3393
}
3394
 
3395
 
3396
// 1101 0100; lcs
3397
8.0xd4:S0:::lcs
3398
"lcs"
3399
*mn10300
3400
 
3401
*am33
3402
*am33_2
3403
 
3404
{
3405
  /* OP_D4 (); */
3406
  PC = cia;
3407
  if (PSW & PSW_C)
3408
    {
3409
      State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3410
      nia = PC;
3411
    }
3412
}
3413
 
3414
 
3415
// 1101 1010; lra
3416
8.0xda:S0:::lra
3417
"lra"
3418
*mn10300
3419
 
3420
*am33
3421
*am33_2
3422
 
3423
{
3424
  /* OP_DA (); */
3425
  PC = cia;
3426
  State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3427
  nia = PC;
3428
}
3429
 
3430
 
3431
// 1101 1010; setlb
3432
8.0xdb:S0:::setlb
3433
"setlb"
3434
*mn10300
3435
 
3436
*am33
3437
*am33_2
3438
 
3439
{
3440
  /* OP_DB (); */
3441
  PC = cia;
3442
  State.regs[REG_LIR] = load_word (State.regs[REG_PC] + 1);
3443
  State.regs[REG_LAR] = State.regs[REG_PC] + 5;
3444
}
3445
 
3446
 
3447
// 1111 0000 1111 01An; jmp (An)
3448
8.0xf0+4.0xf,01,2.AN0:D0:::jmp
3449
"jmp"
3450
*mn10300
3451
 
3452
*am33
3453
*am33_2
3454
 
3455
{
3456
  /* OP_F0F4 (); */
3457
  PC = State.regs[REG_A0 + AN0];
3458
  nia = PC;
3459
}
3460
 
3461
 
3462
// 1100 1100 d16.....; jmp (d16,PC) (d16 is sign-extended.)
3463
8.0xcc+8.D16A+8.D16B:S2:::jmp
3464
"jmp"
3465
*mn10300
3466
 
3467
*am33
3468
*am33_2
3469
 
3470
{
3471
  /* OP_CC0000 (); */
3472
  PC = cia + EXTEND16(FETCH16(D16A, D16B));
3473
  nia = PC;
3474
}
3475
 
3476
 
3477
// 1101 1100 d32........; jmp (d32, PC)
3478
8.0xdc+8.D32A+8.D32B+8.D32C+8.D32D:S4:::jmp
3479
"jmp"
3480
*mn10300
3481
 
3482
*am33
3483
*am33_2
3484
 
3485
{
3486
  /* OP_DC000000 (); */
3487
  PC = cia + FETCH32(D32A, D32B, D32C, D32D);
3488
  nia = PC;
3489
}
3490
 
3491
 
3492
// 1111 0000 1111 00An; calls (An)
3493
8.0xf0+4.0xf,00,2.AN0:D0:::calls
3494
"calls"
3495
*mn10300
3496
 
3497
*am33
3498
*am33_2
3499
 
3500
{
3501
  /* OP_F0F0 (); */
3502
  unsigned32 next_pc, sp;
3503
 
3504
  PC = cia;
3505
  sp = State.regs[REG_SP];
3506
  next_pc = State.regs[REG_PC] + 2;
3507
  store_word(sp, next_pc);
3508
  State.regs[REG_MDR] = next_pc;
3509
  State.regs[REG_PC] = State.regs[REG_A0 + AN0];
3510
  nia = PC;
3511
}
3512
 
3513
 
3514
// 1111 1010 1111 1111 d16.....; calls (d16,PC) (d16 is sign-extended.)
3515
8.0xfa+8.0xff+8.D16A+8.D16B:D2:::calls
3516
"calls"
3517
*mn10300
3518
 
3519
*am33
3520
*am33_2
3521
 
3522
{
3523
  /* OP_FAFF0000 (); */
3524
  unsigned32 next_pc, sp;
3525
 
3526
  PC = cia;
3527
  sp = State.regs[REG_SP];
3528
  next_pc = State.regs[REG_PC] + 4;
3529
  store_word(sp, next_pc);
3530
  State.regs[REG_MDR] = next_pc;
3531
  State.regs[REG_PC] += EXTEND16 (FETCH16(D16A, D16B));
3532
  nia = PC;
3533
}
3534
 
3535
 
3536
// 1111 1100 1111 1111 d32.....; calls (d32,PC)
3537
8.0xfc+8.0xff+8.D32A+8.D32B+8.D32C+8.D32D:D4:::calls
3538
"calls"
3539
*mn10300
3540
 
3541
*am33
3542
*am33_2
3543
 
3544
{
3545
  /* OP_FCFF0000 (); */
3546
  unsigned32 next_pc, sp;
3547
 
3548
  PC = cia;
3549
  sp = State.regs[REG_SP];
3550
  next_pc = State.regs[REG_PC] + 6;
3551
  store_word(sp, next_pc);
3552
  State.regs[REG_MDR] = next_pc;
3553
  State.regs[REG_PC] += FETCH32(D32A, D32B, D32C, D32D);
3554
  nia = PC;
3555
}
3556
 
3557
 
3558
// 1111 0000 1111 1100; rets
3559
8.0xf0+8.0xfc:D0:::rets
3560
"rets"
3561
*mn10300
3562
 
3563
*am33
3564
*am33_2
3565
 
3566
{
3567
  /* OP_F0FC (); */
3568
  unsigned32 sp;
3569
 
3570
  sp = State.regs[REG_SP];
3571
  State.regs[REG_PC] = load_word(sp);
3572
  nia = PC;
3573
}
3574
 
3575
 
3576
// 1111 0000 1111 1101; rti
3577
8.0xf0+8.0xfd:D0:::rti
3578
"rti"
3579
*mn10300
3580
 
3581
*am33
3582
*am33_2
3583
 
3584
{
3585
  /* OP_F0FD (); */
3586
  unsigned32 sp;
3587
 
3588
  sp = State.regs[REG_SP];
3589
  PSW = load_half(sp);
3590
  State.regs[REG_PC] = load_word(sp+4);
3591
  State.regs[REG_SP] +=8;
3592
  nia = PC;
3593
}
3594
 
3595
 
3596
// 1111 0000 1111 1110; trap
3597
8.0xf0+8.0xfe:D0:::trap
3598
"trap"
3599
*mn10300
3600
 
3601
*am33
3602
*am33_2
3603
 
3604
{
3605
  /* OP_F0FE (); */
3606
  unsigned32 sp, next_pc;
3607
 
3608
  PC = cia;
3609
  sp = State.regs[REG_SP];
3610
  next_pc = State.regs[REG_PC] + 2;
3611
  store_word(sp, next_pc);
3612
  nia = PC;
3613
}
3614
 
3615
 
3616
// 1111 0000 1111 1111; rtm
3617
8.0xf0+8.0xff:D0:::rtm
3618
"rtm"
3619
*mn10300
3620
 
3621
*am33
3622
*am33_2
3623
 
3624
{
3625
  /* OP_F0FF (); */
3626
  PC = cia;
3627
  abort ();
3628
}
3629
 
3630
 
3631
// 1100 1011; nop
3632
8.0xcb:S0:::nop
3633
"nop"
3634
*mn10300
3635
 
3636
*am33
3637
*am33_2
3638
 
3639
{
3640
  /* OP_CB (); */
3641
  PC = cia;
3642
}
3643
 
3644
 
3645
// 1111 0101 0000  DmDn; udf20 Dm,Dn
3646
8.0xf5+4.0x0,2.DM1,2.DN0:D0:::putx
3647
"putx"
3648
*mn10300
3649
{
3650
  /* OP_F500 (); */
3651
  PC = cia;
3652
  State.regs[REG_MDRQ] = State.regs[REG_D0 + DN0];
3653
}
3654
 
3655
 
3656
// 1111 0110 1111 DmDn; udf15 Dm,Dn
3657
8.0xf6+4.0xf,2.DM1,2.DN0:D0:::getx
3658
"getx"
3659
*mn10300
3660
 
3661
*am33
3662
*am33_2
3663
 
3664
{
3665
  /* OP_F6F0 (); */
3666
  int z, n;
3667
 
3668
  PC = cia;
3669
  z = (State.regs[REG_MDRQ] == 0);
3670
  n = ((State.regs[REG_MDRQ] & 0x80000000) != 0);
3671
  State.regs[REG_D0 + DN0] = State.regs[REG_MDRQ];
3672
 
3673
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3674
  PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
3675
}
3676
 
3677
 
3678
// 1111 0110 0000 DmDn; udf00 Dm,Dn
3679
8.0xf6+4.0x0,2.DM1,2.DN0:D0:::mulq
3680
"mulq"
3681
*mn10300
3682
 
3683
*am33
3684
*am33_2
3685
 
3686
{
3687
  /* OP_F600 (); */
3688
  unsigned64 temp;
3689
  int n, z;
3690
 
3691
  PC = cia;
3692
  temp = ((signed64)(signed32)State.regs[REG_D0 + DN0]
3693
          *  (signed64)(signed32)State.regs[REG_D0 + DM1]);
3694
  State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3695
  State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3696
  z = (State.regs[REG_D0 + DN0] == 0);
3697
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3698
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3699
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3700
}
3701
 
3702
 
3703
// 1111 1001 0000 00Dn imm8....; udf00 imm8,Dn (imm8 is sign-extended.)
3704
8.0xf9+4.0x,00,2.DN0+8.IMM8:D1:::mulq
3705
"mulq"
3706
*mn10300
3707
 
3708
*am33
3709
*am33_2
3710
 
3711
{
3712
  /* OP_F90000 (); */
3713
  unsigned64 temp;
3714
  int n, z;
3715
 
3716
  PC = cia;
3717
  temp = ((signed64)(signed32)State.regs[REG_D0 + DN0]
3718
          * (signed64)(signed32)EXTEND8 (IMM8));
3719
  State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3720
  State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3721
  z = (State.regs[REG_D0 + DN0] == 0);
3722
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3723
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3724
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3725
}
3726
 
3727
 
3728
// 1111 1011 0000 00Dn imm16...; udf00 imm16,Dn (imm16 is sign-extended.)
3729
8.0xfb+4.0x0,00,2.DN0+8.IMM16A+8.IMM16B:D2:::mulq
3730
"mulq"
3731
*mn10300
3732
 
3733
*am33
3734
*am33_2
3735
 
3736
{
3737
  /* OP_FB000000 (); */
3738
  unsigned64 temp;
3739
  int n, z;
3740
 
3741
  PC = cia;
3742
  temp = ((signed64)(signed32)State.regs[REG_D0 + DN0]
3743
          * (signed64)(signed32)EXTEND16 (FETCH16(IMM16A, IMM16B)));
3744
  State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3745
  State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3746
  z = (State.regs[REG_D0 + DN0] == 0);
3747
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3748
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3749
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3750
}
3751
 
3752
 
3753
// 1111 1101 0000 00Dn imm32...; udf00 imm32,Dn
3754
8.0xfd+4.0x0,00,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::mulq
3755
"mulq"
3756
*mn10300
3757
 
3758
*am33
3759
*am33_2
3760
 
3761
{
3762
  /* OP_FD000000 (); */
3763
  unsigned64 temp;
3764
  int n, z;
3765
 
3766
  PC = cia;
3767
  temp = ((signed64)(signed32)State.regs[REG_D0 + DN0]
3768
          * (signed64)(signed32)(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
3769
  State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3770
  State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3771
  z = (State.regs[REG_D0 + DN0] == 0);
3772
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3773
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3774
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3775
}
3776
 
3777
 
3778
// 1111 0110 0001 DmDn; udf01 Dm,Dn
3779
8.0xf6+4.0x1,2.DM1,2.DN0:D0:::mulqu
3780
"mulqu"
3781
*mn10300
3782
 
3783
*am33
3784
*am33_2
3785
 
3786
{
3787
  /* OP_F610 (); */
3788
  unsigned64 temp;
3789
  int n, z;
3790
 
3791
  PC = cia;
3792
  temp = ((unsigned64) State.regs[REG_D0 + DN0]
3793
          * (unsigned64) State.regs[REG_D0 + DM1]);
3794
  State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3795
  State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3796
  z = (State.regs[REG_D0 + DN0] == 0);
3797
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3798
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3799
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3800
}
3801
 
3802
 
3803
// 1111 1001 0001 01Dn imm8....; udfu01 imm8,Dn (imm8 is zero-extended.)
3804
8.0xf9+4.0x1,01,2.DN0+8.IMM8:D1:::mulqu
3805
"mulqu"
3806
*mn10300
3807
 
3808
*am33
3809
*am33_2
3810
 
3811
{
3812
  /* OP_F91400 (); */
3813
  unsigned64 temp;
3814
  int n, z;
3815
 
3816
  PC = cia;
3817
  temp = ((unsigned64)State.regs[REG_D0 + DN0]
3818
          * (unsigned64)EXTEND8 (IMM8));
3819
  State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3820
  State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3821
  z = (State.regs[REG_D0 + DN0] == 0);
3822
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3823
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3824
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3825
}
3826
 
3827
 
3828
// 1111 1011 0001 01Dn imm16...; udfu01 imm16,Dn (imm16 is zero-extended.)
3829
8.0xfb+4.0x1,01,2.DN0+8.IMM16A+8.IMM16B:D2:::mulqu
3830
"mulqu"
3831
*mn10300
3832
 
3833
*am33
3834
*am33_2
3835
 
3836
{
3837
  /* OP_FB140000 (); */
3838
  unsigned64 temp;
3839
  int n, z;
3840
 
3841
  PC = cia;
3842
  temp = ((unsigned64)State.regs[REG_D0 + DN0]
3843
          * (unsigned64) EXTEND16 (FETCH16(IMM16A, IMM16B)));
3844
  State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3845
  State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3846
  z = (State.regs[REG_D0 + DN0] == 0);
3847
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3848
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3849
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3850
}
3851
 
3852
 
3853
// 1111 1101 0001 01Dn imm32...; udfu01 imm32,Dn
3854
8.0xfd+4.0x1,01,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::mulqu
3855
"mulqu"
3856
*mn10300
3857
 
3858
*am33
3859
*am33_2
3860
 
3861
{
3862
  /* OP_FD140000 (); */
3863
  unsigned64 temp;
3864
  int n, z;
3865
 
3866
  PC = cia;
3867
  temp = ((unsigned64)State.regs[REG_D0 + DN0]
3868
          * (unsigned64)(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
3869
  State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3870
  State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3871
  z = (State.regs[REG_D0 + DN0] == 0);
3872
  n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3873
  PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3874
  PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3875
}
3876
 
3877
 
3878
// 1111 0110 0100 DmDn; udf04 Dm,Dn
3879
8.0xf6+4.0x4,2.DM1,2.DN0:D0:::sat16
3880
"sat16"
3881
*mn10300
3882
 
3883
*am33
3884
*am33_2
3885
 
3886
{
3887
  /* OP_F640 (); */
3888
  int temp;
3889
 
3890
  PC = cia;
3891
  temp = State.regs[REG_D0 + DM1];
3892
  temp = (temp > 0x7fff ? 0x7fff : temp);
3893
  temp = (temp < -0x8000 ? -0x8000 : temp);
3894
  State.regs[REG_D0 + DN0] = temp;
3895
}
3896
 
3897
 
3898
// 1111 0110 0101 DmDn; udf05 Dm,Dn
3899
8.0xf6+4.0x5,2.DM1,2.DN0:D0:::sat24
3900
"sat24"
3901
*mn10300
3902
 
3903
*am33
3904
*am33_2
3905
 
3906
{
3907
  /* OP_F650 (); */
3908
  int temp;
3909
 
3910
  PC = cia;
3911
  temp = State.regs[REG_D0 + DM1];
3912
  temp = (temp > 0x7fffff ? 0x7fffff : temp);
3913
  temp = (temp < -0x800000 ? -0x800000 : temp);
3914
  State.regs[REG_D0 + DN0] = temp;
3915
}
3916
 
3917
 
3918
// 1111 0110 0111 DmDn; udf07 Dm,Dn
3919
8.0xf6+4.0x7,2.DM1,2.DN0:D0:::bsch
3920
"bsch"
3921
*mn10300
3922
 
3923
*am33
3924
*am33_2
3925
 
3926
{
3927
  /* OP_F670 (); */
3928
  int temp, c;
3929
 
3930
  PC = cia;
3931
  temp = State.regs[REG_D0 + DM1];
3932
  temp <<= (State.regs[REG_D0 + DN0] & 0x1f);
3933
  c = (temp != 0 ? 1 : 0);
3934
  PSW &= ~(PSW_C);
3935
  PSW |= (c ? PSW_C : 0);
3936
}
3937
 
3938
 
3939
// 1111 0000 1100 0000; syscall
3940
8.0xf0+8.0xc0:D0:::syscall
3941
"syscall"
3942
*mn10300
3943
 
3944
*am33
3945
*am33_2
3946
 
3947
{
3948
  /* OP_F0C0 (); */
3949
  PC = cia;
3950
  do_syscall ();
3951
}
3952
 
3953
 
3954
// 1111 1111; break
3955
8.0xff:S0:::break
3956
"break"
3957
*mn10300
3958
 
3959
*am33
3960
*am33_2
3961
 
3962
{
3963
  /* OP_FF (); */
3964
  PC = cia;
3965
  program_interrupt(SD, CPU, cia, SIM_SIGTRAP);
3966
}
3967
 
3968
// 1100 1110 regs....; movm (SP),regs
3969
8.0xce+8.REGS:S1:::movm
3970
"movm"
3971
*mn10300
3972
 
3973
*am33
3974
*am33_2
3975
 
3976
{
3977
  /* OP_CE00 (); */
3978
  unsigned32 sp = State.regs[REG_SP];
3979
  unsigned32 mask;
3980
 
3981
  PC = cia;
3982
  mask = REGS;
3983
 
3984
  if (mask & 0x8)
3985
    {
3986
      sp += 4;
3987
      State.regs[REG_LAR] = load_word (sp);
3988
      sp += 4;
3989
      State.regs[REG_LIR] = load_word (sp);
3990
      sp += 4;
3991
      State.regs[REG_MDR] = load_word (sp);
3992
      sp += 4;
3993
      State.regs[REG_A0 + 1] = load_word (sp);
3994
      sp += 4;
3995
      State.regs[REG_A0] = load_word (sp);
3996
      sp += 4;
3997
      State.regs[REG_D0 + 1] = load_word (sp);
3998
      sp += 4;
3999
      State.regs[REG_D0] = load_word (sp);
4000
      sp += 4;
4001
    }
4002
 
4003
  if (mask & 0x10)
4004
    {
4005
      State.regs[REG_A0 + 3] = load_word (sp);
4006
      sp += 4;
4007
    }
4008
 
4009
  if (mask & 0x20)
4010
    {
4011
      State.regs[REG_A0 + 2] = load_word (sp);
4012
      sp += 4;
4013
    }
4014
 
4015
  if (mask & 0x40)
4016
    {
4017
      State.regs[REG_D0 + 3] = load_word (sp);
4018
      sp += 4;
4019
    }
4020
 
4021
  if (mask & 0x80)
4022
    {
4023
      State.regs[REG_D0 + 2] = load_word (sp);
4024
      sp += 4;
4025
    }
4026
 
4027
  if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
4028
      || STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33_2
4029
      )
4030
    {
4031
      if (mask & 0x1)
4032
        {
4033
          /* Need to restore MDRQ, MCRH, MCRL, and MCVF */
4034
          sp += 16;
4035
          State.regs[REG_E0 + 1] = load_word (sp);
4036
          sp += 4;
4037
          State.regs[REG_E0 + 0] = load_word (sp);
4038
          sp += 4;
4039
        }
4040
 
4041
      if (mask & 0x2)
4042
        {
4043
          State.regs[REG_E0 + 7] = load_word (sp);
4044
          sp += 4;
4045
          State.regs[REG_E0 + 6] = load_word (sp);
4046
          sp += 4;
4047
          State.regs[REG_E0 + 5] = load_word (sp);
4048
          sp += 4;
4049
          State.regs[REG_E0 + 4] = load_word (sp);
4050
          sp += 4;
4051
        }
4052
 
4053
      if (mask & 0x4)
4054
        {
4055
          State.regs[REG_E0 + 3] = load_word (sp);
4056
          sp += 4;
4057
          State.regs[REG_E0 + 2] = load_word (sp);
4058
          sp += 4;
4059
        }
4060
    }
4061
 
4062
  /* And make sure to update the stack pointer.  */
4063
  State.regs[REG_SP] = sp;
4064
}
4065
 
4066
 
4067
// 1100 1111 regs....; movm regs,(SP)
4068
8.0xcf+8.REGS:S1a:::movm
4069
"movm"
4070
*mn10300
4071
 
4072
*am33
4073
*am33_2
4074
 
4075
{
4076
  /* OP_CF00 (); */
4077
  unsigned32 sp = State.regs[REG_SP];
4078
  unsigned32 mask;
4079
 
4080
  PC = cia;
4081
  mask = REGS;
4082
 
4083
  if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
4084
      || STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33_2
4085
      )
4086
    {
4087
      if (mask & 0x4)
4088
        {
4089
          sp -= 4;
4090
          store_word (sp, State.regs[REG_E0 + 2]);
4091
          sp -= 4;
4092
          store_word (sp, State.regs[REG_E0 + 3]);
4093
        }
4094
 
4095
      if (mask & 0x2)
4096
        {
4097
          sp -= 4;
4098
          store_word (sp, State.regs[REG_E0 + 4]);
4099
          sp -= 4;
4100
          store_word (sp, State.regs[REG_E0 + 5]);
4101
          sp -= 4;
4102
          store_word (sp, State.regs[REG_E0 + 6]);
4103
          sp -= 4;
4104
          store_word (sp, State.regs[REG_E0 + 7]);
4105
        }
4106
 
4107
      if (mask & 0x1)
4108
        {
4109
          sp -= 4;
4110
          store_word (sp, State.regs[REG_E0 + 0]);
4111
          sp -= 4;
4112
          store_word (sp, State.regs[REG_E0 + 1]);
4113
          sp -= 16;
4114
          /* Need to save MDRQ, MCRH, MCRL, and MCVF */
4115
        }
4116
    }
4117
 
4118
  if (mask & 0x80)
4119
    {
4120
      sp -= 4;
4121
      store_word (sp, State.regs[REG_D0 + 2]);
4122
    }
4123
 
4124
  if (mask & 0x40)
4125
    {
4126
      sp -= 4;
4127
      store_word (sp, State.regs[REG_D0 + 3]);
4128
    }
4129
 
4130
  if (mask & 0x20)
4131
    {
4132
      sp -= 4;
4133
      store_word (sp, State.regs[REG_A0 + 2]);
4134
    }
4135
 
4136
  if (mask & 0x10)
4137
    {
4138
      sp -= 4;
4139
      store_word (sp, State.regs[REG_A0 + 3]);
4140
    }
4141
 
4142
  if (mask & 0x8)
4143
    {
4144
      sp -= 4;
4145
      store_word (sp, State.regs[REG_D0]);
4146
      sp -= 4;
4147
      store_word (sp, State.regs[REG_D0 + 1]);
4148
      sp -= 4;
4149
      store_word (sp, State.regs[REG_A0]);
4150
      sp -= 4;
4151
      store_word (sp, State.regs[REG_A0 + 1]);
4152
      sp -= 4;
4153
      store_word (sp, State.regs[REG_MDR]);
4154
      sp -= 4;
4155
      store_word (sp, State.regs[REG_LIR]);
4156
      sp -= 4;
4157
      store_word (sp, State.regs[REG_LAR]);
4158
      sp -= 4;
4159
    }
4160
 
4161
  /* And make sure to update the stack pointer.  */
4162
  State.regs[REG_SP] = sp;
4163
}
4164
 
4165
// 1100 1101 d16..... regs.... imm8....;
4166
// call (d16,PC),regs,imm8 (d16 is sign-extended., imm8 is zero-extended.)
4167
8.0xcd+8.D16A+8.D16B+8.REGS+8.IMM8:S4:::call
4168
"call"
4169
*mn10300
4170
 
4171
*am33
4172
*am33_2
4173
 
4174
{
4175
  /* OP_CD000000 (); */
4176
  unsigned32 next_pc, sp;
4177
  unsigned32 mask;
4178
 
4179
  PC = cia;
4180
  sp = State.regs[REG_SP];
4181
  next_pc = PC + 5;
4182
  store_word(sp, next_pc);
4183
 
4184
  mask = REGS;
4185
 
4186
  if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
4187
      || STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33_2
4188
      )
4189
    {
4190
      if (mask & 0x4)
4191
        {
4192
          sp -= 4;
4193
          store_word (sp, State.regs[REG_E0 + 2]);
4194
          sp -= 4;
4195
          store_word (sp, State.regs[REG_E0 + 3]);
4196
        }
4197
 
4198
      if (mask & 0x2)
4199
        {
4200
          sp -= 4;
4201
          store_word (sp, State.regs[REG_E0 + 4]);
4202
          sp -= 4;
4203
          store_word (sp, State.regs[REG_E0 + 5]);
4204
          sp -= 4;
4205
          store_word (sp, State.regs[REG_E0 + 6]);
4206
          sp -= 4;
4207
          store_word (sp, State.regs[REG_E0 + 7]);
4208
        }
4209
 
4210
      if (mask & 0x1)
4211
        {
4212
          sp -= 4;
4213
          store_word (sp, State.regs[REG_E0 + 0]);
4214
          sp -= 4;
4215
          store_word (sp, State.regs[REG_E0 + 1]);
4216
          sp -= 16;
4217
          /* Need to save MDRQ, MCRH, MCRL, and MCVF */
4218
        }
4219
    }
4220
 
4221
  if (mask & 0x80)
4222
    {
4223
      sp -= 4;
4224
      store_word (sp, State.regs[REG_D0 + 2]);
4225
    }
4226
 
4227
  if (mask & 0x40)
4228
    {
4229
      sp -= 4;
4230
      store_word (sp, State.regs[REG_D0 + 3]);
4231
    }
4232
 
4233
  if (mask & 0x20)
4234
    {
4235
      sp -= 4;
4236
      store_word (sp, State.regs[REG_A0 + 2]);
4237
    }
4238
 
4239
  if (mask & 0x10)
4240
    {
4241
      sp -= 4;
4242
      store_word (sp, State.regs[REG_A0 + 3]);
4243
    }
4244
 
4245
  if (mask & 0x8)
4246
    {
4247
      sp -= 4;
4248
      store_word (sp, State.regs[REG_D0]);
4249
      sp -= 4;
4250
      store_word (sp, State.regs[REG_D0 + 1]);
4251
      sp -= 4;
4252
      store_word (sp, State.regs[REG_A0]);
4253
      sp -= 4;
4254
      store_word (sp, State.regs[REG_A0 + 1]);
4255
      sp -= 4;
4256
      store_word (sp, State.regs[REG_MDR]);
4257
      sp -= 4;
4258
      store_word (sp, State.regs[REG_LIR]);
4259
      sp -= 4;
4260
      store_word (sp, State.regs[REG_LAR]);
4261
      sp -= 4;
4262
    }
4263
 
4264
  /* Update the stack pointer, note that the register saves to do not
4265
     modify SP.  The SP adjustment is derived totally from the imm8
4266
     field.  */
4267
  State.regs[REG_SP] -= IMM8;
4268
  State.regs[REG_MDR] = next_pc;
4269
  State.regs[REG_PC] += EXTEND16 (FETCH16(D16A, D16B));
4270
  nia = PC;
4271
}
4272
 
4273
 
4274
// 1101 1101 d32..... regs.... imm8....;
4275
// call (d32,PC),regs,imm8 (imm8 is zero-extended.)
4276
8.0xdd+8.D32A+8.D32B+8.D32C+8.D32D+8.REGS+8.IMM8:S6:::call
4277
"call"
4278
*mn10300
4279
 
4280
*am33
4281
*am33_2
4282
 
4283
{
4284
  /* OP_DD000000 (); */
4285
  unsigned32 next_pc, sp;
4286
  unsigned32 mask;
4287
 
4288
  PC = cia;
4289
  sp = State.regs[REG_SP];
4290
  next_pc = State.regs[REG_PC] + 7;
4291
  /* could assert that nia == next_pc here */
4292
  store_word(sp, next_pc);
4293
 
4294
  mask = REGS;
4295
 
4296
  if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
4297
      || STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33_2
4298
      )
4299
    {
4300
      if (mask & 0x4)
4301
        {
4302
          sp -= 4;
4303
          store_word (sp, State.regs[REG_E0 + 2]);
4304
          sp -= 4;
4305
          store_word (sp, State.regs[REG_E0 + 3]);
4306
        }
4307
 
4308
      if (mask & 0x2)
4309
        {
4310
          sp -= 4;
4311
          store_word (sp, State.regs[REG_E0 + 4]);
4312
          sp -= 4;
4313
          store_word (sp, State.regs[REG_E0 + 5]);
4314
          sp -= 4;
4315
          store_word (sp, State.regs[REG_E0 + 6]);
4316
          sp -= 4;
4317
          store_word (sp, State.regs[REG_E0 + 7]);
4318
        }
4319
 
4320
      if (mask & 0x1)
4321
        {
4322
          sp -= 4;
4323
          store_word (sp, State.regs[REG_E0 + 0]);
4324
          sp -= 4;
4325
          store_word (sp, State.regs[REG_E0 + 1]);
4326
          sp -= 16;
4327
          /* Need to save MDRQ, MCRH, MCRL, and MCVF */
4328
        }
4329
    }
4330
 
4331
  if (mask & 0x80)
4332
    {
4333
      sp -= 4;
4334
      store_word (sp, State.regs[REG_D0 + 2]);
4335
    }
4336
 
4337
  if (mask & 0x40)
4338
    {
4339
      sp -= 4;
4340
      store_word (sp, State.regs[REG_D0 + 3]);
4341
    }
4342
 
4343
  if (mask & 0x20)
4344
    {
4345
      sp -= 4;
4346
      store_word (sp, State.regs[REG_A0 + 2]);
4347
    }
4348
 
4349
  if (mask & 0x10)
4350
    {
4351
      sp -= 4;
4352
      store_word (sp, State.regs[REG_A0 + 3]);
4353
    }
4354
 
4355
  if (mask & 0x8)
4356
    {
4357
      sp -= 4;
4358
      store_word (sp, State.regs[REG_D0]);
4359
      sp -= 4;
4360
      store_word (sp, State.regs[REG_D0 + 1]);
4361
      sp -= 4;
4362
      store_word (sp, State.regs[REG_A0]);
4363
      sp -= 4;
4364
      store_word (sp, State.regs[REG_A0 + 1]);
4365
      sp -= 4;
4366
      store_word (sp, State.regs[REG_MDR]);
4367
      sp -= 4;
4368
      store_word (sp, State.regs[REG_LIR]);
4369
      sp -= 4;
4370
      store_word (sp, State.regs[REG_LAR]);
4371
      sp -= 4;
4372
    }
4373
 
4374
  /* Update the stack pointer, note that the register saves to do not
4375
     modify SP.  The SP adjustment is derived totally from the imm8
4376
     field.  */
4377
  State.regs[REG_SP] -= IMM8;
4378
  State.regs[REG_MDR] = next_pc;
4379
  State.regs[REG_PC] += FETCH32(D32A, D32B, D32C, D32D);
4380
  nia = PC;
4381
}
4382
 
4383
 
4384
// 1101 1111 regs.... imm8....; ret regs,imm8 (imm8 is zero-extended.)
4385
8.0xdf+8.REGS+8.IMM8:S2:::ret
4386
"ret"
4387
*mn10300
4388
 
4389
*am33
4390
*am33_2
4391
 
4392
{
4393
  /* OP_DF0000 (); */
4394
  unsigned32 sp, offset;
4395
  unsigned32 mask;
4396
 
4397
  PC = cia;
4398
  State.regs[REG_SP] += IMM8;
4399
  sp = State.regs[REG_SP];
4400
 
4401
  offset = -4;
4402
  mask = REGS;
4403
 
4404
  if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
4405
      || STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33_2
4406
      )
4407
    {
4408
 
4409
      if (mask & 0x4)
4410
        {
4411
          State.regs[REG_E0 + 2] = load_word (sp + offset);
4412
          offset -= 4;
4413
          State.regs[REG_E0 + 3] = load_word (sp + offset);
4414
          offset -= 4;
4415
        }
4416
 
4417
      if (mask & 0x2)
4418
        {
4419
          State.regs[REG_E0 + 4] = load_word (sp + offset);
4420
          offset -= 4;
4421
          State.regs[REG_E0 + 5] = load_word (sp + offset);
4422
          offset -= 4;
4423
          State.regs[REG_E0 + 6] = load_word (sp + offset);
4424
          offset -= 4;
4425
          State.regs[REG_E0 + 7] = load_word (sp + offset);
4426
          offset -= 4;
4427
        }
4428
 
4429
      if (mask & 0x1)
4430
        {
4431
          /* Need to restore MDRQ, MCRH, MCRL, and MCVF */
4432
          offset -= 16;
4433
          State.regs[REG_E0 + 0] = load_word (sp + offset);
4434
          offset -= 4;
4435
          State.regs[REG_E0 + 1] = load_word (sp + offset);
4436
          offset -= 4;
4437
        }
4438
 
4439
    }
4440
 
4441
  if (mask & 0x80)
4442
    {
4443
      State.regs[REG_D0 + 2] = load_word (sp + offset);
4444
      offset -= 4;
4445
    }
4446
 
4447
  if (mask & 0x40)
4448
    {
4449
      State.regs[REG_D0 + 3] = load_word (sp + offset);
4450
      offset -= 4;
4451
    }
4452
 
4453
  if (mask & 0x20)
4454
    {
4455
      State.regs[REG_A0 + 2] = load_word (sp + offset);
4456
      offset -= 4;
4457
    }
4458
 
4459
  if (mask & 0x10)
4460
    {
4461
      State.regs[REG_A0 + 3] = load_word (sp + offset);
4462
      offset -= 4;
4463
    }
4464
 
4465
  if (mask & 0x8)
4466
    {
4467
      State.regs[REG_D0] = load_word (sp + offset);
4468
      offset -= 4;
4469
      State.regs[REG_D0 + 1] = load_word (sp + offset);
4470
      offset -= 4;
4471
      State.regs[REG_A0] = load_word (sp + offset);
4472
      offset -= 4;
4473
      State.regs[REG_A0 + 1] = load_word (sp + offset);
4474
      offset -= 4;
4475
      State.regs[REG_MDR] = load_word (sp + offset);
4476
      offset -= 4;
4477
      State.regs[REG_LIR] = load_word (sp + offset);
4478
      offset -= 4;
4479
      State.regs[REG_LAR] = load_word (sp + offset);
4480
      offset -= 4;
4481
    }
4482
 
4483
  /* Restore the PC value.  */
4484
  State.regs[REG_PC] = load_word(sp);
4485
  nia = PC;
4486
}
4487
 
4488
 
4489
// 1101 1110 regs.... imm8....; retf regs,imm8 (imm8 is zero-extended.)
4490
8.0xde+8.REGS+8.IMM8:S2:::retf
4491
"retf"
4492
*mn10300
4493
 
4494
*am33
4495
*am33_2
4496
 
4497
{
4498
  /* OP_DE0000 (); */
4499
  unsigned32 sp, offset;
4500
  unsigned32 mask;
4501
 
4502
  PC = cia;
4503
  State.regs[REG_SP] += IMM8;
4504
  sp = State.regs[REG_SP];
4505
  State.regs[REG_PC] = State.regs[REG_MDR];
4506
 
4507
  offset = -4;
4508
  mask = REGS;
4509
 
4510
  if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
4511
      || STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33_2
4512
      )
4513
    {
4514
 
4515
      if (mask & 0x4)
4516
        {
4517
          State.regs[REG_E0 + 2] = load_word (sp + offset);
4518
          offset -= 4;
4519
          State.regs[REG_E0 + 3] = load_word (sp + offset);
4520
          offset -= 4;
4521
        }
4522
 
4523
      if (mask & 0x2)
4524
        {
4525
          State.regs[REG_E0 + 4] = load_word (sp + offset);
4526
          offset -= 4;
4527
          State.regs[REG_E0 + 5] = load_word (sp + offset);
4528
          offset -= 4;
4529
          State.regs[REG_E0 + 6] = load_word (sp + offset);
4530
          offset -= 4;
4531
          State.regs[REG_E0 + 7] = load_word (sp + offset);
4532
          offset -= 4;
4533
        }
4534
 
4535
      if (mask & 0x1)
4536
        {
4537
          /* Need to restore MDRQ, MCRH, MCRL, and MCVF */
4538
          offset -= 16;
4539
          State.regs[REG_E0 + 0] = load_word (sp + offset);
4540
          offset -= 4;
4541
          State.regs[REG_E0 + 1] = load_word (sp + offset);
4542
          offset -= 4;
4543
        }
4544
 
4545
    }
4546
 
4547
  if (mask & 0x80)
4548
    {
4549
      State.regs[REG_D0 + 2] = load_word (sp + offset);
4550
      offset -= 4;
4551
    }
4552
 
4553
  if (mask & 0x40)
4554
    {
4555
      State.regs[REG_D0 + 3] = load_word (sp + offset);
4556
      offset -= 4;
4557
    }
4558
 
4559
  if (mask & 0x20)
4560
    {
4561
      State.regs[REG_A0 + 2] = load_word (sp + offset);
4562
      offset -= 4;
4563
    }
4564
 
4565
  if (mask & 0x10)
4566
    {
4567
      State.regs[REG_A0 + 3] = load_word (sp + offset);
4568
      offset -= 4;
4569
    }
4570
 
4571
  if (mask & 0x8)
4572
    {
4573
      State.regs[REG_D0] = load_word (sp + offset);
4574
      offset -= 4;
4575
      State.regs[REG_D0 + 1] = load_word (sp + offset);
4576
      offset -= 4;
4577
      State.regs[REG_A0] = load_word (sp + offset);
4578
      offset -= 4;
4579
      State.regs[REG_A0 + 1] = load_word (sp + offset);
4580
      offset -= 4;
4581
      State.regs[REG_MDR] = load_word (sp + offset);
4582
      offset -= 4;
4583
      State.regs[REG_LIR] = load_word (sp + offset);
4584
      offset -= 4;
4585
      State.regs[REG_LAR] = load_word (sp + offset);
4586
      offset -= 4;
4587
    }
4588
  nia = PC;
4589
}
4590
 
4591
 
4592
:include::am33:am33.igen
4593
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.