Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1186 savelij 1
/* code65.c */
2
/*****************************************************************************/
3
/* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
4
/*                                                                           */
5
/* AS                                                                        */
6
/*                                                                           */
7
/* Code Generator 65xx/MELPS740                                              */
8
/*                                                                           */
9
/*****************************************************************************/
10
 
11
#include "stdinc.h"
12
#include <string.h>
13
#include <ctype.h>
14
 
15
#include "bpemu.h"
16
#include "strutil.h"
17
#include "asmdef.h"
18
#include "asmpars.h"
19
#include "asmsub.h"
20
#include "asmitree.h"
21
#include "codepseudo.h"
22
#include "motpseudo.h"
23
#include "intpseudo.h"
24
#include "codevars.h"
25
#include "errmsg.h"
26
 
27
#include "code65.h"
28
 
29
/*---------------------------------------------------------------------------*/
30
 
31
enum
32
{
33
  ModZA    = 0,   /* aa */
34
  ModA     = 1,   /* aabb */
35
  ModZIX   = 2,   /* aa,X */
36
  ModIX    = 3,   /* aabb,X */
37
  ModZIY   = 4,   /* aa,Y */
38
  ModIY    = 5,   /* aabb,Y */
39
  ModIndIX = 6,   /* (aa,X) */
40
  ModIndOX = 7,   /* (aa),X */
41
  ModIndOY = 8,   /* (aa),Y */
42
  ModIndOZ = 9,   /* (aa),Z (65CE02-specific) */
43
  ModInd16 =10,   /* (aabb) */
44
  ModImm   =11,   /* #aa */
45
  ModAcc   =12,   /* A */
46
  ModNone  =13,   /* */
47
  ModInd8  =14,   /* (aa) */
48
  ModIndSPY=15,   /* (aa,SP),Y (65CE02-specific) */
49
  ModSpec = 16    /* \aabb */
50
};
51
 
52
typedef struct
53
{
54
  Word CPUFlag;
55
  Byte Code;
56
} FixedOrder;
57
 
58
typedef struct
59
{
60
  LongInt Codes[ModSpec + 1];
61
} NormOrder;
62
 
63
typedef struct
64
{
65
  Word CPUFlag;
66
  Byte CodeShort, CodeLong;
67
} CondOrder;
68
 
69
typedef struct
70
{
71
  ShortInt ErgMode;
72
  int AdrCnt;
73
  Byte AdrVals[2];
74
} tAdrResult;
75
 
76
/* NOTE: keep in the same order as in registration in code65_init()! */
77
 
78
#define M_6502      (1 << 0)
79
#define M_65SC02    (1 << 1)
80
#define M_65C02     (1 << 2)
81
#define M_65CE02    (1 << 3)
82
#define M_W65C02S   (1 << 4)
83
#define M_65C19     (1 << 5)
84
#define M_MELPS740  (1 << 6)
85
#define M_HUC6280   (1 << 7)
86
#define M_6502U     (1 << 8)
87
 
88
static Boolean This_CLI_SEI_Flag, This_ADC_SBC_Flag,
89
               Last_CLI_SEI_Flag, Last_ADC_SBC_Flag;
90
 
91
static FixedOrder *FixedOrders;
92
static NormOrder *NormOrders;
93
static CondOrder *CondOrders;
94
 
95
static CPUVar CPU6502, CPU65SC02, CPU65C02, CPU65CE02, CPUW65C02S, CPU65C19, CPUM740, CPUHUC6280, CPU6502U;
96
static LongInt SpecPage, RegB, MPR[8];
97
 
98
/*---------------------------------------------------------------------------*/
99
 
100
static unsigned ChkZero(const tStrComp *pArg, Byte *erg)
101
{
102
 if ((strlen(pArg->str.p_str) > 1) && ((*pArg->str.p_str == '<') || (*pArg->str.p_str == '>')))
103
 {
104
   *erg = Ord(*pArg->str.p_str == '<') + 1;
105
   return 1;
106
 }
107
 else
108
 {
109
   *erg = 0;
110
   return 0;
111
 }
112
}
113
 
114
static Boolean CPUAllowed(Word Flag)
115
{
116
  return (((Flag >> (MomCPU - CPU6502)) & 1) || False);
117
}
118
 
119
static void InsNOP(void)
120
{
121
  memmove(BAsmCode, BAsmCode + 1, CodeLen);
122
  CodeLen++;
123
  BAsmCode[0] = NOPCode;
124
}
125
 
126
static Boolean IsAllowed(LongInt Val)
127
{
128
  return (CPUAllowed(Val >> 8) && (Val != -1));
129
}
130
 
131
static void ChkZeroMode(tAdrResult *pResult, const NormOrder *pOrder, ShortInt ZeroMode)
132
{
133
  if (pOrder && (IsAllowed(pOrder->Codes[ZeroMode])))
134
  {
135
    pResult->ErgMode = ZeroMode;
136
    pResult->AdrCnt--;
137
  }
138
}
139
 
140
/*---------------------------------------------------------------------------*/
141
 
142
static Word EvalAddress(const tStrComp *pArg, IntType Type, Boolean *pOK)
143
{
144
  /* for the HUC6280, check if the address is within one of the selected pages */
145
 
146
  if (MomCPU == CPUHUC6280)
147
  {
148
    Word Page;
149
    LongWord AbsAddress;
150
    tSymbolFlags Flags;
151
 
152
    /* get the absolute address */
153
 
154
    AbsAddress = EvalStrIntExpressionWithFlags(pArg, UInt21, pOK, &Flags);
155
    if (!*pOK)
156
      return 0;
157
 
158
    /* within one of the 8K pages? */
159
 
160
    for (Page = 0; Page < 8; Page++)
161
      if ((LargeInt)((AbsAddress >> 13) & 255) == MPR[Page])
162
        break;
163
    if (Page >= 8)
164
    {
165
      WrError(ErrNum_InAccPage);
166
      AbsAddress &= 0x1fff;
167
    }
168
    else
169
      AbsAddress = (AbsAddress & 0x1fff) | (Page << 13);
170
 
171
    /* short address requested? */
172
 
173
    if ((Type != UInt16) && (Type != Int16) && Hi(AbsAddress))
174
    {
175
      if (mFirstPassUnknown(Flags))
176
        AbsAddress &= 0xff;
177
      else
178
      {
179
        *pOK = False;
180
        WrError(ErrNum_OverRange);
181
      }
182
    }
183
    return AbsAddress;
184
  }
185
 
186
  /* for the 65CE02, regard basepage register */
187
 
188
  else if (MomCPU == CPU65CE02)
189
  {
190
    Word Address;
191
    tSymbolFlags Flags;
192
 
193
    /* alwys get a full 16 bit address */
194
 
195
    Address = EvalStrIntExpressionWithFlags(pArg, UInt16, pOK, &Flags);
196
    if (!*pOK)
197
      return 0;
198
 
199
    /* short address requested? */
200
 
201
    if ((Type != UInt16) && (Type != Int16))
202
    {
203
      if ((Hi(Address) != RegB) && !mFirstPassUnknown(Flags))
204
      {
205
        *pOK = False;
206
        WrError(ErrNum_OverRange);
207
      }
208
      if (*pOK)
209
        Address &= 0xff;
210
    }
211
    return Address;
212
  }
213
 
214
  else
215
    return EvalStrIntExpression(pArg, Type, pOK);
216
}
217
 
218
static Boolean IsBasePage(Byte Page)
219
{
220
  return (MomCPU == CPU65CE02) ? (Page == RegB) : !Page;
221
}
222
 
223
static void DecodeAdr(tAdrResult *pResult, const NormOrder *pOrder)
224
{
225
  Word AdrWord;
226
  Boolean ValOK;
227
  Byte ZeroMode;
228
 
229
  /* normale Anweisungen: Adressausdruck parsen */
230
 
231
  pResult->ErgMode = -1;
232
 
233
  if (ArgCnt == 0)
234
  {
235
    pResult->AdrCnt = 0;
236
    pResult->ErgMode = ModNone;
237
  }
238
 
239
  else if (ArgCnt == 1)
240
  {
241
    /* 1. Akkuadressierung */
242
 
243
    if (!as_strcasecmp(ArgStr[1].str.p_str, "A"))
244
    {
245
      pResult->AdrCnt = 0;
246
      pResult->ErgMode = ModAcc;
247
    }
248
 
249
    /* 2. immediate ? */
250
 
251
    else if (*ArgStr[1].str.p_str == '#')
252
    {
253
      IntType Type = Memo("PHW") ? Int16 : Int8;
254
      Word Value;
255
 
256
      Value = EvalStrIntExpressionOffs(&ArgStr[1], 1, Type, &ValOK);
257
      if (ValOK)
258
      {
259
        pResult->ErgMode = ModImm;
260
        pResult->AdrVals[0] = Lo(Value);
261
        pResult->AdrCnt = 1;
262
        if (Int16 == Type)
263
          pResult->AdrVals[pResult->AdrCnt++] = Hi(Value);
264
      }
265
    }
266
 
267
    /* 3. Special Page ? */
268
 
269
    else if (*ArgStr[1].str.p_str == '\\')
270
    {
271
      tSymbolFlags Flags;
272
 
273
      AdrWord = EvalStrIntExpressionOffsWithFlags(&ArgStr[1], 1, UInt16, &ValOK, &Flags);
274
      if (ValOK)
275
      {
276
        if (mFirstPassUnknown(Flags))
277
          AdrWord = (SpecPage << 8) | Lo(AdrWord);
278
        if (Hi(AdrWord) != SpecPage) WrError(ErrNum_UnderRange);
279
        else
280
        {
281
          pResult->ErgMode = ModSpec;
282
          pResult->AdrVals[0] = Lo(AdrWord);
283
          pResult->AdrCnt = 1;
284
        }
285
      }
286
    }
287
 
288
    /* 4. X-inner-indirekt ? */
289
 
290
    else if ((strlen(ArgStr[1].str.p_str) >= 5) && (!as_strcasecmp(ArgStr[1].str.p_str + strlen(ArgStr[1].str.p_str) - 3, ",X)")))
291
    {
292
      if (*ArgStr[1].str.p_str != '(') WrError(ErrNum_InvAddrMode);
293
      else
294
      {
295
        tStrComp AddrArg;
296
 
297
        StrCompRefRight(&AddrArg, &ArgStr[1], 1);
298
        StrCompShorten(&AddrArg, 3);
299
        StrCompIncRefLeft(&AddrArg, ChkZero(&AddrArg, &ZeroMode));
300
        if (Memo("JMP") || Memo("JSR"))
301
        {
302
          AdrWord = EvalAddress(&AddrArg, UInt16, &ValOK);
303
          if (ValOK)
304
          {
305
            pResult->AdrVals[0] = Lo(AdrWord);
306
            pResult->AdrVals[1] = Hi(AdrWord);
307
            pResult->ErgMode = ModIndIX;
308
            pResult->AdrCnt = 2;
309
          }
310
        }
311
        else
312
        {
313
          pResult->AdrVals[0] = EvalAddress(&AddrArg, UInt8, &ValOK);
314
          if (ValOK)
315
          {
316
            pResult->ErgMode = ModIndIX;
317
            pResult->AdrCnt = 1;
318
          }
319
        }
320
      }
321
    }
322
 
323
    else
324
    {
325
      /* 5. indirekt absolut ? */
326
 
327
      if (IsIndirect(ArgStr[1].str.p_str))
328
      {
329
        tStrComp AddrArg;
330
 
331
        StrCompRefRight(&AddrArg, &ArgStr[1], 1);
332
        StrCompShorten(&AddrArg, 1);
333
        StrCompIncRefLeft(&AddrArg, ChkZero(&AddrArg, &ZeroMode));
334
        if (ZeroMode == 2)
335
        {
336
          pResult->AdrVals[0] = EvalAddress(&AddrArg, UInt8, &ValOK);
337
          if (ValOK)
338
          {
339
            pResult->ErgMode = ModInd8;
340
            pResult->AdrCnt = 1;
341
          }
342
        }
343
        else
344
        {
345
          AdrWord = EvalAddress(&AddrArg, UInt16, &ValOK);
346
          if (ValOK)
347
          {
348
            pResult->ErgMode = ModInd16;
349
            pResult->AdrCnt = 2;
350
            pResult->AdrVals[0] = Lo(AdrWord);
351
            pResult->AdrVals[1] = Hi(AdrWord);
352
            if ((ZeroMode == 0) && IsBasePage(pResult->AdrVals[1]))
353
              ChkZeroMode(pResult, pOrder, ModInd8);
354
          }
355
        }
356
      }
357
 
358
      /* 6. absolut */
359
 
360
      else
361
      {
362
        tStrComp AddrArg;
363
 
364
        StrCompRefRight(&AddrArg, &ArgStr[1], ChkZero(&ArgStr[1], &ZeroMode));
365
        if (ZeroMode == 2)
366
        {
367
          pResult->AdrVals[0] = EvalAddress(&AddrArg, UInt8, &ValOK);
368
          if (ValOK)
369
          {
370
            pResult->ErgMode = ModZA;
371
            pResult->AdrCnt = 1;
372
          }
373
        }
374
        else
375
        {
376
          AdrWord = EvalAddress(&AddrArg, UInt16, &ValOK);
377
          if (ValOK)
378
          {
379
            pResult->ErgMode = ModA;
380
            pResult->AdrCnt = 2;
381
            pResult->AdrVals[0] = Lo(AdrWord);
382
            pResult->AdrVals[1] = Hi(AdrWord);
383
            if ((ZeroMode == 0) && IsBasePage(pResult->AdrVals[1]))
384
              ChkZeroMode(pResult, pOrder, ModZA);
385
          }
386
        }
387
      }
388
    }
389
  }
390
 
391
  else if (ArgCnt == 2)
392
  {
393
    Boolean Indir1 = IsIndirect(ArgStr[1].str.p_str);
394
 
395
    /* 7. stack-relative (65CE02-specific) ? */
396
 
397
    if (Indir1 && !as_strcasecmp(ArgStr[2].str.p_str, "Y") && (!as_strcasecmp(ArgStr[1].str.p_str + strlen(ArgStr[1].str.p_str) - 4, ",SP)")))
398
    {
399
      if (*ArgStr[1].str.p_str != '(') WrError(ErrNum_InvAddrMode);
400
      else
401
      {
402
        tStrComp DistArg;
403
 
404
        StrCompRefRight(&DistArg, &ArgStr[1], 1);
405
        StrCompShorten(&DistArg, 4);
406
        pResult->AdrVals[0] = EvalStrIntExpression(&DistArg, UInt8, &ValOK);
407
        if (ValOK)
408
        {
409
          pResult->ErgMode = ModIndSPY;
410
          pResult->AdrCnt = 1;
411
        }
412
      }
413
    }
414
 
415
    /* 8. X,Y,Z-outer-indirekt ? */
416
 
417
    else if (Indir1
418
          && (!as_strcasecmp(ArgStr[2].str.p_str, "X")
419
           || !as_strcasecmp(ArgStr[2].str.p_str, "Y")
420
           || !as_strcasecmp(ArgStr[2].str.p_str, "Z")))
421
    {
422
      int Mode = toupper(ArgStr[2].str.p_str[0]) - 'X';
423
      tStrComp AddrArg;
424
 
425
      StrCompRefRight(&AddrArg, &ArgStr[1], 1);
426
      StrCompShorten(&AddrArg, 1);
427
      StrCompIncRefLeft(&AddrArg, ChkZero(&AddrArg, &ZeroMode));
428
      pResult->AdrVals[0] = EvalAddress(&AddrArg, UInt8, &ValOK);
429
      if (ValOK)
430
      {
431
        pResult->ErgMode = ModIndOX + Mode;
432
        pResult->AdrCnt = 1;
433
      }
434
    }
435
 
436
    /* 9. X,Y-indiziert ? */
437
 
438
    else
439
    {
440
      tStrComp AddrArg;
441
 
442
      StrCompRefRight(&AddrArg, &ArgStr[1], ChkZero(&ArgStr[1], &ZeroMode));
443
      if (ZeroMode == 2)
444
      {
445
        pResult->AdrVals[0] = EvalAddress(&AddrArg, UInt8, &ValOK);
446
        if (ValOK)
447
        {
448
          pResult->AdrCnt = 1;
449
          if (!as_strcasecmp(ArgStr[2].str.p_str, "X"))
450
            pResult->ErgMode = ModZIX;
451
          else if (!as_strcasecmp(ArgStr[2].str.p_str, "Y"))
452
            pResult->ErgMode = ModZIY;
453
          else
454
            WrStrErrorPos(ErrNum_InvReg, &ArgStr[2]);
455
        }
456
      }
457
      else
458
      {
459
        AdrWord = EvalAddress(&AddrArg, Int16, &ValOK);
460
        if (ValOK)
461
        {
462
          pResult->AdrCnt = 2;
463
          pResult->AdrVals[0] = Lo(AdrWord);
464
          pResult->AdrVals[1] = Hi(AdrWord);
465
          if (!as_strcasecmp(ArgStr[2].str.p_str, "X"))
466
            pResult->ErgMode = ModIX;
467
          else if (!as_strcasecmp(ArgStr[2].str.p_str, "Y"))
468
            pResult->ErgMode = ModIY;
469
          else
470
            WrStrErrorPos(ErrNum_InvReg, &ArgStr[2]);
471
          if (pResult->ErgMode != -1)
472
          {
473
            if (IsBasePage(pResult->AdrVals[1]) && (ZeroMode == 0))
474
              ChkZeroMode(pResult, pOrder, (!as_strcasecmp(ArgStr[2].str.p_str, "X")) ? ModZIX : ModZIY);
475
          }
476
        }
477
      }
478
    }
479
  }
480
 
481
  else
482
    (void)ChkArgCnt(0, 2);
483
}
484
 
