Skip to content

Commit

Permalink
snes: exhirom: complete BusAddressToPak mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesDunne committed Jun 20, 2021
1 parent ecca4c1 commit 379a9b8
Show file tree
Hide file tree
Showing 2 changed files with 417 additions and 8 deletions.
87 changes: 79 additions & 8 deletions snes/mapping/exhirom/mapping.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,83 @@
package exhirom

import (
"sni/snes/mapping/util"
)
import "sni/snes/mapping/util"

// https://thepoorstudenthobbyist.com/2019/05/18/custom-pcb-explanation/#exhirom

func BusAddressToPak(busAddr uint32) uint32 {
if busAddr&0x8000 == 0 {
if busAddr >= 0x700000 && busAddr < 0x7E0000 {
sram := util.BankToLinear(busAddr-0x700000) + 0xE00000
if busAddr >= 0xC00000 && busAddr < 0x1_000000 {
// program area 1
// ROM access: $C0:0000-$FF:FFFF
rom := (busAddr & 0x3FFFFF) + 0x000000
return rom
} else if busAddr >= 0xA00000 && busAddr < 0xC00000 {
if busAddr&0x8000 != 0 {
// program area 1
// ROM access: $A0:8000-$BF:FFFF
rom := util.BankToLinear(busAddr&0x3F7FFF) + 0x000000
return rom
} else if busAddr&0x7FFF >= 0x6000 {
// TODO: A0-AF, B0-BF mirroring?
// SRAM access: $A0:6000-$BF:7FFF
bank := (busAddr >> 16) - 0xA0
sram := ((bank << 13) + (busAddr & 0x1FFF)) + 0xE00000
return sram
} else if busAddr >= 0x7E0000 && busAddr < 0x800000 {
wram := (busAddr - 0x7E0000) + 0xF50000
} else if busAddr&0xFFFF < 0x2000 {
// Lower 8KiB of WRAM: $A0:0000-$BF:1FFF
wram := (busAddr & 0x1FFF) + 0xF50000
return wram
}
} else if busAddr >= 0x800000 && busAddr < 0xA00000 {
if busAddr&0x8000 != 0 {
// program area 1
// ROM access: $80:8000-$9F:FFFF
rom := util.BankToLinear(busAddr&0x3F7FFF) + 0x000000
return rom
} else if busAddr&0xFFFF < 0x2000 {
// Lower 8KiB of WRAM: $80:0000-$9F:1FFF
wram := (busAddr & 0x1FFF) + 0xF50000
return wram
}
} else if busAddr >= 0x7E0000 && busAddr < 0x800000 {
// WRAM access:
wram := (busAddr - 0x7E0000) + 0xF50000
return wram
} else if busAddr >= 0x400000 && busAddr < 0x7E0000 {
// program area 2
// ROM access: $40:0000-$7D:FFFF
rom := (busAddr & 0x3FFFFF) + 0x400000
return rom
} else if busAddr >= 0x3E0000 && busAddr < 0x400000 {
if busAddr&0x8000 != 0 {
// program area 3 $3E-3F
// ROM access: $3E:8000-$3F:FFFF
rom := util.BankToLinear(busAddr&0x3F7FFF) + 0x400000
return rom
} else if busAddr&0xFFFF < 0x2000 {
// Lower 8KiB of WRAM: $00:0000-$1F:1FFF
wram := (busAddr & 0x1FFF) + 0xF50000
return wram
}
} else if busAddr >= 0x200000 && busAddr < 0x3E0000 {
if busAddr&0x8000 != 0 {
// program area 2
// ROM access: $20:8000-$3D:FFFF
rom := util.BankToLinear(busAddr&0x3F7FFF) + 0x400000
return rom
} else if busAddr&0xFFFF < 0x2000 {
// Lower 8KiB of WRAM: $00:0000-$1F:1FFF
wram := (busAddr & 0x1FFF) + 0xF50000
return wram
}
} else if busAddr >= 0x000000 && busAddr < 0x200000 {
if busAddr&0x8000 != 0 {
// program area 2
// ROM access: $00:8000-$1F:FFFF
rom := util.BankToLinear(busAddr&0x3F7FFF) + 0x400000
return rom
} else if busAddr&0xFFFF < 0x2000 {
// Lower 8KiB of WRAM: $00:0000-$1F:1FFF
wram := (busAddr & 0x1FFF) + 0xF50000
return wram
}
}
Expand All @@ -29,6 +94,7 @@ func PakAddressToBus(pakAddr uint32) uint32 {
}
// SRAM is a little more complex, but not much:
if pakAddr >= 0xE00000 && pakAddr < 0xF00000 {
// A0:6000-7FFF to BF:6000-7FFF
busAddr := pakAddr - 0xE00000
offs := busAddr & 0x1FFF
bank := (busAddr >> 13) & 0x1F
Expand All @@ -47,18 +113,23 @@ func PakAddressToBus(pakAddr uint32) uint32 {
if bank >= 0x7E {
bank += 0x80
}
// $00:8000-FFFF to $7D:8000-FFFF
// $FE:8000-FFFF to $FF:8000-FFFF
busAddr = (bank << 16) + (offs | 0x8000)
} else if pakAddr >= 0x7E0000 && pakAddr < 0x800000 {
// program ROM area 3 is top half of banks $3E and $3F
busAddr = pakAddr - 0x7E0000
offs := busAddr & 0x7FFF
bank := 0x3E + (busAddr >> 15)
// $3E:8000-FFFF to $3F:8000-FFFF
busAddr = (bank << 16) + (offs | 0x8000)
} else if pakAddr >= 0x400000 && pakAddr < 0x7E0000 {
// program ROM area 2 is full banks $40-$7D
// $40:0000-FFFF to $7D:0000-FFFF
busAddr = 0x400000 + (pakAddr & 0x3FFFFF)
} else {
// program ROM area 1 is full banks $C0-$FF
// $C0:0000-FFFF to $FF:0000-FFFF
busAddr = 0xC00000 + (pakAddr & 0x3FFFFF)
}
return busAddr
Expand Down
Loading

0 comments on commit 379a9b8

Please sign in to comment.