]> git.sur5r.net Git - cc65/blob - libsrc/apple2/write.s
Removed (pretty inconsistently used) tab chars from source code base.
[cc65] / libsrc / apple2 / write.s
1 ;
2 ; Oliver Schmidt, 12.01.2005
3 ;
4 ; int __fastcall__ write (int fd, const void* buf, unsigned count);
5 ;
6
7         .export         _write
8         .import         rwprolog, rwcommon, rwepilog
9         .import         COUT
10
11         .include        "zeropage.inc"
12         .include        "errno.inc"
13         .include        "fcntl.inc"
14         .include        "mli.inc"
15         .include        "filedes.inc"
16
17 _write:
18         ; Get parameters
19         jsr     rwprolog
20         bcs     errno
21         tax                     ; Save fd
22
23         ; Check for write access
24         lda     fdtab + FD::FLAGS,y
25         and     #O_WRONLY
26         beq     einval
27
28         ; Check for device
29         txa                     ; Restore fd
30         bmi     device
31
32         ; Check for append flag
33         lda     fdtab + FD::FLAGS,y
34         and     #O_APPEND
35         beq     write
36
37         ; Set fd
38         stx     mliparam + MLI::EOF::REF_NUM
39
40         ; Get file size
41         lda     #GET_EOF_CALL
42         ldx     #EOF_COUNT
43         jsr     callmli
44         bcs     oserr
45
46         ; REF_NUM already set
47         .assert MLI::MARK::REF_NUM = MLI::EOF::REF_NUM, error
48
49         ; POSITION already set
50         .assert MLI::MARK::POSITION = MLI::EOF::EOF, error
51
52         ; Set file pointer
53         lda     #SET_MARK_CALL
54         ldx     #MARK_COUNT
55         jsr     callmli
56         bcs     oserr
57
58         ; Do write
59 write:  lda     fdtab + FD::REF_NUM,y
60         ldy     #WRITE_CALL
61         jmp     rwcommon
62
63         ; Save count for epilog
64 device: ldx     ptr2
65         lda     ptr2+1
66         stx     mliparam + MLI::RW::TRANS_COUNT
67         sta     mliparam + MLI::RW::TRANS_COUNT+1
68
69         ; Check for zero count
70         ora     ptr2
71         beq     done
72
73         ; Get char from buf
74         ldy     #$00
75 next:   lda     (ptr1),y
76
77         ; Replace '\n' with '\r'
78         cmp     #$0A
79         bne     :+
80         lda     #$0D
81
82         ; Set hi bit and write to device
83 :       ora     #$80
84         .ifndef __APPLE2ENH__
85         cmp     #$E0            ; Test for lowercase
86         bcc     output
87         and     #$DF            ; Convert to uppercase
88         .endif
89 output: jsr     COUT            ; Preserves X and Y
90
91         ; Increment pointer
92         iny
93         bne     :+
94         inc     ptr1+1
95
96         ; Decrement count
97 :       dex
98         bne     next
99         dec     ptr2+1
100         bpl     next
101
102         ; Return success
103 done:   lda     #$00
104         jmp     rwepilog
105
106         ; Load errno code
107 einval: lda     #EINVAL
108
109         ; Set __errno
110 errno:  jmp     __directerrno
111
112         ; Set __oserror
113 oserr:  jmp     __mappederrno
114