From 57e91fbdef76bbc1ed5698ff53bbf37687e63f34 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Tue, 4 Feb 2025 14:01:07 +0100 Subject: [PATCH] =?UTF-8?q?-=20Borrador=20de=20microcodi=20per=20a=20versi?= =?UTF-8?q?=C3=B3=20alternativa=20del=206502?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- microcode.txt | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 microcode.txt diff --git a/microcode.txt b/microcode.txt new file mode 100644 index 0000000..54eac40 --- /dev/null +++ b/microcode.txt @@ -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(); +