X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fapple2%2Fwrite.s;h=9b6d2561c0073660fde0d5a50e704639bcb95d71;hb=6aee0eff045e059de9da2a63c7476c22f9d00d53;hp=7618bdc56d3b9e9e81184edbe9ac73dbbff8eee8;hpb=a57deeb58ad43b9c8daa48a77d7ac7557b6bc744;p=cc65 diff --git a/libsrc/apple2/write.s b/libsrc/apple2/write.s index 7618bdc56..9b6d2561c 100644 --- a/libsrc/apple2/write.s +++ b/libsrc/apple2/write.s @@ -1,56 +1,114 @@ - ;; - ;; Kevin Ruland - ;; - ;; int write (int fd, const void* buf, int count); - ;; - ;; for now will only write to fd = stdout - ;; - - .export _write - - .import popax - - .importzp ptr1, ptr2, ptr3 - - .include "apple2.inc" - -.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 errnoexit, oserrexit + .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: jmp rwepilog + + ; Load errno code +einval: lda #EINVAL + + ; Return errno +errno: jmp errnoexit + + ; Return oserror +oserr: jmp oserrexit +