485
static int ImmStart(const char *pArg)
486
{
487
  return !!(*pArg == '#');
488
}
489
 
490
/*---------------------------------------------------------------------------*/
491
 
492
/* Anweisungen ohne Argument */
493
 
494
static void DecodeFixed(Word Index)
495
{
496
  const FixedOrder *pOrder = FixedOrders + Index;
497
 
498
  if (ChkArgCnt(0, 0)
499
   && (ChkExactCPUMask(pOrder->CPUFlag, CPU6502) >= 0))
500
  {
501
    CodeLen = 1;
502
    BAsmCode[0] = pOrder->Code;
503
    if (MomCPU == CPUM740)
504
    {
505
      if (Memo("PLP"))
506
        BAsmCode[CodeLen++] = NOPCode;
507
      if ((Last_ADC_SBC_Flag) && (Memo("SEC") || Memo("CLC") || Memo("CLD")))
508
        InsNOP();
509
    }
510
  }
511
}
512
 
513
/* All right, guys, this really makes tool developers' lives difficult: you can't
514
   seem to agree on whether BRK is a single or two byte instruction.  Always adding
515
   a NOP is obviously not what suits the majority of people, so I'll change it to
516
   an optional argument.  I hope this ends the discussion about BRK.  No, wait, it
517
   *will* end discussion because I will not answer any further requests about this
518
   instruction... */
519
 
520
static void DecodeBRK(Word Index)
521
{
522
  UNUSED(Index);
523
 
524
  if (ChkArgCnt(0, 1))
525
  {
526
    BAsmCode[0] = 0x00;
527
    if (ArgCnt > 0)
528
    {
529
      Boolean OK;
530
 
531
      BAsmCode[1] = EvalStrIntExpressionOffs(&ArgStr[1], !!(*ArgStr[1].str.p_str == '#'), Int8, &OK);
532
      if (OK)
533
        CodeLen = 2;
534
    }
535
    else
536
      CodeLen = 1;
537
  }
538
}
539
 
540
static void DecodeSEB_CLB(Word Code)
541
{
542
  if (ChkArgCnt(2, 2)
543
   && ChkExactCPU(CPUM740))
544
  {
545
    Boolean ValOK;
546
    Byte BitNo = EvalStrIntExpression(&ArgStr[1], UInt3, &ValOK);
547
 
548
    if (ValOK)
549
    {
550
      BAsmCode[0] = Code + (BitNo << 5);
551
      if (!as_strcasecmp(ArgStr[2].str.p_str, "A"))
552
        CodeLen = 1;
553
      else
554
      {
555
        BAsmCode[1] = EvalStrIntExpression(&ArgStr[2], UInt8, &ValOK);
556
        if (ValOK)
557
        {
558
          CodeLen = 2;
559
          BAsmCode[0] += 4;
560
        }
561
      }
562
    }
563
  }
564
}
565
 
566
static void DecodeBBC_BBS(Word Code)
567
{
568
  Boolean ValOK;
569
  tSymbolFlags Flags;
570
  int b;
571
 
572
  if (ChkArgCnt(3, 3)
573
   && ChkExactCPU(CPUM740))
574
  {
575
    BAsmCode[0] = EvalStrIntExpression(&ArgStr[1], UInt3, &ValOK);
576
    if (ValOK)
577
    {
578
      BAsmCode[0] = (BAsmCode[0] << 5) + Code;
579
      b = (as_strcasecmp(ArgStr[2].str.p_str, "A") != 0);
580
      if (!b)
581
        ValOK = True;
582
      else
583
      {
584
        BAsmCode[0] += 4;
585
        BAsmCode[1] = EvalStrIntExpression(&ArgStr[2], UInt8, &ValOK);
586
      }
587
      if (ValOK)
588
      {
589
        Integer AdrInt = EvalStrIntExpressionWithFlags(&ArgStr[3], Int16, &ValOK, &Flags) - (EProgCounter() + 2 + Ord(b) + Ord(Last_CLI_SEI_Flag));
590
 
591
        if (ValOK)
592
        {
593
          if (((AdrInt > 127) || (AdrInt < -128)) && !mSymbolQuestionable(Flags)) WrError(ErrNum_JmpDistTooBig);
594
          else
595
          {
596
            CodeLen = 2 + Ord(b);
597
            BAsmCode[CodeLen - 1] = AdrInt & 0xff;
598
            if (Last_CLI_SEI_Flag)
599
              InsNOP();
600
          }
601
        }
602
      }
603
    }
604
  }
605
}
606
 
607
static void DecodeBBR_BBS(Word Code)
608
{
609
  Boolean ValOK;
610
 
611
  if (ChkArgCnt(2, 2)
612
   && (ChkExactCPUMask(M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_HUC6280, CPU6502) >= 0))
613
  {
614
    Byte ForceSize;
615
    unsigned Offset = ChkZero(&ArgStr[1], &ForceSize);
616
 
617
    if (ForceSize == 1) WrStrErrorPos(ErrNum_InvAddrMode, &ArgStr[1]);
618
    else
619
    {
620
      BAsmCode[1] = EvalStrIntExpressionOffs(&ArgStr[1], Offset, UInt8, &ValOK);
621
      if (ValOK)
622
      {
623
        Integer AdrInt;
624
        tSymbolFlags Flags;
625
 
626
        BAsmCode[0] = Code;
627
        AdrInt = EvalStrIntExpressionWithFlags(&ArgStr[2], UInt16, &ValOK, &Flags) - (EProgCounter() + 3);
628
        if (ValOK)
629
        {
630
          if (((AdrInt > 127) || (AdrInt < -128)) && !mSymbolQuestionable(Flags)) WrError(ErrNum_JmpDistTooBig);
631
          else
632
          {
633
            CodeLen = 3;
634
            BAsmCode[2] = AdrInt & 0xff;
635
          }
636
        }
637
      }
638
    }
639
  }
640
}
641
 
642
static void DecodeRMB_SMB(Word Code)
643
{
644
  if (ChkArgCnt(1, 1)
645
   && (ChkExactCPUMask(M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_HUC6280, CPU6502) >= 0))
646
  {
647
    Byte ForceSize;
648
    unsigned Offset = ChkZero(&ArgStr[1], &ForceSize);
649
 
650
    if (ForceSize == 1) WrStrErrorPos(ErrNum_InvAddrMode, &ArgStr[1]);
651
    else
652
    {
653
      Boolean ValOK;
654
 
655
      BAsmCode[1] = EvalStrIntExpressionOffs(&ArgStr[1], Offset, UInt8, &ValOK);
656
      if (ValOK)
657
      {
658
        BAsmCode[0] = Code;
659
        CodeLen = 2;
660
      }
661
    }
662
  }
663
}
664
 
665
static void DecodeRBA_SBA(Word Code)
666
{
667
  if (ChkArgCnt(2, 2)
668
   && ChkExactCPU(CPU65C19))
669
  {
670
    Boolean OK;
671
    Word Addr;
672
 
673
    Addr = EvalStrIntExpression(&ArgStr[1], UInt16, &OK);
674
    if (OK)
675
    {
676
      BAsmCode[3] = EvalStrIntExpressionOffs(&ArgStr[2], ImmStart(ArgStr[2].str.p_str), UInt8, &OK);
677
      if (OK)
678
      {
679
        BAsmCode[0] = Code;
680
        BAsmCode[1] = Lo(Addr);
681
        BAsmCode[2] = Hi(Addr);
682
        CodeLen = 4;
683
      }
684
    }
685
  }
686
}
687
 
688
static void DecodeBAR_BAS(Word Code)
689
{
690
  if (ChkArgCnt(3, 3)
691
   && ChkExactCPU(CPU65C19))
692
  {
693
    Boolean OK;
694
    Word Addr;
695
 
696
    Addr = EvalStrIntExpression(&ArgStr[1], UInt16, &OK);
697
    if (OK)
698
    {
699
      BAsmCode[3] = EvalStrIntExpressionOffs(&ArgStr[2], ImmStart(ArgStr[2].str.p_str), UInt8, &OK);
700
      if (OK)
701
      {
702
        tSymbolFlags Flags;
703
        Integer Dist = EvalStrIntExpressionWithFlags(&ArgStr[3], UInt16, &OK, &Flags) - (EProgCounter() + 5);
704
 
705
        if (OK)
706
        {
707
          if (((Dist > 127) || (Dist < -128)) && !mSymbolQuestionable(Flags)) WrError(ErrNum_JmpDistTooBig);
708
          else
709
          {
710
            BAsmCode[0] = Code;
711
            BAsmCode[1] = Lo(Addr);
712
            BAsmCode[2] = Hi(Addr);
713
            BAsmCode[4] = Dist & 0xff;
714
            CodeLen = 5;
715
          }
716
        }
717
      }
718
    }
719
  }
720
}
721
 
722
static void DecodeSTI(Word Code)
723
{
724
  UNUSED(Code);
725
 
726
  if (ChkArgCnt(2, 2)
727
   && ChkExactCPU(CPU65C19))
728
  {
729
    Boolean OK;
730
 
731
    BAsmCode[1] = EvalStrIntExpression(&ArgStr[1], UInt8, &OK);
732
    if (OK)
733
    {
734
      BAsmCode[2] = EvalStrIntExpressionOffs(&ArgStr[2], ImmStart(ArgStr[2].str.p_str), UInt8, &OK);
735
      if (OK)
736
      {
737
        BAsmCode[0] = 0xb2;
738
        CodeLen = 3;
739
      }
740
    }
741
  }
742
}
743
 
744
static void DecodeLDM(Word Code)
745
{
746
  Boolean ValOK;
747
 
748
  UNUSED(Code);
749
 
750
  if (ChkArgCnt(2, 2)
751
   && ChkExactCPU(CPUM740))
752
  {
753
    BAsmCode[0] = 0x3c;
754
    BAsmCode[2] = EvalStrIntExpression(&ArgStr[2], UInt8, &ValOK);
755
    if (ValOK)
756
    {
757
      if (*ArgStr[1].str.p_str != '#') WrError(ErrNum_InvAddrMode);
758
      else
759
      {
760
        BAsmCode[1] = EvalStrIntExpressionOffs(&ArgStr[1], 1, Int8, &ValOK);
761
        if (ValOK)
762
          CodeLen = 3;
763
      }
764
    }
765
  }
766
}
767
 
