Bumbershoot Software
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
- Porting Simulated Evolution to GS/OS
- Making a Better Simulated Evolution Port for the Apple IIgs
- Trying Out the New VBCC-65816 Compiler
- Book Reports from VCF West
- Digital Audio on the ZX Spectrum’s 1-Bit Beeper
- Unfinished Business with 1-Bit Audio Chords
- Designing Cycle-Exact Delays on Several 8-Bit CPUs
- ZX Spectrum: Experimenting With 1-Bit Sound
- Spectrum Shooting Gallery: Taking Back What We’ve Learned
- Vintage Computer Fair West 2026
- ZX Spectrum System Tour: Memory Mapping
- ZX Spectrum: Comparing Notes With an Old Hand
- ZX Spectrum System Tour: Sound
- Finishing the ZX Spectrum Shooting Gallery
- Starting the ZX Spectrum Shooting Gallery In Earnest
- Spritework on the ZX Spectrum: Rendering Without Flickering
- Spritework on the ZX Spectrum: Rendering
- Spritework on the ZX Spectrum: Preparing Our Graphics
- Interlude: Using the Index Registers Effectively on the Z80
- Programming the ZX Spectrum’s Bitmap Display
- Interlude: Spectrum vs. C64 BASIC Showdown
- ZX Spectrum System Tour: Text Mode
- Giving the ZX Spectrum a Fair Shake
- Simulated Evolution on the PICO-8
- Comparing an LZ4 Decompressor on Four Legacy CPUs
- Comparing the Z80 and 6502 to Their Relatives
- Staying a Spell with the Exidy Sorcerer
- Testing Out the ARMIPS Assembler on the Xorshift PRNGs
- Mega Drive development with ASMotor
- Some Subtleties When Parsing 6502 Assembly Language
- Reversing and Replicating Compute!’s MLX
- Ophis 2.3 Released
- Onefiling
- Playing Around With the C64 Ultimate
- Designing a Game Board for the TMS9918A
- C64: Putting Sprite Multiplexing to Work
- Spritework on the Commodore 64
- Sprite Graphics Traditions
- Skipping the ColecoVision’s Boot Screen
- TI-99/4A: Revisiting Implementation Strategies
- TI-99/4A: Hybrid Software Development
- TI-99/4A: Leaning More Heavily on the Firmware
- Type-In Rescue: The C64 Autoboot Generator
- Dissecting a C64 Autoboot Program
2025 46
- 2025 Compilation and Review
- Poking a Little Harder at PICO-8
- Smooth Scrolling on the Sega Master System
- Sega Master System: Using ALL the Colors
- Sega Master System: Fancier Tile Graphics
- Sega Master System: Program Walkthroughs
- Sega Master System Part 2: Mode 4 on the Mark III
- The Sega Master System
- Some Fun Videos on Optimizing NES Code
- Author, Director, Performer, Audience
- A Simple SDL/OpenGL Pixmap Framework
- Sharp Bilinear Filters: Big Clean Pixels for Pixel Art
- Upgrading Our Way Through the Rest of OpenGL
- Upgrading Our Way Through OpenGL 1.x
- Doing Pixel Work With Modern Languages
- Programming the TMS9918A Video Display Processor
- Exploring the TMS9918’s Graphics Modes
- Shooting Gallery: Touring the MSX1’s Capabilities
- ColecoVision: The Shooting Gallery Platform Layer
- Children of the TI: Write Once, Run Anywhere
- Intermission: VCFW 2025
- Creating Our Own SG-1000 BIOS
- Children of the TI
- Genesis CCA: Special Effects and Final Polish
- LZ4 Decompression on the 68000
- Genesis: Refining the Logo Graphics
- Re-Optimizing the CCA on the Genesis
- Lights-Out C64: Parity With the NES
- Revisiting an Old C64 Project
- Cleaning Up My Z80 Projects
- Polishing the “Improvised Genesis Toolchain”
- More Watcom: Fixing Interrupt Handlers in DOS’s Tiny Model
- Trying Out OpenWatcom
- 2025 Hiatus: Proof of Life
- 2025 Hiatus
- A Tour of Z80 Cross-Assemblers
- TI-99/4A: A Detailed Code Walkthrough
- TI-99/4A: Finishing Our Preparations
- Writing Cartridge Software for the TI-99/4A
- The 8-Bit Era’s Weird Uncle: The TI-99/4A
- Reversing the Xorshift* PRNG
- Something Different: WebAssembly Without Emscripten
- Linked Lists Without Pointers
- Implementing Linked Lists on a 32-bit CPU
- Linked Lists and Typed Arenas
- 2024 Compilation and Retrospective
2024 52
- A Modern Implementation of the Shooting Gallery Project
- Amiga 500: Finishing the Shooting Gallery Project
- Amiga 500: Completing a Simple Game
- Amiga 500: A Sprite Rendering Engine
- Spritework on the Amiga 500
- Atari 800: Direct Screen Memory Access from BASIC
- Sprite Multiplication on the Atari 800
- Atari 800: Implementing a Simple Game
- Atari 800: Next-Generation Playfields
- Spritework on the Atari 800
- A Musical Interlude
- Atari 2600: Completing the Shooting Gallery
- Atari 2600: Successfully Multiplexing Sprites
- Atari 2600: Mid-Screen Sprite Updates
- Atari 2600: Multiplying Our Sprites
- Atari 2600: SkipDraw
- Atari 2600: Input, Missiles, and Collisions
- Atari 2600: Playfields and Scoring
- Spritework on the Atari 2600
- Amiga 500: Direct Keyboard Access
- Amiga 500: Bare-Metal Startup Code
- Ophis 2.2 Released
- Amiga 500: Using Our Full Power
- Amiga 500: Completing The Display
- Amiga 500: Alternate Graphics Memory Layouts
- Amiga 500: Mode Switching
- Amiga 500 Interlude: Nasal Demons
- Amiga 500: Drawing a Bitmap on the Bare Metal
- Amiga 500: The Original Chip Set
- Looting GW-BASIC: Text UIs
- Looting GW-BASIC: The Music Macro System
- Taking Inventory of GW-BASIC
- Porting the SIMD Mandelbrot Generator to the 64-bit Windows ABI
- A Complex SVN-to-Git Conversion, Part 3: Forging a History
- A Complex SVN-to-Git Migration, Part 2: Interrogating Git Internals
- A Complex SVN-to-Git Migration, Part 1: Cooperating With Subversion
- The Many Faces of Retrocomputing
- Noodling With Nonograms
- Softsoniq: Cycle-counting Out Polyphonic Music
- Flood Fills on the CoCo and the Dragon
- Building a Bitmap Graphics Library for the Dragon
- A Closer Look at Bresenham’s Algorithm
- Text I/O and Graphics Modes on the Dragon/CoCo
- The Dragon Roars
- LZ4 Decompression on the 6809
- Cross-Platform Development for the TRS-80 CoCo and Dragon
- The Year of the Dragon
- Archie Teaches BASIC
- Optimizing Mandelbrot Generation with SIMD
- Rendering the Mandelbrot Set
- Playing with PICO-8
- Out of the Ivory Tower: Advent of Code 2023 in Scheme
2023 49
- Bumbershoot Software 2023 Compilation
- Bumbershoot Software in 2023
- SNES CCA: Bells and Whistles
- SNES CCA: A Completed First Draft
- SNES: From Sounds to Music
- Designing and Building a SNES Music Player
- SNES: Digital Audio Playback
- The CCA on the SNES, Part 2: Implementation and Analysis
- The CCA on the SNES, Part 1: Designing the Inner Loop
- Two Xorshift PRNGs for the 65816
- LZ4 Decompression on the 65816
- DMA and FastROM on the SNES: Speed At Any Cost
- SNES: Scrolling and Updating Our Pseudo-Bitmap
- SNES: Implementing Pseudo-Bitmap Semigraphics
- Our First SNES Program
- SNES Graphics Data
- Memory Layouts and Linking Scripts on the SNES
- The Super Nintendo Entertainment System
- Exploring our OpenGL Shader Scaffold Design
- Building a Shader Scaffolding for OpenGL
- Classic Digital Audio on Modern Systems
- Classic Mac: Taking Apart Process Startup
- Classic Mac: More Aggressive Backcompatibility
- Apple IIgs: Wrap-Up and Retrospective
- Apple IIgs: A Large, Multi-Segment Program
- Apple IIgs Digital Sound (With Bonus Console Output)
- Apple IIgs Digital Sound: Preparations
- Apple IIgs: From ProDOS 8 to GS/OS
- Apple IIgs: Text in Graphics Mode
- Apple IIgs: Dunking on EGA
- Interlude: Blitting With the 65816 CPU
- Apple IIgs: Super High-Res Mode
- Apple IIgs: Meeting the 65816 CPU
- Meeting the Apple IIgs
- Back to the Apple II
- Release: Simulated Evolution for the Classic Mac OS
- MacSimEvo: Dialog Boxes
- MacSimEvo: Toggles and Warp Mode
- MacSimEvo: A Kitbashed Prototype
- Source Release: Flight of the Hummingbird and the Atrocitron
- Classic Mac Development: From C to Machine Code
- MacSimEvo: Porting and Testing the Asm Utils
- Classic Mac Development: System 7 Support
- Classic Mac Development: Application Icons
- Classic Mac Development: The Rest of the UI
- Classic Mac Development: Modern VCS
- Classic Mac Development: Beginning in Earnest
- Classic Mac Development: Adventures in Period Tooling
- 2022 Compilation and Retrospective
2022 37
- Digital Sound Playback on the C64
- Digital Sound Playback on the NES
- Cleanly Organizing 8-Bit Dataflows
- NES: Programming the UNROM
- NES: Creating an UNROM image
- NES: Beyond 40KB
- Amiga 500: Digital Sound
- Release: Simulated Evolution for the Amiga
- Amiga 500: Simulated Evolution’s Platform Layer
- Memory Models and Far Pointers
- Amiga 500: Time, Windows, and Direct Device Access
- Custom printf: Wrapping Variadic Functions in C
- Amiga 500: Our First Real GUI Program
- Amiga 500: Dead Ends and Side Paths
- Amiga 500: Icons and Program Info
- Amiga 500: Making Our Best Console Apps
- Amiga 500: How Libraries Work and How to Use Them
- Cross-Platform Development for the Amiga 500
- A New Friend: Let’s Play Amiga Workbench 1.3!
- Something Different: JavaScript Toolchains
- Lights-Out NES: Release and Design Retrospective
- Lights-Out NES: Input Polish
- NES Lights-Out: Animation Polish
- Lights-Out NES: The Main Game Logic
- Lights-Out NES: Sprite Graphics
- Lights-Out NES: Pressing START to Begin
- Lights-Out NES: A Deep Breath Before the Plunge
- Lights-Out NES: Graphics Driver
- Lights-Out NES: Content Creation
- Hello World on the NES, Byte by Byte
- Linking Scripts in ld65
- The NES: A Hardware Summary and a New Project
- Type-in Rescue: Quadrun
- Type-in Rescue: Mini-Invaders
- Touring the TRS-80’s Capabilities
- Poking at the TRS-80 Model III
- 2021 Compilation
2021 18
- DirectX9: Completing a Simple Sprite Engine
- Interlude: Image Decoding
- Interlude: Resource Systems
- DirectX 9: Textures as Sprites
- Simulated Evolution on Two 16-Bit Machines
- Finishing up Portrait of Liberty ST
- Timing on the Atari ST
- Atari ST: The AY-3-8910 Sound Chip
- Bumbershoot Indices
- Atari ST: Medium and High Resolution
- Line-A Flood Fills
- Writing Our First Atari ST Programs
- A Cross-Development Toolchain For the Atari ST
- DirectX 9: Rewarded as a Traitor Deserves
- Simulated Evolution on Two 8-Bit Machines
- Atari 800: Making Proper Use of Display Lists
- Atari 800: A Custom Graphics Display
- A Grimoire of 8-Bit Implementation Patterns
2020 18
- C64 Startup Code In Detail
- Building a Faster C64 Bitmap Library
- DirectX 9: A Sudden, but Inevitable, Betrayal
- Making Use Of Our New DX9 Pixmap Library
- DirectX 9: A Working Pixmap Module
- Aspect-corrected Image Scaling with DirectX 9
- DirectX 9: Drawing Some Pixels and Living to Tell the Tale
- DirectX 9: The Newest Old Thing
- Restoring Traditional OOP to Go
- Simulated Evolution
- Fixed-Point: When Integers Aren’t Integers
- 2019 Compilation
- Raw Win32: Dialog Boxes
- Raw Win32: Icons and Resource Files
- Raw Win32: A Properly Resizable Custom Widget
- Raw Win32: Menus
- Raw Win32: User Input and Game Logic
- Raw Win32: A Nod to GDI
2019 25
- Raw Win32: An Application Shell
- Raw Win32: Syscalls and Toolchains
- Porting The Ur-Quan Masters to SDL2
- iGlossolalia: Mixing All of Apple’s Officially Supported Compiled Languages
- Atari 800: Repairing a Mad Science Type-In
- NES Splitscreens, Demoeffects, and “Undefined Behavior”
- Getting Off the Ground With the Other Commodore 8-bits
- C64 Fat Sprite Workarounds
- Migrating From Python 2 to 3
- Implementing SHA-256 on the 6502
- Some Notes on Player Complicity
- Working with DLLs on Windows, Mac, and Linux
- Fun With Symbol Collision
- Mandala Checkers: Wrap-Up
- Mandala: Initial Port Complete
- Mandala: Premature Optimization
- Mandala Checkers: Initialization and Display
- Rescuing a ZX81 Type-In Program
- Atari 800: Standalone Binaries
- Atari 800: Properly Mixing Basic and Machine Language
- Atari 800: Stumbling Into a New System
- The Xorshift-Star PRNG for Three 32-Bit Chips
- Stabilizing the C64 Display with Sprites
- Dissecting Three Classic Automatic Proofreaders
- 2018 Compilation and Review
2018 55
- Forcing an Aspect Ratio in 3D with OpenGL
- Unfiltered Cocoa: Fit and Finish
- Unfilitered Cocoa: Coding for Compatibility
- Unfiltered Cocoa: Completing the Application
- Unfiltered Cocoa: Powering A Custom Widget
- Unfiltered Cocoa: Using Apple Technologies as Directly As Possible
- Aspect-corrected Image Scaling with SDL2
- 2018 Link Roundup
- Release: Lights-Out for the Atari 2600
- Atari 2600: A 48px Kernel
- Lights-Out 2600: Cleanup and Refactoring
- Lights-Out 2600: Adding Sound
- Lights-Out 2600: Game Flow FSM
- Lights-Out 2600: The Gameplay Logic
- Lights Out 2600: Starting A New Game
- Atari 2600: Vertical Sprite Placement
- An Arbitrary Sprite Positioning Routine For The Atari 2600
- Atari 2600: Programmatic Sprite Placement
- Atari 2600: Placing Static Sprites
- Atari 2600: Drawing the Game Board
- Atari 2600: An Application Shell
- Atari 2600: Powers and Responsibilities
- State of the Umbrella
- First-class Functions at the Bare Metal
- Call Stacks and their Implementations
- Looking Back on the Mac
- Racing Against the Atmel AVR’s Toolkit
- To DLL Hell And Back
- An Ambition, Completed
- Release: The Cyclic Cellular Automaton for the Sega Genesis/Mega Drive
- Genesis: The YM2612 Music Chip
- Optimizing the CCA
- Genesis: First draft of the CCA
- Genesis: Scrolling and Interrupts
- Genesis: Badlines’ Revenge
- Genesis: Designing a Pseudo-Bitmap Mode
- Genesis: Digital Playback
- Makefiles for Mortals
- Genesis: The Z80 and the SN76489
- Genesis: Sprites and Controllers
- Variations on the 68000 ABI
- An Improvised Sega Genesis Toolchain
- The Sega Genesis Startup Code
- Genesis: Graphical Basics
- Getting Ready for Genesis Development
- Lessons Learned: Color Chart Madness Revisited
- From the Archives: Diffusion Chamber
- Conway’s Life on the Game Boy
- Sundry Refinements
- ZX81: Mind Games
- Game Boy: Double Buffering
- Game Boy progress: display timing
- 8-Bit Interlude: Test Cases
- Hello World on the original Game Boy
- 2017 Compilation and Review
2017 38
- Getting More Out of the C64’s Text Mode
- City Connection, NES Parallax, and VRAM corruption
- GTK3: Aspect-corrected Image Scaling with Cairo
- GTK3: Aspect-corrected Image Scaling With OpenGL
- Compatibility Across ZX Spectrum Variants
- SpectraLink: Creating tape files from scratch
- Getting Started With the ZX Spectrum
- Odds and Ends
- Perfect Play Across Genres
- Structured C64 BASIC: A Complete Example
- Hacking the Virtues: Becoming the Avatar in Five Easy Steps
- C64 BASIC: Disk I/O
- My other current project
- C64 BASIC: Performance Tuning
- C64 BASIC: Coexisting With Non-BASIC Data
- Making 8-Bit BASIC Actually Work
- Link Roundup
- Project Mehitabel: UnixLib and SDL
- Project Mehitabel: Graphics
- 4th of July Special: Type-In Programs
- Project Mehitabel: Assembly Language, ELF, and the binutils
- Project Mehitabel: C Defying UNIX
- Demo Release: Coast to Coast
- Project Mehitabel: The (BBC) Basics
- Kicking off Project Mehitabel
- How to Not Learn Assembly Language in DOS, Part 2
- How to Not Learn Assembly Language in DOS, Part 1
- Lights Out: ZX81 Release and Design Notes
- Getting a Decent and Fast PRNG Out of an 8-Bit Chip
- ZX81: Alternatives
- From the Archives
- ZX81: On to Machine Code
- ZX81: BASIC Programs and File Formats
- The ZX81 from the Ground Up
- Bumbershoot 2016 Collection
- A correction on Adlib timing
- Sound in DOS: Sound Blaster Digital Audio
- Sound in DOS: Adlib FM Synthesis
2016 19
- Galaxy Patrol 2.1 Final Released
- Hamurabi for the C64
- New Release: The Atrocitron
- Beyond Beep-Boop: Mastering the PC Speaker
- A Much-Belated Acknowledgement
- HLLs in DOS: Mixing In Assembly Code
- HLLs in DOS: Exploring the HAT function
- Wrapping Up Our Apple II Adventure
- Making Music on the Apple II
- Object-Oriented Programming at the Bare Metal
- A New Platform
- Hello World, 4 Different Ways
- FLI, part 2: Going fullscreen
- FLI, part 1: 16 color mode
- Offset Assembly
- Sprites and Raster Timing on the C64
- A Tour of 6502 Cross-Assemblers
- Bumbershoot 2015 C64 Compilation uploaded
- Stable Raster Demo Program
2015 17
- Stabilizing the VIC-II Raster
- Raster Grip
- Problem Attic and the Rhetoric of Platformers
- Distinguishing VIC-II Models
- Partial Badlines: Glitching on Purpose
- Flexible Line Distance (FLD)
- The VIC-II Idle state
- CGA: The Oldest Tricks In the PC’s Book
- I Have a Mission Now
- Enhanced experiments
- Bumbershoot sample code now on GitHub
- Vertical Splitscreen, Part 3: Cycle Counting to Victory
- Vertical Splitscreen, Part 2: Busted
- Vertical Splitscreen, Part 1: A Good Start
- VIC-II Interrupt Timing (or: How I Learned to Stop Worrying and Love Unstable Rasters)
- A taxonomy of splitscreens
- Variable Screen Placement: The VIC-II’s Forbidden Technique
2014 15
- Flickering scanlines: The VIC-II and “Bad Lines”
- Color Test: an Atari 2600 program
- Inform 7 6L02 is out
- Cycle-exact delays on the 6502
- Color Chart Madness, Part 3: To Insanity and Beyond
- Colorchart Madness, Part 2: Doing It Right
- BASIC loaders the easy way
- Configuring IRQs from BASIC
- Colorchart Madness, Part 1: Analysis and Refinement
- Arbitrary tones for the SID
- C64: Floating Point Peek
- The USR statement
- Mixing C64 BASIC and Assembler: Taking total control
- Elsewhere: ET-related news
- What’s this all about, then?