mirror of
https://github.com/cc65/cc65.git
synced 2024-12-24 11:31:31 +00:00
115 lines
2.6 KiB
ArmAsm
115 lines
2.6 KiB
ArmAsm
;
|
|
; 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
|
|
|