%import textio
%import syslib
%zeropage basicsafe

; Note: this program can be compiled for multiple target systems.

main {

    sub start() {
        txt.print("rectangles\nand circle\ndrawing.\n")

        ubyte r
        for r in 3 to 12 step 3 {
            circle(20, 12, r)
        }

        txt.print("enter for disc:")
        void cbm.CHRIN()
        txt.nl()
        txt.clear_screen()
        disc(20, 12, 12)

        txt.print("enter for rectangles:")
        void cbm.CHRIN()
        txt.nl()
        txt.clear_screen()

        rect(4, 8, 37, 23, false)
        rect(20, 12, 30, 20, true)
        rect(10, 10, 10, 10, false)
        rect(6, 0, 16, 20, true)


        sub rect(ubyte x1, ubyte y1, ubyte x2, ubyte y2, ubyte fill) {
            ubyte x
            ubyte y
            if fill {
                for y in y1 to y2 {
                    for x in x1 to x2 {
                        txt.setcc(x, y, 42, x+y)
                    }
                }
            } else {
                for x in x1 to x2 {
                    txt.setcc(x, y1, 42, 8)
                    txt.setcc(x, y2, 42, 8)
                }
                if y2>y1 {
                    for y in y1+1 to y2-1 {
                        txt.setcc(x1, y, 42, 7)
                        txt.setcc(x2, y, 42, 7)
                    }
                }
            }
        }

        sub circle(ubyte xcenter, ubyte ycenter, ubyte radius) {
            ; Midpoint algorithm
            ubyte x = radius
            ubyte y = 0
            byte decisionOver2 = 1-x as byte

            while x>=y {
                txt.setcc(xcenter + x, ycenter + y as ubyte, 81, 1)
                txt.setcc(xcenter - x, ycenter + y as ubyte, 81, 2)
                txt.setcc(xcenter + x, ycenter - y as ubyte, 81, 3)
                txt.setcc(xcenter - x, ycenter - y as ubyte, 81, 4)
                txt.setcc(xcenter + y, ycenter + x as ubyte, 81, 5)
                txt.setcc(xcenter - y, ycenter + x as ubyte, 81, 6)
                txt.setcc(xcenter + y, ycenter - x as ubyte, 81, 7)
                txt.setcc(xcenter - y, ycenter - x as ubyte, 81, 8)
                y++
                if decisionOver2<=0
                    decisionOver2 += 2*y+1
                else {
                    x--
                    decisionOver2 += 2*(y-x)+1
                }
            }
        }

        sub disc(ubyte cx, ubyte cy, ubyte radius) {
            ; Midpoint algorithm, filled
            ubyte x = radius
            ubyte y = 0
            byte decisionOver2 = 1-x as byte
            ubyte xx

            while x>=y {
                xx = cx-x
                repeat 2*x+1 {
                    txt.setcc(xx, cy + y as ubyte, 81, 11)
                    txt.setcc(xx, cy - y as ubyte, 81, 12)
                    xx++
                }
                xx = cx-y
                repeat 2*y+1 {
                    txt.setcc(xx, cy + x as ubyte, 81, 13)
                    txt.setcc(xx, cy - x as ubyte, 81, 14)
                    xx++
                }
                y++
                if decisionOver2<=0
                    decisionOver2 += 2*y+1
                else {
                    x--
                    decisionOver2 += 2*(y-x)+1
                }
            }
        }
    }
}