Work in progress Mandelbrot fractal viewer for Atari 8-bit home computers. Mostly an exercise in implementing signed 16-bit multiplication on the 6502.
Find a file
Brooke Vibber 83cba4afa3 Runtime detection of XE-style extended memory
Uses the "big multiplication table" in 64KB of extended memory if
bank switching appears to work, otherwise uses the table of squares
lookups.

Initial view clocks in at 13.133 ms/px for the XE version and still
14.211 ms/px for the 400/800/XL version.

Tested in emulator with 130XE and XL+Ultimate 1MB upgrade configs,
and base implementation on the 800XL emulator.
2024-12-27 18:37:03 -08:00
.gitignore Faster imul16 routine 2024-12-14 18:53:31 -08:00
.mailmap mailmap 2024-08-18 20:15:47 -07:00
fixed.js whee 2023-01-07 22:57:18 -08:00
imul8xe.s first draft initializer 2024-12-26 17:50:59 -08:00
Makefile Faster imul16 routine 2024-12-14 18:53:31 -08:00
mandel.s Runtime detection of XE-style extended memory 2024-12-27 18:37:03 -08:00
readme.md squares 2024-12-14 18:56:26 -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 Faster imul16 routine 2024-12-14 18:53:31 -08:00
testme.js Faster imul16 routine 2024-12-14 18:53:31 -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 - february 2024

Current state

Basic rendering is functional, but no interactive behavior (zoom/pan) or benchmarking is done yet.

The 16-bit signed integer multiplication works; it 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.

The main loop is a basic add-and-shift, using 16-bit adds which requires flipping the sign of negative inputs (otherwise you'd have to add all those sign-extension bits). Runs in 470-780 cycles depending on input.

The mandelbrot calculations are done using 4.12-precision fixed point numbers. It may be possible to squish this down to 3.13.

Iterations are capped at 255.

The pixels are run in a progressive layout to get the basic shape on screen faster.

Next steps

Add a running counter of ms/px using the vertical blank interrupts as a timer. This'll show how further work improves it!

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.

I may be able to do a faster multiply using tables of squares for 8-bit component multiplication. (done)

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.