Skip to content

16 August 2026

M. T. Kimmins edited this page Aug 17, 2026 · 17 revisions

SUCCESSFUL CUSTOM DATA UPLOAD WITHOUT ERROR (see bottom of post)

YouTube link

Flashing pptest4.bin

From the post on 13 July 2026, I have vibe coded the dumper-flasher and flashed pptest4.bin. I have uploaded the result as a YouTube video.

The New Shield

Vibe coding the arduino sketch and the python application reveals that the shield works correctly! Very excited and proud. During the vibe coding, Claude highlighted the fact that I wired the pins incongruent with the arduino SPI library, so I opted for manual read/write without the library. The consequences of this is:

  • The user can match the arduino-chip pin pairs if their shield deviates from mine.
  • The read/write is slower than if I used the original library.

Results of the pptest4.bin Flash

Used Claude Sonnet to make a flasher (didn't learn my lesson). Seems much more capable now... The successful run of the cartridge with the modified data show that we can temporally expand the capabilities of the chip to the predicted ~35 min runtime (see time calculation). The next task will be to re-tackle hand-editing of a custom cartridge and flashing that.

Next Steps

  1. Make a "blank" slide that includes a proper header and minimal, blank payload.
  2. Make a "blank" light table that includes "on" and "off" commands.
  3. Locate the custom music file from previous.
  4. Delete Segment 4 data -> FF.
  5. Delete Segment 6 data -> FF.
  6. Change all Segment 4 pointers in Segment 1 to each point to Region 1 (0x4EE8).
  7. Keep Region 1.
  8. Mark Region 2 light data.
  9. Change Region 2 light data to on-off pattern (Item 2).
  10. Delete original Region 2 audio data.
  11. Insert custom music file (Item 3) in substitute for Region 2 audio data.
  12. Update Segment 1 pointers for remaining Segment 3 Regions.
  13. Run in John-K's dreamprojector successfully.
  14. Flash.
  15. Test and record.

Blank Audio Template

Explanation

  • We need a header (4 bytes of audio-only length, 2 bytes of frequency (conserved)).
    • A codec block is 40 bytes
    • The length of the header is 40 bytes = 0x28.
    • Remember little endian format (essentially backwards).
  • We need the minimal amount of bytes of audio (10 bytes = 1 packet; see this calculation).

Structure

Header Length

28 00 00 00

Header Frequency

80 3E

Blank Payload

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Full Template

28 00 00 00 80 3E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Blank Lights Table

Explanation

  • We need some data when the lights are expected. We can use the open and close signals in sequence without setting any light colours. This should produce the absence of any lights. See John-K's repository for information sources.

Opening Byte Sequence

04 F0 00

Closing Byte Sequence

04 F1 00

Full Sequence

04 F0 00 04 F1 00

*see below for rationale about using without a padding 00.

Test DP-1

Trying to load the custom payload in dreamprojector led to an error reading the segments. However, since I have truncated Segments 2.1, 2.2, Regions 3-12, and deleted Segment 4 and 6, I have reason to believe this is simply incompatible with an original cartridge read, but may work on the projector.

Test DP-1-C

  • Uploaded the full BSLSBS.bin as an initial control.
  • First slide played correctly. Second slide played briefly with very brief white-noise, then crashed.
  • This may suggest that the flasher program is faulty: potentially an error when reading files to upload (when those files are updated when the application is running, not updating its data in app after file is updated; indicated by wrong file length persisting in app after saved fix in ImHex).
  • The first slide read as Pokey Little Puppy as opposed to Big Shark Little Shark Baby Shark...

Test DP-1-X

  • Uploaded the full customBSLSBS.bin for real test.
  • Exactly the same file as Test DP-1-C, no changes.

Conclusions

  • We can confirm that Segments 2.1 and 2.2 are not necessary to run a cartridge.
  • We must double-check the custom music payload.
  • We must double-check the starter template (it is reading an unexpected story).

Next Steps Again

  • Troubleshooting this will need a clear ability to ensure the cartridge is erased, then overwritten.

Test DP-2

Attempts to extract the customBSLSBS.bin with dreamsmith was throwing an error. Upon second glance, I realized I had entered Region 2's pointer incorrectly in Segment 1. Fixed. Extraction command runs without error now.

Effects_XX.wav all are blank with no sound -- must confirm that these actually are acceptable in LTSDM.

Page_00.wav and Page_01.wav are also blank (as they should be).

Page_02.wav is page 1 of Pokey Little Puppy.

Page_03.wav and Page_04.wav are both about 4 seconds of white noise.

Page_05.wav onward are all blank.

Test DP-2 Updated

  • Copied a fragmented version of Page_02 from a verified BSLSBS copy -- overwritten the fragments from dreamsmith.
  • Copied a fragment version of custom audio to Page_03
  • Recompiled via dreamsmith, visualized by dreamprojector.
    • A concern is that the blank slides appear, but are noted as 0s duration with the progress bar stuck at the middle, unable to adjust.
  • Reflash the corrected compile. Cartridge played most of slide 1 of the true BSLSBS story, then close to the end (but not quite) abruptly crashed and rebooted. Why? Delayed timing could be another light-table issue...
  • Redumping what I flashed to check flasher integrity...
  • ...its not the same. I doesn't match. Checking if the flasher program says the re-dump matches itself...
  • Flasher does report a match, so the dump is consistent...
  • ACTUALLY: I see that the payload is the one I recompiled with dreamsmith, thus why it is different than expected (forgot about this, switched the payload last minute).

Evidently, I need to regroup and plan another test...

Proposed Test c16aug-dp

Goal

Create a custom payload that does not throw any errors, hold the minimal data required per Region, and cut out all unused data.

Procedure

Making the Payload

  • Rough out Segment 1; no real pointers yet.
  • Segment 2.1 = blank without lights
  • Segment 2.2 = blank without lights
  • Region 1 = BSLSBS slide 1 with OG lights
  • Regions 2-12 = 3-second sine-wave .a18 data with blank light table.
  • Segment 4 = FF
  • Segment 6 = FF
  • Manually set each Region's pointer address in Segment 1 (Segment 2.1, 2.2, Region 1-12, Region 12 repeating for Regions 13-24)
  • Ensure the rest of the payload is FF

John-K Suite Check - Frag (JKSC-F)

  • Take custom payload and fragment with dreamsmith extract
  • Validate each .WAV file (Region 1 and sine-wave beep for rest).

John-K Suite Check - DP (JKSC-DP)

  • Run custom payload through dreamprojector

Success State

JKSC-DP

  • Region 1 plays BSLSBS slide 1
  • Regions 2-12 plays 3 seconds of sine-wave beep, then rotates to next slide.

JKSC-F

  • Each .wav file plays without a crash.

Proposed Test c16aug-flash

Test c16aug-dp must pass before continuing with c16aug-flash

Goal

Successfully flash a fully-playable custom data payload. This will be the first ever custom upload that works, the dawn of a new era of LTSDM modding.

Procedure

  • use the Claude-made flasher to flash the green-lit .bin to the chip
  • video record the projector from startup to termination
  • if crash/errors
    • analyze video and record timestamped events

Success State

  • First slide plays slide 1 of BSLSBS with lights.
  • Second slide plays a sin-wave beep for 5 seconds.
  • Next slides rotate, flash the projector light, then immediately change to next slide until after slide 12
  • "Completed" sound

Next Steps

  • Fragment the pieces I want to include (3s sine-wave, BSLSBS slide 1, blank templates)
  • Build the custom payload
  • Manually set all the pointers in Segment 1
  • Test c16aug-dp

Further Observations

I was parousing through the light tables of known cartridge data, and noticed that some light terminations are different between Regions of the same cartridge.

Light Table Ending Bytes of BSLSBS.bin

Region (#) Opening Light Command (Hex) Second-Last Light Command (Hex) Terminating Light Command (Hex) Length of Light Table (Bytes) Terminating Byte Address (Hex)
1 04 F0 00 08 80 1C 81 1C (set red=28;green=28) 0C 80 08 81 08 F1 00 00 (set red=8;green=8;END;+00) 328 0xD875
2 04 F0 00 08 80 1E 81 1E (set red=30;green=30) 04 F1 00 00 (set END;+00) 142 0xF709
3 04 F0 00 08 80 21 82 21 (set red=33;green=33) 0C 80 02 82 02 F1 00 (set red=2;blue=2;END) 306 0x15331
4 04 F0 00 04 80 0C (set red=12) 04 F1 00 00 (set END;+00) 372 0x1B013
5 04 F0 00 04 82 14 (set blue=20) 04 F1 00 (set END) 292 0x1FA35
6 04 F0 00 04 80 09 (set red=9) 04 F1 00 00 (set END;+00) 494 0x24611
7 04 F0 00 04 80 21 (set red=33) 04 F1 00 00 (set END;+00) 302 0x27CB5
8 04 F0 00 04 80 0D (set red=13) 04 F1 00 (set END) 238 0x2B409
9 04 F0 00 08 80 0B 82 0E (set red=11;blue=14) 04 F1 00 (set END) 224 0x2E0D7
10 04 F0 00 08 81 0a 82 0B (set green=10;blue=11) 04 F1 00 00 (set END;+00) 1120 0x351AD
11 04 F0 00 08 80 0C 81 0C (set red=12;green=12) 04 F1 00 00 (set END;+00) 408 0x39513
12 04 F0 00 04 82 07 (set blue=7) 04 F1 00 00 (set END;+00) 184 0x3CB69

Conclusions

  • The first byte as suggested by John-K seems consistent.
  • Rereading John-K's Format.md, I see he mentions that 1 codec block is 40 bytes, not 10. Thus, I should experiment with having 40 bytes of blank...
  • Turning on and off the lights is like setting a channel.
  • Each light table ends on an odd byte (eg: 1,3,5,7,9,B,D,F). Thus, we could hypothesize that the extra 00 on some light tables is padding to get to an even byte for the next Region to start on.
    • Prima facie, it seems that this would mean that blank light tables must have two templates, one with 04 F1 00 and another with 04 F1 00 00. However, this is not the case, as one can rely on the .a18 codec to produce even sound data terminating on an odd byte -- properly aligning the light table beginning. Additionally, the 04 F0 00 04 F1 00 is 6 bytes long, thus terminating on an odd byte as required -- always. The blank light table should be just the short stop with no padding.
  • Each light table starts on an even byte (likely due to the pre-existing constraints of the .a18 codec).

UPDATE: Custom Audio Now Possible

I have successfully uploaded the minimally-viable custom audio that runs with no errors. This is the first successful upload of custom audio onto a Little Tikes Story Dream Machine cartridge ever (as I know it)!

Some fixes that helped:

  • turn each slide into a beep
  • figure out the padding rule of the light tables.
  • 40 bytes = 1 codec block
  • 1 second of audio = 50 codec blocks

⟵ Older Table of Contents Newer ⟶

Clone this wiki locally