Skip to content

Commit

Permalink
snes: treat Unknown mapping as an error
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesDunne committed Jun 21, 2021
1 parent d34a7e1 commit 5e983df
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 19 deletions.
10 changes: 8 additions & 2 deletions snes/fxpakpro/device.go
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
12 changes: 10 additions & 2 deletions snes/luabridge/memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)))
Expand Down
33 changes: 20 additions & 13 deletions snes/mapping/translate.go
Original file line number Diff line number Diff line change
@@ -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
}
10 changes: 8 additions & 2 deletions snes/retroarch/raclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 5e983df

Please sign in to comment.