GrafX2 2.9.3227
The ultimate 256-color painting program
6502.c File Reference
#include <emulation/CPU/6502.h>
+ Include dependency graph for 6502.c:

Macros

#define CPU_6502_API   Z_API_EXPORT
 
#define READ_8(address)    object->read (object->context, (zuint16)(address))
 
#define WRITE_8(address, value)    object->write(object->context, (zuint16)(address), (zuint8)(value))
 
#define READ_16(address)   read_16bit (object, (zuint16)(address))
 
#define READ_POINTER(pointer_name)   READ_16(Z_6502_ADDRESS_##pointer_name##_POINTER)
 
#define PC   object->state.Z_6502_STATE_MEMBER_PC
 
#define S   object->state.Z_6502_STATE_MEMBER_S
 
#define P   object->state.Z_6502_STATE_MEMBER_P
 
#define A   object->state.Z_6502_STATE_MEMBER_A
 
#define X   object->state.Z_6502_STATE_MEMBER_X
 
#define Y   object->state.Z_6502_STATE_MEMBER_Y
 
#define NMI   object->state.Z_6502_STATE_MEMBER_NMI
 
#define IRQ   object->state.Z_6502_STATE_MEMBER_IRQ
 
#define CYCLES   object->cycles
 
#define OPCODE   object->opcode
 
#define EA   object->ea
 
#define EA_CYCLES   object->ea_cycles
 
#define NP   128
 
#define VP   64
 
#define BP   16
 
#define DP   8
 
#define IP   4
 
#define ZP   2
 
#define CP   1
 
#define NZP   (NP | ZP)
 
#define NZCP   (NP | ZP | CP)
 
#define ZP_ZERO(value)   (!(value) << 1)
 
#define SET_P_NZ(value)   P = (P & ~NZP) | ((value) ? ((value) & NP) : ZP)
 
#define PUSH_8(value)   WRITE_8(Z_6502_ADDRESS_STACK + S--, value);
 
#define POP_8   READ_8 (Z_6502_ADDRESS_STACK + ++S)
 
#define PUSH_16(value)   push_16bit(object, value)
 
#define POP_16   pop_16bit(object)
 
#define READ_BYTE_OPERAND   READ_8 ((PC += 2) - 1)
 
#define READ_WORD_OPERAND   READ_16((PC += 3) - 2)
 
#define ZERO_PAGE_ADDRESS   READ_BYTE_OPERAND
 
#define ZERO_PAGE_X_ADDRESS   (zuint8)(READ_BYTE_OPERAND + X)
 
#define ZERO_PAGE_Y_ADDRESS   (zuint8)(READ_BYTE_OPERAND + Y)
 
#define ABSOLUTE_ADDRESS   READ_WORD_OPERAND
 
#define ABSOLUTE_X_ADDRESS   READ_WORD_OPERAND + X
 
#define ABSOLUTE_Y_ADDRESS   READ_WORD_OPERAND + Y
 
#define INDIRECT_X_ADDRESS   READ_16((zuint8)(READ_BYTE_OPERAND + X))
 
#define INDIRECT_Y_ADDRESS   READ_16(READ_BYTE_OPERAND) + Y
 
#define EA_READER(name)   static zuint8 read_##name (M6502 *object)
 
#define EA_WRITER(name)   static void write_##name(M6502 *object, zuint8 value)
 
#define EA_INDEX   (OPCODE & 28) >> 2
 
#define READ_J   read_j_table [EA_INDEX](object)
 
#define READ_G   read_g_table [EA_INDEX](object)
 
#define READ_H   read_h_table [EA_INDEX](object)
 
#define READ_Q   read_q_table [EA_INDEX](object)
 
#define WRITE_K(value)   write_k_table[EA_INDEX](object, value)
 
#define WRITE_H(value)   write_h_table[EA_INDEX](object, value)
 
#define WRITE_Q(value)   write_q_table[EA_INDEX](object, value)
 
#define WRITE_G(value)   if (EA_CYCLES == 2) A = value; else WRITE_8(EA, value);
 
#define INSTRUCTION(name)   static zuint8 name(M6502 *object)
 
#define COMPARE(register, ea_table)
 
#define BRANCH(flag_mask, condition_logic)
 
#define BRANCH_IF_CLEAR(flag_mask)   BRANCH(flag_mask, !)
 
#define BRANCH_IF_SET( flag_mask)   BRANCH(flag_mask, Z_EMPTY)
 
#define INC_DEC(operation)
 

Typedefs

