%import floats
%import graphics
%zeropage floatsafe


main {

    sub start() {
        graphics.enable_bitmap_mode()
        turtle.init()

        turtle.pu()
        turtle.pos(150, 110)
        turtle.pd()

        ubyte i
        for i in 0 to 100 {
            turtle.fd(i+20)
            turtle.rt(94)
        }

        repeat {
        }
    }
}

turtle {
    float xpos
    float ypos
    float angle
    bool pendown

    const uword SPRITE_MEMORY = $5800

    sub init() {
        xpos = 160.0
        ypos = 100.0
        angle = 0.0
        pendown = true

        sys.memcopy(&turtlesprite, SPRITE_MEMORY, len(turtlesprite))    ; copy the sprite pixel data
        c64.set_sprite_ptr(0, SPRITE_MEMORY)        ; use dynamic setter because of changed vic memory layout
        c64.SPENA = 1       ; sprites on
        c64.SP0COL = 5      ; green sprite

        update_turtle_sprite()
    }

    sub update_turtle_sprite() {
        uword xx = xpos as uword
        c64.SPXY[0] = lsb(xx) + 12
        c64.MSIGX = msb(xx) > 0
        c64.SPXY[1] = ypos as ubyte + 40
    }

    sub pos(float x, float y) {
        if pendown {
            graphics.line(xpos as uword, ypos as ubyte, x as uword, y as ubyte)
        }
        xpos = x
        ypos = y
        update_turtle_sprite()
    }

    sub fd(uword length) {
        float flen = length as float
        float sx = xpos
        float sy = ypos
        xpos += flen * floats.sin(angle)
        ypos -= flen * floats.cos(angle)
        update_turtle_sprite()
        if pendown {
            graphics.line(sx as uword, sy as ubyte, xpos as uword, ypos as ubyte)
        }
    }

    sub rt(uword degrees) {
        angle += floats.rad(degrees as float)
    }

    sub lt(uword degrees) {
        angle -= floats.rad(degrees as float)
    }

    sub pu() {
        pendown = false
    }

    sub pd() {
        pendown = true
    }

    ubyte[] turtlesprite = [ %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%01111110,%00000000,
                             %00000000,%11000011,%00000000,
                             %00000000,%11000011,%00000000,
                             %00000000,%11000011,%00000000,
                             %00000000,%01111110,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000,
                             %00000000,%00000000,%00000000   ]
}
