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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [sim/] [mn10200/] [simops.c] - Blame information for rev 1771

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
#include "config.h"
2
 
3
#include <signal.h>
4
#ifdef HAVE_UNISTD_H
5
#include <unistd.h>
6
#endif
7
#include "mn10200_sim.h"
8
#include "simops.h"
9
#include "targ-vals.h"
10
#include "bfd.h"
11
#include <errno.h>
12
#include <sys/stat.h>
13
#include <sys/times.h>
14
#include <sys/time.h>
15
 
16
#define REG0(X) ((X) & 0x3)
17
#define REG1(X) (((X) & 0xc) >> 2)
18
#define REG0_4(X) (((X) & 0x30) >> 4)
19
#define REG0_8(X) (((X) & 0x300) >> 8)
20
#define REG1_8(X) (((X) & 0xc00) >> 10)
21
#define REG0_16(X) (((X) & 0x30000) >> 16)
22
#define REG1_16(X) (((X) & 0xc0000) >> 18)
23
#define TRUNC(X) ((X) & 0xffffff)
24
 
25
/* mov imm8, dn */
26
void OP_8000 (insn, extension)
27
     unsigned long insn, extension;
28
{
29
  State.regs[REG_D0 + REG0_8 (insn)] = SEXT8 (insn & 0xff);
30
}
31
 
32
/* mov dn, dm */
33
void OP_80 (insn, extension)
34
     unsigned long insn, extension;
35
{
36
  State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
37
}
38
 
39
/* mov dm, an */
40
void OP_F230 (insn, extension)
41
     unsigned long insn, extension;
42
{
43
  State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
44
}
45
 
46
/* mov an, dm */
47
void OP_F2F0 (insn, extension)
48
     unsigned long insn, extension;
49
{
50
  State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
51
}
52
 
53
/* mov an, am */
54
void OP_F270 (insn, extension)
55
     unsigned long insn, extension;
56
{
57
  State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
58
}
59
 
60
/* mov psw, dn */
61
void OP_F3F0 (insn, extension)
62
     unsigned long insn, extension;
63
{
64
  State.regs[REG_D0 + REG0 (insn)] = PSW & 0xffff;
65
}
66
 
67
/* mov dn, psw */
68
void OP_F3D0 (insn, extension)
69
     unsigned long insn, extension;
70
{
71
  PSW = State.regs[REG_D0 + REG1 (insn)] & 0xffff ;
72
}
73
 
74
/* mov mdr, dn */
75
void OP_F3E0 (insn, extension)
76
     unsigned long insn, extension;
77
{
78
  State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_MDR] & 0xffff;
79
}
80
 
81
/* mov dn, mdr */
82
void OP_F3C0 (insn, extension)
83
     unsigned long insn, extension;
84
{
85
  State.regs[REG_MDR] = State.regs[REG_D0 + REG1 (insn)] & 0xffff;
86
}
87
 
88
/* mov (an), dm */
89
void OP_20 (insn, extension)
90
     unsigned long insn, extension;
91
{
92
  State.regs[REG_D0 + REG0 (insn)]
93
    = SEXT16 (load_half (State.regs[REG_A0 + REG1 (insn)]));
94
}
95
 
96
/* mov (d8,an), dm */
97
void OP_6000 (insn, extension)
98
     unsigned long insn, extension;
99
{
100
  State.regs[REG_D0 + REG0_8 (insn)]
101
    = SEXT16 (load_half ((State.regs[REG_A0 + REG1_8 (insn)]
102
                         + SEXT8 (insn & 0xff))));
103
}
104
 
105
/* mov (d16,an), dm */
106
void OP_F7C00000 (insn, extension)
107
     unsigned long insn, extension;
108
{
109
  State.regs[REG_D0 + REG0_16 (insn)]
110
    = SEXT16 (load_half ((State.regs[REG_A0 + REG1_16 (insn)]
111
              + SEXT16 (insn & 0xffff))));
112
}
113
 
114
/* mov (d24,am), dn */
115
void OP_F4800000 (insn, extension)
116
     unsigned long insn, extension;
117
{
118
  State.regs[REG_D0 + REG0_16 (insn)]
119
    = SEXT16 (load_half ((State.regs[REG_A0 + REG1_16 (insn)]
120
                         + SEXT24 (((insn & 0xffff) << 8) + extension))));
121
}
122
 
123
/* mov (di,an), dm */
124
void OP_F140 (insn, extension)
125
     unsigned long insn, extension;
126
{
127
  State.regs[REG_D0 + REG0 (insn)]
128
    = SEXT16 (load_half ((State.regs[REG_A0 + REG1 (insn)]
129
                         + State.regs[REG_D0 + REG0_4 (insn)])));
130
}
131
 
132
/* mov (abs16), dn */
133
void OP_C80000 (insn, extension)
134
     unsigned long insn, extension;
135
{
136
  State.regs[REG_D0 + REG0_16 (insn)] = SEXT16 (load_half ((insn & 0xffff)));
137
}
138
 
139
/* mov (abs24), dn */
140
void OP_F4C00000 (insn, extension)
141
     unsigned long insn, extension;
142
{
143
  State.regs[REG_D0 + REG0_16 (insn)]
144
    = SEXT16 (load_half ((((insn & 0xffff) << 8) + extension)));
145
}
146
 
147
/* mov (d8,an), am */
148
void OP_7000 (insn, extension)
149
     unsigned long insn, extension;
150
{
151
  State.regs[REG_A0 + REG0_8 (insn)]
152
    = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_8 (insn)]
153
                         + SEXT8 (insn & 0xff))));
154
}
155
 
156
/* mov (d16,an), am */
157
void OP_F7B00000 (insn, extension)
158
     unsigned long insn, extension;
159
{
160
  State.regs[REG_A0 + REG0_16 (insn)]
161
    = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
162
                         + SEXT16 (insn & 0xffff))));
163
}
164
 
165
/* mov (d24,am), an */
166
void OP_F4F00000 (insn, extension)
167
     unsigned long insn, extension;
168
{
169
  State.regs[REG_A0 + REG0_16 (insn)]
170
    = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
171
                           + SEXT24 (((insn & 0xffff) << 8) + extension))));
172
}
173
 
174
/* mov (di,an), am */
175
void OP_F100 (insn, extension)
176
     unsigned long insn, extension;
177
{
178
  State.regs[REG_A0 + REG0 (insn)]
179
    = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1 (insn)]
180
                           + State.regs[REG_D0 + REG0_4 (insn)])));
181
}
182
 
183
/* mov (abs16), an */
184
void OP_F7300000 (insn, extension)
185
     unsigned long insn, extension;
186
{
187
  State.regs[REG_A0 + REG0_16 (insn)] = SEXT24 (load_3_byte ((insn & 0xffff)));
188
}
189
 
190
/* mov (abs24), an */
191
void OP_F4D00000 (insn, extension)
192
     unsigned long insn, extension;
193
{
194
  State.regs[REG_A0 + REG0_16 (insn)]
195
    = SEXT24 (load_3_byte ((((insn & 0xffff) << 8) + extension)));
196
}
197
 
198
/* mov dm, (an) */
199
void OP_0 (insn, extension)
200
     unsigned long insn, extension;
201
{
202
  store_half (State.regs[REG_A0 + REG1 (insn)],
203
              State.regs[REG_D0 + REG0 (insn)]);
204
}
205
 
206
/* mov dm, (d8,an) */
207
void OP_4000 (insn, extension)
208
     unsigned long insn, extension;
209
{
210
  store_half (State.regs[REG_A0 + REG1_8 (insn)] + SEXT8 (insn & 0xff),
211
              State.regs[REG_D0 + REG0_8 (insn)]);
212
}
213
 
214
/* mov dm, (d16,an) */
215
void OP_F7800000 (insn, extension)
216
     unsigned long insn, extension;
217
{
218
  store_half (State.regs[REG_A0 + REG1_16 (insn)] + SEXT16 (insn & 0xffff),
219
              State.regs[REG_D0 + REG0_16 (insn)]);
220
}
221
 
222
/* mov dm, (d24,am) */
223
void OP_F4000000 (insn, extension)
224
     unsigned long insn, extension;
225
{
226
  store_half ((State.regs[REG_A0 + REG1_16 (insn)]
227
               + SEXT24 (((insn & 0xffff) << 8) + extension)),
228
              State.regs[REG_D0 + REG0_16 (insn)]);
229
}
230
 
231
/* mov dm, (di,an) */
232
void OP_F1C0 (insn, extension)
233
     unsigned long insn, extension;
234
{
235
  store_half ((State.regs[REG_A0 + REG1 (insn)]
236
               + State.regs[REG_D0 + REG0_4 (insn)]),
237
              State.regs[REG_D0 + REG0 (insn)]);
238
}
239
 
240
/* mov dn, (abs16) */
241
void OP_C00000 (insn, extension)
242
     unsigned long insn, extension;
243
{
244
  store_half ((insn & 0xffff), State.regs[REG_D0 + REG0_16 (insn)]);
245
}
246
 
247
/* mov dn, (abs24) */
248
void OP_F4400000 (insn, extension)
249
     unsigned long insn, extension;
250
{
251
  store_half (SEXT24 (((insn & 0xffff) << 8) + extension),
252
             State.regs[REG_D0 + REG0_16 (insn)]);
253
}
254
 
255
/* mov am, (d8,an) */
256
void OP_5000 (insn, extension)
257
     unsigned long insn, extension;
258
{
259
  store_3_byte (State.regs[REG_A0 + REG1_8 (insn)] + SEXT8 (insn & 0xff),
260
                State.regs[REG_A0 + REG0_8 (insn)]);
261
}
262
 
263
/* mov am, (d16,an) */
264
void OP_F7A00000 (insn, extension)
265
     unsigned long insn, extension;
266
{
267
  store_3_byte (State.regs[REG_A0 + REG1_16 (insn)] + SEXT16 (insn & 0xffff),
268
                State.regs[REG_A0 + REG0_16 (insn)]);
269
}
270
 
271
/* mov am, (d24,an) */
272
void OP_F4100000 (insn, extension)
273
     unsigned long insn, extension;
274
{
275
  store_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
276
                 + SEXT24 (((insn & 0xffff) << 8) + extension)),
277
                State.regs[REG_A0 + REG0_16 (insn)]);
278
}
279
 
280
/* mov am, (di,an) */
281
void OP_F180 (insn, extension)
282
     unsigned long insn, extension;
283
{
284
  store_3_byte ((State.regs[REG_A0 + REG1 (insn)]
285
                 + State.regs[REG_D0 + REG0_4 (insn)]),
286
                State.regs[REG_A0 + REG0 (insn)]);
287
}
288
 
289
/* mov an, (abs16) */
290
void OP_F7200000 (insn, extension)
291
     unsigned long insn, extension;
292
{
293
  store_3_byte ((insn & 0xffff), State.regs[REG_A0 + REG0_16 (insn)]);
294
}
295
 
