The Curious Engineer

All blogs / Retro computing

Bumbershoot Software

bumbershootsoft.wordpress.com

An Umbrella Site for Michael Martin's software experiments

Retro computingAssemblyZX Spectrum / SinclairCommodore 8-bitApple / classic Mac

Posts
433 from 23 Apr 2014 to 24 Oct 2026
Posting
weekly (53 in the last year)
Kind
personal blog
Feed
https://bumbershootsoft.wordpress.com/feed/

2026 44

  1. Porting Simulated Evolution to GS/OS
  2. Making a Better Simulated Evolution Port for the Apple IIgs
  3. Trying Out the New VBCC-65816 Compiler
  4. Book Reports from VCF West
  5. Digital Audio on the ZX Spectrum’s 1-Bit Beeper
  6. Unfinished Business with 1-Bit Audio Chords
  7. Designing Cycle-Exact Delays on Several 8-Bit CPUs
  8. ZX Spectrum: Experimenting With 1-Bit Sound
  9. Spectrum Shooting Gallery: Taking Back What We’ve Learned
  10. Vintage Computer Fair West 2026
  11. ZX Spectrum System Tour: Memory Mapping
  12. ZX Spectrum: Comparing Notes With an Old Hand
  13. ZX Spectrum System Tour: Sound
  14. Finishing the ZX Spectrum Shooting Gallery
  15. Starting the ZX Spectrum Shooting Gallery In Earnest
  16. Spritework on the ZX Spectrum: Rendering Without Flickering
  17. Spritework on the ZX Spectrum: Rendering
  18. Spritework on the ZX Spectrum: Preparing Our Graphics
  19. Interlude: Using the Index Registers Effectively on the Z80
  20. Programming the ZX Spectrum’s Bitmap Display
  21. Interlude: Spectrum vs. C64 BASIC Showdown
  22. ZX Spectrum System Tour: Text Mode
  23. Giving the ZX Spectrum a Fair Shake
  24. Simulated Evolution on the PICO-8
  25. Comparing an LZ4 Decompressor on Four Legacy CPUs
  26. Comparing the Z80 and 6502 to Their Relatives
  27. Staying a Spell with the Exidy Sorcerer
  28. Testing Out the ARMIPS Assembler on the Xorshift PRNGs
  29. Mega Drive development with ASMotor
  30. Some Subtleties When Parsing 6502 Assembly Language
  31. Reversing and Replicating Compute!’s MLX
  32. Ophis 2.3 Released
  33. Onefiling
  34. Playing Around With the C64 Ultimate
  35. Designing a Game Board for the TMS9918A
  36. C64: Putting Sprite Multiplexing to Work
  37. Spritework on the Commodore 64
  38. Sprite Graphics Traditions
  39. Skipping the ColecoVision’s Boot Screen
  40. TI-99/4A: Revisiting Implementation Strategies
  41. TI-99/4A: Hybrid Software Development
  42. TI-99/4A: Leaning More Heavily on the Firmware
  43. Type-In Rescue: The C64 Autoboot Generator
  44. Dissecting a C64 Autoboot Program

