;
; example.asm for TR8
;
.org 0

; address of the frame interrupt vector
.equ INT_VECT 0xff00

    ; setup an int handler so we
    ; can use the frame int to sync
    ld a, >INT_VECT
    ld x, <INT_VECT
    ld b, <int_handler
    ld [a : x], b
    inc x
    ld b, >int_handler
    ld [a : x], b

    ; enable interrupts
    cif

    ld b, 0
loop:
    call fill_screen
    push b

    ; update sprite position

    ld a, >incx
    ld x, <incx
    ld y, [a : x]
    ld a, >px
    ld x, <px
    ld b, [a : x]
    ; px + incx
    add b, y
    ; 128 - 16
    cmp b, 112
    bnc
    jmp turn_x

    ; new x
    ld [a : x], b
    jmp update_y

turn_x:
    ld a, >incx
    ld x, <incx
    call turn

update_y:
    ld a, >incy
    ld x, <incy
    ld y, [a : x]
    ld a, >py
    ld x, <py
    ld b, [a : x]
    ; py + incy
    add b, y
    ; 128 - 16
    cmp b, 112
    bnc
    jmp turn_y

    ; new y
    ld [a : x], b
    jmp update_done

turn_y:
    ld a, >incy
    ld x, <incy
    call turn

update_done:

    call draw_sprite

    ; wait 1 frame
    halt

    pop b
    jmp loop

    ; make the sprite change direction
    ; in: [a : x] inc*
turn:
    ;  1 -> -1
    ; -1 -> 1
    ld y, [a : x]
    ld b, 254
    xor y, b
    ld [a : x], y

    ; change color
    ld b, [sp + 2]
    inc b
    and b, 15
    ld [sp + 2], b
    ret


    ; fill frame-buffer
    ; in: reg b color
fill_screen:
    ld a, 0xbf
    ld x, 0
    ld y, 0x40
fill_loop:
    ld [a : x], b
    inc x
    bno
    jmp fill_loop
    inc a
    dec y
    bnz
    jmp fill_loop
    ret

int_handler:
    iret

    ; draw sprite
    ; in: coordinates in px, py
draw_sprite:
    ; blitter in settings mode
    ld x, 128
    ld a, 0xb0
    port a, x

    ; setup
    inc a
    ; source
    ld x, <sprite
    port a, x
    ld x, >sprite
    port a, x
    ; destination
    ld y, <px
    ld b, >px
    ld x, [b : y]
    port a, x
    ld y, <py
    ld b, >py
    ld x, [b : y]
    port a, x
    ; size 16x16
    ld x, 16
    port a, x
    port a, x

    ; now blit
    dec a
    ld x, 3
    ; 3: write with transparent color support
    port a, x
    ret

sprite:
    .incpng "assets/icon.png"

incx:
    .db 1
px:
    .db 18
incy:
    .db 1
py:
    .db 64