296
/* mov an, (abs24) */
297
void OP_F4500000 (insn, extension)
298
     unsigned long insn, extension;
299
{
300
  store_3_byte (SEXT24 (((insn & 0xffff) << 8) + extension),
301
                State.regs[REG_A0 + REG0_16 (insn)]);
302
}
303
 
304
/* mov imm16, dn */
305
void OP_F80000 (insn, extension)
306
     unsigned long insn, extension;
307
{
308
  State.regs[REG_D0 + REG0_16 (insn)] = SEXT16 (insn & 0xffff);
309
}
310
 
311
/* mov imm24, dn */
312
void OP_F4700000 (insn, extension)
313
     unsigned long insn, extension;
314
{
315
  State.regs[REG_D0 + REG0_16 (insn)]
316
    = SEXT24 (((insn & 0xffff) << 8) + extension);
317
}
318
 
319
/* mov imm16, an */
320
void OP_DC0000 (insn, extension)
321
     unsigned long insn, extension;
322
{
323
  State.regs[REG_A0 + REG0_16 (insn)] = insn & 0xffff;
324
}
325
 
326
/* mov imm24, an */
327
void OP_F4740000 (insn, extension)
328
     unsigned long insn, extension;
329
{
330
  State.regs[REG_A0 + REG0_16 (insn)]
331
    = SEXT24 (((insn & 0xffff) << 8) + extension);
332
}
333
 
334
/* movx (d8,an), dm */
335
void OP_F57000 (insn, extension)
336
     unsigned long insn, extension;
337
{
338
  State.regs[REG_D0 + REG0_8 (insn)]
339
    = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_8 (insn)]
340
                           + SEXT8 (insn & 0xff))));
341
}
342
 
343
/* movx (d16,an), dm */
344
void OP_F7700000 (insn, extension)
345
     unsigned long insn, extension;
346
{
347
  State.regs[REG_D0 + REG0_16 (insn)]
348
    = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
349
                           + SEXT16 (insn & 0xffff))));
350
}
351
 
352
/* movx (d24,am), dn */
353
void OP_F4B00000 (insn, extension)
354
     unsigned long insn, extension;
355
{
356
  State.regs[REG_D0 + REG0_16 (insn)]
357
    = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
358
                           + SEXT24 (((insn & 0xffff) << 8) + extension))));
359
}
360
 
361
/* movx dm, (d8,an) */
362
void OP_F55000 (insn, extension)
363
     unsigned long insn, extension;
364
{
365
  store_3_byte (State.regs[REG_A0 + REG1_8 (insn)] + SEXT8 (insn & 0xff),
366
                State.regs[REG_D0 + REG0_8 (insn)]);
367
}
368
 
369
/* movx dm, (d16,an) */
370
void OP_F7600000 (insn, extension)
371
     unsigned long insn, extension;
372
{
373
  store_3_byte (State.regs[REG_A0 + REG1_16 (insn)] + SEXT16 (insn & 0xffff),
374
                State.regs[REG_D0 + REG0_16 (insn)]);
375
}
376
 
377
/* movx dm, (d24,am) */
378
void OP_F4300000 (insn, extension)
379
     unsigned long insn, extension;
380
{
381
  store_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
382
                 + SEXT24 (((insn & 0xffff) << 8) + extension)),
383
                State.regs[REG_D0 + REG0_16 (insn)]);
384
}
385
 
386
/* movb (d8,an), dm */
387
void OP_F52000 (insn, extension)
388
     unsigned long insn, extension;
389
{
390
  State.regs[REG_D0 + REG0_8 (insn)]
391
    = SEXT8 (load_byte ((State.regs[REG_A0 + REG1_8 (insn)]
392
                        + SEXT8 (insn & 0xff))));
393
}
394
 
395
/* movb (d16,an), dm */
396
void OP_F7D00000 (insn, extension)
397
     unsigned long insn, extension;
398
{
399
  State.regs[REG_D0 + REG0_16 (insn)]
400
    = SEXT8 (load_byte ((State.regs[REG_A0 + REG1_16 (insn)]
401
                        + SEXT16 (insn & 0xffff))));
402
}
403
 
404
/* movb (d24,am), dn */
405
void OP_F4A00000 (insn, extension)
406
     unsigned long insn, extension;
407
{
408
  State.regs[REG_D0 + REG0_16 (insn)]
409
    = SEXT8 (load_byte ((State.regs[REG_A0 + REG1_16 (insn)]
410
                        + SEXT24 (((insn & 0xffff) << 8) + extension))));
411
}
412
 
413
/* movb (di,an), dm */
414
void OP_F040 (insn, extension)
415
     unsigned long insn, extension;
416
{
417
  State.regs[REG_D0 + REG0 (insn)]
418
    = SEXT8 (load_byte ((State.regs[REG_A0 + REG1 (insn)]
419
                        + State.regs[REG_D0 + REG0_4 (insn)])));
420
}
421
 
422
/* mov (abs24), dn */
423
void OP_F4C40000 (insn, extension)
424
     unsigned long insn, extension;
425
{
426
  State.regs[REG_D0 + REG0_16 (insn)]
427
    = SEXT8 (load_byte ((((insn & 0xffff) << 8) + extension)));
428
}
429
 
430
/* movb dm, (an) */
431
void OP_10 (insn, extension)
432
     unsigned long insn, extension;
433
{
434
  store_byte (State.regs[REG_A0 + REG1 (insn)],
435
              State.regs[REG_D0 + REG0 (insn)]);
436
}
437
 
438
/* movb dm, (d8,an) */
439
void OP_F51000 (insn, extension)
440
     unsigned long insn, extension;
441
{
442
  store_byte (State.regs[REG_A0 + REG1_8 (insn)] + SEXT8 (insn & 0xff),
443
              State.regs[REG_D0 + REG0_8 (insn)]);
444
}
445
 
446
/* movb dm, (d16,an) */
447
void OP_F7900000 (insn, extension)
448
     unsigned long insn, extension;
449
{
450
  store_byte (State.regs[REG_A0 + REG1_16 (insn)] + SEXT16 (insn & 0xffff),
451
              State.regs[REG_D0 + REG0_16 (insn)]);
452
}
453
 
454
/* movb dm, (d24,am) */
455
void OP_F4200000 (insn, extension)
456
     unsigned long insn, extension;
457
{
458
  store_byte ((State.regs[REG_A0 + REG1_16 (insn)]
459
              + SEXT24 (((insn & 0xffff) << 8) + extension)),
460
              State.regs[REG_D0 + REG0_16 (insn)]);
461
}
462
 
463
/* movb dm, (di,an) */
464
void OP_F0C0 (insn, extension)
465
     unsigned long insn, extension;
466
{
467
  store_byte ((State.regs[REG_A0 + REG1 (insn)]
468
              + State.regs[REG_D0 + REG0_4 (insn)]),
469
              State.regs[REG_D0 + REG0 (insn)]);
470
}
471
 
472
/* movb dn, (abs16) */
473
void OP_C40000 (insn, extension)
474
     unsigned long insn, extension;
475
{
476
  store_byte ((insn & 0xffff), State.regs[REG_D0 + REG0_16 (insn)]);
477
}
478
 
479
/* movb dn, (abs24) */
480
void OP_F4440000 (insn, extension)
481
     unsigned long insn, extension;
482
{
483
  store_byte (SEXT24 (((insn & 0xffff) << 8) + extension),
484
             State.regs[REG_D0 + REG0_16 (insn)]);
485
}
486
 
487
/* movbu (an), dm */
488
void OP_30 (insn, extension)
489
     unsigned long insn, extension;
490
{
491
  State.regs[REG_D0 + REG0 (insn)]
492
    = load_byte (State.regs[REG_A0 + REG1 (insn)]);
493
}
494
 
495
/* movbu (d8,an), dm */
496
void OP_F53000 (insn, extension)
497
     unsigned long insn, extension;
498
{
499
  State.regs[REG_D0 + REG0_8 (insn)]
500
    = load_byte ((State.regs[REG_A0 + REG1_8 (insn)] + SEXT8 (insn & 0xff)));
501
}
502
 
503
/* movbu (d16,an), dm */
504
void OP_F7500000 (insn, extension)
505
     unsigned long insn, extension;
506
{
507
  State.regs[REG_D0 + REG0_16 (insn)]
508
    = load_byte ((State.regs[REG_A0 + REG1_16 (insn)]
509
                  + SEXT16 (insn & 0xffff)));
510
}
511
 
512
/* movbu (d24,am), dn */
513
void OP_F4900000 (insn, extension)
514
     unsigned long insn, extension;
515
{
516
  State.regs[REG_D0 + REG0_16 (insn)]
517
    = load_byte ((State.regs[REG_A0 + REG1_16 (insn)]
518
                  + SEXT24 (((insn & 0xffff) << 8) + extension)));
519
}
520
 
521
/* movbu (di,an), dm */
522
void OP_F080 (insn, extension)
523
     unsigned long insn, extension;
524
{
525
  State.regs[REG_D0 + REG0 (insn)]
526
    = load_byte ((State.regs[REG_A0 + REG1 (insn)]
527
                  + State.regs[REG_D0 + REG0_4 (insn)]));
528
}
529
 
530
/* movbu (abs16), dn */
531
void OP_CC0000 (insn, extension)
532
     unsigned long insn, extension;
533
{
534
  State.regs[REG_D0 + REG0_16 (insn)] = load_byte ((insn & 0xffff));
535
}
536
 
537
/* movbu (abs24), dn */
538
void OP_F4C80000 (insn, extension)
539
     unsigned long insn, extension;
540
{
541
  State.regs[REG_D0 + REG0_16 (insn)]
542
    = load_byte ((((insn & 0xffff) << 8) + extension));
543
}
544
 
545
/* ext dn */
546
void OP_F3C1 (insn, extension)
547
     unsigned long insn, extension;
548
{
549
  if (State.regs[REG_D0 + REG1 (insn)] & 0x8000)
550
    State.regs[REG_MDR] = 0xffff;
551
  else
552
    State.regs[REG_MDR] = 0;
553
}
554
 
555
/* extx dn */
556
void OP_B0 (insn, extension)
557
     unsigned long insn, extension;
558
{
559
  State.regs[REG_D0 + REG0 (insn)] = SEXT16 (State.regs[REG_D0 + REG0 (insn)]);
560
}
561
 
562
/* extxu dn */
563
void OP_B4 (insn, extension)
564
     unsigned long insn, extension;
565
{
566
  State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_D0 + REG0 (insn)] & 0xffff;
567
}
568
 
569
/* extxb dn */
570
void OP_B8 (insn, extension)
571
     unsigned long insn, extension;
572
{
573
  State.regs[REG_D0 + REG0 (insn)] = SEXT8 (State.regs[REG_D0 + REG0 (insn)]);
574
}
575
 
576
/* extxbu dn */
577
void OP_BC (insn, extension)
578
     unsigned long insn, extension;
579
{
580
  State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_D0 + REG0 (insn)] & 0xff;
581
}
582
 