2025 46

  1. 2025 Compilation and Review
  2. Poking a Little Harder at PICO-8
  3. Smooth Scrolling on the Sega Master System
  4. Sega Master System: Using ALL the Colors
  5. Sega Master System: Fancier Tile Graphics
  6. Sega Master System: Program Walkthroughs
  7. Sega Master System Part 2: Mode 4 on the Mark III
  8. The Sega Master System
  9. Some Fun Videos on Optimizing NES Code
  10. Author, Director, Performer, Audience
  11. A Simple SDL/OpenGL Pixmap Framework
  12. Sharp Bilinear Filters: Big Clean Pixels for Pixel Art
  13. Upgrading Our Way Through the Rest of OpenGL
  14. Upgrading Our Way Through OpenGL 1.x
  15. Doing Pixel Work With Modern Languages
  16. Programming the TMS9918A Video Display Processor
  17. Exploring the TMS9918’s Graphics Modes
  18. Shooting Gallery: Touring the MSX1’s Capabilities
  19. ColecoVision: The Shooting Gallery Platform Layer
  20. Children of the TI: Write Once, Run Anywhere
  21. Intermission: VCFW 2025
  22. Creating Our Own SG-1000 BIOS
  23. Children of the TI
  24. Genesis CCA: Special Effects and Final Polish
  25. LZ4 Decompression on the 68000
  26. Genesis: Refining the Logo Graphics
  27. Re-Optimizing the CCA on the Genesis
  28. Lights-Out C64: Parity With the NES
  29. Revisiting an Old C64 Project
  30. Cleaning Up My Z80 Projects
  31. Polishing the “Improvised Genesis Toolchain”
  32. More Watcom: Fixing Interrupt Handlers in DOS’s Tiny Model
  33. Trying Out OpenWatcom
  34. 2025 Hiatus: Proof of Life
  35. 2025 Hiatus
  36. A Tour of Z80 Cross-Assemblers
  37. TI-99/4A: A Detailed Code Walkthrough
  38. TI-99/4A: Finishing Our Preparations
  39. Writing Cartridge Software for the TI-99/4A
  40. The 8-Bit Era’s Weird Uncle: The TI-99/4A
  41. Reversing the Xorshift* PRNG
  42. Something Different: WebAssembly Without Emscripten
  43. Linked Lists Without Pointers
  44. Implementing Linked Lists on a 32-bit CPU
  45. Linked Lists and Typed Arenas
  46. 2024 Compilation and Retrospective

2024 52

  1. A Modern Implementation of the Shooting Gallery Project
  2. Amiga 500: Finishing the Shooting Gallery Project
  3. Amiga 500: Completing a Simple Game
  4. Amiga 500: A Sprite Rendering Engine
  5. Spritework on the Amiga 500
  6. Atari 800: Direct Screen Memory Access from BASIC
  7. Sprite Multiplication on the Atari 800
  8. Atari 800: Implementing a Simple Game
  9. Atari 800: Next-Generation Playfields
  10. Spritework on the Atari 800
  11. A Musical Interlude
  12. Atari 2600: Completing the Shooting Gallery
  13. Atari 2600: Successfully Multiplexing Sprites
  14. Atari 2600: Mid-Screen Sprite Updates
  15. Atari 2600: Multiplying Our Sprites
  16. Atari 2600: SkipDraw
  17. Atari 2600: Input, Missiles, and Collisions
  18. Atari 2600: Playfields and Scoring
  19. Spritework on the Atari 2600
  20. Amiga 500: Direct Keyboard Access
  21. Amiga 500: Bare-Metal Startup Code
  22. Ophis 2.2 Released
  23. Amiga 500: Using Our Full Power
  24. Amiga 500: Completing The Display
  25. Amiga 500: Alternate Graphics Memory Layouts
  26. Amiga 500: Mode Switching
  27. Amiga 500 Interlude: Nasal Demons
  28. Amiga 500: Drawing a Bitmap on the Bare Metal
  29. Amiga 500: The Original Chip Set
  30. Looting GW-BASIC: Text UIs
  31. Looting GW-BASIC: The Music Macro System
  32. Taking Inventory of GW-BASIC
  33. Porting the SIMD Mandelbrot Generator to the 64-bit Windows ABI
  34. A Complex SVN-to-Git Conversion, Part 3: Forging a History
  35. A Complex SVN-to-Git Migration, Part 2: Interrogating Git Internals
  36. A Complex SVN-to-Git Migration, Part 1: Cooperating With Subversion
  37. The Many Faces of Retrocomputing
  38. Noodling With Nonograms
  39. Softsoniq: Cycle-counting Out Polyphonic Music
  40. Flood Fills on the CoCo and the Dragon
  41. Building a Bitmap Graphics Library for the Dragon
  42. A Closer Look at Bresenham’s Algorithm
  43. Text I/O and Graphics Modes on the Dragon/CoCo
  44. The Dragon Roars
  45. LZ4 Decompression on the 6809
  46. Cross-Platform Development for the TRS-80 CoCo and Dragon
  47. The Year of the Dragon
  48. Archie Teaches BASIC
  49. Optimizing Mandelbrot Generation with SIMD
  50. Rendering the Mandelbrot Set
  51. Playing with PICO-8
  52. Out of the Ivory Tower: Advent of Code 2023 in Scheme