768
static void DecodeJSB(Word Code)
769
{
770
  UNUSED(Code);
771
 
772
  if (ChkArgCnt(1, 1)
773
   && ChkExactCPU(CPU65C19))
774
  {
775
    Boolean OK;
776
    tSymbolFlags Flags;
777
    Word Addr;
778
 
779
    Addr = EvalStrIntExpressionWithFlags(&ArgStr[1], UInt16, &OK, &Flags);
780
    if (mFirstPassUnknown(Flags))
781
      Addr = 0xffe0;
782
    if (OK)
783
    {
784
      if ((Addr & 0xffe1) != 0xffe0) WrError(ErrNum_JmpTargOnDiffPage);
785
      else
786
      {
787
        BAsmCode[0] = 0x0b | ((Addr & 0x000e) << 3);
788
        CodeLen = 1;
789
      }
790
    }
791
  }
792
}
793
 
794
static void DecodeAUG(Word Code)
795
{
796
  if (ChkArgCnt(0, 0) && ChkExactCPU(CPU65CE02))
797
  {
798
    BAsmCode[0] = Code;
799
    BAsmCode[1] =
800
    BAsmCode[2] =
801
    BAsmCode[3] = 0x00;
802
    CodeLen = 4;
803
  }
804
}
805
 
806
static void DecodeNorm(Word Index)
807
{
808
  const NormOrder *pOrder = NormOrders + Index;
809
  tAdrResult AdrResult;
810
 
811
  DecodeAdr(&AdrResult, pOrder);
812
  if (AdrResult.ErgMode != -1)
813
  {
814
    if (pOrder->Codes[AdrResult.ErgMode] == -1)
815
    {
816
      if (AdrResult.ErgMode == ModZA) AdrResult.ErgMode = ModA;
817
      if (AdrResult.ErgMode == ModZIX) AdrResult.ErgMode = ModIX;
818
      if (AdrResult.ErgMode == ModZIY) AdrResult.ErgMode = ModIY;
819
      if (AdrResult.ErgMode == ModInd8) AdrResult.ErgMode = ModInd16;
820
      AdrResult.AdrVals[AdrCnt++] = 0;
821
    }
822
    if (pOrder->Codes[AdrResult.ErgMode] == -1) WrError(ErrNum_InvAddrMode);
823
    else if (ChkExactCPUMask(pOrder->Codes[AdrResult.ErgMode] >> 8, CPU6502) >= 0)
824
    {
825
      BAsmCode[0] = Lo(pOrder->Codes[AdrResult.ErgMode]);
826
      memcpy(BAsmCode + 1, AdrResult.AdrVals, AdrResult.AdrCnt);
827
      CodeLen = AdrResult.AdrCnt + 1;
828
      if ((AdrResult.ErgMode == ModInd16) && (MomCPU != CPU65C02) && (BAsmCode[1] == 0xff))
829
      {
830
        WrError(ErrNum_NotOnThisAddress);
831
        CodeLen = 0;
832
      }
833
    }
834
  }
835
}
836
 
837
static void DecodeTST(Word Index)
838
{
839
  Byte ImmVal = 0;
840
 
841
  /* split off immediate argument for HUC6280 TST? */
842
 
843
  if (MomCPU == CPUHUC6280)
844
  {
845
    Boolean OK;
846
    int z;
847
 
848
    if (!ChkArgCnt(1, ArgCntMax))
849
      return;
850
 
851
    ImmVal = EvalStrIntExpressionOffs(&ArgStr[1], ImmStart(ArgStr[1].str.p_str), Int8, &OK);
852
    if (!OK)
853
      return;
854
    for (z = 1; z <= ArgCnt - 1; z++)
855
      StrCompCopy(&ArgStr[z], &ArgStr[z + 1]);
856
    ArgCnt--;
857
  }
858
 
859
  /* generic generation */
860
 
861
  DecodeNorm(Index);
862
 
863
  /* if succeeded, insert immediate value */
864
 
865
  if ((CodeLen > 0) && (MomCPU == CPUHUC6280))
866
  {
867
    memmove(BAsmCode + 2, BAsmCode + 1, CodeLen - 1);
868
    BAsmCode[1] = ImmVal;
869
  }
870
}
871
 
872
/* relativer Sprung ? */
873
 
874
static void DecodeCond(Word Index)
875
{
876
  const CondOrder *pOrder = CondOrders + Index;
877
 
878
  if (ChkArgCnt(1, 1)
879
   && (ChkExactCPUMask(pOrder->CPUFlag, CPU6502) >= 0))
880
  {
881
    Integer AdrInt;
882
    Boolean ValOK;
883
    tSymbolFlags Flags;
884
    const Boolean MayShort = !!pOrder->CodeShort,
885
                  MayLong = !!pOrder->CodeLong && (MomCPU == CPU65CE02);
886
    Byte ForceSize;
887
 
888
    AdrInt = EvalStrIntExpressionOffsWithFlags(&ArgStr[1], ChkZero(&ArgStr[1], &ForceSize), UInt16, &ValOK, &Flags);
889
    if (!ValOK)
890
      return;
891
    if (!ForceSize)
892
    {
893
      if (!MayLong)
894
        ForceSize = 2;
895
      else if (!MayShort)
896
        ForceSize = 1;
897
      else
898
        ForceSize = RangeCheck(AdrInt - (EProgCounter() + 2), SInt8) ? 2 : 1;
899
    }
900
 
901
    AdrInt -= EProgCounter() + (4 - ForceSize);
902
    switch (ForceSize)
903
    {
904
      case 2:
905
        if (!MayShort) WrError(ErrNum_InvAddrMode);
906
        else if (((AdrInt > 127) || (AdrInt < -128)) && !mSymbolQuestionable(Flags)) WrError(ErrNum_JmpDistTooBig);
907
        else
908
        {
909
          BAsmCode[0] = pOrder->CodeShort;
910
          BAsmCode[1] = AdrInt & 0xff;
911
          CodeLen = 2;
912
        }
913
        break;
914
      case 1:
915
        if (!MayLong) WrError(ErrNum_InvAddrMode);
916
        else
917
        {
918
          BAsmCode[0] = pOrder->CodeLong;
919
          BAsmCode[1] = AdrInt & 0xff;
920
          BAsmCode[2] = (AdrInt >> 8) & 0xff;
921
          CodeLen = 3;
922
        }
923
        break;
924
    }
925
  }
926
}
927
 
928
static void DecodeTransfer(Word Code)
929
{
930
  if (ChkArgCnt(3, 3)
931
   && ChkExactCPU(CPUHUC6280))
932
  {
933
    Boolean OK;
934
    Word Address;
935
    int z;
936
 
937
    for (z = 1; z <= 3; z++)
938
    {
939
      Address = EvalStrIntExpression(&ArgStr[z], UInt16, &OK);
940
      if (!OK)
941
        return;
942
      BAsmCode[z * 2 - 1] = Lo(Address);
943
      BAsmCode[z * 2    ] = Hi(Address);
944
    }
945
    BAsmCode[0] = Code;
946
    CodeLen = 7;
947
  }
948
}
949
 
950
/*---------------------------------------------------------------------------*/
951
 
952
static void AddFixed(const char *NName, Word NFlag, Byte NCode)
953
{
954
  order_array_rsv_end(FixedOrders, FixedOrder);
955
  FixedOrders[InstrZ].CPUFlag = NFlag;
956
  FixedOrders[InstrZ].Code = NCode;
957
  AddInstTable(InstTable, NName, InstrZ++, DecodeFixed);
958
}
959
 
960
static void AddNorm(const char *NName, LongWord ZACode, LongWord ACode, LongWord ZIXCode,
961
                    LongWord IXCode, LongWord ZIYCode, LongWord IYCode, LongWord IndIXCode,
962
                    LongWord IndOXCode, LongWord IndOYCode, LongWord IndOZCode, LongWord Ind16Code, LongWord ImmCode, LongWord AccCode,
963
                    LongWord NoneCode, LongWord Ind8Code, LongWord IndSPYCode, LongWord SpecCode)
964
{
965
  order_array_rsv_end(NormOrders, NormOrder);
966
  NormOrders[InstrZ].Codes[ModZA] = ZACode;
967
  NormOrders[InstrZ].Codes[ModA] = ACode;
968
  NormOrders[InstrZ].Codes[ModZIX] = ZIXCode;
969
  NormOrders[InstrZ].Codes[ModIX] = IXCode;
970
  NormOrders[InstrZ].Codes[ModZIY] = ZIYCode;
971
  NormOrders[InstrZ].Codes[ModIY] = IYCode;
972
  NormOrders[InstrZ].Codes[ModIndIX] = IndIXCode;
973
  NormOrders[InstrZ].Codes[ModIndOX] = IndOXCode;
974
  NormOrders[InstrZ].Codes[ModIndOY] = IndOYCode;
975
  NormOrders[InstrZ].Codes[ModIndOZ] = IndOZCode;
976
  NormOrders[InstrZ].Codes[ModInd16] = Ind16Code;
977
  NormOrders[InstrZ].Codes[ModImm] = ImmCode;
978
  NormOrders[InstrZ].Codes[ModAcc] = AccCode;
979
  NormOrders[InstrZ].Codes[ModNone] = NoneCode;
980
  NormOrders[InstrZ].Codes[ModInd8] = Ind8Code;
981
  NormOrders[InstrZ].Codes[ModIndSPY] = IndSPYCode;
982
  NormOrders[InstrZ].Codes[ModSpec] = SpecCode;
983
  AddInstTable(InstTable, NName, InstrZ++, strcmp(NName, "TST") ? DecodeNorm : DecodeTST);
984
}
985
 
986
static void AddCond(const char *NName, Word NFlag, Byte NCodeShort, Byte NCodeLong)
987
{
988
  order_array_rsv_end(CondOrders, CondOrder);
989
  CondOrders[InstrZ].CPUFlag = NFlag;
990
  CondOrders[InstrZ].CodeShort = NCodeShort;
991
  CondOrders[InstrZ].CodeLong = NCodeLong;
992
  AddInstTable(InstTable, NName, InstrZ++, DecodeCond);
993
}
994
 
995
static LongWord MkMask(Word CPUMask, Byte Code)
996
{
997
  return (((LongWord)CPUMask) << 8) | Code;
998
}
999
 