583
/* add dn,dm */
584
void OP_90 (insn, extension)
585
     unsigned long insn, extension;
586
{
587
  int z, c, n, v, zx, cx, nx, vx;
588
  unsigned long reg1, reg2, value;
589
 
590
  reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
591
  reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
592
  value = TRUNC (reg1 + reg2);
593
  State.regs[REG_D0 + REG0 (insn)] = value;
594
 
595
  z = ((value & 0xffff) == 0);
596
  zx = (value == 0);
597
  n = (value & 0x8000);
598
  nx = (value & 0x800000);
599
  c = ((value & 0xffff) < (reg1 & 0xffff))
600
       || ((value & 0xffff) < (reg2 & 0xffff));
601
  cx = (value < reg1) || (value < reg2);
602
  v = ((reg2 & 0x8000) == (reg1 & 0x8000)
603
       && (reg2 & 0x8000) != (value & 0x8000));
604
  vx = ((reg2 & 0x800000) == (reg1 & 0x800000)
605
        && (reg2 & 0x800000) != (value & 0x800000));
606
 
607
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
608
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
609
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
610
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
611
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
612
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
613
}
614
 
615
/* add dm, an */
616
void OP_F200 (insn, extension)
617
     unsigned long insn, extension;
618
{
619
  int z, c, n, v, zx, cx, nx, vx;
620
  unsigned long reg1, reg2, value;
621
 
622
  reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
623
  reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
624
  value = TRUNC (reg1 + reg2);
625
  State.regs[REG_A0 + REG0 (insn)] = value;
626
 
627
  z = ((value & 0xffff) == 0);
628
  zx = (value == 0);
629
  n = (value & 0x8000);
630
  nx = (value & 0x800000);
631
  c = ((value & 0xffff) < (reg1 & 0xffff))
632
       || ((value & 0xffff) < (reg2 & 0xffff));
633
  cx = (value < reg1) || (value < reg2);
634
  v = ((reg2 & 0x8000) == (reg1 & 0x8000)
635
       && (reg2 & 0x8000) != (value & 0x8000));
636
  vx = ((reg2 & 0x800000) == (reg1 & 0x800000)
637
        && (reg2 & 0x800000) != (value & 0x800000));
638
 
639
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
640
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
641
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
642
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
643
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
644
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
645
}
646
 
647
/* add an, dm */
648
void OP_F2C0 (insn, extension)
649
     unsigned long insn, extension;
650
{
651
  int z, c, n, v, zx, cx, nx, vx;
652
  unsigned long reg1, reg2, value;
653
 
654
  reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
655
  reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
656
  value = TRUNC (reg1 + reg2);
657
  State.regs[REG_D0 + REG0 (insn)] = value;
658
 
659
  z = ((value & 0xffff) == 0);
660
  zx = (value == 0);
661
  n = (value & 0x8000);
662
  nx = (value & 0x800000);
663
  c = ((value & 0xffff) < (reg1 & 0xffff))
664
       || ((value & 0xffff) < (reg2 & 0xffff));
665
  cx = (value < reg1) || (value < reg2);
666
  v = ((reg2 & 0x8000) == (reg1 & 0x8000)
667
       && (reg2 & 0x8000) != (value & 0x8000));
668
  vx = ((reg2 & 0x800000) == (reg1 & 0x800000)
669
        && (reg2 & 0x800000) != (value & 0x800000));
670
 
671
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
672
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
673
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
674
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
675
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
676
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
677
}
678
 
679
/* add an,am */
680
void OP_F240 (insn, extension)
681
     unsigned long insn, extension;
682
{
683
  int z, c, n, v, zx, cx, nx, vx;
684
  unsigned long reg1, reg2, value;
685
 
686
  reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
687
  reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
688
  value = TRUNC (reg1 + reg2);
689
  State.regs[REG_A0 + REG0 (insn)] = value;
690
 
691
  z = ((value & 0xffff) == 0);
692
  zx = (value == 0);
693
  n = (value & 0x8000);
694
  nx = (value & 0x800000);
695
  c = ((value & 0xffff) < (reg1 & 0xffff))
696
       || ((value & 0xffff) < (reg2 & 0xffff));
697
  cx = (value < reg1) || (value < reg2);
698
  v = ((reg2 & 0x8000) == (reg1 & 0x8000)
699
       && (reg2 & 0x8000) != (value & 0x8000));
700
  vx = ((reg2 & 0x800000) == (reg1 & 0x800000)
701
        && (reg2 & 0x800000) != (value & 0x800000));
702
 
703
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
704
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
705
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
706
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
707
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
708
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
709
}
710
 
711
/* add imm8, dn */
712
void OP_D400 (insn, extension)
713
     unsigned long insn, extension;
714
{
715
  int z, c, n, v, zx, cx, nx, vx;
716
  unsigned long reg1, imm, value;
717
 
718
  reg1 = TRUNC (State.regs[REG_D0 + REG0_8 (insn)]);
719
  imm = TRUNC (SEXT8 (insn & 0xff));
720
  value = TRUNC (reg1 + imm);
721
  State.regs[REG_D0 + REG0_8 (insn)] = value;
722
 
723
  z = ((value & 0xffff) == 0);
724
  zx = (value == 0);
725
  n = (value & 0x8000);
726
  nx = (value & 0x800000);
727
  c = ((value & 0xffff) < (reg1 & 0xffff))
728
       || ((value & 0xffff) < (imm & 0xffff));
729
  cx = (value < reg1) || (value < imm);
730
  v = ((reg1 & 0x8000) == (imm & 0x8000)
731
       && (reg1 & 0x8000) != (value & 0x8000));
732
  vx = ((reg1 & 0x800000) == (imm & 0x800000)
733
        && (reg1 & 0x800000) != (value & 0x800000));
734
 
735
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
736
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
737
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
738
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
739
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
740
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
741
}
742
 
743
/* add imm16, dn */
744
void OP_F7180000 (insn, extension)
745
     unsigned long insn, extension;
746
{
747
  int z, c, n, v, zx, cx, nx, vx;
748
  unsigned long reg1, imm, value;
749
 
750
  reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
751
  imm = TRUNC (SEXT16 (insn & 0xffff));
752
  value = TRUNC (reg1 + imm);
753
  State.regs[REG_D0 + REG0_16 (insn)] = value;
754
 
755
  z = ((value & 0xffff) == 0);
756
  zx = (value == 0);
757
  n = (value & 0x8000);
758
  nx = (value & 0x800000);
759
  c = ((value & 0xffff) < (reg1 & 0xffff))
760
       || ((value & 0xffff) < (imm & 0xffff));
761
  cx = (value < reg1) || (value < imm);
762
  v = ((reg1 & 0x8000) == (imm & 0x8000)
763
       && (reg1 & 0x8000) != (value & 0x8000));
764
  vx = ((reg1 & 0x800000) == (imm & 0x800000)
765
        && (reg1 & 0x800000) != (value & 0x800000));
766
 
767
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
768
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
769
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
770
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
771
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
772
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
773
}
774
 
775
/* add imm24,dn */
776
void OP_F4600000 (insn, extension)
777
     unsigned long insn, extension;
778
{
779
  int z, c, n, v, zx, cx, nx, vx;
780
  unsigned long reg1, imm, value;
781
 
782
  reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
783
  imm = TRUNC (((insn & 0xffff) << 8) + extension);
784
  value = TRUNC (reg1 + imm);
785
  State.regs[REG_D0 + REG0_16 (insn)] = value;
786
 
787
  z = ((value & 0xffff) == 0);
788
  zx = (value == 0);
789
  n = (value & 0x8000);
790
  nx = (value & 0x800000);
791
  c = ((value & 0xffff) < (reg1 & 0xffff))
792
       || ((value & 0xffff) < (imm & 0xffff));
793
  cx = (value < reg1) || (value < imm);
794
  v = ((reg1 & 0x8000) == (imm & 0x8000)
795
       && (reg1 & 0x8000) != (value & 0x8000));
796
  vx = ((reg1 & 0x800000) == (imm & 0x800000)
797
        && (reg1 & 0x800000) != (value & 0x800000));
798
 
799
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
800
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
801
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
802
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
803
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
804
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
805
}
806
 
807
/* add imm8, an */
808
void OP_D000 (insn, extension)
809
     unsigned long insn, extension;
810
{
811
  int z, c, n, v, zx, cx, nx, vx;
812
  unsigned long reg1, imm, value;
813
 
814
  reg1 = TRUNC (State.regs[REG_A0 + REG0_8 (insn)]);
815
  imm = TRUNC (SEXT8 (insn & 0xff));
816
  value = TRUNC (reg1 + imm);
817
  State.regs[REG_A0 + REG0_8 (insn)] = value;
818
 
819
  z = ((value & 0xffff) == 0);
820
  zx = (value == 0);
821
  n = (value & 0x8000);
822
  nx = (value & 0x800000);
823
  c = ((value & 0xffff) < (reg1 & 0xffff))
824
       || ((value & 0xffff) < (imm & 0xffff));
825
  cx = (value < reg1) || (value < imm);
826
  v = ((reg1 & 0x8000) == (imm & 0x8000)
827
       && (reg1 & 0x8000) != (value & 0x8000));
828
  vx = ((reg1 & 0x800000) == (imm & 0x800000)
829
        && (reg1 & 0x800000) != (value & 0x800000));
830
 
831
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
832
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
833
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
834
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
835
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
836
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
837
}
838
 
839
/* add imm16, an */
840
void OP_F7080000 (insn, extension)
841
     unsigned long insn, extension;
842
{
843
  int z, c, n, v, zx, cx, nx, vx;
844
  unsigned long reg1, imm, value;
845
 
846
  reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
847
  imm = TRUNC (SEXT16 (insn & 0xffff));
848
  value = TRUNC (reg1 + imm);
849
  State.regs[REG_A0 + REG0_16 (insn)] = value;
850
 
851
  z = ((value & 0xffff) == 0);
852
  zx = (value == 0);
853
  n = (value & 0x8000);
854
  nx = (value & 0x800000);
855
  c = ((value & 0xffff) < (reg1 & 0xffff))
856
       || ((value & 0xffff) < (imm & 0xffff));
857
  cx = (value < reg1) || (value < imm);
858
  v = ((reg1 & 0x8000) == (imm & 0x8000)
859
       && (reg1 & 0x8000) != (value & 0x8000));
860
  vx = ((reg1 & 0x800000) == (imm & 0x800000)
861
        && (reg1 & 0x800000) != (value & 0x800000));
862
 
863
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
864
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
865
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
866
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
867
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
868
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
869
}
870
 
871
/* add imm24, an */
872
void OP_F4640000 (insn, extension)
873
     unsigned long insn, extension;