2023 49

  1. Bumbershoot Software 2023 Compilation
  2. Bumbershoot Software in 2023
  3. SNES CCA: Bells and Whistles
  4. SNES CCA: A Completed First Draft
  5. SNES: From Sounds to Music
  6. Designing and Building a SNES Music Player
  7. SNES: Digital Audio Playback
  8. The CCA on the SNES, Part 2: Implementation and Analysis
  9. The CCA on the SNES, Part 1: Designing the Inner Loop
  10. Two Xorshift PRNGs for the 65816
  11. LZ4 Decompression on the 65816
  12. DMA and FastROM on the SNES: Speed At Any Cost
  13. SNES: Scrolling and Updating Our Pseudo-Bitmap
  14. SNES: Implementing Pseudo-Bitmap Semigraphics
  15. Our First SNES Program
  16. SNES Graphics Data
  17. Memory Layouts and Linking Scripts on the SNES
  18. The Super Nintendo Entertainment System
  19. Exploring our OpenGL Shader Scaffold Design
  20. Building a Shader Scaffolding for OpenGL
  21. Classic Digital Audio on Modern Systems
  22. Classic Mac: Taking Apart Process Startup
  23. Classic Mac: More Aggressive Backcompatibility
  24. Apple IIgs: Wrap-Up and Retrospective
  25. Apple IIgs: A Large, Multi-Segment Program
  26. Apple IIgs Digital Sound (With Bonus Console Output)
  27. Apple IIgs Digital Sound: Preparations
  28. Apple IIgs: From ProDOS 8 to GS/OS
  29. Apple IIgs: Text in Graphics Mode
  30. Apple IIgs: Dunking on EGA
  31. Interlude: Blitting With the 65816 CPU
  32. Apple IIgs: Super High-Res Mode
  33. Apple IIgs: Meeting the 65816 CPU
  34. Meeting the Apple IIgs
  35. Back to the Apple II
  36. Release: Simulated Evolution for the Classic Mac OS
  37. MacSimEvo: Dialog Boxes
  38. MacSimEvo: Toggles and Warp Mode
  39. MacSimEvo: A Kitbashed Prototype
  40. Source Release: Flight of the Hummingbird and the Atrocitron
  41. Classic Mac Development: From C to Machine Code
  42. MacSimEvo: Porting and Testing the Asm Utils
  43. Classic Mac Development: System 7 Support
  44. Classic Mac Development: Application Icons
  45. Classic Mac Development: The Rest of the UI
  46. Classic Mac Development: Modern VCS
  47. Classic Mac Development: Beginning in Earnest
  48. Classic Mac Development: Adventures in Period Tooling
  49. 2022 Compilation and Retrospective