1000
static void InitFields(void)
1001
{
1002
  Boolean Is740 = (MomCPU == CPUM740),
1003
          Is65C19 = (MomCPU == CPU65C19);
1004
  int Bit;
1005
  char Name[20];
1006
 
1007
  InstTable = CreateInstTable(237);
1008
  SetDynamicInstTable(InstTable);
1009
 
1010
  add_null_pseudo(InstTable);
1011
 
1012
  AddInstTable(InstTable, "SEB", 0x0b, DecodeSEB_CLB);
1013
  AddInstTable(InstTable, "CLB", 0x1b, DecodeSEB_CLB);
1014
  AddInstTable(InstTable, "BBC", 0x13, DecodeBBC_BBS);
1015
  AddInstTable(InstTable, "BBS", 0x03, DecodeBBC_BBS);
1016
  AddInstTable(InstTable, "RBA", 0xc2, DecodeRBA_SBA);
1017
  AddInstTable(InstTable, "SBA", 0xd2, DecodeRBA_SBA);
1018
  AddInstTable(InstTable, "BAR", 0xe2, DecodeBAR_BAS);
1019
  AddInstTable(InstTable, "BAS", 0xf2, DecodeBAR_BAS);
1020
  AddInstTable(InstTable, "STI", 0, DecodeSTI);
1021
  AddInstTable(InstTable, "BRK", 0, DecodeBRK);
1022
  for (Bit = 0; Bit < 8; Bit++)
1023
  {
1024
    as_snprintf(Name, sizeof(Name), "BBR%d", Bit);
1025
    AddInstTable(InstTable, Name, (Bit << 4) + 0x0f, DecodeBBR_BBS);
1026
    as_snprintf(Name, sizeof(Name), "BBS%d", Bit);
1027
    AddInstTable(InstTable, Name, (Bit << 4) + 0x8f, DecodeBBR_BBS);
1028
    as_snprintf(Name, sizeof(Name), "RMB%d", Bit);
1029
    AddInstTable(InstTable, Name, (Bit << 4) + 0x07, DecodeRMB_SMB);
1030
    as_snprintf(Name, sizeof(Name), "SMB%d", Bit);
1031
    AddInstTable(InstTable, Name, (Bit << 4) + 0x87, DecodeRMB_SMB);
1032
  }
1033
  AddInstTable(InstTable, "LDM", 0, DecodeLDM);
1034
  AddInstTable(InstTable, "JSB", 0, DecodeJSB);
1035
  AddInstTable(InstTable, "AUG", 0x5c, DecodeAUG);
1036
 
1037
  AddInstTable(InstTable, "TAI"  , 0xf3, DecodeTransfer);
1038
  AddInstTable(InstTable, "TDD"  , 0xc3, DecodeTransfer);
1039
  AddInstTable(InstTable, "TIA"  , 0xe3, DecodeTransfer);
1040
  AddInstTable(InstTable, "TII"  , 0x73, DecodeTransfer);
1041
  AddInstTable(InstTable, "TIN"  , 0xd3, DecodeTransfer);
1042
 
1043
  InstrZ = 0;
1044
  AddFixed("RTS", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x60);
1045
  AddFixed("RTI", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x40);
1046
  AddFixed("TAX", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xaa);
1047
  AddFixed("TXA", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x8a);
1048
  AddFixed("TAY", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xa8);
1049
  AddFixed("TYA", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x98);
1050
  AddFixed("TXS", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x9a);
1051
  AddFixed("TSX", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xba);
1052
  AddFixed("TSY",                               M_65CE02                                                         , 0x0b);
1053
  AddFixed("TYS",                               M_65CE02                                                         , 0x2b);
1054
  AddFixed("TAZ",                               M_65CE02                                                         , 0x4b);
1055
  AddFixed("TAB",                               M_65CE02                                                         , 0x5b);
1056
  AddFixed("TZA",                               M_65CE02                                                         , 0x6b);
1057
  AddFixed("TBA",                               M_65CE02                                                         , 0x7b);
1058
  AddFixed("DEX", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xca);
1059
  AddFixed("DEY", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x88);
1060
  AddFixed("DEZ",                               M_65CE02                                                         , 0x3b);
1061
  AddFixed("INX", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xe8);
1062
  AddFixed("INY", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xc8);
1063
  AddFixed("INZ",                               M_65CE02                                                         , 0x1b);
1064
  AddFixed("PHA", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x48);
1065
  AddFixed("PLA", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x68);
1066
  AddFixed("PHP", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x08);
1067
  AddFixed("PLP", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x28);
1068
  AddFixed("PHX",          M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19              | M_HUC6280          , 0xda);
1069
  AddFixed("PLX",          M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19              | M_HUC6280          , 0xfa);
1070
  AddFixed("PHY",          M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19              | M_HUC6280          , 0x5a);
1071
  AddFixed("PLY",          M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19              | M_HUC6280          , 0x7a);
1072
  AddFixed("PHZ",                               M_65CE02                                                         , 0xdb);
1073
  AddFixed("PLZ",                               M_65CE02                                                         , 0xfb);
1074
  AddFixed("STP",                                          M_W65C02S |           M_MELPS740                      , Is740 ? 0x42 : 0xdb);
1075
  AddFixed("WAI",                                          M_W65C02S                                             , 0xcb);
1076
  AddFixed("SLW",                                                                M_MELPS740                      , 0xc2);
1077
  AddFixed("FST",                                                                M_MELPS740                      , 0xe2);
1078
  AddFixed("WIT",                                                                M_MELPS740                      , 0xc2);
1079
  AddFixed("CLI", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x58);
1080
  AddFixed("SEI", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x78);
1081
  AddFixed("CLC", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x18);
1082
  AddFixed("SEC", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x38);
1083
  AddFixed("CLD", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xd8);
1084
  AddFixed("SED", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xf8);
1085
  AddFixed("CLE",                               M_65CE02                                                         , 0x02);
1086
  AddFixed("SEE",                               M_65CE02                                                         , 0x03);
1087
  AddFixed("CLV", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xb8);
1088
  AddFixed("CLT",                                                                M_MELPS740                      , 0x12);
1089
  AddFixed("SET",                                                                M_MELPS740 | M_HUC6280          , Is740 ? 0x32 : 0xf4); /* !!! for HUC6280, is prefix for (x) instead of ACC as dest */
1090
  AddFixed("JAM",                                                                                         M_6502U, 0x02);
1091
  AddFixed("CRS",                                                                                         M_6502U, 0x02);
1092
  AddFixed("KIL",                                                                                         M_6502U, 0x02);
1093
  AddFixed("CLW",                                                      M_65C19                                   , 0x52);
1094
  AddFixed("MPY",                                                      M_65C19                                   , 0x02);
1095
  AddFixed("MPA",                                                      M_65C19                                   , 0x12);
1096
  AddFixed("PSH",                                                      M_65C19                                   , 0x22);
1097
  AddFixed("PUL",                                                      M_65C19                                   , 0x32);
1098
  AddFixed("PLW",                                                      M_65C19                                   , 0x33);
1099
  AddFixed("RND",                                                      M_65C19                                   , 0x42);
1100
  AddFixed("TAW",                                                      M_65C19                                   , 0x62);
1101
  AddFixed("TWA",                                                      M_65C19                                   , 0x72);
1102
  AddFixed("NXT",                                                      M_65C19                                   , 0x8b);
1103
  AddFixed("LII",                                                      M_65C19                                   , 0x9b);
1104
  AddFixed("LAI",                                                      M_65C19                                   , 0xeb);
1105
  AddFixed("INI",                                                      M_65C19                                   , 0xbb);
1106
  AddFixed("PHI",                                                      M_65C19                                   , 0xcb);
1107
  AddFixed("PLI",                                                      M_65C19                                   , 0xdb);
1108
  AddFixed("TIP",                                                      M_65C19                                   , 0x03);
1109
  AddFixed("PIA",                                                      M_65C19                                   , 0xfb);
1110
  AddFixed("LAN",                                                      M_65C19                                   , 0xab);
1111
  AddFixed("CLA",                                                                             M_HUC6280          , 0x62);
1112
  AddFixed("CLX",                                                                             M_HUC6280          , 0x82);
1113
  AddFixed("CLY",                                                                             M_HUC6280          , 0xc2);
1114
  AddFixed("CSL",                                                                             M_HUC6280          , 0x54);
1115
  AddFixed("CSH",                                                                             M_HUC6280          , 0xd4);
1116
  AddFixed("SAY",                                                                             M_HUC6280          , 0x42);
1117
  AddFixed("SXY",                                                                             M_HUC6280          , 0x02);
1118
 
1119
  InstrZ = 0;
1120
  AddNorm("NOP",
1121
  /* ZA    */ MkMask(                                                                                        M_6502U, 0x04),
1122
  /* A     */ MkMask(                                                                                        M_6502U, 0x0c),
1123
  /* ZIX   */ MkMask(                                                                                        M_6502U, 0x14),
1124
  /* IX    */ MkMask(                                                                                        M_6502U, 0x1c),
1125
  /* ZIY   */     -1,
1126
  /* IY    */     -1,
1127
  /* (n,X) */     -1,
1128
  /* (n),X */     -1,
1129
  /* (n),Y */     -1,
1130
  /* (n),Z */     -1,
1131
  /* (n16) */     -1,
1132
  /* imm   */ MkMask(                                                                                        M_6502U, 0x80),
1133
  /* ACC   */     -1,
1134
  /* NON   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xea),
1135
  /* (n8)  */     -1,
1136
  /*(n,SP),y*/    -1,
1137
  /* spec  */     -1);
1138
  AddNorm("LDA",
1139
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xa5),
1140
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xad),
1141
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xb5),
1142
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xbd),
1143
  /* ZIY   */     -1,
1144
  /* IY    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xb9),
1145
  /* (n,X) */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0xa1),
1146
  /* (n),X */ MkMask(                                                     M_65C19                                   , 0xb1),
1147
  /* (n),Y */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0xb1),
1148
  /* (n),Z */ MkMask(                              M_65CE02                                                         , 0xb2),
1149
  /* (n16) */     -1,
1150
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xa9),
1151
  /* ACC   */     -1,
1152
  /* NON   */     -1,
1153
  /* (n8)  */ MkMask(         M_65SC02 | M_65C02            | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, Is65C19 ? 0xa1 : 0xb2),
1154
  /*(n,SP),y*/MkMask(                              M_65CE02                                                         , 0xe2),
1155
  /* spec  */     -1);
1156
  AddNorm("LDX",
1157
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xa6),
1158
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xae),
1159
  /* ZIX   */     -1,
1160
  /* IX    */     -1,
1161
  /* ZIY   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xb6),
1162
  /* IY    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xbe),
1163
  /* (n,X) */     -1,
1164
  /* (n),X */     -1,
1165
  /* (n),Y */     -1,
1166
  /* (n),Z */     -1,
1167
  /* (n16) */     -1,
1168
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xa2),
1169
  /* ACC   */     -1,
1170
  /* NON   */     -1,
1171
  /* (n8)  */     -1,
1172
  /*(n,SP),y*/    -1,
1173
  /* spec  */     -1);
1174
  AddNorm("LDY",
1175
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xa4),
1176
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xac),
1177
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xb4),
1178
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xbc),
1179
  /* ZIY   */     -1,
1180
  /* IY    */     -1,
1181
  /* (n,X) */     -1,
1182
  /* (n),X */     -1,
1183
  /* (n),Y */     -1,
1184
  /* (n),Z */     -1,
1185
  /* (n16) */     -1,
1186
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xa0),
1187
  /* ACC   */     -1,
1188
  /* NON   */     -1,
1189
  /* (n8)  */     -1,
1190
  /*(n,SP),y*/    -1,
1191
  /* spec  */     -1);
1192
  AddNorm("LDZ",
1193
  /* ZA    */     -1,
1194
  /* A     */ MkMask(                              M_65CE02                                                         , 0xab),
1195
  /* ZIX   */     -1,
1196
  /* IX    */ MkMask(                              M_65CE02                                                         , 0xbb),
1197
  /* ZIY   */     -1,
1198
  /* IY    */     -1,
1199
  /* (n,X) */     -1,
1200
  /* (n),X */     -1,
1201
  /* (n),Y */     -1,
1202
  /* (n),Z */     -1,
1203
  /* (n16) */     -1,
1204
  /* imm   */ MkMask(                              M_65CE02                                                         , 0xa3),
1205
  /* ACC   */     -1,
1206
  /* NON   */     -1,
1207
  /* (n8)  */     -1,
1208
  /*(n,SP),y*/    -1,
1209
  /* spec  */     -1);
1210
  AddNorm("STA",
1211
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x85),
1212
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x8d),
1213
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x95),
1214
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x9d),
1215
  /* ZIY   */     -1,
1216
  /* IY    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x99),
1217
  /* (n,X) */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0x81),
1218
  /* (n),X */ MkMask(                                                     M_65C19                                   , 0x91),
1219
  /* (n),Y */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0x91),
1220
  /* (n),Z */ MkMask(                              M_65CE02                                                         , 0x92),
1221
  /* (n16) */     -1,
1222
  /* imm   */     -1,
1223
  /* ACC   */     -1,
1224
  /* NON   */     -1,
1225
  /* (n8)  */ MkMask(         M_65SC02 | M_65C02            | M_W65C02S | M_65C19              | M_HUC6280          , Is65C19 ? 0x81 : 0x92),
1226
  /*(n,SP),y*/MkMask(                              M_65CE02                                                         , 0x82),
1227
  /* spec  */     -1);
1228
  AddNorm("ST0",
1229
  /* ZA    */     -1,
1230
  /* A     */     -1,
1231
  /* ZIX   */     -1,
1232
  /* IX    */     -1,
1233
  /* ZIY   */     -1,
1234
  /* IY    */     -1,
1235
  /* (n,X) */     -1,
1236
  /* (n),X */     -1,
1237
  /* (n),Y */     -1,
1238
  /* (n),Z */     -1,
1239
  /* (n16) */     -1,
1240
  /* imm   */ MkMask(                                                                            M_HUC6280          , 0x03),
1241
  /* ACC   */     -1,
1242
  /* NON   */     -1,
1243
  /* (n8)  */     -1,
1244
  /*(n,SP),y*/    -1,
1245
  /* spec  */     -1);
1246
  AddNorm("ST1",
1247
  /* ZA    */     -1,
1248
  /* A     */     -1,
1249
  /* ZIX   */     -1,
1250
  /* IX    */     -1,
1251
  /* ZIY   */     -1,
1252
  /* IY    */     -1,
1253
  /* (n,X) */     -1,
1254
  /* (n),X */     -1,
1255
  /* (n),Y */     -1,
1256
  /* (n),Z */     -1,
1257
  /* (n16) */     -1,
1258
  /* imm   */ MkMask(                                                                            M_HUC6280          , 0x13),
1259
  /* ACC   */     -1,
1260
  /* NON   */     -1,
1261
  /* (n8)  */     -1,
1262
  /*(n,SP),y*/    -1,
1263
  /* spec  */     -1);
1264
  AddNorm("ST2",
1265
  /* ZA    */     -1,
1266
  /* A     */     -1,
1267
  /* ZIX   */     -1,
1268
  /* IX    */     -1,
1269
  /* ZIY   */     -1,
1270
  /* IY    */     -1,
1271
  /* (n,X) */     -1,
1272
  /* (n),X */     -1,
1273
  /* (n),Y */     -1,
1274
  /* (n),Z */     -1,
1275
  /* (n16) */     -1,
1276
  /* imm   */ MkMask(                                                                            M_HUC6280          , 0x23),
1277
  /* ACC   */     -1,
1278
  /* NON   */     -1,
1279
  /* (n8)  */     -1,
1280
  /*(n,SP),y*/    -1,
1281
  /* spec  */     -1);
1282
  AddNorm("STX",
1283
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x86),
1284
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x8e),
1285
  /* ZIX   */     -1,
1286
  /* IX    */     -1,
1287
  /* ZIY   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x96),
1288
  /* IY    */ MkMask(                              M_65CE02                                                         , 0x9b),
1289
  /* (n,X) */     -1,
1290
  /* (n),X */     -1,
1291
  /* (n),Y */     -1,
1292
  /* (n),Z */     -1,
1293
  /* (n16) */     -1,
1294
  /* imm   */     -1,
1295
  /* ACC   */     -1,
1296
  /* NON   */     -1,
1297
  /* (n8)  */     -1,
1298
  /*(n,SP),y*/    -1,
1299
  /* spec  */     -1);
1300
  AddNorm("STY",
1301
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x84),
1302
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x8c),
1303
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x94),
1304
  /* IX    */ MkMask(                              M_65CE02                                                         , 0x8b),
1305
  /* ZIY   */     -1,
1306
  /* IY    */     -1,
1307
  /* (n,X) */     -1,
1308
  /* (n),X */     -1,
1309
  /* (n),Y */     -1,
1310
  /* (n),Z */     -1,
1311
  /* (n16) */     -1,
1312
  /* imm   */     -1,
1313
  /* ACC   */     -1,
1314
  /* NON   */     -1,
1315
  /* (n8)  */     -1,
1316
  /*(n,SP),y*/    -1,
