Work in progress Mandelbrot fractal viewer for Atari 8-bit home computers. Mostly an exercise in implementing signed 16-bit multiplication on the 6502.
  • Assembly 76.5%
  • JavaScript 19.7%
  • HTML 2.2%
  • C 0.8%
  • Makefile 0.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Brooke Vibber 49fe315529 'wide pixels'
should get better color on the composite video because the
scanlines will be fuller of data
2024-12-31 20:13:11 -08:00
.gitignore Faster imul16 routine 2024-12-14 18:53:31 -08:00
.mailmap mailmap 2024-08-18 20:15:47 -07:00
atari-asm-xex.cfg moving the framebuffer into the basic space 2024-12-29 21:19:55 -08:00
fixed.js whee 2023-01-07 22:57:18 -08:00
Makefile wip tables segment to be 2024-12-29 20:37:58 -08:00
mandel.s 'wide pixels' 2024-12-31 20:13:11 -08:00
readme.md update docs for 32-bit intermediates 2024-12-31 14:16:43 -08:00
sim.html mwahahah 2023-01-07 22:02:26 -08:00
sim.js whee 2023-01-07 22:57:18 -08:00
tables.js refactoring and start on squares 2024-12-29 17:37:06 -08:00
testme.js Faster imul16 routine 2024-12-14 18:53:31 -08:00
todo.md 'wide pixels' 2024-12-31 20:13:11 -08:00

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 4 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 4.12-precision fixed point numbers with 8.24-precision intermediates. It may be possible to squish this down to 3.13/6.26.

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.