2022 37

  1. Digital Sound Playback on the C64
  2. Digital Sound Playback on the NES
  3. Cleanly Organizing 8-Bit Dataflows
  4. NES: Programming the UNROM
  5. NES: Creating an UNROM image
  6. NES: Beyond 40KB
  7. Amiga 500: Digital Sound
  8. Release: Simulated Evolution for the Amiga
  9. Amiga 500: Simulated Evolution’s Platform Layer
  10. Memory Models and Far Pointers
  11. Amiga 500: Time, Windows, and Direct Device Access
  12. Custom printf: Wrapping Variadic Functions in C
  13. Amiga 500: Our First Real GUI Program
  14. Amiga 500: Dead Ends and Side Paths
  15. Amiga 500: Icons and Program Info
  16. Amiga 500: Making Our Best Console Apps
  17. Amiga 500: How Libraries Work and How to Use Them
  18. Cross-Platform Development for the Amiga 500
  19. A New Friend: Let’s Play Amiga Workbench 1.3!
  20. Something Different: JavaScript Toolchains
  21. Lights-Out NES: Release and Design Retrospective
  22. Lights-Out NES: Input Polish
  23. NES Lights-Out: Animation Polish
  24. Lights-Out NES: The Main Game Logic
  25. Lights-Out NES: Sprite Graphics
  26. Lights-Out NES: Pressing START to Begin
  27. Lights-Out NES: A Deep Breath Before the Plunge
  28. Lights-Out NES: Graphics Driver
  29. Lights-Out NES: Content Creation
  30. Hello World on the NES, Byte by Byte
  31. Linking Scripts in ld65
  32. The NES: A Hardware Summary and a New Project
  33. Type-in Rescue: Quadrun
  34. Type-in Rescue: Mini-Invaders
  35. Touring the TRS-80’s Capabilities
  36. Poking at the TRS-80 Model III
  37. 2021 Compilation

2021 18

  1. DirectX9: Completing a Simple Sprite Engine
  2. Interlude: Image Decoding
  3. Interlude: Resource Systems
  4. DirectX 9: Textures as Sprites
  5. Simulated Evolution on Two 16-Bit Machines
  6. Finishing up Portrait of Liberty ST
  7. Timing on the Atari ST
  8. Atari ST: The AY-3-8910 Sound Chip
  9. Bumbershoot Indices
  10. Atari ST: Medium and High Resolution
  11. Line-A Flood Fills
  12. Writing Our First Atari ST Programs
  13. A Cross-Development Toolchain For the Atari ST
  14. DirectX 9: Rewarded as a Traitor Deserves
  15. Simulated Evolution on Two 8-Bit Machines
  16. Atari 800: Making Proper Use of Display Lists
  17. Atari 800: A Custom Graphics Display
  18. A Grimoire of 8-Bit Implementation Patterns

2020 18

  1. C64 Startup Code In Detail
  2. Building a Faster C64 Bitmap Library
  3. DirectX 9: A Sudden, but Inevitable, Betrayal
  4. Making Use Of Our New DX9 Pixmap Library
  5. DirectX 9: A Working Pixmap Module
  6. Aspect-corrected Image Scaling with DirectX 9
  7. DirectX 9: Drawing Some Pixels and Living to Tell the Tale
  8. DirectX 9: The Newest Old Thing
  9. Restoring Traditional OOP to Go
  10. Simulated Evolution
  11. Fixed-Point: When Integers Aren’t Integers
  12. 2019 Compilation
  13. Raw Win32: Dialog Boxes
  14. Raw Win32: Icons and Resource Files
  15. Raw Win32: A Properly Resizable Custom Widget
  16. Raw Win32: Menus
  17. Raw Win32: User Input and Game Logic
  18. Raw Win32: A Nod to GDI

2019 25

  1. Raw Win32: An Application Shell
  2. Raw Win32: Syscalls and Toolchains
  3. Porting The Ur-Quan Masters to SDL2
  4. iGlossolalia: Mixing All of Apple’s Officially Supported Compiled Languages
  5. Atari 800: Repairing a Mad Science Type-In
  6. NES Splitscreens, Demoeffects, and “Undefined Behavior”
  7. Getting Off the Ground With the Other Commodore 8-bits
  8. C64 Fat Sprite Workarounds
  9. Migrating From Python 2 to 3
  10. Implementing SHA-256 on the 6502
  11. Some Notes on Player Complicity
  12. Working with DLLs on Windows, Mac, and Linux
  13. Fun With Symbol Collision
  14. Mandala Checkers: Wrap-Up
  15. Mandala: Initial Port Complete
  16. Mandala: Premature Optimization
  17. Mandala Checkers: Initialization and Display
  18. Rescuing a ZX81 Type-In Program
  19. Atari 800: Standalone Binaries
  20. Atari 800: Properly Mixing Basic and Machine Language
  21. Atari 800: Stumbling Into a New System
  22. The Xorshift-Star PRNG for Three 32-Bit Chips
  23. Stabilizing the C64 Display with Sprites
  24. Dissecting Three Classic Automatic Proofreaders
  25. 2018 Compilation and Review