typedef zuint8(* Instruction) (M6502 *object)
 
typedef zuint8(* ReadEA) (M6502 *object)
 
typedef void(* WriteEA) (M6502 *object, zuint8 value)
 

Functions

static Z_INLINE zuint16 read_16bit (M6502 *object, zuint16 address)
 
static Z_INLINE void push_16bit (M6502 *object, zuint16 value)
 
static Z_INLINE zuint16 pop_16bit (M6502 *object)
 
 EA_READER (accumulator)
 
 EA_READER (immediate)
 
 EA_READER (zero_page)
 
 EA_READER (zero_page_x)
 
 EA_READER (zero_page_y)
 
 EA_READER (absolute)
 
 EA_READER (indirect_x)
 
 EA_READER (g_zero_page)
 
 EA_READER (g_zero_page_x)
 
 EA_READER (g_absolute)
 
 EA_READER (g_absolute_x)
 
 EA_READER (penalized_absolute_x)
 
 EA_READER (penalized_absolute_y)
 
 EA_READER (penalized_indirect_y)
 
 EA_WRITER (zero_page)
 
 EA_WRITER (zero_page_x)
 
 EA_WRITER (zero_page_y)
 
 EA_WRITER (absolute)
 
 EA_WRITER (absolute_x)
 
 EA_WRITER (absolute_y)
 
 EA_WRITER (indirect_x)
 
 EA_WRITER (indirect_y)
 
 INSTRUCTION (lda_J)
 
 INSTRUCTION (ldx_H)
 
 INSTRUCTION (ldy_Q)
 
 INSTRUCTION (sta_K)
 
 INSTRUCTION (stx_H)
 
 INSTRUCTION (sty_Q)
 
 INSTRUCTION (tax)
 
 INSTRUCTION (tay)
 
 INSTRUCTION (txa)
 
 INSTRUCTION (tya)
 
 INSTRUCTION (tsx)
 
 INSTRUCTION (txs)
 
 INSTRUCTION (pha)
 
 INSTRUCTION (php)
 
 INSTRUCTION (pla)
 
 INSTRUCTION (plp)
 
 INSTRUCTION (and_J)
 
 INSTRUCTION (eor_J)
 
 INSTRUCTION (ora_J)
 
 INSTRUCTION (bit_Q)
 
 INSTRUCTION (cmp_J)
 
 INSTRUCTION (cpx_Q)
 
 INSTRUCTION (cpy_Q)
 
 INSTRUCTION (adc_J)
 
 INSTRUCTION (sbc_J)
 
 INSTRUCTION (inc_G)
 
 INSTRUCTION (inx)
 
 INSTRUCTION (iny)
 
 INSTRUCTION (dec_G)
 
 INSTRUCTION (dex)
 
 INSTRUCTION (dey)
 
 INSTRUCTION (asl_G)
 
 INSTRUCTION (lsr_G)
 
 INSTRUCTION (rol_G)
 
 INSTRUCTION (ror_G)
 
 INSTRUCTION (jmp_WORD)
 
 INSTRUCTION (jmp_vWORD)
 
 INSTRUCTION (jsr_WORD)
 
 INSTRUCTION (rts)
 
 INSTRUCTION (bcc_OFFSET)
 
 INSTRUCTION (bcs_OFFSET)
 
 INSTRUCTION (beq_OFFSET)
 
 INSTRUCTION (bmi_OFFSET)
 
 INSTRUCTION (bne_OFFSET)
 
 INSTRUCTION (bpl_OFFSET)
 
 INSTRUCTION (bvc_OFFSET)
 
 INSTRUCTION (bvs_OFFSET)
 
 INSTRUCTION (clc)
 
 INSTRUCTION (cld)
 
 INSTRUCTION (cli)
 
 INSTRUCTION (clv)
 
 INSTRUCTION (sec)
 
 INSTRUCTION (sed)
 
 INSTRUCTION (sei)
 
 INSTRUCTION (nop)
 
 INSTRUCTION (rti)
 
 INSTRUCTION (brk)
 
 INSTRUCTION (illegal)
 
CPU_6502_API void m6502_power (M6502 *object, zboolean state)
 Changes the CPU power status. More...
 
CPU_6502_API void m6502_reset (M6502 *object)
 Resets the CPU. More...
 
CPU_6502_API zusize m6502_run (M6502 *object, zusize cycles)
 Runs the CPU for a given number of cycles. More...
 
CPU_6502_API void m6502_nmi (M6502 *object)
 Performs a non-maskable interrupt (NMI). More...
 
