]> git.sur5r.net Git - cc65/blobdiff - libsrc/apple2/write.s
Removed (pretty inconsistently used) tab chars from source code base.
[cc65] / libsrc / apple2 / write.s
index 3fa48203113a444edaa0a793c0b9c2ec73d57833..21f4a45a4fac6baef6892adb207627271b1107e2 100644 (file)
-       ;;
-       ;; Kevin Ruland
-       ;;
-       ;; int write (int fd, const void* buf, int count);
-       ;;
-       ;; for now will only write to fd = stdout
-       ;;
-
-       .export         _write
-       .import         popax, COUT
-       .importzp       ptr1, ptr2, ptr3
-
-.proc   _write
-
-       sta     ptr2            ; Save count for later
-       stx     ptr2+1
-       sta     ptr3
-       sta     ptr3+1          ; save for result
-       jsr     popax           ; get buf
-       sta     ptr1
-       stx     ptr1+1
-       jsr     popax           ; get fd and discard
-L1:    lda     ptr2
-       ora     ptr2+1          ; count zero?
-       beq     L9
-       ldy     #$00
-       lda     (ptr1),y
-       cmp     #$0A            ; Check for \n = Crtl-j
-       bne     rawout
-       lda     #$0D            ; Issue cr
-rawout:
-       ora     #$80
-       jsr     COUT
-       inc     ptr1
-       bne     L2
-       inc     ptr1+1
-L2:    lda     ptr2
-       bne     L3
-       dec     ptr2
-       dec     ptr2+1
-       jmp     L1
-L3:    dec     ptr2
-       jmp     L1
-
-; No error, return count
-
-L9:    lda     ptr3
-       ldx     ptr3+1
-       rts
-
-.endproc
+;
+; Oliver Schmidt, 12.01.2005
+;
+; int __fastcall__ write (int fd, const void* buf, unsigned count);
+;
 
+        .export         _write
+        .import         rwprolog, rwcommon, rwepilog
+        .import         COUT
+
+        .include        "zeropage.inc"
+        .include        "errno.inc"
+        .include        "fcntl.inc"
+        .include        "mli.inc"
+        .include        "filedes.inc"
+
+_write:
+        ; Get parameters
+        jsr     rwprolog
+        bcs     errno
+        tax                     ; Save fd
+
+        ; Check for write access
+        lda     fdtab + FD::FLAGS,y
+        and     #O_WRONLY
+        beq     einval
+
+        ; Check for device
+        txa                     ; Restore fd
+        bmi     device
+
+        ; Check for append flag
+        lda     fdtab + FD::FLAGS,y
+        and     #O_APPEND
+        beq     write
+
+        ; Set fd
+        stx     mliparam + MLI::EOF::REF_NUM
+
+        ; Get file size
+        lda     #GET_EOF_CALL
+        ldx     #EOF_COUNT
+        jsr     callmli
+        bcs     oserr
+
+        ; REF_NUM already set
+        .assert MLI::MARK::REF_NUM = MLI::EOF::REF_NUM, error
+
+        ; POSITION already set
+        .assert MLI::MARK::POSITION = MLI::EOF::EOF, error
+
+        ; Set file pointer
+        lda     #SET_MARK_CALL
+        ldx     #MARK_COUNT
+        jsr     callmli
+        bcs     oserr
+
+        ; Do write
+write:  lda     fdtab + FD::REF_NUM,y
+        ldy     #WRITE_CALL
+        jmp     rwcommon
+
+        ; Save count for epilog
+device: ldx     ptr2
+        lda     ptr2+1
+        stx     mliparam + MLI::RW::TRANS_COUNT
+        sta     mliparam + MLI::RW::TRANS_COUNT+1
+
+        ; Check for zero count
+        ora     ptr2
+        beq     done
+
+        ; Get char from buf
+        ldy     #$00
+next:   lda     (ptr1),y
+
+        ; Replace '\n' with '\r'
+        cmp     #$0A
+        bne     :+
+        lda     #$0D
+
+        ; Set hi bit and write to device
+:       ora     #$80
+        .ifndef __APPLE2ENH__
+        cmp     #$E0            ; Test for lowercase
+        bcc     output
+        and     #$DF            ; Convert to uppercase
+        .endif
+output: jsr     COUT            ; Preserves X and Y
+
+        ; Increment pointer
+        iny
+        bne     :+
+        inc     ptr1+1
+
+        ; Decrement count
+:       dex
+        bne     next
+        dec     ptr2+1
+        bpl     next
+
+        ; Return success
+done:   lda     #$00
+        jmp     rwepilog
+
+        ; Load errno code
+einval: lda     #EINVAL
+
+        ; Set __errno
+errno:  jmp     __directerrno
+
+        ; Set __oserror
+oserr:  jmp     __mappederrno
+