<?php

  
// 0,4,8,C
  //              Imm   Zpg   ZpxY  IndY  AbsX
  //           ..    Rel   ZpgX  IndX  Abs   AbsY
  
set"brk""00'--'--'--'--'--'--'--'--'--'--'--" );
  
set"nop""--'--'--'04'14'--'--'--'0C'1C'--'--" ); // 04=DOP, 0C=TOP, 14=DOP, 1C = TOP
  
set"jsr""--'--'--'--'--'--'--'--'20'--'--'--" ); // <<Irregular addressing mode>>
  
set"bit""--'--'--'24'--'--'--'--'2C'--'--'--" ); // 20 = jsr, 28=plp, 34=dop, 3C=top
  
set"nop""--'--'--'--'34'--'--'--'--'3C'--'--" ); // 24=bit,         34=DOP, 3C = TOP
  
set"rti""40'--'--'--'--'--'--'--'--'--'--'--" );
  
set"jmp""--'--'--'--'--'--'--'--'4C'--'--'6C" );
  
set"nop""--'--'--'44'54'--'--'--'--'5C'--'--" ); // 4C = jmp, 40=rti, 48=pha, 5C=TOP
  
set"rts""60'--'--'--'--'--'--'--'--'--'--'--" );  
  
set"nop""--'--'--'64'74'--'--'--'--'7C'--'--" ); //                           7c=top
  
set"sty""--'80'--'84'94'--'--'--'8C'--'--'--" ); // 80=DOP
  
set"ldy""--'A0'--'A4'B4'--'--'--'AC'BC'--'--" ); // A8=tay
  
set"cpy""--'C0'--'C4'--'--'--'--'CC'--'--'--" ); // C8=iny  D4=dop, DC=top
  
set"nop""--'--'--'--'D4'--'--'--'--'DC'--'--" ); //                 D4=DOP, DC = TOP
  
set"cpx""--'E0'--'E4'--'--'--'--'EC'--'--'--" ); // E8=inx, F4=dop, FC=top
  
set"nop""--'--'--'--'F4'--'--'--'--'FC'--'--" ); //                 F4=DOP, FC = TOP

  
set"bpl""--'--'10'--'--'--'--'--'--'--'--'--" );
  
set"bmi""--'--'30'--'--'--'--'--'--'--'--'--" );
  
set"bvc""--'--'50'--'--'--'--'--'--'--'--'--" );
  
set"bvs""--'--'70'--'--'--'--'--'--'--'--'--" );
  
set"bcc""--'--'90'--'--'--'--'--'--'--'--'--" );
  
set"bcs""--'--'B0'--'--'--'--'--'--'--'--'--" );
  
set"bne""--'--'D0'--'--'--'--'--'--'--'--'--" );
  
set"beq""--'--'F0'--'--'--'--'--'--'--'--'--" );

  
set"php""08'--'--'--'--'--'--'--'--'--'--'--" );
  
set"plp""28'--'--'--'--'--'--'--'--'--'--'--" );
  
set"pha""48'--'--'--'--'--'--'--'--'--'--'--" );
  
set"pla""68'--'--'--'--'--'--'--'--'--'--'--" );
  
set"dey""88'--'--'--'--'--'--'--'--'--'--'--" );
  
set"tay""A8'--'--'--'--'--'--'--'--'--'--'--" );
  
set"iny""C8'--'--'--'--'--'--'--'--'--'--'--" );
  
set"inx""E8'--'--'--'--'--'--'--'--'--'--'--" );

  
set"clc""18'--'--'--'--'--'--'--'--'--'--'--" ); // 1 : 0001
  
set"sec""38'--'--'--'--'--'--'--'--'--'--'--" ); // 1 : 0011
  
set"cli""58'--'--'--'--'--'--'--'--'--'--'--" ); // 4 : 0101
  
set"sei""78'--'--'--'--'--'--'--'--'--'--'--" ); // 4 : 0111
  
set"clv""B8'--'--'--'--'--'--'--'--'--'--'--" ); // 64: 1011
  
set"cld""D8'--'--'--'--'--'--'--'--'--'--'--" ); // 8 : 1101
  
set"sed""F8'--'--'--'--'--'--'--'--'--'--'--" ); // 8 : 1111

  
set"tya""98'--'--'--'--'--'--'--'--'--'--'--" );


  
// 1,5,9,D
  
set"ora""--'09'--'05'15'--'01'11'0D'1D'19'--" );
  
set"and""--'29'--'25'35'--'21'31'2D'3D'39'--" );
  
set"eor""--'49'--'45'55'--'41'51'4D'5D'59'--" );
  