2018 55

  1. Forcing an Aspect Ratio in 3D with OpenGL
  2. Unfiltered Cocoa: Fit and Finish
  3. Unfilitered Cocoa: Coding for Compatibility
  4. Unfiltered Cocoa: Completing the Application
  5. Unfiltered Cocoa: Powering A Custom Widget
  6. Unfiltered Cocoa: Using Apple Technologies as Directly As Possible
  7. Aspect-corrected Image Scaling with SDL2
  8. 2018 Link Roundup
  9. Release: Lights-Out for the Atari 2600
  10. Atari 2600: A 48px Kernel
  11. Lights-Out 2600: Cleanup and Refactoring
  12. Lights-Out 2600: Adding Sound
  13. Lights-Out 2600: Game Flow FSM
  14. Lights-Out 2600: The Gameplay Logic
  15. Lights Out 2600: Starting A New Game
  16. Atari 2600: Vertical Sprite Placement
  17. An Arbitrary Sprite Positioning Routine For The Atari 2600
  18. Atari 2600: Programmatic Sprite Placement
  19. Atari 2600: Placing Static Sprites
  20. Atari 2600: Drawing the Game Board
  21. Atari 2600: An Application Shell
  22. Atari 2600: Powers and Responsibilities
  23. State of the Umbrella
  24. First-class Functions at the Bare Metal
  25. Call Stacks and their Implementations
  26. Looking Back on the Mac
  27. Racing Against the Atmel AVR’s Toolkit
  28. To DLL Hell And Back
  29. An Ambition, Completed
  30. Release: The Cyclic Cellular Automaton for the Sega Genesis/Mega Drive
  31. Genesis: The YM2612 Music Chip
  32. Optimizing the CCA
  33. Genesis: First draft of the CCA
  34. Genesis: Scrolling and Interrupts
  35. Genesis: Badlines’ Revenge
  36. Genesis: Designing a Pseudo-Bitmap Mode
  37. Genesis: Digital Playback
  38. Makefiles for Mortals
  39. Genesis: The Z80 and the SN76489
  40. Genesis: Sprites and Controllers
  41. Variations on the 68000 ABI
  42. An Improvised Sega Genesis Toolchain
  43. The Sega Genesis Startup Code
  44. Genesis: Graphical Basics
  45. Getting Ready for Genesis Development
  46. Lessons Learned: Color Chart Madness Revisited
  47. From the Archives: Diffusion Chamber
  48. Conway’s Life on the Game Boy
  49. Sundry Refinements
  50. ZX81: Mind Games
  51. Game Boy: Double Buffering
  52. Game Boy progress: display timing
  53. 8-Bit Interlude: Test Cases
  54. Hello World on the original Game Boy
  55. 2017 Compilation and Review

