diff --git a/snes/fxpakpro/device.go b/snes/fxpakpro/device.go index ba5401a..f899811 100644 --- a/snes/fxpakpro/device.go +++ b/snes/fxpakpro/device.go @@ -80,12 +80,15 @@ func (d *Device) MultiReadMemory( Data: make([]byte, read.Size), } - mrsp[j].DeviceAddress = mapping.TranslateAddress( + mrsp[j].DeviceAddress, err = mapping.TranslateAddress( read.RequestAddress, read.RequestAddressSpace, d.Mapping, sni.AddressSpace_FxPakPro, ) + if err != nil { + return nil, err + } } // Break up larger reads (> 255 bytes) into 255-byte chunks: @@ -219,12 +222,15 @@ func (d *Device) MultiWriteMemory( Size: len(write.Data), } - mrsp[j].DeviceAddress = mapping.TranslateAddress( + mrsp[j].DeviceAddress, err = mapping.TranslateAddress( write.RequestAddress, write.RequestAddressSpace, d.Mapping, sni.AddressSpace_FxPakPro, ) + if err != nil { + return nil, err + } } // Break up larger writes (> 255 bytes) into 255-byte chunks: diff --git a/snes/luabridge/memory.go b/snes/luabridge/memory.go index f18803a..fcdb445 100644 --- a/snes/luabridge/memory.go +++ b/snes/luabridge/memory.go @@ -32,12 +32,16 @@ func (d *Device) MultiReadMemory(ctx context.Context, reads ...snes.MemoryReadRe rsp = make([]snes.MemoryReadResponse, len(reads)) for j, read := range reads { - addr := mapping.TranslateAddress( + var addr uint32 + addr, err = mapping.TranslateAddress( read.RequestAddress, read.RequestAddressSpace, d.Mapping, sni.AddressSpace_SnesABus, ) + if err != nil { + return + } sb := bytes.NewBuffer(make([]byte, 0, 64)) _, _ = fmt.Fprintf(sb, "Read|%d|%d\n", addr, read.Size) @@ -92,12 +96,16 @@ func (d *Device) MultiWriteMemory(ctx context.Context, writes ...snes.MemoryWrit rsp = make([]snes.MemoryWriteResponse, len(writes)) for j, write := range writes { - addr := mapping.TranslateAddress( + var addr uint32 + addr, err = mapping.TranslateAddress( write.RequestAddress, write.RequestAddressSpace, d.Mapping, sni.AddressSpace_SnesABus, ) + if err != nil { + return + } // preallocate enough space to write the whole command: sb := bytes.NewBuffer(make([]byte, 0, 24 + 4*len(write.Data))) diff --git a/snes/mapping/translate.go b/snes/mapping/translate.go index 6255422..de59183 100644 --- a/snes/mapping/translate.go +++ b/snes/mapping/translate.go @@ -1,53 +1,60 @@ package mapping import ( + "fmt" "sni/protos/sni" "sni/snes/mapping/exhirom" "sni/snes/mapping/hirom" "sni/snes/mapping/lorom" ) +var ErrUnknownMapping = fmt.Errorf("cannot map an address with an Unknown mapping; call MappingDetect or MappingSet first") + func TranslateAddress( address uint32, space sni.AddressSpace, mapping sni.MemoryMapping, deviceSpace sni.AddressSpace, -) uint32 { +) (deviceAddress uint32, err error) { switch space { case sni.AddressSpace_Raw: - return address + return address, nil case sni.AddressSpace_FxPakPro: switch deviceSpace { case sni.AddressSpace_Raw: - return address + return address, nil case sni.AddressSpace_FxPakPro: - return address + return address, nil case sni.AddressSpace_SnesABus: switch mapping { case sni.MemoryMapping_LoROM: - return lorom.PakAddressToBus(address) + return lorom.PakAddressToBus(address), nil case sni.MemoryMapping_HiROM: - return hirom.PakAddressToBus(address) + return hirom.PakAddressToBus(address), nil case sni.MemoryMapping_ExHiROM: - return exhirom.PakAddressToBus(address) + return exhirom.PakAddressToBus(address), nil + default: + return 0, ErrUnknownMapping } } case sni.AddressSpace_SnesABus: switch deviceSpace { case sni.AddressSpace_Raw: - return address + return address, nil case sni.AddressSpace_SnesABus: - return address + return address, nil case sni.AddressSpace_FxPakPro: switch mapping { case sni.MemoryMapping_LoROM: - return lorom.BusAddressToPak(address) + return lorom.BusAddressToPak(address), nil case sni.MemoryMapping_HiROM: - return hirom.BusAddressToPak(address) + return hirom.BusAddressToPak(address), nil case sni.MemoryMapping_ExHiROM: - return exhirom.BusAddressToPak(address) + return exhirom.BusAddressToPak(address), nil + default: + return 0, ErrUnknownMapping } } } - return address + return address, nil } diff --git a/snes/retroarch/raclient.go b/snes/retroarch/raclient.go index 9908d85..097f619 100644 --- a/snes/retroarch/raclient.go +++ b/snes/retroarch/raclient.go @@ -116,12 +116,15 @@ func (c *RAClient) MultiReadMemory(context context.Context, reads ...snes.Memory Data: make([]byte, 0, read.Size), } - mrsp[j].DeviceAddress = mapping.TranslateAddress( + mrsp[j].DeviceAddress, err = mapping.TranslateAddress( read.RequestAddress, read.RequestAddressSpace, c.Mapping, sni.AddressSpace_SnesABus, ) + if err != nil { + return nil, err + } } // build multiple requests: @@ -277,12 +280,15 @@ func (c *RAClient) MultiWriteMemory(context context.Context, writes ...snes.Memo Size: len(write.Data), } - mrsps[i].DeviceAddress = mapping.TranslateAddress( + mrsps[i].DeviceAddress, err = mapping.TranslateAddress( write.RequestAddress, write.RequestAddressSpace, c.Mapping, sni.AddressSpace_SnesABus, ) + if err != nil { + return nil, err + } } for j, write := range writes {