set"adc""--'69'--'65'75'--'61'71'6D'7D'79'--" );
  
set"sta""--'89'--'85'95'--'81'91'8D'9D'99'--" ); // 89=DOP (A is "stored" into an imm, nothing is achieved)
  
set"lda""--'A9'--'A5'B5'--'A1'B1'AD'BD'B9'--" );
  
set"cmp""--'C9'--'C5'D5'--'C1'D1'CD'DD'D9'--" );
  
set"sbc""--'E9'--'E5'F5'--'E1'F1'ED'FD'F9'--" );  

  
// 2,6,A,E
  
set"asl""0A'02'--'06'16'--'--'12'0E'1E'--'--" ); // 02=JAM, 12=JAM, 1A=nop
  
set"rol""2A'22'--'26'36'--'--'32'2E'3E'--'--" ); // 22=JAM, 32=JAM, 3A=nop
  
set"lsr""4A'42'--'46'56'--'--'52'4E'5E'--'--" ); // 42=JAM, 52=JAM, 5A=nop
  
set"ror""6A'62'--'66'76'--'--'72'6E'7E'--'--" ); // 62=JAM, 72=JAM, 7A=nop
  
set"stx""--'82'--'86'--'96'--'92'8E'--'--'--" ); // 8A=txa, 92=JAM, 9A=txs, 82=dop (X is "stored" into an imm)
  
set"ldx""--'A2'--'A6'--'B6'--'B2'AE'--'BE'--" ); // AA=tax, B2=JAM, BA=tsx
  
set"dec""--'--'--'C6'D6'--'--'D2'CE'DE'--'--" ); // CA=dex, D2=JAM, DA=nop, C2=dop
  
set"inc""--'--'--'E6'F6'--'--'F2'EE'FE'--'--" ); // EA=nop, F2=JAM, FA=nop, E2=dop

  
set"nop""--'C2'--'--'--'--'--'--'--'--'--'--" ); // C2 and E2 are not implemented as DEC and INC,
  
set"nop""--'E2'--'--'--'--'--'--'--'--'--'--" ); // because the flags must remain unchanged.

  
set"txa""8A'--'--'--'--'--'--'--'--'--'--'--" );
  
set"tax""AA'--'--'--'--'--'--'--'--'--'--'--" );
  
set"dex""CA'--'--'--'--'--'--'--'--'--'--'--" );
  
set"nop""EA'--'--'--'--'--'--'--'--'--'--'--" ); // inx=E8, not EA

  
set"nop""1A"); // 1 cycle
  
set"nop""3A");
  
set"nop""5A");
  
set"nop""7A");
  
set"txs""9A'--'--'--'--'--'--'--'--'--'--'--" );
  
set"tsx""BA'--'--'--'--'--'--'--'--'--'--'--" );
  
set"nop""DA");
  
set"nop""FA");

  
// 3,7,B,F

  
set"slo""--'--'--'07'17'--'03'13'0F'1F'1B'--" ); // ASL + ORA (proper synthesis)
  
set"rla""--'--'--'27'37'--'23'33'2F'3F'3B'--" ); // ROL + AND (proper synthesis)
  
set"sre""--'--'--'47'57'--'43'53'4F'5F'5B'--" ); // LSR + EOR (proper synthesis)
  
set"rra""--'--'--'67'77'--'63'73'6F'7F'7B'--" ); // ROR + ADC (proper synthesis)
  
set"sax""--'--'--'87'--'97'83'--'8F'--'--'--" ); // AND(A,X) + store t to memory (register not changed); 93=SHA; 9B=SHS
  
  
set"lax""--'AB'--'A7'--'B7'A3'B3'AF'--'BF'--" ); // LDA + LAX (proper synthesis)
  
set"las""--'--'--'--'--'--'--'--'--'--'BB'--" ); // LAS = LDA+LAX + TXS
  
set"dcp""--'--'--'C7'D7'--'C3'D3'CF'DF'DB'--" ); // DEC + CMP
  
set"isb""--'--'--'E7'F7'--'E3'F3'EF'FF'FB'--" ); // INC + SBC

  
set"anc""--'0B'--'--'--'--'--'--'--'--'--'--" ); // AND, and CF=result.7, aka. AAC
  
set"anc""--'2B'--'--'--'--'--'--'--'--'--'--" ); // AND, and CF=result.7
  
set"asr""--'4B'--'--'--'--'--'--'--'--'--'--" ); // AND, LSR (proper synthesis)
  
set"arr""--'6B'--'--'--'--'--'--'--'--'--'--" ); // AND + ROR, also sets V. And C differently.
  
