; this program shows the use of the f_seek function to seek to a position in an opened file.
; (this only works on Commander X16 DOS. on sdcard, not on host filesystem.)

%import diskio
%import textio
%zeropage basicsafe
%option no_sysinit

main {
    uword megabuffer = memory("megabuffer", 20000, 256)

    sub start() {

        txt.print("writing data file (drive 8)...\n")
        uword total=0
        if diskio.f_open_w("@:seektestfile.bin") {
            repeat 100 {
                str text = "hello world.*"
                void diskio.f_write(text, strings.length(text))
                total += strings.length(text)
            }
            diskio.f_close_w()
            txt.print("written size=")
            txt.print_uw(total)
            txt.nl()
        } else {
            txt.print("error: ")
            txt.print(diskio.status())
            sys.exit(1)
        }

        read_last_bytes()

        txt.print("\nseeking to 1292 and writing a few bytes...\n")
        if diskio.f_open_w_seek("seektestfile.bin") {
            diskio.f_seek_w(0, 1292)
            void diskio.f_write("123", 3)
            diskio.f_close_w()
        } else {
            txt.print("error: ")
            txt.print(diskio.status())
            sys.exit(1)
        }

        read_last_bytes()
    }

    sub read_last_bytes() {
        ; read the last 10 bytes of the 1300 bytes file
        uword total = 0
        uword size
        txt.print("\nreading...\n")
        if diskio.f_open("seektestfile.bin") {
            size = diskio.f_read_all(megabuffer)
            diskio.f_close()
            txt.print("size read:")
            txt.print_uw(size)
            txt.nl()
        } else {
            txt.print("error!\n")
            sys.exit(1)
        }

        txt.print("\nseeking to 1290 and reading...\n")
        if diskio.f_open("seektestfile.bin") {
            diskio.f_seek(0, 1290)
            uword ptr = megabuffer
            do {
                size = diskio.f_read(ptr, 255)
                total += size
                ptr += size
            } until size==0
            diskio.f_close()
            txt.print("size read=")
            txt.print_uw(total)
            txt.nl()
            megabuffer[lsb(total)] = 0
            txt.print("buffer read=")
            ubyte idx
            for idx in 0 to lsb(total-1) {
                txt.print_ubhex(megabuffer[idx], false)
                txt.spc()
            }
            txt.print("\nas text: \"")
            txt.print(megabuffer)
            txt.print("\"\n")
        } else {
            txt.print("error: ")
            txt.print(diskio.status())
            sys.exit(1)
        }
    }
}