874
{
875
  int z, c, n, v, zx, cx, nx, vx;
876
  unsigned long reg1, imm, value;
877
 
878
  reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
879
  imm = TRUNC (((insn & 0xffff) << 8) + extension);
880
  value = TRUNC (reg1 + imm);
881
  State.regs[REG_A0 + REG0_16 (insn)] = value;
882
 
883
  z = ((value & 0xffff) == 0);
884
  zx = (value == 0);
885
  n = (value & 0x8000);
886
  nx = (value & 0x800000);
887
  c = ((value & 0xffff) < (reg1 & 0xffff)) || ((value & 0xffff) < (imm & 0xffff));
888
  cx = (value < reg1) || (value < imm);
889
  v = ((reg1 & 0x8000) == (imm & 0x8000)
890
       && (reg1 & 0x8000) != (value & 0x8000));
891
  vx = ((reg1 & 0x800000) == (imm & 0x800000)
892
        && (reg1 & 0x800000) != (value & 0x800000));
893
 
894
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
895
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
896
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
897
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
898
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
899
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
900
}
901
 
902
/* addc dm,dn */
903
void OP_F280 (insn, extension)
904
     unsigned long insn, extension;
905
{
906
  int z, c, n, v, zx, cx, nx, vx;
907
  unsigned long reg1, reg2, value;
908
 
909
  reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
910
  reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
911
  value = TRUNC (reg1 + reg2 + ((PSW & PSW_CF) != 0));
912
  State.regs[REG_D0 + REG0 (insn)] = value;
913
 
914
  z = ((value & 0xffff) == 0);
915
  zx = (value == 0);
916
  n = (value & 0x8000);
917
  nx = (value & 0x800000);
918
  c = ((value & 0xffff) < (reg1 & 0xffff))
919
       || ((value & 0xffff) < (reg2 & 0xffff));
920
  cx = (value < reg1) || (value < reg2);
921
  v = ((reg2 & 0x8000) == (reg1 & 0x8000)
922
       && (reg2 & 0x8000) != (value & 0x8000));
923
  vx = ((reg2 & 0x800000) == (reg1 & 0x800000)
924
        && (reg2 & 0x800000) != (value & 0x800000));
925
 
926
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
927
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
928
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
929
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
930
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
931
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
932
}
933
 
934
/* addnf imm8, an */
935
void OP_F50C00 (insn, extension)
936
     unsigned long insn, extension;
937
{
938
  unsigned long reg1, imm, value;
939
 
940
  reg1 = State.regs[REG_A0 + REG0_8 (insn)];
941
  imm = SEXT8 (insn & 0xff);
942
  value = reg1 + imm;
943
  State.regs[REG_A0 + REG0_8 (insn)] = TRUNC (value);
944
}
945
 
946
/* sub dn, dm */
947
void OP_A0 (insn, extension)
948
     unsigned long insn, extension;
949
{
950
  int z, c, n, v, zx, cx, nx, vx;
951
  unsigned long reg1, reg2, value;
952
 
953
  reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
954
  reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
955
  value = TRUNC (reg2 - reg1);
956
  State.regs[REG_D0 + REG0 (insn)] = value;
957
 
958
  z = ((value & 0xffff) == 0);
959
  zx = (value == 0);
960
  n = (value & 0x8000);
961
  nx = (value & 0x800000);
962
  c = ((reg1 & 0xffff) > (reg2 & 0xffff));
963
  cx = (reg1 > reg2);
964
  v = ((reg2 & 0x8000) != (reg1 & 0x8000)
965
       && (reg2 & 0x8000) != (value & 0x8000));
966
  vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
967
        && (reg2 & 0x800000) != (value & 0x800000));
968
 
969
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
970
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
971
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
972
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
973
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
974
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
975
}
976
 
977
/* sub dm, an */
978
void OP_F210 (insn, extension)
979
     unsigned long insn, extension;
980
{
981
  int z, c, n, v, zx, cx, nx, vx;
982
  unsigned long reg1, reg2, value;
983
 
984
  reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
985
  reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
986
  value = TRUNC (reg2 - reg1);
987
  State.regs[REG_A0 + REG0 (insn)] = value;
988
 
989
  z = ((value & 0xffff) == 0);
990
  zx = (value == 0);
991
  n = (value & 0x8000);
992
  nx = (value & 0x800000);
993
  c = ((reg1 & 0xffff) > (reg2 & 0xffff));
994
  cx = (reg1 > reg2);
995
  v = ((reg2 & 0x8000) != (reg1 & 0x8000)
996
       && (reg2 & 0x8000) != (value & 0x8000));
997
  vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
998
        && (reg2 & 0x800000) != (value & 0x800000));
999
 
1000
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1001
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1002
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1003
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1004
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1005
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1006
}
1007
 
1008
/* sub an, dm */
1009
void OP_F2D0 (insn, extension)
1010
     unsigned long insn, extension;
1011
{
1012
  int z, c, n, v, zx, cx, nx, vx;
1013
  unsigned long reg1, reg2, value;
1014
 
1015
  reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
1016
  reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
1017
  value = TRUNC (reg2 - reg1);
1018
  State.regs[REG_D0 + REG0 (insn)] = value;
1019
 
1020
  z = ((value & 0xffff) == 0);
1021
  zx = (value == 0);
1022
  n = (value & 0x8000);
1023
  nx = (value & 0x800000);
1024
  c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1025
  cx = (reg1 > reg2);
1026
  v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1027
       && (reg2 & 0x8000) != (value & 0x8000));
1028
  vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1029
        && (reg2 & 0x800000) != (value & 0x800000));
1030
 
1031
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1032
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1033
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1034
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1035
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1036
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1037
}
1038
 
1039
/* sub an, am */
1040
void OP_F250 (insn, extension)
1041
     unsigned long insn, extension;
1042
{
1043
  int z, c, n, v, zx, cx, nx, vx;
1044
  unsigned long reg1, reg2, value;
1045
 
1046
  reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
1047
  reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
1048
  value = TRUNC (reg2 - reg1);
1049
  State.regs[REG_A0 + REG0 (insn)] = value;
1050
 
1051
  z = ((value & 0xffff) == 0);
1052
  zx = (value == 0);
1053
  n = (value & 0x8000);
1054
  nx = (value & 0x800000);
1055
  c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1056
  cx = (reg1 > reg2);
1057
  v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1058
       && (reg2 & 0x8000) != (value & 0x8000));
1059
  vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1060
        && (reg2 & 0x800000) != (value & 0x800000));
1061
 
1062
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1063
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1064
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1065
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1066
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1067
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1068
}
1069
 
1070
/* sub imm16, dn */
1071
void OP_F71C0000 (insn, extension)
1072
     unsigned long insn, extension;
1073
{
1074
  int z, c, n, v, zx, cx, nx, vx;
1075
  unsigned long reg1, imm, value;
1076
 
1077
  reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
1078
  imm = TRUNC (SEXT16 (insn & 0xffff));
1079
  value = TRUNC (reg1 - imm);
1080
  State.regs[REG_D0 + REG0_16 (insn)] = value;
1081
 
1082
  z = ((value & 0xffff) == 0);
1083
  zx = (value == 0);
1084
  n = (value & 0x8000);
1085
  nx = (value & 0x800000);
1086
  c = ((reg1 & 0xffff) < (imm & 0xffff));
1087
  cx = (reg1 < imm);
1088
  v = ((reg1 & 0x8000) != (imm & 0x8000)
1089
       && (reg1 & 0x8000) != (value & 0x8000));
1090
  vx = ((reg1 & 0x800000) != (imm & 0x800000)
1091
        && (reg1 & 0x800000) != (value & 0x800000));
1092
 
1093
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1094
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1095
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1096
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1097
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1098
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1099
}
1100
 
1101
/* sub imm24, dn */
1102
void OP_F4680000 (insn, extension)
1103
     unsigned long insn, extension;
1104
{
1105
  int z, c, n, v, zx, cx, nx, vx;
1106
  unsigned long reg1, imm, value;
1107
 
1108
  reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
1109
  imm = TRUNC (((insn & 0xffff) << 8) + extension);
1110
  value = TRUNC (reg1 - imm);
1111
  State.regs[REG_D0 + REG0_16 (insn)] = value;
1112
 
1113
  z = ((value & 0xffff) == 0);
1114
  zx = (value == 0);
1115
  n = (value & 0x8000);
1116
  nx = (value & 0x800000);
1117
  c = ((reg1 & 0xffff) < (imm & 0xffff));
1118
  cx = (reg1 < imm);
1119
  v = ((reg1 & 0x8000) != (imm & 0x8000)
1120
       && (reg1 & 0x8000) != (value & 0x8000));
1121
  vx = ((reg1 & 0x800000) != (imm & 0x800000)
1122
        && (reg1 & 0x800000) != (value & 0x800000));
1123
 
1124
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1125
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1126
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1127
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1128
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1129
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1130
}
1131
 
1132
/* sub imm16, an */
1133
void OP_F70C0000 (insn, extension)
1134
     unsigned long insn, extension;
1135
{
1136
  int z, c, n, v, zx, cx, nx, vx;
1137
  unsigned long reg1, imm, value;
1138
 
1139
  reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
1140
  imm = TRUNC (SEXT16 (insn & 0xffff));
1141
  value = TRUNC (reg1 - imm);
1142
  State.regs[REG_A0 + REG0_16 (insn)] = value;
1143
 
1144
  z = ((value & 0xffff) == 0);
1145
  zx = (value == 0);
1146
  n = (value & 0x8000);
1147
  nx = (value & 0x800000);
1148
  c = ((reg1 & 0xffff) < (imm & 0xffff));
1149
  cx = (reg1 < imm);
1150
  v = ((reg1 & 0x8000) != (imm & 0x8000)
1151
       && (reg1 & 0x8000) != (value & 0x8000));
1152
  vx = ((reg1 & 0x800000) != (imm & 0x800000)
1153
        && (reg1 & 0x800000) != (value & 0x800000));
1154
 
1155
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1156
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1157
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1158
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1159
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1160
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1161
}
1162
 
1163
/* sub imm24, an */
1164
void OP_F46C0000 (insn, extension)
1165
     unsigned long insn, extension;
1166
{
1167
  int z, c, n, v, zx, cx, nx, vx;
1168
  unsigned long reg1, imm, value;
1169
 
1170
  reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
1171
  imm = TRUNC (((insn & 0xffff) << 8) + extension);
1172
  value = TRUNC (reg1 - imm);
1173
  State.regs[REG_A0 + REG0_16 (insn)] = value;
1174
 
1175
  z = ((value & 0xffff) == 0);
1176
  zx = (value == 0);
1177
  n = (value & 0x8000);
1178
  nx = (value & 0x800000);
1179
  c = ((reg1 & 0xffff) < (imm & 0xffff));
1180
  cx = (reg1 < imm);
1181
  v = ((reg1 & 0x8000) != (imm & 0x8000)
1182
       && (reg1 & 0x8000) != (value & 0x8000));
1183
  vx = ((reg1 & 0x800000) != (imm & 0x800000)
1184
        && (reg1 & 0x800000) != (value & 0x800000));
1185
 
1186
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1187
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1188
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1189
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1190
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1191
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1192
}
1193
 
