JSFiddle - React, Tailwind, and code Playground
HTML
<pre id="output"></pre>
JavaScript
var bob_width = 32;
var bob_height = 32;
var display_width = 320;
var display_height = 256;
var number_of_planes = 5;
var scrolling_enabled = true;
var copper_moves = 0;
var copper_waits = 0;
var number_of_sprites = 0; // 0 - 8.
var audio_channels_playing = 0; // 0 - 4.
// Free DMA cycles per frame.
var display_dma_cycles = ((display_width / 16) + (scrolling_enabled ? 1: 0)) * display_height * number_of_planes;
var refresh_cycles = 312 * 4;
var audio_cycles = 312 * audio_channels_playing;
var sprite_cycles = display_height * number_of_sprites * 2;
var copper_cycles = (copper_moves * 2) + (copper_waits * 3)
var free_dma_cycles = (226 * 312) - display_dma_cycles - refresh_cycles - audio_cycles - sprite_cycles - copper_cycles;
// DMA cycles spent on draw/restore and save/draw/restore a Bob.
var bob_dr_dma_cycles = 6 * Math.ceil((bob_width + 16) / 16) * bob_height * number_of_planes;
console.log(free_dma_cycles);
var bob_sdr_dma_cycles = 8 * Math.ceil((bob_width + 16) / 16) * bob_height * number_of_planes;
var number_of_bobs_dr_per_frame = free_dma_cycles / bob_dr_dma_cycles;
var number_of_bobs_sdr_per_frame = free_dma_cycles / bob_sdr_dma_cycles;
// Print data.
document.getElementById("output").innerHTML =
"Bobs per frame (draw/restore): " + number_of_bobs_dr_per_frame + "\n" +
"Bobs per frame (save/draw/restore): " + number_of_bobs_sdr_per_frame;