- Borrador de microcodi per a versió alternativa del 6502

This commit is contained in:
2025-02-04 14:01:07 +01:00
parent fb2c69c6a4
commit 57e91fbdef

198
microcode.txt Normal file
View File

@@ -0,0 +1,198 @@
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
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
Add2.Lo = Mem::Read(Address++);
FetchAddressHi
Add2.Hi = Mem::Read(Address);
Address = Add2;
FetchAddressHiAndIndex
Add2.Hi = Mem::Read(Address);
if (Add2.lo+Y > 255) pageCrossed = true;
Address = Add2;
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();