1317
  /* spec  */     -1);
1318
  AddNorm("STZ",
1319
  /* ZA    */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S                        | M_HUC6280          , 0x64),
1320
  /* A     */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S                        | M_HUC6280          , 0x9c),
1321
  /* ZIX   */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S                        | M_HUC6280          , 0x74),
1322
  /* IX    */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S                        | M_HUC6280          , 0x9e),
1323
  /* ZIY   */     -1,
1324
  /* IY    */     -1,
1325
  /* (n,X) */     -1,
1326
  /* (n),X */     -1,
1327
  /* (n),Y */     -1,
1328
  /* (n),Z */     -1,
1329
  /* (n16) */     -1,
1330
  /* imm   */     -1,
1331
  /* ACC   */     -1,
1332
  /* NON   */     -1,
1333
  /* (n8)  */     -1,
1334
  /*(n,SP),y*/    -1,
1335
  /* spec  */     -1);
1336
  AddNorm("ADC",
1337
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x65),
1338
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x6d),
1339
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x75),
1340
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x7d),
1341
  /* ZIY   */     -1,
1342
  /* IY    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x79),
1343
  /* (n,X) */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0x61),
1344
  /* (n),X */ MkMask(                                                     M_65C19                                   , 0x71),
1345
  /* (n),Y */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0x71),
1346
  /* (n),Z */ MkMask(                              M_65CE02                                                         , 0x72),
1347
  /* (n16) */     -1,
1348
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x69),
1349
  /* ACC   */     -1,
1350
  /* NON   */     -1,
1351
  /* (n8)  */ MkMask(         M_65SC02 | M_65C02            | M_W65C02S | M_65C19              | M_HUC6280          , Is65C19 ? 0x61 : 0x72),
1352
  /*(n,SP),y*/    -1,
1353
  /* spec  */     -1);
1354
  AddNorm("ADD",
1355
  /* ZA    */ MkMask(                                                     M_65C19                                   , 0x64),
1356
  /* A     */     -1,
1357
  /* ZIX   */ MkMask(                                                     M_65C19                                   , 0x74),
1358
  /* IX    */     -1,
1359
  /* ZIY   */     -1,
1360
  /* IY    */     -1,
1361
  /* (n,X) */     -1,
1362
  /* (n),X */     -1,
1363
  /* (n),Y */     -1,
1364
  /* (n),Z */     -1,
1365
  /* (n16) */     -1,
1366
  /* imm   */ MkMask(                                                     M_65C19                                   , 0x89),
1367
  /* ACC   */     -1,
1368
  /* NON   */     -1,
1369
  /* (n8)  */     -1,
1370
  /*(n,SP),y*/    -1,
1371
  /* spec  */     -1);
1372
  AddNorm("SBC",
1373
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xe5),
1374
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xed),
1375
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xf5),
1376
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xfd),
1377
  /* ZIY   */     -1,
1378
  /* IY    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xf9),
1379
  /* (n,X) */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0xe1),
1380
  /* (n),X */ MkMask(                                                     M_65C19                                   , 0xf1),
1381
  /* (n),Y */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0xf1),
1382
  /* (n),Z */ MkMask(                              M_65CE02                                                         , 0xf2),
1383
  /* (n16) */     -1,
1384
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xe9),
1385
  /* ACC   */     -1,
1386
  /* NON   */     -1,
1387
  /* (n8)  */ MkMask(         M_65SC02 | M_65C02            | M_W65C02S | M_65C19              | M_HUC6280          , Is65C19 ? 0xe1 : 0xf2),
1388
  /*(n,SP),y*/    -1,
1389
  /* spec  */     -1);
1390
  AddNorm("MUL",
1391
  /* ZA    */     -1,
1392
  /* A     */     -1,
1393
  /* ZIX   */ MkMask(                                                               M_MELPS740                      , 0x62),
1394
  /* IX    */     -1,
1395
  /* ZIY   */     -1,
1396
  /* IY    */     -1,
1397
  /* (n,X) */     -1,
1398
  /* (n),X */     -1,
1399
  /* (n),Y */     -1,
1400
  /* (n),Z */     -1,
1401
  /* (n16) */     -1,
1402
  /* imm   */     -1,
1403
  /* ACC   */     -1,
1404
  /* NON   */     -1,
1405
  /* (n8)  */     -1,
1406
  /*(n,SP),y*/    -1,
1407
  /* spec  */     -1);
1408
  AddNorm("DIV",
1409
  /* ZA    */     -1,
1410
  /* A     */     -1,
1411
  /* ZIX   */ MkMask(                                                               M_MELPS740                      , 0xe2),
1412
  /* IX    */     -1,
1413
  /* ZIY   */     -1,
1414
  /* IY    */     -1,
1415
  /* (n,X) */     -1,
1416
  /* (n),X */     -1,
1417
  /* (n),Y */     -1,
1418
  /* (n),Z */     -1,
1419
  /* (n16) */     -1,
1420
  /* imm   */     -1,
1421
  /* ACC   */     -1,
1422
  /* NON   */     -1,
1423
  /* (n8)  */     -1,
1424
  /*(n,SP),y*/    -1,
1425
  /* spec  */     -1);
1426
  AddNorm("AND",
1427
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x25),
1428
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x2d),
1429
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x35),
1430
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x3d),
1431
  /* ZIY   */     -1,
1432
  /* IY    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x39),
1433
  /* (n,X) */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0x21),
1434
  /* (n),X */ MkMask(                                                     M_65C19                                   , 0x31),
1435
  /* (n),Y */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0x31),
1436
  /* (n),Z */ MkMask(                              M_65CE02                                                         , 0x32),
1437
  /* (n16) */     -1,
1438
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x29),
1439
  /* ACC   */     -1,
1440
  /* NON   */     -1,
1441
  /* (n8)  */ MkMask(         M_65SC02 | M_65C02            | M_W65C02S | M_65C19              | M_HUC6280          , Is65C19 ? 0x21 : 0x32),
1442
  /*(n,SP),y*/    -1,
1443
  /* spec  */     -1);
1444
  AddNorm("ORA",
1445
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x05),
1446
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x0d),
1447
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x15),
1448
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x1d),
1449
  /* ZIY   */     -1,
1450
  /* IY    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x19),
1451
  /* (n,X) */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0x01),
1452
  /* (n),X */ MkMask(                                                     M_65C19                                   , 0x11),
1453
  /* (n),Y */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0x11),
1454
  /* (n),Z */ MkMask(                              M_65CE02                                                         , 0x12),
1455
  /* (n16) */     -1,
1456
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x09),
1457
  /* ACC   */     -1,
1458
  /* NON   */     -1,
1459
  /* (n8)  */ MkMask(         M_65SC02 | M_65C02            | M_W65C02S | M_65C19              | M_HUC6280          , Is65C19 ? 0x01 : 0x12),
1460
  /*(n,SP),y*/    -1,
1461
  /* spec  */     -1);
1462
  AddNorm("EOR",
1463
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x45),
1464
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x4d),
1465
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x55),
1466
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x5d),
1467
  /* ZIY   */     -1,
1468
  /* IY    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x59),
1469
  /* (n,X) */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0x41),
1470
  /* (n),X */ MkMask(                                                     M_65C19                                   , 0x51),
1471
  /* (n),Y */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0x51),
1472
  /* (n),Z */ MkMask(                              M_65CE02                                                         , 0x52),
1473
  /* (n16) */     -1,
1474
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x49),
1475
  /* ACC   */     -1,
1476
  /* NON   */     -1,
1477
  /* (n8)  */ MkMask(         M_65SC02 | M_65C02            | M_W65C02S | M_65C19              | M_HUC6280          , Is65C19 ? 0x41 : 0x52),
1478
  /*(n,SP),y*/    -1,
1479
  /* spec  */     -1);
1480
  AddNorm("COM",
1481
  /* ZA    */ MkMask(                                                               M_MELPS740                      , 0x44),
1482
  /* A     */     -1,
1483
  /* ZIX   */     -1,
1484
  /* IX    */     -1,
1485
  /* ZIY   */     -1,
1486
  /* IY    */     -1,
1487
  /* (n,X) */     -1,
1488
  /* (n),X */     -1,
1489
  /* (n),Y */     -1,
1490
  /* (n),Z */     -1,
1491
  /* (n16) */     -1,
1492
  /* imm   */     -1,
1493
  /* ACC   */     -1,
1494
  /* NON   */     -1,
1495
  /* (n8)  */     -1,
1496
  /*(n,SP),y*/    -1,
1497
  /* spec  */     -1);
1498
  AddNorm("BIT",
1499
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x24),
1500
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x2c),
1501
  /* ZIX   */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S                        | M_HUC6280          , 0x34),
1502
  /* IX    */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S                        | M_HUC6280          , 0x3c),
1503
  /* ZIY   */     -1,
1504
  /* IY    */     -1,
1505
  /* (n,X) */     -1,
1506
  /* (n),X */     -1,
1507
  /* (n),Y */     -1,
1508
  /* (n),Z */     -1,
1509
  /* (n16) */     -1,
1510
  /* imm   */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S                        | M_HUC6280          , 0x89),
1511
  /* ACC   */     -1,
1512
  /* NON   */     -1,
1513
  /* (n8)  */     -1,
1514
  /*(n,SP),y*/    -1,
1515
  /* spec  */     -1);
1516
  AddNorm("TST", /* TODO: 6280 */
1517
  /* ZA    */ MkMask(                                                               M_MELPS740 | M_HUC6280          , Is740 ? 0x64 : 0x83),
1518
  /* A     */ MkMask(                                                                            M_HUC6280          , 0x93),
1519
  /* ZIX   */ MkMask(                                                                            M_HUC6280          , 0xa3),
1520
  /* IX    */ MkMask(                                                                            M_HUC6280          , 0xb3),
1521
  /* ZIY   */     -1,
1522
  /* IY    */     -1,
1523
  /* (n,X) */     -1,
1524
  /* (n),X */     -1,
1525
  /* (n),Y */     -1,
1526
  /* (n),Z */     -1,
1527
  /* (n16) */     -1,
1528
  /* imm   */     -1,
1529
  /* ACC   */     -1,
1530
  /* NON   */     -1,
1531
  /* (n8)  */     -1,
1532
  /*(n,SP),y*/    -1,
1533
  /* spec  */     -1);
1534
  AddNorm("ASL",
1535
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x06),
1536
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x0e),
1537
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x16),
1538
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x1e),
1539
  /* ZIY   */     -1,
1540
  /* IY    */     -1,
1541
  /* (n,X) */     -1,
1542
  /* (n),X */     -1,
1543
  /* (n),Y */     -1,
1544
  /* (n),Z */     -1,
1545
  /* (n16) */     -1,
1546
  /* imm   */     -1,
1547
  /* ACC   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x0a),
1548
  /* NON   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x0a),
1549
  /* (n8)  */     -1,
1550
  /*(n,SP),y*/    -1,
1551
  /* spec  */     -1);
1552
  AddNorm("ASR",
1553
  /* ZA    */ MkMask(                              M_65CE02                                                         , 0x44),
1554
  /* A     */     -1,
1555
  /* ZIX   */ MkMask(                              M_65CE02                                                         , 0x54),
1556
  /* IX    */     -1,
1557
  /* ZIY   */     -1,
1558
  /* IY    */     -1,
1559
  /* (n,X) */     -1,
1560
  /* (n),X */     -1,
1561
  /* (n),Y */     -1,
1562
  /* (n),Z */     -1,
1563
  /* (n16) */     -1,
1564
  /* imm   */ MkMask(                                                                                        M_6502U, 0x4b),
1565
  /* ACC   */ MkMask(                              M_65CE02             | M_65C19                                   , (MomCPU == CPU65CE02) ? 0x43 : 0x3a),
1566
  /* NON   */ MkMask(                              M_65CE02             | M_65C19                                   , (MomCPU == CPU65CE02) ? 0x43 : 0x3a),
1567
  /* (n8)  */     -1,
1568
  /*(n,SP),y*/    -1,
1569
  /* spec  */     -1);
1570
  AddNorm("ASW",
1571
  /* ZA    */     -1,
1572
  /* A     */ MkMask(                              M_65CE02                                                         , 0xcb),
1573
  /* ZIX   */     -1,
1574
  /* IX    */     -1,
1575
  /* ZIY   */     -1,
1576
  /* IY    */     -1,
1577
  /* (n,X) */     -1,
1578
  /* (n),X */     -1,
1579
  /* (n),Y */     -1,
1580
  /* (n),Z */     -1,
1581
  /* (n16) */     -1,
1582
  /* imm   */     -1,
1583
  /* ACC   */     -1,
1584
  /* NON   */     -1,
1585
  /* (n8)  */     -1,
1586
  /*(n,SP),y*/    -1,
1587
  /* spec  */     -1);
1588
  AddNorm("LAB",
1589
  /* ZA    */     -1,
1590
  /* A     */     -1,
1591
  /* ZIX   */     -1,
1592
  /* IX    */     -1,
1593
  /* ZIY   */     -1,
1594
  /* IY    */     -1,
1595
  /* (n,X) */     -1,
1596
  /* (n),X */     -1,
1597
  /* (n),Y */     -1,
1598
  /* (n),Z */     -1,
1599
  /* (n16) */     -1,
1600
  /* imm   */     -1,
1601
  /* ACC   */ MkMask(                                                     M_65C19                                   , 0x13),
1602
  /* NON   */ MkMask(                                                     M_65C19                                   , 0x13),
1603
  /* (n8)  */     -1,
1604
  /*(n,SP),y*/    -1,
1605
  /* spec  */     -1);