1194
/* subc dm, dn */
1195
void OP_F290 (insn, extension)
1196
     unsigned long insn, extension;
1197
{
1198
  int z, c, n, v, zx, cx, nx, vx;
1199
  unsigned long reg1, reg2, value;
1200
 
1201
  reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
1202
  reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
1203
  value = TRUNC (reg2 - reg1 - ((PSW & PSW_CF) != 0));
1204
  State.regs[REG_D0 + REG0 (insn)] = value;
1205
 
1206
  z = ((value & 0xffff) == 0);
1207
  zx = (value == 0);
1208
  n = (value & 0x8000);
1209
  nx = (value & 0x800000);
1210
  c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1211
  cx = (reg1 > reg2);
1212
  v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1213
       && (reg2 & 0x8000) != (value & 0x8000));
1214
  vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1215
        && (reg2 & 0x800000) != (value & 0x800000));
1216
 
1217
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1218
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1219
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1220
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1221
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1222
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1223
}
1224
 
1225
/* mul dn, dm */
1226
void OP_F340 (insn, extension)
1227
     unsigned long insn, extension;
1228
{
1229
  unsigned long temp;
1230
  int n, z;
1231
 
1232
  temp = (SEXT16 (State.regs[REG_D0 + REG0 (insn)] & 0xffff)
1233
          *  SEXT16 ((State.regs[REG_D0 + REG1 (insn)] & 0xffff)));
1234
  State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffff;
1235
  State.regs[REG_MDR] = temp >> 16;
1236
  z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1237
  n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1238
  PSW &= ~(PSW_ZF | PSW_NF | PSW_VF);
1239
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1240
}
1241
 
1242
/* mulu dn, dm */
1243
void OP_F350 (insn, extension)
1244
     unsigned long insn, extension;
1245
{
1246
  unsigned long temp;
1247
  int n, z;
1248
 
1249
  temp = ((State.regs[REG_D0 + REG0 (insn)] & 0xffff)
1250
          *  (State.regs[REG_D0 + REG1 (insn)] & 0xffff));
1251
  State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffff;
1252
  State.regs[REG_MDR] = temp >> 16;
1253
  z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1254
  n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1255
  PSW &= ~(PSW_ZF | PSW_NF | PSW_VF);
1256
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1257
}
1258
 
1259
 
1260
/* divu dm, dn */
1261
void OP_F360 (insn, extension)
1262
     unsigned long insn, extension;
1263
{
1264
  unsigned long temp;
1265
  int n, z;
1266
 
1267
  temp = State.regs[REG_MDR];
1268
  temp &= 0xffff;
1269
  temp <<= 16;
1270
  temp |= (State.regs[REG_D0 + REG0 (insn)] & 0xffff);
1271
  State.regs[REG_MDR] = (temp
1272
                          % (unsigned long)(State.regs[REG_D0 + REG1 (insn)] & 0xffff));
1273
  temp /= (unsigned long)(State.regs[REG_D0 + REG1 (insn)] & 0xffff);
1274
  State.regs[REG_D0 + REG0 (insn)] = temp & 0xffff;
1275
  z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1276
  n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1277
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1278
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1279
}
1280
 
1281
/* cmp imm8, dn */
1282
void OP_D800 (insn, extension)
1283
     unsigned long insn, extension;
1284
{
1285
  int z, c, n, v, zx, cx, nx, vx;
1286
  unsigned long reg1, imm, value;
1287
 
1288
  reg1 = TRUNC (State.regs[REG_D0 + REG0_8 (insn)]);
1289
  imm = TRUNC (SEXT8 (insn & 0xff));
1290
  value = TRUNC (reg1 - imm);
1291
 
1292
  z = ((value & 0xffff) == 0);
1293
  zx = (value == 0);
1294
  n = (value & 0x8000);
1295
  nx = (value & 0x800000);
1296
  c = ((reg1 & 0xffff) < (imm & 0xffff));
1297
  cx = (reg1 < imm);
1298
  v = ((reg1 & 0x8000) != (imm & 0x8000)
1299
       && (reg1 & 0x8000) != (value & 0x8000));
1300
  vx = ((reg1 & 0x800000) != (imm & 0x800000)
1301
        && (reg1 & 0x800000) != (value & 0x800000));
1302
 
1303
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1304
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1305
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1306
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1307
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1308
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1309
}
1310
 
1311
/* cmp dn, dm */
1312
void OP_F390 (insn, extension)
1313
     unsigned long insn, extension;
1314
{
1315
  int z, c, n, v, zx, cx, nx, vx;
1316
  unsigned long reg1, reg2, value;
1317
 
1318
  reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
1319
  reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
1320
  value = TRUNC (reg2 - reg1);
1321
 
1322
  z = ((value & 0xffff) == 0);
1323
  zx = (value == 0);
1324
  n = (value & 0x8000);
1325
  nx = (value & 0x800000);
1326
  c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1327
  cx = (reg1 > reg2);
1328
  v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1329
       && (reg2 & 0x8000) != (value & 0x8000));
1330
  vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1331
        && (reg2 & 0x800000) != (value & 0x800000));
1332
 
1333
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1334
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1335
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1336
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1337
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1338
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1339
 
1340
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1341
  PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1342
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1343
}
1344
 
1345
/* cmp dm, an */
1346
void OP_F220 (insn, extension)
1347
     unsigned long insn, extension;
1348
{
1349
  int z, c, n, v, zx, cx, nx, vx;
1350
  unsigned long reg1, reg2, value;
1351
 
1352
  reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
1353
  reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
1354
  value = TRUNC (reg2 - reg1);
1355
 
1356
  z = ((value & 0xffff) == 0);
1357
  zx = (value == 0);
1358
  n = (value & 0x8000);
1359
  nx = (value & 0x800000);
1360
  c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1361
  cx = (reg1 > reg2);
1362
  v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1363
       && (reg2 & 0x8000) != (value & 0x8000));
1364
  vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1365
        && (reg2 & 0x800000) != (value & 0x800000));
1366
 
1367
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1368
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1369
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1370
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1371
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1372
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1373
 
1374
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1375
  PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1376
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1377
}
1378
 
1379
/* cmp an, dm */
1380
void OP_F2E0 (insn, extension)
1381
     unsigned long insn, extension;
1382
{
1383
  int z, c, n, v, zx, cx, nx, vx;
1384
  unsigned long reg1, reg2, value;
1385
 
1386
  reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
1387
  reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
1388
  value = TRUNC (reg2 - reg1);
1389
 
1390
  z = ((value & 0xffff) == 0);
1391
  zx = (value == 0);
1392
  n = (value & 0x8000);
1393
  nx = (value & 0x800000);
1394
  c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1395
  cx = (reg1 > reg2);
1396
  v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1397
       && (reg2 & 0x8000) != (value & 0x8000));
1398
  vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1399
        && (reg2 & 0x800000) != (value & 0x800000));
1400
 
1401
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1402
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1403
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1404
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1405
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1406
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1407
 
1408
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1409
  PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1410
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1411
}
1412
 
1413
/* cmp an, am */
1414
void OP_F260 (insn, extension)
1415
     unsigned long insn, extension;
1416
{
1417
  int z, c, n, v, zx, cx, nx, vx;
1418
  unsigned long reg1, reg2, value;
1419
 
1420
  reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
1421
  reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
1422
  value = TRUNC (reg2 - reg1);
1423
 
1424
  z = ((value & 0xffff) == 0);
1425
  zx = (value == 0);
1426
  n = (value & 0x8000);
1427
  nx = (value & 0x800000);
1428
  c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1429
  cx = (reg1 > reg2);
1430
  v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1431
       && (reg2 & 0x8000) != (value & 0x8000));
1432
  vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1433
        && (reg2 & 0x800000) != (value & 0x800000));
1434
 
1435
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1436
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1437
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1438
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1439
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1440
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1441
 
1442
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1443
  PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1444
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1445
}
1446
 
1447
/* cmp imm16, dn */
1448
void OP_F7480000 (insn, extension)
1449
     unsigned long insn, extension;
1450
{
1451
  int z, c, n, v, zx, cx, nx, vx;
1452
  unsigned long reg1, imm, value;
1453
 
1454
  reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
1455
  imm = TRUNC (SEXT16 (insn & 0xffff));
1456
  value = TRUNC (reg1 - imm);
1457
 
1458
  z = ((value & 0xffff) == 0);
1459
  zx = (value == 0);
1460
  n = (value & 0x8000);
1461
  nx = (value & 0x800000);
1462
  c = ((reg1 & 0xffff) < (imm & 0xffff));
1463
  cx = (reg1 < imm);
1464
  v = ((reg1 & 0x8000) != (imm & 0x8000)
1465
       && (reg1 & 0x8000) != (value & 0x8000));
1466
  vx = ((reg1 & 0x800000) != (imm & 0x800000)
1467
        && (reg1 & 0x800000) != (value & 0x800000));
1468
 
1469
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1470
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1471
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1472
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1473
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1474
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1475
 
1476
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1477
  PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1478
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1479
}
1480
 
1481
/* cmp imm24, dn */
1482
void OP_F4780000 (insn, extension)
1483
     unsigned long insn, extension;
1484
{
1485
  int z, c, n, v, zx, cx, nx, vx;
1486
  unsigned long reg1, imm, value;
1487
 
1488
  reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
1489
  imm = TRUNC (((insn & 0xffff) << 8) + extension);
1490
  value = TRUNC (reg1 - imm);
1491
 
1492
  z = ((value & 0xffff) == 0);
1493
  zx = (value == 0);
1494
  n = (value & 0x8000);
1495
  nx = (value & 0x800000);
1496
  c = ((reg1 & 0xffff) < (imm & 0xffff));
1497
  cx = (reg1 < imm);
1498
  v = ((reg1 & 0x8000) != (imm & 0x8000)
1499
       && (reg1 & 0x8000) != (value & 0x8000));
1500
  vx = ((reg1 & 0x800000) != (imm & 0x800000)
1501
        && (reg1 & 0x800000) != (value & 0x800000));
1502
 
1503
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1504
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1505
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1506
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1507
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1508
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1509
 
1510
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1511
  PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1512
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1513
}
1514
 
1515
/* cmp imm16, an */
1516
void OP_EC0000 (insn, extension)
1517
     unsigned long insn, extension;
1518
{
1519
  int z, c, n, v, zx, cx, nx, vx;
1520
  unsigned long reg1, imm, value;
1521
 
1522
  reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
1523
  imm = TRUNC (insn & 0xffff);
1524
  value = TRUNC (reg1 - imm);
1525
 
1526
  z = ((value & 0xffff) == 0);
1527
  zx = (value == 0);
1528
  n = (value & 0x8000);
1529
  nx = (value & 0x800000);
1530
  c = ((reg1 & 0xffff) < (imm & 0xffff));
1531
  cx = (reg1 < imm);
1532
  v = ((reg1 & 0x8000) != (imm & 0x8000)
1533
       && (reg1 & 0x8000) != (value & 0x8000));
1534
  vx = ((reg1 & 0x800000) != (imm & 0x800000)
1535
        && (reg1 & 0x800000) != (value & 0x800000));
1536
 
1537
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1538
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1539
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1540
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1541
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1542
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1543
 
1544
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1545
  PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1546
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1547
}
1548
 
