.program cosmic_unicorn
.side_set 1 opt

; out pins:
;
; - 3: row select bit 0
; - 4: row select bit 1
; - 5: row select bit 2
; - 6: row select bit 3

; set pins:
;
; - 0: column data (base)
; - 1: column latch
; - 2: column blank

; sideset pin:
;
; - 0: column clock

; for each row:
;   for each bcd frame:
;           0: 00111111                           // row pixel count (minus one)
;           1: xxxxrrrr                           // row select bits
;     2  - 65: xxxxxbgr, xxxxxbgr, xxxxxbgr, ...  // pixel data
;     66 - 67: xxxxxxxx, xxxxxxxx                 // dummy bytes to dword align
;     68 - 71: tttttttt, tttttttt, tttttttt       // bcd tick count (0-65536)
; 
; .. and back to the start


.wrap_target

; loop over row pixels
  out y, 8                        ; get row pixel count (minus 1 because test is pre decrement)
  out pins, 8                     ; output row select
pixels:
    
    ; red bit
    out x, 1       side 0  [1]    ; pull in blue bit from OSR into register x, clear clock
    set pins, 0b100               ; clear data bit, blank high
    jmp !x endb                   ; if bit was zero jump
    set pins, 0b101               ; set data bit, blank high
  endb:                      
    nop            side 1 [2]     ; clock in bit

    ; green bit
    out x, 1       side 0 [1]        ; pull in green bit from OSR into register X, clear clock
    set pins, 0b100               ; clear data bit, blank high
    jmp !x endg                   ; if bit was zero jump
    set pins, 0b101               ; set data bit, blank high
  endg:                      
    nop            side 1 [2]     ; clock in bit

    ; blue bit
    out x, 1       side 0  [1]       ; pull in red bit from OSR into register X, clear clock
    set pins, 0b100               ; clear data bit, blank high
    jmp !x endr                   ; if bit was zero jump
    set pins, 0b101               ; set data bit, blank high
  endr:                      
    out null, 5             side 1 [2]     ; clock in bit

    ;out null, 5    side 0         ; discard the five dummy bits for this pixel

  jmp y-- pixels

  out null, 16                    ; discard dummy bytes

  set pins, 0b110 [5]             ; latch high, blank high
  set pins, 0b000                 ; blank low (enable output)

; loop over bcd delay period
  out y, 32                       ; get bcd delay counter value
bcd_delay:
  jmp y-- bcd_delay         

  set pins 0b100                  ; blank high (disable output)

.wrap