1606
  AddNorm("NEG",
1607
  /* ZA    */     -1,
1608
  /* A     */     -1,
1609
  /* ZIX   */     -1,
1610
  /* IX    */     -1,
1611
  /* ZIY   */     -1,
1612
  /* IY    */     -1,
1613
  /* (n,X) */     -1,
1614
  /* (n),X */     -1,
1615
  /* (n),Y */     -1,
1616
  /* (n),Z */     -1,
1617
  /* (n16) */     -1,
1618
  /* imm   */     -1,
1619
  /* ACC   */ MkMask(                              M_65CE02             | M_65C19                                   , (MomCPU == CPU65CE02) ? 0x42 : 0x1a),
1620
  /* NON   */ MkMask(                              M_65CE02             | M_65C19                                   , (MomCPU == CPU65CE02) ? 0x42 : 0x1a),
1621
  /* (n8)  */     -1,
1622
  /*(n,SP),y*/    -1,
1623
  /* spec  */     -1);
1624
  AddNorm("LSR",
1625
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x46),
1626
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x4e),
1627
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x56),
1628
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x5e),
1629
  /* ZIY   */     -1,
1630
  /* IY    */     -1,
1631
  /* (n,X) */     -1,
1632
  /* (n),X */     -1,
1633
  /* (n),Y */     -1,
1634
  /* (n),Z */     -1,
1635
  /* (n16) */     -1,
1636
  /* imm   */     -1,
1637
  /* ACC   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x4a),
1638
  /* NON   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x4a),
1639
  /* (n8)  */     -1,
1640
  /*(n,SP),y*/    -1,
1641
  /* spec  */     -1);
1642
  AddNorm("ROL",
1643
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x26),
1644
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x2e),
1645
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x36),
1646
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x3e),
1647
  /* ZIY   */     -1,
1648
  /* IY    */     -1,
1649
  /* (n,X) */     -1,
1650
  /* (n),X */     -1,
1651
  /* (n),Y */     -1,
1652
  /* (n),Z */     -1,
1653
  /* (n16) */     -1,
1654
  /* imm   */     -1,
1655
  /* ACC   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x2a),
1656
  /* NON   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x2a),
1657
  /* (n8)  */     -1,
1658
  /*(n,SP),y*/    -1,
1659
  /* spec  */     -1);
1660
  AddNorm("ROW",
1661
  /* ZA    */     -1,
1662
  /* A     */ MkMask(                              M_65CE02                                                         , 0xeb),
1663
  /* ZIX   */     -1,
1664
  /* IX    */     -1,
1665
  /* ZIY   */     -1,
1666
  /* IY    */     -1,
1667
  /* (n,X) */     -1,
1668
  /* (n),X */     -1,
1669
  /* (n),Y */     -1,
1670
  /* (n),Z */     -1,
1671
  /* (n16) */     -1,
1672
  /* imm   */     -1,
1673
  /* ACC   */     -1,
1674
  /* NON   */     -1,
1675
  /* (n8)  */     -1,
1676
  /*(n,SP),y*/    -1,
1677
  /* spec  */     -1);
1678
  AddNorm("ROR",
1679
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x66),
1680
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x6e),
1681
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x76),
1682
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x7e),
1683
  /* ZIY   */     -1,
1684
  /* IY    */     -1,
1685
  /* (n,X) */     -1,
1686
  /* (n),X */     -1,
1687
  /* (n),Y */     -1,
1688
  /* (n),Z */     -1,
1689
  /* (n16) */     -1,
1690
  /* imm   */     -1,
1691
  /* ACC   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x6a),
1692
  /* NON   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x6a),
1693
  /* (n8)  */     -1,
1694
  /*(n,SP),y*/    -1,
1695
  /* spec  */     -1);
1696
  AddNorm("RRF",
1697
  /* ZA    */ MkMask(                                                               M_MELPS740                      , 0x82),
1698
  /* A     */     -1,
1699
  /* ZIX   */     -1,
1700
  /* IX    */     -1,
1701
  /* ZIY   */     -1,
1702
  /* IY    */     -1,
1703
  /* (n,X) */     -1,
1704
  /* (n),X */     -1,
1705
  /* (n),Y */     -1,
1706
  /* (n),Z */     -1,
1707
  /* (n16) */     -1,
1708
  /* imm   */     -1,
1709
  /* ACC   */     -1,
1710
  /* NON   */     -1,
1711
  /* (n8)  */     -1,
1712
  /*(n,SP),y*/    -1,
1713
  /* spec  */     -1);
1714
  AddNorm("TSB",
1715
  /* ZA    */ MkMask(                   M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S              | M_HUC6280          , 0x04),
1716
  /* A     */ MkMask(                   M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S              | M_HUC6280          , 0x0c),
1717
  /* ZIX   */     -1,
1718
  /* IX    */     -1,
1719
  /* ZIY   */     -1,
1720
  /* IY    */     -1,
1721
  /* (n,X) */     -1,
1722
  /* (n),X */     -1,
1723
  /* (n),Y */     -1,
1724
  /* (n),Z */     -1,
1725
  /* (n16) */     -1,
1726
  /* imm   */     -1,
1727
  /* ACC   */     -1,
1728
  /* NON   */     -1,
1729
  /* (n8)  */     -1,
1730
  /*(n,SP),y*/    -1,
1731
  /* spec  */     -1);
1732
  AddNorm("TRB",
1733
  /* ZA    */ MkMask(                   M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S              | M_HUC6280          , 0x14),
1734
  /* A     */ MkMask(                   M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S              | M_HUC6280          , 0x1c),
1735
  /* ZIX   */     -1,
1736
  /* IX    */     -1,
1737
  /* ZIY   */     -1,
1738
  /* IY    */     -1,
1739
  /* (n,X) */     -1,
1740
  /* (n),X */     -1,
1741
  /* (n),Y */     -1,
1742
  /* (n),Z */     -1,
1743
  /* (n16) */     -1,
1744
  /* imm   */     -1,
1745
  /* ACC   */     -1,
1746
  /* NON   */     -1,
1747
  /* (n8)  */     -1,
1748
  /*(n,SP),y*/    -1,
1749
  /* spec  */     -1);
1750
  AddNorm("INC",
1751
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xe6),
1752
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xee),
1753
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xf6),
1754
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xfe),
1755
  /* ZIY   */     -1,
1756
  /* IY    */     -1,
1757
  /* (n,X) */     -1,
1758
  /* (n),X */     -1,
1759
  /* (n),Y */     -1,
1760
  /* (n),Z */     -1,
1761
  /* (n16) */     -1,
1762
  /* imm   */     -1,
1763
  /* ACC   */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280          , Is740 ? 0x3a : 0x1a),
1764
  /* NON   */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280          , Is740 ? 0x3a : 0x1a),
1765
  /* (n8)  */     -1,
1766
  /*(n,SP),y*/    -1,
1767
  /* spec  */     -1);
1768
  AddNorm("INW",
1769
  /* ZA    */ MkMask(                              M_65CE02                                                         , 0xe3),
1770
  /* A     */     -1,
1771
  /* ZIX   */     -1,
1772
  /* IX    */     -1,
1773
  /* ZIY   */     -1,
1774
  /* IY    */     -1,
1775
  /* (n,X) */     -1,
1776
  /* (n),X */     -1,
1777
  /* (n),Y */     -1,
1778
  /* (n),Z */     -1,
1779
  /* (n16) */     -1,
1780
  /* imm   */     -1,
1781
  /* ACC   */     -1,
1782
  /* NON   */     -1,
1783
  /* (n8)  */     -1,
1784
  /*(n,SP),y*/    -1,
1785
  /* spec  */     -1);
1786
  AddNorm("DEC",
1787
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xc6),
1788
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xce),
1789
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xd6),
1790
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xde),
1791
  /* ZIY   */     -1,
1792
  /* IY    */     -1,
1793
  /* (n,X) */     -1,
1794
  /* (n),X */     -1,
1795
  /* (n),Y */     -1,
1796
  /* (n),Z */     -1,
1797
  /* (n16) */     -1,
1798
  /* imm   */     -1,
1799
  /* ACC   */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280          , Is740 ? 0x1a : 0x3a),
1800
  /* NON   */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280          , Is740 ? 0x1a : 0x3a),
1801
  /* (n8)  */     -1,
1802
  /*(n,SP),y*/    -1,
1803
  /* spec  */     -1);
1804
  AddNorm("DEW",
1805
  /* ZA    */ MkMask(                              M_65CE02                                                         , 0xc3),
1806
  /* A     */     -1,
1807
  /* ZIX   */     -1,
1808
  /* IX    */     -1,
1809
  /* ZIY   */     -1,
1810
  /* IY    */     -1,
1811
  /* (n,X) */     -1,
1812
  /* (n),X */     -1,
1813
  /* (n),Y */     -1,
1814
  /* (n),Z */     -1,
1815
  /* (n16) */     -1,
1816
  /* imm   */     -1,
1817
  /* ACC   */     -1,
1818
  /* NON   */     -1,
1819
  /* (n8)  */     -1,
1820
  /*(n,SP),y*/    -1,
1821
  /* spec  */     -1);
1822
  AddNorm("CMP",
1823
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xc5),
1824
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xcd),
1825
  /* ZIX   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xd5),
1826
  /* IX    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xdd),
1827
  /* ZIY   */     -1,
1828
  /* IY    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xd9),
1829
  /* (n,X) */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0xc1),
1830
  /* (n),X */ MkMask(                                                     M_65C19                                   , 0xd1),
1831
  /* (n),Y */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S           | M_MELPS740 | M_HUC6280 | M_6502U, 0xd1),
1832
  /* (n),Z */ MkMask(                              M_65CE02                                                         , 0xd2),
1833
  /* (n16) */     -1,
1834
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xc9),
1835
  /* ACC   */     -1,
1836
  /* NON   */     -1,
1837
  /* (n8)  */ MkMask(         M_65SC02 | M_65C02            | M_W65C02S | M_65C19              | M_HUC6280          , Is65C19 ? 0xc1 : 0xd2),
1838
  /*(n,SP),y*/    -1,
1839
  /* spec  */     -1);
1840
  AddNorm("CPX",
1841
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xe4),
1842
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xec),
1843
  /* ZIX   */     -1,
1844
  /* IX    */     -1,
1845
  /* ZIY   */     -1,
1846
  /* IY    */     -1,
1847
  /* (n,X) */     -1,
1848
  /* (n),X */     -1,
1849
  /* (n),Y */     -1,
1850
  /* (n),Z */     -1,
1851
  /* (n16) */     -1,
1852
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xe0),
1853
  /* ACC   */     -1,
1854
  /* NON   */     -1,
1855
  /* (n8)  */     -1,
1856
  /*(n,SP),y*/    -1,
1857
  /* spec  */     -1);
1858
  AddNorm("CPY",
1859
  /* ZA    */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xc4),
1860
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xcc),
1861
  /* ZIX   */     -1,
1862
  /* IX    */     -1,
1863
  /* ZIY   */     -1,
1864
  /* IY    */     -1,
1865
  /* (n,X) */     -1,
1866
  /* (n),X */     -1,
1867
  /* (n),Y */     -1,
1868
  /* (n),Z */     -1,
1869
  /* (n16) */     -1,
1870
  /* imm   */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xc0),
1871
  /* ACC   */     -1,
1872
  /* NON   */     -1,
1873
  /* (n8)  */     -1,
1874
  /*(n,SP),y*/    -1,
1875
  /* spec  */     -1);
1876
  AddNorm("CPZ",
1877
  /* ZA    */ MkMask(                              M_65CE02                                                         , 0xd4),
1878
  /* A     */ MkMask(                              M_65CE02                                                         , 0xdc),
1879
  /* ZIX   */     -1,
1880
  /* IX    */     -1,
1881
  /* ZIY   */     -1,
1882
  /* IY    */     -1,
1883
  /* (n,X) */     -1,
1884
  /* (n),X */     -1,
1885
  /* (n),Y */     -1,
1886
  /* (n),Z */     -1,
1887
  /* (n16) */     -1,
1888
  /* imm   */ MkMask(                              M_65CE02                                                         , 0xc2),
1889
  /* ACC   */     -1,
1890
  /* NON   */     -1,
1891
  /* (n8)  */     -1,
1892
  /*(n,SP),y*/    -1,
1893
  /* spec  */     -1);
1894
  AddNorm("JMP",
1895
  /* ZA    */     -1,
1896
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x4c),
1897
  /* ZIX   */     -1,
1898
  /* IX    */     -1,
1899
  /* ZIY   */     -1,
1900
  /* IY    */     -1,
1901
  /* (n,X) */ MkMask(         M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19              | M_HUC6280          , 0x7c),
1902
  /* (n),X */     -1,
1903
  /* (n),Y */     -1,
1904
  /* (n),Z */     -1,
1905
  /* (n16) */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x6c),
1906
  /* imm   */     -1,
1907
  /* ACC   */     -1,
1908
  /* NON   */     -1,
1909
  /* (n8)  */ MkMask(                                                               M_MELPS740                      , 0xb2),
1910
  /*(n,SP),y*/    -1,
1911
  /* spec  */     -1);
1912
  AddNorm("JPI",
1913
  /* ZA    */     -1,
1914
  /* A     */     -1,
1915
  /* ZIX   */     -1,
1916
  /* IX    */     -1,
1917
  /* ZIY   */     -1,
1918
  /* IY    */     -1,
1919
  /* (n,X) */     -1,
1920
  /* (n),X */     -1,
1921
  /* (n),Y */     -1,
1922
  /* (n),Z */     -1,
1923
  /* (n16) */ MkMask(                                                     M_65C19                                   , 0x0c),
1924
  /* imm   */     -1,
1925
  /* ACC   */     -1,
1926
  /* NON   */     -1,
1927
  /* (n8)  */     -1,
1928
  /*(n,SP),y*/    -1,
1929
  /* spec  */     -1);