set"ane""--'8B'--'--'--'--'--'--'--'--'--'--" ); // (A|0xEE) & x & t, set nz
  
set"sbx""--'CB'--'--'--'--'--'--'--'--'--'--" ); // X = A&X - t; store to X
  
set"sbc""--'EB'--'--'--'--'--'--'--'--'--'--" );
  
set"shy""--'--'--'--'--'--'--'--'--'9C'--'--" ); // SHY/SYA/SAY
  
set"shx""--'--'--'--'--'--'--'--'--'--'9E'--" ); // SHX/SXA/XAS
  
set"shs""--'--'--'--'--'--'--'--'--'--'9B'--" ); // SHS
  
set"sha""--'--'--'--'--'--'--'93'--'--'9F'--" ); 

/* 
  These opcodes intentionally left unimplemented, because they require
  instruction logic that does not come as a side effect of official
  instructions currently:

     CB SBX (aka. AAX,AXS)
        Requires three operands: A, X and immediate. We don't even try.
        HOWEVER, ACCORDING TO TRACE, A and X ARE NOT ACCESSED. X, P ARE WRITTEN TO.
     8B ANE (aka. XAA)
        Requires three operands: A, X and immediate. We don't even try.


     9C SHY / SYA = 9C abs,x
        FUNCTION: store (wrap(addr+X), t = Y & (addr >> 8))
     9E SHX / SXA = 9E abs,y
        FUNCTION: store (wrap(addr+Y), t = X & (addr >> 8))
     93,9F SHA/AXA/AHX
        FUNCTION: store (addr,         t = A & X & (addr >> 8))
        HOWEVER, ACCORDING TO TRACE; A and X ARE NOT ACCESSED BY THIS FUNCTION
     9B    SHS/XAS/TAS
        = SHA + store to S
        HOWEVER, ACCORDING TO TRACE, A and X ARE NOT ACCESSED; Y _IS_.
        NO READ OCCURS.

  The following opcodes do require abnormal measures, but are implemented nonetheless:

     SAX
        Requires an AND operation before store.
     ASR
        Requires an AND operation before LSR.
     ANC
        Requires an AND operation before setting CF from result bit 7.
        Normally, setting CF from result bit 7 is integrated into LSR code.
     ARR
        Requires an AND operation before ROR. Requires particular V flag handling.
     LAS/LAR (BB)
  Operation order requirements:
  
     ASL/ROL  (before AND, before $store)
     
     DEC      (before CMP, before $store)
     INC      (before SBC, before $store)

     LSR/ROR

     $store   (before slo:ORA)

     AND      (after ROL, before LSR)
     ORA      (after ASL)
     EOR      (after LSR)

     ADC/SBC  (after ROR, after INC)
     
     CMP       (after DEC)
     
    ... 
     
  
    


  

*/

  // UNOFFICIAL OPCODES  
  // TODO: JAM = 02,12,22,32,42,52,62,72,92,B2,D2,F2

//set( "shx", "--'--'--'--'--'--'--'--'--'--'9E'--" );
//set( "shy", "--'--'--'--'--'--'--'--'--'9C'--'--" );

//set( "top", "--'0C"); // Note: 4 cycles
//set( "top", "--'--'--'--'--'--'--'--'--'1C'--'--" );
//set( "top", "--'--'--'--'--'--'--'--'--'3C'--'--" );
//set( "top", "--'--'--'--'--'--'--'--'--'5C'--'--" );
//set( "top", "--'--'--'--'--'--'--'--'--'7C'--'--" );
//set( "top", "--'--'--'--'--'--'--'--'--'DC'--'--" );
//set( "top", "--'--'--'--'--'--'--'--'--'FC'--'--" );
//set( "dop", "80"); // 2 cycles
//set( "dop", "82");
//set( "dop", "89");
//set( "dop", "C2");
//set( "dop", "E2");
//set( "dop", "04"); // 3 cycles
//set( "dop", "44");
//set( "dop", "64");
//set( "dop", "14"); // 4 cycles
//set( "dop", "34");
//set( "dop", "54");
//set( "dop", "74");
//set( "dop", "D4");
//set( "dop", "F4");
//set( "jam", "02"); // ?
//set( "jam", "12");
//set( "jam", "22");
//set( "jam", "32");
//set( "jam", "42");
//set( "jam", "52");
//set( "jam", "62");
//set( "jam", "72");
//set( "jam", "92");
//set( "jam", "B2");
//set( "jam", "D2");
//set( "jam", "F2");
  
//set( "sbc", "--'--'--'--'--'--'--'--'--'--'--'--" );