%import palette
%import math
%import gfx_lores
%option no_sysinit

; Vertical rasterbars a.k.a. "Kefren bars"
; also see: rasterbars.p8

main {

    sub start() {
        uword[32] colors = [
            $000,
            $011,  $112,  $213,  $214,
            $315,  $316,  $417,  $418,
            $519,  $51a,  $62b,  $62c,
            $73d,  $73e,  $84f,  $94f,
            $93e,  $83d,  $82c,  $72b,
            $71a,  $619,  $618,  $517,
            $516,  $415,  $414,  $313,
            $312,  $211,  $100
        ]

        palette.set_rgb(&colors, len(colors))
        gfx_lores.graphics_mode()       ; lores 256 colors
        cx16.VERA_DC_VSCALE = 0   ; display trick spoiler.......: stretch 1 line of display all the way to the bottom
        cx16.enable_irq_handlers(true)
        cx16.set_line_irq_handler(0, &irq.irqhandler)

        repeat {
            ; don't exit
        }
    }
}


irq {
    const ubyte BAR_Y_OFFSET = 5
    uword next_irq_line = 0
    ubyte anim1 = 0
    ubyte av1 = 0
    ubyte anim2 = 0
    ubyte av2 = 0
    ubyte[32] pixels = 0 to 31

    sub irqhandler() -> bool {
        next_irq_line += BAR_Y_OFFSET
        anim1 += 7
        anim2 += 4
        if next_irq_line > 480 {
            av1++
            av2 += 2
            anim1 = av1
            anim2 = av2
            next_irq_line = 0
            ; erase the bars
            gfx_lores.horizontal_line(0, 0, 320, 3)
;            gfx_lores.position(0, 0)
;            repeat 10 {
;                gfx_lores.next_pixels(pixels, len(pixels))
;            }
        } else {
            ; add new bar on top
            gfx_lores.position(math.sin8u(anim1)/2 + math.cos8u(anim2)/2 + $0010, 0)
            gfx_lores.next_pixels(pixels, len(pixels))
        }

        sys.set_rasterline(next_irq_line)
        return false
    }
}