1930
  AddNorm("JSR",
1931
  /* ZA    */     -1,
1932
  /* A     */ MkMask(M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x20),
1933
  /* ZIX   */     -1,
1934
  /* IX    */     -1,
1935
  /* ZIY   */     -1,
1936
  /* IY    */     -1,
1937
  /* (n,X) */ MkMask(                              M_65CE02                                                         , 0x23),
1938
  /* (n),X */     -1,
1939
  /* (n),Y */     -1,
1940
  /* (n),Z */     -1,
1941
  /* (n16) */ MkMask(                              M_65CE02                                                         , 0x22),
1942
  /* imm   */     -1,
1943
  /* ACC   */     -1,
1944
  /* NON   */     -1,
1945
  /* (n8)  */ MkMask(                                                               M_MELPS740                      , 0x02),
1946
  /*(n,SP),y*/    -1,
1947
  /* spec  */ MkMask(                                                               M_MELPS740                      , 0x22));
1948
  AddNorm("RTN",
1949
  /* ZA    */     -1,
1950
  /* A     */     -1,
1951
  /* ZIX   */     -1,
1952
  /* IX    */     -1,
1953
  /* ZIY   */     -1,
1954
  /* IY    */     -1,
1955
  /* (n,X) */     -1,
1956
  /* (n),X */     -1,
1957
  /* (n),Y */     -1,
1958
  /* (n),Z */     -1,
1959
  /* (n16) */     -1,
1960
  /* imm   */ MkMask(                              M_65CE02                                                         , 0x62),
1961
  /* ACC   */     -1,
1962
  /* NON   */     -1,
1963
  /* (n8)  */     -1,
1964
  /*(n,SP),y*/    -1,
1965
  /* spec  */     -1);
1966
  AddNorm("SLO",
1967
  /* ZA    */ MkMask(                                                                                        M_6502U, 0x07),
1968
  /* A     */ MkMask(                                                                                        M_6502U, 0x0f),
1969
  /* ZIX   */ MkMask(                                                                                        M_6502U, 0x17),
1970
  /* IX    */ MkMask(                                                                                        M_6502U, 0x1f),
1971
  /* ZIY   */     -1,
1972
  /* IY    */ MkMask(                                                                                        M_6502U, 0x1b),
1973
  /* (n,X) */ MkMask(                                                                                        M_6502U, 0x03),
1974
  /* (n),X */     -1,
1975
  /* (n),Y */ MkMask(                                                                                        M_6502U, 0x13),
1976
  /* (n),Z */     -1,
1977
  /* (n16) */     -1,
1978
  /* imm   */     -1,
1979
  /* ACC   */     -1,
1980
  /* NON   */     -1,
1981
  /* (n8)  */     -1,
1982
  /*(n,SP),y*/    -1,
1983
  /* spec  */     -1);
1984
  AddNorm("ANC",
1985
  /* ZA    */     -1,
1986
  /* A     */     -1,
1987
  /* ZIX   */     -1,
1988
  /* IX    */     -1,
1989
  /* ZIY   */     -1,
1990
  /* IY    */     -1,
1991
  /* (n,X) */     -1,
1992
  /* (n),X */     -1,
1993
  /* (n),Y */     -1,
1994
  /* (n),Z */     -1,
1995
  /* (n16) */     -1,
1996
  /* imm   */ MkMask(                                                                                        M_6502U, 0x0b),
1997
  /* ACC   */     -1,
1998
  /* NON   */     -1,
1999
  /* (n8)  */     -1,
2000
  /*(n,SP),y*/    -1,
2001
  /* spec  */     -1);
2002
  AddNorm("RLA",
2003
  /* ZA    */ MkMask(                                                                                        M_6502U, 0x27),
2004
  /* A     */ MkMask(                                                                                        M_6502U, 0x2f),
2005
  /* ZIX   */ MkMask(                                                                                        M_6502U, 0x37),
2006
  /* IX    */ MkMask(                                                                                        M_6502U, 0x3f),
2007
  /* ZIY   */     -1,
2008
  /* IY    */ MkMask(                                                                                        M_6502U, 0x3b),
2009
  /* (n,X) */ MkMask(                                                                                        M_6502U, 0x23),
2010
  /* (n),X */     -1,
2011
  /* (n),Y */ MkMask(                                                                                        M_6502U, 0x33),
2012
  /* (n),Z */     -1,
2013
  /* (n16) */     -1,
2014
  /* imm   */     -1,
2015
  /* ACC   */     -1,
2016
  /* NON   */     -1,
2017
  /* (n8)  */     -1,
2018
  /*(n,SP),y*/    -1,
2019
  /* spec  */     -1);
2020
  AddNorm("SRE",
2021
  /* ZA    */ MkMask(                                                                                        M_6502U, 0x47),
2022
  /* A     */ MkMask(                                                                                        M_6502U, 0x4f),
2023
  /* ZIX   */ MkMask(                                                                                        M_6502U, 0x57),
2024
  /* IX    */ MkMask(                                                                                        M_6502U, 0x5f),
2025
  /* ZIY   */     -1,
2026
  /* IY    */ MkMask(                                                                                        M_6502U, 0x5b),
2027
  /* (n,X) */ MkMask(                                                                                        M_6502U, 0x43),
2028
  /* (n),X */     -1,
2029
  /* (n),Y */ MkMask(                                                                                        M_6502U, 0x53),
2030
  /* (n),Z */     -1,
2031
  /* (n16) */     -1,
2032
  /* imm   */     -1,
2033
  /* ACC   */     -1,
2034
  /* NON   */     -1,
2035
  /* (n8)  */     -1,
2036
  /*(n,SP),y*/    -1,
2037
  /* spec  */     -1);
2038
  AddNorm("RRA",
2039
  /* ZA    */ MkMask(                                                                                        M_6502U, 0x67),
2040
  /* A     */ MkMask(                                                                                        M_6502U, 0x6f),
2041
  /* ZIX   */ MkMask(                                                                                        M_6502U, 0x77),
2042
  /* IX    */ MkMask(                                                                                        M_6502U, 0x7f),
2043
  /* ZIY   */     -1,
2044
  /* IY    */ MkMask(                                                                                        M_6502U, 0x7b),
2045
  /* (n,X) */ MkMask(                                                                                        M_6502U, 0x63),
2046
  /* (n),X */     -1,
2047
  /* (n),Y */ MkMask(                                                                                        M_6502U, 0x73),
2048
  /* (n),Z */     -1,
2049
  /* (n16) */     -1,
2050
  /* imm   */     -1,
2051
  /* ACC   */     -1,
2052
  /* NON   */     -1,
2053
  /* (n8)  */     -1,
2054
  /*(n,SP),y*/    -1,
2055
  /* spec  */    -1);
2056
  AddNorm("ARR",
2057
  /* ZA    */     -1,
2058
  /* A     */     -1,
2059
  /* ZIX   */     -1,
2060
  /* IX    */     -1,
2061
  /* ZIY   */     -1,
2062
  /* IY    */     -1,
2063
  /* (n,X) */     -1,
2064
  /* (n),X */     -1,
2065
  /* (n),Y */     -1,
2066
  /* (n),Z */     -1,
2067
  /* (n16) */     -1,
2068
  /* imm   */ MkMask(                                                                                        M_6502U, 0x6b),
2069
  /* ACC   */     -1,
2070
  /* NON   */     -1,
2071
  /* (n8)  */     -1,
2072
  /*(n,SP),y*/    -1,
2073
  /* spec  */     -1);
2074
  AddNorm("SAX",
2075
  /* ZA    */ MkMask(                                                                                        M_6502U, 0x87),
2076
  /* A     */ MkMask(                                                                                        M_6502U, 0x8f),
2077
  /* ZIX   */     -1,
2078
  /* IX    */     -1,
2079
  /* ZIY   */ MkMask(                                                                                        M_6502U, 0x97),
2080
  /* IY    */     -1,
2081
  /* (n,X) */ MkMask(                                                                                        M_6502U, 0x83),
2082
  /* (n),X */     -1,
2083
  /* (n),Y */     -1,
2084
  /* (n),Z */     -1,
2085
  /* (n16) */     -1,
2086
  /* imm   */     -1,
2087
  /* ACC   */     -1,
2088
  /* NON   */ MkMask(                                                                            M_HUC6280          , 0x22),
2089
  /* (n8)  */     -1,
2090
  /*(n,SP),y*/    -1,
2091
  /* spec  */     -1);
2092
  AddNorm("ANE",
2093
  /* ZA    */     -1,
2094
  /* A     */     -1,
2095
  /* ZIX   */     -1,
2096
  /* IX    */     -1,
2097
  /* ZIY   */     -1,
2098
  /* IY    */     -1,
2099
  /* (n,X) */     -1,
2100
  /* (n),X */     -1,
2101
  /* (n),Y */     -1,
2102
  /* (n),Z */     -1,
2103
  /* (n16) */     -1,
2104
  /* imm   */ MkMask(                                                                                        M_6502U, 0x8b),
2105
  /* ACC   */     -1,
2106
  /* NON   */     -1,
2107
  /* (n8)  */     -1,
2108
  /*(n,SP),y*/    -1,
2109
  /* spec  */     -1);
2110
  AddNorm("SHA",
2111
  /* ZA    */     -1,
2112
  /* A     */     -1,
2113
  /* ZIX   */     -1,
2114
  /* IX    */ MkMask(                                                                                        M_6502U, 0x93),
2115
  /* ZIY   */     -1,
2116
  /* IY    */ MkMask(                                                                                        M_6502U, 0x9f),
2117
  /* (n,X) */     -1,
2118
  /* (n),X */     -1,
2119
  /* (n),Y */     -1,
2120
  /* (n),Z */     -1,
2121
  /* (n16) */     -1,
2122
  /* imm   */     -1,
2123
  /* ACC   */     -1,
2124
  /* NON   */     -1,
2125
  /* (n8)  */     -1,
2126
  /*(n,SP),y*/    -1,
2127
  /* spec  */     -1);
2128
  AddNorm("SHS",
2129
  /* ZA    */     -1,
2130
  /* A     */     -1,
2131
  /* ZIX   */     -1,
2132
  /* IX    */     -1,
2133
  /* ZIY   */     -1,
2134
  /* IY    */ MkMask(                                                                                        M_6502U, 0x9b),
2135
  /* (n,X) */     -1,
2136
  /* (n),X */     -1,
2137
  /* (n),Y */     -1,
2138
  /* (n),Z */     -1,
2139
  /* (n16) */     -1,
2140
  /* imm   */     -1,
2141
  /* ACC   */     -1,
2142
  /* NON   */     -1,
2143
  /* (n8)  */     -1,
2144
  /*(n,SP),y*/    -1,
2145
  /* spec  */     -1);
2146
  AddNorm("SHY",
2147
  /* ZA    */     -1,
2148
  /* A     */     -1,
2149
  /* ZIX   */     -1,
2150
  /* IX    */     -1,
2151
  /* ZIY   */     -1,
2152
  /* IY    */ MkMask(                                                                                        M_6502U, 0x9c),
2153
  /* (n,X) */     -1,
2154
  /* (n),X */     -1,
2155
  /* (n),Y */     -1,
2156
  /* (n),Z */     -1,
2157
  /* (n16) */     -1,
2158
  /* imm   */     -1,
2159
  /* ACC   */     -1,
2160
  /* NON   */     -1,
2161
  /* (n8)  */     -1,
2162
  /*(n,SP),y*/    -1,
2163
  /* spec  */     -1);
2164
  AddNorm("SHX",
2165
  /* ZA    */     -1,
2166
  /* A     */     -1,
2167
  /* ZIX   */     -1,
2168
  /* IX    */ MkMask(                                                                                        M_6502U, 0x9e),
2169
  /* ZIY   */     -1,
2170
  /* IY    */     -1,
2171
  /* (n,X) */     -1,
2172
  /* (n),X */     -1,
2173
  /* (n),Y */     -1,
2174
  /* (n),Z */     -1,
2175
  /* (n16) */     -1,
2176
  /* imm   */     -1,
2177
  /* ACC   */     -1,
2178
  /* NON   */     -1,
2179
  /* (n8)  */     -1,
2180
  /*(n,SP),y*/    -1,
2181
  /* spec  */     -1);
2182
  AddNorm("LAX",
2183
  /* ZA    */ MkMask(                                                                                        M_6502U, 0xa7),
2184
  /* A     */ MkMask(                                                                                        M_6502U, 0xaf),
2185
  /* ZIX   */     -1,
2186
  /* IX    */     -1,
2187
  /* ZIY   */ MkMask(                                                                                        M_6502U, 0xb7),
2188
  /* IY    */ MkMask(                                                                                        M_6502U, 0xbf),
2189
  /* (n,X) */ MkMask(                                                                                        M_6502U, 0xa3),
2190
  /* (n),X */     -1,
2191
  /* (n),Y */ MkMask(                                                                                        M_6502U, 0xb3),
2192
  /* (n),Z */     -1,
2193
  /* (n16) */     -1,
2194
  /* imm   */     -1,
2195
  /* ACC   */     -1,
2196
  /* NON   */     -1,
2197
  /* (n8)  */     -1,
2198
  /*(n,SP),y*/    -1,
2199
  /* spec  */     -1);
2200
  AddNorm("LXA",
2201
  /* ZA    */     -1,
2202
  /* A     */     -1,
2203
  /* ZIX   */     -1,
2204
  /* IX    */     -1,
2205
  /* ZIY   */     -1,
2206
  /* IY    */     -1,
2207
  /* (n,X) */     -1,
2208
  /* (n),X */     -1,
2209
  /* (n),Y */     -1,
2210
  /* (n),Z */     -1,
2211
  /* (n16) */     -1,
2212
  /* imm   */ MkMask(                                                                                        M_6502U, 0xab),
2213
  /* ACC   */     -1,
2214
  /* NON   */     -1,
2215
  /* (n8)  */     -1,
2216
  /*(n,SP),y*/    -1,
2217
  /* spec  */     -1);
