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;