From 3971c37a53c67b71f0a110fdf5dfd96ff10284f7 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Wed, 5 Feb 2025 07:20:27 +0100 Subject: [PATCH] ... --- microcode.txt | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/microcode.txt b/microcode.txt index 2c5f75b..5c6a578 100644 --- a/microcode.txt +++ b/microcode.txt @@ -138,3 +138,81 @@ BCC 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(); + +CheckIfTaken + FakeFetchOperand(); + If (!condition) + InsertFetchOpcode(); + else + T = PC.Hi; + PC = PC +(int8_t)B; + +CheckIfPageCrossed + FakeFetchOperand(); + if (PC.Hi == T) + InsertFetchOpCode(); + else + pageCrossed = true;