CPU_6502_API void m6502_irq (M6502 *object, zboolean state)
 Changes the state of the maskable interrupt (IRQ). More...
 

Variables

static ReadEA const read_j_table [8]
 
static WriteEA const write_k_table [8]
 
static ReadEA const read_g_table [8]
 
static ReadEA const read_h_table [8]
 
static WriteEA const write_h_table [8]
 
static ReadEA const read_q_table [8]
 
static WriteEA const write_q_table [6]
 
static Instruction const instruction_table [256]
 

Macro Definition Documentation

◆ CPU_6502_API

#define CPU_6502_API   Z_API_EXPORT

◆ READ_8

#define READ_8 (   address)     object->read (object->context, (zuint16)(address))

◆ WRITE_8

#define WRITE_8 (   address,
  value 
)     object->write(object->context, (zuint16)(address), (zuint8)(value))

◆ READ_16

#define READ_16 (   address)    read_16bit (object, (zuint16)(address))

◆ READ_POINTER

#define READ_POINTER (   pointer_name)    READ_16(Z_6502_ADDRESS_##pointer_name##_POINTER)

◆ PC

#define PC   object->state.Z_6502_STATE_MEMBER_PC

◆ S

#define S   object->state.Z_6502_STATE_MEMBER_S

◆ P

#define P   object->state.Z_6502_STATE_MEMBER_P

◆ A

#define A   object->state.Z_6502_STATE_MEMBER_A

◆ X

#define X   object->state.Z_6502_STATE_MEMBER_X

◆ Y

#define Y   object->state.Z_6502_STATE_MEMBER_Y

◆ NMI

#define NMI   object->state.Z_6502_STATE_MEMBER_NMI

◆ IRQ

#define IRQ   object->state.Z_6502_STATE_MEMBER_IRQ

◆ CYCLES

#define CYCLES   object->cycles

◆ OPCODE

#define OPCODE   object->opcode

◆ EA

#define EA   object->ea

◆ EA_CYCLES

#define EA_CYCLES   object->ea_cycles

◆ NP

#define NP   128

◆ VP

#define VP   64

◆ BP

#define BP   16

◆ DP

#define DP   8

◆ IP

#define IP   4

◆ ZP

#define ZP   2

◆ CP

#define CP   1

◆ NZP

#define NZP   (NP | ZP)

◆ NZCP

#define NZCP   (NP | ZP | CP)

◆ ZP_ZERO

#define ZP_ZERO (   value)    (!(value) << 1)

◆ SET_P_NZ

#define SET_P_NZ (   value)    P = (P & ~NZP) | ((value) ? ((value) & NP) : ZP)

◆ PUSH_8

#define PUSH_8 (   value)    WRITE_8(Z_6502_ADDRESS_STACK + S--, value);

◆ POP_8

#define POP_8   READ_8 (Z_6502_ADDRESS_STACK + ++S)

◆ PUSH_16

#define PUSH_16 (   value)    push_16bit(object, value)

◆ POP_16

#define POP_16   pop_16bit(object)

◆ READ_BYTE_OPERAND

#define READ_BYTE_OPERAND   READ_8 ((PC += 2) - 1)

◆ READ_WORD_OPERAND

#define READ_WORD_OPERAND   READ_16((PC += 3) - 2)

◆ ZERO_PAGE_ADDRESS

#define ZERO_PAGE_ADDRESS   READ_BYTE_OPERAND

◆ ZERO_PAGE_X_ADDRESS

#define ZERO_PAGE_X_ADDRESS   (zuint8)(READ_BYTE_OPERAND + X)

◆ ZERO_PAGE_Y_ADDRESS

#define ZERO_PAGE_Y_ADDRESS   (zuint8)(READ_BYTE_OPERAND + Y)

◆ ABSOLUTE_ADDRESS

#define ABSOLUTE_ADDRESS   READ_WORD_OPERAND

◆ ABSOLUTE_X_ADDRESS

#define ABSOLUTE_X_ADDRESS   READ_WORD_OPERAND + X

◆ ABSOLUTE_Y_ADDRESS

#define ABSOLUTE_Y_ADDRESS   READ_WORD_OPERAND + Y

◆ INDIRECT_X_ADDRESS

#define INDIRECT_X_ADDRESS   READ_16((zuint8)(READ_BYTE_OPERAND + X))

◆ INDIRECT_Y_ADDRESS

#define INDIRECT_Y_ADDRESS   READ_16(READ_BYTE_OPERAND) + Y

