Interactive Raycaster For the Commodore 64 Under 256 Bytes
New submitter Wisdom writes "1bir (1 Block Interactive Raycaster) is a simple ray casting engine implemented only in 254 bytes to run on a stock, unexpanded Commodore 64. The name comes from the fact that on a C64 floppy disk, 1 block is equivalent to 254 bytes stored on a disk sector. In 254 bytes, 1bir sets up the screen for drawing, creates sine and cosine tables for 256 brads based on a simple approximation, casts rays into a 2D map that lives inside the C64 KERNAL ROM, renders the screen in coordination with KERNAL, evaluates 8-way joystick input and detects collision against walls. The ray casting core employs a brute force algorithm to determine visible walls, while the mapping portion supports both open-ended (infinitely looped) and traditional, closed maps. The source code in 6502 assembly is available, with extensive comments. A YouTube video showcases 1bir in a detailed manner with both kind of maps and more information, while a Vimeo video presents a shorter demonstration."
Don't underestimate the productivity of being able to work on a hobby project you enjoy
My UID is prime... is yours?
Good thing it only took him 30 years of development to come up with this. Had the software been around when I used a C64 (when they were the state of the art) I would probably still be looping around inside those maps.
I work with a health IT company that's trying to give doctors better tools to solve and treat disease. Our project could improve the lives of lots of folks, and its quite difficult to find talented technical folks to join the team.
I appreciate this is a cool hobby project, I just wish the guy would use his not inconsiderable talents to work on something that has a more obvious real-world payoff (unless this is all a hologram running on 4x10^16 Commadore 64s).
I got an idea.Pay him to do it. Your company works for money.
You wouldn't be working for one of the two dozen firms doing mobile apps for connecting doctors to patients, looking for funding, explaining how you work "with" and not "for"?
world was created 5 seconds before this post as it is.
The source code is zipped. For a 254 byte program. This just tickles me for some reason.
It is nice to see that in this world of plenty (at least as far as system memory and CPU speed goes) some people find joy in efficiency; and they go so far as to pull something like that off, just for the fun of it. Needless to say, the dude that did this is a real programmer.
Dunno if the link was bad for anyone else, but here's the actual vimeo link.
The next time you churn your next 500MB printer driver think about programs like this. Think long and hard.
It's interesting to note that the code uses two "undocumented" 6510 instructions:
These instructions are undefined; they work by taking advantage of the internal CPU architecture to execute a hybrid of other legal opcodes. A lot of other older processors have such behavior, such as the Z80. Even the 8086 had a bit of this: "pop cs" and the second encoding of "sar" come to mind. (The 8086's "pop cs" was stolen by the 286 to mean an escape to a second opcode page.)
"Screw Sun, cross-platform will never work. Let's move on and steal the Java language." - Visual J++ Product Manager
The Vimeo link in the story somehow became broken, the correct link is as follows:
http://vimeo.com/66004524
I work with an advanced robotics research firm that's trying to take humans out of fragile, disease-ridden bodies and put them in immortal robot bodies. Our project would allow humanity to transcend mortal existence, and it's quite difficult to find talented technical folks to join the team.
I appreciate your cool hobby project, I just wish you would use your not inconsiderable talents to work on something that has a more obvious long-term payoff.
As a bioinformatician who's trying to give researchers better tools to identify disease, whose projects could also improve the lives of lots of folks: this is not that kind of programming. Demoscene programmers are generally hired by graphics companies and embedded systems development, where their formidable optimization abilities actually get put to use; those skills are not transferable to general high-performance computing. You'll have to keep hiring out of the general CS grad pool.
Bio questions? Ask me to start a Q&A journal. Computer analogies available for most topics!
Can't find talented technical folks to join the team, or can't find talented technical folks to join the team for well below market wages?
Usually when people say one, they really mean the other.
-- "So they told me that using the download page to download something was not something they anticipated." - Bill Gates
Projects like this are a great way to train new engineers for small embedded systems. There is a lot of work out there on 8-bit systems with a couple k of program space and a few hundred bytes of ram. At my place we actively collect books that targeted advanced computer programming techniques in the early 80's, because they line up good with the resources we typically have on a microcontroller that costs $1.27 now .
For example, given a 128x96 black and white LCD, create an algorithm that will draw a line between any two points. Oh, and you can only use integer math, and we'd prefer it if you kept division operations to a minimum, because we have to do division through a software library call...
The old-timers did that stuff in their spare time 30 years ago.
Actually the skills do transfer. The techniques of code optimization are many and universal. Which ones constitute acceptable use depends on the application (i.e. mathematical approximations are not always OK). From what I keep reading, HPC focuses a lot on matrix math - an area where some tricks can help a lot without affecting the results. I was manipulating 1GB 3d data sets interactively on a machine with 128M of RAM back in the day, and I suspect the technique has not gone mainstream yet.
I work with a health IT company that's trying to give doctors better tools to solve and treat disease.
That's cool. I'm between jobs right now, so I have a lot of time on my hands. But the bright side is that just a few dollars from my unemployment check will buy a whole bunch of eggs, so I'm cool.
Say, why don't you tell me where you live, and I'll come over and we'll talk about that disease treating thingie you're interested in.
Hang on there. Why are you using your talents on a project that may save 1000s when you could be working in vaccination projects that could save 10s of 1000s? Wait! Forget that. You and those time wasting vaccination workers should be focused on biotechnology that could create crops to feed millions world wide!
Hold it! Scratch that. Global warming will end up destroying the entire planet. Get those lay-about biotech-crop workers on that!
Wait! Heat death of the universe. Only billions of years away and effects EVERYTHING. Stop wasting time on trivial projects and solve the most important problem in the universe! /thread
Recursion is the key to generating small op code.
and the second encoding of "sar" come to mind
Sorry, but it's "SHL" that has a duplicate encoding on x86. There are four slots for non-rotating shift instructions in "group 2": 4=SHL, 5=SHR, 6=???, 7=SAR. The /6 variant looks like it ought to be "SAL", and it is. However, unsigned left shifting is equivalent to signed left shifting, and thus the two opcodes end up doing the same thing. The original 8086 happy processed this instruction as a signed left shift because of how it interpreted the opcode bits, but that's the same as an unsigned left shift.
This was retained in modern processors, whereas "pop cs" was not.
"Screw Sun, cross-platform will never work. Let's move on and steal the Java language." - Visual J++ Product Manager
Do you visit model railroad clubs and chastise them for playing with toys when there's so much real freight to be moved?
The C64 is worthy of fun.
FC Closer
Will this run on my VIC-20?
Otherwise, meh.
"I believe in Karma. That means I can do bad things to people all day long and I assume they deserve it." : Dogbert
How do you even know what he is using his talents for at his day job? This type of project is
fun, allows a programmers to relax, reduce stress, and unwind but also allows them to hone
their skills so that there actually are "talented technical folks" for you to hire. I have yet to
meet a great programmer that doesn't do this sort of thing in their spare time and therefore
I honestly believe that eliminating this sort of behavior would actually reduce your ability to
hire qualified candidates.
My 6502 is not completely lost.
Here is how to optimize the code a little bit:
Replace:
with:
This saves 2 bytes and a few cycles.
This was done a decade ago for the Color Computer (6809). A self-modifying 3d engine in ~256 bytes was turned into a full "doom" style 3d game.
http://members.optusnet.com.au/nickma/ProjectArchive/crasher.html
With video!
https://www.youtube.com/watch?v=jVFn_djQ6EY
Which ones constitute acceptable use [...]
And that's the trick. These people focus predominantly on mathematical approximations, extreme memory limitations, and knowing the ins-and-outs of the CPU itself, or the API they're using if it's a PC demo. All C64 demos are programmed in assembly. So while optimization is common to both fields, the level of detail is much too tight. In demo programming, effects are chosen because they optimize well. That doesn't fit with matrix programming or stats where accurately capturing an algorithm is the top priority—not just because mathematical approximations are undesirable, but because the complexity of many processes is the major bottleneck, and the operations themselves are simple and cannot be optimized through cheating.
Even if a demoscener did, for example, rewrite BLAST, the result would be completely unmaintainable, which is no good to anyone. It's much better to leave the optimization of scientific software to the compiler.
Bio questions? Ask me to start a Q&A journal. Computer analogies available for most topics!
Yars Revenge used its own game code as pseudorandom data to animate the neutral zone.
Give me Classic Slashdot or give me death!
Next version is coming up soon, with more features than you actually mentioned in your post. :-) (It will not be under 256 bytes, though). This was, as you said, made to prove that it can be done under 256 bytes. Therefore, the size limit does not really allow to add many more features than there are now (although it is still possible to add small improvements here and there, of course). Lastly, this does not utilize any LUT, except for the usual sine/cosine tables.
Yeah. I'm also tired of self-righteous people claiming we shouldn't have fun because, somewhere there's a person with a need. Life isn't about sacrificing all your interests to the need of others. Even Jesus let his feet get washed from time to time.
We should learn what we need to know about issues, before we decide what we need to feel about them.
Up to a point, I agree with you—I've even implemented some optimizations of Smith-Waterman myself, so I know how bad it can get. The thing is, to fully maximize the kinds of cheating that you typically see in demos, you usually have to sacrifice the flexibility of the algorithm itself. A lot of the genius in low-power C64 and Amiga demos comes from precalculating data and constraining the perspectives from which the image on screen is shown; they're illusions. While a demoscene programmer may be excellent at core optimization tasks, these abilities in particular would be go unused. (Metaphors about cutting raw meat with a bread knife come to mind.) It would be better to look for someone more dedicated to the job, especially if they have experience with parallel processing and high-performance computing.
Of course, that's not to say there aren't individuals interested in all three categories—graphics tricks, code optimization, and high-performance computing—but the aptitudes aren't correlated. Demosceners are motivated by a strong sense of community, the audacity of their medium, and the gratification of seeing their work in action (see documentary), which doesn't jive well with what computational biology offers.
...that being said, I'm a computational biologist, I'm pretty fond of the demoscene, and I hate BLAST; where do I sign? :)
Bio questions? Ask me to start a Q&A journal. Computer analogies available for most topics!