- Assembly 78.8%
- JavaScript 17.8%
- HTML 2%
- C 0.7%
- Makefile 0.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
mandelbrot_hotspot_impl macro calls through to the sqr16_impl and imul16_impl macros with the xe mode this is backed by two realized functions, as mandelbrot_hotspot and mandelbrot_hotspot_xe these are also called via direct jmp instead of jsr/rts because there's only one call site so we can save 6 cycles per iteration by jmp/jmp could save 6 more cycles per iter by specializing all of the mandelbrot proc but there isn't room in ram right now sqr16_func is removed as it is unused and we ran out of code space adding the hotspot's extra implementations imul16_func is kept, as it's called via zoom_factor in a couple of places. this forwards to the xe version at a cost of 3 cycles, as the call sites aren't patched |
||
| .gitignore | ||
| .mailmap | ||
| atari-asm-xex.cfg | ||
| atari-xex.cfg | ||
| bitmul.s | ||
| fixed.js | ||
| Makefile | ||
| mandel-core.s | ||
| mandel.c | ||
| mandel.h | ||
| readme.md | ||
| sim.html | ||
| sim.js | ||
| tables.js | ||
| testme.js | ||
| todo.md | ||
Mandel-6502
Work-in-progress Mandelbrot fractal viewer for Atari 8-bit home computers. Mostly an excuse to write an integer multiplication routine for the 6502 for practice.
Goals:
- have fun learning 6502 assembly
- make an old machine do something inefficient as efficiently as possible.
- post cool screenshots of low-res fractals
Non-goals:
- maintain anything long-term (but feel free to copy/fork if you want to make major changes!)
Enjoy! I'll probably work on this off and on for the next few weeks until I've got it producing fractals.
-- brooke, january 2023 - december 2024
Current state
Basic rendering is functional, with interactive zoom/pan (+/-/arrows) and 6 preset viewports via the number keys.
The 16-bit signed integer multiplication takes two 16-bit inputs and emits one 32-bit output in the zero page, using the Atari OS ROM's floating point registers as workspaces. Inputs are clobbered.
- 16-bit multiplies are decomposed into 4 8-bit unsigned multiplies and some addition
- an optimized case for squares uses a table of 8-bit squares to reduce the number of 8-bit multiplication sub-ops
- when expanded RAM is available as on 130XE, a 64KB 8-bit multiplication table accelerates the remaining multiplications
- without expanded RAM, a table of half-squares is used to implement the algorithm from https://everything2.com/title/Fast+6502+multiplication
The mandelbrot calculations are done using 3.13-precision fixed point numbers with 6.26-precision intermediates.
Iterations are capped at 255.
The pixels are run in a progressive layout to get the basic shape on screen faster.
There is a running counter of ms/px using the vertical blank interrupts as a timer, used to track our progress. :D
There's a check for cycles in (zx,zy) output when in the 'lake'; if values repeat, they cannot escape. This is a big time saver in fractint.
There's some cute color cycling.
Deps and build instructions
I'm using ca65 as a macro assembler, and have a Unix-style Makefile for building. Should work fairly easily on Linux and Mac. Might work on "raw" Windows but I use WSL for that.
Currently produces a .xex executable, which can be booted up in common Atari emulators and some i/o devices.
Todo
See ideas in todo.md.