2218
  AddNorm("LAE",
2219
  /* ZA    */     -1,
2220
  /* A     */     -1,
2221
  /* ZIX   */     -1,
2222
  /* IX    */     -1,
2223
  /* ZIY   */     -1,
2224
  /* IY    */ MkMask(                                                                                        M_6502U, 0xbb),
2225
  /* (n,X) */     -1,
2226
  /* (n),X */     -1,
2227
  /* (n),Y */     -1,
2228
  /* (n),Z */     -1,
2229
  /* (n16) */     -1,
2230
  /* imm   */     -1,
2231
  /* ACC   */     -1,
2232
  /* NON   */     -1,
2233
  /* (n8)  */     -1,
2234
  /*(n,SP),y*/    -1,
2235
  /* spec  */     -1);
2236
  AddNorm("DCP",
2237
  /* ZA    */ MkMask(                                                                                        M_6502U, 0xc7),
2238
  /* A     */ MkMask(                                                                                        M_6502U, 0xcf),
2239
  /* ZIX   */ MkMask(                                                                                        M_6502U, 0xd7),
2240
  /* IX    */ MkMask(                                                                                        M_6502U, 0xdf),
2241
  /* ZIY   */     -1,
2242
  /* IY    */ MkMask(                                                                                        M_6502U, 0xdb),
2243
  /* (n,X) */ MkMask(                                                                                        M_6502U, 0xc3),
2244
  /* (n),X */     -1,
2245
  /* (n),Y */ MkMask(                                                                                        M_6502U, 0xd3),
2246
  /* (n),Z */     -1,
2247
  /* (n16) */     -1,
2248
  /* imm   */     -1,
2249
  /* ACC   */     -1,
2250
  /* NON   */     -1,
2251
  /* (n8)  */     -1,
2252
  /*(n,SP),y*/    -1,
2253
  /* spec  */     -1);
2254
  AddNorm("SBX",
2255
  /* ZA    */     -1,
2256
  /* A     */     -1,
2257
  /* ZIX   */     -1,
2258
  /* IX    */     -1,
2259
  /* ZIY   */     -1,
2260
  /* IY    */     -1,
2261
  /* (n,X) */     -1,
2262
  /* (n),X */     -1,
2263
  /* (n),Y */     -1,
2264
  /* (n),Z */     -1,
2265
  /* (n16) */     -1,
2266
  /* imm   */ MkMask(                                                                                        M_6502U, 0xcb),
2267
  /* ACC   */     -1,
2268
  /* NON   */     -1,
2269
  /* (n8)  */     -1,
2270
  /*(n,SP),y*/    -1,
2271
  /* spec  */     -1);
2272
  AddNorm("ISB",
2273
  /* ZA    */ MkMask(                                                                                        M_6502U, 0xe7),
2274
  /* A     */ MkMask(                                                                                        M_6502U, 0xef),
2275
  /* ZIX   */ MkMask(                                                                                        M_6502U, 0xf7),
2276
  /* IX    */ MkMask(                                                                                        M_6502U, 0xff),
2277
  /* ZIY   */     -1,
2278
  /* IY    */ MkMask(                                                                                        M_6502U, 0xfb),
2279
  /* (n,X) */ MkMask(                                                                                        M_6502U, 0xe3),
2280
  /* (n),X */     -1,
2281
  /* (n),Y */ MkMask(                                                                                        M_6502U, 0xf3),
2282
  /* (n),Z */     -1,
2283
  /* (n16) */     -1,
2284
  /* imm   */     -1,
2285
  /* ACC   */     -1,
2286
  /* NON   */     -1,
2287
  /* (n8)  */     -1,
2288
  /*(n,SP),y*/    -1,
2289
  /* spec  */     -1);
2290
  AddNorm("EXC",
2291
  /* ZA    */     -1,
2292
  /* A     */     -1,
2293
  /* ZIX   */ MkMask(                                                     M_65C19                                   , 0xd4),
2294
  /* IX    */     -1,
2295
  /* ZIY   */     -1,
2296
  /* IY    */     -1,
2297
  /* (n,X) */     -1,
2298
  /* (n),X */     -1,
2299
  /* (n),Y */     -1,
2300
  /* (n),Z */     -1,
2301
  /* (n16) */     -1,
2302
  /* imm   */     -1,
2303
  /* ACC   */     -1,
2304
  /* NON   */     -1,
2305
  /* (n8)  */     -1,
2306
  /*(n,SP),y*/    -1,
2307
  /* spec  */     -1);
2308
  AddNorm("TAM",
2309
  /* ZA    */     -1,
2310
  /* A     */     -1,
2311
  /* ZIX   */     -1,
2312
  /* IX    */     -1,
2313
  /* ZIY   */     -1,
2314
  /* IY    */     -1,
2315
  /* (n,X) */     -1,
2316
  /* (n),X */     -1,
2317
  /* (n),Y */     -1,
2318
  /* (n),Z */     -1,
2319
  /* (n16) */     -1,
2320
  /* imm   */ MkMask(                                                                            M_HUC6280          , 0x53),
2321
  /* ACC   */     -1,
2322
  /* NON   */     -1,
2323
  /* (n8)  */     -1,
2324
  /*(n,SP),y*/    -1,
2325
  /* spec  */     -1);
2326
  AddNorm("TMA",
2327
  /* ZA    */     -1,
2328
  /* A     */     -1,
2329
  /* ZIX   */     -1,
2330
  /* IX    */     -1,
2331
  /* ZIY   */     -1,
2332
  /* IY    */     -1,
2333
  /* (n,X) */     -1,
2334
  /* (n),X */     -1,
2335
  /* (n),Y */     -1,
2336
  /* (n),Z */     -1,
2337
  /* (n16) */     -1,
2338
  /* imm   */ MkMask(                                                                            M_HUC6280          , 0x43),
2339
  /* ACC   */     -1,
2340
  /* NON   */     -1,
2341
  /* (n8)  */     -1,
2342
  /*(n,SP),y*/    -1,
2343
  /* spec  */     -1);
2344
  AddNorm("PHW",
2345
  /* ZA    */     -1,
2346
  /* A     */ MkMask(                              M_65CE02                                                         , 0xfc),
2347
  /* ZIX   */     -1,
2348
  /* IX    */     -1,
2349
  /* ZIY   */     -1,
2350
  /* IY    */     -1,
2351
  /* (n,X) */     -1,
2352
  /* (n),X */     -1,
2353
  /* (n),Y */     -1,
2354
  /* (n),Z */     -1,
2355
  /* (n16) */     -1,
2356
  /* imm   */ MkMask(                              M_65CE02                                                         , 0xf4),
2357
  /* ACC   */     -1,
2358
  /* NON   */ MkMask(                                                     M_65C19                                   , 0x23),
2359
  /* (n8)  */     -1,
2360
  /*(n,SP),y*/    -1,
2361
  /* spec  */     -1);
2362
 
2363
  InstrZ = 0;
2364
  AddCond("BEQ", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xf0, 0xf3);
2365
  AddCond("BNE", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xd0, 0xd3);
2366
  AddCond("BPL", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x10, 0x13);
2367
  AddCond("BMI", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x30, 0x33);
2368
  AddCond("BCC", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x90, 0x93);
2369
  AddCond("BCS", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0xb0, 0xb3);
2370
  AddCond("BVC", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x50, 0x53);
2371
  AddCond("BVS", M_6502 | M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280 | M_6502U, 0x70, 0x73);
2372
  AddCond("BRA",          M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280          , 0x80, 0x83);
2373
  AddCond("BRU",          M_65SC02 | M_65C02 | M_65CE02 | M_W65C02S | M_65C19 | M_MELPS740 | M_HUC6280          , 0x80, 0x83);
2374
  AddCond("BSR",                               M_65CE02                                    | M_HUC6280          ,
2375
          (MomCPU == CPUHUC6280) ? 0x44 : 0x00,
2376
          (MomCPU == CPU65CE02) ? 0x63 : 0x00);
2377
 
2378
  add_moto8_pseudo(InstTable, e_moto_pseudo_flags_le | e_moto_pseudo_flags_ds | e_moto_pseudo_flags_ddb | e_moto_pseudo_flags_dcm);
2379
  AddInstTable(InstTable, "DB", eIntPseudoFlag_LittleEndian | eIntPseudoFlag_AllowInt | eIntPseudoFlag_AllowString | eIntPseudoFlag_MotoRep, DecodeIntelDB);
2380
  AddInstTable(InstTable, "DW", eIntPseudoFlag_LittleEndian | eIntPseudoFlag_AllowInt | eIntPseudoFlag_AllowString | eIntPseudoFlag_MotoRep, DecodeIntelDW);
2381
}
2382
 
2383
static void DeinitFields(void)
2384
{
2385
  DestroyInstTable(InstTable);
2386
 
2387
  order_array_free(FixedOrders);
2388
  order_array_free(NormOrders);
2389
  order_array_free(CondOrders);
2390
}
2391
 
2392
/*---------------------------------------------------------------------------*/
2393
 
2394
static void MakeCode_65(void)
2395
{
2396
  This_CLI_SEI_Flag = (Memo("CLI") || Memo("SEI"));
2397
  This_ADC_SBC_Flag = (Memo("ADC ") || Memo("SBC"));
2398
 
2399
  /* Pseudoanweisungen */
2400
 
2401
  if (!LookupInstTable(InstTable, OpPart.str.p_str))
2402
    WrStrErrorPos(ErrNum_UnknownInstruction, &OpPart);
2403
 
2404
  Last_CLI_SEI_Flag = This_CLI_SEI_Flag;
2405
  Last_ADC_SBC_Flag = This_ADC_SBC_Flag;
2406
}
2407
 
2408
static void InitCode_65(void)
2409
{
2410
  int z;
2411
 
2412
  Last_CLI_SEI_Flag = False;
2413
  Last_ADC_SBC_Flag = False;
2414
  for (z = 0; z < 8; z++)
2415
    MPR[z] = z;
2416
}
2417
 
2418
static Boolean IsDef_65(void)
2419
{
2420
  return False;
2421
}
2422
 
2423
static void SwitchFrom_65(void)
2424
{
2425
  DeinitFields();
2426
}
2427
 
2428
static Boolean ChkZeroArgs(void)
2429
{
2430
  return (0 == ArgCnt);
2431
}
2432
 
2433
static void SwitchTo_65(void)
2434
{
2435
  TurnWords = False;
2436
  SetIntConstMode(eIntConstModeMoto);
2437
 
2438
  PCSymbol = "*";
2439
  HeaderID = 0x11;
2440
  NOPCode = 0xea;
2441
  DivideChars = ",";
2442
  HasAttrs = False;
2443
 
2444
  ValidSegs = 1 << SegCode;
2445
  Grans[SegCode] = 1; ListGrans[SegCode] = 1; SegInits[SegCode] = 0;
2446
  SegLimits[SegCode] = (MomCPU == CPUHUC6280) ? 0x1fffff : 0xffff;
2447
 
2448
  if (MomCPU == CPUM740)
2449
  {
2450
    static ASSUMERec ASSUME740s[] =
2451
    {
2452
      { "SP", &SpecPage, 0, 0xff, -1, NULL }
2453
    };
2454
 
2455
    pASSUMERecs = ASSUME740s;
2456
    ASSUMERecCnt = (sizeof(ASSUME740s) / sizeof(*ASSUME740s));
2457
    SetIsOccupiedFnc = ChkZeroArgs;
2458
  }
2459
  else if (MomCPU == CPUHUC6280)
2460
  {
2461
    static ASSUMERec ASSUME6280s[] =
2462
    {
2463
      { "MPR0", MPR + 0, 0, 0xff, -1, NULL },
2464
      { "MPR1", MPR + 1, 0, 0xff, -1, NULL },
2465
      { "MPR2", MPR + 2, 0, 0xff, -1, NULL },
2466
      { "MPR3", MPR + 3, 0, 0xff, -1, NULL },
2467
      { "MPR4", MPR + 4, 0, 0xff, -1, NULL },
2468
      { "MPR5", MPR + 5, 0, 0xff, -1, NULL },
2469
      { "MPR6", MPR + 6, 0, 0xff, -1, NULL },
2470
      { "MPR7", MPR + 7, 0, 0xff, -1, NULL },
2471
    };
2472
 
2473
    pASSUMERecs = ASSUME6280s;
2474
    ASSUMERecCnt = (sizeof(ASSUME6280s) / sizeof(*ASSUME6280s));
2475
    SetIsOccupiedFnc = ChkZeroArgs;
2476
  }
2477
  else if (MomCPU == CPU65CE02)
2478
  {
2479
    static ASSUMERec ASSUME65CE02s[] =
2480
    {
2481
      { "B", &RegB, 0, 0xff, 0, NULL }
2482
    };
2483
 
2484
    pASSUMERecs = ASSUME65CE02s;
2485
    ASSUMERecCnt = (sizeof(ASSUME65CE02s) / sizeof(*ASSUME65CE02s));
2486
  }
2487
  else
2488
    SetIsOccupiedFnc = NULL;
2489
 
2490
  MakeCode = MakeCode_65;
2491
  IsDef = IsDef_65;
2492
  SwitchFrom = SwitchFrom_65;
2493
  InitFields();
2494
}
2495
 
2496
void code65_init(void)
2497
{
2498
  CPU6502    = AddCPU("6502"     , SwitchTo_65);
2499
  CPU65SC02  = AddCPU("65SC02"   , SwitchTo_65);
2500
  CPU65C02   = AddCPU("65C02"    , SwitchTo_65);
2501
  CPU65CE02  = AddCPU("65CE02"   , SwitchTo_65);
2502
  CPUW65C02S = AddCPU("W65C02S"  , SwitchTo_65);
2503
  CPU65C19   = AddCPU("65C19"    , SwitchTo_65);
2504
  CPUM740    = AddCPU("MELPS740" , SwitchTo_65);
2505
  CPUHUC6280 = AddCPU("HUC6280"  , SwitchTo_65);
2506
  CPU6502U   = AddCPU("6502UNDOC", SwitchTo_65);
2507
 
2508
  AddInitPassProc(InitCode_65);
2509
}