◆ EA_READER

#define EA_READER (   name)    static zuint8 read_##name (M6502 *object)

◆ EA_WRITER

#define EA_WRITER (   name)    static void write_##name(M6502 *object, zuint8 value)

◆ EA_INDEX

#define EA_INDEX   (OPCODE & 28) >> 2

◆ READ_J

#define READ_J   read_j_table [EA_INDEX](object)

◆ READ_G

#define READ_G   read_g_table [EA_INDEX](object)

◆ READ_H

#define READ_H   read_h_table [EA_INDEX](object)

◆ READ_Q

#define READ_Q   read_q_table [EA_INDEX](object)

◆ WRITE_K

#define WRITE_K (   value)    write_k_table[EA_INDEX](object, value)

◆ WRITE_H

#define WRITE_H (   value)    write_h_table[EA_INDEX](object, value)

◆ WRITE_Q

#define WRITE_Q (   value)    write_q_table[EA_INDEX](object, value)

◆ WRITE_G

#define WRITE_G (   value)    if (EA_CYCLES == 2) A = value; else WRITE_8(EA, value);

◆ INSTRUCTION

#define INSTRUCTION (   name)    static zuint8 name(M6502 *object)

◆ COMPARE

#define COMPARE (   register,
  ea_table 
)
Value:
zuint8 v = READ_##ea_table; \
zuint8 result = register - v; \
\
P = (zuint8) \
((P & ~NZCP) /* VP, XP, BP, DP, IP unchanged */ \
| (result & NP) /* NP = result.7 */ \
| ZP_ZERO(result) /* ZP = 1 if result = 0, else ZP = 0 */ \
| !!(register >= v)); /* CP = 1 if register >= v, else CP = 0 */ \
\
return EA_CYCLES;
#define ZP_ZERO(value)
Definition: 6502.c:111
#define NZCP
Definition: 6502.c:109
#define P
Definition: 6502.c:78
#define NP
Definition: 6502.c:100
#define EA_CYCLES
Definition: 6502.c:95
uint8_t zuint8
Definition: 6502types.h:11

◆ BRANCH

#define BRANCH (   flag_mask,
  condition_logic 
)
Value:
zuint8 cycles = 2; \
\
if (condition_logic(P & flag_mask)) \
{ \
zuint16 pc = PC + 2; \
zsint8 offset = (zsint8)READ_8(PC + 1); \
zuint16 t = (zuint16)(pc + offset); \
\
if (t >> 8 == pc >> 8) cycles++; \
else cycles += 2; \
PC = t; \
} \
\
else PC += 2; \
\
return cycles;
#define PC
Definition: 6502.c:76
#define READ_8(address)
Definition: 6502.c:59
int8_t zsint8
Definition: 6502types.h:15
uint16_t zuint16
Definition: 6502types.h:12

◆ BRANCH_IF_CLEAR

#define BRANCH_IF_CLEAR (   flag_mask)    BRANCH(flag_mask, !)

◆ BRANCH_IF_SET

#define BRANCH_IF_SET (   flag_mask)    BRANCH(flag_mask, Z_EMPTY)

◆ INC_DEC

#define INC_DEC (   operation)
Value:
zuint8 t = READ_G operation 1; \
WRITE_G(t); \
SET_P_NZ(t); \
return EA_CYCLES;
#define READ_G
Definition: 6502.c:367
#define WRITE_G(value)
Definition: 6502.c:373

Typedef Documentation

◆ Instruction

typedef zuint8(* Instruction) (M6502 *object)

◆ ReadEA

typedef zuint8(* ReadEA) (M6502 *object)

◆ WriteEA

typedef void(* WriteEA) (M6502 *object, zuint8 value)

Function Documentation

◆ read_16bit()

static Z_INLINE zuint16 read_16bit ( M6502 object,
zuint16  address 
)
static

References READ_8.

◆ push_16bit()

static Z_INLINE void push_16bit ( M6502 object,
zuint16  value 
)
static

References S, WRITE_8, and Z_6502_ADDRESS_STACK.

◆ pop_16bit()

static Z_INLINE zuint16 pop_16bit ( M6502 object)
static

References READ_8, S, and Z_6502_ADDRESS_STACK.

◆ EA_READER() [1/14]

EA_READER ( accumulator  )

References A, EA_CYCLES, and PC.

◆ EA_READER() [2/14]

EA_READER ( immediate  )

References EA_CYCLES, and READ_BYTE_OPERAND.

◆ EA_READER() [3/14]

