#include <mos6510.h>
Inherited by c64cpu.
Classes | |
struct | ProcessorCycle |
Public Member Functions | |
virtual uint8_t | cpuRead (uint_least16_t addr)=0 |
virtual void | cpuWrite (uint_least16_t addr, uint8_t data)=0 |
virtual void | reset () |
const char * | credits () const |
void | debug (bool enable, FILE *out) |
void | setRDY (bool newRDY) |
void | triggerRST () |
void | triggerNMI () |
void | triggerIRQ () |
void | clearIRQ () |
Static Public Attributes | |
static const int | SR_INTERRUPT = 2 |
Protected Member Functions | |
MOS6510 (EventContext *context) | |
void | eventWithoutSteals () |
void | eventWithSteals () |
void | Initialise () |
void | setFlagsNZ (uint8_t value) |
uint8_t | getStatusRegister () |
void | setStatusRegister (uint8_t sr) |
void | IRQLoRequest () |
void | IRQHiRequest () |
void | interruptsAndNextOpcode () |
void | calculateInterruptTriggerCycle () |
void | fetchNextOpcode () |
void | throwAwayFetch () |
void | throwAwayRead () |
void | FetchDataByte () |
void | FetchLowAddr () |
void | FetchLowAddrX () |
void | FetchLowAddrY () |
void | FetchHighAddr () |
void | FetchHighAddrX () |
void | FetchHighAddrX2 () |
void | FetchHighAddrY () |
void | FetchHighAddrY2 () |
void | FetchLowEffAddr () |
void | FetchHighEffAddr () |
void | FetchHighEffAddrY () |
void | FetchHighEffAddrY2 () |
void | FetchLowPointer () |
void | FetchLowPointerX () |
void | FetchHighPointer () |
void | FetchEffAddrDataByte () |
void | PutEffAddrDataByte () |
void | PushLowPC () |
void | PushHighPC () |
void | PushSR () |
void | PopLowPC () |
void | PopHighPC () |
void | PopSR () |
void | brkPushLowPC () |
void | WasteCycle () |
void | adc_instr () |
void | alr_instr () |
void | anc_instr () |
void | and_instr () |
void | ane_instr () |
void | arr_instr () |
void | asl_instr () |
void | asla_instr () |
void | aso_instr () |
void | axa_instr () |
void | axs_instr () |
void | bcc_instr () |
void | bcs_instr () |
void | beq_instr () |
void | bit_instr () |
void | bmi_instr () |
void | bne_instr () |
void | branch_instr (bool condition) |
void | bpl_instr () |
void | brk_instr () |
void | bvc_instr () |
void | bvs_instr () |
void | clc_instr () |
void | cld_instr () |
void | cli_instr () |
void | clv_instr () |
void | cmp_instr () |
void | cpx_instr () |
void | cpy_instr () |
void | dcm_instr () |
void | dec_instr () |
void | dex_instr () |
void | dey_instr () |
void | eor_instr () |
void | inc_instr () |
void | ins_instr () |
void | inx_instr () |
void | iny_instr () |
void | jmp_instr () |
void | las_instr () |
void | lax_instr () |
void | lda_instr () |
void | ldx_instr () |
void | ldy_instr () |
void | lse_instr () |
void | lsr_instr () |
void | lsra_instr () |
void | oal_instr () |
void | ora_instr () |
void | pha_instr () |
void | pla_instr () |
void | plp_instr () |
void | rla_instr () |
void | rol_instr () |
void | rola_instr () |
void | ror_instr () |
void | rora_instr () |
void | rra_instr () |
void | rti_instr () |
void | rts_instr () |
void | sbx_instr () |
void | say_instr () |
void | sbc_instr () |
void | sec_instr () |
void | sed_instr () |
void | sei_instr () |
void | shs_instr () |
void | sta_instr () |
void | stx_instr () |
void | sty_instr () |
void | tax_instr () |
void | tay_instr () |
void | tsx_instr () |
void | txa_instr () |
void | txs_instr () |
void | tya_instr () |
void | xas_instr () |
void | illegal_instr () |
void | doADC () |
void | doSBC () |
void | doJSR () |
Protected Attributes | |
EventContext & | eventContext |
int | cycleCount |
int | interruptCycle |
bool | irqAssertedOnPin |
bool | nmiFlag |
bool | rstFlag |
bool | rdy |
bool | flagN |
bool | flagC |
bool | flagD |
bool | flagZ |
bool | flagV |
bool | flagI |
bool | flagB |
uint_least16_t | Register_ProgramCounter |
uint_least16_t | Cycle_EffectiveAddress |
uint_least16_t | Cycle_HighByteWrongEffectiveAddress |
uint_least16_t | Cycle_Pointer |
uint8_t | Cycle_Data |
uint8_t | Register_StackPointer |
uint8_t | Register_Accumulator |
uint8_t | Register_X |
uint8_t | Register_Y |
struct ProcessorCycle | instrTable [0x101<< 3] |
EventCallback< MOS6510 > | m_nosteal |
EventCallback< MOS6510 > | m_steal |
Friends | |
class | MOS6510Debug |
Code is based on work by Simon A. White <sidplay2@yahoo.com>. Original Java port by Ken Händel. Later on, it has been hacked to improve compatibility with Lorenz suite on VICE's test suite.
MOS6510::MOS6510 | ( | EventContext * | context | ) | [protected] |
void MOS6510::calculateInterruptTriggerCycle | ( | ) | [inline, protected] |
Evaluate when to execute an interrupt. Calling this method can also result in the decision that no interrupt at all needs to be scheduled.
void MOS6510::clearIRQ | ( | ) |
Inform CPU that IRQ is no longer pulled low.
virtual uint8_t MOS6510::cpuRead | ( | uint_least16_t | addr | ) | [pure virtual] |
Get data from system environment
address |
virtual void MOS6510::cpuWrite | ( | uint_least16_t | addr, | |
uint8_t | data | |||
) | [pure virtual] |
Write data to system environment
address | ||
data |
void MOS6510::doADC | ( | ) | [inline, protected] |
BCD adding
void MOS6510::doSBC | ( | ) | [inline, protected] |
BCD subtracting
void MOS6510::eventWithoutSteals | ( | ) | [protected] |
When AEC signal is high, no stealing is possible
void MOS6510::eventWithSteals | ( | ) | [protected] |
When AEC signal is low, steals permitted
void MOS6510::FetchDataByte | ( | ) | [inline, protected] |
Fetch value, increment PC
Addressing Modes:
void MOS6510::FetchHighAddr | ( | ) | [inline, protected] |
Fetch high address byte, increment PC (Absolute Addressing)
Low byte must have been obtained first!
Addressing Modes:
void MOS6510::FetchHighAddrX | ( | ) | [inline, protected] |
Fetch high byte of address, add index register X to low address byte,
increment PC
Addressing Modes:
void MOS6510::FetchHighAddrY | ( | ) | [inline, protected] |
Fetch high byte of address, add index register Y to low address byte,
increment PC
Addressing Modes:
void MOS6510::FetchHighEffAddr | ( | ) | [inline, protected] |
Fetch effective address high
Addressing Modes:
void MOS6510::FetchHighEffAddrY | ( | ) | [inline, protected] |
Fetch effective address high, add Y to low byte of effective address
Addressing Modes:
void MOS6510::FetchHighPointer | ( | ) | [inline, protected] |
Fetch pointer address high, increment PC
Addressing Modes:
void MOS6510::FetchLowAddr | ( | ) | [inline, protected] |
Fetch low address byte, increment PC
Addressing Modes:
void MOS6510::FetchLowAddrX | ( | ) | [inline, protected] |
Read from address, add index register X to it
Addressing Modes:
void MOS6510::FetchLowAddrY | ( | ) | [inline, protected] |
Read from address, add index register Y to it
Addressing Modes:
void MOS6510::FetchLowEffAddr | ( | ) | [inline, protected] |
Fetch effective address low
Addressing Modes:
void MOS6510::FetchLowPointer | ( | ) | [inline, protected] |
Fetch pointer address low, increment PC
Addressing Modes:
void MOS6510::FetchLowPointerX | ( | ) | [inline, protected] |
Add X to it
Addressing Modes:
void MOS6510::Initialise | ( | ) | [protected] |
Initialise CPU Emulation (Registers)
void MOS6510::PopHighPC | ( | ) | [inline, protected] |
Increment stack and pull program counter high byte from stack.
void MOS6510::PopLowPC | ( | ) | [inline, protected] |
Increment stack and pull program counter low byte from stack.
void MOS6510::PopSR | ( | ) | [inline, protected] |
increment S, Pop P off stack
void MOS6510::PushHighPC | ( | ) | [inline, protected] |
Push Program Counter High Byte on stack, decrement S
void MOS6510::PushLowPC | ( | ) | [inline, protected] |
Push Program Counter Low Byte on stack, decrement S
void MOS6510::PushSR | ( | ) | [inline, protected] |
Push P on stack, decrement S
void MOS6510::PutEffAddrDataByte | ( | ) | [inline, protected] |
Write Cycle_Data to effective address.
void MOS6510::reset | ( | ) | [virtual] |
Reset CPU Emulation
void MOS6510::setFlagsNZ | ( | uint8_t | value | ) | [inline, protected] |
Set N and Z flag values.
value | to set flags from |
void MOS6510::setRDY | ( | bool | newRDY | ) |
Handle bus access signals. When RDY line is asserted, the CPU will pause when executing the next read operation.
rdy | new state for RDY signal |
void MOS6510::throwAwayFetch | ( | ) | [inline, protected] |
Read the next opcode byte from memory (and throw it away)
void MOS6510::throwAwayRead | ( | ) | [inline, protected] |
Issue throw-away read. Some people use these to ACK CIA IRQs.
void MOS6510::triggerIRQ | ( | ) |
Pull IRQ line low on CPU.
void MOS6510::triggerNMI | ( | ) |
Trigger NMI interrupt on the CPU. Calling this method flags that CPU must enter the NMI routine at earliest opportunity. There is no way to cancel NMI request once given.
void MOS6510::triggerRST | ( | ) |
This forces the CPU to abort whatever it is doing and immediately enter the RST interrupt handling sequence. The implementation is not compatible: instructions actually get aborted mid-execution. However, there is no possible way to trigger this signal from programs, so it's OK.
int MOS6510::cycleCount [protected] |
Current instruction and subcycle within instruction
EventContext& MOS6510::eventContext [protected] |
Our event context copy.
struct ProcessorCycle MOS6510::instrTable[0x101<< 3] [read, protected] |
Table of CPU opcode implementations
int MOS6510::interruptCycle [protected] |
When IRQ was triggered. -MAX means "during some previous instruction", MAX means "no IRQ"
bool MOS6510::irqAssertedOnPin [protected] |
IRQ asserted on CPU
EventCallback<MOS6510> MOS6510::m_nosteal [protected] |
Represents an instruction subcycle that writes
EventCallback<MOS6510> MOS6510::m_steal [protected] |
Represents an instruction subcycle that reads
bool MOS6510::nmiFlag [protected] |
NMI requested?
bool MOS6510::rdy [protected] |
RDY pin state (stop CPU on read)
uint_least16_t MOS6510::Register_ProgramCounter [protected] |
Data regarding current instruction
bool MOS6510::rstFlag [protected] |
RST requested?
const int MOS6510::SR_INTERRUPT = 2 [static] |
Status register interrupt bit.