mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Memory: move Read/Write8/16/32/64 and ReadCString into class
This commit is contained in:
		
							parent
							
								
									1ec9ed6827
								
							
						
					
					
						commit
						323990d402
					
				
					 11 changed files with 119 additions and 99 deletions
				
			
		|  | @ -49,9 +49,10 @@ static inline std::enable_if_t<std::is_integral_v<T>> CompOp(const GatewayCheat: | |||
|     } | ||||
| } | ||||
| 
 | ||||
| static inline void LoadOffsetOp(const GatewayCheat::CheatLine& line, State& state) { | ||||
| static inline void LoadOffsetOp(Memory::MemorySystem& memory, const GatewayCheat::CheatLine& line, | ||||
|                                 State& state) { | ||||
|     u32 addr = line.address + state.offset; | ||||
|     state.offset = Memory::Read32(addr); | ||||
|     state.offset = memory.Read32(addr); | ||||
| } | ||||
| 
 | ||||
| static inline void LoopOp(const GatewayCheat::CheatLine& line, State& state) { | ||||
|  | @ -154,7 +155,7 @@ static inline void PatchOp(const GatewayCheat::CheatLine& line, State& state, Co | |||
|             state.current_line_nr++; | ||||
|         } | ||||
|         first = !first; | ||||
|         Memory::Write32(addr, tmp); | ||||
|         system.Memory().Write32(addr, tmp); | ||||
|         addr += 4; | ||||
|         num_bytes -= 4; | ||||
|     } | ||||
|  | @ -162,7 +163,7 @@ static inline void PatchOp(const GatewayCheat::CheatLine& line, State& state, Co | |||
|         u32 tmp = (first ? cheat_lines[state.current_line_nr].first | ||||
|                          : cheat_lines[state.current_line_nr].value) >> | ||||
|                   bit_offset; | ||||
|         Memory::Write8(addr, tmp); | ||||
|         system.Memory().Write8(addr, tmp); | ||||
|         addr += 1; | ||||
|         num_bytes -= 1; | ||||
|         bit_offset += 8; | ||||
|  | @ -205,6 +206,14 @@ GatewayCheat::~GatewayCheat() = default; | |||
| void GatewayCheat::Execute(Core::System& system) { | ||||
|     State state; | ||||
| 
 | ||||
|     Memory::MemorySystem& memory = system.Memory(); | ||||
|     auto Read8 = [&memory](VAddr addr) { return memory.Read8(addr); }; | ||||
|     auto Read16 = [&memory](VAddr addr) { return memory.Read16(addr); }; | ||||
|     auto Read32 = [&memory](VAddr addr) { return memory.Read32(addr); }; | ||||
|     auto Write8 = [&memory](VAddr addr, u8 value) { memory.Write8(addr, value); }; | ||||
|     auto Write16 = [&memory](VAddr addr, u16 value) { memory.Write16(addr, value); }; | ||||
|     auto Write32 = [&memory](VAddr addr, u32 value) { memory.Write32(addr, value); }; | ||||
| 
 | ||||
|     for (state.current_line_nr = 0; state.current_line_nr < cheat_lines.size(); | ||||
|          state.current_line_nr++) { | ||||
|         auto line = cheat_lines[state.current_line_nr]; | ||||
|  | @ -247,63 +256,61 @@ void GatewayCheat::Execute(Core::System& system) { | |||
|             break; | ||||
|         case CheatType::Write32: | ||||
|             // 0XXXXXXX YYYYYYYY - word[XXXXXXX+offset] = YYYYYYYY
 | ||||
|             WriteOp<u32>(line, state, &Memory::Write32, system); | ||||
|             WriteOp<u32>(line, state, Write32, system); | ||||
|             break; | ||||
|         case CheatType::Write16: | ||||
|             // 1XXXXXXX 0000YYYY - half[XXXXXXX+offset] = YYYY
 | ||||
|             WriteOp<u16>(line, state, &Memory::Write16, system); | ||||
|             WriteOp<u16>(line, state, Write16, system); | ||||
|             break; | ||||
|         case CheatType::Write8: | ||||
|             // 2XXXXXXX 000000YY - byte[XXXXXXX+offset] = YY
 | ||||
|             WriteOp<u8>(line, state, &Memory::Write8, system); | ||||
|             WriteOp<u8>(line, state, Write8, system); | ||||
|             break; | ||||
|         case CheatType::GreaterThan32: | ||||
|             // 3XXXXXXX YYYYYYYY - Execute next block IF YYYYYYYY > word[XXXXXXX]   ;unsigned
 | ||||
|             CompOp<u32>(line, state, &Memory::Read32, | ||||
|                         [&line](u32 val) -> bool { return line.value > val; }); | ||||
|             CompOp<u32>(line, state, Read32, [&line](u32 val) -> bool { return line.value > val; }); | ||||
|             break; | ||||
|         case CheatType::LessThan32: | ||||
|             // 4XXXXXXX YYYYYYYY - Execute next block IF YYYYYYYY < word[XXXXXXX]   ;unsigned
 | ||||
|             CompOp<u32>(line, state, &Memory::Read32, | ||||
|                         [&line](u32 val) -> bool { return line.value < val; }); | ||||
|             CompOp<u32>(line, state, Read32, [&line](u32 val) -> bool { return line.value < val; }); | ||||
|             break; | ||||
|         case CheatType::EqualTo32: | ||||
|             // 5XXXXXXX YYYYYYYY - Execute next block IF YYYYYYYY == word[XXXXXXX]   ;unsigned
 | ||||
|             CompOp<u32>(line, state, &Memory::Read32, | ||||
|             CompOp<u32>(line, state, Read32, | ||||
|                         [&line](u32 val) -> bool { return line.value == val; }); | ||||
|             break; | ||||
|         case CheatType::NotEqualTo32: | ||||
|             // 6XXXXXXX YYYYYYYY - Execute next block IF YYYYYYYY != word[XXXXXXX]   ;unsigned
 | ||||
|             CompOp<u32>(line, state, &Memory::Read32, | ||||
|             CompOp<u32>(line, state, Read32, | ||||
|                         [&line](u32 val) -> bool { return line.value != val; }); | ||||
|             break; | ||||
|         case CheatType::GreaterThan16WithMask: | ||||
|             // 7XXXXXXX ZZZZYYYY - Execute next block IF YYYY > ((not ZZZZ) AND half[XXXXXXX])
 | ||||
|             CompOp<u16>(line, state, &Memory::Read16, [&line](u16 val) -> bool { | ||||
|             CompOp<u16>(line, state, Read16, [&line](u16 val) -> bool { | ||||
|                 return static_cast<u16>(line.value) > (static_cast<u16>(~line.value >> 16) & val); | ||||
|             }); | ||||
|             break; | ||||
|         case CheatType::LessThan16WithMask: | ||||
|             // 8XXXXXXX ZZZZYYYY - Execute next block IF YYYY < ((not ZZZZ) AND half[XXXXXXX])
 | ||||
|             CompOp<u16>(line, state, &Memory::Read16, [&line](u16 val) -> bool { | ||||
|             CompOp<u16>(line, state, Read16, [&line](u16 val) -> bool { | ||||
|                 return static_cast<u16>(line.value) < (static_cast<u16>(~line.value >> 16) & val); | ||||
|             }); | ||||
|             break; | ||||
|         case CheatType::EqualTo16WithMask: | ||||
|             // 9XXXXXXX ZZZZYYYY - Execute next block IF YYYY = ((not ZZZZ) AND half[XXXXXXX])
 | ||||
|             CompOp<u16>(line, state, &Memory::Read16, [&line](u16 val) -> bool { | ||||
|             CompOp<u16>(line, state, Read16, [&line](u16 val) -> bool { | ||||
|                 return static_cast<u16>(line.value) == (static_cast<u16>(~line.value >> 16) & val); | ||||
|             }); | ||||
|             break; | ||||
|         case CheatType::NotEqualTo16WithMask: | ||||
|             // AXXXXXXX ZZZZYYYY - Execute next block IF YYYY <> ((not ZZZZ) AND half[XXXXXXX])
 | ||||
|             CompOp<u16>(line, state, &Memory::Read16, [&line](u16 val) -> bool { | ||||
|             CompOp<u16>(line, state, Read16, [&line](u16 val) -> bool { | ||||
|                 return static_cast<u16>(line.value) != (static_cast<u16>(~line.value >> 16) & val); | ||||
|             }); | ||||
|             break; | ||||
|         case CheatType::LoadOffset: | ||||
|             // BXXXXXXX 00000000 - offset = word[XXXXXXX+offset]
 | ||||
|             LoadOffsetOp(line, state); | ||||
|             LoadOffsetOp(system.Memory(), line, state); | ||||
|             break; | ||||
|         case CheatType::Loop: { | ||||
|             // C0000000 YYYYYYYY - LOOP next block YYYYYYYY times
 | ||||
|  | @ -343,32 +350,32 @@ void GatewayCheat::Execute(Core::System& system) { | |||
|         } | ||||
|         case CheatType::IncrementiveWrite32: { | ||||
|             // D6000000 XXXXXXXX – (32bit) [XXXXXXXX+offset] = reg ; offset += 4
 | ||||
|             IncrementiveWriteOp<u32>(line, state, &Memory::Write32, system); | ||||
|             IncrementiveWriteOp<u32>(line, state, Write32, system); | ||||
|             break; | ||||
|         } | ||||
|         case CheatType::IncrementiveWrite16: { | ||||
|             // D7000000 XXXXXXXX – (16bit) [XXXXXXXX+offset] = reg & 0xffff ; offset += 2
 | ||||
|             IncrementiveWriteOp<u16>(line, state, &Memory::Write16, system); | ||||
|             IncrementiveWriteOp<u16>(line, state, Write16, system); | ||||
|             break; | ||||
|         } | ||||
|         case CheatType::IncrementiveWrite8: { | ||||
|             // D8000000 XXXXXXXX – (16bit) [XXXXXXXX+offset] = reg & 0xff ; offset++
 | ||||
|             IncrementiveWriteOp<u8>(line, state, &Memory::Write8, system); | ||||
|             IncrementiveWriteOp<u8>(line, state, Write8, system); | ||||
|             break; | ||||
|         } | ||||
|         case CheatType::Load32: { | ||||
|             // D9000000 XXXXXXXX – reg = [XXXXXXXX+offset]
 | ||||
|             LoadOp<u32>(line, state, &Memory::Read32); | ||||
|             LoadOp<u32>(line, state, Read32); | ||||
|             break; | ||||
|         } | ||||
|         case CheatType::Load16: { | ||||
|             // DA000000 XXXXXXXX – reg = [XXXXXXXX+offset] & 0xFFFF
 | ||||
|             LoadOp<u16>(line, state, &Memory::Read16); | ||||
|             LoadOp<u16>(line, state, Read16); | ||||
|             break; | ||||
|         } | ||||
|         case CheatType::Load8: { | ||||
|             // DB000000 XXXXXXXX – reg = [XXXXXXXX+offset] & 0xFF
 | ||||
|             LoadOp<u8>(line, state, &Memory::Read8); | ||||
|             LoadOp<u8>(line, state, Read8); | ||||
|             break; | ||||
|         } | ||||
|         case CheatType::AddOffset: { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue