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

main {

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

        test_stack.test()
    }

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

        repeat(10) {
            txt.chrout('\n')
        }

        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        set_carry()
        rol(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        set_carry()
        rol(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        set_carry()
        rol(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        set_carry()
        rol(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        txt.chrout('\n')

        uwarr[0] = %1100111110101010
        ror(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        set_carry()
        ror(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        set_carry()
        ror(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        set_carry()
        ror(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        set_carry()
        ror(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        txt.chrout('\n')

        clear_carry()
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        rol2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        rol2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        rol2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        rol2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        txt.chrout('\n')

        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        ror2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        ror2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        ror2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        ror2(uwarr[0])
        txt.print_uwbin(uwarr[0], true)
        txt.chrout('\n')
        txt.chrout('\n')

        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        set_carry()
        rol(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        set_carry()
        rol(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        set_carry()
        rol(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        set_carry()
        rol(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        txt.chrout('\n')

        set_carry()
        ror(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        set_carry()
        ror(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        set_carry()
        ror(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        set_carry()
        ror(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        set_carry()
        ror(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        txt.chrout('\n')


        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        rol2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        rol2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        rol2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        rol2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        txt.chrout('\n')

        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        ror2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        ror2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        ror2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        ror2(ubarr[0])
        txt.print_ubbin(ubarr[0], true)
        txt.chrout('\n')
        txt.chrout('\n')

        &ubyte  membyte = $c000
        uword addr = $c000

        @(addr) = %10110101
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        set_carry()
        rol(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        set_carry()
        rol(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        set_carry()
        rol(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        set_carry()
        rol(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        txt.chrout('\n')

        @(addr) = %10110101
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        set_carry()
        ror(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        set_carry()
        ror(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        set_carry()
        ror(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        set_carry()
        ror(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        txt.chrout('\n')

        @(addr) = %10110101
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        rol2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        rol2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        rol2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        rol2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        txt.chrout('\n')

        @(addr) = %10110101
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        ror2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        ror2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        ror2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        ror2(@(addr))
        txt.print_ubbin(@(addr), true)
        txt.chrout('\n')
        txt.chrout('\n')

        test_stack.test()

    }

    sub strings() {
        const uword ADDR = $8400
        const uword ADDR2 = $8000

        memset(ADDR2, 40*25, '*')
        memset(ADDR2, 40, '1')
        memset(ADDR2+24*40, 39, '2')
        memsetw(ADDR2, 40*25/2, $3132)
        memsetw(ADDR2, 20, $4142)
        memsetw(ADDR2+24*40, 19, $4241)
        memcopy(ADDR2, ADDR, 200)

        str result = "?" *10
        str s1 = "irmen"
        str s2 = "hello"
        str dots = "....."

        ubyte ub
        byte bb
        ubyte zero=0

        bb = strcmp(s1, s2)
        txt.print_b(bb)
        txt.chrout('\n')
        bb = strcmp(s2, s1)
        txt.print_b(bb)
        txt.chrout('\n')
        txt.print_ub(s1==s2)
        txt.chrout('\n')
        txt.print_ub(s1<s2)
        txt.chrout('\n')
        txt.print_ub(s1>s2)
        txt.chrout('\n')
        bb = zero+strcmp(s1,s2)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')
        bb = zero+strcmp(s2,s1)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        ub = strlen(s1)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+strlen(s1)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        leftstr(s1, result, 3)
        txt.print(result)
        txt.chrout('\n')
        leftstr(s1, result, len(s1))
        txt.print(result)
        txt.chrout('\n')
        txt.chrout('\n')

        result = "x"*8
        rightstr(s2, result, 3)
        txt.print(result)
        txt.chrout('\n')
        rightstr(s2, result, len(s1))
        txt.print(result)
        txt.chrout('\n')

        result = "y"*10
        substr(s2, result, 1, 3)
        txt.print(result)
        txt.chrout('\n')

        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.chrout('\n')
        }

        ub = read_flags()
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+read_flags()*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')


        ub = rnd()
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+rnd()*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        uw = rndw()
        txt.print_uw(uw)
        txt.chrout('\n')
        uw = zero+rndw()*1+zero
        txt.print_uw(uw)
        txt.chrout('\n')


        uw = 50000
        ub = sqrt16(uw)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+sqrt16(uw)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        bb = -100
        bb = sgn(bb)
        txt.print_b(bb)
        txt.chrout('\n')
        bb = -100
        bb = zero+sgn(bb)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        ub = 100
        bb = sgn(ub)
        txt.print_b(bb)
        txt.chrout('\n')
        ub = 100
        bb = zero+sgn(ub)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        ww = -1000
        bb = sgn(ww)
        txt.print_b(bb)
        txt.chrout('\n')
        bb = zero+sgn(ww)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        uw = 1000
        bb = sgn(uw)
        txt.print_b(bb)
        txt.chrout('\n')
        bb = zero+sgn(uw)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        ub = 0
        uw = sin16u(ub)
        txt.print_uw(uw)
        txt.chrout('\n')
        uw = zero+sin16u(ub)*1+zero
        txt.print_uw(uw)
        txt.chrout('\n')

        ub = 0
        uw = cos16u(ub)
        txt.print_uw(uw)
        txt.chrout('\n')
        uw = zero+cos16u(ub)*1+zero
        txt.print_uw(uw)
        txt.chrout('\n')

        ub = 0
        ww = sin16(ub)
        txt.print_w(ww)
        txt.chrout('\n')
        ww = zero+sin16(ub)*1+zero
        txt.print_w(ww)
        txt.chrout('\n')

        ub = 0
        ww = cos16(ub)
        txt.print_w(ww)
        txt.chrout('\n')
        uw = 0
        ww = zero+cos16(ub)*1+zero
        txt.print_w(ww)
        txt.chrout('\n')

        ub2 = 0
        ub = sin8u(ub2)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+sin8u(ub2)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        ub2 = 0
        ub = cos8u(ub2)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+cos8u(ub2)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        ub2 = 0
        bb = sin8(ub2)
        txt.print_b(bb)
        txt.chrout('\n')
        bb = zero+sin8(ub2)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        ub2 = 0
        bb = cos8(ub2)
        txt.print_b(bb)
        txt.chrout('\n')
        bb = zero+cos8(ub2)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        bb = -100
        bb = abs(bb)
        txt.print_b(bb)
        txt.chrout('\n')
        bb = -100
        bb = zero+abs(bb)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        ww = -1000
        ww = abs(ww)
        txt.print_w(ww)
        txt.chrout('\n')
        ww = -1000
        ww = zero+abs(ww)*1+zero
        txt.print_w(ww)
        txt.chrout('\n')

        ub = min(ubarr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+min(ubarr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        bb = min(barr)
        txt.print_b(bb)
        txt.chrout('\n')
        bb = zero+min(barr)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        uw = min(uwarr)
        txt.print_uw(uw)
        txt.chrout('\n')
        uw = zero+min(uwarr)*1+zero
        txt.print_uw(uw)
        txt.chrout('\n')

        ww = min(warr)
        txt.print_w(ww)
        txt.chrout('\n')
        ww = zero+min(warr)*1+zero
        txt.print_w(ww)
        txt.chrout('\n')

        ub = max(ubarr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+max(ubarr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        bb = max(barr)
        txt.print_b(bb)
        txt.chrout('\n')
        bb = zero+max(barr)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        uw = max(uwarr)
        txt.print_uw(uw)
        txt.chrout('\n')
        uw = zero+max(uwarr)*1+zero
        txt.print_uw(uw)
        txt.chrout('\n')

        ww = max(warr)
        txt.print_w(ww)
        txt.chrout('\n')
        ww = zero+max(warr)*1+zero
        txt.print_w(ww)
        txt.chrout('\n')

        ub = any(ubarr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+any(ubarr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        ub = any(barr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+any(barr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        ub = any(uwarr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+any(uwarr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        ub = any(warr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+any(warr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        ub = all(ubarr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+all(ubarr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        ub = all(barr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+all(barr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        ub = all(uwarr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+all(uwarr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        ub = all(warr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+all(warr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')


        uw = sum(ubarr)
        txt.print_uw(uw)
        txt.chrout('\n')
        uw = zero+sum(ubarr)*1+zero
        txt.print_uw(uw)
        txt.chrout('\n')

        ww = sum(barr)
        txt.print_w(ww)
        txt.chrout('\n')
        ww = zero+sum(barr)*1+zero
        txt.print_w(ww)
        txt.chrout('\n')

        uw = sum(uwarr)
        txt.print_uw(uw)
        txt.chrout('\n')
        uw = zero+sum(uwarr)*1+zero
        txt.print_uw(uw)
        txt.chrout('\n')

        ww = sum(warr)
        txt.print_w(ww)
        txt.chrout('\n')
        ww = zero+sum(warr)*1+zero
        txt.print_w(ww)
        txt.chrout('\n')

        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
        fl = abs(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = -9.9
        fl = fzero+abs(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = 9.9
        fl = atan(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = 9.9
        fl = fzero+atan(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = -9.9
        fl = ceil(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = -9.9
        fl = fzero+ceil(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = -9.9
        fl = cos(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = -9.9
        fl = fzero+cos(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = -9.9
        fl = sin(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = -9.9
        fl = fzero+sin(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = 9.9
        fl = tan(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = 9.9
        fl = fzero+tan(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = 3.1415927
        fl = deg(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = 3.1415927
        fl = fzero+deg(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = 90
        fl = rad(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = 90
        fl = fzero+rad(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = -9.9
        fl = floor(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = -9.9
        fl = fzero+floor(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = 3.1415927
        fl = ln(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = 3.1415927
        fl = fzero+ln(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = 3.1415927
        fl = log2(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = 3.1415927
        fl = fzero+log2(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = -9.9
        fl = round(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = -9.9
        fl = fzero+round(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = -9.9
        bb = sgn(fl)
        txt.print_b(bb)
        txt.chrout('\n')
        fl = -9.9
        bb = zero+sgn(fl)*1+zero
        txt.print_b(bb)
        txt.chrout('\n')

        fl = 3.1415927
        fl = sqrt(fl)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = 3.1415927
        fl = fzero+sqrt(fl)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        fl = rndf()
        floats.print_f(fl)
        txt.chrout('\n')
        fl = fzero+rndf()*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        swap(fl, fzero)
        swap(fzero, fl)

        ub = any(flarr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+any(flarr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = all(flarr)
        txt.print_ub(ub)
        txt.chrout('\n')
        ub = zero+all(flarr)*1+zero
        txt.print_ub(ub)
        txt.chrout('\n')

        reverse(flarr)
        for ub in 0 to len(flarr)-1 {
            floats.print_f(flarr[ub])
            txt.chrout(',')
        }
        txt.chrout('\n')
        fl = max(flarr)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = fzero+max(flarr)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')
        fl = min(flarr)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = fzero+min(flarr)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')
        fl = sum(flarr)
        floats.print_f(fl)
        txt.chrout('\n')
        fl = fzero+sum(flarr)*1.0+fzero
        floats.print_f(fl)
        txt.chrout('\n')

        test_stack.test()
    }
}
