diff options
| author | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-04 12:07:39 +1000 |
|---|---|---|
| committer | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-04 12:07:39 +1000 |
| commit | 72f297a479b6749674ec80e91be53b8c482123d2 (patch) | |
| tree | 05465784b2b5b5adbd695b50e8394c6f78e3a455 /Chip/Q1CpuAddressingModes.cs | |
| parent | 86452af2d48e2d1883dbfd67316e371f2a593bfe (diff) | |
crowbar
Diffstat (limited to 'Chip/Q1CpuAddressingModes.cs')
| -rw-r--r-- | Chip/Q1CpuAddressingModes.cs | 130 |
1 files changed, 101 insertions, 29 deletions
diff --git a/Chip/Q1CpuAddressingModes.cs b/Chip/Q1CpuAddressingModes.cs index 0d664f7..f809ff3 100644 --- a/Chip/Q1CpuAddressingModes.cs +++ b/Chip/Q1CpuAddressingModes.cs @@ -23,40 +23,55 @@ public partial class Q1Cpu public void StoreData(u8 mode, u16 value) { - Console.WriteLine($"StoreData: mode={mode:X8}, value={value:X16}"); - if (mode != 0x05) + switch (mode) { - u16 address = this.FetchData(mode); - Console.WriteLine($"StoreData: address={address:X16}"); - this.Bus.WriteWord(address, value); - } - else - { - u8 regIndex = this.Bus.Read(this.PC); - this.PC += 1; - - this.StoreRegister(regIndex, value); + case 0x0: + throw new InvalidOperationException("Cannot store data in implicit mode."); + case 0x1: + throw new InvalidOperationException("Cannot store data in immediate mode."); + case 0x2: + this.AddressingMode_Direct_Store(value); + break; + case 0x3: + this.AddressingMode_Indirect_Store(value); + break; + case 0x4: + this.AddressingMode_Relative_Store(value); + break; + case 0x5: + this.AddressingMode_Register_Store(value); + break; + case 0x6: + this.AddressingMode_RegisterIndirect_Store(value); + break; + case 0x7: + this.AddressingMode_RegisterIndirectOffset_Store(value); + break; + default: + throw new InvalidOperationException($"Unknown addressing mode: {mode:X2}"); } } public void TransformData(u8 mode, Func<u16, u16> transform) { - if (mode != 0x05) - { - u16 address = this.FetchData(mode); - u16 value = this.Bus.ReadWord(address); - u16 transformedValue = transform(value); - this.Bus.WriteWord(address, transformedValue); - } - else - { - u8 regIndex = this.Bus.Read(this.PC); - this.PC += 1; - - u16 value = this.FetchRegister(regIndex); - u16 transformedValue = transform(value); - this.StoreRegister(regIndex, transformedValue); - } + // if (mode != 0x05) + // { + // u16 address = this.FetchData(mode); + // u16 value = this.Bus.ReadWord(address); + // u16 transformedValue = transform(value); + // this.Bus.WriteWord(address, transformedValue); + // } + // else + // { + // u8 regIndex = this.Bus.Read(this.PC); + // this.PC += 1; + // + // u16 value = this.FetchRegister(regIndex); + // u16 transformedValue = transform(value); + // this.StoreRegister(regIndex, transformedValue); + // } + + throw new NotImplementedException("TransformData is not implemented yet."); } public u8 AddressingModeLength(u8 mode) @@ -132,6 +147,7 @@ public partial class Q1Cpu u16 address = this.FetchRegister(regIndex); u16 value = this.Bus.ReadWord(address); + Console.WriteLine($"Value at {address:X4}: {value:X4}"); return value; } @@ -140,11 +156,67 @@ public partial class Q1Cpu u8 regIndex = this.Bus.Read(this.PC); this.PC += 1; - u16 offset = this.Bus.ReadWord(this.PC); + i16 offset = Make.i16(this.Bus.ReadSeq(this.PC, 2)); + Console.WriteLine("Offset: " + offset); this.PC += 2; u16 address = (u16) (this.FetchRegister(regIndex) + offset); u16 value = this.Bus.ReadWord(address); return value; } + + public void AddressingMode_Direct_Store(u16 data) + { + u16 address = this.Bus.ReadWord(this.PC); + this.PC += 2; + + this.Bus.WriteWord(address, data); + } + + public void AddressingMode_Indirect_Store(u16 data) + { + u16 address = this.Bus.ReadWord(this.PC); + this.PC += 2; + + u16 indirectAddress = this.Bus.ReadWord(address); + this.Bus.WriteWord(indirectAddress, data); + } + + public void AddressingMode_Relative_Store(u16 data) + { + u16 offset = this.Bus.ReadWord(this.PC); + this.PC += 2; + + u16 address = (u16) (this.PC + offset); + this.Bus.WriteWord(address, data); + } + + public void AddressingMode_Register_Store(u16 data) + { + u8 regIndex = this.Bus.Read(this.PC); + this.PC += 1; + + this.StoreRegister(regIndex, data); + } + + public void AddressingMode_RegisterIndirect_Store(u16 data) + { + u8 regIndex = this.Bus.Read(this.PC); + this.PC += 1; + + u16 address = this.FetchRegister(regIndex); + this.Bus.WriteWord(address, data); + } + + public void AddressingMode_RegisterIndirectOffset_Store(u16 data) + { + u8 regIndex = this.Bus.Read(this.PC); + this.PC += 1; + + i16 offset = Make.i16(this.Bus.ReadSeq(this.PC, 2)); + this.PC += 2; + + u16 address = (u16) (this.FetchRegister(regIndex) + offset); + this.Bus.WriteWord(address, data); + } }
\ No newline at end of file |
