summaryrefslogtreecommitdiff
path: root/Chip/Q1CpuAddressingModes.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Chip/Q1CpuAddressingModes.cs')
-rw-r--r--Chip/Q1CpuAddressingModes.cs130
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