2017 38

  1. Getting More Out of the C64’s Text Mode
  2. City Connection, NES Parallax, and VRAM corruption
  3. GTK3: Aspect-corrected Image Scaling with Cairo
  4. GTK3: Aspect-corrected Image Scaling With OpenGL
  5. Compatibility Across ZX Spectrum Variants
  6. SpectraLink: Creating tape files from scratch
  7. Getting Started With the ZX Spectrum
  8. Odds and Ends
  9. Perfect Play Across Genres
  10. Structured C64 BASIC: A Complete Example
  11. Hacking the Virtues: Becoming the Avatar in Five Easy Steps
  12. C64 BASIC: Disk I/O
  13. My other current project
  14. C64 BASIC: Performance Tuning
  15. C64 BASIC: Coexisting With Non-BASIC Data
  16. Making 8-Bit BASIC Actually Work
  17. Link Roundup
  18. Project Mehitabel: UnixLib and SDL
  19. Project Mehitabel: Graphics
  20. 4th of July Special: Type-In Programs
  21. Project Mehitabel: Assembly Language, ELF, and the binutils
  22. Project Mehitabel: C Defying UNIX
  23. Demo Release: Coast to Coast
  24. Project Mehitabel: The (BBC) Basics
  25. Kicking off Project Mehitabel
  26. How to Not Learn Assembly Language in DOS, Part 2
  27. How to Not Learn Assembly Language in DOS, Part 1
  28. Lights Out: ZX81 Release and Design Notes
  29. Getting a Decent and Fast PRNG Out of an 8-Bit Chip
  30. ZX81: Alternatives
  31. From the Archives
  32. ZX81: On to Machine Code
  33. ZX81: BASIC Programs and File Formats
  34. The ZX81 from the Ground Up
  35. Bumbershoot 2016 Collection
  36. A correction on Adlib timing
  37. Sound in DOS: Sound Blaster Digital Audio
  38. Sound in DOS: Adlib FM Synthesis

2016 19

  1. Galaxy Patrol 2.1 Final Released
  2. Hamurabi for the C64
  3. New Release: The Atrocitron
  4. Beyond Beep-Boop: Mastering the PC Speaker
  5. A Much-Belated Acknowledgement
  6. HLLs in DOS: Mixing In Assembly Code
  7. HLLs in DOS: Exploring the HAT function
  8. Wrapping Up Our Apple II Adventure
  9. Making Music on the Apple II
  10. Object-Oriented Programming at the Bare Metal
  11. A New Platform
  12. Hello World, 4 Different Ways
  13. FLI, part 2: Going fullscreen
  14. FLI, part 1: 16 color mode
  15. Offset Assembly
  16. Sprites and Raster Timing on the C64
  17. A Tour of 6502 Cross-Assemblers
  18. Bumbershoot 2015 C64 Compilation uploaded
  19. Stable Raster Demo Program

2015 17

  1. Stabilizing the VIC-II Raster
  2. Raster Grip
  3. Problem Attic and the Rhetoric of Platformers
  4. Distinguishing VIC-II Models
  5. Partial Badlines: Glitching on Purpose
  6. Flexible Line Distance (FLD)
  7. The VIC-II Idle state
  8. CGA: The Oldest Tricks In the PC’s Book
  9. I Have a Mission Now
  10. Enhanced experiments
  11. Bumbershoot sample code now on GitHub
  12. Vertical Splitscreen, Part 3: Cycle Counting to Victory
  13. Vertical Splitscreen, Part 2: Busted
  14. Vertical Splitscreen, Part 1: A Good Start
  15. VIC-II Interrupt Timing (or: How I Learned to Stop Worrying and Love Unstable Rasters)
  16. A taxonomy of splitscreens
  17. Variable Screen Placement: The VIC-II’s Forbidden Technique

2014 15

  1. Flickering scanlines: The VIC-II and “Bad Lines”
  2. Color Test: an Atari 2600 program
  3. Inform 7 6L02 is out
  4. Cycle-exact delays on the 6502
  5. Color Chart Madness, Part 3: To Insanity and Beyond
  6. Colorchart Madness, Part 2: Doing It Right
  7. BASIC loaders the easy way
  8. Configuring IRQs from BASIC
  9. Colorchart Madness, Part 1: Analysis and Refinement
  10. Arbitrary tones for the SID
  11. C64: Floating Point Peek
  12. The USR statement
  13. Mixing C64 BASIC and Assembler: Taking total control
  14. Elsewhere: ET-related news
  15. What’s this all about, then?