home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 5 / MA_Cover_5.iso / ppc / atari / atari800-0.8.6 / cpu_m68k.s < prev    next >
Encoding:
Text File  |  1998-05-10  |  48.8 KB  |  2,162 lines

  1. ;This code is copyrighted by Empty Head (c)1997, but
  2. ;you can use it without any charge in your own programs
  3. ;use it on your own risk ;)
  4.  
  5.  
  6. ;DEBUG ;if it is active it is possible to trace through 6502 memory
  7. ;SERVER ;if conrol server is active
  8. ;C_BUGGING ;debug in C - logical, isn't it ? :)
  9.  
  10.     ifd DEBUG
  11.     bra START
  12.     endc
  13.     OPT        P=68040,O+,W-
  14.  
  15.     ifnd DEBUG
  16.     xref _GETBYTE ;procedures for A800 bytes
  17.     xref _PUTBYTE
  18.     xref _Escape
  19.     xref _break_addr
  20.     xref _tisk
  21.     xdef _regPC
  22.     xdef _regA
  23.     xdef _regP ;/* Processor Status Byte (Partial) */
  24.     xdef _regS
  25.     xdef _regX
  26.     xdef _regY
  27.     xref _memory
  28.     xref _attrib
  29.     xdef _IRQ
  30.     xdef _NMI
  31.     xdef _RTI
  32.     xdef _GO
  33.     xdef _CPUGET
  34.     xdef _INIT
  35.     xdef _OPMODE_TABLE
  36.     ifd C_BUGGING
  37.     xref _CEKEJ
  38.     xdef _ADRESA
  39.     xdef _AIRQ
  40.     endc
  41.     endc
  42.  
  43. regA
  44. _regA    ds.b 1   ;d0 -A
  45. regX
  46. _regX    ds.b 1   ;d1 -X
  47. regY
  48. _regY    ds.b 1   ;d2 -Y
  49. regS
  50. _regS    ds.b 1   ;stack
  51. regPC
  52. _regPC    ds.w 1   ;a4 PC
  53. regP
  54. VBDIFLAG             ;same as regP
  55. _regP    ds.b 1   ;   -CCR
  56. IRQ             ;I have to reserve it there because other it is 32-bit number (in GCC)
  57. _IRQ    ds.b 1
  58.  
  59.  
  60.     even
  61.  
  62.  
  63. CD    equr a6 ;cycles counter down
  64. _pointer equr a1
  65. memory_pointer equr a5
  66. attrib_pointer equr a3
  67. stack_pointer equr a2
  68. PC6502    equr a4
  69.  
  70.  
  71. ZFLAG    equr d5 ;we used it straight in shifting, because it is faster than move again
  72.                     ;I mean rol, ror, asl, asr, lsr, lsl
  73. NFLAG    equr d3 ;
  74. CCR6502    equr d4 ;only carry is usable (Extended on 68000)
  75. A    equr d0
  76. X    equr d1
  77. Y    equr d2  ;$206 ;d2
  78.  
  79. ;d6    contains usually adress where we are working
  80. ;d7    contains is a working register
  81.  
  82.  
  83. LoHi  macro        ;change order of lo and hi byte in d6
  84.       ror.w #8,d7
  85.       endm
  86.  
  87. ;    ==========================================================
  88. ;    Emulated Registers and Flags are kept local to this module
  89. ;    ==========================================================
  90.  
  91.  
  92.  
  93. ;#define UPDATE_GLOBAL_REGS regPC=PC;regS=S;regA=A;regX=X;regY=Y
  94. UPDATE_GLOBAL_REGS    macro
  95.     sub.l memory_pointer,PC6502
  96.     sub.l memory_pointer,stack_pointer
  97.     lea -$101(stack_pointer),stack_pointer
  98.     move.w stack_pointer,d6
  99.     lea _regP(pc),a1
  100.     move.w PC6502,-(a1) ;_PC6502
  101.     move.b d6,-(a1) ;regS
  102.     move.b Y,-(a1) ;regY
  103.     move.b X,-(a1) ;regX
  104.     move.b A,-(a1) ;regA
  105.     endm
  106.  
  107. ;#define UPDATE_LOCAL_REGS PC=regPC;S=regS;A=regA;X=regX;Y=regY
  108. UPDATE_LOCAL_REGS macro
  109.     lea _regA(pc),a1
  110.     clr.w A
  111.     move.b (a1)+,A ;A register
  112.     clr.w X
  113.     move.b (a1)+,X ;X
  114.     clr.w Y
  115.     move.b (a1)+,Y ;Y
  116.     clr.l d7
  117.     move.b (a1)+,d7 ;stack regS
  118.     lea $101(memory_pointer),stack_pointer
  119.     add.l d7,stack_pointer
  120.     move.w (a1)+,d7
  121.     move.l memory_pointer,PC6502
  122.     add.l d7,PC6502
  123.     endm
  124.  
  125.  
  126.  
  127.  
  128.  
  129. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  130. ;~~~~~ WAKE UP PROCESSOR IN DEBUG MODE ~
  131. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  132.  
  133.  
  134.     ifd DEBUG
  135. START:      bsr _INIT ;make from OPCODE TABLE & MODE TABLE -  OPMODE TABLE
  136.     clr.l -(a7)
  137.     move.w #32,-(a7)
  138.     trap #1
  139.     addq.l #6,a7
  140.     move.l d0,-(a7)
  141.     lea _memory,memory_pointer
  142.     clr.b IRQ ;no interrupt
  143.     move.b #$20,regP ;unused bit is always 1
  144.     move.b #$ff,regS ;set up stack to the star
  145.     move.w (memory_pointer,$fffc.l),d7 ;start addres
  146.     ;move.w #$0020,d7
  147.     LoHi
  148.     move.w d7,regPC
  149.     UPDATE_LOCAL_REGS
  150.     clr.l d0
  151.     ;move.l #3560,d0
  152.     ;lea TEST,a0
  153.     move.l $4ba,-(a7)
  154. ANOTHER:
  155.     move.l #27360,-(a7)  ;one screen
  156.     bsr _GO
  157.     addq.l #4,a7
  158.     ;move.l (a7)+,a0
  159.     ;move.l d7,(a0)+
  160.     sub.l #1,AAA
  161.     bne.s ANOTHER
  162.     move.l $4ba.l,d7
  163.     sub.l (a7)+,d7
  164.     move.l d7,$200.w
  165.     move.w #32,-(a7)
  166.     trap #1
  167.     addq.l #6,a7
  168.     illegal
  169.     clr.w -(a7)
  170.     trap #1
  171.     endc
  172.  
  173.     section data
  174. AAA:    dc.l 50
  175.     section text
  176.  
  177.  
  178.  
  179. _INIT:
  180.     movem.l a2/a3/d2,-(a7)  ;copy opcyc table
  181.     lea OPMODE_TABLE,a1
  182.     ;move.l a1,d2 ;we need to start on a word adress
  183.     ;add.l #4,d2
  184.     ;and.l #$fffffc,d2
  185.     ;move.l d2,a1
  186.     ;lea OPCODE_TABLE,a1 ;3rd case of jump (mode, get, then this command)
  187.     lea MODE_TABLE2,a0 ;1st case of jump (mode)
  188.     lea MODE_TABLE1,a3 ;2nd case of jump (jump after mode (in put case it is instruction, if get then we will call get byte routine)
  189.     move.w #255,d0
  190. COPY
  191.  
  192.     move.l (a0)+,(a1)+ ;base jump (instruction or mode)
  193.     move.l (a3)+,d2    ;jump
  194.     cmp.l #opcode_81,d2
  195.     beq.s WRITE_WRITE
  196.     cmp.l #opcode_84,d2
  197.     beq.s WRITE_WRITE
  198.     cmp.l #opcode_85,d2
  199.     beq.s WRITE_WRITE
  200.     cmp.l #opcode_86,d2
  201.     beq.s WRITE_WRITE
  202.     cmp.l #opcode_8c,d2
  203.     beq.s WRITE_WRITE
  204.     cmp.l #opcode_8d,d2
  205.     beq.s WRITE_WRITE
  206.     cmp.l #opcode_8e,d2
  207.     beq.s WRITE_WRITE
  208.     cmp.l #opcode_91,d2
  209.     beq.s WRITE_WRITE
  210.     cmp.l #opcode_94,d2
  211.     beq.s WRITE_WRITE
  212.     cmp.l #opcode_95,d2
  213.     beq.s WRITE_WRITE
  214.     cmp.l #opcode_96,d2
  215.     beq.s WRITE_WRITE
  216.     cmp.l #opcode_99,d2
  217.     beq.s WRITE_WRITE
  218.     cmp.l #opcode_9d,d2
  219.     beq.s WRITE_WRITE
  220.     ;sub.l #JUMP_CODE+2,d2
  221.     move.l d2,(a1)+ ;write jump down
  222.     ;addq.l #2,a1
  223.     bra.s NEXT
  224. WRITE_WRITE:
  225.     ;sub.l #JUMP_CODE+2,d2
  226.     bset #31,d2
  227.     move.l d2,(a1)+ ;write jump down
  228.     ;addq.l #2,a1
  229.  
  230. NEXT:    dbf d0,COPY
  231.     movem.l (a7)+,a2/a3/d2
  232.     rts
  233.  
  234.  
  235. ;these are bit in MC68000 CCR register
  236. NB68    equ 3
  237. EB68    equ 4 ;used as a carry in 6502 emulation
  238. ZB68    equ 2
  239. OB68    equ 1
  240. CB68    equ 0
  241.  
  242. N_FLAG equ $80    ;tested in ZN flag in the same way as usual on 6502
  243. N_FLAGB equ 7
  244. V_FLAG equ $40
  245. V_FLAGB equ 6
  246. G_FLAG equ $20
  247. G_FLAGB equ $5
  248. B_FLAG equ $10
  249. B_FLAGB equ 4
  250. D_FLAG equ $08
  251. D_FLAGB equ 3
  252. I_FLAG equ $04
  253. I_FLAGB equ 2
  254. Z_FLAG equ $02
  255. Z_FLAGB equ 1
  256. C_FLAG equ $01
  257. C_FLAGB equ 0
  258.  
  259. ;void CPU_GetStatus (void) - assembler (CPU_ST.S)
  260. ;void CPU_PutStatus (void) - assembler (CPU_ST.S)
  261. ;void CPU_Reset (void) - C (CPU_ST.C)
  262. ;void SetRAM (int addr1, int addr2) - C (CPU_ST.C)
  263. ;void SetROM (int addr1, int addr2) - C (CPU_ST.C)
  264. ;void SetHARDWARE (int addr1, int addr2) - C (CPU_ST.C)
  265. ;void NMI (void) - C (CPU_ST.C)
  266. ;void GO (int cycles); - assembler (CPU_ST.S)
  267.  
  268.  
  269.  
  270. SetI    macro
  271.     bset #I_FLAGB,_regP
  272.     endm
  273.  
  274. ClrI    macro
  275.     bclr #I_FLAGB,_regP
  276.     endm
  277.  
  278. SetB    macro
  279.     bset #B_FLAGB,_regP
  280.     endm
  281.  
  282. ClrD    macro
  283.     bclr #D_FLAGB,_regP
  284.     endm
  285.  
  286. SetD    macro
  287.     bset #D_FLAGB,_regP
  288.     endm
  289.  
  290. ;#define SetN regP|=N_FLAG
  291. ;#define ClrN regP&=(~N_FLAG)
  292. ;#define SetV regP|=V_FLAG
  293. ;#define ClrV regP&=(~V_FLAG)
  294. ;#define SetB regP|=B_FLAG
  295. ;#define ClrB regP&=(~B_FLAG)
  296. ;#define SetD regP|=D_FLAG
  297. ;#define ClrD regP&=(~D_FLAG)
  298. ;#define SetI regP|=I_FLAG
  299. ;#define ClrI regP&=(~I_FLAG)
  300. ;#define SetZ regP|=Z_FLAG
  301. ;#define ClrZ regP&=(~Z_FLAG)
  302. ;#define SetC regP|=C_FLAG
  303. ;#define ClrC regP&=(~C_FLAG)
  304.  
  305. ;extern UBYTE memory[65536];
  306.  
  307. ;extern int IRQ;
  308.  
  309. ;#endif
  310.  
  311.  
  312. goto     macro
  313.     bra \1
  314.     endm
  315.  
  316.  
  317. ;static char *rcsid = "$Id: cpu_m68k.s,v 1.2 1998/02/21 15:02:46 david Exp $";
  318.  
  319.  
  320.  
  321. ;static UBYTE    N;    /* bit7 zero (0) or bit 7 non-zero (1) */
  322. ;static UBYTE    Z;    /* zero (0) or non-zero (1) */
  323. ;static UBYTE    V;
  324. ;static UBYTE    C;    /* zero (0) or one(1) */
  325.  
  326. RAM     equ 0
  327. ROM     equ 1
  328. HARDWARE    equ 2
  329.  
  330.  
  331. ;/*
  332. ; * The following array is used for 6502 instruction profiling
  333. ; */
  334.  
  335. ;int count[256];
  336. ;UBYTE memory[65536];
  337.  
  338. ;int IRQ;
  339.  
  340. ;static UBYTE attrib[65536];
  341.  
  342.  
  343. ;#define    GetByte(addr)    ((attrib[addr] == HARDWARE) ? Atari800_GetByte(addr) : memory[addr])
  344. ;#define    PutByte(addr,byte)    if (attrib[addr] == RAM) memory[addr] = byte; else if (attrib[addr] == HARDWARE) if (Atari800_PutByte(addr,byte)) break;
  345.  
  346. ;/*
  347. ;    ===============================================================
  348. ;    Z flag: This actually contains the result of an operation which
  349. ;        would modify the Z flag. The value is tested for
  350. ;        equality by the BEQ and BNE instruction.
  351. ;    ===============================================================
  352. ;*/
  353.  
  354. ; Bit    : 76543210
  355. ; CCR6502: ***XNZVC
  356. ; _RegP  : NV*BDIZC
  357.  
  358. ConvertSTATUS_RegP macro
  359.     move.b _regP,d6 ;put flag VBDI into d6
  360.     bset #C_FLAGB,d6 ;put there carry flag
  361.     btst #EB68,CCR6502
  362.     bne.s .SETC\@
  363.     bclr #C_FLAGB,d6
  364. .SETC\@    bset #N_FLAGB,d6 ;put there Negative flag
  365.     tst.b NFLAG
  366.     bmi.s .SETN\@
  367.     bclr #N_FLAGB,d6
  368. .SETN\@    bset #Z_FLAGB,d6 ;put there zero flag
  369.     tst.b ZFLAG
  370.     beq.s .SETZ\@   ;is there beware! reverse compare is ok
  371.     bclr #Z_FLAGB,d6
  372. .SETZ\@
  373.     endm
  374.  
  375. ConvertRegP_STATUS macro
  376.     move.b _regP,d6
  377.     moveq #-1,CCR6502
  378.     btst #C_FLAGB,d6
  379.     bne.s .SETC\@
  380.     clr.w CCR6502
  381. .SETC\@    clr.b ZFLAG
  382.     btst #Z_FLAGB,d6
  383.     bne.s .SETZ\@ ;reverse is ok
  384.     not.b ZFLAG
  385. .SETZ\@    clr.b NFLAG
  386.     btst #N_FLAGB,d6
  387.     beq.s .SETN\@
  388.     not.b NFLAG
  389. .SETN\@
  390.     endm
  391.  
  392.  
  393. CPU_GetStatus macro
  394.     ConvertSTATUS_RegP
  395.     move.b d6,_regP
  396.     endm
  397.  
  398. CPU_PutStatus macro
  399.     ConvertRegP_STATUS
  400.     endm
  401.  
  402.  
  403. PHP    macro
  404.     ConvertSTATUS_RegP
  405.     move.b d6,-(stack_pointer)
  406.     endm
  407.  
  408. PLP    macro
  409.     move.b (stack_pointer)+,_regP
  410.     ConvertRegP_STATUS
  411.     endm
  412.  
  413.  
  414. ;#define AND(t_data) data = t_data; Z = N = A &= data;
  415. ;#define CMP(t_data) data = t_data; Z = N = A - data; C = (A >= data)
  416. ;#define CPX(t_data) data = t_data; Z = N = X - data; C = (X >= data);
  417. ;#define CPY(t_data) data = t_data; Z = N = Y - data; C = (Y >= data);
  418. ;#define EOR(t_data) data = t_data; Z = N = A ^= data;
  419. ;#define LDA(data) Z = N = A = data;
  420. ;#define LDX(data) Z = N = X = data;
  421. ;#define LDY(data) Z = N = Y = data;
  422. ;#define ORA(t_data) data = t_data; Z = N = A |= data
  423.  
  424. ;#define PHP data =  (N & 0x80); \
  425. ;            data |= V ? 0x40 : 0; \
  426. ;            data |= (regP & 0x3c); \
  427. ;        data |= (Z == 0) ? 0x02 : 0; \
  428. ;        data |= C; \
  429. ;        memory[0x0100 + S--] = data;
  430. ;
  431. ;#define PLP data = memory[0x0100 + ++S]; \
  432. ;        N = (data & 0x80); \
  433. ;        V = (data & 0x40) ? 1 : 0; \
  434. ;        Z = (data & 0x02) ? 0 : 1; \
  435. ;        C = (data & 0x01); \
  436. ;            regP = (data & 0x3c) | 0x20;
  437. ;
  438.  
  439.  
  440. CPUGET:
  441. _CPUGET:
  442.     ConvertSTATUS_RegP
  443.     move.b d6,_regP
  444.     rts
  445.  
  446.  
  447.  
  448. NMI:
  449. _NMI:
  450.     movem.l d0-d7/a0-a6,-(a7)
  451.     lea _memory,memory_pointer
  452.     move.w _regPC,d6 ;we will put adress on stack of 6502
  453.     ror.w #8,d6
  454.             clr.l d7        ;find stack in memory
  455.     move.b _regS,d7
  456.             move.l d7,stack_pointer
  457.     add.l memory_pointer,stack_pointer
  458.     lea $101(stack_pointer),stack_pointer
  459.     move.w d6,-(stack_pointer) ;put back adress onto stack
  460.     move.b _regP,-(stack_pointer) ;put P onto stack YEAAAH!
  461.     SetI
  462.  
  463.     ;put regPC & Stack pointer adress on its place
  464.     move.w (memory_pointer,$fffa.l),d7
  465.     LoHi
  466.     move.w d7,_regPC
  467.     lea -$101(stack_pointer),stack_pointer
  468.     move.l stack_pointer,d7 ;put stack
  469.     sub.l memory_pointer,d7
  470.     move.b d7,_regS
  471.     movem.l (a7)+,d0-d7/a0-a6
  472.     ifd SERVER
  473.     move.w #1,WAIT
  474.     endc
  475.     rts
  476.  
  477.       ;UBYTE S = regS;
  478.       ;UBYTE data;
  479.  
  480.       ;memory[0x0100 + S--] = regPC >> 8;
  481.       ;memory[0x0100 + S--] = regPC & 0xff;
  482.       ;PHP;
  483.       ;SetI;
  484.       ;regPC = (memory[0xfffb] << 8) | memory[0xfffa];
  485.       ;regS = S;
  486.  
  487.  
  488.  
  489. ;/*
  490. ;    ==============================================================
  491. ;    The first switch statement is used to determine the addressing
  492. ;    mode, while the second switch implements the opcode. When I
  493. ;    have more confidence that these are working correctly they
  494. ;    will be combined into a single switch statement. At the
  495. ;    moment changes can be made very easily.
  496. ;    ==============================================================
  497. ;*/
  498.  
  499.     section data
  500. CYCLES:
  501.     dc.w 7, 2, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6
  502.       dc.w 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7
  503.       dc.w 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6
  504.       dc.w 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7
  505.  
  506.       dc.w 6, 6, 0, 8, 3, 3, 7, 5, 3, 2, 2, 2, 3, 4, 6, 6
  507.       dc.w 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 0, 7
  508.       dc.w 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6
  509.       dc.w 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7
  510.  
  511.       dc.w 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4
  512.       dc.w 2, 6, 0, 6, 4, 4, 4, 4, 2, 5, 2, 5, 5, 5, 5, 5
  513.       dc.w 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4
  514.       dc.w 2, 5, 0, 5, 4, 4, 4, 4, 2, 4, 2, 4, 4, 4, 4, 4
  515.  
  516.       dc.w 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6
  517.       dc.w 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7
  518.       dc.w 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6
  519.       dc.w 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7
  520.  
  521.  
  522.  
  523. MODE_TABLE1:
  524. ;when we will call instruction straight, this table is used
  525. ;when we want to get byte, this table contains addr to GET BYTE routine
  526. ;when we want to put byte, this table contains addr to own command
  527. ;when we want to put and get byte (rol, ror, inc etc.), this routine is the same as in the case GET BYTE
  528. ;if the instruction take byte straight from command, this routine contains addr to own comman as well
  529.  
  530.  
  531.     dc.l opcode_00, opcode_01, opcode_02, opcode_03
  532.     ;     brk         ora        illegal     illegal
  533.  
  534.     dc.l opcode_04,opcode_05,opcode_06, opcode_07
  535.     ;     nop         ora          asl        nop
  536.  
  537.     dc.l opcode_08,opcode_09,opcode_0a,opcode_0b
  538.     ;     php         ora        asla       illegal
  539.  
  540.     dc.l opcode_0c,opcode_0d,opcode_0e,opcode_0f
  541.     ;     nop 3       ora          asl      illegal
  542.  
  543.     dc.l opcode_10,opcode_11,  opcode_12, opcode_13
  544.     ;     bpl         ora        illegal    illegal
  545.  
  546.     dc.l opcode_14,opcode_15, opcode_16,  opcode_17
  547.     ;     nop         ora         asl       illegal
  548.  
  549.     dc.l opcode_18,opcode_19, opcode_1a,   opcode_1b
  550.     ;     clc         ora         nop       illegal
  551.  
  552.           dc.l opcode_1c,opcode_1d,  opcode_1e, opcode_1f
  553.     ;     nop         ora        asl        illegal
  554.  
  555.           dc.l opcode_20,opcode_21,opcode_22,  opcode_23
  556.     ;     jsr         and       illegal     illegal
  557.  
  558.           dc.l opcode_24,opcode_25,opcode_26,opcode_27
  559.     ;     bit         and        rol        illegal
  560.  
  561.           dc.l opcode_28, opcode_29,    opcode_2a,  opcode_2b
  562.     ;     plp        and         rolA      illegal
  563.  
  564.           dc.l opcode_2c, opcode_2d, opcode_2e, opcode_2f
  565.     ;      bit       and         rol       illegal
  566.  
  567.           dc.l opcode_30, opcode_31, opcode_32, opcode_33
  568.     ;      bmi       and        illegal     illegal
  569.  
  570.           dc.l opcode_34, opcode_35, opcode_36, opcode_37
  571.     ;     nop        and         rol       illegal
  572.  
  573.           dc.l opcode_38, opcode_39, opcode_3a, opcode_3b
  574.     ;      sec        and        nop        illegal
  575.  
  576.           dc.l opcode_3c, opcode_3d, opcode_3e, opcode_3f
  577.     ;      nop         and       rol        illegal
  578.  
  579.           dc.l opcode_40, opcode_41, opcode_42, opcode_43
  580.             ;      rti        eor        illegal   illegal
  581.  
  582.           dc.l opcode_44, opcode_45, opcode_46, opcode_47
  583.     ;      nop        eor        lsr       illegal
  584.  
  585.           dc.l opcode_48, opcode_49, opcode_4a, opcode_4b
  586.           ;      pha        eor        lsrA       illegal
  587.  
  588.           dc.l opcode_4c, opcode_4d, opcode_4e, opcode_4f
  589.     ;      jmp        eor        lsr       illegal
  590.  
  591.           dc.l opcode_50, opcode_51,  opcode_52, opcode_53
  592.     ;      bvc       eor        illegal     illegal
  593.  
  594.           dc.l opcode_54, opcode_55, opcode_56, opcode_57
  595.     ;      nop        eor      lsr       illegal
  596.  
  597.           dc.l opcode_58, opcode_59, opcode_5a, opcode_5b
  598.     ;      cli        eor      nop         illegal
  599.  
  600.           dc.l opcode_5c, opcode_5d, opcode_5e, opcode_5f
  601.     ;      nop        eor        lsr        illegal
  602.  
  603.           dc.l opcode_60, opcode_61, opcode_62, opcode_63
  604.     ;      rts        adc        illegal    illegal
  605.  
  606.           dc.l opcode_64, opcode_65, opcode_66, opcode_67
  607.     ;      nop        adc        ror        illegal
  608.  
  609.           dc.l opcode_68, opcode_69,opcode_6a,opcode_6b
  610.     ;      pla       adc         rorA       illegal
  611.  
  612.           dc.l opcode_6c, opcode_6d, opcode_6e, opcode_6f
  613.     ;    jmp (abcd)   adc      ror          illegal
  614.  
  615.           dc.l opcode_70, opcode_71, opcode_72, opcode_73
  616.     ;      bvs        adc      illegal    illegal
  617.  
  618.           dc.l opcode_74, opcode_75, opcode_76, opcode_77
  619.     ;      nop         adc       ror       illegal
  620.  
  621.           dc.l opcode_78, opcode_79, opcode_7a, opcode_7b
  622.     ;     SEI          adc        illegal   illegal
  623.  
  624.           dc.l opcode_7c, opcode_7d, opcode_7e, opcode_7f
  625.     ;     nop          adc       ror        illegal
  626.  
  627.           dc.l opcode_80, opcode_81, opcode_82, opcode_83
  628.     ;     nop          sta       nop        illegal
  629.  
  630.           dc.l opcode_84, opcode_85, opcode_86,opcode_87
  631.     ;     sty           sta       stx        illegal
  632.  
  633.           dc.l opcode_88, opcode_89, opcode_8a, opcode_8b
  634.     ;     dey          nop        txa       illegal
  635.  
  636.           dc.l opcode_8c, opcode_8d, opcode_8e, opcode_8f
  637.     ;     sty           sta       stx        illegal
  638.  
  639.           dc.l opcode_90, opcode_91, opcode_92, opcode_93
  640.     ;      bcc         sta       illegal    illegal
  641.  
  642.           dc.l opcode_94, opcode_95, opcode_96, opcode_97
  643.     ;      sty       sta         stx        illegal
  644.  
  645.           dc.l opcode_98, opcode_99, opcode_9a, opcode_9b
  646.     ;     tya        sta         txs         illegal
  647.  
  648.           dc.l opcode_9c, opcode_9d, opcode_9e, opcode_9f
  649.     ;     illegal     sta         ilegal     illegal
  650.  
  651.           dc.l opcode_a0,    opcode_a1, opcode_a2, opcode_a3
  652.     ;      ldy         lda        ldx        lax
  653.  
  654.           dc.l opcode_a4, opcode_a5, opcode_a6, opcode_a7
  655.     ;     ldy        lda        ldx         lax
  656.  
  657.           dc.l opcode_a8, opcode_a9,     opcode_aa, opcode_ab
  658.      ;     tay         lda         tax      illegal
  659.  
  660.           dc.l opcode_ac, opcode_ad, opcode_ae, opcode_af
  661.     ;      ldy         lda        ldx        lax
  662.  
  663.           dc.l opcode_b0, opcode_b1, opcode_b2, opcode_b3
  664.     ;      bcs       lda         illegal    lax
  665.  
  666.           dc.l opcode_b4, opcode_b5, opcode_b6, opcode_b7
  667.     ;      ldy        lda         ldx       lax
  668.  
  669.           dc.l opcode_b8, opcode_b9, opcode_ba, opcode_bb
  670.     ;      clv         lda        tsx        illegal
  671.  
  672.           dc.l opcode_bc, opcode_bd, opcode_be, opcode_bf
  673.     ;       ldy        lda         ldx           lax
  674.  
  675.           dc.l opcode_c0, opcode_c1, opcode_c2, opcode_c3
  676.     ;    cpy          cmp         nop        illegal
  677.  
  678.           dc.l opcode_c4, opcode_c5, opcode_c6, opcode_c7
  679.     ;     cpy         cmp       dec         illegal
  680.  
  681.           dc.l opcode_c8, opcode_c9,  opcode_ca, opcode_cb
  682.     ;      iny       cmp       dex         illegal
  683.  
  684.           dc.l opcode_cc, opcode_cd, opcode_ce, opcode_cf
  685.     ;     cpy        cmp        dec        illegal
  686.  
  687.           dc.l opcode_d0, opcode_d1, opcode_d2, opcode_d3
  688.     ;      bne       cmp         escrts      illegal
  689.  
  690.           dc.l opcode_d4, opcode_d5, opcode_d6, opcode_d7
  691.     ;     nop         cmp      dec         illegal
  692.  
  693.           dc.l opcode_d8, opcode_d9, opcode_da, opcode_db
  694.     ;     cld         cmp          nop     illegal
  695.  
  696.           dc.l opcode_dc, opcode_dd, opcode_de, opcode_df
  697.     ;      nop         cmp        dec       illegal
  698.  
  699.           dc.l opcode_e0, opcode_e1, opcode_e2, opcode_e3
  700.      ;     cpx         sbc        nop         nop
  701.  
  702.           dc.l opcode_e4, opcode_e5, opcode_e6, opcode_e7
  703.     ;     cpx        sbc          inc        illegal
  704.  
  705.           dc.l opcode_e8, opcode_e9,opcode_ea, opcode_eb
  706.     ;      inx       sbc           nop      illegal
  707.  
  708.           dc.l opcode_ec, opcode_ed, opcode_ee, opcode_ef
  709.     ;       cpx      sbc          inc         illegal
  710.  
  711.     dc.l opcode_f0, opcode_f1, opcode_f2, opcode_f3
  712.     ;     beq          sbc        esc#ab     illegal
  713.  
  714.           dc.l opcode_f4, opcode_f5, opcode_f6, opcode_f7
  715.     ;     nop          sbc        inc       illegal
  716.  
  717.           dc.l opcode_f8, opcode_f9, opcode_fa, opcode_fb
  718.     ;     sed         sbc         nop         illegal
  719.  
  720.           dc.l opcode_fc, opcode_fd, opcode_fe, opcode_ff
  721.     ;     nop         sbc          inc        esc#ab
  722.  
  723.  
  724.  
  725. MODE_TABLE2:
  726.     dc.l opcode_00, INDIRECT_X, opcode_02, opcode_03
  727.     ;     brk         ora        illegal     illegal
  728.  
  729.     dc.l opcode_04,  ZPAGE,      ZPAGE,   opcode_07
  730.     ;     nop         ora          asl        nop
  731.  
  732.     dc.l opcode_08,  DIRECT,   opcode_0a, opcode_0b
  733.     ;     php         ora          asla     illegal
  734.  
  735.     dc.l opcode_0c, ABSOLUTE,   ABSOLUTE,  opcode_0f
  736.     ;     nop 3       ora          asl      illegal
  737.  
  738.     dc.l opcode_10, INDIRECT_Y, opcode_12, opcode_13
  739.     ;     bpl         ora        illegal    illegal
  740.  
  741.     dc.l opcode_14,   ZPAGE_X,   ZPAGE_X,  opcode_17
  742.     ;     nop         ora         asl       illegal
  743.  
  744.     dc.l opcode_18, ABSOLUTE_Y, opcode_1a, opcode_1b
  745.     ;     clc         ora         nop       illegal
  746.  
  747.           dc.l opcode_1c, ABSOLUTE_X,ABSOLUTE_X, opcode_1f
  748.     ;     nop         ora        asl        illegal
  749.  
  750.           dc.l opcode_20, INDIRECT_X,opcode_22,  opcode_23
  751.     ;     jsr         and       illegal     illegal
  752.  
  753.           dc.l ZPAGE,      ZPAGE,    ZPAGE,      opcode_27
  754.     ;     bit         and        rol        illegal
  755.  
  756.           dc.l opcode_28, DIRECT,    opcode_2a,  opcode_2b
  757.     ;     plp        and         rolA      illegal
  758.  
  759.            dc.l ABSOLUTE, ABSOLUTE,   ABSOLUTE,   opcode_2f
  760.     ;      bit       and         rol       illegal
  761.  
  762.           dc.l opcode_30, INDIRECT_Y, opcode_32, opcode_33
  763.     ;      bmi       and        illegal     illegal
  764.  
  765.           dc.l opcode_34, ZPAGE_X,    ZPAGE_X, opcode_37
  766.     ;     nop        and         rol       illegal
  767.  
  768.           dc.l opcode_38, ABSOLUTE_Y, opcode_3a, opcode_3b
  769.     ;      sec        and        nop        illegal
  770.  
  771.           dc.l opcode_3c, ABSOLUTE_X, ABSOLUTE_X, opcode_3f
  772.     ;      nop         and       rol        illegal
  773.  
  774.           dc.l opcode_40, INDIRECT_X, opcode_42, opcode_43
  775.             ;      rti        eor        illegal   illegal
  776.  
  777.           dc.l opcode_44,  ZPAGE,    ZPAGE,      opcode_47
  778.     ;      nop        eor        lsr       illegal
  779.  
  780.           dc.l opcode_48, DIRECT,     opcode_4a, opcode_4b
  781.           ;      pha        eor        lsrA       illegal
  782.  
  783.     dc.l opcode_4c, ABSOLUTE, ABSOLUTE,    opcode_4f
  784.     ;      jmp        eor        lsr       illegal
  785.  
  786.           dc.l opcode_50, INDIRECT_Y,  opcode_52, opcode_53
  787.     ;      bvc       eor        illegal     illegal
  788.  
  789.           dc.l opcode_54, ZPAGE_X,  ZPAGE_X, opcode_57
  790.     ;      nop        eor      lsr       illegal
  791.  
  792.           dc.l opcode_58, ABSOLUTE_Y, opcode_5a, opcode_5b
  793.     ;      cli        eor      nop         illegal
  794.  
  795.           dc.l opcode_5c, ABSOLUTE_X, ABSOLUTE_X, opcode_5f
  796.     ;      nop        eor        lsr        illegal
  797.  
  798.           dc.l opcode_60, INDIRECT_X, opcode_62, opcode_63
  799.     ;      rts        adc        illegal    illegal
  800.  
  801.           dc.l opcode_64, ZPAGE,      ZPAGE,     opcode_67
  802.     ;      nop        adc        ror        illegal
  803.  
  804.           dc.l opcode_68, DIRECT,   opcode_6a,  opcode_6b
  805.     ;      pla       adc         rorA       illegal
  806.  
  807.           dc.l opcode_6c, ABSOLUTE, ABSOLUTE,   opcode_6f
  808.     ;    jmp (abcd)   adc      ror          illegal
  809.  
  810.           dc.l opcode_70, INDIRECT_Y, opcode_72, opcode_73
  811.     ;      bvs        adc      illegal    illegal
  812.  
  813.           dc.l opcode_74,  ZPAGE_X,   ZPAGE_X,   opcode_77
  814.     ;      nop         adc       ror       illegal
  815.  
  816.           dc.l opcode_78, ABSOLUTE_Y, opcode_7a, opcode_7b
  817.     ;     SEI          adc        illegal   illegal
  818.  
  819.           dc.l opcode_7c, ABSOLUTE_X, ABSOLUTE_X, opcode_7f
  820.     ;     nop          adc       ror        illegal
  821.  
  822.           dc.l opcode_80, INDIRECT_X, opcode_82, opcode_83
  823.     ;     nop          sta       nop        illegal
  824.  
  825.           dc.l ZPAGE,     ZPAGE,      ZPAGE,     opcode_87
  826.     ;     sty           sta       stx        illegal
  827.  
  828.           dc.l opcode_88, opcode_89, opcode_8a, opcode_8b
  829.     ;     dey          nop        txa       illegal
  830.  
  831.           dc.l ABSOLUTE,  ABSOLUTE,  ABSOLUTE, opcode_8f
  832.     ;     sty           sta       stx        illegal
  833.  
  834.           dc.l opcode_90, INDIRECT_Y, opcode_92, opcode_93
  835.     ;      bcc         sta       illegal    illegal
  836.  
  837.           dc.l ZPAGE_X,   ZPAGE_X,   ZPAGE_Y, opcode_97
  838.     ;      sty       sta         stx        illegal
  839.  
  840.  
  841.           dc.l opcode_98, ABSOLUTE_Y, opcode_9a, opcode_9b
  842.     ;     tya        sta         txs         illegal
  843.  
  844.           dc.l opcode_9c, ABSOLUTE_X, opcode_9e, opcode_9f
  845.     ;     illegal     sta         ilegal     illegal
  846.  
  847.           dc.l DIRECT,    INDIRECT_X, DIRECT,    INDIRECT_X
  848.     ;      ldy         lda        ldx        lax
  849.  
  850.           dc.l ZPAGE,     ZPAGE,     ZPAGE,      ZPAGE
  851.     ;     ldy        lda        ldx         lax
  852.  
  853.           dc.l opcode_a8, DIRECT,     opcode_aa, opcode_ab
  854.      ;     tay         lda         tax      illegal
  855.  
  856.           dc.l ABSOLUTE, ABSOLUTE,   ABSOLUTE,   ABSOLUTE
  857.     ;      ldy         lda        ldx        lax
  858.  
  859.           dc.l opcode_b0, INDIRECT_Y, opcode_b2, INDIRECT_Y
  860.     ;      bcs       lda         illegal    lax
  861.  
  862.           dc.l ZPAGE_X,  ZPAGE_X,    ZPAGE_Y,    ZPAGE_Y
  863.     ;      ldy        lda         ldx       lax
  864.  
  865.           dc.l opcode_b8, ABSOLUTE_Y, opcode_ba, opcode_bb
  866.     ;      clv         lda        tsx        illegal
  867.  
  868.           dc.l ABSOLUTE_X, ABSOLUTE_X, ABSOLUTE_Y,  ABSOLUTE_Y
  869.     ;       ldy        lda         ldx           lax
  870.  
  871.           dc.l DIRECT,    INDIRECT_X, opcode_c2, opcode_c3
  872.     ;    cpy          cmp         nop        illegal
  873.  
  874.           dc.l ZPAGE,       ZPAGE,    ZPAGE,     opcode_c7
  875.     ;     cpy         cmp       dec         illegal
  876.  
  877.           dc.l opcode_c8, DIRECT,  opcode_ca, opcode_cb
  878.     ;      iny       cmp       dex         illegal
  879.  
  880.           dc.l ABSOLUTE,  ABSOLUTE, ABSOLUTE, opcode_cf
  881.     ;     cpy        cmp        dec        illegal
  882.  
  883.           dc.l opcode_d0, INDIRECT_Y, opcode_d2, opcode_d3
  884.     ;      bne       cmp         escrts      illegal
  885.  
  886.           dc.l opcode_d4, ZPAGE_X,    ZPAGE_X,   opcode_d7
  887.     ;     nop         cmp      dec         illegal
  888.  
  889.  
  890.           dc.l opcode_d8, ABSOLUTE_Y, opcode_da, opcode_db
  891.     ;     cld         cmp          nop     illegal
  892.  
  893.           dc.l opcode_dc, ABSOLUTE_X, ABSOLUTE_X, opcode_df
  894.     ;      nop         cmp        dec       illegal
  895.  
  896.           dc.l DIRECT,    INDIRECT_X, opcode_e2, opcode_e3
  897.      ;     cpx         sbc        nop         nop
  898.  
  899.           dc.l ZPAGE,    ZPAGE,       ZPAGE,     opcode_e7
  900.     ;     cpx        sbc          inc        illegal
  901.  
  902.           dc.l opcode_e8, DIRECT,     opcode_ea, opcode_eb
  903.     ;      inx       sbc           nop      illegal
  904.  
  905.           dc.l ABSOLUTE,  ABSOLUTE,   ABSOLUTE, opcode_ef
  906.     ;       cpx      sbc          inc         illegal
  907.  
  908.     dc.l opcode_f0, INDIRECT_Y, opcode_f2, opcode_f3
  909.     ;     beq          sbc        esc#ab     illegal
  910.  
  911.           dc.l opcode_f4, ZPAGE_X,     ZPAGE_X,  opcode_f7
  912.     ;     nop          sbc        inc       illegal
  913.  
  914.           dc.l opcode_f8, ABSOLUTE_Y, opcode_fa, opcode_fb
  915.     ;     sed         sbc         nop         illegal
  916.  
  917.           dc.l opcode_fc, ABSOLUTE_X, ABSOLUTE_X, opcode_ff
  918.     ;     nop         sbc          inc        esc#ab
  919.  
  920.  
  921.  
  922.  
  923.     section text
  924.  
  925. _GO: ;cycles (d0)
  926.  
  927.  
  928. ;  UWORD PC;
  929. ;  UBYTE S;
  930. ;  UBYTE A;
  931. ;  UBYTE X;
  932. ;  UBYTE Y;
  933. ;
  934. ;  UWORD    addr;
  935. ;  UBYTE    data;
  936.  
  937. ;/*
  938. ;   This used to be in the main loop but has been removed to improve
  939. ;   execution speed. It does not seem to have any adverse effect on
  940. ;   the emulation for two reasons:-
  941. ;
  942. ;   1. NMI's will can only be raised in atari_custom.c - there is
  943. ;      no way an NMI can be generated whilst in this routine.
  944. ;
  945. ;   2. The timing of the IRQs are not that critical.
  946. ;*/
  947.  
  948.     movem.l d0-d7/a0-a6,-(a7)
  949.     move.w 66(a7),CD ;write how much cycles (should be 6)
  950.     lea _memory,memory_pointer
  951.     UPDATE_LOCAL_REGS
  952.     ConvertRegP_STATUS
  953.     lea OPMODE_TABLE,a0
  954.     lea _attrib,attrib_pointer
  955.     tst.b _IRQ
  956.     beq GET_FIRST_INSTRUCTION
  957.     move.b _regP,d6
  958.     and.b #I_FLAG,d6 ;is interrupt active
  959.     bne GET_FIRST_INSTRUCTION ;yes, no other interrupt
  960. _AIRQ:    move.w _regPC,d7     ;UAAAA :)    ;write back addr
  961.     LoHi
  962.     move.w d7,-(stack_pointer)
  963.     move.b _regP,-(stack_pointer)
  964.     ;PHP
  965.     SetI
  966.     clr.l d7
  967.     move.w (memory_pointer,$fffe.l),d7
  968.     LoHi
  969.     move.l d7,PC6502
  970.     add.l memory_pointer,PC6502
  971.     clr.b _IRQ ;clear interrupt.....
  972.     ifd SERVER
  973.     move.w #-1,WAIT
  974.     endc
  975.     bra GET_FIRST_INSTRUCTION
  976.  
  977. END_OF_CYCLE:
  978.     ;move.l (a7)+,a1
  979.     ConvertSTATUS_RegP
  980.      move.b d6,_regP
  981.     UPDATE_GLOBAL_REGS
  982.     movem.l (a7)+,d0-d7/a0-a6
  983.     rts
  984. ADRESA:    dc.l 1
  985.  
  986.   ;UPDATE_LOCAL_REGS
  987.  
  988.   ;if (IRQ)
  989.   ;  {
  990.   ;    if (!(regP & I_FLAG))
  991.   ;    {
  992.   ;      UWORD retadr = PC;
  993.  
  994.   ;  memory[0x0100 + S--] = retadr >> 8;
  995.   ;  memory[0x0100 + S--] = retadr & 0xff;
  996.   ;  PHP;
  997.   ;  SetI;
  998.   ;  PC = (memory[0xffff] << 8) | memory[0xfffe];
  999.   ;  IRQ = 0;
  1000.   ;    }
  1001.   ;  }
  1002.  
  1003.  
  1004.  
  1005. ;/*
  1006. ;   =====================================
  1007. ;   Extract Address if Required by Opcode
  1008. ;   =====================================
  1009. ;*/
  1010.  
  1011. ;d6 contains final value for use in program
  1012.  
  1013.  
  1014.  
  1015. ZPAGE_X
  1016.     move.l 4(a0,d7.l*8),d6
  1017.     move.b (PC6502)+,d7
  1018.     add.b X,d7
  1019.     subq.w #2,CD
  1020.     bra.s TEST
  1021.  
  1022.  
  1023. ZPAGE_Y
  1024.     move.l 4(a0,d7.l*8),d6
  1025.     move.b (PC6502)+,d7
  1026.     add.b Y,d7
  1027.     subq.w #2,CD
  1028.     bra.s TEST
  1029.  
  1030.  
  1031. ABSOLUTE_Y
  1032.     move.l 4(a0,d7.l*8),d6
  1033.     move.w (PC6502)+,d7
  1034.     ror.w #8,d7
  1035.     add.w Y,d7
  1036.     subq.w #2,CD
  1037.     bra.s TEST
  1038.  
  1039. INDIRECT_Y
  1040.     move.l 4(a0,d7.l*8),d6
  1041.     move.b (PC6502)+,d7
  1042.     move.w (memory_pointer,d7.l),d7
  1043.     ror.w #8,d7 ;swap bytes
  1044.     add.w Y,d7
  1045.     subq.w #4,CD
  1046.     bra.s TEST
  1047.  
  1048. ABSOLUTE_X
  1049.     move.l 4(a0,d7.l*8),d6
  1050.     move.w (PC6502)+,d7
  1051.     ror.w #8,d7
  1052.     add.w X,d7 ;add x to
  1053.     subq.w #2,CD
  1054.     bra.s TEST
  1055.  
  1056. INDIRECT_X
  1057.     move.l 4(a0,d7.l*8),d6
  1058.     move.b (PC6502)+,d7
  1059.     add.b X,d7
  1060.     move.w (memory_pointer,d7.l),d7
  1061.     ror.w #8,d7
  1062.     subq.w #4,CD
  1063.     bra.s TEST
  1064.  
  1065. ABSOLUTE:
  1066.     move.l 4(a0,d7.l*8),d6
  1067.     move.w (PC6502)+,d7
  1068.     ror.w #8,d7 ;d7 contains reversed value
  1069.     subq.w #2,CD
  1070.     bra.s TEST
  1071.  
  1072.  
  1073. ZPAGE:
  1074.     move.l 4(a0,d7.l*8),d6
  1075.     move.b (PC6502)+,d7 ;d6 contains offset
  1076.     subq.w #1,CD
  1077.     bra.s TEST
  1078.  
  1079. DIRECT:
  1080.     move.l 4(a0,d7.l*8),a1
  1081.     move.b (PC6502)+,d6
  1082.     jmp (a1)
  1083.  
  1084. TEST:    bclr #31,d6  ;get highest byte away
  1085.     bne.s JUST_WRITE
  1086.     move.l d6,a1
  1087. GONEBYTE:    ;get one byte from memory
  1088.     tst.b (attrib_pointer,d7.l)
  1089.     bne.s JGetbyte
  1090. GZPAGEBYTE: ;get one byte from zero page
  1091.     move.b (memory_pointer,d7.l),d6 ;get byte
  1092. AFTER_READ:
  1093.  
  1094. JUMP_CODE:    jmp (a1)
  1095. JUST_WRITE:    move.l d6,a1
  1096.     jmp (a1) ;bra.s JUMP_CODE
  1097. JGetbyte:
  1098.     bra A800GETB
  1099.  
  1100.  
  1101. PUTONEBYTE_FL:
  1102.     move.b d6,NFLAG
  1103.     move.b d6,ZFLAG
  1104. PUTONEBYTE:    tst.b (attrib_pointer,d7.l)
  1105.     bne.s .Putbyte
  1106.     move.b d6,(memory_pointer,d7.l)
  1107.             goto NEXTCHANGE_WITHOUT
  1108.  
  1109. .Putbyte
  1110.     bra A800PUTB
  1111.  
  1112.  
  1113.  
  1114. ;#define    ABSOLUTE    addr=(memory[PC+1]<<8)+memory[PC];PC+=2;
  1115. ;#define    ZPAGE    addr=memory[PC++];
  1116. ;#define    ABSOLUTE_X    addr=((memory[PC+1]<<8)+memory[PC])+(UWORD)X;PC+=2;
  1117. ;#define     ABSOLUTE_Y    addr=((memory[PC+1]<<8)+memory[PC])+(UWORD)Y;PC+=2;
  1118. ;#define    INDIRECT_X    addr=(UWORD)memory[PC++]+(UWORD)X;addr=(memory[addr+1]<<8)+memory[addr];
  1119. ;#define    INDIRECT_Y    addr=memory[PC++];addr=(memory[addr+1]<<8)+memory[addr]+(UWORD)Y;
  1120. ;#define    ZPAGE_X    addr=(memory[PC++]+X)&0xff;
  1121. ;#define    ZPAGE_Y    addr=(memory[PC++]+Y)&0xff;
  1122.  
  1123. BB
  1124.  
  1125.  
  1126. opcode_8d: ;/* STA abcd */
  1127. opcode_85: ;/* STA ab */
  1128. opcode_81: ;/* STA (ab,x) */
  1129. opcode_91: ;/* STA (ab),y */
  1130. opcode_95: ;/* STA ab,x */
  1131. opcode_99: ;/* STA abcd,y */
  1132. opcode_9d: ;/* STA abcd,x */
  1133.     move.b A,d6
  1134.     bra.s PUTONEBYTE
  1135. opcode_8e: ;/* STX abcd */
  1136. opcode_86: ;/* STX ab */
  1137. opcode_96: ;/* STX ab,y */
  1138.     move.b X,d6
  1139.     bra.s PUTONEBYTE
  1140. opcode_8c: ;/* STY abcd */
  1141. opcode_84: ;/* STY ab */
  1142. opcode_94: ;/* STY ab,x */
  1143.     move.b Y,d6
  1144.     bra.s PUTONEBYTE
  1145.  
  1146.  
  1147. opcode_e6: ;/* INC ab */
  1148. opcode_ee: ;/* INC abcd */
  1149. opcode_f6: ;/* INC ab,x */
  1150. opcode_fe: ;/* INC abcd,x */
  1151.     addq.b #2,d6 ;again funny piece of code
  1152.  
  1153. opcode_c6: ;/* DEC ab */
  1154. opcode_ce: ;/* DEC abcd */
  1155. opcode_d6: ;/* DEC ab,x */
  1156. opcode_de: ;/* DEC abcd,x */
  1157.     subq.b #1,d6
  1158.     bra.s PUTONEBYTE_FL ;put one byte with flags
  1159.  
  1160. opcode_0e: ;/* ASL abcd */
  1161. opcode_06: ;/* ASL ab */
  1162. opcode_16: ;/* ASL ab,x */
  1163. opcode_1e: ;/* ASL abcd,x */
  1164.     clr.w CCR6502
  1165. opcode_2e: ;/* ROL abcd */
  1166. opcode_36: ;/* ROL ab,x */
  1167. opcode_26: ;/* ROL ab */
  1168. opcode_3e: ;/* ROL abcd,x */
  1169.     move.w CCR6502,CCR
  1170.     addx.b d6,d6 ;left
  1171.     move.w CCR,CCR6502
  1172.     bra.s PUTONEBYTE_FL
  1173.  
  1174. opcode_46: ;/* LSR ab */
  1175. opcode_4e: ;/* LSR abcd */
  1176. opcode_56: ;/* LSR ab,x */
  1177. opcode_5e: ;/* LSR abcd,x */
  1178.     clr.w CCR6502
  1179.  
  1180. opcode_6e: ;/* ROR abcd */
  1181. opcode_66: ;/* ROR ab */
  1182. opcode_76: ;/* ROR ab,x */
  1183. opcode_7e: ;/* ROR abcd,x */
  1184.     move.w CCR6502,CCR
  1185.     roxr.b #1,d6
  1186.     move.w CCR,CCR6502
  1187.     bra.s PUTONEBYTE_FL
  1188.  
  1189. opcode_a9: ;/* LDA #ab */
  1190. opcode_a5: ;/* LDA ab */
  1191. opcode_a1: ;/* LDA (ab,x) */
  1192. opcode_ad: ;/* LDA abcd */
  1193. opcode_b1: ;/* LDA (ab),y */
  1194. opcode_b5: ;/* LDA ab,x */
  1195. opcode_b9: ;/* LDA abcd,y */
  1196. opcode_bd: ;/* LDA abcd,x */
  1197.     move.b d6,A
  1198.     bra.s NEXTCHANGE
  1199.  
  1200.  
  1201. opcode_a2: ;/* LDX #ab */
  1202. opcode_a6: ;/* LDX ab */
  1203. opcode_ae: ;/* LDX abcd */
  1204. opcode_b6: ;/* LDX ab,y */
  1205. opcode_be: ;/* LDX abcd,y */
  1206.     move.b d6,X
  1207.     bra.s NEXTCHANGE
  1208.  
  1209. opcode_a0: ;/* LDY #ab */
  1210. opcode_a4: ;/* LDY ab */
  1211. opcode_ac: ;/* LDY abcd */
  1212. opcode_b4: ;/* LDY ab,x */
  1213. opcode_bc: ;/* LDY abcd,x */
  1214.     move.b d6,Y
  1215.     bra.s NEXTCHANGE
  1216.  
  1217.  
  1218. opcode_e0: ;/* CPX #ab */
  1219. opcode_e4: ;/* CPX ab */
  1220. opcode_ec: ;/* CPX abcd */
  1221.     move.b X,NFLAG
  1222.     bra.s COMPARE
  1223.  
  1224. opcode_c0: ;/* CPY #ab */
  1225. opcode_c4: ;/* CPY ab */
  1226. opcode_cc: ;/* CPY abcd */
  1227.     move.b Y,NFLAG
  1228.     bra.s COMPARE
  1229.  
  1230. opcode_c1: ;/* CMP (ab,x) */
  1231. opcode_c5: ;/* CMP ab */
  1232. opcode_c9: ;/* CMP #ab */
  1233. opcode_cd: ;/* CMP abcd */
  1234. opcode_d1: ;/* CMP (ab),y */
  1235. opcode_d5: ;/* CMP ab,x */
  1236. opcode_d9: ;/* CMP abcd,y */
  1237. opcode_dd: ;/* CMP abcd,x */
  1238.     move.b A,NFLAG
  1239.  
  1240. COMPARE:    sub.b d6,NFLAG
  1241.     move.w CCR,CCR6502
  1242.     not.w CCR6502
  1243.     move.b NFLAG,ZFLAG
  1244.     bra.s NEXTCHANGE_WITHOUT ;without flags
  1245.  
  1246.  
  1247. opcode_29: ;/* AND #ab */
  1248. opcode_21: ;/* AND (ab,x) */
  1249. opcode_25: ;/* AND ab */
  1250. opcode_2d: ;/* AND abcd */
  1251. opcode_31: ;/* AND (ab),y */
  1252. opcode_35: ;/* AND ab,x */
  1253. opcode_39: ;/* AND abcd,y */
  1254. opcode_3d: ;/* AND abcd,x */
  1255.     and.b d6,A
  1256.     bra.s NEXTCHANGE_A ;change flags as A is set
  1257.  
  1258. opcode_49: ;/* EOR #ab */
  1259. opcode_41: ;/* EOR (ab,x) */
  1260. opcode_45: ;/* EOR ab */
  1261. opcode_4d: ;/* EOR abcd */
  1262. opcode_51: ;/* EOR (ab),y */
  1263. opcode_55: ;/* EOR ab,x */
  1264. opcode_59: ;/* EOR abcd,y */
  1265. opcode_5d: ;/* EOR abcd,x */
  1266.     eor.b d6,A
  1267.     bra.s NEXTCHANGE_A
  1268.  
  1269. opcode_09: ;/* ORA #ab */
  1270. opcode_01: ;/* ORA (ab,x) */
  1271. opcode_05: ;/* ORA ab */
  1272. opcode_0d: ;/* ORA abcd */
  1273. opcode_11: ;/* ORA (ab),y */
  1274. opcode_15: ;/* ORA ab,x */
  1275. opcode_19: ;/* ORA abcd,y */
  1276. opcode_1d: ;/* ORA abcd,x */
  1277.     or.b d6,A
  1278.  
  1279.  
  1280.  
  1281. ;MAIN LOOP , where we are counting cycles and working with other STUFF
  1282.  
  1283.  
  1284. NEXTCHANGE_A: move.b A,d6
  1285. NEXTCHANGE:    move.b d6,ZFLAG
  1286.     move.b d6,NFLAG
  1287. NEXTCHANGE_WITHOUT:
  1288.  
  1289.     ifd C_BUGGING
  1290.     tst.w CD
  1291.     bmi ENDGO ;should be .S
  1292.     endc
  1293.  
  1294.     ifd SERVER
  1295.     UPDATE_GLOBAL_REGS
  1296.     ConvertSTATUS_RegP
  1297.     move.b d6,_regP
  1298.     tst.w WAIT
  1299.     bne STRAIGHT_GO ;if interrupt is active we won't test and will run until the end of interrupt is reached
  1300.     lea $400000,a1
  1301. .WAIT_FOR_DATA:
  1302.     cmp.l #$12345678,-16(a1)
  1303.     bne.s .WAIT_FOR_DATA
  1304.     move.b _regP,d6
  1305.     cmp.b -1(a1),d6
  1306.     bne.s .PRINT_OUT
  1307.     move.b _regS,d6
  1308.     cmp.b -2(a1),d6
  1309.     bne.s .PRINT_OUT
  1310.     move.b _regA,d6
  1311.     cmp.b -3(a1),d6
  1312.     bne.s .PRINT_OUT
  1313.     move.b _regX,d6
  1314.     cmp.b -4(a1),d6
  1315.     bne.s .PRINT_OUT
  1316.     move.b _regY,d6
  1317.     cmp.b -5(a1),d6
  1318.     bne.s .PRINT_OUT
  1319.     move.w _regPC,d6
  1320.     cmp.w -8(a1),d6
  1321.     bne.s .PRINT_OUT
  1322.     bra CONTINUE
  1323.  
  1324.  
  1325. .PRINT_OUT:
  1326.  
  1327.       movem.l a0-a6,-(a7)
  1328.       CPU_GetStatus
  1329.       jsr _tisk /*in atari c*/
  1330.       CPU_PutStatus
  1331.       movem.l (a7)+,a0-a6
  1332.  
  1333. CONTINUE:   lea $400000,a1
  1334.     move.l #'A800',-16(a1)
  1335.  
  1336. STRAIGHT_GO: ;interrupt is active, dont try trace....
  1337.       UPDATE_LOCAL_REGS
  1338.     endc
  1339.  
  1340.     ifd C_BUGGING
  1341.     move.l PC6502,A1
  1342.     sub.l a5,a1
  1343.     cmp.l _CEKEJ,a1
  1344.     bne.s CONT
  1345. _ADRESA:    nop
  1346.     ifd DEBUG
  1347.     illegal
  1348.     endc
  1349.     endc
  1350.  
  1351. CONT:    ;move.l a1,-(a7)
  1352.             subq.w #2,CD
  1353.     tst.w CD
  1354.     bmi.s ENDGO
  1355. GET_FIRST_INSTRUCTION:
  1356. ****************************************
  1357.     ifd BREAKING        following block of code allows you to enter
  1358.     move ccr,-(sp)        a break address in monitor
  1359.     move.l PC6502,d7
  1360.     sub.l memory_pointer,d7
  1361.     cmp.w _break_addr,d7
  1362.     bne.s   .get_first
  1363.     move.b #$ff,d7
  1364.     move (sp)+,ccr
  1365.           bsr odskoc_si        on break monitor is invoked
  1366.     move ccr,-(sp)
  1367.  
  1368. .get_first
  1369.     move (sp)+,ccr
  1370.     endc
  1371. ****************************************
  1372.     clr.l d7
  1373.     move.b (PC6502)+,d7
  1374.     ;move.w 4(a0,d7.l*8),d6
  1375. JUMPMODE:    jmp ([a0,d7.l*8])
  1376. ENDGO:     bra END_OF_CYCLE  ;the end of cycle
  1377.  
  1378. opcode_0a: ;/* ASLA */
  1379.     clr.w CCR6502
  1380.  
  1381. opcode_2a: ;/* ROLA */
  1382.     move.w CCR6502,CCR
  1383.     addx.b A,A  ;rolx #1,A
  1384.     move.w CCR,CCR6502
  1385.     bra NEXTCHANGE_A
  1386.  
  1387. opcode_4a: ;/* LSRA */
  1388.     clr.w CCR6502
  1389.  
  1390. opcode_6a: ;/* RORA */
  1391.     move.w CCR6502,CCR
  1392.     roxr.b #1,A
  1393.     move.w CCR,CCR6502
  1394.     bra NEXTCHANGE_A
  1395.  
  1396.  
  1397. opcode_90: ;/* BCC */
  1398.     btst #EB68,CCR6502
  1399.     beq.s SOLVE
  1400.     bra.s NOTHING
  1401.  
  1402. opcode_b0: ;/* BCS */
  1403.     btst #EB68,CCR6502
  1404.     bne.s SOLVE
  1405.     bra.s NOTHING
  1406.  
  1407.  
  1408. opcode_f0: ;/* BEQ */
  1409.     tst.b ZFLAG
  1410.     beq.s SOLVE
  1411.     bra.s NOTHING
  1412.  
  1413. opcode_d0: ;/* BNE */
  1414.     tst.b ZFLAG
  1415.     beq.s NOTHING
  1416.  
  1417. SOLVE:
  1418.     move.b (PC6502)+,d7
  1419.           extb.l d7
  1420.           add.l d7,PC6502
  1421.           ;lea (PC6502,d7.l),PC6502
  1422.           bra NEXTCHANGE_WITHOUT
  1423. NOTHING:    addq.l #1,PC6502
  1424.     bra NEXTCHANGE_WITHOUT
  1425.  
  1426.  
  1427. opcode_ca: ;/* DEX */  ;funny code DEX(-2)+1
  1428.     subq.b #2,X
  1429.  
  1430. opcode_e8: ;/* INX */
  1431.     addq.b #1,X
  1432.     move.b X,d6
  1433.     bra NEXTCHANGE
  1434.  
  1435. opcode_88: ;/* DEY */ ;funny code (DEY(-2)+1
  1436.     subq.b #2,Y
  1437.  
  1438. opcode_c8: ;/* INY */
  1439.     addq.b #1,Y
  1440.     move.b Y,d6
  1441.     bra NEXTCHANGE
  1442.  
  1443. opcode_a8: ;/* TAY */
  1444.       move.b A,Y
  1445. opcode_98: ;/* TYA */
  1446.       move.b Y,A
  1447.       bra NEXTCHANGE_A
  1448.  
  1449. opcode_aa: ;/* TAX */
  1450.       move.b A,X
  1451. opcode_8a: ;/* TXA */
  1452.       move.b X,A
  1453.       bra NEXTCHANGE_A
  1454.  
  1455. opcode_20: ;/* JSR abcd */
  1456.       move.l PC6502,d7 ;current pointer
  1457.       sub.l memory_pointer,d7
  1458.       addq.l #1,d7 ;back addres
  1459.       LoHi ;(it puts result into d6)
  1460.       move.w d7,-(stack_pointer)
  1461. opcode_4c: ;/* JMP abcd */
  1462.       move.w (PC6502)+,d7
  1463.       LoHi ;(in d7 adress where we want to jump)
  1464.       lea (memory_pointer,d7.l),PC6502
  1465.       ;add.l d7,PC6502
  1466.       subq.w #4,CD
  1467.       goto NEXTCHANGE_WITHOUT
  1468.  
  1469.  
  1470. opcode_60: ;/* RTS */
  1471.       move.w (stack_pointer)+,d7
  1472.       LoHi
  1473.       lea 1(memory_pointer,d7.l),PC6502
  1474.       ;addq.l #1,PC6502
  1475.       subq.w #4,CD
  1476.       goto NEXTCHANGE_WITHOUT
  1477.  
  1478. opcode_50: ;/* BVC */
  1479.     btst #V_FLAGB,_regP
  1480.     beq.s SOLVE
  1481.     bra.s NOTHING
  1482.  
  1483. opcode_70: ;/* BVS */
  1484.     btst #V_FLAGB,_regP
  1485.     bne.s SOLVE
  1486.     bra.s NOTHING
  1487.  
  1488. opcode_10: ;/* BPL */
  1489.     and.b #N_FLAG,NFLAG
  1490.     beq.s SOLVE
  1491.     bra.s NOTHING
  1492.  
  1493. opcode_30: ;/* BMI */
  1494.     and.b #N_FLAG,NFLAG
  1495.     bne.s SOLVE
  1496.     bra.s NOTHING
  1497.  
  1498.  
  1499. opcode_24: ;/* BIT ab */
  1500. opcode_2c: ;/* BIT abcd */
  1501.     move.b d6,NFLAG
  1502.     btst #V_FLAGB,d6
  1503.     beq.s .UNSET
  1504.     bset #V_FLAGB,_regP
  1505.     move.b A,ZFLAG
  1506.     and.b NFLAG,ZFLAG
  1507.     bra NEXTCHANGE_WITHOUT
  1508. .UNSET:
  1509.     bclr #V_FLAGB,_regP
  1510.     move.b A,ZFLAG
  1511.     and.b NFLAG,ZFLAG
  1512.     bra NEXTCHANGE_WITHOUT
  1513.  
  1514.  
  1515.  
  1516. opcode_40: ;/* RTI */
  1517. _RTI:
  1518.       PLP
  1519.       move.w (stack_pointer)+,d7
  1520.       LoHi
  1521.       lea (memory_pointer,d7.l),PC6502
  1522.       subq.w #4,CD
  1523.       ifd SERVER
  1524.       clr.w WAIT
  1525.       endc
  1526.       goto NEXTCHANGE_WITHOUT
  1527.  
  1528.  
  1529. opcode_61: ;/* ADC (ab,x) */
  1530. opcode_65: ;/* ADC ab */
  1531. opcode_69: ;/* ADC #ab */
  1532. opcode_6d: ;/* ADC abcd */
  1533. opcode_71: ;/* ADC (ab),y */
  1534. opcode_75: ;/* ADC ab,x */
  1535. opcode_79: ;/* ADC abcd,y */
  1536. opcode_7d: ;/* ADC abcd,x */
  1537. adc:
  1538.  
  1539. ;/* ADC */
  1540. ;    unsigned int temp = src + AC + (IF_CARRY() ? 1 : 0);
  1541. ;    SET_ZERO(temp & 0xff);    /* This is not valid in decimal mode */
  1542. ;    if (IF_DECIMAL()) {
  1543. ;        if (((AC & 0xf) + (src & 0xf) + (IF_CARRY() ? 1 : 0)) > 9) temp += 6;
  1544. ;    SET_SIGN(temp);
  1545. ;    SET_OVERFLOW(!((AC ^ src) & 0x80) && ((AC ^ temp) & 0x80));
  1546. ;    if (temp > 0x99) temp += 96;
  1547. ;    SET_CARRY(temp > 0x99);
  1548. ;    } else {
  1549. ;    SET_SIGN(temp);
  1550. ;    SET_OVERFLOW(!((AC ^ src) & 0x80) && ((AC ^ temp) & 0x80));
  1551. ;    SET_CARRY(temp > 0xff);
  1552. ;    }
  1553. ;    AC = ((BYTE) temp);
  1554.  
  1555.     ;addq.l #1,AAAAA
  1556.          btst #D_FLAGB,_regP
  1557.     bne.s BDC_ADC
  1558.  
  1559.     move.w CCR6502,CCR
  1560.     addx.b d6,A ;data are added with carry (in 68000 Extended bit in this case)
  1561.     move.w CCR,CCR6502
  1562.     svs d6
  1563.     and.b #V_FLAG,d6
  1564. *    and.b #-V_FLAG,_regP
  1565.     and.b #~V_FLAG,_regP
  1566.     or.b d6,_regP
  1567.     bra NEXTCHANGE_A
  1568.  
  1569.  
  1570.     ;if (!(regP & D_FLAG))
  1571.     ;{
  1572.     ;  UWORD    temp;
  1573.             ;  UWORD t_data;
  1574.  
  1575.             ;t_data = (UWORD)data + (UWORD)C;
  1576.     ;Z = N = temp = (UWORD)A + t_data;
  1577.             ;V = (~(A ^ t_data)) & (Z ^ A) & 0x80; ;cruel construction :((
  1578.  
  1579.     ;C = temp >> 8;
  1580.     ;A = Z;
  1581.     ;}
  1582. BDC_ADC:
  1583.     move.b CCR6502,CCR
  1584.     ori.b #4,CCR ; set zero flag
  1585.     abcd d6,A
  1586.     move.b CCR,CCR6502  ;V flag isn't soluted
  1587.     bra NEXTCHANGE_A
  1588.  
  1589.  
  1590.           ;else
  1591.     ;{
  1592.     ; int    bcd1, bcd2;
  1593.  
  1594.     ; bcd1 = BCDtoDEC[A];
  1595.     ; bcd2 = BCDtoDEC[data];
  1596.  
  1597.     ; bcd1 += bcd2 + C;
  1598.  
  1599.     ; Z = N = DECtoBCD[bcd1];
  1600.  
  1601.     ; V = (Z ^ A) & 0x80;
  1602.     ; C = (bcd1 > 99);
  1603.     ; A = Z;
  1604.     ;}
  1605.     ;goto next;
  1606.  
  1607.  
  1608. opcode_e1: ;/* SBC (ab,x) */
  1609. opcode_e5: ;/* SBC ab */
  1610. opcode_e9: ;/* SBC #ab */
  1611. opcode_ed: ;/* SBC abcd */
  1612. opcode_f1: ;/* SBC (ab),y */
  1613. opcode_f5: ;/* SBC ab,x */
  1614. opcode_f9: ;/* SBC abcd,y */
  1615. opcode_fd: ;/* SBC abcd,x */
  1616.  
  1617. sbc:
  1618. ;/* SBC */
  1619. ;    unsigned int temp = AC - src - (IF_CARRY() ? 0 : 1);
  1620. ;    SET_SIGN(temp);
  1621. ;    SET_ZERO(temp & 0xff);    /* Sign and Zero are invalid in decimal mode */
  1622. ;    SET_OVERFLOW(((AC ^ temp) & 0x80) && ((AC ^ src) & 0x80));
  1623. ;    if (IF_DECIMAL()) {
  1624. ;    if ( ((AC & 0xf) - (IF_CARRY() ? 0 : 1)) < (src & 0xf)) /* EP */ temp -= 6;
  1625. ;    if (temp > 0x99) temp -= 0x60;
  1626. ;    }
  1627. ;    SET_CARRY(temp < 0x100);
  1628. ;    AC = (temp & 0xff);
  1629.  
  1630.  
  1631.  
  1632.      ;addq.l #1,AAAAA
  1633.     btst #D_FLAGB,_regP
  1634.     bne.s BDC_SBC
  1635.  
  1636.     not.w CCR6502 ;change it????
  1637.     move.w CCR6502,CCR
  1638.     subx.b d6,A
  1639.     move.w CCR,CCR6502
  1640.     svs d6
  1641.     not.w CCR6502
  1642.     and.b #V_FLAG,d6
  1643. *    and.b #-V_FLAG,_regP
  1644.     and.b #~V_FLAG,_regP
  1645.     or.b d6,_regP
  1646.     bra NEXTCHANGE_A
  1647.  
  1648.  
  1649.           ;if (!(regP & D_FLAG))
  1650.     ;{
  1651.     ; UWORD    temp;
  1652.             ; UWORD t_data;
  1653.  
  1654.             ;t_data = (UWORD)data + (UWORD)!C;
  1655.     ;temp = (UWORD)A - t_data;
  1656.  
  1657.     ;Z = N = temp & 0xff;
  1658.  
  1659.  
  1660. ;/*
  1661. ; * This was the old code that I have been using upto version 0.5.2
  1662. ; *  C = (A < ((UWORD)data + (UWORD)!C)) ? 0 : 1;
  1663. ; */
  1664. ;      V = (~(A ^ t_data)) & (Z ^ A) & 0x80;
  1665. ;      C = (temp > 255) ? 0 : 1;
  1666. ;      A = Z;
  1667. ;    }
  1668.  
  1669. BDC_SBC:
  1670.     not.w CCR6502 ;change it ?????
  1671.     move.b CCR6502,CCR
  1672.     ori.b #4,CCR ; set zero flag
  1673.     sbcd d6,A
  1674.     move.b CCR,CCR6502  ;V flag isn't soluted
  1675.     not.w CCR6502
  1676.     goto NEXTCHANGE_A
  1677.  
  1678.  
  1679.           ;else
  1680.     ;{
  1681.     ;  int    bcd1, bcd2;
  1682.     ;
  1683.     ;  bcd1 = BCDtoDEC[A];
  1684.     ;  bcd2 = BCDtoDEC[data];
  1685.  
  1686.     ;  bcd1 = bcd1 - bcd2 - !C;
  1687.  
  1688.     ;  if (bcd1 < 0) bcd1 = 100 - (-bcd1);
  1689.     ;  Z = N = DECtoBCD[bcd1];
  1690.  
  1691.     ;  C = (A < (data + !C)) ? 0 : 1;
  1692.     ;  V = (Z ^ A) & 0x80;
  1693.     ;  A = Z;
  1694.     ;}
  1695.           ;goto next;
  1696.  
  1697.  
  1698. opcode_68: ;/* PLA */
  1699.       move.b (stack_pointer)+,A
  1700.       subq.w #1,CD
  1701.       bra NEXTCHANGE_A
  1702.  
  1703.  
  1704. opcode_08: ;/* PHP */
  1705.       PHP
  1706.       subq.w #1,CD
  1707.       bra NEXTCHANGE_WITHOUT
  1708.  
  1709.  
  1710. opcode_48: ;/* PHA */
  1711.       move.b A,-(stack_pointer)
  1712.       subq.w #1,CD
  1713.       bra NEXTCHANGE_WITHOUT
  1714.  
  1715.  
  1716.  
  1717. opcode_28: ;/* PLP */
  1718.       PLP
  1719.       subq.w #1,CD
  1720.     bra NEXTCHANGE_WITHOUT
  1721.  
  1722. opcode_18: ;/* CLC */
  1723.           clr.w CCR6502
  1724.     bra NEXTCHANGE_WITHOUT
  1725.  
  1726. opcode_38: ;/* SEC */
  1727.     moveq.w #-1,CCR6502
  1728.     bra NEXTCHANGE_WITHOUT
  1729.  
  1730. opcode_58: ;/* CLI */
  1731.     ClrI
  1732.     bra NEXTCHANGE_WITHOUT
  1733.  
  1734.  
  1735. opcode_d8: ;/* CLD */
  1736.     ClrD
  1737.     bra NEXTCHANGE_WITHOUT
  1738.  
  1739. opcode_b8: ;/* CLV */
  1740.     bclr.b #V_FLAGB,_regP
  1741.     bra NEXTCHANGE_WITHOUT
  1742.  
  1743. opcode_6c: ;/* JMP (abcd) */
  1744.           move.w (PC6502)+,d7
  1745.           LoHi
  1746.           move.w (memory_pointer,d7.l),d7
  1747.           LoHi
  1748.           lea (memory_pointer,d7.l),PC6502
  1749.           subq.w #5,CD
  1750.     bra NEXTCHANGE_WITHOUT
  1751.  
  1752. opcode_78: ;/* SEI */
  1753.           SetI
  1754.     bra NEXTCHANGE_WITHOUT
  1755.  
  1756. opcode_f8: ;/* SED */
  1757.           SetD
  1758.     bra NEXTCHANGE_WITHOUT
  1759.  
  1760. opcode_9a: ;/* TXS */
  1761.           lea (memory_pointer,X.w),stack_pointer
  1762.           lea $101(stack_pointer),stack_pointer
  1763.     bra NEXTCHANGE_WITHOUT
  1764.  
  1765. opcode_ba: ;/* TSX */
  1766.           move.l stack_pointer,X
  1767.           sub.l memory_pointer,X
  1768.           sub.l #$101,X ;HIHIHI :) 3rd discovered error in last 30 hours....
  1769.                  ;this one is because logic of STACK on 6502 4th error in 32 hours :)
  1770.     move.b X,d6
  1771.           bra NEXTCHANGE
  1772.  
  1773.  
  1774.  
  1775. opcode_0c: ;/* NOP (3 bytes) [unofficial] */
  1776. opcode_3c:
  1777. opcode_5c:
  1778. opcode_7c:
  1779. opcode_dc:
  1780. opcode_fc:
  1781.  
  1782.       addq.l #1,PC6502
  1783.       subq.w #3,CD
  1784.  
  1785.  
  1786.  
  1787. opcode_04: ;/* NOP (2 bytes) [unofficial] */
  1788. opcode_14:
  1789. opcode_1c:
  1790. opcode_34:
  1791. opcode_44:
  1792. opcode_54:
  1793. opcode_64:
  1794. opcode_74:
  1795. opcode_80:
  1796. opcode_82:
  1797. opcode_89:
  1798. opcode_c2:
  1799. opcode_d4:
  1800. opcode_e2:
  1801. opcode_f4:
  1802.  
  1803.       addq.l #1,PC6502
  1804.       subq.w #3,CD
  1805.  
  1806. opcode_1a: ;/* NOP (1 byte) [unofficial] */
  1807. opcode_3a:
  1808. opcode_5a:
  1809. opcode_7a:
  1810. opcode_da:
  1811. opcode_fa:
  1812. opcode_ea: ;/* NOP */ ;oficial
  1813.     goto NEXTCHANGE_WITHOUT
  1814.  
  1815. opcode_d2: ;/* ESCRTS #ab (JAM) */
  1816.       move.b (PC6502)+,d7
  1817.       UPDATE_GLOBAL_REGS
  1818.       movem.l a0-a6,-(a7)
  1819.       CPU_GetStatus
  1820.       move.l d7,-(a7)
  1821.       jsr _Escape /*in atari c*/
  1822.       addq.l #4,a7
  1823.       CPU_PutStatus
  1824.       movem.l (a7)+,a0-a6
  1825.       UPDATE_LOCAL_REGS
  1826.       move.w (stack_pointer)+,d7
  1827.       LoHi
  1828.       lea (memory_pointer,d7.l),PC6502
  1829.       addq.l #1,PC6502
  1830.       bra GET_FIRST_INSTRUCTION
  1831.  
  1832. opcode_f2: ;/* ESC #ab (JAM) */
  1833. opcode_ff: ;/* ESC #ab */
  1834.       move.b (PC6502)+,d7
  1835.       UPDATE_GLOBAL_REGS
  1836.       movem.l a0-a6,-(a7)
  1837.       CPU_GetStatus
  1838.       move.l d7,-(a7)
  1839.       jsr _Escape
  1840.       addq.l #4,a7
  1841.       CPU_PutStatus
  1842.       movem.l (a7)+,a0-a6
  1843.       UPDATE_LOCAL_REGS
  1844.       bra GET_FIRST_INSTRUCTION
  1845.  
  1846.  
  1847.  
  1848.  
  1849. opcode_a3: ;/* LAX (ind,x) [unofficial] */
  1850.       ;INDIRECT_X
  1851.       ;GetByte d7
  1852.       move.b d7,A
  1853.       move.b d7,X
  1854.       move.b A,NFLAG
  1855.       move.b A,ZFLAG
  1856.       bra NEXTCHANGE_WITHOUT
  1857.  
  1858.  
  1859.  
  1860.  
  1861. opcode_a7: ;/* LAX zpage [unofficial] */
  1862.       ;ZPAGE
  1863.       ;GetByte d7
  1864.       move.b d7,A
  1865.       move.b d7,X
  1866.       move.b A,NFLAG
  1867.       move.b A,ZFLAG
  1868.       bra NEXTCHANGE_WITHOUT
  1869.  
  1870.  
  1871.  
  1872.  
  1873.  
  1874. opcode_af: ;/* LAX absolute [unofficial] */
  1875.       ;ABSOLUTE
  1876.       ;GetByte d7
  1877.       move.b d7,X
  1878.       move.b d7,A
  1879.       move.b A,NFLAG
  1880.       move.b A,ZFLAG
  1881.       bra NEXTCHANGE_WITHOUT
  1882.  
  1883.  
  1884.  
  1885. opcode_b3: ;/* LAX (ind),y [unofficial] */
  1886.       ;INDIRECT_Y
  1887.       ;GetByte d7
  1888.       move.b d7,A
  1889.       move.b d7,X
  1890.       move.b A,NFLAG
  1891.       move.b A,ZFLAG
  1892.       bra NEXTCHANGE_WITHOUT
  1893.  
  1894.  
  1895.  
  1896. opcode_b7: ;/* LAX zpage,y [unofficial] */
  1897.       ;ZPAGE_Y
  1898.       ;GetByte d7
  1899.       move.b d7,A
  1900.       move.b d7,X
  1901.       move.b A,NFLAG
  1902.       move.b A,ZFLAG
  1903.       bra NEXTCHANGE_WITHOUT
  1904.  
  1905. opcode_bf: ;/* LAX absolute,y [unofficial] */
  1906.       ;ABSOLUTE_Y
  1907.       ;GetByte d7
  1908.       move.b d7,A
  1909.       move.b d7,X
  1910.       move.b X,ZFLAG
  1911.       move.b X,NFLAG
  1912.       bra NEXTCHANGE_WITHOUT
  1913.  
  1914.  
  1915.  
  1916.  
  1917.  
  1918.  
  1919.  
  1920.  
  1921.  
  1922. opcode_02:
  1923. opcode_03:
  1924. opcode_07:
  1925. opcode_0b:
  1926. opcode_0f:
  1927. opcode_12:
  1928. opcode_13:
  1929. opcode_17:
  1930. opcode_1b:
  1931. opcode_1f:
  1932. opcode_22:
  1933. opcode_23:
  1934. opcode_27:
  1935. opcode_2b:
  1936. opcode_2f:
  1937. opcode_32:
  1938. opcode_33:
  1939. opcode_37:
  1940. opcode_3b:
  1941. opcode_3f:
  1942. opcode_42:
  1943. opcode_43:
  1944. opcode_47:
  1945. opcode_4b:
  1946. opcode_4f:
  1947. opcode_52:
  1948. opcode_53:
  1949. opcode_57:
  1950. opcode_5b:
  1951. opcode_5f:
  1952. opcode_62:
  1953. opcode_63:
  1954. opcode_67:
  1955. opcode_6b:
  1956. opcode_6f:
  1957. opcode_72:
  1958. opcode_73:
  1959. opcode_77:
  1960. opcode_7b:
  1961. opcode_7f:
  1962. opcode_83:
  1963. opcode_87:
  1964. opcode_8b:
  1965. opcode_8f:
  1966. opcode_92:
  1967. opcode_93:
  1968. opcode_97:
  1969. opcode_9b:
  1970. opcode_9c:
  1971. opcode_9e:
  1972. opcode_9f:
  1973. opcode_ab:
  1974. opcode_b2:
  1975. opcode_bb:
  1976. opcode_c3:
  1977. opcode_c7:
  1978. opcode_cb:
  1979. opcode_cf:
  1980. opcode_d3:
  1981. opcode_d7:
  1982. opcode_db:
  1983. opcode_df:
  1984. opcode_e3:
  1985. opcode_e7:
  1986. opcode_eb:
  1987. opcode_ef:
  1988. opcode_f3:
  1989. opcode_f7:
  1990. opcode_fb:
  1991.     ;pea text(pc)
  1992.     ;move.w #9,-(a7)
  1993.     ;trap #1
  1994.     ;addq.l #1,ILEGALY
  1995.     ;illegal
  1996.     bra NEXTCHANGE_WITHOUT
  1997. ILEGALY:    dc.l 0
  1998. text:    dc.b 'NEJAKA CHYBA TY BLBE'
  1999.     even
  2000.  
  2001. UPDATE_GLOBAL_REGS
  2002.  
  2003.       ;printf ("*** Invalid Opcode %02x at address %04x\n",
  2004.       ;          memory[PC-1], PC-1);
  2005.       ;ncycles = 0;
  2006.       ;break;
  2007.  
  2008. opcode_00: ;/* BRK */
  2009.       btst #I_FLAGB,_regP
  2010.       bne NEXTCHANGE_WITHOUT
  2011.       move.l PC6502,d7
  2012.       sub.l memory_pointer,d7
  2013.       addq.w #1,d7
  2014.       LoHi
  2015.       move.w d7,-(stack_pointer)
  2016.       SetB
  2017.       PHP
  2018.       SetI
  2019.       move.w (memory_pointer,$fffe.l),d7
  2020.       LoHi
  2021.       move.l d7,PC6502
  2022.       add.l memory_pointer,PC6502
  2023.       subq.w #5,CD
  2024.       bra NEXTCHANGE_WITHOUT
  2025.  
  2026.  
  2027.  
  2028. A800GETB:
  2029.     cmp.b #1,(attrib_pointer,d7.l)
  2030.     beq.s .READ_FROM_ROM
  2031.     movem.l a0/a1/a6/d0/d1,-(a7)
  2032.     move.l d7,-(a7)
  2033.     jsr _GETBYTE
  2034.     move.w d0,d6 ;put stack onto right place
  2035.     addq.l #4,a7
  2036.     movem.l (a7)+,a0/a1/a6/d0/d1
  2037.     bra AFTER_READ
  2038.  
  2039. .READ_FROM_ROM:
  2040.     move.b (memory_pointer,d7.l),d6
  2041.     bra AFTER_READ
  2042.  
  2043.     ifd DEBUG
  2044. _GETBYTE:    move.b (memory_pointer,d7.l),d6
  2045.     rts
  2046.     endc
  2047.  
  2048. ; I used to be really stupid about stacking in C :))
  2049. ; I believed that I have to push onto stack every time I call
  2050. ; C function all registers, Fortunately I don't have to, d0-d1 and a0-a1 is enough
  2051.  
  2052. A800PUTB:
  2053.     cmp.b #1,(attrib_pointer,d7.l)
  2054.     beq.s .DONT_WRITE_TO_ROM
  2055.  
  2056.     move.l a0,-(a7)
  2057.     move.w d0,-(a7)
  2058.     move.w d1,-(a7)
  2059.     move.w a6,-(a7)
  2060.     ;movem.l a0/a6/d0/d1,-(a7)
  2061.     clr.l -(a7)
  2062.     move.b d6,3(a7) ;byte
  2063.     move.l d7,-(a7) ;adress
  2064.     jsr _PUTBYTE
  2065.     move.w d0,d6 ;put value onto right place
  2066.     addq.l #8,a7
  2067.     ;movem.l (a7)+,a0/a6/d0/d1
  2068.     move.w (a7)+,a6
  2069.     move.w (a7)+,d1
  2070.     move.w (a7)+,d0
  2071.     move.l (a7)+,a0
  2072.     tst.w d6
  2073.     bne ENDGO
  2074.     bra NEXTCHANGE_WITHOUT
  2075.  
  2076. .DONT_WRITE_TO_ROM:
  2077.     bra NEXTCHANGE_WITHOUT
  2078.  
  2079.     ifd DEBUG
  2080. _PUTBYTE:    move.b d6,(memory_pointer,d7.l)
  2081.     endc
  2082.  
  2083. odskoc_si:
  2084.       UPDATE_GLOBAL_REGS
  2085.       movem.l a0-a6,-(a7)
  2086.       CPU_GetStatus
  2087.       move.l d7,-(a7)
  2088.       jsr _Escape
  2089.       addq.l #4,a7
  2090.       CPU_PutStatus
  2091.       movem.l (a7)+,a0-a6
  2092.       UPDATE_LOCAL_REGS
  2093.       rts
  2094.  
  2095.     ifd DEBUG
  2096. _CEKEJ:    dc.l 1
  2097.     endc
  2098.  
  2099. EE:    dc.w 0
  2100. WAIT:    dc.w 0
  2101.  
  2102.     section bss
  2103. _OPMODE_TABLE:
  2104.     ds.w 1
  2105. OPMODE_TABLE: ds.l 514 (2*256 long words)+2 as a reserve
  2106.  
  2107.  
  2108.     ifnd DEBUG
  2109. LE:    ds.l 1
  2110. STACKALL:   ds.l 16
  2111.     endc
  2112.  
  2113.     ifd DEBUG
  2114.     section data
  2115. ;VBDIFLAG:    dc.w 1 ;information about CCR bits V B D I
  2116.     dc.l 0
  2117.     dc.l 0 ;
  2118. mem6502:    ;dc.l MEMORY
  2119.  
  2120.     ;ds.w 1
  2121. memory:
  2122. _memory:
  2123.  
  2124.     ds.b 40960
  2125.     incbin H:\ATARI800\ATARIBAS.ROM ;load basic
  2126.     incbin H:\ATARI800\ATARIXL.ROM  ;load Atari XL
  2127.  
  2128.     ds.b 8192
  2129.     dc.b $a9,50,$69,90,$e9,40,$20,$4c,00,20
  2130.  
  2131.     dc.b $a9,$00,$a2,0,$a0,0
  2132.     ;lda #0, ldx #0, ldy #0
  2133.     dc.b $a5,$06,$ae,$1,$1,$bc,2,2
  2134.     ;lda $06 ldx $0101 ldy $0202,x
  2135.     dc.b $a1,02,$a6,2,$b4,2
  2136.     ;lda (2,x) ldx 2 ldy 2,x
  2137.     dc.b $81,0,$8e,01,01,$94,22
  2138.     ;   sta (0,x) stx $0101 sty 22,y
  2139.     dc.b $e6,10,$6e,05,05,$e0,10
  2140.     ;   INC 10, ROR 0505 CPX #10
  2141.     dc.b $4c,0,$20
  2142. ;PL:    ds.b 65536-(PL-memory)
  2143.  
  2144.  
  2145. attrib:
  2146. _attrib:    dcb.b $A000,RAM
  2147.     dcb.b  $2000,ROM
  2148.     dcb.b  $1000,HARDWARE
  2149.     dcb.b  $3000,ROM
  2150.     ;dc.b ROM
  2151.     ;dc.b ROM
  2152.     ;dc.b ROM
  2153.     ;dcb.b 16383,RAM
  2154.     ;65536,RAM ;set all the memory as RAM
  2155.  
  2156.     section bss
  2157. TEST2:    ds.l 20000
  2158.     section text
  2159. _Escape:    rts
  2160.     endc
  2161.     section text
  2162.