EA_READER ( zero_page  )

References EA_CYCLES, READ_8, and ZERO_PAGE_ADDRESS.

◆ EA_READER() [4/14]

EA_READER ( zero_page_x  )

◆ EA_READER() [5/14]

EA_READER ( zero_page_y  )

◆ EA_READER() [6/14]

EA_READER ( absolute  )

References ABSOLUTE_ADDRESS, EA_CYCLES, and READ_8.

◆ EA_READER() [7/14]

EA_READER ( indirect_x  )

References EA_CYCLES, INDIRECT_X_ADDRESS, and READ_8.

◆ EA_READER() [8/14]

EA_READER ( g_zero_page  )

References EA, EA_CYCLES, READ_8, and ZERO_PAGE_ADDRESS.

◆ EA_READER() [9/14]

EA_READER ( g_zero_page_x  )

References EA, EA_CYCLES, READ_8, and ZERO_PAGE_X_ADDRESS.

◆ EA_READER() [10/14]

EA_READER ( g_absolute  )

References ABSOLUTE_ADDRESS, EA, EA_CYCLES, and READ_8.

◆ EA_READER() [11/14]

EA_READER ( g_absolute_x  )

References ABSOLUTE_X_ADDRESS, EA, EA_CYCLES, and READ_8.

◆ EA_READER() [12/14]

EA_READER ( penalized_absolute_x  )

References EA_CYCLES, READ_8, READ_WORD_OPERAND, and X.

◆ EA_READER() [13/14]

EA_READER ( penalized_absolute_y  )

References EA_CYCLES, READ_8, READ_WORD_OPERAND, and Y.

◆ EA_READER() [14/14]

EA_READER ( penalized_indirect_y  )

◆ EA_WRITER() [1/8]

EA_WRITER ( zero_page  )

References EA_CYCLES, WRITE_8, and ZERO_PAGE_ADDRESS.

◆ EA_WRITER() [2/8]

EA_WRITER ( zero_page_x  )

◆ EA_WRITER() [3/8]

EA_WRITER ( zero_page_y  )

◆ EA_WRITER() [4/8]

EA_WRITER ( absolute  )

References ABSOLUTE_ADDRESS, EA_CYCLES, and WRITE_8.

◆ EA_WRITER() [5/8]

EA_WRITER ( absolute_x  )

◆ EA_WRITER() [6/8]

EA_WRITER ( absolute_y  )

◆ EA_WRITER() [7/8]

EA_WRITER ( indirect_x  )

◆ EA_WRITER() [8/8]

EA_WRITER ( indirect_y  )

◆ INSTRUCTION() [1/58]

INSTRUCTION ( lda_J  )

References A, EA_CYCLES, READ_J, and SET_P_NZ.

◆ INSTRUCTION() [2/58]

INSTRUCTION ( ldx_H  )

References EA_CYCLES, READ_H, SET_P_NZ, and X.

◆ INSTRUCTION() [3/58]

INSTRUCTION ( ldy_Q  )

References EA_CYCLES, READ_Q, SET_P_NZ, and Y.

◆ INSTRUCTION() [4/58]

INSTRUCTION ( sta_K  )

References A, EA_CYCLES, and WRITE_K.

◆ INSTRUCTION() [5/58]

INSTRUCTION ( stx_H  )

References EA_CYCLES, WRITE_H, and X.

◆ INSTRUCTION() [6/58]

INSTRUCTION ( sty_Q  )

References EA_CYCLES, WRITE_Q, and Y.

◆ INSTRUCTION() [7/58]

INSTRUCTION ( tax  )

References A, PC, SET_P_NZ, and X.

◆ INSTRUCTION() [8/58]

INSTRUCTION ( tay  )

References A, PC, SET_P_NZ, and Y.

◆ INSTRUCTION() [9/58]

INSTRUCTION ( txa  )

References A, PC, SET_P_NZ, and X.

◆ INSTRUCTION() [10/58]

INSTRUCTION ( tya  )

References A, PC, SET_P_NZ, and Y.

◆ INSTRUCTION() [11/58]

INSTRUCTION ( tsx  )

References PC, S, SET_P_NZ, and X.

◆ INSTRUCTION() [12/58]

INSTRUCTION ( txs  )

References PC, S, and X.

◆ INSTRUCTION() [13/58]

INSTRUCTION ( pha  )

References A, PC, and PUSH_8.

◆ INSTRUCTION() [14/58]

INSTRUCTION ( php  )

References P, PC, and PUSH_8.

