    ;; This example shows how to read a file byte by byte.
    ;;
    ;; A file without a header must be read this way, it can't be
    ;; read using CAS IN DIRECT (unless the in-memory header is patched)
    ;;
    ;; This example doesn't have any error checking.

    .cas_in_open equ &bc77
    .cas_in_close equ &bc7a
    .cas_in_char equ &bc80

    ld hl,&4000					;; address to load file data to (example)
    push hl

    ;; open file for reading
    ld b,end_filename-filename
    ld hl,filename
    ld de,two_k_buffer
    call cas_in_open

    ;; If a file is opened without a header:
    ;; - the filetype will be ASCII (&16)
    ;; - the length and load address will be undefined.
    ;;
    ;; If a file is opened with a header, the
    ;; - the filetype will be taken from the header
    ;; - the length and load address will be taken from the header
    ;;
    ;; A file without a header can't be read with CAS IN DIRECT
    ;; and must be read using CAS IN CHAR.

    pop hl

    ;; read a char from the file, character is returned in A register
    .next_byte
    call cas_in_char
    jr nc,not_eof
    jr nz,not_eof

    ;; could be end of file
    ;; test for hard end of file byte
    cp &f
    jr nz,not_eof
    jr eof

    .not_eof
    ;; write byte to memory
    ld (hl),a
    inc hl
    jr next_byte

    .eof
    call cas_in_close
    ret

    ;;-------------------------------------------------------------------
    ;; name of the file to read

    .filename
    defb "datafile.bin"
    .end_filename

    ;;-------------------------------------------------------------------
    ;; this buffer is filled with data from the file
    .two_k_buffer defs 2048