diff --git a/ProjectPSX/PSX/MMU.cs b/ProjectPSX/Core/BUS.cs
similarity index 84%
rename from ProjectPSX/PSX/MMU.cs
rename to ProjectPSX/Core/BUS.cs
index cb236fc..79d863b 100644
--- a/ProjectPSX/PSX/MMU.cs
+++ b/ProjectPSX/Core/BUS.cs
@@ -1,9 +1,11 @@
-using System;
+using ProjectPSX.Devices;
+using System;
using System.IO;
namespace ProjectPSX {
- internal class MMU {
+ internal class BUS {
+ //Memory
private byte[] RAM = new byte[2048 * 1024];
private byte[] EX1 = new byte[512 * 1024];
private byte[] SCRATHPAD = new byte[1024];
@@ -11,11 +13,17 @@ namespace ProjectPSX {
private byte[] BIOS = new byte[512 * 1024];
private byte[] IO = new byte[512];
+ //Other Subsystems
+ private DMA dma;
+
+ public BUS() {
+ dma = new DMA();
+ }
+
private const uint GPUSTAT = 0x1f801814;
private const uint GP0 = 0x1f801810;
- internal uint read32(uint addr) {
- //Console.WriteLine("READ ADDR: " + addr.ToString("x4"));
+ internal uint load32(uint addr) {
switch (addr) {
case uint KUSEG when addr >= 0x0000_0000 && addr < 0x1F00_0000:
case uint KSEG0 when addr >= 0x8000_0000 && addr < 0x9F00_0000:
@@ -39,29 +47,22 @@ namespace ProjectPSX {
case uint KUSEG when addr >= 0x1F80_1000 && addr < 0x1F80_2000:
case uint KSEG0 when addr >= 0x9F80_1000 && addr < 0x9F80_2000:
case uint KSEG1 when addr >= 0xBF80_1000 && addr < 0xBF80_2000:
- if (addr >= 0x1f801080 && addr <= 0x1f8010FF) {
- Console.WriteLine("DMA ACCESS");
- return 0;
- } else if (addr == GPUSTAT) { Console.WriteLine("GPUSTAT ACCESS"); return 0x1000_0000; }
- else if (addr == GP0) { Console.WriteLine("GP0 ACCESS"); return 0; }
- else if (addr == 0x1f801104) { Console.WriteLine("Timer 1104 ACCESS"); return 0; }
- else if (addr == 0x1f801114) { Console.WriteLine("Timer 1114 ACCESS"); return 0; }
- else if (addr == 0x1f801118) { Console.WriteLine("Timer 1118 ACCESS"); return 0; }
- else if (addr == 0x1f801070) { Console.WriteLine("Interrupt Mask ACCESS"); return 0; }
- else if (addr == 0x1f801074) { Console.WriteLine("Interrupt Status ACCESS"); return 0; }
- else if (addr == 0x1f801dae) { Console.WriteLine("SPU ACCESS"); return 0; }
+ if (addr == GPUSTAT) { Console.WriteLine("GPUSTAT ACCESS"); return 0x1000_0000; } else if (addr == GP0) { Console.WriteLine("GP0 ACCESS"); return 0; } else if (addr == 0x1f801104) { Console.WriteLine("Timer 1104 ACCESS"); return 0; } else if (addr == 0x1f801114) { Console.WriteLine("Timer 1114 ACCESS"); return 0; } else if (addr == 0x1f801118) { Console.WriteLine("Timer 1118 ACCESS"); return 0; } else if (addr == 0x1f801070) { Console.WriteLine("Interrupt Mask ACCESS"); return 0; } else if (addr == 0x1f801074) { Console.WriteLine("Interrupt Status ACCESS"); return 0; } else if (addr == 0x1f801dae) { Console.WriteLine("SPU ACCESS"); return 0; }
+
+ switch (addr) {
+ case uint DMA when addr >= 0x1F80_1080 && addr < 0x1F80_10FF:
+ Console.WriteLine("load at addr {0} = {1}", addr.ToString("x8"), dma.load32(addr).ToString("x8"));
+ return dma.load32(addr);
+
+ default:
+ addr &= 0xFFF;
+ return (uint)((REGISTERS[addr + 3] << 24) | (REGISTERS[addr + 2] << 16) | (REGISTERS[addr + 1] << 8) | REGISTERS[addr]);
+ }
- addr &= 0xFFF;
- return (uint)((REGISTERS[addr + 3] << 24) | (REGISTERS[addr + 2] << 16) | (REGISTERS[addr + 1] << 8) | REGISTERS[addr]);
case uint KUSEG when addr >= 0x1FC0_0000 && addr < 0x1FC8_0000:
case uint KSEG0 when addr >= 0x9FC0_0000 && addr < 0x9FC8_0000:
case uint KSEG1 when addr >= 0xBFC0_0000 && addr < 0xBFC8_0000: //BIOS mem map
- if (0xbfc04190 == addr) {
- Console.WriteLine("DMA LOOP");
- return 0;
- }
-
addr &= 0x7_FFFF;
return (uint)((BIOS[addr + 3] << 24) | (BIOS[addr + 2] << 16) | (BIOS[addr + 1] << 8) | BIOS[addr]);
@@ -86,6 +87,7 @@ namespace ProjectPSX {
RAM[addr + 2] = (byte)(value >> 16);
RAM[addr + 3] = (byte)(value >> 24);
break;
+
case uint KUSEG when addr >= 0x1F00_0000 && addr < 0x1F08_0000:
case uint KSEG0 when addr >= 0x9F00_0000 && addr < 0x9F08_0000:
case uint KSEG1 when addr >= 0xBF00_0000 && addr < 0xBF08_0000:
@@ -95,6 +97,7 @@ namespace ProjectPSX {
EX1[addr + 2] = (byte)(value >> 16);
EX1[addr + 3] = (byte)(value >> 24);
break;
+
case uint KUSEG when addr >= 0x1F80_0000 && addr < 0x1F80_0400:
case uint KSEG0 when addr >= 0x9F80_0000 && addr < 0x9F80_0400:
case uint KSEG1 when addr >= 0xBF80_0000 && addr < 0xBF80_0400:
@@ -104,21 +107,33 @@ namespace ProjectPSX {
SCRATHPAD[addr + 2] = (byte)(value >> 16);
SCRATHPAD[addr + 3] = (byte)(value >> 24);
break;
+
case uint KUSEG when addr >= 0x1F80_1000 && addr < 0x1F80_2000:
case uint KSEG0 when addr >= 0x9F80_1000 && addr < 0x9F80_2000:
case uint KSEG1 when addr >= 0xBF80_1000 && addr < 0xBF80_2000:
- addr &= 0xFFF;
- REGISTERS[addr] = (byte)(value);
- REGISTERS[addr + 1] = (byte)(value >> 8);
- REGISTERS[addr + 2] = (byte)(value >> 16);
- REGISTERS[addr + 3] = (byte)(value >> 24);
+
+ switch (addr) {
+ case uint DMA when addr >= 0x1F80_1080 && addr < 0x1F80_10FF:
+ dma.write32(addr, value);
+ break;
+
+ default:
+ addr &= 0xFFF;
+ REGISTERS[addr] = (byte)(value);
+ REGISTERS[addr + 1] = (byte)(value >> 8);
+ REGISTERS[addr + 2] = (byte)(value >> 16);
+ REGISTERS[addr + 3] = (byte)(value >> 24);
+ break;
+ }
break;
+
case uint KUSEG when addr >= 0x1FC0_0000 && addr < 0x1FC8_0000:
case uint KSEG0 when addr >= 0x9FC0_0000 && addr < 0x9FC8_0000:
case uint KSEG1 when addr >= 0xBFC0_0000 && addr < 0xBFC8_0000: //BIOS mem map
Console.WriteLine("WARNING WRITE 32 on BIOS RANGE" + addr.ToString("x8"));
Console.ReadLine();
break;
+
case uint KSEG2 when addr >= 0xFFFE_0000 && addr < 0xFFFE_0200:
addr &= 0x1FF;
IO[addr] = (byte)(value);
@@ -126,6 +141,7 @@ namespace ProjectPSX {
IO[addr + 2] = (byte)(value >> 16);
IO[addr + 3] = (byte)(value >> 24);
break;
+
default:
Console.WriteLine("Unsupported WRITE AREA: " + addr.ToString("x4") + ": " + value.ToString("x4"));
break;
diff --git a/ProjectPSX/PSX/CPU.cs b/ProjectPSX/Core/CPU.cs
similarity index 91%
rename from ProjectPSX/PSX/CPU.cs
rename to ProjectPSX/Core/CPU.cs
index 2bdb54e..ab9f992 100644
--- a/ProjectPSX/PSX/CPU.cs
+++ b/ProjectPSX/Core/CPU.cs
@@ -80,19 +80,20 @@ namespace ProjectPSX {
private WB wb;
private MEM mem;
- internal void Run(MMU mmu) {
- fetchDecode(mmu);
- Execute(mmu);
+ internal void Run(BUS bus) {
+ fetchDecode(bus);
+ Execute(bus);
MemAccess();
WriteBack();
- TTY();
+
//debug
+ TTY();
//disassemble();
//PrintRegs();
}
- private void fetchDecode(MMU mmu) {
- uint load = mmu.read32(PC);
+ private void fetchDecode(BUS bus) {
+ uint load = bus.load32(PC);
PC_Now = PC;
PC = PC_Predictor;
PC_Predictor += 4;
@@ -122,7 +123,7 @@ namespace ProjectPSX {
REG[0] = 0;
}
- private void Execute(MMU mmu) {
+ private void Execute(BUS bus) {
switch (instr.opcode) {
case 0b00_0000: //R-Type opcodes
switch (instr.function) {
@@ -196,26 +197,26 @@ namespace ProjectPSX {
case 0b01_0010: COP2(); break;
case 0b01_0011: COP3(); break;
- case 0b10_0000: LB(mmu); break;
- case 0b10_0001: LH(mmu); break;
- case 0b10_0010: LWL(mmu); break;
- case 0b10_0011: LW(mmu); break;
- case 0b10_0100: LBU(mmu); break;
- case 0b10_0101: LHU(mmu); break;
- case 0b10_0110: LWR(mmu); break;
- case 0b10_1000: SB(mmu); break;
- case 0b10_1001: SH(mmu); break;
- case 0b10_1010: SWL(mmu); break;
- case 0b10_1011: SW(mmu); break;
- case 0b10_1110: SWR(mmu); break;
+ case 0b10_0000: LB(bus); break;
+ case 0b10_0001: LH(bus); break;
+ case 0b10_0010: LWL(bus); break;
+ case 0b10_0011: LW(bus); break;
+ case 0b10_0100: LBU(bus); break;
+ case 0b10_0101: LHU(bus); break;
+ case 0b10_0110: LWR(bus); break;
+ case 0b10_1000: SB(bus); break;
+ case 0b10_1001: SH(bus); break;
+ case 0b10_1010: SWL(bus); break;
+ case 0b10_1011: SW(bus); break;
+ case 0b10_1110: SWR(bus); break;
case 0b11_0000: //LWC0
case 0b11_0001: //LWC1
case 0b11_0011: //LWC3
case 0b11_1000: //SWC0
case 0b11_1001: //SWC1
case 0b11_1011: UNIMPL_LW_SW_COP0_1_3(); break;
- case 0b11_0010: LWC2(mmu); break;
- case 0b11_1010: SWC2(mmu); break;
+ case 0b11_0010: LWC2(bus); break;
+ case 0b11_1010: SWC2(bus); break;
//pending lwc0-3 and swc0-3 and illegal opc
default:
EXCEPTION(EX.ILLEGAL_INSTR);
@@ -224,12 +225,12 @@ namespace ProjectPSX {
}
}
- private void SWC2(MMU mmu) {
+ private void SWC2(BUS bus) {
Console.WriteLine("Store at GTE");
throw new NotImplementedException();
}
- private void LWC2(MMU mmu) {
+ private void LWC2(BUS bus) {
Console.WriteLine("Load from GTE");
throw new NotImplementedException();
}
@@ -238,11 +239,11 @@ namespace ProjectPSX {
EXCEPTION(EX.COPROCESSOR_ERROR);
}
- private void SWR(MMU mmu) {
+ private void SWR(BUS bus) {
uint addr = REG[instr.rs] + instr.imm_s;
uint aligned_addr = (uint)(addr & ~0b11);
- uint aligned_load = mmu.read32(aligned_addr);
+ uint aligned_load = bus.load32(aligned_addr);
uint value = 0;
switch (addr & 0b11) {
@@ -252,14 +253,14 @@ namespace ProjectPSX {
case 3: value = aligned_load & 0xFF_FFFF | REG[instr.rt] << 24; break;
}
- mmu.write32(addr, value);
+ bus.write32(addr, value);
}
- private void SWL(MMU mmu) {
+ private void SWL(BUS bus) {
uint addr = REG[instr.rs] + instr.imm_s;
uint aligned_addr = (uint)(addr & ~0b11);
- uint aligned_load = mmu.read32(aligned_addr);
+ uint aligned_load = bus.load32(aligned_addr);
uint value = 0;
switch (addr & 0b11) {
@@ -269,14 +270,14 @@ namespace ProjectPSX {
case 0: value = aligned_load & 0xFF_FFFF | REG[instr.rt] >> 24; break;
}
- mmu.write32(addr, value);
+ bus.write32(addr, value);
}
- private void LWR(MMU mmu) {
+ private void LWR(BUS bus) {
uint addr = REG[instr.rs] + instr.imm_s;
uint aligned_addr = (uint)(addr & ~0b11);
- uint aligned_load = mmu.read32(aligned_addr);
+ uint aligned_load = bus.load32(aligned_addr);
uint value = 0;
switch (addr & 0b11) {
@@ -291,11 +292,11 @@ namespace ProjectPSX {
delayedLoad(instr.rt, prev_value | value);
}
- private void LWL(MMU mmu) {
+ private void LWL(BUS bus) {
uint addr = REG[instr.rs] + instr.imm_s;
uint aligned_addr = (uint)(addr & ~0b11);
- uint aligned_load = mmu.read32(aligned_addr);
+ uint aligned_load = bus.load32(aligned_addr);
uint value = 0;
switch(addr & 0b11) {
@@ -372,14 +373,14 @@ namespace ProjectPSX {
setReg(instr.rd, ~(REG[instr.rs] | REG[instr.rt]));
}
- private void LH(MMU mmu) {
+ private void LH(BUS bus) {
if ((SR & 0x10000) == 0) {
uint addr = REG[instr.rs] + instr.imm_s;
if ((addr % 2) != 0) {
EXCEPTION(EX.LOAD_ADRESS_ERROR);
} else {
- uint value = (uint)(short)mmu.read32(addr);
+ uint value = (uint)(short)bus.load32(addr);
delayedLoad(instr.rt, value);
}
@@ -390,14 +391,14 @@ namespace ProjectPSX {
setReg(instr.rd, REG[instr.rt] << (int)(REG[instr.rs] & 0x1F));
}
- private void LHU(MMU mmu) {
+ private void LHU(BUS bus) {
if ((SR & 0x10000) == 0) {
uint addr = REG[instr.rs] + instr.imm_s;
if ((addr % 2) != 0) {
EXCEPTION(EX.LOAD_ADRESS_ERROR);
} else {
- uint value = (ushort)mmu.read32(addr);
+ uint value = (ushort)bus.load32(addr);
delayedLoad(instr.rt, value);
}
@@ -418,7 +419,7 @@ namespace ProjectPSX {
LO = REG[instr.rs];
}
- private void EXCEPTION(uint cause) {
+ private void EXCEPTION(EX cause) {
uint ExAdress;
if((SR & (1 << 22)) != 0) {
ExAdress = 0xBFC0_0180;
@@ -430,7 +431,7 @@ namespace ProjectPSX {
SR = (uint)(SR & ~0x3F);
SR |= (mode << 2) & 0x3F;
- CAUSE = cause << 2;
+ CAUSE = (uint)cause << 2;
EPC = PC_Now;
if (isDelaySlot) {
@@ -538,9 +539,9 @@ namespace ProjectPSX {
JR();
}
- private void LBU(MMU mmu) { //todo recheck this
+ private void LBU(BUS bus) { //todo recheck this
if ((SR & 0x10000) == 0) {
- uint value = (byte)mmu.read32(REG[instr.rs] + instr.imm_s);
+ uint value = (byte)bus.load32(REG[instr.rs] + instr.imm_s);
delayedLoad(instr.rt, value);
} //else Console.WriteLine("Ignoring Load");
}
@@ -582,9 +583,9 @@ namespace ProjectPSX {
}
}
- private void LB(MMU mmu) { //todo redo this as it unnecesary read32
+ private void LB(BUS bus) { //todo redo this as it unnecesary load32
if ((SR & 0x10000) == 0) {
- uint value = (uint)((sbyte)(mmu.read32(REG[instr.rs] + instr.imm_s)));
+ uint value = (uint)((sbyte)(bus.load32(REG[instr.rs] + instr.imm_s)));
delayedLoad(instr.rt, value);
} //else Console.WriteLine("Ignoring Write");
}
@@ -594,9 +595,9 @@ namespace ProjectPSX {
PC_Predictor = REG[instr.rs];
}
- private void SB(MMU mmu) {
+ private void SB(BUS bus) {
if ((SR & 0x10000) == 0)
- mmu.write8(REG[instr.rs] + instr.imm_s, (byte)REG[instr.rt]);
+ bus.write8(REG[instr.rs] + instr.imm_s, (byte)REG[instr.rt]);
//else Console.WriteLine("Ignoring Write");
}
@@ -609,14 +610,14 @@ namespace ProjectPSX {
J();
}
- private void SH(MMU mmu) {
+ private void SH(BUS bus) {
if ((SR & 0x10000) == 0) {
uint addr = REG[instr.rs] + instr.imm_s;
if ((addr % 2) != 0) {
EXCEPTION(EX.STORE_ADRESS_ERROR);
} else {
- mmu.write16(addr, (ushort)REG[instr.rt]);
+ bus.write16(addr, (ushort)REG[instr.rt]);
}
}
//else Console.WriteLine("Ignoring Write");
@@ -631,14 +632,14 @@ namespace ProjectPSX {
setReg(instr.rd, condition ? 1u : 0u);
}
- private void LW(MMU mmu) {
+ private void LW(BUS bus) {
if ((SR & 0x10000) == 0) {
uint addr = REG[instr.rs] + instr.imm_s;
if ((addr % 4) != 0) {
EXCEPTION(EX.LOAD_ADRESS_ERROR);
} else {
- uint value = mmu.read32(addr);
+ uint value = bus.load32(addr);
delayedLoad(instr.rt, value);
}
@@ -683,14 +684,14 @@ namespace ProjectPSX {
setReg(instr.rd, REG[instr.rt] << (int)instr.sa);
}
- private void SW(MMU mmu) {
+ private void SW(BUS bus) {
if ((SR & 0x10000) == 0) {
uint addr = REG[instr.rs] + instr.imm_s;
if ((addr % 4) != 0) {
EXCEPTION(EX.STORE_ADRESS_ERROR);
} else {
- mmu.write32(addr, REG[instr.rt]);
+ bus.write32(addr, REG[instr.rt]);
}
}
//else Console.WriteLine("Ignoring Write");
@@ -857,36 +858,36 @@ namespace ProjectPSX {
}
break;
- case 0b10_0000:// LB(mmu);
+ case 0b10_0000:// LB(bus);
output = "LB";
break;
- case 0b10_0001: //LH(mmu); break;
+ case 0b10_0001: //LH(bus); break;
output = "LH";
break;
case 0b10_0010: output = "LWL"; break;
- case 0b10_0100:// LBU(mmu);
+ case 0b10_0100:// LBU(bus);
output = "LBU";
break;
- case 0b10_0101: //LHU(mmu); break;
+ case 0b10_0101: //LHU(bus); break;
output = "LHU";
break;
- case 0b10_0011:// LW(mmu);
+ case 0b10_0011:// LW(bus);
if ((SR & 0x10000) == 0)
values = "R" + instr.rt + "[" + REG[instr.rt].ToString("x8") + "], " + instr.imm_s.ToString("x8") + "(" + REG[instr.rs].ToString("x8") + ")" + "[" + (instr.imm_s + REG[instr.rs]).ToString("x8") + "]";
else values = "R" + instr.rt + "[" + REG[instr.rt].ToString("x8") + "], " + instr.imm_s.ToString("x8") + "(" + REG[instr.rs].ToString("x8") + ")" + "[" + (instr.imm_s + REG[instr.rs]).ToString("x8") + "]" + " WARNING IGNORED LOAD";
output = "LW";
break;
- case 0b10_1001:// SH(mmu);
+ case 0b10_1001:// SH(bus);
output = "SH";
break;
case 0b10_1010: output = "SWL"; break;
case 0b10_0110: output = "LWR"; break;
- case 0b10_1000:// SB(mmu);
+ case 0b10_1000:// SB(bus);
output = "SB";
break;
- case 0b10_1011:// SW(mmu);
+ case 0b10_1011:// SW(bus);
//if ((SR & 0x10000) == 0)
- // mmu.write32(REG[instr.rs] + instr.imm_s, REG[instr.rt]);
+ // bus.write32(REG[instr.rs] + instr.imm_s, REG[instr.rt]);
output = "SW";
if ((SR & 0x10000) == 0)
values = "R" + instr.rt + "["+REG[instr.rt].ToString("x8") + "], " + instr.imm_s.ToString("x8") + "(" + REG[instr.rs].ToString("x8") +")" + "["+ (instr.imm_s + REG[instr.rs]).ToString("x8") + "]";
diff --git a/ProjectPSX/Core/EX.cs b/ProjectPSX/Core/EX.cs
new file mode 100644
index 0000000..1a9a3b7
--- /dev/null
+++ b/ProjectPSX/Core/EX.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ProjectPSX {
+ enum EX {
+ LOAD_ADRESS_ERROR = 0x4,
+ STORE_ADRESS_ERROR = 0x5,
+ SYSCALL = 0x8,
+ BREAK = 0x9,
+ ILLEGAL_INSTR = 0xA,
+ COPROCESSOR_ERROR = 0xB,
+ OVERFLOW = 0xC
+ }
+}
diff --git a/ProjectPSX/PSX/ProjectPSX.cs b/ProjectPSX/Core/ProjectPSX.cs
similarity index 91%
rename from ProjectPSX/PSX/ProjectPSX.cs
rename to ProjectPSX/Core/ProjectPSX.cs
index f5fe876..7a91817 100644
--- a/ProjectPSX/PSX/ProjectPSX.cs
+++ b/ProjectPSX/Core/ProjectPSX.cs
@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace ProjectPSX {
class ProjectPSX {
private CPU cpu;
- private MMU mmu;
+ private BUS mmu;
public ProjectPSX() {
@@ -16,7 +16,7 @@ namespace ProjectPSX {
public void POWER_ON() {
cpu = new CPU();
- mmu = new MMU();
+ mmu = new BUS();
mmu.loadBios();
diff --git a/ProjectPSX/Devices/DMA.cs b/ProjectPSX/Devices/DMA.cs
new file mode 100644
index 0000000..e0936e6
--- /dev/null
+++ b/ProjectPSX/Devices/DMA.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ProjectPSX.Devices {
+ public class DMA : Device {
+
+ private uint CONTROL;
+ private uint INTERRUPT;
+
+ public DMA() {
+ registers = new byte[0x80];
+ memOffset = 0x1F801080;
+
+ write32(0x1F8010F0, 0x07654321);
+ }
+
+ public new void write32(uint addr, uint value) {
+ base.write32(addr, value);
+ Console.WriteLine("Write32 on DMA Address: {0} Value: {1}", addr.ToString("x8"), value.ToString("x8"));
+ }
+
+ }
+}
diff --git a/ProjectPSX/Devices/Device.cs b/ProjectPSX/Devices/Device.cs
new file mode 100644
index 0000000..103d4e2
--- /dev/null
+++ b/ProjectPSX/Devices/Device.cs
@@ -0,0 +1,51 @@
+
+namespace ProjectPSX.Devices {
+
+ public class Device {
+
+ protected byte[] registers;
+ protected uint memOffset;
+
+ public byte load8(uint addr) {
+ addr -= memOffset;
+ return registers[addr];
+ }
+
+ public ushort load16(uint addr) {
+ addr -= memOffset;
+ byte b0 = registers[addr + 0];
+ byte b1 = registers[addr + 1];
+
+ return (ushort)(b1 << 8 | b0);
+ }
+
+ public uint load32(uint addr) {
+ addr -= memOffset;
+ byte b0 = registers[addr + 0];
+ byte b1 = registers[addr + 1];
+ byte b2 = registers[addr + 2];
+ byte b3 = registers[addr + 3];
+
+ return (uint)(b3 << 24 | b2 << 16 | b1 << 8 | b0);
+ }
+
+ public void write8(uint addr, byte value) {
+ addr -= memOffset;
+ registers[addr] = value;
+ }
+
+ public void write16(uint addr, ushort value) {
+ addr -= memOffset;
+ registers[addr + 0] = (byte)(value);
+ registers[addr + 1] = (byte)(value >> 8);
+ }
+
+ public void write32(uint addr, uint value) {
+ addr -= memOffset;
+ registers[addr + 0] = (byte)(value);
+ registers[addr + 1] = (byte)(value >> 8);
+ registers[addr + 2] = (byte)(value >> 16);
+ registers[addr + 3] = (byte)(value >> 24);
+ }
+ }
+}
diff --git a/ProjectPSX/PSX/EX.cs b/ProjectPSX/PSX/EX.cs
deleted file mode 100644
index a7ec905..0000000
--- a/ProjectPSX/PSX/EX.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace ProjectPSX {
- static class EX {
- public const uint LOAD_ADRESS_ERROR = 0x4;
- public const uint STORE_ADRESS_ERROR = 0x5;
- public const uint SYSCALL = 0x8;
- public const uint BREAK = 0x9;
- public const uint ILLEGAL_INSTR = 0xA;
- public const uint COPROCESSOR_ERROR = 0xB;
- public const uint OVERFLOW = 0xC;
- }
-}
diff --git a/ProjectPSX/ProjectPSX.csproj b/ProjectPSX/ProjectPSX.csproj
index 1e80c86..e29434c 100644
--- a/ProjectPSX/ProjectPSX.csproj
+++ b/ProjectPSX/ProjectPSX.csproj
@@ -57,10 +57,12 @@
-
-
-
-
+
+
+
+
+
+
Form1.cs