;
; Ullrich von Bassewitz, 22.06.2002
;
; Original C code by Marc 'BlackJack' Rintsch, 19.03.2001
;
; int __fastcall__ cbm_read (unsigned char lfn, void* buffer, unsigned int size)
; /* Reads up to "size" bytes from a file to "buffer".
; ** Returns the number of actually read bytes, 0 if there are no bytes left
; ** (EOF) or -1 in case of an error. _oserror contains an errorcode then (see
; ** table below).
; */
; {
;     static unsigned int bytesread;
;     static unsigned char tmp;
;
;     /* if we can't change to the inputchannel #lfn then return an error */
;     if (_oserror = cbm_k_chkin(lfn)) return -1;
;
;     bytesread = 0;
;
;     while (bytesread<size && !cbm_k_readst()) {
;         tmp = cbm_k_basin();
;
;         /* the kernal routine BASIN sets ST to EOF if the end of file
;         ** is reached the first time, then we have store tmp.
;         ** every subsequent call returns EOF and READ ERROR in ST, then
;         ** we have to exit the loop here immediatly.
;         */
;         if (cbm_k_readst() & 0xBF) break;
;
;         ((unsigned char*)buffer)[bytesread++] = tmp;
;     }
;
;     cbm_k_clrch();
;     return bytesread;
; }
;

        .include        "cbm.inc"

        .export         _cbm_read
        .importzp       ptr1, ptr2, ptr3, tmp1
        .import         popax, popa
        .import         __oserror


_cbm_read:
        eor     #$FF
        sta     ptr1
        txa
        eor     #$FF
        sta     ptr1+1          ; Save -size-1

        jsr     popax
        sta     ptr2
        stx     ptr2+1          ; Save buffer

        jsr     popa
        tax
        jsr     CHKIN
        bcs     @E1             ; Branch on error

; bytesread = 0;

        lda     #$00
        sta     ptr3
        sta     ptr3+1
        beq     @L3             ; Branch always

; Loop

@L1:    jsr     READST
        cmp     #0              ; Status ok?
        bne     @L4

        jsr     BASIN           ; Read next char from file
        sta     tmp1            ; Save it for later

        jsr     READST
        and     #$BF
        bne     @L4

        lda     tmp1
        ldy     #0
        sta     (ptr2),y        ; Save read byte

        inc     ptr2
        bne     @L2
        inc     ptr2+1          ; ++buffer;

@L2:    inc     ptr3
        bne     @L3
        inc     ptr3+1          ; ++bytesread;

@L3:    inc     ptr1
        bne     @L1
        inc     ptr1+1
        bne     @L1

@L4:    jsr     CLRCH

        lda     ptr3
        ldx     ptr3+1          ; return bytesread;

        rts

; CHKIN failed

@E1:    sta     __oserror
        lda     #$FF
        tax
        rts                     ; return -1

