Commit Graph

34 Commits (master)

Author SHA1 Message Date
Nabile Rahmani a4d06cef67 Handle special cases for CP0 register writes.
- The timer interrupt is cleared on writes to the Compare register (see: #6.3.4).
- Only software interrupt bits are writable into the Cause register (see: #6.3.6).
2018-12-24 21:38:18 +01:00
Nabile Rahmani 124567fd71 The CPU is in kernel mode when EXL or ERL is on.
This would fix the User and Supervisor modes entering an exception and being unable to service it as they have no way to return to Kernel mode.
The CPU would get stuck in a coprocessor unusable exception loop servicing or exiting it.

See VR4300 user manual #6.4.1, or #6.3.5, Operating Modes.
2018-12-22 00:28:05 +01:00
Nabile Rahmani d2e3ddff14 Fixed incorrect masking for sub-word writes. 2018-12-19 15:43:20 +01:00
Nabile Rahmani ca014d07d6 Inline exception processing methods. 2018-12-11 19:39:32 +01:00
Nabile Rahmani dcf1766d73 Make the CPU SB/SH tests pass.
Implemented the LH opcode.

Something isn't quite right, as not all cases were fixed (RDP hello world works, but I8RLEVideo, I8VideoDecode and a few others still aren't totally right). Also, some games still incorrectly set the User mode among other bits in the status register.
2018-12-10 19:59:20 +01:00
Nabile Rahmani 48924bdfba Handle endianness on sub-word CPU reads (fixes garbled text on test ROMs).
- Added SD opcode for running some test ROMs.
- Quit the debugger when the N64 is powered off.
2018-11-29 04:39:23 +01:00
Nabile Rahmani 6132f8ec15 Compacted CP0 operation dictionaries. 2018-11-29 04:05:19 +01:00
Nabile Rahmani 18c8b8d041 Fixed branching comparisons not being signed.
Previously, it would cause infinite looping when iterating a value downwards, as the code relied on underflow logic to eventually return true in comparisons. With unsigned numbers, that would never occur.

Specifically, some ROMs iterate the TLB index down and used a BGEZ opcode.
2018-11-21 17:11:12 +01:00
Nabile Rahmani f9f2cd0250 Fixed casting on LD. 2018-06-21 20:47:29 +02:00
Nabile Rahmani 1d65c968e5 Fixed invalid casting on SRL. 2018-06-19 19:17:29 +02:00
Nabile Rahmani dade03d7f7 CPUADD wants these. 2018-06-17 07:47:39 +02:00
Nabile Rahmani a13aa374d3 Instruction: FromOpCode => From. 2018-06-09 18:56:57 +02:00
Nabile Rahmani 9762d813ba Ensure GPR[0] is zero. 2018-06-09 18:35:33 +02:00
Nabile Rahmani 40d0944418 SysAD: "value" => "data". 2018-06-09 18:31:15 +02:00
Nabile Rahmani a7972ebc0a Replaced CP0 register index abstract property by a readonly field. 2018-06-09 18:17:06 +02:00
Nabile Rahmani c15c1d0b18 Fixed exceptions not setting the correct branch delay value. 2018-06-09 18:10:39 +02:00
Nabile Rahmani eb41337dce CPU: refactored control flow and load/store methods, added new ops. 2018-06-09 17:40:52 +02:00
Nabile Rahmani dca7725258 Refactored CP0 stuff. 2018-06-05 20:44:13 +02:00
Nabile Rahmani 17e13ce564 FPU:
- Removed duplicate condition signal variable.
- Check for the unimplemented operation flag.
2018-06-05 17:19:02 +02:00
Nabile Rahmani ecab40e39e Added ops. 2018-01-24 17:21:08 +01:00
Nabile Rahmani a60f8a7dbf SLT comparison is *signed*, duh. 2018-01-24 16:31:36 +01:00
Nabile Rahmani 6caa80fb9a More ops. 2018-01-24 03:06:39 +01:00
Nabile Rahmani 1800179515 - Added the FPU.
- Added an exception handler for the FPU.
- Added constants for cartridges and fixed header properties.
- PIF HLE determines the console region for the saved register that's used by the OS.
- The disassembler shows CP1 opcodes.
2018-01-23 18:46:12 +01:00
Nabile Rahmani 8e076ff0ae Moved CP0.OpCode enum. 2018-01-17 17:30:01 +01:00
Nabile Rahmani 4ee50a1f7f Coprocessor, debugger, and exception stuff.
* VR4300.SystemControlUnit.cs: Implemented coprocessor operations.

* VR4300.ExceptionProcessing.cs: More exceptions.

* VR4300.Exceptions.cs: Support coprocessor ops.

* DotN64.csproj:
* VR4300.ICoprocessor.cs:

* VR4300.Instruction.cs: Implemented IEquatable to avoid boxing in
  dictionary key comparisons.
Added COPz for coprocessor ops.

* VR4300.OpCode.cs: Proper coprocessor ops.

* VR4300.cs: Added coprocessor unit support.

* Debugger.InstructionFormat.cs: (Slightly) take into account
  coprocessor ops.

* Debugger.cs: Using an instruction cursor to avoid confusion.
Fixed a case where the debugger would run a cycle despite exiting it.
Coprocessor ops aren't properly disassembled.
2018-01-17 10:34:02 +01:00
Nabile Rahmani da3a886d71 Move IP to a structure. 2018-01-02 15:34:22 +01:00
Nabile Rahmani 158f01ccf9 Exception processing, interrupts, registers. 2018-01-01 18:01:59 +01:00
Nabile Rahmani 08853d495f The CPU only supports 32-bit physical addresses.
No point in keeping the result of translated addresses 64-bit.
2017-12-20 01:50:44 +01:00
Nabile Rahmani b2ea1dbdb6 Changed casing to follow naming conventions. 2017-12-18 09:10:07 +01:00
Nabile Rahmani 17dbe71cef * VR4300.Exceptions.cs: Added a custom exception.
* VR4300.cs: Fixed SLLV/SRLV not downcasting a register source.

* Debugger.InstructionFormat.cs: Added some more formatting
  exceptions.

* Program.cs:
* Cartridge.cs:
* DotN64.csproj:
* RDRAM.cs:
* PeripheralInterface.cs:
* RDRAM.ConfigIndex.cs:
* RDRAM.ConfigRegister.cs:
* PeripheralInterface.CIC.cs:
* PeripheralInterface.CICStatus.cs:
* PeripheralInterface.DeviceState.cs:
* RealityCoprocessor.RDRAMInterface.cs:
* RealityCoprocessor.PeripheralInterface.cs:

* Nintendo64.cs: Added peripherals and rewiring.

* RealityCoprocessor.PeripheralInterface.StatusRegister.cs: Moved
  write register constants to an enum, too.

* BitHelper.cs: Better method signatures.
2017-12-18 08:50:25 +01:00
Nabile Rahmani 23b06e69b5 Huge changes (too lazy to separate).
* VR4300.SystemControlUnit.StatusRegister.cs: Removed unneeded
  value.

* VR4300.SystemControlUnit.cs: Renamed method.

* VR4300.Instruction.cs: Refactored instruction contents. Now
  individual parts can be written to as well.
It is also possible to strip an instruction to its bare opcode
  identifier, or even create one from a specified opcode, so this can
  be used as a key in a dictionary of operations.
A basic ToString implementation displays the opcode of the
  instruction.

* VR4300.OpCode.cs:
* VR4300.RegImmOpCode.cs:
* VR4300.SpecialOpCode.cs: Added opcodes.

* VR4300.cs: Unified operations into a single dictionary thanks to the
  instruction refactoring.
Added ops: JAL, SLTI, XORI, BLEZL, SB, LBU, SLT, BGEZL.

* Debugger.Command.cs: Basic display of what the command is about.

* Debugger.InstructionFormat.cs: First pass of the formatter.

* Debugger.cs: Proper disassembly of instructions. Stepping also
  displays the contents of registers.
~Infinite~ count argument for stepping/disassembling.
Refactored instruction fetch into using the CPU's SysAD bus (no need
  to manually access the N64's memory maps).

* DotN64.csproj:
* RealityCoprocessor.SignalProcessor.StatusRegister.cs:
* RealityCoprocessor.DisplayProcessor.StatusRegister.cs:
* RealityCoprocessor.RDRAMInterface.RDRAMConfigIndex.cs:
* RealityCoprocessor.RDRAMInterface.RDRAMConfigRegister.cs:

* MappingEntryExtensions.cs: Saves some typing.

* BitHelper.cs: Reusable methods.

* Nintendo64.cs: More memory maps.

* Program.cs: Minor changes.

* RealityCoprocessor.Interface.cs:
* RealityCoprocessor.AudioInterface.cs:
* RealityCoprocessor.VideoInterface.cs:
* RealityCoprocessor.SerialInterface.cs: Simplified mapping accesses.

* RealityCoprocessor.DisplayProcessor.cs: Added an actual register.
Simplified mapping accesses.

* RealityCoprocessor.MIPSInterface.cs: Added dummy version register
  read.
Simplified mapping accesses.

* RealityCoprocessor.PeripheralInterface.cs: Basic DMA.
Simplified mapping accesses.

* RealityCoprocessor.RDRAMInterface.cs: Removed constants that get set
  in the boot process.
Added RDRAM registers.
Simplified mapping accesses.

* RealityCoprocessor.SignalProcessor.cs: Better types for existing
  registers and handle status writes.
Simplified mapping accesses.
2017-12-11 15:04:53 +01:00
Nabile Rahmani a6ae17a345 Use SysAD pins instead of passing maps. 2017-11-21 12:59:59 +01:00
Nabile Rahmani 12f287ea12 Make delay slot accessible for the debugger. 2017-11-16 11:41:46 +01:00
Nabile Rahmani c323daf588 Moved the CPU in its own folder. 2017-11-04 16:28:09 +01:00