
;  This benchmark program is meant to check for regressions in the
;  Prog8 compiler's code-generator (performance wise).
;
;  As the X16 computer is a more or less fixed system, it's not very useful
;  to benchmark the computer itself with.


%import textio
%import b_adpcm
%import b_circles
%import b_3d
%import b_life
%import b_mandelbrot
%import b_queens
%import b_textelite
%import b_maze

%zeropage basicsafe
%option no_sysinit


main {

    str[20] benchmark_names
    uword[20] benchmark_score


    sub start() {
        ubyte benchmark_number

        void cx16.set_screen_mode(3)
        txt.color2(1, 6)
        txt.clear_screen()

        txt.print("\n\n\n  prog8 compiler benchmark tests.\n")
        sys.wait(60)

        benchmark_number = 0

        announce_benchmark("maze solver")
        benchmark_score[benchmark_number]  = maze.bench(300)
        benchmark_number++

        announce_benchmark("n-queens")
        benchmark_score[benchmark_number]  = queens.bench(300)
        benchmark_number++

        announce_benchmark("mandelbrot (floating point)")
        benchmark_score[benchmark_number]  = mandelbrot.calc(400)
        benchmark_number++

        announce_benchmark("game of life")
        benchmark_score[benchmark_number]  = life.benchmark(300)
        benchmark_number++

        announce_benchmark("3d model rotation")
        benchmark_score[benchmark_number]  = rotate3d.benchmark(300)
        benchmark_number++

        announce_benchmark("adpcm audio decoding")
        benchmark_score[benchmark_number]  = adpcm.decode_benchmark(300)
        benchmark_number++

        announce_benchmark("circles with gfx_lores")
        benchmark_score[benchmark_number]  = circles.draw(false, 300)
        benchmark_number++

;        announce_benchmark("circles with kernal")
;        benchmark_score[benchmark_number]  = circles.draw(true, 300)
;        benchmark_number++

        announce_benchmark("text-elite")
        benchmark_score[benchmark_number]  = textelite.bench(120)
        benchmark_number++

        benchmark_names[benchmark_number] = 0
        benchmark_score[benchmark_number] = 0

        void cx16.set_screen_mode(3)
        txt.uppercase()
        txt.color2(1, 6)
        uword final_score
        benchmark_number = 0
        txt.print("\nscore benchmark\n\n")
        do {
            txt.spc()
            txt.print_uw(benchmark_score[benchmark_number])
            txt.column(6)
            txt.print(benchmark_names[benchmark_number])
            final_score += benchmark_score[benchmark_number]
            txt.nl()
            benchmark_number++
        } until benchmark_names[benchmark_number]==0

        txt.print("\n\nfinal score : ")
        txt.print_uw(final_score)
        txt.nl()

        sub announce_benchmark(str name) {
            benchmark_names[benchmark_number] = name
            void cx16.set_screen_mode(3)
            txt.uppercase()
            txt.color2(1, 6)
            txt.clear_screen()
            txt.plot(4, 6)
            txt.print(benchmark_names[benchmark_number])
            txt.nl()
            sys.wait(60)
        }
    }
}
