%import textio
%import floats
%import string
%import syslib
%import math
%import test_stack
%zeropage basicsafe

main {

    sub start() {
        rotations()
        integers()
        floatingpoint()

        test_stack.test()
    }

    sub rotations() {
        ubyte[] ubarr = [%11000111]
        uword[] uwarr = [%1100111110101010]

        repeat(10) {
            txt.nl()
        }

        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        sys.set_carry()
        rol(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        sys.set_carry()
        rol(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        sys.set_carry()
        rol(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        sys.set_carry()
        rol(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        txt.nl()

        uwarr[0] = %1100111110101010
        ror(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        sys.set_carry()
        ror(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        sys.set_carry()
        ror(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        sys.set_carry()
        ror(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        sys.set_carry()
        ror(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        txt.nl()

        sys.clear_carry()
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        rol2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        rol2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        rol2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        rol2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        txt.nl()

        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        ror2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        ror2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        ror2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        ror2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.nl()
        txt.nl()

        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        sys.set_carry()
        rol(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        sys.set_carry()
        rol(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        sys.set_carry()
        rol(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        sys.set_carry()
        rol(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        txt.nl()

        sys.set_carry()
        ror(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        sys.set_carry()
        ror(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        sys.set_carry()
        ror(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        sys.set_carry()
        ror(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        sys.set_carry()
        ror(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        txt.nl()


        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        rol2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        rol2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        rol2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        rol2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        txt.nl()

        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        ror2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        ror2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        ror2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        ror2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.nl()
        txt.nl()

        &ubyte  membyte = $c000
        uword addr = $c000

        @(addr) = %10110101
        txt.print_ubbin(@(addr), true)
        txt.nl()
        sys.set_carry()
        rol(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        sys.set_carry()
        rol(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        sys.set_carry()
        rol(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        sys.set_carry()
        rol(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        txt.nl()

        @(addr) = %10110101
        txt.print_ubbin(@(addr), true)
        txt.nl()
        sys.set_carry()
        ror(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        sys.set_carry()
        ror(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        sys.set_carry()
        ror(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        sys.set_carry()
        ror(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        txt.nl()

        @(addr) = %10110101
        txt.print_ubbin(@(addr), true)
        txt.nl()
        rol2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        rol2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        rol2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        rol2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        txt.nl()

        @(addr) = %10110101
        txt.print_ubbin(@(addr), true)
        txt.nl()
        ror2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        ror2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        ror2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        ror2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.nl()
        txt.nl()

        test_stack.test()

    }

    sub integers() {
        ubyte[]  ubarr = [1,2,3,4,5,0,4,3,2,1, 255, 255, 255]
        byte[]  barr = [1,2,3,4,5,-4,0,-3,2,1, -128, -128, -127]
        uword[]  uwarr = [100,200,300,400,0,500,400,300,200,100]
        word[] warr = [100,200,300,400,500,0,-400,-300,200,100,-99, -4096]

        ubyte zero=0
        ubyte ub
        ubyte ub2
        byte bb
        uword uw
        word ww

        repeat(20) {
            txt.nl()
        }

        ub = sys.read_flags()
        txt.print_ub(ub)
        txt.nl()
        ub = zero+sys.read_flags()*1+zero
        txt.print_ub(ub)
        txt.nl()


        ub = math.rnd()
        txt.print_ub(ub)
        txt.nl()
        ub = zero+math.rnd()*1+zero
        txt.print_ub(ub)
        txt.nl()

        uw = math.rndw()
        txt.print_uw(uw)
        txt.nl()
        uw = zero+math.rndw()*1+zero
        txt.print_uw(uw)
        txt.nl()


        uw = 50000
        ub = sqrt16(uw)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+sqrt16(uw)*1+zero
        txt.print_ub(ub)
        txt.nl()

        bb = -100
        bb = sgn(bb)
        txt.print_b(bb)
        txt.nl()
        bb = -100
        bb = zero+sgn(bb)*1+zero
        txt.print_b(bb)
        txt.nl()

        ub = 100
        bb = sgn(ub)
        txt.print_b(bb)
        txt.nl()
        ub = 100
        bb = zero+sgn(ub)*1+zero
        txt.print_b(bb)
        txt.nl()

        ww = -1000
        bb = sgn(ww)
        txt.print_b(bb)
        txt.nl()
        bb = zero+sgn(ww)*1+zero
        txt.print_b(bb)
        txt.nl()

        uw = 1000
        bb = sgn(uw)
        txt.print_b(bb)
        txt.nl()
        bb = zero+sgn(uw)*1+zero
        txt.print_b(bb)
        txt.nl()

        bb = -100
        bb = abs(bb) as byte
        txt.print_b(bb)
        txt.nl()
        bb = -100
        bb = zero+(abs(bb) as byte)*1+zero
        txt.print_b(bb)
        txt.nl()

        ww = -1000
        ww = abs(ww) as word
        txt.print_w(ww)
        txt.nl()
        ww = -1000
        ww = zero+(abs(ww) as word)*1+zero
        txt.print_w(ww)
        txt.nl()
        
        ub = any(ubarr)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+any(ubarr)*1+zero
        txt.print_ub(ub)
        txt.nl()

        ub = any(barr)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+any(barr)*1+zero
        txt.print_ub(ub)
        txt.nl()

        ub = any(uwarr)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+any(uwarr)*1+zero
        txt.print_ub(ub)
        txt.nl()

        ub = any(warr)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+any(warr)*1+zero
        txt.print_ub(ub)
        txt.nl()

        ub = all(ubarr)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+all(ubarr)*1+zero
        txt.print_ub(ub)
        txt.nl()

        ub = all(barr)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+all(barr)*1+zero
        txt.print_ub(ub)
        txt.nl()

        ub = all(uwarr)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+all(uwarr)*1+zero
        txt.print_ub(ub)
        txt.nl()

        ub = all(warr)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+all(warr)*1+zero
        txt.print_ub(ub)
        txt.nl()

        sort(ubarr)
        sort(barr)
        sort(uwarr)
        sort(warr)
        reverse(ubarr)
        reverse(barr)
        reverse(uwarr)
        reverse(warr)

        test_stack.test()
    }

    sub floatingpoint() {
        ubyte[]  barr = [1,2,3,4,5,0,4,3,2,1]
        float[] flarr = [1.1, 2.2, 3.3, 0.0, -9.9, 5.5, 4.4]

        ubyte zero=0
        ubyte ub
        byte bb
        uword uw
        float fl
        float fzero=0.0

        fl = -9.9
        bb = sgn(fl)
        txt.print_b(bb)
        txt.nl()
        fl = -9.9
        bb = zero+sgn(fl)*1+zero
        txt.print_b(bb)
        txt.nl()

        ub = any(flarr)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+any(flarr)*1+zero
        txt.print_ub(ub)
        txt.nl()
        ub = all(flarr)
        txt.print_ub(ub)
        txt.nl()
        ub = zero+all(flarr)*1+zero
        txt.print_ub(ub)
        txt.nl()

        reverse(flarr)
        for ub in 0 to len(flarr)-1 {
            floats.print_f(flarr[ub])
            txt.chrout(',')
        }
        txt.nl()

        test_stack.test()
    }
}