1549
/* cmp imm24, an */
1550
void OP_F47C0000 (insn, extension)
1551
     unsigned long insn, extension;
1552
{
1553
  int z, c, n, v, zx, cx, nx, vx;
1554
  unsigned long reg1, imm, value;
1555
 
1556
  reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
1557
  imm = TRUNC (((insn & 0xffff) << 8) + extension);
1558
  value = TRUNC (reg1 - imm);
1559
 
1560
  z = ((value & 0xffff) == 0);
1561
  zx = (value == 0);
1562
  n = (value & 0x8000);
1563
  nx = (value & 0x800000);
1564
  c = ((reg1 & 0xffff) < (imm & 0xffff));
1565
  cx = (reg1 < imm);
1566
  v = ((reg1 & 0x8000) != (imm & 0x8000)
1567
       && (reg1 & 0x8000) != (value & 0x8000));
1568
  vx = ((reg1 & 0x800000) != (imm & 0x800000)
1569
        && (reg1 & 0x800000) != (value & 0x800000));
1570
 
1571
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1572
           | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1573
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1574
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1575
          | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1576
          | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1577
 
1578
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1579
  PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1580
          | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1581
}
1582
 
1583
/* and dn, dm */
1584
void OP_F300 (insn, extension)
1585
     unsigned long insn, extension;
1586
{
1587
  int n, z;
1588
  unsigned long temp;
1589
 
1590
  temp = State.regs[REG_D0 + REG0 (insn)] & State.regs[REG_D0 + REG1 (insn)];
1591
  temp &= 0xffff;
1592
  State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1593
  State.regs[REG_D0 + REG0 (insn)] |= temp;
1594
  z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1595
  n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1596
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1597
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1598
}
1599
 
1600
/* and imm8, dn */
1601
void OP_F50000 (insn, extension)
1602
     unsigned long insn, extension;
1603
{
1604
  int n, z;
1605
  unsigned long temp;
1606
 
1607
  temp = State.regs[REG_D0 + REG0_8 (insn)] & (insn & 0xff);
1608
  temp &= 0xffff;
1609
  State.regs[REG_D0 + REG0_8 (insn)] &= ~0xffff;
1610
  State.regs[REG_D0 + REG0_8 (insn)] |= temp;
1611
  z = (State.regs[REG_D0 + REG0_8 (insn)] & 0xffff) == 0;
1612
  n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x8000) != 0;
1613
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1614
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1615
}
1616
 
1617
/* and imm16, dn */
1618
void OP_F7000000 (insn, extension)
1619
     unsigned long insn, extension;
1620
{
1621
  int n, z;
1622
  unsigned long temp;
1623
 
1624
  temp = State.regs[REG_D0 + REG0_16 (insn)] & (insn & 0xffff);
1625
  temp &= 0xffff;
1626
  State.regs[REG_D0 + REG0_16 (insn)] &= ~0xffff;
1627
  State.regs[REG_D0 + REG0_16 (insn)] |= temp;
1628
  z = (State.regs[REG_D0 + REG0_16 (insn)] & 0xffff) == 0;
1629
  n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x8000) != 0;
1630
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1631
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1632
}
1633
 
1634
/* and imm16, psw */
1635
void OP_F7100000 (insn, extension)
1636
     unsigned long insn, extension;
1637
{
1638
  PSW &= (insn & 0xffff);
1639
}
1640
 
1641
/* or dn, dm */
1642
void OP_F310 (insn, extension)
1643
     unsigned long insn, extension;
1644
{
1645
  int n, z;
1646
  unsigned long temp;
1647
 
1648
  temp = State.regs[REG_D0 + REG0 (insn)] | State.regs[REG_D0 + REG1 (insn)];
1649
  temp &= 0xffff;
1650
  State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1651
  State.regs[REG_D0 + REG0 (insn)] |= temp;
1652
  z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1653
  n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1654
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1655
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1656
}
1657
 
1658
/* or imm8, dn */
1659
void OP_F50800 (insn, extension)
1660
     unsigned long insn, extension;
1661
{
1662
  int n, z;
1663
  unsigned long temp;
1664
 
1665
  temp = State.regs[REG_D0 + REG0_8 (insn)] | (insn & 0xff);
1666
  temp &= 0xffff;
1667
  State.regs[REG_D0 + REG0_8 (insn)] &= ~0xffff;
1668
  State.regs[REG_D0 + REG0_8 (insn)] |= temp;
1669
  z = (State.regs[REG_D0 + REG0_8 (insn)] & 0xffff) == 0;
1670
  n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x8000) != 0;
1671
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1672
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1673
}
1674
 
1675
/* or imm16, dn */
1676
void OP_F7400000 (insn, extension)
1677
     unsigned long insn, extension;
1678
{
1679
  int n, z;
1680
  unsigned long temp;
1681
 
1682
  temp = State.regs[REG_D0 + REG0_16 (insn)] | (insn & 0xffff);
1683
  temp &= 0xffff;
1684
  State.regs[REG_D0 + REG0_16 (insn)] &= ~0xffff;
1685
  State.regs[REG_D0 + REG0_16 (insn)] |= temp;
1686
  z = (State.regs[REG_D0 + REG0_16 (insn)] & 0xffff) == 0;
1687
  n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x8000) != 0;
1688
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1689
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1690
}
1691
 
1692
/* or imm16, psw */
1693
void OP_F7140000 (insn, extension)
1694
     unsigned long insn, extension;
1695
{
1696
  PSW |= (insn & 0xffff);
1697
}
1698
 
1699
/* xor dn, dm */
1700
void OP_F320 (insn, extension)
1701
     unsigned long insn, extension;
1702
{
1703
  int n, z;
1704
  unsigned long temp;
1705
 
1706
  temp = State.regs[REG_D0 + REG0 (insn)] ^ State.regs[REG_D0 + REG1 (insn)];
1707
  temp &= 0xffff;
1708
  State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1709
  State.regs[REG_D0 + REG0 (insn)] |= temp;
1710
  z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1711
  n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1712
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1713
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1714
}
1715
 
1716
/* xor imm16, dn */
1717
void OP_F74C0000 (insn, extension)
1718
     unsigned long insn, extension;
1719
{
1720
  int n, z;
1721
  unsigned long temp;
1722
 
1723
  temp = State.regs[REG_D0 + REG0_16 (insn)] ^ (insn & 0xffff);
1724
  temp &= 0xffff;
1725
  State.regs[REG_D0 + REG0_16 (insn)] &= ~0xffff;
1726
  State.regs[REG_D0 + REG0_16 (insn)] |= temp;
1727
  z = (State.regs[REG_D0 + REG0_16 (insn)] & 0xffff) == 0;
1728
  n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x8000) != 0;
1729
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1730
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1731
}
1732
 
1733
/* not dn */
1734
void OP_F3E4 (insn, extension)
1735
     unsigned long insn, extension;
1736
{
1737
  int n, z;
1738
  unsigned long temp;
1739
 
1740
  temp = ~State.regs[REG_D0 + REG0 (insn)];
1741
  temp &= 0xffff;
1742
  State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1743
  State.regs[REG_D0 + REG0 (insn)] |= temp;
1744
  z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1745
  n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1746
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1747
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1748
}
1749
 
1750
/* asr dn */
1751
void OP_F338 (insn, extension)
1752
     unsigned long insn, extension;
1753
{
1754
  long temp;
1755
  int z, n, c, high;
1756
 
1757
  temp = State.regs[REG_D0 + REG0 (insn)] & 0xffff;
1758
  c = temp & 1;
1759
  high = temp & 0x8000;
1760
  temp >>= 1;
1761
  temp |= high;
1762
  temp &= 0xffff;
1763
  State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1764
  State.regs[REG_D0 + REG0 (insn)] |= temp;
1765
  z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1766
  n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1767
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF);
1768
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0) | (c ? PSW_CF : 0));
1769
}
1770
 
1771
/* lsr dn */
1772
void OP_F33C (insn, extension)
1773
     unsigned long insn, extension;
1774
{
1775
  int z, n, c;
1776
  long temp;
1777
 
1778
  temp = State.regs[REG_D0 + REG0 (insn)] & 0xffff;
1779
  c = temp & 1;
1780
  temp >>= 1;
1781
  temp &= 0xffff;
1782
  State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1783
  State.regs[REG_D0 + REG0 (insn)] |= temp;
1784
  z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1785
  n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1786
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF);
1787
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0) | (c ? PSW_CF : 0));
1788
}
1789
 
1790
/* ror dn */
1791
void OP_F334 (insn, extension)
1792
     unsigned long insn, extension;
1793
{
1794
  unsigned long value;
1795
  int c,n,z;
1796
 
1797
  value = State.regs[REG_D0 + REG0 (insn)] & 0xffff;
1798
  c = (value & 0x1);
1799
 
1800
  value >>= 1;
1801
  value |= (PSW & PSW_CF ? 0x8000 : 0);
1802
  value &= 0xffff;
1803
  State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1804
  State.regs[REG_D0 + REG0 (insn)] |= value;
1805
  z = (value == 0);
1806
  n = (value & 0x8000) != 0;
1807
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1808
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0) | (c ? PSW_CF : 0));
1809
}
1810
 
1811
/* rol dn */
1812
void OP_F330 (insn, extension)
1813
     unsigned long insn, extension;
1814
{
1815
  unsigned long value;
1816
  int c,n,z;
1817
 
1818
  value = State.regs[REG_D0 + REG0 (insn)] & 0xffff;
1819
  c = (value & 0x8000) ? 1 : 0;
1820
 
1821
  value <<= 1;
1822
  value |= (PSW & PSW_CF ? 0x1 : 0);
1823
  value &= 0xffff;
1824
  State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1825
  State.regs[REG_D0 + REG0 (insn)] |= value;
1826
  z = (value == 0);
1827
  n = (value & 0x8000) != 0;
1828
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1829
  PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0) | (c ? PSW_CF : 0));
1830
}
1831
 
1832
/* btst imm8, dn */
1833
void OP_F50400 (insn, extension)
1834
     unsigned long insn, extension;
1835
{
1836
  unsigned long temp;
1837
  int z;
1838
 
1839
  temp = State.regs[REG_D0 + REG0_8 (insn)];
1840
  temp &= (insn & 0xff);
1841
  z = (temp == 0);
1842
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1843
  PSW |= (z ? PSW_ZF : 0);
1844
}
1845
 
1846
/* btst imm16, dn */
1847
void OP_F7040000 (insn, extension)
1848
     unsigned long insn, extension;
