I have ported my old project “pNesX” game console emulator to the nucleo.

Dependencies:   SDFileSystem mbed

Intro

I have ported my old project “pNesX” to the STM32 Nucleo. The pNesX is a NES emulator for the PlayStation that I have created 16 years ago!

Emulation part was almost without change, the sound part was newly added.

Parts

STM32 Nucleo F446RE
QVGA 2.2 TFT SPI (with the SD card slot)
Audio jack(TS or TRS)
USB Connector
Register 100k, 10k, 4.7k, 100
Capacitor 0.01uF, 2.2uF
Breadboard
Wires
Computer Speakers
USB GamePad

Wiring diagram

/media/uploads/beaglescout007/nucleo_ex06_emu.png

TFT J2Nucleo
VCC3V3
GNDGND
CSPB_5(D4)
ResetPA_10(D2) Pull Up(100k)
D/CPA_8(D7)
MOSIPA_7(D11)
SCKPA_5(D13)
LEDLED-100ohm-3V3
MISOPA_6(D12)
TFT J4Nucleo
SD_CSPA_9
SD_MOSIPB_15
SD_MISOPB_14
SD_SCKPB_13
AudioNucleo
TIPPA_4(A2)
USB con.Nucleo
GNDGND
+PA_12
-PA_11
5V5V

https://youtu.be/jL24IjT6LnI

Limitations

  • Since the rest of the RAM is about 50kbyte, maximum capacity of the game ROM is about 50kbyte.
  • The length of the file name up to 32 characters.
  • The number of files in the folder is up to 100.

Used Library

Committer:
beaglescout007
Date:
Sun Apr 03 07:45:29 2016 +0000
Revision:
0:3dac1f1bc9e0
Release

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