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