]> git.sur5r.net Git - cc65/blobdiff - libsrc/cbm/read.s
Made the CBM stdin consoles echo '\n' to the screen.
[cc65] / libsrc / cbm / read.s
index 0183946b559ceb69a7243bd4d0004fe5fcbb0973..6227f7e0a118e61a9545dc22545e631dfdc0f101 100644 (file)
@@ -1,5 +1,6 @@
 ;
-; Ullrich von Bassewitz, 16.11.2002
+; 2002-11-16, Ullrich von Bassewitz
+; 2013-12-18, Greg King
 ;
 ; int read (int fd, void* buf, unsigned count);
 ;
@@ -7,21 +8,22 @@
         .export         _read
         .constructor    initstdin
 
-        .import         SETLFS, OPEN, CHKIN, BASIN, CLRCH, READST
+        .import         SETLFS, OPEN, CHKIN, BASIN, CLRCH, BSOUT, READST
         .import         rwcommon
         .import         popax
-        .import         __errno, __oserror
         .importzp       ptr1, ptr2, ptr3, tmp1, tmp2, tmp3
 
+        .include        "cbm.inc"
         .include        "errno.inc"
         .include        "fcntl.inc"
-        .include        "cbm.inc"
         .include        "filedes.inc"
 
 
 ;--------------------------------------------------------------------------
 ; initstdin: Open the stdin file descriptors for the keyboard
 
+.segment        "INIT"
+
 .proc   initstdin
 
         lda     #LFN_READ
 ;--------------------------------------------------------------------------
 ; _read
 
+.code
 
 .proc   _read
 
         jsr     rwcommon        ; Pop params, check handle
-        bcs     invalidfd       ; Branch if handle not ok
+        bcs     invalidfd       ; Invalid handle
 
 ; Check if the LFN is valid and the file is open for writing
 
         tax
         lda     fdtab-LFN_OFFS,x; Get flags for this handle
         and     #LFN_READ       ; File open for writing?
-        beq     notopen
+        beq     invalidfd
 
 ; 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
+; Remember the device number.
 
-        jsr     CHKIN
-        bcs     error
+        ldy     unittab-LFN_OFFS,x
+        sty     unit
 
-; Go looping...
+; Valid lfn. Make it the input file
 
-        bcc     @L3             ; Branch always
+        jsr     CHKIN
+        bcc     @L3             ; Branch if ok
+        jmp     __mappederrno   ; Store into __oserror, map to errno, return -1
 
 ; Read the next byte
 
 @L0:    jsr     BASIN
         sta     tmp1            ; Save the input byte
+        ldx     unit
+        bne     @L0_1           ; Not keyboard/screen-editor
+        cmp     #$0D            ; Is it a Carriage Return?
+        bne     @L0_1
+        jsr     BSOUT           ; Yes, echo it (because editor didn't)
 
-        jsr     READST          ; Read the IEEE status
+@L0_1:  jsr     READST          ; Read the IEEE status
         sta     tmp3            ; Save it
         and     #%10111111      ; Check anything but the EOI bit
-        bne     error5          ; Assume device not present
+        bne     devnotpresent   ; Assume device not present
 
 ; Store the byte just read
 
 
 done:   jsr     CLRCH
 
-; Return the number of chars read
+; Clear _oserror and return the number of chars read
 
-eof:    lda     ptr3
+eof:    lda     #0
+        sta     __oserror
+        lda     ptr3
         ldx     ptr3+1
         rts
 
-; Error entry, file descriptor is invalid
+; Error entry: Device not present
 
-invalidfd:
-        lda     #EINVAL
-        sta     __errno
-        lda     #0
-        sta     __errno+1
-        beq     errout
+devnotpresent:
+        lda     #ENODEV
+        jmp     __directerrno   ; Sets _errno, clears _oserror, returns -1
 
-; Error entry, file is not open
+; Error entry: The given file descriptor is not valid or not open
 
-notopen:
-        lda     #3              ; File not open
-        bne     error
+invalidfd:
+        lda     #EBADF
+        jmp     __directerrno   ; Sets _errno, clears _oserror, returns -1
 
-; Error entry, status not ok
+.endproc
 
-error5: lda     #5              ; Device not present
-error:  sta     __oserror
-errout: lda     #$FF
-        tax                     ; Return -1
-        rts
 
-.endproc
+;--------------------------------------------------------------------------
 
+.bss
 
+unit:   .res    1