◆ INSTRUCTION() [15/58]

INSTRUCTION ( pla  )

References A, PC, POP_8, and SET_P_NZ.

◆ INSTRUCTION() [16/58]

INSTRUCTION ( plp  )

References P, PC, and POP_8.

◆ INSTRUCTION() [17/58]

INSTRUCTION ( and_J  )

References A, EA_CYCLES, READ_J, and SET_P_NZ.

◆ INSTRUCTION() [18/58]

INSTRUCTION ( eor_J  )

References A, EA_CYCLES, READ_J, and SET_P_NZ.

◆ INSTRUCTION() [19/58]

INSTRUCTION ( ora_J  )

References A, EA_CYCLES, READ_J, and SET_P_NZ.

◆ INSTRUCTION() [20/58]

INSTRUCTION ( bit_Q  )

References A, EA_CYCLES, NP, P, READ_Q, VP, and ZP.

◆ INSTRUCTION() [21/58]

INSTRUCTION ( cmp_J  )

References A, and COMPARE.

◆ INSTRUCTION() [22/58]

INSTRUCTION ( cpx_Q  )

References COMPARE, and X.

◆ INSTRUCTION() [23/58]

INSTRUCTION ( cpy_Q  )

References COMPARE, and Y.

◆ INSTRUCTION() [24/58]

INSTRUCTION ( adc_J  )

References A, CP, DP, EA_CYCLES, NP, P, READ_J, SET_P_NZ, VP, and ZP.

◆ INSTRUCTION() [25/58]

INSTRUCTION ( sbc_J  )

References A, CP, DP, EA_CYCLES, NP, P, READ_J, SET_P_NZ, VP, and ZP.

◆ INSTRUCTION() [26/58]

INSTRUCTION ( inc_G  )

References INC_DEC.

◆ INSTRUCTION() [27/58]

INSTRUCTION ( inx  )

References PC, SET_P_NZ, and X.

◆ INSTRUCTION() [28/58]

INSTRUCTION ( iny  )

References PC, SET_P_NZ, and Y.

◆ INSTRUCTION() [29/58]

INSTRUCTION ( dec_G  )

References INC_DEC.

◆ INSTRUCTION() [30/58]

INSTRUCTION ( dex  )

References PC, SET_P_NZ, and X.

◆ INSTRUCTION() [31/58]

INSTRUCTION ( dey  )

References PC, SET_P_NZ, and Y.

◆ INSTRUCTION() [32/58]

INSTRUCTION ( asl_G  )

References EA_CYCLES, NP, NZCP, P, READ_G, WRITE_G, and ZP_ZERO.

◆ INSTRUCTION() [33/58]

INSTRUCTION ( lsr_G  )

References CP, EA_CYCLES, NZCP, P, READ_G, WRITE_G, and ZP_ZERO.

◆ INSTRUCTION() [34/58]

INSTRUCTION ( rol_G  )

References CP, EA_CYCLES, NP, NZCP, P, READ_G, WRITE_G, and ZP_ZERO.

◆ INSTRUCTION() [35/58]

INSTRUCTION ( ror_G  )

References CP, EA_CYCLES, NP, NZCP, P, READ_G, WRITE_G, and ZP_ZERO.

◆ INSTRUCTION() [36/58]

INSTRUCTION ( jmp_WORD  )

References PC, and READ_16.

◆ INSTRUCTION() [37/58]

INSTRUCTION ( jmp_vWORD  )

References PC, and READ_16.

◆ INSTRUCTION() [38/58]

INSTRUCTION ( jsr_WORD  )

References PC, PUSH_16, and READ_16.

◆ INSTRUCTION() [39/58]

INSTRUCTION ( rts  )

References PC, and POP_16.

◆ INSTRUCTION() [40/58]

INSTRUCTION ( bcc_OFFSET  )

References BRANCH_IF_CLEAR, and CP.

◆ INSTRUCTION() [41/58]

INSTRUCTION ( bcs_OFFSET  )

References BRANCH_IF_SET, and CP.

◆ INSTRUCTION() [42/58]

INSTRUCTION ( beq_OFFSET  )

References BRANCH_IF_SET, and ZP.

◆ INSTRUCTION() [43/58]

INSTRUCTION ( bmi_OFFSET  )

References BRANCH_IF_SET, and NP.

◆ INSTRUCTION() [44/58]

INSTRUCTION ( bne_OFFSET  )

References BRANCH_IF_CLEAR, and ZP.

◆ INSTRUCTION() [45/58]

