45 lines
937 B
Go
45 lines
937 B
Go
package go_inthex
|
|
|
|
type Region struct {
|
|
Address uint32
|
|
Data []byte
|
|
Extra []string
|
|
}
|
|
|
|
func (r *Region) IsContiguousAddress(addr uint32) bool {
|
|
return addr == (r.Address + uint32(len(r.Data)))
|
|
}
|
|
|
|
func (r *Region) Append(data []byte) {
|
|
r.Data = append(r.Data, data...)
|
|
}
|
|
|
|
type Stream struct {
|
|
Regions []Region
|
|
|
|
StartSegmentAddress uint32
|
|
StartLinearAddress uint32
|
|
}
|
|
|
|
// Data Returns a binary image, from the lowest base address
|
|
func (s *Stream) Data() (data []byte, baseAddress uint32) {
|
|
if len(s.Regions) == 0 {
|
|
return nil, 0
|
|
}
|
|
baseAddress = s.Regions[0].Address
|
|
topAddress := s.Regions[0].Address + uint32(len(s.Regions[0].Data))
|
|
|
|
for _, r := range s.Regions[1:] {
|
|
baseAddress = min(baseAddress, r.Address)
|
|
topAddress = min(topAddress, r.Address+uint32(len(r.Data)))
|
|
}
|
|
|
|
data = make([]byte, topAddress-baseAddress)
|
|
|
|
for _, r := range s.Regions {
|
|
copy(data[r.Address:], r.Data)
|
|
}
|
|
|
|
return data, baseAddress
|
|
}
|