1849
{
1850
  unsigned long temp;
1851
  int z, n, c;
1852
 
1853
  temp = State.regs[REG_D0 + REG0_16 (insn)];
1854
  c = temp & 0x1;
1855
  temp &= (insn & 0xffff);
1856
  n = (temp & 0x8000) != 0;
1857
  z = (temp == 0);
1858
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1859
  PSW |= (z ? PSW_ZF : 0) | (n ? PSW_NF : 0) | (c ? PSW_CF : 0);
1860
}
1861
 
1862
/* bset dm, (an) */
1863
void OP_F020 (insn, extension)
1864
     unsigned long insn, extension;
1865
{
1866
  unsigned long temp;
1867
  int z;
1868
 
1869
  temp = load_byte (State.regs[REG_A0 + REG1 (insn)]);
1870
  z = (temp & State.regs[REG_D0 + REG0 (insn)]) == 0;
1871
  temp |= State.regs[REG_D0 + REG0 (insn)];
1872
  store_byte (State.regs[REG_A0 + REG1 (insn)], temp);
1873
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1874
  PSW |= (z ? PSW_ZF : 0);
1875
}
1876
 
1877
/* bclr dm, (an) */
1878
void OP_F030 (insn, extension)
1879
     unsigned long insn, extension;
1880
{
1881
  unsigned long temp;
1882
  int z;
1883
 
1884
  temp = load_byte (State.regs[REG_A0 + REG1 (insn)]);
1885
  z = (temp & State.regs[REG_D0 + REG0 (insn)]) == 0;
1886
  temp = temp & ~State.regs[REG_D0 + REG0 (insn)];
1887
  store_byte (State.regs[REG_A0 + REG1 (insn)], temp);
1888
  PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1889
  PSW |= (z ? PSW_ZF : 0);
1890
}
1891
 
1892
/* beqx label:8 */
1893
void OP_F5E800 (insn, extension)
1894
     unsigned long insn, extension;
1895
{
1896
  /* The dispatching code will add 3 after we return, so
1897
     we subtract two here to make things right.  */
1898
  if (PSW & PSW_ZX)
1899
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1900
}
1901
 
1902
/* bnex label:8 */
1903
void OP_F5E900 (insn, extension)
1904
     unsigned long insn, extension;
1905
{
1906
  /* The dispatching code will add 3 after we return, so
1907
     we subtract two here to make things right.  */
1908
  if (!(PSW & PSW_ZX))
1909
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1910
}
1911
 
1912
/* bgtx label:8 */
1913
void OP_F5E100 (insn, extension)
1914
     unsigned long insn, extension;
1915
{
1916
  /* The dispatching code will add 3 after we return, so
1917
     we subtract two here to make things right.  */
1918
  if (!((PSW & PSW_ZX)
1919
        || (((PSW & PSW_NX) != 0) ^ ((PSW & PSW_VX) != 0))))
1920
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1921
}
1922
 
1923
/* bgex label:8 */
1924
void OP_F5E200 (insn, extension)
1925
     unsigned long insn, extension;
1926
{
1927
  /* The dispatching code will add 3 after we return, so
1928
     we subtract two here to make things right.  */
1929
  if (!(((PSW & PSW_NX) != 0) ^ ((PSW & PSW_VX) != 0)))
1930
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1931
}
1932
 
1933
/* blex label:8 */
1934
void OP_F5E300 (insn, extension)
1935
     unsigned long insn, extension;
1936
{
1937
  /* The dispatching code will add 3 after we return, so
1938
     we subtract two here to make things right.  */
1939
  if ((PSW & PSW_ZX)
1940
       || (((PSW & PSW_NX) != 0) ^ ((PSW & PSW_VX) != 0)))
1941
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1942
}
1943
 
1944
/* bltx label:8 */
1945
void OP_F5E000 (insn, extension)
1946
     unsigned long insn, extension;
1947
{
1948
  /* The dispatching code will add 3 after we return, so
1949
     we subtract two here to make things right.  */
1950
  if (((PSW & PSW_NX) != 0) ^ ((PSW & PSW_VX) != 0))
1951
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1952
}
1953
 
1954
/* bhix label:8 */
1955
void OP_F5E500 (insn, extension)
1956
     unsigned long insn, extension;
1957
{
1958
  /* The dispatching code will add 3 after we return, so
1959
     we subtract two here to make things right.  */
1960
  if (!(((PSW & PSW_CX) != 0) || (PSW & PSW_ZX) != 0))
1961
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1962
}
1963
 
1964
/* bccx label:8 */
1965
void OP_F5E600 (insn, extension)
1966
     unsigned long insn, extension;
1967
{
1968
  /* The dispatching code will add 3 after we return, so
1969
     we subtract two here to make things right.  */
1970
  if (!(PSW & PSW_CX))
1971
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1972
}
1973
 
1974
/* blsx label:8 */
1975
void OP_F5E700 (insn, extension)
1976
     unsigned long insn, extension;
1977
{
1978
  /* The dispatching code will add 3 after we return, so
1979
     we subtract two here to make things right.  */
1980
  if (((PSW & PSW_CX) != 0) || (PSW & PSW_ZX) != 0)
1981
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1982
}
1983
 
1984
/* bcsx label:8 */
1985
void OP_F5E400 (insn, extension)
1986
     unsigned long insn, extension;
1987
{
1988
  /* The dispatching code will add 3 after we return, so
1989
     we subtract two here to make things right.  */
1990
  if (PSW & PSW_CX)
1991
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1992
}
1993
 
1994
/* bvcx label:8 */
1995
void OP_F5EC00 (insn, extension)
1996
     unsigned long insn, extension;
1997
{
1998
  /* The dispatching code will add 3 after we return, so
1999
     we subtract two here to make things right.  */
2000
  if (!(PSW & PSW_VX))
2001
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2002
}
2003
 
2004
/* bvsx label:8 */
2005
void OP_F5ED00 (insn, extension)
2006
     unsigned long insn, extension;
2007
{
2008
  /* The dispatching code will add 3 after we return, so
2009
     we subtract two here to make things right.  */
2010
  if (PSW & PSW_VX)
2011
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2012
}
2013
 
2014
/* bncx label:8 */
2015
void OP_F5EE00 (insn, extension)
2016
     unsigned long insn, extension;
2017
{
2018
  /* The dispatching code will add 3 after we return, so
2019
     we subtract two here to make things right.  */
2020
  if (!(PSW & PSW_NX))
2021
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2022
}
2023
 
2024
/* bnsx label:8 */
2025
void OP_F5EF00 (insn, extension)
2026
     unsigned long insn, extension;
2027
{
2028
  /* The dispatching code will add 3 after we return, so
2029
     we subtract two here to make things right.  */
2030
  if (PSW & PSW_NX)
2031
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2032
}
2033
 
2034
/* beq label:8 */
2035
void OP_E800 (insn, extension)
2036
     unsigned long insn, extension;
2037
{
2038
  /* The dispatching code will add 2 after we return, so
2039
     we subtract two here to make things right.  */
2040
  if (PSW & PSW_ZF)
2041
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2042
}
2043
 
2044
/* bne label:8 */
2045
void OP_E900 (insn, extension)
2046
     unsigned long insn, extension;
2047
{
2048
  /* The dispatching code will add 2 after we return, so
2049
     we subtract two here to make things right.  */
2050
  if (!(PSW & PSW_ZF))
2051
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2052
}
2053
 
2054
/* bgt label:8 */
2055
void OP_E100 (insn, extension)
2056
     unsigned long insn, extension;
2057
{
2058
  /* The dispatching code will add 2 after we return, so
2059
     we subtract two here to make things right.  */
2060
  if (!((PSW & PSW_ZF)
2061
        || (((PSW & PSW_NF) != 0) ^ ((PSW & PSW_VF) != 0))))
2062
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2063
}
2064
 
2065
/* bge label:8 */
2066
void OP_E200 (insn, extension)
2067
     unsigned long insn, extension;
2068
{
2069
  /* The dispatching code will add 2 after we return, so
2070
     we subtract two here to make things right.  */
2071
  if (!(((PSW & PSW_NF) != 0) ^ ((PSW & PSW_VF) != 0)))
2072
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2073
}
2074
 
2075
/* ble label:8 */
2076
void OP_E300 (insn, extension)
2077
     unsigned long insn, extension;
2078
{
2079
  /* The dispatching code will add 2 after we return, so
2080
     we subtract two here to make things right.  */
2081
  if ((PSW & PSW_ZF)
2082
       || (((PSW & PSW_NF) != 0) ^ ((PSW & PSW_VF) != 0)))
2083
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2084
}
2085
 
2086
/* blt label:8 */
2087
void OP_E000 (insn, extension)
2088
     unsigned long insn, extension;
2089
{
2090
  /* The dispatching code will add 2 after we return, so
2091
     we subtract two here to make things right.  */
2092
  if (((PSW & PSW_NF) != 0) ^ ((PSW & PSW_VF) != 0))
2093
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2094
}
2095
 
2096
/* bhi label:8 */
2097
void OP_E500 (insn, extension)
2098
     unsigned long insn, extension;
2099
{
2100
  /* The dispatching code will add 2 after we return, so
2101
     we subtract two here to make things right.  */
2102
  if (!(((PSW & PSW_CF) != 0) || (PSW & PSW_ZF) != 0))
2103
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2104
}
2105
 
2106
/* bcc label:8 */
2107
void OP_E600 (insn, extension)
2108
     unsigned long insn, extension;
2109
{
2110
  /* The dispatching code will add 2 after we return, so
2111
     we subtract two here to make things right.  */
2112
  if (!(PSW & PSW_CF))
2113
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2114
}
2115
 
2116
/* bls label:8 */
2117
void OP_E700 (insn, extension)
2118
     unsigned long insn, extension;
2119
{
2120
  /* The dispatching code will add 2 after we return, so
2121
     we subtract two here to make things right.  */
2122
  if (((PSW & PSW_CF) != 0) || (PSW & PSW_ZF) != 0)
2123
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2124
}
2125
 
2126
/* bcs label:8 */
2127
void OP_E400 (insn, extension)
2128
     unsigned long insn, extension;
2129
{
2130
  /* The dispatching code will add 2 after we return, so
2131
     we subtract two here to make things right.  */
2132
  if (PSW & PSW_CF)
2133
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2134
}
2135
 
2136
/* bvc label:8 */
2137
void OP_F5FC00 (insn, extension)
2138
     unsigned long insn, extension;
2139
{
2140
  /* The dispatching code will add 3 after we return, so
2141
     we subtract two here to make things right.  */
2142
  if (!(PSW & PSW_VF))
2143
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2144
}
2145
 
2146
/* bvs label:8 */
2147
void OP_F5FD00 (insn, extension)
2148
     unsigned long insn, extension;
2149
{
2150
  /* The dispatching code will add 3 after we return, so
2151
     we subtract two here to make things right.  */
2152
  if (PSW & PSW_VF)
2153
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2154
}
2155
 
2156
/* bnc label:8 */
2157
void OP_F5FE00 (insn, extension)
2158
     unsigned long insn, extension;