INSTRUCTION ( bpl_OFFSET  )

References BRANCH_IF_CLEAR, and NP.

◆ INSTRUCTION() [46/58]

INSTRUCTION ( bvc_OFFSET  )

References BRANCH_IF_CLEAR, and VP.

◆ INSTRUCTION() [47/58]

INSTRUCTION ( bvs_OFFSET  )

References BRANCH_IF_SET, and VP.

◆ INSTRUCTION() [48/58]

INSTRUCTION ( clc  )

References P, and PC.

◆ INSTRUCTION() [49/58]

INSTRUCTION ( cld  )

References P, and PC.

◆ INSTRUCTION() [50/58]

INSTRUCTION ( cli  )

References P, and PC.

◆ INSTRUCTION() [51/58]

INSTRUCTION ( clv  )

References P, and PC.

◆ INSTRUCTION() [52/58]

INSTRUCTION ( sec  )

References CP, P, and PC.

◆ INSTRUCTION() [53/58]

INSTRUCTION ( sed  )

References DP, P, and PC.

◆ INSTRUCTION() [54/58]

INSTRUCTION ( sei  )

References IP, P, and PC.

◆ INSTRUCTION() [55/58]

INSTRUCTION ( nop  )

References PC.

◆ INSTRUCTION() [56/58]

INSTRUCTION ( rti  )

References P, PC, POP_16, and POP_8.

◆ INSTRUCTION() [57/58]

INSTRUCTION ( brk  )

References BP, IP, P, PC, PUSH_16, PUSH_8, READ_8, and READ_POINTER.

◆ INSTRUCTION() [58/58]

INSTRUCTION ( illegal  )

◆ m6502_power()

CPU_6502_API void m6502_power ( M6502 object,
zboolean  state 
)

Changes the CPU power status.

Parameters
objectA pointer to a 6502 emulator instance.
stateTRUE = power ON; FALSE = power OFF.

References A, FALSE, IRQ, NMI, P, PC, S, X, Y, Z_6502_VALUE_AFTER_POWER_ON_A, Z_6502_VALUE_AFTER_POWER_ON_P, Z_6502_VALUE_AFTER_POWER_ON_PC, Z_6502_VALUE_AFTER_POWER_ON_S, Z_6502_VALUE_AFTER_POWER_ON_X, and Z_6502_VALUE_AFTER_POWER_ON_Y.

Referenced by C64_LoadPrg().

◆ m6502_reset()

CPU_6502_API void m6502_reset ( M6502 object)

Resets the CPU.

This is equivalent to a pulse on the RESET line of a real 6502.

Parameters
objectA pointer to a 6502 emulator instance.

References FALSE, IRQ, NMI, P, PC, READ_POINTER, S, Z_6502_VALUE_AFTER_POWER_ON_P, and Z_6502_VALUE_AFTER_POWER_ON_S.

◆ m6502_run()

CPU_6502_API zusize m6502_run ( M6502 object,
zusize  cycles 
)

Runs the CPU for a given number of cycles.

Parameters
objectA pointer to a 6502 emulator instance.
cyclesThe number of cycles to be executed.
Returns
The number of cycles executed.
Note
Given the fact that one 6502 instruction needs between 2 and 7 cycles to be executed, it's not always possible to run the CPU the exact number of cycles specfified.

References CYCLES, FALSE, instruction_table, IP, IRQ, NMI, OPCODE, P, PC, PUSH_16, PUSH_8, READ_8, and READ_POINTER.

Referenced by C64_LoadPrg().

◆ m6502_nmi()

CPU_6502_API void m6502_nmi ( M6502 object)

Performs a non-maskable interrupt (NMI).

This is equivalent to a pulse on the NMI line of a real 6502.

Parameters
objectA pointer to a 6502 emulator instance.

References NMI, and TRUE.

◆ m6502_irq()

CPU_6502_API void m6502_irq ( M6502 object,
zboolean  state 
)

Changes the state of the maskable interrupt (IRQ).

This is equivalent to a change on the IRQ line of a real 6502.

Parameters
objectA pointer to a 6502 emulator instance.
stateTRUE = line high; FALSE = line low.

References IRQ.

Referenced by C64_LoadPrg(), and C64_mem_write().

Variable Documentation

◆ read_j_table

ReadEA const read_j_table[8]
static
Initial value:
= {
read_indirect_x,
read_zero_page,
read_immediate,
read_absolute,
read_penalized_indirect_y,
read_zero_page_x,
read_penalized_absolute_y,
read_penalized_absolute_x
}

