test

Dependencies:   SDFileSystem mbed-dev

Fork of Nucleo_Ex06_EMU by woodstock .

Committer:
charliex
Date:
Sat May 27 02:17:37 2017 +0000
Revision:
4:53ef91c87d74
Parent:
0:3dac1f1bc9e0
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
beaglescout007 0:3dac1f1bc9e0 1 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 2 /* */
beaglescout007 0:3dac1f1bc9e0 3 /* K6502.cpp : 6502 Emulator */
beaglescout007 0:3dac1f1bc9e0 4 /* */
beaglescout007 0:3dac1f1bc9e0 5 /* 1999/10/19 Racoon New preparation */
beaglescout007 0:3dac1f1bc9e0 6 /* */
beaglescout007 0:3dac1f1bc9e0 7 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 8
beaglescout007 0:3dac1f1bc9e0 9 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 10 /* Include files */
beaglescout007 0:3dac1f1bc9e0 11 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 12 #include "K6502.h"
beaglescout007 0:3dac1f1bc9e0 13
beaglescout007 0:3dac1f1bc9e0 14 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 15 /* Operation Macros */
beaglescout007 0:3dac1f1bc9e0 16 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 17
beaglescout007 0:3dac1f1bc9e0 18 // Clock Op.
beaglescout007 0:3dac1f1bc9e0 19 #define CLK(a) g_wPassedClocks += (a);
beaglescout007 0:3dac1f1bc9e0 20
beaglescout007 0:3dac1f1bc9e0 21 // Addressing Op.
beaglescout007 0:3dac1f1bc9e0 22 // Address
beaglescout007 0:3dac1f1bc9e0 23 // (Indirect,X)
beaglescout007 0:3dac1f1bc9e0 24 #define AA_IX K6502_ReadZpW( K6502_Read( PC++ ) + X )
beaglescout007 0:3dac1f1bc9e0 25 // (Indirect),Y
beaglescout007 0:3dac1f1bc9e0 26 #define AA_IY K6502_ReadZpW( K6502_Read( PC++ ) ) + Y
beaglescout007 0:3dac1f1bc9e0 27 // Zero Page
beaglescout007 0:3dac1f1bc9e0 28 #define AA_ZP K6502_Read( PC++ )
beaglescout007 0:3dac1f1bc9e0 29 // Zero Page,X
beaglescout007 0:3dac1f1bc9e0 30 #define AA_ZPX (BYTE)( K6502_Read( PC++ ) + X )
beaglescout007 0:3dac1f1bc9e0 31 // Zero Page,Y
beaglescout007 0:3dac1f1bc9e0 32 #define AA_ZPY (BYTE)( K6502_Read( PC++ ) + Y )
beaglescout007 0:3dac1f1bc9e0 33 // Absolute
beaglescout007 0:3dac1f1bc9e0 34 #define AA_ABS ( K6502_Read( PC++ ) | (WORD)K6502_Read( PC++ ) << 8 )
beaglescout007 0:3dac1f1bc9e0 35 // Absolute2 ( PC-- )
beaglescout007 0:3dac1f1bc9e0 36 #define AA_ABS2 ( K6502_Read( PC++ ) | (WORD)K6502_Read( PC ) << 8 )
beaglescout007 0:3dac1f1bc9e0 37 // Absolute,X
beaglescout007 0:3dac1f1bc9e0 38 #define AA_ABSX AA_ABS + X
beaglescout007 0:3dac1f1bc9e0 39 // Absolute,Y
beaglescout007 0:3dac1f1bc9e0 40 #define AA_ABSY AA_ABS + Y
beaglescout007 0:3dac1f1bc9e0 41
beaglescout007 0:3dac1f1bc9e0 42 // Data
beaglescout007 0:3dac1f1bc9e0 43 // (Indirect,X)
beaglescout007 0:3dac1f1bc9e0 44 #define A_IX K6502_Read( AA_IX )
beaglescout007 0:3dac1f1bc9e0 45 // (Indirect),Y
beaglescout007 0:3dac1f1bc9e0 46 #define A_IY K6502_ReadIY()
beaglescout007 0:3dac1f1bc9e0 47 // Zero Page
beaglescout007 0:3dac1f1bc9e0 48 #define A_ZP K6502_ReadZp( AA_ZP )
beaglescout007 0:3dac1f1bc9e0 49 // Zero Page,X
beaglescout007 0:3dac1f1bc9e0 50 #define A_ZPX K6502_ReadZp( AA_ZPX )
beaglescout007 0:3dac1f1bc9e0 51 // Zero Page,Y
beaglescout007 0:3dac1f1bc9e0 52 #define A_ZPY K6502_ReadZp( AA_ZPY )
beaglescout007 0:3dac1f1bc9e0 53 // Absolute
beaglescout007 0:3dac1f1bc9e0 54 #define A_ABS K6502_Read( AA_ABS )
beaglescout007 0:3dac1f1bc9e0 55 // Absolute,X
beaglescout007 0:3dac1f1bc9e0 56 #define A_ABSX K6502_ReadAbsX()
beaglescout007 0:3dac1f1bc9e0 57 // Absolute,Y
beaglescout007 0:3dac1f1bc9e0 58 #define A_ABSY K6502_ReadAbsY()
beaglescout007 0:3dac1f1bc9e0 59 // Immediate
beaglescout007 0:3dac1f1bc9e0 60 #define A_IMM K6502_Read( PC++ )
beaglescout007 0:3dac1f1bc9e0 61
beaglescout007 0:3dac1f1bc9e0 62 // Flag Op.
beaglescout007 0:3dac1f1bc9e0 63 #define SETF(a) F |= (a)
beaglescout007 0:3dac1f1bc9e0 64 #define RSTF(a) F &= ~(a)
beaglescout007 0:3dac1f1bc9e0 65 #define TEST(a) RSTF( FLAG_N | FLAG_Z ); SETF( g_byTestTable[ a ] )
beaglescout007 0:3dac1f1bc9e0 66
beaglescout007 0:3dac1f1bc9e0 67 // Load & Store Op.
beaglescout007 0:3dac1f1bc9e0 68 #define STA(a) K6502_Write( (a), A );
beaglescout007 0:3dac1f1bc9e0 69 #define STX(a) K6502_Write( (a), X );
beaglescout007 0:3dac1f1bc9e0 70 #define STY(a) K6502_Write( (a), Y );
beaglescout007 0:3dac1f1bc9e0 71 #define LDA(a) A = (a); TEST( A );
beaglescout007 0:3dac1f1bc9e0 72 #define LDX(a) X = (a); TEST( X );
beaglescout007 0:3dac1f1bc9e0 73 #define LDY(a) Y = (a); TEST( Y );
beaglescout007 0:3dac1f1bc9e0 74
beaglescout007 0:3dac1f1bc9e0 75 // Stack Op.
beaglescout007 0:3dac1f1bc9e0 76 #define PUSH(a) K6502_Write( BASE_STACK + SP--, (a) )
beaglescout007 0:3dac1f1bc9e0 77 #define PUSHW(a) PUSH( (a) >> 8 ); PUSH( (a) & 0xff )
beaglescout007 0:3dac1f1bc9e0 78 #define POP(a) a = K6502_Read( BASE_STACK + ++SP )
beaglescout007 0:3dac1f1bc9e0 79 #define POPW(a) POP(a); a |= ( K6502_Read( BASE_STACK + ++SP ) << 8 )
beaglescout007 0:3dac1f1bc9e0 80
beaglescout007 0:3dac1f1bc9e0 81 // Logical Op.
beaglescout007 0:3dac1f1bc9e0 82 #define ORA(a) A |= (a); TEST( A )
beaglescout007 0:3dac1f1bc9e0 83 #define AND(a) A &= (a); TEST( A )
beaglescout007 0:3dac1f1bc9e0 84 #define EOR(a) A ^= (a); TEST( A )
beaglescout007 0:3dac1f1bc9e0 85 #define BIT(a) byD0 = (a); RSTF( FLAG_N | FLAG_V | FLAG_Z ); SETF( ( byD0 & ( FLAG_N | FLAG_V ) ) | ( ( byD0 & A ) ? 0 : FLAG_Z ) );
beaglescout007 0:3dac1f1bc9e0 86 #define CMP(a) wD0 = (WORD)A - (a); RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_byTestTable[ wD0 & 0xff ] | ( wD0 < 0x100 ? FLAG_C : 0 ) );
beaglescout007 0:3dac1f1bc9e0 87 #define CPX(a) wD0 = (WORD)X - (a); RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_byTestTable[ wD0 & 0xff ] | ( wD0 < 0x100 ? FLAG_C : 0 ) );
beaglescout007 0:3dac1f1bc9e0 88 #define CPY(a) wD0 = (WORD)Y - (a); RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_byTestTable[ wD0 & 0xff ] | ( wD0 < 0x100 ? FLAG_C : 0 ) );
beaglescout007 0:3dac1f1bc9e0 89
beaglescout007 0:3dac1f1bc9e0 90 // Math Op. (A D flag isn't being supported.)
beaglescout007 0:3dac1f1bc9e0 91 #define ADC(a) byD0 = (a); \
beaglescout007 0:3dac1f1bc9e0 92 wD0 = A + byD0 + ( F & FLAG_C ); \
beaglescout007 0:3dac1f1bc9e0 93 byD1 = (BYTE)wD0; \
beaglescout007 0:3dac1f1bc9e0 94 RSTF( FLAG_N | FLAG_V | FLAG_Z | FLAG_C ); \
beaglescout007 0:3dac1f1bc9e0 95 SETF( g_byTestTable[ byD1 ] | ( ( ~( A ^ byD0 ) & ( A ^ byD1 ) & 0x80 ) ? FLAG_V : 0 ) | ( wD0 > 0xff ) ); \
beaglescout007 0:3dac1f1bc9e0 96 A = byD1;
beaglescout007 0:3dac1f1bc9e0 97
beaglescout007 0:3dac1f1bc9e0 98 #define SBC(a) byD0 = (a); \
beaglescout007 0:3dac1f1bc9e0 99 wD0 = A - byD0 - ( ~F & FLAG_C ); \
beaglescout007 0:3dac1f1bc9e0 100 byD1 = (BYTE)wD0; \
beaglescout007 0:3dac1f1bc9e0 101 RSTF( FLAG_N | FLAG_V | FLAG_Z | FLAG_C ); \
beaglescout007 0:3dac1f1bc9e0 102 SETF( g_byTestTable[ byD1 ] | ( ( ( A ^ byD0 ) & ( A ^ byD1 ) & 0x80 ) ? FLAG_V : 0 ) | ( wD0 < 0x100 ) ); \
beaglescout007 0:3dac1f1bc9e0 103 A = byD1;
beaglescout007 0:3dac1f1bc9e0 104
beaglescout007 0:3dac1f1bc9e0 105 #define DEC(a) wA0 = a; byD0 = K6502_Read( wA0 ); --byD0; K6502_Write( wA0, byD0 ); TEST( byD0 )
beaglescout007 0:3dac1f1bc9e0 106 #define INC(a) wA0 = a; byD0 = K6502_Read( wA0 ); ++byD0; K6502_Write( wA0, byD0 ); TEST( byD0 )
beaglescout007 0:3dac1f1bc9e0 107
beaglescout007 0:3dac1f1bc9e0 108 // Shift Op.
beaglescout007 0:3dac1f1bc9e0 109 #define ASLA RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_ASLTable[ A ].byFlag ); A = g_ASLTable[ A ].byValue
beaglescout007 0:3dac1f1bc9e0 110 #define ASL(a) RSTF( FLAG_N | FLAG_Z | FLAG_C ); wA0 = a; byD0 = K6502_Read( wA0 ); SETF( g_ASLTable[ byD0 ].byFlag ); K6502_Write( wA0, g_ASLTable[ byD0 ].byValue )
beaglescout007 0:3dac1f1bc9e0 111 #define LSRA RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_LSRTable[ A ].byFlag ); A = g_LSRTable[ A ].byValue
beaglescout007 0:3dac1f1bc9e0 112 #define LSR(a) RSTF( FLAG_N | FLAG_Z | FLAG_C ); wA0 = a; byD0 = K6502_Read( wA0 ); SETF( g_LSRTable[ byD0 ].byFlag ); K6502_Write( wA0, g_LSRTable[ byD0 ].byValue )
beaglescout007 0:3dac1f1bc9e0 113 #define ROLA byD0 = F & FLAG_C; RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_ROLTable[ byD0 ][ A ].byFlag ); A = g_ROLTable[ byD0 ][ A ].byValue
beaglescout007 0:3dac1f1bc9e0 114 #define ROL(a) byD1 = F & FLAG_C; RSTF( FLAG_N | FLAG_Z | FLAG_C ); wA0 = a; byD0 = K6502_Read( wA0 ); SETF( g_ROLTable[ byD1 ][ byD0 ].byFlag ); K6502_Write( wA0, g_ROLTable[ byD1 ][ byD0 ].byValue )
beaglescout007 0:3dac1f1bc9e0 115 #define RORA byD0 = F & FLAG_C; RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_RORTable[ byD0 ][ A ].byFlag ); A = g_RORTable[ byD0 ][ A ].byValue
beaglescout007 0:3dac1f1bc9e0 116 #define ROR(a) byD1 = F & FLAG_C; RSTF( FLAG_N | FLAG_Z | FLAG_C ); wA0 = a; byD0 = K6502_Read( wA0 ); SETF( g_RORTable[ byD1 ][ byD0 ].byFlag ); K6502_Write( wA0, g_RORTable[ byD1 ][ byD0 ].byValue )
beaglescout007 0:3dac1f1bc9e0 117
beaglescout007 0:3dac1f1bc9e0 118 // Jump Op.
beaglescout007 0:3dac1f1bc9e0 119 #define JSR wA0 = AA_ABS2; PUSHW( PC ); PC = wA0;
beaglescout007 0:3dac1f1bc9e0 120 #define BRA(a) if ( a ) { wA0 = PC; PC += (signed char)K6502_Read( PC ); CLK( 3 + ( ( wA0 & 0x0100 ) != ( PC & 0x0100 ) ) ); ++PC; } else { ++PC; CLK( 2 ); }
beaglescout007 0:3dac1f1bc9e0 121 #define JMP(a) PC = a;
beaglescout007 0:3dac1f1bc9e0 122
beaglescout007 0:3dac1f1bc9e0 123 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 124 /* Global valiables */
beaglescout007 0:3dac1f1bc9e0 125 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 126
beaglescout007 0:3dac1f1bc9e0 127 // 6502 Register
beaglescout007 0:3dac1f1bc9e0 128 WORD PC;
beaglescout007 0:3dac1f1bc9e0 129 BYTE SP;
beaglescout007 0:3dac1f1bc9e0 130 BYTE F;
beaglescout007 0:3dac1f1bc9e0 131 BYTE A;
beaglescout007 0:3dac1f1bc9e0 132 BYTE X;
beaglescout007 0:3dac1f1bc9e0 133 BYTE Y;
beaglescout007 0:3dac1f1bc9e0 134
beaglescout007 0:3dac1f1bc9e0 135 // The state of the IRQ pin
beaglescout007 0:3dac1f1bc9e0 136 BYTE IRQ_State;
beaglescout007 0:3dac1f1bc9e0 137
beaglescout007 0:3dac1f1bc9e0 138 // Wiring of the IRQ pin
beaglescout007 0:3dac1f1bc9e0 139 BYTE IRQ_Wiring;
beaglescout007 0:3dac1f1bc9e0 140
beaglescout007 0:3dac1f1bc9e0 141 // The state of the NMI pin
beaglescout007 0:3dac1f1bc9e0 142 BYTE NMI_State;
beaglescout007 0:3dac1f1bc9e0 143
beaglescout007 0:3dac1f1bc9e0 144 // Wiring of the NMI pin
beaglescout007 0:3dac1f1bc9e0 145 BYTE NMI_Wiring;
beaglescout007 0:3dac1f1bc9e0 146
beaglescout007 0:3dac1f1bc9e0 147 // The number of the clocks that it passed
beaglescout007 0:3dac1f1bc9e0 148 WORD g_wPassedClocks;
beaglescout007 0:3dac1f1bc9e0 149
beaglescout007 0:3dac1f1bc9e0 150 // A table for the test
beaglescout007 0:3dac1f1bc9e0 151 BYTE g_byTestTable[ 256 ];
beaglescout007 0:3dac1f1bc9e0 152
beaglescout007 0:3dac1f1bc9e0 153 // Value and Flag Data
beaglescout007 0:3dac1f1bc9e0 154 struct value_table_tag
beaglescout007 0:3dac1f1bc9e0 155 {
beaglescout007 0:3dac1f1bc9e0 156 BYTE byValue;
beaglescout007 0:3dac1f1bc9e0 157 BYTE byFlag;
beaglescout007 0:3dac1f1bc9e0 158 };
beaglescout007 0:3dac1f1bc9e0 159
beaglescout007 0:3dac1f1bc9e0 160 // A table for ASL
beaglescout007 0:3dac1f1bc9e0 161 struct value_table_tag g_ASLTable[ 256 ];
beaglescout007 0:3dac1f1bc9e0 162
beaglescout007 0:3dac1f1bc9e0 163 // A table for LSR
beaglescout007 0:3dac1f1bc9e0 164 struct value_table_tag g_LSRTable[ 256 ];
beaglescout007 0:3dac1f1bc9e0 165
beaglescout007 0:3dac1f1bc9e0 166 // A table for ROL
beaglescout007 0:3dac1f1bc9e0 167 struct value_table_tag g_ROLTable[ 2 ][ 256 ];
beaglescout007 0:3dac1f1bc9e0 168
beaglescout007 0:3dac1f1bc9e0 169 // A table for ROR
beaglescout007 0:3dac1f1bc9e0 170 struct value_table_tag g_RORTable[ 2 ][ 256 ];
beaglescout007 0:3dac1f1bc9e0 171
beaglescout007 0:3dac1f1bc9e0 172 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 173 /* */
beaglescout007 0:3dac1f1bc9e0 174 /* K6502_Init() : Initialize K6502 */
beaglescout007 0:3dac1f1bc9e0 175 /* */
beaglescout007 0:3dac1f1bc9e0 176 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 177 void K6502_Init()
beaglescout007 0:3dac1f1bc9e0 178 {
beaglescout007 0:3dac1f1bc9e0 179 /*
beaglescout007 0:3dac1f1bc9e0 180 * Initialize K6502
beaglescout007 0:3dac1f1bc9e0 181 *
beaglescout007 0:3dac1f1bc9e0 182 * You must call this function only once at first.
beaglescout007 0:3dac1f1bc9e0 183 */
beaglescout007 0:3dac1f1bc9e0 184
beaglescout007 0:3dac1f1bc9e0 185 BYTE idx;
beaglescout007 0:3dac1f1bc9e0 186 BYTE idx2;
beaglescout007 0:3dac1f1bc9e0 187
beaglescout007 0:3dac1f1bc9e0 188 // The establishment of the IRQ pin
beaglescout007 0:3dac1f1bc9e0 189 NMI_Wiring = NMI_State = 1;
beaglescout007 0:3dac1f1bc9e0 190 IRQ_Wiring = IRQ_State = 1;
beaglescout007 0:3dac1f1bc9e0 191
beaglescout007 0:3dac1f1bc9e0 192 // Make a table for the test
beaglescout007 0:3dac1f1bc9e0 193 idx = 0;
beaglescout007 0:3dac1f1bc9e0 194 do
beaglescout007 0:3dac1f1bc9e0 195 {
beaglescout007 0:3dac1f1bc9e0 196 if ( idx == 0 )
beaglescout007 0:3dac1f1bc9e0 197 g_byTestTable[ 0 ] = FLAG_Z;
beaglescout007 0:3dac1f1bc9e0 198 else
beaglescout007 0:3dac1f1bc9e0 199 if ( idx > 127 )
beaglescout007 0:3dac1f1bc9e0 200 g_byTestTable[ idx ] = FLAG_N;
beaglescout007 0:3dac1f1bc9e0 201 else
beaglescout007 0:3dac1f1bc9e0 202 g_byTestTable[ idx ] = 0;
beaglescout007 0:3dac1f1bc9e0 203
beaglescout007 0:3dac1f1bc9e0 204 ++idx;
beaglescout007 0:3dac1f1bc9e0 205 } while ( idx != 0 );
beaglescout007 0:3dac1f1bc9e0 206
beaglescout007 0:3dac1f1bc9e0 207 // Make a table ASL
beaglescout007 0:3dac1f1bc9e0 208 idx = 0;
beaglescout007 0:3dac1f1bc9e0 209 do
beaglescout007 0:3dac1f1bc9e0 210 {
beaglescout007 0:3dac1f1bc9e0 211 g_ASLTable[ idx ].byValue = idx << 1;
beaglescout007 0:3dac1f1bc9e0 212 g_ASLTable[ idx ].byFlag = 0;
beaglescout007 0:3dac1f1bc9e0 213
beaglescout007 0:3dac1f1bc9e0 214 if ( idx > 127 )
beaglescout007 0:3dac1f1bc9e0 215 g_ASLTable[ idx ].byFlag = FLAG_C;
beaglescout007 0:3dac1f1bc9e0 216
beaglescout007 0:3dac1f1bc9e0 217 if ( g_ASLTable[ idx ].byValue == 0 )
beaglescout007 0:3dac1f1bc9e0 218 g_ASLTable[ idx ].byFlag |= FLAG_Z;
beaglescout007 0:3dac1f1bc9e0 219 else
beaglescout007 0:3dac1f1bc9e0 220 if ( g_ASLTable[ idx ].byValue & 0x80 )
beaglescout007 0:3dac1f1bc9e0 221 g_ASLTable[ idx ].byFlag |= FLAG_N;
beaglescout007 0:3dac1f1bc9e0 222
beaglescout007 0:3dac1f1bc9e0 223 ++idx;
beaglescout007 0:3dac1f1bc9e0 224 } while ( idx != 0 );
beaglescout007 0:3dac1f1bc9e0 225
beaglescout007 0:3dac1f1bc9e0 226 // Make a table LSR
beaglescout007 0:3dac1f1bc9e0 227 idx = 0;
beaglescout007 0:3dac1f1bc9e0 228 do
beaglescout007 0:3dac1f1bc9e0 229 {
beaglescout007 0:3dac1f1bc9e0 230 g_LSRTable[ idx ].byValue = idx >> 1;
beaglescout007 0:3dac1f1bc9e0 231 g_LSRTable[ idx ].byFlag = 0;
beaglescout007 0:3dac1f1bc9e0 232
beaglescout007 0:3dac1f1bc9e0 233 if ( idx & 1 )
beaglescout007 0:3dac1f1bc9e0 234 g_LSRTable[ idx ].byFlag = FLAG_C;
beaglescout007 0:3dac1f1bc9e0 235
beaglescout007 0:3dac1f1bc9e0 236 if ( g_LSRTable[ idx ].byValue == 0 )
beaglescout007 0:3dac1f1bc9e0 237 g_LSRTable[ idx ].byFlag |= FLAG_Z;
beaglescout007 0:3dac1f1bc9e0 238
beaglescout007 0:3dac1f1bc9e0 239 ++idx;
beaglescout007 0:3dac1f1bc9e0 240 } while ( idx != 0 );
beaglescout007 0:3dac1f1bc9e0 241
beaglescout007 0:3dac1f1bc9e0 242 // Make a table ROL
beaglescout007 0:3dac1f1bc9e0 243 for ( idx2 = 0; idx2 < 2; ++idx2 )
beaglescout007 0:3dac1f1bc9e0 244 {
beaglescout007 0:3dac1f1bc9e0 245 idx = 0;
beaglescout007 0:3dac1f1bc9e0 246 do
beaglescout007 0:3dac1f1bc9e0 247 {
beaglescout007 0:3dac1f1bc9e0 248 g_ROLTable[ idx2 ][ idx ].byValue = ( idx << 1 ) | idx2;
beaglescout007 0:3dac1f1bc9e0 249 g_ROLTable[ idx2 ][ idx ].byFlag = 0;
beaglescout007 0:3dac1f1bc9e0 250
beaglescout007 0:3dac1f1bc9e0 251 if ( idx > 127 )
beaglescout007 0:3dac1f1bc9e0 252 g_ROLTable[ idx2 ][ idx ].byFlag = FLAG_C;
beaglescout007 0:3dac1f1bc9e0 253
beaglescout007 0:3dac1f1bc9e0 254 if ( g_ROLTable[ idx2 ][ idx ].byValue == 0 )
beaglescout007 0:3dac1f1bc9e0 255 g_ROLTable[ idx2 ][ idx ].byFlag |= FLAG_Z;
beaglescout007 0:3dac1f1bc9e0 256 else
beaglescout007 0:3dac1f1bc9e0 257 if ( g_ROLTable[ idx2 ][ idx ].byValue & 0x80 )
beaglescout007 0:3dac1f1bc9e0 258 g_ROLTable[ idx2 ][ idx ].byFlag |= FLAG_N;
beaglescout007 0:3dac1f1bc9e0 259
beaglescout007 0:3dac1f1bc9e0 260 ++idx;
beaglescout007 0:3dac1f1bc9e0 261 } while ( idx != 0 );
beaglescout007 0:3dac1f1bc9e0 262 }
beaglescout007 0:3dac1f1bc9e0 263
beaglescout007 0:3dac1f1bc9e0 264 // Make a table ROR
beaglescout007 0:3dac1f1bc9e0 265 for ( idx2 = 0; idx2 < 2; ++idx2 )
beaglescout007 0:3dac1f1bc9e0 266 {
beaglescout007 0:3dac1f1bc9e0 267 idx = 0;
beaglescout007 0:3dac1f1bc9e0 268 do
beaglescout007 0:3dac1f1bc9e0 269 {
beaglescout007 0:3dac1f1bc9e0 270 g_RORTable[ idx2 ][ idx ].byValue = ( idx >> 1 ) | ( idx2 << 7 );
beaglescout007 0:3dac1f1bc9e0 271 g_RORTable[ idx2 ][ idx ].byFlag = 0;
beaglescout007 0:3dac1f1bc9e0 272
beaglescout007 0:3dac1f1bc9e0 273 if ( idx & 1 )
beaglescout007 0:3dac1f1bc9e0 274 g_RORTable[ idx2 ][ idx ].byFlag = FLAG_C;
beaglescout007 0:3dac1f1bc9e0 275
beaglescout007 0:3dac1f1bc9e0 276 if ( g_RORTable[ idx2 ][ idx ].byValue == 0 )
beaglescout007 0:3dac1f1bc9e0 277 g_RORTable[ idx2 ][ idx ].byFlag |= FLAG_Z;
beaglescout007 0:3dac1f1bc9e0 278 else
beaglescout007 0:3dac1f1bc9e0 279 if ( g_RORTable[ idx2 ][ idx ].byValue & 0x80 )
beaglescout007 0:3dac1f1bc9e0 280 g_RORTable[ idx2 ][ idx ].byFlag |= FLAG_N;
beaglescout007 0:3dac1f1bc9e0 281
beaglescout007 0:3dac1f1bc9e0 282 ++idx;
beaglescout007 0:3dac1f1bc9e0 283 } while ( idx != 0 );
beaglescout007 0:3dac1f1bc9e0 284 }
beaglescout007 0:3dac1f1bc9e0 285 }
beaglescout007 0:3dac1f1bc9e0 286
beaglescout007 0:3dac1f1bc9e0 287 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 288 /* */
beaglescout007 0:3dac1f1bc9e0 289 /* K6502_Reset() : Reset a CPU */
beaglescout007 0:3dac1f1bc9e0 290 /* */
beaglescout007 0:3dac1f1bc9e0 291 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 292 void K6502_Reset()
beaglescout007 0:3dac1f1bc9e0 293 {
beaglescout007 0:3dac1f1bc9e0 294 /*
beaglescout007 0:3dac1f1bc9e0 295 * Reset a CPU
beaglescout007 0:3dac1f1bc9e0 296 *
beaglescout007 0:3dac1f1bc9e0 297 */
beaglescout007 0:3dac1f1bc9e0 298
beaglescout007 0:3dac1f1bc9e0 299 // Reset Registers
beaglescout007 0:3dac1f1bc9e0 300 PC = K6502_ReadW( VECTOR_RESET );
beaglescout007 0:3dac1f1bc9e0 301 SP = 0xFF;
beaglescout007 0:3dac1f1bc9e0 302 A = X = Y = 0;
beaglescout007 0:3dac1f1bc9e0 303 F = FLAG_Z | FLAG_R;
beaglescout007 0:3dac1f1bc9e0 304
beaglescout007 0:3dac1f1bc9e0 305 // Set up the state of the Interrupt pin.
beaglescout007 0:3dac1f1bc9e0 306 NMI_State = NMI_Wiring;
beaglescout007 0:3dac1f1bc9e0 307 IRQ_State = IRQ_Wiring;
beaglescout007 0:3dac1f1bc9e0 308
beaglescout007 0:3dac1f1bc9e0 309 // Reset Passed Clocks
beaglescout007 0:3dac1f1bc9e0 310 g_wPassedClocks = 0;
beaglescout007 0:3dac1f1bc9e0 311 }
beaglescout007 0:3dac1f1bc9e0 312
beaglescout007 0:3dac1f1bc9e0 313 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 314 /* */
beaglescout007 0:3dac1f1bc9e0 315 /* K6502_Set_Int_Wiring() : Set up wiring of the interrupt pin */
beaglescout007 0:3dac1f1bc9e0 316 /* */
beaglescout007 0:3dac1f1bc9e0 317 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 318 void K6502_Set_Int_Wiring( BYTE byNMI_Wiring, BYTE byIRQ_Wiring )
beaglescout007 0:3dac1f1bc9e0 319 {
beaglescout007 0:3dac1f1bc9e0 320 /*
beaglescout007 0:3dac1f1bc9e0 321 * Set up wiring of the interrupt pin
beaglescout007 0:3dac1f1bc9e0 322 *
beaglescout007 0:3dac1f1bc9e0 323 */
beaglescout007 0:3dac1f1bc9e0 324
beaglescout007 0:3dac1f1bc9e0 325 NMI_Wiring = byNMI_Wiring;
beaglescout007 0:3dac1f1bc9e0 326 IRQ_Wiring = byIRQ_Wiring;
beaglescout007 0:3dac1f1bc9e0 327 }
beaglescout007 0:3dac1f1bc9e0 328
beaglescout007 0:3dac1f1bc9e0 329 int dbgstep = 0;
beaglescout007 0:3dac1f1bc9e0 330 int check_userbutton();
beaglescout007 0:3dac1f1bc9e0 331
beaglescout007 0:3dac1f1bc9e0 332 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 333 /* */
beaglescout007 0:3dac1f1bc9e0 334 /* K6502_Step() : */
beaglescout007 0:3dac1f1bc9e0 335 /* Only the specified number of the clocks execute Op. */
beaglescout007 0:3dac1f1bc9e0 336 /* */
beaglescout007 0:3dac1f1bc9e0 337 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 338 void K6502_Step( WORD wClocks )
beaglescout007 0:3dac1f1bc9e0 339 {
beaglescout007 0:3dac1f1bc9e0 340 /*
beaglescout007 0:3dac1f1bc9e0 341 * Only the specified number of the clocks execute Op.
beaglescout007 0:3dac1f1bc9e0 342 *
beaglescout007 0:3dac1f1bc9e0 343 * Parameters
beaglescout007 0:3dac1f1bc9e0 344 * WORD wClocks (Read)
beaglescout007 0:3dac1f1bc9e0 345 * The number of the clocks
beaglescout007 0:3dac1f1bc9e0 346 */
beaglescout007 0:3dac1f1bc9e0 347
beaglescout007 0:3dac1f1bc9e0 348 BYTE byCode;
beaglescout007 0:3dac1f1bc9e0 349
beaglescout007 0:3dac1f1bc9e0 350 WORD wA0;
beaglescout007 0:3dac1f1bc9e0 351 BYTE byD0;
beaglescout007 0:3dac1f1bc9e0 352 BYTE byD1;
beaglescout007 0:3dac1f1bc9e0 353 WORD wD0;
beaglescout007 0:3dac1f1bc9e0 354
beaglescout007 0:3dac1f1bc9e0 355 // Dispose of it if there is an interrupt requirement
beaglescout007 0:3dac1f1bc9e0 356 if ( NMI_State != NMI_Wiring )
beaglescout007 0:3dac1f1bc9e0 357 {
beaglescout007 0:3dac1f1bc9e0 358 // NMI Interrupt
beaglescout007 0:3dac1f1bc9e0 359 CLK( 7 );
beaglescout007 0:3dac1f1bc9e0 360
beaglescout007 0:3dac1f1bc9e0 361 PUSHW( PC );
beaglescout007 0:3dac1f1bc9e0 362 PUSH( F & ~FLAG_B );
beaglescout007 0:3dac1f1bc9e0 363
beaglescout007 0:3dac1f1bc9e0 364 RSTF( FLAG_D );
beaglescout007 0:3dac1f1bc9e0 365
beaglescout007 0:3dac1f1bc9e0 366 PC = K6502_ReadW( VECTOR_NMI );
beaglescout007 0:3dac1f1bc9e0 367 }
beaglescout007 0:3dac1f1bc9e0 368 else
beaglescout007 0:3dac1f1bc9e0 369 if ( IRQ_State != IRQ_Wiring )
beaglescout007 0:3dac1f1bc9e0 370 {
beaglescout007 0:3dac1f1bc9e0 371 // IRQ Interrupt
beaglescout007 0:3dac1f1bc9e0 372 // Execute IRQ if an I flag isn't being set
beaglescout007 0:3dac1f1bc9e0 373 if ( !( F & FLAG_I ) )
beaglescout007 0:3dac1f1bc9e0 374 {
beaglescout007 0:3dac1f1bc9e0 375 CLK( 7 );
beaglescout007 0:3dac1f1bc9e0 376
beaglescout007 0:3dac1f1bc9e0 377 PUSHW( PC );
beaglescout007 0:3dac1f1bc9e0 378 PUSH( F & ~FLAG_B );
beaglescout007 0:3dac1f1bc9e0 379
beaglescout007 0:3dac1f1bc9e0 380 RSTF( FLAG_D );
beaglescout007 0:3dac1f1bc9e0 381 SETF( FLAG_I );
beaglescout007 0:3dac1f1bc9e0 382
beaglescout007 0:3dac1f1bc9e0 383 PC = K6502_ReadW( VECTOR_IRQ );
beaglescout007 0:3dac1f1bc9e0 384 }
beaglescout007 0:3dac1f1bc9e0 385 }
beaglescout007 0:3dac1f1bc9e0 386
beaglescout007 0:3dac1f1bc9e0 387 NMI_State = NMI_Wiring;
beaglescout007 0:3dac1f1bc9e0 388 IRQ_State = IRQ_Wiring;
beaglescout007 0:3dac1f1bc9e0 389
beaglescout007 0:3dac1f1bc9e0 390 // It has a loop until a constant clock passes
beaglescout007 0:3dac1f1bc9e0 391 while ( g_wPassedClocks < wClocks )
beaglescout007 0:3dac1f1bc9e0 392 {
beaglescout007 0:3dac1f1bc9e0 393 // Read an instruction
beaglescout007 0:3dac1f1bc9e0 394 byCode = K6502_Read( PC++ );
beaglescout007 0:3dac1f1bc9e0 395
beaglescout007 0:3dac1f1bc9e0 396 //if (dbgstep % 10000 == 0)
beaglescout007 0:3dac1f1bc9e0 397 //{
beaglescout007 0:3dac1f1bc9e0 398 // printf("%8d PC:%4x Code:%2x SP:%2x F:%2x A:%2x X:%2x Y:%2x\r\n", dbgstep, PC - 1, byCode, SP, F, A, X, Y);
beaglescout007 0:3dac1f1bc9e0 399 // while (check_userbutton() != 0) ;
beaglescout007 0:3dac1f1bc9e0 400 // wait(0.1);
beaglescout007 0:3dac1f1bc9e0 401 //}
beaglescout007 0:3dac1f1bc9e0 402 //dbgstep++;
beaglescout007 0:3dac1f1bc9e0 403
beaglescout007 0:3dac1f1bc9e0 404 // Execute an instruction.
beaglescout007 0:3dac1f1bc9e0 405 switch ( byCode )
beaglescout007 0:3dac1f1bc9e0 406 {
beaglescout007 0:3dac1f1bc9e0 407 case 0x00: // BRK
beaglescout007 0:3dac1f1bc9e0 408 ++PC; PUSHW( PC ); SETF( FLAG_B ); PUSH( F ); SETF( FLAG_I ); RSTF( FLAG_D ); PC = K6502_ReadW( VECTOR_IRQ ); CLK( 7 );
beaglescout007 0:3dac1f1bc9e0 409 break;
beaglescout007 0:3dac1f1bc9e0 410
beaglescout007 0:3dac1f1bc9e0 411 case 0x01: // ORA (Zpg,X)
beaglescout007 0:3dac1f1bc9e0 412 ORA( A_IX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 413 break;
beaglescout007 0:3dac1f1bc9e0 414
beaglescout007 0:3dac1f1bc9e0 415 case 0x05: // ORA Zpg
beaglescout007 0:3dac1f1bc9e0 416 ORA( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 417 break;
beaglescout007 0:3dac1f1bc9e0 418
beaglescout007 0:3dac1f1bc9e0 419 case 0x06: // ASL Zpg
beaglescout007 0:3dac1f1bc9e0 420 ASL( AA_ZP ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 421 break;
beaglescout007 0:3dac1f1bc9e0 422
beaglescout007 0:3dac1f1bc9e0 423 case 0x08: // PHP
beaglescout007 0:3dac1f1bc9e0 424 PUSH( F ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 425 break;
beaglescout007 0:3dac1f1bc9e0 426
beaglescout007 0:3dac1f1bc9e0 427 case 0x09: // ORA #Oper
beaglescout007 0:3dac1f1bc9e0 428 ORA( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 429 break;
beaglescout007 0:3dac1f1bc9e0 430
beaglescout007 0:3dac1f1bc9e0 431 case 0x0A: // ASL A
beaglescout007 0:3dac1f1bc9e0 432 ASLA; CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 433 break;
beaglescout007 0:3dac1f1bc9e0 434
beaglescout007 0:3dac1f1bc9e0 435 case 0x0D: // ORA Abs
beaglescout007 0:3dac1f1bc9e0 436 ORA( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 437 break;
beaglescout007 0:3dac1f1bc9e0 438
beaglescout007 0:3dac1f1bc9e0 439 case 0x0e: // ASL Abs
beaglescout007 0:3dac1f1bc9e0 440 ASL( AA_ABS ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 441 break;
beaglescout007 0:3dac1f1bc9e0 442
beaglescout007 0:3dac1f1bc9e0 443 case 0x10: // BPL Oper
beaglescout007 0:3dac1f1bc9e0 444 BRA( !( F & FLAG_N ) );
beaglescout007 0:3dac1f1bc9e0 445 break;
beaglescout007 0:3dac1f1bc9e0 446
beaglescout007 0:3dac1f1bc9e0 447 case 0x11: // ORA (Zpg),Y
beaglescout007 0:3dac1f1bc9e0 448 ORA( A_IY ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 449 break;
beaglescout007 0:3dac1f1bc9e0 450
beaglescout007 0:3dac1f1bc9e0 451 case 0x15: // ORA Zpg,X
beaglescout007 0:3dac1f1bc9e0 452 ORA( A_ZPX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 453 break;
beaglescout007 0:3dac1f1bc9e0 454
beaglescout007 0:3dac1f1bc9e0 455 case 0x16: // ASL Zpg,X
beaglescout007 0:3dac1f1bc9e0 456 ASL( AA_ZPX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 457 break;
beaglescout007 0:3dac1f1bc9e0 458
beaglescout007 0:3dac1f1bc9e0 459 case 0x18: // CLC
beaglescout007 0:3dac1f1bc9e0 460 RSTF( FLAG_C ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 461 break;
beaglescout007 0:3dac1f1bc9e0 462
beaglescout007 0:3dac1f1bc9e0 463 case 0x19: // ORA Abs,Y
beaglescout007 0:3dac1f1bc9e0 464 ORA( A_ABSY ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 465 break;
beaglescout007 0:3dac1f1bc9e0 466
beaglescout007 0:3dac1f1bc9e0 467 case 0x1D: // ORA Abs,X
beaglescout007 0:3dac1f1bc9e0 468 ORA( A_ABSX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 469 break;
beaglescout007 0:3dac1f1bc9e0 470
beaglescout007 0:3dac1f1bc9e0 471 case 0x1E: // ASL Abs,X
beaglescout007 0:3dac1f1bc9e0 472 ASL( AA_ABSX ); CLK( 7 );
beaglescout007 0:3dac1f1bc9e0 473 break;
beaglescout007 0:3dac1f1bc9e0 474
beaglescout007 0:3dac1f1bc9e0 475 case 0x20: // JSR Abs
beaglescout007 0:3dac1f1bc9e0 476 JSR; CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 477 break;
beaglescout007 0:3dac1f1bc9e0 478
beaglescout007 0:3dac1f1bc9e0 479 case 0x21: // AND (Zpg,X)
beaglescout007 0:3dac1f1bc9e0 480 AND( A_IX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 481 break;
beaglescout007 0:3dac1f1bc9e0 482
beaglescout007 0:3dac1f1bc9e0 483 case 0x24: // BIT Zpg
beaglescout007 0:3dac1f1bc9e0 484 BIT( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 485 break;
beaglescout007 0:3dac1f1bc9e0 486
beaglescout007 0:3dac1f1bc9e0 487 case 0x25: // AND Zpg
beaglescout007 0:3dac1f1bc9e0 488 AND( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 489 break;
beaglescout007 0:3dac1f1bc9e0 490
beaglescout007 0:3dac1f1bc9e0 491 case 0x26: // ROL Zpg
beaglescout007 0:3dac1f1bc9e0 492 ROL( AA_ZP ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 493 break;
beaglescout007 0:3dac1f1bc9e0 494
beaglescout007 0:3dac1f1bc9e0 495 case 0x28: // PLP
beaglescout007 0:3dac1f1bc9e0 496 POP( F ); SETF( FLAG_R ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 497 break;
beaglescout007 0:3dac1f1bc9e0 498
beaglescout007 0:3dac1f1bc9e0 499 case 0x29: // AND #Oper
beaglescout007 0:3dac1f1bc9e0 500 AND( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 501 break;
beaglescout007 0:3dac1f1bc9e0 502
beaglescout007 0:3dac1f1bc9e0 503 case 0x2A: // ROL A
beaglescout007 0:3dac1f1bc9e0 504 ROLA; CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 505 break;
beaglescout007 0:3dac1f1bc9e0 506
beaglescout007 0:3dac1f1bc9e0 507 case 0x2C: // BIT Abs
beaglescout007 0:3dac1f1bc9e0 508 BIT( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 509 break;
beaglescout007 0:3dac1f1bc9e0 510
beaglescout007 0:3dac1f1bc9e0 511 case 0x2D: // AND Abs
beaglescout007 0:3dac1f1bc9e0 512 AND( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 513 break;
beaglescout007 0:3dac1f1bc9e0 514
beaglescout007 0:3dac1f1bc9e0 515 case 0x2E: // ROL Abs
beaglescout007 0:3dac1f1bc9e0 516 ROL( AA_ABS ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 517 break;
beaglescout007 0:3dac1f1bc9e0 518
beaglescout007 0:3dac1f1bc9e0 519 case 0x30: // BMI Oper
beaglescout007 0:3dac1f1bc9e0 520 BRA( F & FLAG_N );
beaglescout007 0:3dac1f1bc9e0 521 break;
beaglescout007 0:3dac1f1bc9e0 522
beaglescout007 0:3dac1f1bc9e0 523 case 0x31: // AND (Zpg),Y
beaglescout007 0:3dac1f1bc9e0 524 AND( A_IY ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 525 break;
beaglescout007 0:3dac1f1bc9e0 526
beaglescout007 0:3dac1f1bc9e0 527 case 0x35: // AND Zpg,X
beaglescout007 0:3dac1f1bc9e0 528 AND( A_ZPX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 529 break;
beaglescout007 0:3dac1f1bc9e0 530
beaglescout007 0:3dac1f1bc9e0 531 case 0x36: // ROL Zpg,X
beaglescout007 0:3dac1f1bc9e0 532 ROL( AA_ZPX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 533 break;
beaglescout007 0:3dac1f1bc9e0 534
beaglescout007 0:3dac1f1bc9e0 535 case 0x38: // SEC
beaglescout007 0:3dac1f1bc9e0 536 SETF( FLAG_C ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 537 break;
beaglescout007 0:3dac1f1bc9e0 538
beaglescout007 0:3dac1f1bc9e0 539 case 0x39: // AND Abs,Y
beaglescout007 0:3dac1f1bc9e0 540 AND( A_ABSY ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 541 break;
beaglescout007 0:3dac1f1bc9e0 542
beaglescout007 0:3dac1f1bc9e0 543 case 0x3D: // AND Abs,X
beaglescout007 0:3dac1f1bc9e0 544 AND( A_ABSX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 545 break;
beaglescout007 0:3dac1f1bc9e0 546
beaglescout007 0:3dac1f1bc9e0 547 case 0x3E: // ROL Abs,X
beaglescout007 0:3dac1f1bc9e0 548 ROL( AA_ABSX ); CLK( 7 );
beaglescout007 0:3dac1f1bc9e0 549 break;
beaglescout007 0:3dac1f1bc9e0 550
beaglescout007 0:3dac1f1bc9e0 551 case 0x40: // RTI
beaglescout007 0:3dac1f1bc9e0 552 POP( F ); SETF( FLAG_R ); POPW( PC ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 553 break;
beaglescout007 0:3dac1f1bc9e0 554
beaglescout007 0:3dac1f1bc9e0 555 case 0x41: // EOR (Zpg,X)
beaglescout007 0:3dac1f1bc9e0 556 EOR( A_IX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 557 break;
beaglescout007 0:3dac1f1bc9e0 558
beaglescout007 0:3dac1f1bc9e0 559 case 0x45: // EOR Zpg
beaglescout007 0:3dac1f1bc9e0 560 EOR( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 561 break;
beaglescout007 0:3dac1f1bc9e0 562
beaglescout007 0:3dac1f1bc9e0 563 case 0x46: // LSR Zpg
beaglescout007 0:3dac1f1bc9e0 564 LSR( AA_ZP ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 565 break;
beaglescout007 0:3dac1f1bc9e0 566
beaglescout007 0:3dac1f1bc9e0 567 case 0x48: // PHA
beaglescout007 0:3dac1f1bc9e0 568 PUSH( A ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 569 break;
beaglescout007 0:3dac1f1bc9e0 570
beaglescout007 0:3dac1f1bc9e0 571 case 0x49: // EOR #Oper
beaglescout007 0:3dac1f1bc9e0 572 EOR( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 573 break;
beaglescout007 0:3dac1f1bc9e0 574
beaglescout007 0:3dac1f1bc9e0 575 case 0x4A: // LSR A
beaglescout007 0:3dac1f1bc9e0 576 LSRA; CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 577 break;
beaglescout007 0:3dac1f1bc9e0 578
beaglescout007 0:3dac1f1bc9e0 579 case 0x4C: // JMP Abs
beaglescout007 0:3dac1f1bc9e0 580 JMP( AA_ABS ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 581 break;
beaglescout007 0:3dac1f1bc9e0 582
beaglescout007 0:3dac1f1bc9e0 583 case 0x4D: // EOR Abs
beaglescout007 0:3dac1f1bc9e0 584 EOR( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 585 break;
beaglescout007 0:3dac1f1bc9e0 586
beaglescout007 0:3dac1f1bc9e0 587 case 0x4E: // LSR Abs
beaglescout007 0:3dac1f1bc9e0 588 LSR( AA_ABS ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 589 break;
beaglescout007 0:3dac1f1bc9e0 590
beaglescout007 0:3dac1f1bc9e0 591 case 0x50: // BVC
beaglescout007 0:3dac1f1bc9e0 592 BRA( !( F & FLAG_V ) );
beaglescout007 0:3dac1f1bc9e0 593 break;
beaglescout007 0:3dac1f1bc9e0 594
beaglescout007 0:3dac1f1bc9e0 595 case 0x51: // EOR (Zpg),Y
beaglescout007 0:3dac1f1bc9e0 596 EOR( A_IY ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 597 break;
beaglescout007 0:3dac1f1bc9e0 598
beaglescout007 0:3dac1f1bc9e0 599 case 0x55: // EOR Zpg,X
beaglescout007 0:3dac1f1bc9e0 600 EOR( A_ZPX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 601 break;
beaglescout007 0:3dac1f1bc9e0 602
beaglescout007 0:3dac1f1bc9e0 603 case 0x56: // LSR Zpg,X
beaglescout007 0:3dac1f1bc9e0 604 LSR( AA_ZPX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 605 break;
beaglescout007 0:3dac1f1bc9e0 606
beaglescout007 0:3dac1f1bc9e0 607 case 0x58: // CLI
beaglescout007 0:3dac1f1bc9e0 608 byD0 = F;
beaglescout007 0:3dac1f1bc9e0 609 RSTF( FLAG_I ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 610 if ( ( byD0 & FLAG_I ) && IRQ_State == 0 )
beaglescout007 0:3dac1f1bc9e0 611 {
beaglescout007 0:3dac1f1bc9e0 612 // IRQ Interrupt
beaglescout007 0:3dac1f1bc9e0 613 // Execute IRQ if an I flag isn't being set
beaglescout007 0:3dac1f1bc9e0 614 if ( !( F & FLAG_I ) )
beaglescout007 0:3dac1f1bc9e0 615 {
beaglescout007 0:3dac1f1bc9e0 616 CLK( 7 );
beaglescout007 0:3dac1f1bc9e0 617
beaglescout007 0:3dac1f1bc9e0 618 PUSHW( PC );
beaglescout007 0:3dac1f1bc9e0 619 PUSH( F & ~FLAG_B );
beaglescout007 0:3dac1f1bc9e0 620
beaglescout007 0:3dac1f1bc9e0 621 RSTF( FLAG_D );
beaglescout007 0:3dac1f1bc9e0 622 SETF( FLAG_I );
beaglescout007 0:3dac1f1bc9e0 623
beaglescout007 0:3dac1f1bc9e0 624 PC = K6502_ReadW( VECTOR_IRQ );
beaglescout007 0:3dac1f1bc9e0 625 }
beaglescout007 0:3dac1f1bc9e0 626 }
beaglescout007 0:3dac1f1bc9e0 627 break;
beaglescout007 0:3dac1f1bc9e0 628
beaglescout007 0:3dac1f1bc9e0 629 case 0x59: // EOR Abs,Y
beaglescout007 0:3dac1f1bc9e0 630 EOR( A_ABSY ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 631 break;
beaglescout007 0:3dac1f1bc9e0 632
beaglescout007 0:3dac1f1bc9e0 633 case 0x5D: // EOR Abs,X
beaglescout007 0:3dac1f1bc9e0 634 EOR( A_ABSX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 635 break;
beaglescout007 0:3dac1f1bc9e0 636
beaglescout007 0:3dac1f1bc9e0 637 case 0x5E: // LSR Abs,X
beaglescout007 0:3dac1f1bc9e0 638 LSR( AA_ABSX ); CLK( 7 );
beaglescout007 0:3dac1f1bc9e0 639 break;
beaglescout007 0:3dac1f1bc9e0 640
beaglescout007 0:3dac1f1bc9e0 641 case 0x60: // RTS
beaglescout007 0:3dac1f1bc9e0 642 POPW( PC ); ++PC; CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 643 break;
beaglescout007 0:3dac1f1bc9e0 644
beaglescout007 0:3dac1f1bc9e0 645 case 0x61: // ADC (Zpg,X)
beaglescout007 0:3dac1f1bc9e0 646 ADC( A_IX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 647 break;
beaglescout007 0:3dac1f1bc9e0 648
beaglescout007 0:3dac1f1bc9e0 649 case 0x65: // ADC Zpg
beaglescout007 0:3dac1f1bc9e0 650 ADC( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 651 break;
beaglescout007 0:3dac1f1bc9e0 652
beaglescout007 0:3dac1f1bc9e0 653 case 0x66: // ROR Zpg
beaglescout007 0:3dac1f1bc9e0 654 ROR( AA_ZP ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 655 break;
beaglescout007 0:3dac1f1bc9e0 656
beaglescout007 0:3dac1f1bc9e0 657 case 0x68: // PLA
beaglescout007 0:3dac1f1bc9e0 658 POP( A ); TEST( A ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 659 break;
beaglescout007 0:3dac1f1bc9e0 660
beaglescout007 0:3dac1f1bc9e0 661 case 0x69: // ADC #Oper
beaglescout007 0:3dac1f1bc9e0 662 ADC( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 663 break;
beaglescout007 0:3dac1f1bc9e0 664
beaglescout007 0:3dac1f1bc9e0 665 case 0x6A: // ROR A
beaglescout007 0:3dac1f1bc9e0 666 RORA; CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 667 break;
beaglescout007 0:3dac1f1bc9e0 668
beaglescout007 0:3dac1f1bc9e0 669 case 0x6C: // JMP (Abs)
beaglescout007 0:3dac1f1bc9e0 670 JMP( K6502_ReadW( AA_ABS ) ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 671 break;
beaglescout007 0:3dac1f1bc9e0 672
beaglescout007 0:3dac1f1bc9e0 673 case 0x6D: // ADC Abs
beaglescout007 0:3dac1f1bc9e0 674 ADC( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 675 break;
beaglescout007 0:3dac1f1bc9e0 676
beaglescout007 0:3dac1f1bc9e0 677 case 0x6E: // ROR Abs
beaglescout007 0:3dac1f1bc9e0 678 ROR( AA_ABS ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 679 break;
beaglescout007 0:3dac1f1bc9e0 680
beaglescout007 0:3dac1f1bc9e0 681 case 0x70: // BVS
beaglescout007 0:3dac1f1bc9e0 682 BRA( F & FLAG_V );
beaglescout007 0:3dac1f1bc9e0 683 break;
beaglescout007 0:3dac1f1bc9e0 684
beaglescout007 0:3dac1f1bc9e0 685 case 0x71: // ADC (Zpg),Y
beaglescout007 0:3dac1f1bc9e0 686 ADC( A_IY ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 687 break;
beaglescout007 0:3dac1f1bc9e0 688
beaglescout007 0:3dac1f1bc9e0 689 case 0x75: // ADC Zpg,X
beaglescout007 0:3dac1f1bc9e0 690 ADC( A_ZPX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 691 break;
beaglescout007 0:3dac1f1bc9e0 692
beaglescout007 0:3dac1f1bc9e0 693 case 0x76: // ROR Zpg,X
beaglescout007 0:3dac1f1bc9e0 694 ROR( AA_ZPX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 695 break;
beaglescout007 0:3dac1f1bc9e0 696
beaglescout007 0:3dac1f1bc9e0 697 case 0x78: // SEI
beaglescout007 0:3dac1f1bc9e0 698 SETF( FLAG_I ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 699 break;
beaglescout007 0:3dac1f1bc9e0 700
beaglescout007 0:3dac1f1bc9e0 701 case 0x79: // ADC Abs,Y
beaglescout007 0:3dac1f1bc9e0 702 ADC( A_ABSY ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 703 break;
beaglescout007 0:3dac1f1bc9e0 704
beaglescout007 0:3dac1f1bc9e0 705 case 0x7D: // ADC Abs,X
beaglescout007 0:3dac1f1bc9e0 706 ADC( A_ABSX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 707 break;
beaglescout007 0:3dac1f1bc9e0 708
beaglescout007 0:3dac1f1bc9e0 709 case 0x7E: // ROR Abs,X
beaglescout007 0:3dac1f1bc9e0 710 ROR( AA_ABSX ); CLK( 7 );
beaglescout007 0:3dac1f1bc9e0 711 break;
beaglescout007 0:3dac1f1bc9e0 712
beaglescout007 0:3dac1f1bc9e0 713 case 0x81: // STA (Zpg,X)
beaglescout007 0:3dac1f1bc9e0 714 STA( AA_IX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 715 break;
beaglescout007 0:3dac1f1bc9e0 716
beaglescout007 0:3dac1f1bc9e0 717 case 0x84: // STY Zpg
beaglescout007 0:3dac1f1bc9e0 718 STY( AA_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 719 break;
beaglescout007 0:3dac1f1bc9e0 720
beaglescout007 0:3dac1f1bc9e0 721 case 0x85: // STA Zpg
beaglescout007 0:3dac1f1bc9e0 722 STA( AA_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 723 break;
beaglescout007 0:3dac1f1bc9e0 724
beaglescout007 0:3dac1f1bc9e0 725 case 0x86: // STX Zpg
beaglescout007 0:3dac1f1bc9e0 726 STX( AA_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 727 break;
beaglescout007 0:3dac1f1bc9e0 728
beaglescout007 0:3dac1f1bc9e0 729 case 0x88: // DEY
beaglescout007 0:3dac1f1bc9e0 730 --Y; TEST( Y ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 731 break;
beaglescout007 0:3dac1f1bc9e0 732
beaglescout007 0:3dac1f1bc9e0 733 case 0x8A: // TXA
beaglescout007 0:3dac1f1bc9e0 734 A = X; TEST( A ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 735 break;
beaglescout007 0:3dac1f1bc9e0 736
beaglescout007 0:3dac1f1bc9e0 737 case 0x8C: // STY Abs
beaglescout007 0:3dac1f1bc9e0 738 STY( AA_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 739 break;
beaglescout007 0:3dac1f1bc9e0 740
beaglescout007 0:3dac1f1bc9e0 741 case 0x8D: // STA Abs
beaglescout007 0:3dac1f1bc9e0 742 STA( AA_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 743 break;
beaglescout007 0:3dac1f1bc9e0 744
beaglescout007 0:3dac1f1bc9e0 745 case 0x8E: // STX Abs
beaglescout007 0:3dac1f1bc9e0 746 STX( AA_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 747 break;
beaglescout007 0:3dac1f1bc9e0 748
beaglescout007 0:3dac1f1bc9e0 749 case 0x90: // BCC
beaglescout007 0:3dac1f1bc9e0 750 BRA( !( F & FLAG_C ) );
beaglescout007 0:3dac1f1bc9e0 751 break;
beaglescout007 0:3dac1f1bc9e0 752
beaglescout007 0:3dac1f1bc9e0 753 case 0x91: // STA (Zpg),Y
beaglescout007 0:3dac1f1bc9e0 754 STA( AA_IY ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 755 break;
beaglescout007 0:3dac1f1bc9e0 756
beaglescout007 0:3dac1f1bc9e0 757 case 0x94: // STY Zpg,X
beaglescout007 0:3dac1f1bc9e0 758 STY( AA_ZPX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 759 break;
beaglescout007 0:3dac1f1bc9e0 760
beaglescout007 0:3dac1f1bc9e0 761 case 0x95: // STA Zpg,X
beaglescout007 0:3dac1f1bc9e0 762 STA( AA_ZPX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 763 break;
beaglescout007 0:3dac1f1bc9e0 764
beaglescout007 0:3dac1f1bc9e0 765 case 0x96: // STX Zpg,Y
beaglescout007 0:3dac1f1bc9e0 766 STX( AA_ZPY ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 767 break;
beaglescout007 0:3dac1f1bc9e0 768
beaglescout007 0:3dac1f1bc9e0 769 case 0x98: // TYA
beaglescout007 0:3dac1f1bc9e0 770 A = Y; TEST( A ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 771 break;
beaglescout007 0:3dac1f1bc9e0 772
beaglescout007 0:3dac1f1bc9e0 773 case 0x99: // STA Abs,Y
beaglescout007 0:3dac1f1bc9e0 774 STA( AA_ABSY ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 775 break;
beaglescout007 0:3dac1f1bc9e0 776
beaglescout007 0:3dac1f1bc9e0 777 case 0x9A: // TXS
beaglescout007 0:3dac1f1bc9e0 778 SP = X; CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 779 break;
beaglescout007 0:3dac1f1bc9e0 780
beaglescout007 0:3dac1f1bc9e0 781 case 0x9D: // STA Abs,X
beaglescout007 0:3dac1f1bc9e0 782 STA( AA_ABSX ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 783 break;
beaglescout007 0:3dac1f1bc9e0 784
beaglescout007 0:3dac1f1bc9e0 785 case 0xA0: // LDY #Oper
beaglescout007 0:3dac1f1bc9e0 786 LDY( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 787 break;
beaglescout007 0:3dac1f1bc9e0 788
beaglescout007 0:3dac1f1bc9e0 789 case 0xA1: // LDA (Zpg,X)
beaglescout007 0:3dac1f1bc9e0 790 LDA( A_IX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 791 break;
beaglescout007 0:3dac1f1bc9e0 792
beaglescout007 0:3dac1f1bc9e0 793 case 0xA2: // LDX #Oper
beaglescout007 0:3dac1f1bc9e0 794 LDX( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 795 break;
beaglescout007 0:3dac1f1bc9e0 796
beaglescout007 0:3dac1f1bc9e0 797 case 0xA4: // LDY Zpg
beaglescout007 0:3dac1f1bc9e0 798 LDY( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 799 break;
beaglescout007 0:3dac1f1bc9e0 800
beaglescout007 0:3dac1f1bc9e0 801 case 0xA5: // LDA Zpg
beaglescout007 0:3dac1f1bc9e0 802 LDA( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 803 break;
beaglescout007 0:3dac1f1bc9e0 804
beaglescout007 0:3dac1f1bc9e0 805 case 0xA6: // LDX Zpg
beaglescout007 0:3dac1f1bc9e0 806 LDX( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 807 break;
beaglescout007 0:3dac1f1bc9e0 808
beaglescout007 0:3dac1f1bc9e0 809 case 0xA8: // TAY
beaglescout007 0:3dac1f1bc9e0 810 Y = A; TEST( A ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 811 break;
beaglescout007 0:3dac1f1bc9e0 812
beaglescout007 0:3dac1f1bc9e0 813 case 0xA9: // LDA #Oper
beaglescout007 0:3dac1f1bc9e0 814 LDA( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 815 break;
beaglescout007 0:3dac1f1bc9e0 816
beaglescout007 0:3dac1f1bc9e0 817 case 0xAA: // TAX
beaglescout007 0:3dac1f1bc9e0 818 X = A; TEST( A ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 819 break;
beaglescout007 0:3dac1f1bc9e0 820
beaglescout007 0:3dac1f1bc9e0 821 case 0xAC: // LDY Abs
beaglescout007 0:3dac1f1bc9e0 822 LDY( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 823 break;
beaglescout007 0:3dac1f1bc9e0 824
beaglescout007 0:3dac1f1bc9e0 825 case 0xAD: // LDA Abs
beaglescout007 0:3dac1f1bc9e0 826 LDA( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 827 break;
beaglescout007 0:3dac1f1bc9e0 828
beaglescout007 0:3dac1f1bc9e0 829 case 0xAE: // LDX Abs
beaglescout007 0:3dac1f1bc9e0 830 LDX( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 831 break;
beaglescout007 0:3dac1f1bc9e0 832
beaglescout007 0:3dac1f1bc9e0 833 case 0xB0: // BCS
beaglescout007 0:3dac1f1bc9e0 834 BRA( F & FLAG_C );
beaglescout007 0:3dac1f1bc9e0 835 break;
beaglescout007 0:3dac1f1bc9e0 836
beaglescout007 0:3dac1f1bc9e0 837 case 0xB1: // LDA (Zpg),Y
beaglescout007 0:3dac1f1bc9e0 838 LDA( A_IY ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 839 break;
beaglescout007 0:3dac1f1bc9e0 840
beaglescout007 0:3dac1f1bc9e0 841 case 0xB4: // LDY Zpg,X
beaglescout007 0:3dac1f1bc9e0 842 LDY( A_ZPX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 843 break;
beaglescout007 0:3dac1f1bc9e0 844
beaglescout007 0:3dac1f1bc9e0 845 case 0xB5: // LDA Zpg,X
beaglescout007 0:3dac1f1bc9e0 846 LDA( A_ZPX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 847 break;
beaglescout007 0:3dac1f1bc9e0 848
beaglescout007 0:3dac1f1bc9e0 849 case 0xB6: // LDX Zpg,Y
beaglescout007 0:3dac1f1bc9e0 850 LDX( A_ZPY ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 851 break;
beaglescout007 0:3dac1f1bc9e0 852
beaglescout007 0:3dac1f1bc9e0 853 case 0xB8: // CLV
beaglescout007 0:3dac1f1bc9e0 854 RSTF( FLAG_V ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 855 break;
beaglescout007 0:3dac1f1bc9e0 856
beaglescout007 0:3dac1f1bc9e0 857 case 0xB9: // LDA Abs,Y
beaglescout007 0:3dac1f1bc9e0 858 LDA( A_ABSY ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 859 break;
beaglescout007 0:3dac1f1bc9e0 860
beaglescout007 0:3dac1f1bc9e0 861 case 0xBA: // TSX
beaglescout007 0:3dac1f1bc9e0 862 X = SP; TEST( X ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 863 break;
beaglescout007 0:3dac1f1bc9e0 864
beaglescout007 0:3dac1f1bc9e0 865 case 0xBC: // LDY Abs,X
beaglescout007 0:3dac1f1bc9e0 866 LDY( A_ABSX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 867 break;
beaglescout007 0:3dac1f1bc9e0 868
beaglescout007 0:3dac1f1bc9e0 869 case 0xBD: // LDA Abs,X
beaglescout007 0:3dac1f1bc9e0 870 LDA( A_ABSX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 871 break;
beaglescout007 0:3dac1f1bc9e0 872
beaglescout007 0:3dac1f1bc9e0 873 case 0xBE: // LDX Abs,Y
beaglescout007 0:3dac1f1bc9e0 874 LDX( A_ABSY ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 875 break;
beaglescout007 0:3dac1f1bc9e0 876
beaglescout007 0:3dac1f1bc9e0 877 case 0xC0: // CPY #Oper
beaglescout007 0:3dac1f1bc9e0 878 CPY( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 879 break;
beaglescout007 0:3dac1f1bc9e0 880
beaglescout007 0:3dac1f1bc9e0 881 case 0xC1: // CMP (Zpg,X)
beaglescout007 0:3dac1f1bc9e0 882 CMP( A_IX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 883 break;
beaglescout007 0:3dac1f1bc9e0 884
beaglescout007 0:3dac1f1bc9e0 885 case 0xC4: // CPY Zpg
beaglescout007 0:3dac1f1bc9e0 886 CPY( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 887 break;
beaglescout007 0:3dac1f1bc9e0 888
beaglescout007 0:3dac1f1bc9e0 889 case 0xC5: // CMP Zpg
beaglescout007 0:3dac1f1bc9e0 890 CMP( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 891 break;
beaglescout007 0:3dac1f1bc9e0 892
beaglescout007 0:3dac1f1bc9e0 893 case 0xC6: // DEC Zpg
beaglescout007 0:3dac1f1bc9e0 894 DEC( AA_ZP ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 895 break;
beaglescout007 0:3dac1f1bc9e0 896
beaglescout007 0:3dac1f1bc9e0 897 case 0xC8: // INY
beaglescout007 0:3dac1f1bc9e0 898 ++Y; TEST( Y ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 899 break;
beaglescout007 0:3dac1f1bc9e0 900
beaglescout007 0:3dac1f1bc9e0 901 case 0xC9: // CMP #Oper
beaglescout007 0:3dac1f1bc9e0 902 CMP( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 903 break;
beaglescout007 0:3dac1f1bc9e0 904
beaglescout007 0:3dac1f1bc9e0 905 case 0xCA: // DEX
beaglescout007 0:3dac1f1bc9e0 906 --X; TEST( X ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 907 break;
beaglescout007 0:3dac1f1bc9e0 908
beaglescout007 0:3dac1f1bc9e0 909 case 0xCC: // CPY Abs
beaglescout007 0:3dac1f1bc9e0 910 CPY( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 911 break;
beaglescout007 0:3dac1f1bc9e0 912
beaglescout007 0:3dac1f1bc9e0 913 case 0xCD: // CMP Abs
beaglescout007 0:3dac1f1bc9e0 914 CMP( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 915 break;
beaglescout007 0:3dac1f1bc9e0 916
beaglescout007 0:3dac1f1bc9e0 917 case 0xCE: // DEC Abs
beaglescout007 0:3dac1f1bc9e0 918 DEC( AA_ABS ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 919 break;
beaglescout007 0:3dac1f1bc9e0 920
beaglescout007 0:3dac1f1bc9e0 921 case 0xD0: // BNE
beaglescout007 0:3dac1f1bc9e0 922 BRA( !( F & FLAG_Z ) );
beaglescout007 0:3dac1f1bc9e0 923 break;
beaglescout007 0:3dac1f1bc9e0 924
beaglescout007 0:3dac1f1bc9e0 925 case 0xD1: // CMP (Zpg),Y
beaglescout007 0:3dac1f1bc9e0 926 CMP( A_IY ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 927 break;
beaglescout007 0:3dac1f1bc9e0 928
beaglescout007 0:3dac1f1bc9e0 929 case 0xD5: // CMP Zpg,X
beaglescout007 0:3dac1f1bc9e0 930 CMP( A_ZPX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 931 break;
beaglescout007 0:3dac1f1bc9e0 932
beaglescout007 0:3dac1f1bc9e0 933 case 0xD6: // DEC Zpg,X
beaglescout007 0:3dac1f1bc9e0 934 DEC( AA_ZPX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 935 break;
beaglescout007 0:3dac1f1bc9e0 936
beaglescout007 0:3dac1f1bc9e0 937 case 0xD8: // CLD
beaglescout007 0:3dac1f1bc9e0 938 RSTF( FLAG_D ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 939 break;
beaglescout007 0:3dac1f1bc9e0 940
beaglescout007 0:3dac1f1bc9e0 941 case 0xD9: // CMP Abs,Y
beaglescout007 0:3dac1f1bc9e0 942 CMP( A_ABSY ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 943 break;
beaglescout007 0:3dac1f1bc9e0 944
beaglescout007 0:3dac1f1bc9e0 945 case 0xDD: // CMP Abs,X
beaglescout007 0:3dac1f1bc9e0 946 CMP( A_ABSX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 947 break;
beaglescout007 0:3dac1f1bc9e0 948
beaglescout007 0:3dac1f1bc9e0 949 case 0xDE: // DEC Abs,X
beaglescout007 0:3dac1f1bc9e0 950 DEC( AA_ABSX ); CLK( 7 );
beaglescout007 0:3dac1f1bc9e0 951 break;
beaglescout007 0:3dac1f1bc9e0 952
beaglescout007 0:3dac1f1bc9e0 953 case 0xE0: // CPX #Oper
beaglescout007 0:3dac1f1bc9e0 954 CPX( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 955 break;
beaglescout007 0:3dac1f1bc9e0 956
beaglescout007 0:3dac1f1bc9e0 957 case 0xE1: // SBC (Zpg,X)
beaglescout007 0:3dac1f1bc9e0 958 SBC( A_IX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 959 break;
beaglescout007 0:3dac1f1bc9e0 960
beaglescout007 0:3dac1f1bc9e0 961 case 0xE4: // CPX Zpg
beaglescout007 0:3dac1f1bc9e0 962 CPX( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 963 break;
beaglescout007 0:3dac1f1bc9e0 964
beaglescout007 0:3dac1f1bc9e0 965 case 0xE5: // SBC Zpg
beaglescout007 0:3dac1f1bc9e0 966 SBC( A_ZP ); CLK( 3 );
beaglescout007 0:3dac1f1bc9e0 967 break;
beaglescout007 0:3dac1f1bc9e0 968
beaglescout007 0:3dac1f1bc9e0 969 case 0xE6: // INC Zpg
beaglescout007 0:3dac1f1bc9e0 970 INC( AA_ZP ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 971 break;
beaglescout007 0:3dac1f1bc9e0 972
beaglescout007 0:3dac1f1bc9e0 973 case 0xE8: // INX
beaglescout007 0:3dac1f1bc9e0 974 ++X; TEST( X ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 975 break;
beaglescout007 0:3dac1f1bc9e0 976
beaglescout007 0:3dac1f1bc9e0 977 case 0xE9: // SBC #Oper
beaglescout007 0:3dac1f1bc9e0 978 SBC( A_IMM ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 979 break;
beaglescout007 0:3dac1f1bc9e0 980
beaglescout007 0:3dac1f1bc9e0 981 case 0xEA: // NOP
beaglescout007 0:3dac1f1bc9e0 982 CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 983 break;
beaglescout007 0:3dac1f1bc9e0 984
beaglescout007 0:3dac1f1bc9e0 985 case 0xEC: // CPX Abs
beaglescout007 0:3dac1f1bc9e0 986 CPX( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 987 break;
beaglescout007 0:3dac1f1bc9e0 988
beaglescout007 0:3dac1f1bc9e0 989 case 0xED: // SBC Abs
beaglescout007 0:3dac1f1bc9e0 990 SBC( A_ABS ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 991 break;
beaglescout007 0:3dac1f1bc9e0 992
beaglescout007 0:3dac1f1bc9e0 993 case 0xEE: // INC Abs
beaglescout007 0:3dac1f1bc9e0 994 INC( AA_ABS ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 995 break;
beaglescout007 0:3dac1f1bc9e0 996
beaglescout007 0:3dac1f1bc9e0 997 case 0xF0: // BEQ
beaglescout007 0:3dac1f1bc9e0 998 BRA( F & FLAG_Z );
beaglescout007 0:3dac1f1bc9e0 999 break;
beaglescout007 0:3dac1f1bc9e0 1000
beaglescout007 0:3dac1f1bc9e0 1001 case 0xF1: // SBC (Zpg),Y
beaglescout007 0:3dac1f1bc9e0 1002 SBC( A_IY ); CLK( 5 );
beaglescout007 0:3dac1f1bc9e0 1003 break;
beaglescout007 0:3dac1f1bc9e0 1004
beaglescout007 0:3dac1f1bc9e0 1005 case 0xF5: // SBC Zpg,X
beaglescout007 0:3dac1f1bc9e0 1006 SBC( A_ZPX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 1007 break;
beaglescout007 0:3dac1f1bc9e0 1008
beaglescout007 0:3dac1f1bc9e0 1009 case 0xF6: // INC Zpg,X
beaglescout007 0:3dac1f1bc9e0 1010 INC( AA_ZPX ); CLK( 6 );
beaglescout007 0:3dac1f1bc9e0 1011 break;
beaglescout007 0:3dac1f1bc9e0 1012
beaglescout007 0:3dac1f1bc9e0 1013 case 0xF8: // SED
beaglescout007 0:3dac1f1bc9e0 1014 SETF( FLAG_D ); CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 1015 break;
beaglescout007 0:3dac1f1bc9e0 1016
beaglescout007 0:3dac1f1bc9e0 1017 case 0xF9: // SBC Abs,Y
beaglescout007 0:3dac1f1bc9e0 1018 SBC( A_ABSY ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 1019 break;
beaglescout007 0:3dac1f1bc9e0 1020
beaglescout007 0:3dac1f1bc9e0 1021 case 0xFD: // SBC Abs,X
beaglescout007 0:3dac1f1bc9e0 1022 SBC( A_ABSX ); CLK( 4 );
beaglescout007 0:3dac1f1bc9e0 1023 break;
beaglescout007 0:3dac1f1bc9e0 1024
beaglescout007 0:3dac1f1bc9e0 1025 case 0xFE: // INC Abs,X
beaglescout007 0:3dac1f1bc9e0 1026 INC( AA_ABSX ); CLK( 7 );
beaglescout007 0:3dac1f1bc9e0 1027 break;
beaglescout007 0:3dac1f1bc9e0 1028
beaglescout007 0:3dac1f1bc9e0 1029 default: // Unknown Instruction
beaglescout007 0:3dac1f1bc9e0 1030 CLK( 2 );
beaglescout007 0:3dac1f1bc9e0 1031 break;
beaglescout007 0:3dac1f1bc9e0 1032
beaglescout007 0:3dac1f1bc9e0 1033 } /* end of switch ( byCode ) */
beaglescout007 0:3dac1f1bc9e0 1034
beaglescout007 0:3dac1f1bc9e0 1035 } /* end of while ... */
beaglescout007 0:3dac1f1bc9e0 1036
beaglescout007 0:3dac1f1bc9e0 1037 // Correct the number of the clocks
beaglescout007 0:3dac1f1bc9e0 1038 g_wPassedClocks -= wClocks;
beaglescout007 0:3dac1f1bc9e0 1039 }
beaglescout007 0:3dac1f1bc9e0 1040
beaglescout007 0:3dac1f1bc9e0 1041 // Addressing Op.
beaglescout007 0:3dac1f1bc9e0 1042 // Data
beaglescout007 0:3dac1f1bc9e0 1043 // Absolute,X
beaglescout007 0:3dac1f1bc9e0 1044 static inline BYTE K6502_ReadAbsX(){ WORD wA0, wA1; wA0 = AA_ABS; wA1 = wA0 + X; CLK( ( wA0 & 0x0100 ) != ( wA1 & 0x0100 ) ); return K6502_Read( wA1 ); };
beaglescout007 0:3dac1f1bc9e0 1045 // Absolute,Y
beaglescout007 0:3dac1f1bc9e0 1046 static inline BYTE K6502_ReadAbsY(){ WORD wA0, wA1; wA0 = AA_ABS; wA1 = wA0 + Y; CLK( ( wA0 & 0x0100 ) != ( wA1 & 0x0100 ) ); return K6502_Read( wA1 ); };
beaglescout007 0:3dac1f1bc9e0 1047 // (Indirect),Y
beaglescout007 0:3dac1f1bc9e0 1048 static inline BYTE K6502_ReadIY(){ WORD wA0, wA1; wA0 = K6502_ReadZpW( K6502_Read( PC++ ) ); wA1 = wA0 + Y; CLK( ( wA0 & 0x0100 ) != ( wA1 & 0x0100 ) ); return K6502_Read( wA1 ); };
beaglescout007 0:3dac1f1bc9e0 1049
beaglescout007 0:3dac1f1bc9e0 1050 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 1051 /* */
beaglescout007 0:3dac1f1bc9e0 1052 /* 6502 Reading/Writing Operation */
beaglescout007 0:3dac1f1bc9e0 1053 /* */
beaglescout007 0:3dac1f1bc9e0 1054 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 1055 #include "K6502_rw.h"
beaglescout007 0:3dac1f1bc9e0 1056
beaglescout007 0:3dac1f1bc9e0 1057
beaglescout007 0:3dac1f1bc9e0 1058