2159
{
2160
  /* The dispatching code will add 3 after we return, so
2161
     we subtract two here to make things right.  */
2162
  if (!(PSW & PSW_NF))
2163
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2164
}
2165
 
2166
/* bns label:8 */
2167
void OP_F5FF00 (insn, extension)
2168
     unsigned long insn, extension;
2169
{
2170
  /* The dispatching code will add 3 after we return, so
2171
     we subtract two here to make things right.  */
2172
  if (PSW & PSW_NF)
2173
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2174
}
2175
 
2176
/* bra label:8 */
2177
void OP_EA00 (insn, extension)
2178
     unsigned long insn, extension;
2179
{
2180
  /* The dispatching code will add 2 after we return, so
2181
     we subtract two here to make things right.  */
2182
    State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2183
}
2184
 
2185
/* jmp (an) */
2186
void OP_F000 (insn, extension)
2187
     unsigned long insn, extension;
2188
{
2189
  State.regs[REG_PC] = TRUNC (State.regs[REG_A0 + REG1 (insn)] - 2);
2190
}
2191
 
2192
/* jmp label:16 */
2193
void OP_FC0000 (insn, extension)
2194
     unsigned long insn, extension;
2195
{
2196
  State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT16 (insn & 0xffff));
2197
}
2198
 
2199
/* jmp label:24 */
2200
void OP_F4E00000 (insn, extension)
2201
     unsigned long insn, extension;
2202
{
2203
  State.regs[REG_PC]
2204
    = TRUNC (State.regs[REG_PC] + (((insn & 0xffff) << 8) + extension));
2205
}
2206
 
2207
/* jsr (an) */
2208
void OP_F001 (insn, extension)
2209
     unsigned long insn, extension;
2210
{
2211
  unsigned int next_pc, sp;
2212
 
2213
  sp = State.regs[REG_SP];
2214
  sp -= 4;
2215
  State.regs[REG_SP] = sp;
2216
  next_pc = State.regs[REG_PC] + 2;
2217
  State.mem[sp] = next_pc & 0xff;
2218
  State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2219
  State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2220
  State.regs[REG_PC] = TRUNC (State.regs[REG_A0 + REG1 (insn)] - 2);
2221
}
2222
 
2223
/* jsr label:16 */
2224
void OP_FD0000 (insn, extension)
2225
     unsigned long insn, extension;
2226
{
2227
  unsigned int next_pc, sp;
2228
 
2229
  sp = State.regs[REG_SP];
2230
  sp -= 4;
2231
  State.regs[REG_SP] = sp;
2232
  next_pc = State.regs[REG_PC] + 3;
2233
  State.mem[sp] = next_pc & 0xff;
2234
  State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2235
  State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2236
  State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT16 (insn & 0xffff));
2237
}
2238
 
2239
/* jsr label:24 */
2240
void OP_F4E10000 (insn, extension)
2241
     unsigned long insn, extension;
2242
{
2243
  unsigned int next_pc, sp;
2244
 
2245
  sp = State.regs[REG_SP];
2246
  sp -= 4;
2247
  State.regs[REG_SP] = sp;
2248
  next_pc = State.regs[REG_PC] + 5;
2249
  State.mem[sp] = next_pc & 0xff;
2250
  State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2251
  State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2252
  State.regs[REG_PC]
2253
    = TRUNC (State.regs[REG_PC] + (((insn & 0xffff) << 8) + extension));
2254
}
2255
 
2256
/* rts */
2257
void OP_FE (insn, extension)
2258
     unsigned long insn, extension;
2259
{
2260
  unsigned int sp;
2261
 
2262
  sp = State.regs[REG_SP];
2263
  State.regs[REG_PC] = (State.mem[sp] | (State.mem[sp+1] << 8)
2264
              | (State.mem[sp+2] << 16));
2265
  State.regs[REG_PC] -= 1;
2266
  State.regs[REG_SP] += 4;
2267
}
2268
 
2269
/* rti */
2270
void OP_EB (insn, extension)
2271
     unsigned long insn, extension;
2272
{
2273
  PSW = load_half (State.regs[REG_A0 + 3]);
2274
  State.regs[REG_PC] = load_3_byte (State.regs[REG_A0 + 3] + 2) - 1;
2275
  State.regs[REG_A0 + 3] += 6;
2276
}
2277
 
2278
/* syscall */
2279
void OP_F010 (insn, extension)
2280
     unsigned long insn, extension;
2281
{
2282
  /* We use this for simulated system calls; we may need to change
2283
     it to a reserved instruction if we conflict with uses at
2284
     Matsushita.  */
2285
  int save_errno = errno;
2286
  int offset = 6;
2287
  errno = 0;
2288
 
2289
/* Registers passed to syscall 0 */
2290
 
2291
/* Function number.  */
2292
#define FUNC   (State.regs[0])
2293
 
2294
#define PARM1  (State.regs[1])
2295
 
2296
/* Parameters.  */
2297
#define PARM(x, y) (load_mem (State.regs[REG_SP] + x, y))
2298
 
2299
/* Registers set by syscall 0 */
2300
 
2301
#define RETVAL State.regs[0]    /* return value */
2302
#define RETERR State.regs[1]    /* return error code */
2303
 
2304
/* Turn a pointer in a register into a pointer into real memory. */
2305
 
2306
#define MEMPTR(x) (State.mem + (x & 0xffffff))
2307
 
2308
  switch (FUNC)
2309
    {
2310
#if !defined(__GO32__) && !defined(_WIN32)
2311
#ifdef TARGET_SYS_fork
2312
      case TARGET_SYS_fork:
2313
      RETVAL = fork ();
2314
      break;
2315
#endif
2316
#ifdef TARGET_SYS_execve
2317
    case TARGET_SYS_execve:
2318
      RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM (4, 4)),
2319
                       (char **)MEMPTR (PARM (8, 4)));
2320
      break;
2321
#endif
2322
#ifdef TARGET_SYS_execv
2323
    case TARGET_SYS_execv:
2324
      RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM (4, 4)), NULL);
2325
      break;
2326
#endif
2327
#endif
2328
 
2329
    case TARGET_SYS_read:
2330
      RETVAL = mn10200_callback->read (mn10200_callback, PARM1,
2331
                                       MEMPTR (PARM (4, 4)), PARM (8, 4));
2332
      break;
2333
    case TARGET_SYS_write:
2334
      RETVAL = (int)mn10200_callback->write (mn10200_callback, PARM1,
2335
                                             MEMPTR (PARM (4, 4)),
2336
                                             PARM (8, 4));
2337
      break;
2338
    case TARGET_SYS_lseek:
2339
      RETVAL = mn10200_callback->lseek (mn10200_callback, PARM1,
2340
                                        PARM (4, 4), PARM (8, 2));
2341
      break;
2342
    case TARGET_SYS_close:
2343
      RETVAL = mn10200_callback->close (mn10200_callback, PARM1);
2344
      break;
2345
    case TARGET_SYS_open:
2346
      RETVAL = mn10200_callback->open (mn10200_callback, MEMPTR (PARM1),
2347
                                       PARM (4, 2));
2348
      break;
2349
    case TARGET_SYS_exit:
2350
      /* EXIT - caller can look in PARM1 to work out the
2351
         reason */
2352
      if (PARM1 == 0xdead)
2353
        State.exception = SIGABRT;
2354
      else
2355
        State.exception = SIGQUIT;
2356
      State.exited = 1;
2357
      break;
2358
 
2359
    case TARGET_SYS_stat:       /* added at hmsi */
2360
      /* stat system call */
2361
      {
2362
        struct stat host_stat;
2363
        reg_t buf;
2364
 
2365
        RETVAL = stat (MEMPTR (PARM1), &host_stat);
2366
 
2367
        buf = PARM (4, 4);
2368
 
2369
        /* Just wild-assed guesses.  */
2370
        store_half (buf, host_stat.st_dev);
2371
        store_half (buf + 2, host_stat.st_ino);
2372
        store_word (buf + 4, host_stat.st_mode);
2373
        store_half (buf + 8, host_stat.st_nlink);
2374
        store_half (buf + 10, host_stat.st_uid);
2375
        store_half (buf + 12, host_stat.st_gid);
2376
        store_half (buf + 14, host_stat.st_rdev);
2377
        store_word (buf + 16, host_stat.st_size);
2378
        store_word (buf + 20, host_stat.st_atime);
2379
        store_word (buf + 28, host_stat.st_mtime);
2380
        store_word (buf + 36, host_stat.st_ctime);
2381
      }
2382
      break;
2383
 
2384
#ifdef TARGET_SYS_chown
2385
    case TARGET_SYS_chown:
2386
      RETVAL = chown (MEMPTR (PARM1), PARM (4, 2), PARM (6, 2));
2387
      break;
2388
#endif
2389
    case TARGET_SYS_chmod:
2390
      RETVAL = chmod (MEMPTR (PARM1), PARM (4, 2));
2391
      break;
2392
#ifdef TARGET_SYS_time
2393
    case TARGET_SYS_time:
2394
      RETVAL = time ((time_t *)MEMPTR (PARM1));
2395
      break;
2396
#endif
2397
#ifdef TARGET_SYS_times
2398
    case TARGET_SYS_times:
2399
      {
2400
        struct tms tms;
2401
        RETVAL = times (&tms);
2402
        store_word (PARM1, tms.tms_utime);
2403
        store_word (PARM1 + 4, tms.tms_stime);
2404
        store_word (PARM1 + 8, tms.tms_cutime);
2405
        store_word (PARM1 + 12, tms.tms_cstime);
2406
        break;
2407
      }
2408
#endif
2409
#ifdef TARGET_SYS_gettimeofday
2410
    case TARGET_SYS_gettimeofday:
2411
      {
2412
        struct timeval t;
2413
        struct timezone tz;
2414
        RETVAL = gettimeofday (&t, &tz);
2415
        store_word (PARM1, t.tv_sec);
2416
        store_word (PARM1 + 4, t.tv_usec);
2417
        store_word (PARM (4, 4), tz.tz_minuteswest);
2418
        store_word (PARM (4, 4) + 4, tz.tz_dsttime);
2419
        break;
2420
      }
2421
#endif
2422
#ifdef TARGET_SYS_utime
2423
    case TARGET_SYS_utime:
2424
      /* Cast the second argument to void *, to avoid type mismatch
2425
         if a prototype is present.  */
2426
      RETVAL = utime (MEMPTR (PARM1), (void *) MEMPTR (PARM (4, 4)));
2427
      break;
2428
#endif
2429
    default:
2430
      abort ();
2431
    }
2432
  RETERR = errno;
2433
  errno = save_errno;
2434
}
2435
 
2436
/* nop */
2437
void OP_F6 (insn, extension)
2438
     unsigned long insn, extension;
2439
{
2440
}
2441
 
2442
/* breakpoint */
2443
void
2444
OP_FF (insn, extension)
2445
     unsigned long insn, extension;
2446
{
2447
  State.exception = SIGTRAP;
2448
  PC -= 1;
2449
}

powered by: WebSVN 2.1.0

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