I should be kept on a leash for my own safety, because I'm apparently quite stupid. I intentionally chose to avoid using RAM in this project, because I wanted a minimalist design with less wires, thus easier to debug. I also thought that the 6502 would work fine without RAM (which it theoretically does) since all the code is in ROM.
Guess what the first thing I do in my ROM code? Why, JSR to $E000, naturally, where the SID player is initialized. This instruction pushes the caller's address to the stack which is in... ah yes, RAM. Since this failed, the CPU could never return properly from the RTS and went into a very unpredictable state where it eventually got stuck.
Last night I started wiring up everything from scratch, this time with the complete quartet; RAM, ROM, SID and CPU. I'll try again and will let you know how it turns out this time.
Unless I'm choking on my leash, of course.