◆ write_k_table

WriteEA const write_k_table[8]
static
Initial value:
= {
write_indirect_x,
write_zero_page,
write_absolute,
write_indirect_y,
write_zero_page_x,
write_absolute_y,
write_absolute_x
}
#define NULL
Definition: 6502types.h:18

◆ read_g_table

ReadEA const read_g_table[8]
static
Initial value:
= {
read_g_zero_page,
read_accumulator,
read_g_absolute,
read_g_zero_page_x,
read_g_absolute_x
}

◆ read_h_table

ReadEA const read_h_table[8]
static
Initial value:
= {
read_immediate,
read_zero_page,
read_absolute,
read_zero_page_y,
read_penalized_absolute_y
}

◆ write_h_table

WriteEA const write_h_table[8]
static
Initial value:
= {
write_zero_page,
write_absolute,
write_zero_page_y
}

◆ read_q_table

ReadEA const read_q_table[8]
static
Initial value:
= {
read_immediate,
read_zero_page,
read_absolute,
read_zero_page_x,
read_penalized_absolute_x
}

◆ write_q_table

WriteEA const write_q_table[6]
static
Initial value:
= {
write_zero_page,
write_absolute,
write_zero_page_x
}

◆ instruction_table

Instruction const instruction_table[256]
static
Initial value:
= {
brk, ora_J, illegal, illegal, illegal, ora_J, asl_G, illegal, php, ora_J, asl_G, illegal, illegal, ora_J, asl_G, illegal,
bpl_OFFSET, ora_J, illegal, illegal, illegal, ora_J, asl_G, illegal, clc, ora_J, illegal, illegal, illegal, ora_J, asl_G, illegal,
jsr_WORD, and_J, illegal, illegal, bit_Q, and_J, rol_G, illegal, plp, and_J, rol_G, illegal, bit_Q, and_J, rol_G, illegal,
bmi_OFFSET, and_J, illegal, illegal, illegal, and_J, rol_G, illegal, sec, and_J, illegal, illegal, illegal, and_J, rol_G, illegal,
rti, eor_J, illegal, illegal, illegal, eor_J, lsr_G, illegal, pha, eor_J, lsr_G, illegal, jmp_WORD, eor_J, lsr_G, illegal,
bvc_OFFSET, eor_J, illegal, illegal, illegal, eor_J, lsr_G, illegal, cli, eor_J, illegal, illegal, illegal, eor_J, lsr_G, illegal,
rts, adc_J, illegal, illegal, illegal, adc_J, ror_G, illegal, pla, adc_J, ror_G, illegal, jmp_vWORD, adc_J, ror_G, illegal,
bvs_OFFSET, adc_J, illegal, illegal, illegal, adc_J, ror_G, illegal, sei, adc_J, illegal, illegal, illegal, adc_J, ror_G, illegal,
illegal, sta_K, illegal, illegal, sty_Q, sta_K, stx_H, illegal, dey, illegal, txa, illegal, sty_Q, sta_K, stx_H, illegal,
bcc_OFFSET, sta_K, illegal, illegal, sty_Q, sta_K, stx_H, illegal, tya, sta_K, txs, illegal, illegal, sta_K, illegal, illegal,
ldy_Q, lda_J, ldx_H, illegal, ldy_Q, lda_J, ldx_H, illegal, tay, lda_J, tax, illegal, ldy_Q, lda_J, ldx_H, illegal,
bcs_OFFSET, lda_J, illegal, illegal, ldy_Q, lda_J, ldx_H, illegal, clv, lda_J, tsx, illegal, ldy_Q, lda_J, ldx_H, illegal,
cpy_Q, cmp_J, illegal, illegal, cpy_Q, cmp_J, dec_G, illegal, iny, cmp_J, dex, illegal, cpy_Q, cmp_J, dec_G, illegal,
bne_OFFSET, cmp_J, illegal, illegal, illegal, cmp_J, dec_G, illegal, cld, cmp_J, illegal, illegal, illegal, cmp_J, dec_G, illegal,
cpx_Q, sbc_J, illegal, illegal, cpx_Q, sbc_J, inc_G, illegal, inx, sbc_J, nop, illegal, cpx_Q, sbc_J, inc_G, illegal,
beq_OFFSET, sbc_J, illegal, illegal, illegal, sbc_J, inc_G, illegal, sed, sbc_J, illegal, illegal, illegal, sbc_J, inc_G, illegal
}

Referenced by m6502_run().