diff --git a/rpcs3/Emu/Io/usio.cpp b/rpcs3/Emu/Io/usio.cpp
index 0bd9d9fd81..80d64c4ac5 100644
--- a/rpcs3/Emu/Io/usio.cpp
+++ b/rpcs3/Emu/Io/usio.cpp
@@ -40,10 +40,18 @@ void fmt_class_string<usio_btn>::format(std::string& out, u64 arg)
 struct usio_memory
 {
 	std::vector<u8> backup_memory;
-	std::vector<u8> last_game_status;
 
 	usio_memory(const usio_memory&) = delete;
 	usio_memory& operator=(const usio_memory&) = delete;
+
+	void init()
+	{
+		backup_memory.clear();
+		backup_memory.resize(chip_size * chip_count);
+	}
+
+	static constexpr usz chip_size = 0x10000;
+	static constexpr usz chip_count = 0x10;
 };
 
 usb_device_usio::usb_device_usio(const std::array<u8, 7>& location)
@@ -105,10 +113,6 @@ usb_device_usio::usb_device_usio(const std::array<u8, 7>& location)
 			.wMaxPacketSize   = 0x0008,
 			.bInterval        = 16}));
 
-	g_fxo->get<usio_memory>().backup_memory.clear();
-	g_fxo->get<usio_memory>().backup_memory.resize(0xB8);
-	g_fxo->get<usio_memory>().last_game_status.clear();
-	g_fxo->get<usio_memory>().last_game_status.resize(0x28);
 	load_backup();
 }
 
@@ -135,6 +139,8 @@ extern bool is_input_allowed();
 
 void usb_device_usio::load_backup()
 {
+	g_fxo->get<usio_memory>().init();
+
 	fs::file usio_backup_file;
 
 	if (!usio_backup_file.open(usio_backup_path, fs::read))
@@ -196,7 +202,7 @@ void usb_device_usio::translate_input()
 			return;
 		}
 
-		const std::size_t offset = (player * 8ULL);
+		const usz offset = (player * 8ULL);
 
 		const auto& cfg = ::at32(g_cfg_usio.players, pad_number);
 		cfg->handle_input(pad, false, [&](usio_btn btn, u16 /*value*/, bool pressed)
@@ -352,23 +358,14 @@ void usb_device_usio::usio_write(u8 channel, u16 reg, std::vector<u8>& data)
 	}
 	else if (channel >= 2)
 	{
-		usio_log.trace("Usio write of sram(chip: %d, addr: 0x%04X)", channel - 2, reg);
-		if (channel == 2)
-		{
-			switch (reg)
-			{
-			case 0x0000:
-			{
-				write_memory(g_fxo->get<usio_memory>().backup_memory);
-				break;
-			}
-			case 0x0180:
-			{
-				write_memory(g_fxo->get<usio_memory>().last_game_status);
-				break;
-			}
-			}
-		}
+		const u8 chip = channel - 2;
+		usio_log.trace("Usio write of sram(chip: %d, addr: 0x%04X)", chip, reg);
+		auto& memory = g_fxo->get<usio_memory>().backup_memory;
+		const usz addr_end = reg + data.size();
+		if (data.size() > 0 && chip < usio_memory::chip_count && addr_end <= usio_memory::chip_size)
+			std::memcpy(&memory[usio_memory::chip_size * chip + reg], data.data(), data.size());
+		else
+			usio_log.error("Usio sram invalid write operation(chip: %d, addr: 0x%04X, size: %x)", chip, reg, data.size());
 	}
 	else
 	{
@@ -434,50 +431,14 @@ void usb_device_usio::usio_read(u8 channel, u16 reg, u16 size)
 	}
 	else if (channel >= 2)
 	{
-		u8 chip = channel - 2;
+		const u8 chip = channel - 2;
 		usio_log.trace("Usio read of sram(chip: %d, addr: 0x%04X)", chip, reg);
-		switch (chip)
-		{
-		case 0:
-		{
-			switch (reg)
-			{
-			case 0x0000:
-			{
-				response = g_fxo->get<usio_memory>().backup_memory;
-				break;
-			}
-			case 0x0180:
-			{
-				response = g_fxo->get<usio_memory>().last_game_status;
-				break;
-			}
-			case 0x0200:
-			{
-				//ensure(size == 0x100);
-				// No data returned
-				break;
-			}
-			case 0x1000:
-			{
-				//ensure(size == 0x1000);
-				// No data returned
-				break;
-			}
-			default:
-			{
-				usio_log.error("Unhandled read of sram(chip: %d, addr: 0x%04X)", channel - 2, reg);
-				break;
-			}
-			}
-			break;
-		}
-		default:
-		{
-			usio_log.error("Unhandled read of sram(chip: %d, addr: 0x%04X)", channel - 2, reg);
-			break;
-		}
-		}
+		auto& memory = g_fxo->get<usio_memory>().backup_memory;
+		const usz addr_end = reg + size;
+		if (size > 0 && chip < usio_memory::chip_count && addr_end <= usio_memory::chip_size)
+			response.insert(response.end(), memory.begin() + (usio_memory::chip_size * chip + reg), memory.begin() + (usio_memory::chip_size * chip + addr_end));
+		else
+			usio_log.error("Usio sram invalid read operation(chip: %d, addr: 0x%04X, size: %x)", chip, reg, size);
 	}
 	else
 	{