]> git.sur5r.net Git - cc65/blobdiff - libsrc/cbm/read.s
added sleep() implementation
[cc65] / libsrc / cbm / read.s
index 6c2046900819eb52bf1714b4a08c0b6c575e4530..1e9fdbd5cb0aec643a8991d1d191afccfbffc3ef 100644 (file)
@@ -7,11 +7,12 @@
         .export         _read
         .constructor    initstdin
 
+        .import         SETLFS, OPEN, CHKIN, BASIN, CLRCH, READST
+        .import         rwcommon
         .import         popax
-        .import         __errno, __oserror
-        .importzp       ptr1, ptr2, ptr3, tmp1, tmp2
+        .import         __oserror
+        .importzp       ptr1, ptr2, ptr3, tmp1, tmp2, tmp3
 
-        .include        "errno.inc"
         .include        "fcntl.inc"
         .include        "cbm.inc"
         .include        "filedes.inc"
 
 .proc   _read
 
-; Retrieve count
-
-        jsr     popax           ; Get count
-        eor     #$FF
-        sta     ptr1
-        txa
-        eor     #$FF
-        sta     ptr1+1          ; Remember -count-1
-
-; Retrieve buf
-
-        jsr     popax
-        sta     ptr2
-        stx     ptr2+1
-
-; Retrieve the handle
-
-        jsr     popax
-
-; Check if we have a valid handle
-
-        cpx     #$00
-        bne     invalidfd
-        cmp     #MAX_FDS        ; Is it valid?
-        bcs     invalidfd       ; Jump if no
+        jsr     rwcommon        ; Pop params, check handle
+        bcs     errout          ; Invalid handle, errno already set
 
 ; Check if the LFN is valid and the file is open for writing
 
         and     #LFN_READ       ; File open for writing?
         beq     notopen
 
+; Check the EOF flag. If it is set, don't read anything
+
+        lda     fdtab-LFN_OFFS,x; Get flags for this handle
+        bmi     eof
+
 ; Valid lfn. Make it the input file
 
         jsr     CHKIN
         bcs     error
 
-; Clear the byte counter
-
-        lda     #$00
-        sta     ptr3
-        sta     ptr3+1
-
-; Read the status to check if we are already at the end of the file
-        
-        jsr     READST
-        and     #%01000000
-        bne     done
-
 ; Go looping...
 
-        beq     deccount        ; Branch always
+        bcc     @L3             ; Branch always
 
 ; Read the next byte
 
-loop:   jsr     BASIN
+@L0:    jsr     BASIN
         sta     tmp1            ; Save the input byte
 
         jsr     READST          ; Read the IEEE status
-        sta     tmp2            ; Save it
+        sta     tmp3            ; Save it
         and     #%10111111      ; Check anything but the EOI bit
         bne     error5          ; Assume device not present
 
@@ -121,17 +92,24 @@ loop:   jsr     BASIN
 
 ; Get the status again and check the EOI bit
 
-@L2:    lda     tmp2
+@L2:    lda     tmp3
         and     #%01000000      ; Check for EOI
-        bne     done            ; Jump if end of file reached
+        bne     @L4             ; Jump if end of file reached
 
 ; Decrement the count
 
-deccount:
-        inc     ptr1
-        bne     loop
+@L3:    inc     ptr1
+        bne     @L0
         inc     ptr1+1
-        bne     loop
+        bne     @L0
+        beq     done            ; Branch always
+
+; Set the EOI flag and bail out
+
+@L4:    ldx     tmp2            ; Get the handle
+        lda     #LFN_EOF
+        ora     fdtab,x
+        sta     fdtab,x
 
 ; Read done, close the input channel
 
@@ -139,19 +117,10 @@ done:   jsr     CLRCH
 
 ; Return the number of chars read
 
-        lda     ptr3
+eof:    lda     ptr3
         ldx     ptr3+1
         rts
 
-; Error entry, file descriptor is invalid
-
-invalidfd:
-        lda     #EINVAL
-        sta     __errno
-        lda     #0
-        sta     __errno+1
-        beq     errout
-
 ; Error entry, file is not open
 
 notopen:
@@ -170,4 +139,3 @@ errout: lda     #$FF
 
 
 
-