%import diskio
%import floats
%zeropage basicsafe
%option no_sysinit

main {

    ubyte[256] buffer = 0 to 255

    sub print_speed(uword jiffies) {
        if jiffies==0 {
            txt.print("\n 0 jiffies measured, speed is extremely high\n")
            return
        }
        float speed = floats.floor(65536.0 / (jiffies as float / 60.0))
        txt.nl()
        txt.print_uw(jiffies)
        txt.print(" jiffies = ")
        floats.print_f(speed)
        txt.print(" bytes/sec\n")
    }

    sub start() {
        txt.print("\n\ndisk benchmark on drive 8.\n\n")

        uword batchtotaltime

        txt.print("writing 64kb using save()")
        cbm.SETTIM(0,0,0)
        ; save 2 times 32Kb to make it 64Kb total
        void diskio.save("@:benchmark.dat", $100, 32768)
        void diskio.save("@:benchmark.dat", $100, 32768)
        print_speed(cbm.RDTIM16())

        txt.print("\nwriting 64kb sequentially")
        if diskio.f_open_w("@:benchmark.dat") {
            cbm.SETTIM(0,0,0)
            repeat 65536/256 {
                if not diskio.f_write(buffer, 256)
                    sys.exit(1)
            }
            diskio.f_close_w()
            print_speed(cbm.RDTIM16())
        }

        txt.print("\nreading 64kb using load() into hiram")
        cbm.SETTIM(0,0,0)
        cx16.rambank(4)
        if not diskio.load("benchmark.dat", $a000)
            sys.exit(1)
        print_speed(cbm.RDTIM16())

        txt.print("\nreading 64kb using vload() into vram")
        cbm.SETTIM(0,0,0)
        if not diskio.vload("benchmark.dat", 0, $0000)
            sys.exit(1)
        print_speed(cbm.RDTIM16())

        txt.print("\nreading 64kb sequentially")
        if diskio.f_open("benchmark.dat") {
            cbm.SETTIM(0,0,0)
            repeat 65536/255 {
                if not diskio.f_read(buffer, 255)
                    sys.exit(1)
            }
            diskio.f_close()
            print_speed(cbm.RDTIM16())
        }

        txt.nl()
        txt.print(diskio.status())
        txt.print("\ndone.\n")

        diskio.delete("benchmark.dat")
    }
}
