these are notes from the sizecoding Discord by serato_fig

Render loop:

render
    lda t
    sta it
    lda #0
    sta is
    lda #24;200
    sta j
    lda #24;40
    sta ic

j_loop
    lda is
i_loop
    clc
    adc v
    tax
    lda it
    clc
    adc u
    tay
    lda sin_t,x
    clc
    adc sin_t,y
    sta u
    lda cos_t,x
    clc
    adc cos_t,y
    sta v
    tay

    cpy frame    ;2
    lax u        ;3
    ror          ;2
    cpy #88      ;2
    arr #$fc     ;2
    sta col_ref1 ;4
    sta col_ref2 ;4
    lda mask,x   ;4
col_ref1 = *+1          
    ora ($0),y   ;5+
col_ref2 = *+1          
    sta ($0),y   ;6

    dec j
    bne j_loop
    lda #24;200
    sta j
    lda is
    clc
    adc #41
    sta is
    dec ic
    bne i_loop

    inc t
    jmp new_frame




; in other words, scaled to 46+/-256/2pi. and shifted by 2*46 
; the shift is there to remove the offset from u and v 
; being sums of 2 sins and 2 coses.
; Building in the offset means my coordinates are all positive
cos_t    .char    round(cos((range(256)-92)*2.0*pi/256)*256.0/2.0/pi+46)
sin_t    .char    round(sin((range(256)-92)*2.0*pi/256)*256.0/2.0/pi+46)

;===================================
later code

render
    lda t
    sta it1
    sta it2
    lda #0
    sta is1
    sta is2
    lda #24;40
    sta ic
    ldx u
i_loop
    lda #24;200
    sta j
j_loop
    ldy v           ;3            
    clc             ;2            
is1 = *+1                               
    lda sin_t,y     ;4+            
it1 = *+1                               
    adc sin_t,x     ;4+            
    sta u           ;3            
is2 = *+1                               
    lda cos_t,y     ;4+            
it2 = *+1                               
    adc cos_t,x     ;4+            
    sta v           ;3            
    tay             ;2 = 29-33 cycles    
                                            
    lax u           ;3            
    ror             ;2            
    cpy #88         ;2            
    arr #$fc        ;2            
    sta col_ref1    ;4            
    sta col_ref2    ;4            
    lda mask,x      ;4            
col_ref1 = *+1                          
    ora ($0),y      ;5+            
col_ref2 = *+1                              
    sta ($0),y      ;6 = 32-33 cycles    

    dec j
    bne j_loop
    lda is1
    clc
    adc #41
    sta is1
    sta is2
;    inc it1
;    inc it2
    dec ic
    bne i_loop

    inc t
    jmp new_frame 


;====================================
; again
; u and v are now held in X and Y rather than being reloaded each time
render
    lda t
    sta it1
    sta it2
    lda #0
    sta is1
    sta is2
    lda #24;40
    sta ic
    ldx u
    ldy v
i_loop
    lda #24;200
    sta j
j_loop
    clc           ;2            
is1 = *+1                               
    lda sin_t,y   ;4+            
it1 = *+1                               
    adc sin_t,x   ;4+            
    sta u         ;3            
is2 = *+1                               
    lda cos_t,y   ;4+            
it2 = *+1                               
    adc cos_t,x   ;4+            
    tay           ;2 = 23-27 cycles    
                                            
    lax u         ;3            
    ror           ;2            
    cpy #88       ;2            
    arr #$fc      ;2            
    sta col_ref1  ;4            
    sta col_ref2  ;4            
    lda mask,x    ;4            
col_ref1 = *+1                          
    ora ($0),y    ;5+            
col_ref2 = *+1                              
    sta ($0),y    ;6 = 32-33 cycles    

    dec j
    bne j_loop
    lda is1
    clc
    adc #41
    sta is1
    sta is2
;    inc it1
;    inc it2
    dec ic
    bne i_loop
    sty v

    inc t
    jmp new_frame

;=========================
; singen

    lda #57
    sta v
    lda #39
    ldx #63
-   sta u
    lsr
    lsr
    lsr
    pha
    adc #17
    sta sin_t,x
    eor #$ff
    adc #43
    sta sin_t+64,x
    pla
    lsr
    lsr
    lsr
    adc v
    sta v
    lsr
    lsr
    lsr
    sbc u
    adc #240
    eor #$ff
    dex
    bpl -
    rts



;==================================
; TIC-80 version by serato_fig

u,v,t=0,0,0
s=41

function SIN(x) return math.floor(s*math.sin((x-96)*math.pi*2/256)+48.5)end
function COS(x) return math.floor(s*math.cos((x-96)*math.pi*2/256)+48.5)end
function TIC()
  cls(0)
    
  for i=0,20 do
    for j=0,20 do
      local a,b=i*s+v,i+t+u
      u=SIN(a)+SIN(b)
      v=COS(a)+COS(b)
      pix(u,v,100)
    end
  end
  t=t+1
end


; 42Bastian linked atari lynx verison
https://github.com/42Bastian/misc_Processing/blob/main/bubble_lynx/bubble_universe_lynx.pde
