Skip to content

Commit 558ab3a

Browse files
committed
moviecart fingerprinting
previously, we've relied on the file extension to be set to MVC but this is a poor solution because it means moviecarts with the .bin file extension are missed
1 parent b3d7c54 commit 558ab3a

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

cartridgeloader/loader.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package cartridgeloader
1717

1818
import (
19+
"bytes"
1920
"crypto/sha1"
2021
"fmt"
2122
"io"
@@ -245,6 +246,18 @@ func NewLoader(filename string, mapping string) (Loader, error) {
245246
}
246247
}
247248

249+
// if mapping value is still AUTO, make a special check for moviecart data.
250+
// we want to do this now so we can initialise the stream
251+
if cl.Mapping == "AUTO" {
252+
ok, err := fingerprintMovieCart(filename)
253+
if err != nil {
254+
return Loader{}, fmt.Errorf("catridgeloader: %w", err)
255+
}
256+
if ok {
257+
cl.Mapping = "MVC"
258+
}
259+
}
260+
248261
// create stream pointer only for streaming sources. these file formats are
249262
// likely to be very large by comparison to regular cartridge files.
250263
if cl.Mapping == "MVC" || (cl.Mapping == "AR" && cl.IsSoundData) {
@@ -256,6 +269,21 @@ func NewLoader(filename string, mapping string) (Loader, error) {
256269
return cl, nil
257270
}
258271

272+
// special handling for MVC files without the MVC file extension
273+
func fingerprintMovieCart(filename string) (bool, error) {
274+
f, err := os.Open(filename)
275+
if err != nil {
276+
return false, fmt.Errorf("cartridgeloader: %w", err)
277+
}
278+
b := make([]byte, 4)
279+
f.Read(b)
280+
f.Close()
281+
if bytes.Compare(b, []byte{'M', 'V', 'C', 0x00}) == 0 {
282+
return true, nil
283+
}
284+
return false, nil
285+
}
286+
259287
// NewLoaderFromEmbed initialises a loader with an array of bytes. Suitable for
260288
// loading embedded data (using go:embed for example) into the emulator.
261289
//

hardware/memory/cartridge/fingerprint.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,10 @@ func fingerprint256k(data []byte) func(*environment.Environment, []byte) (mapper
343343
func (cart *Cartridge) fingerprint(cartload cartridgeloader.Loader) error {
344344
var err error
345345

346+
// moviecart fingerprinting is done in cartridge loader. this is to avoid
347+
// loading the entire file into memory, which we definitely don't want to do
348+
// with moviecart files due to the large size
349+
346350
if ok := fingerprintElf(*cartload.Data, false); ok {
347351
cart.mapper, err = elf.NewElf(cart.env, cart.Filename, false)
348352
return err

0 commit comments

Comments
 (0)