Files
nes/microcode.txt
2025-02-05 21:32:58 +01:00

219 lines
3.5 KiB
Plaintext

LDA LDX LDY BIT ADC SBC AND ORA EOR CMP CPX CPY
=====================================
LDA #imm
FetchOperandLo
FetchOpcode
LDA ZeroPage
FetchOperandLo
ReadAddress
FetchOpcode
LDA ZeroPage,X
FetchOperandLo
IndexX
ReadAddress;
FetchOpcode
LDA Absolute
FetchOperandLo
FetchOperandHi
ReadAddress
FetchOpcode
LDA Absolute, X/Y
FetchOperandLo
FetchOperandHiAndIndex;
ReadAddressAndSkip;
ReadAddress
FetchOpcode
LDA (Indirect, X)
FetchOperandLo
IndexX
FetchAddressLo;
FetchAddressHi;
ReadAddress
FetchOpcode
LDA (Indirect), Y
FetchOperandLo
FetchAddressLo
FetchAddressHiAndIndex
ReadAddressAndSkip
ReadAddress
FetchOpcode
STA STX STY
=====================================
STA ZeroPage
FetchOperandLo
WriteRegister
FetchOpcode
STA ZeroPage, X
FetchOperandLo
IndexX
WriteRegister
FetchOpcode
STA Absolute
FetchOperandLo
FetchOperandHi
WriteRegister
FetchOpcode
STA Absolute, X/Y
FetchOperandLo
FetchOperandHiAndIndex
ReadAddress
WriteRegister
FetchOpcode
STA (Indirect, X)
FetchOperandLo
IndexX
FetchAddressLo
FetchAddressHi
WriteRegister
FetchOpcode
STA (Indirect), Y
FetchOperandLo
FetchAddressLo
FetchAddressHiAndIndex
ReadAddress
WriteRegister
FetchOpcode
ASL LSR ROL ROR INC DEC
========================
ASL A
FakeFetchOperand
FetchOpcode
ASL ZeroPage
FetchOperandLo
ReadAddress
WriteAddress
WriteAddress
FetchOpcode
ASL ZeroPage, X
FetchOperandLo
IndexX
ReadAddress
WriteAddress
WriteAddress
FetchOpcode
ASL Absolute
FetchOperandLo
FetchOperandHi
ReadAddress
WriteAddress
WriteAddress
FetchOpcode
ASL Absolute, X
FetchOperandLo
FetchOperandHiAndIndex
ReadAddress
ReadAddress
WriteAddress
WriteAddress
FetchOpcode
BCC BCS BNE BEQ BPL BMI BVC BVS
========================
BCC
FetchOperandLo
CheckIfTaken;
CheckIfPageCrossed;
FetchOpcode
CLC SEC CLI SEI CLD SED CLV
===========================
---
MICROINSTRUCTIONS
===========================================
FetchOpcode
DoOpcodeWork();
IR = Mem::Read(PC++);
Decode();
ResetState();
FakeFetchOperand
Address.Lo = Mem::Read(PC);
FetchOperandLo
Address.Lo = B = Mem::Read(PC++);
FetchOperandHi
Address.Hi = Mem::Read(PC++);
FetchOperandHiAndIndex
Address.Hi = Mem::Read(PC++);
if (Address.Lo+X/Y > 255) pageCrossed = true;
Address.Lo += X/Y;
ReadAddress
B = Mem::Read(Address);
if (pageCrossed) Address += 0x0100;
ReadAddressAndSkip
B = Mem::Read(Address);
if (pageCrossed)
Address += 0x0100;
else
InsertFetchOpcode();
IndexX
B = Mem::Read(Address);
Address.Lo += X;
FetchAddressLo
T = Mem::Read(Address++);
FetchAddressHi
Address.Hi = Mem::Read(Address);
Address.Lo = T;
FetchAddressHiAndIndex
Address.Hi = Mem::Read(Address);
pageCrossed = (T+Y > 255);
Address.Lo = T+Y;
WriteRegister
if ((IR&3)==1) Mem::Write(Address, rA);
else if ((IR&3)==2) Mem::Write(Address, rX);
else if ((IR&3)==0) Mem::Write(Address, rY);
WriteAddress
Mem::Write(Address, B);
DoOpcodeWork();
FetchOperandAndCheckBranch
Address.Lo = B = Mem::Read(PC++);
If (!condition)
InsertFetchOpcode();
else
T = PC.Hi;
PC = PC +(int8_t)B;
CheckIfPageCrossed
FakeFetchOperand();
if (PC.Hi == T)
InsertFetchOpCode();
else
pageCrossed = true;