1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-25 02:29:52 +00:00
cc65/libsrc/apple2/write.s
cuz feacac1394 POSIX file I/O by Oliver Schmidt
git-svn-id: svn://svn.cc65.org/cc65/trunk@3457 b7a2c559-68d2-44c3-8de9-860c34a00d81
2005-04-12 09:12:48 +00:00

124 lines
2.4 KiB
ArmAsm

;
; 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
.if MLI::MARK::REF_NUM = MLI::EOF::REF_NUM
; REF_NUM already set
.else
.error "Assertion failed"
.endif
.if MLI::MARK::POSITION = MLI::EOF::EOF
; POSITION already set
.else
.error "Assertion failed"
.endif
; 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