]> git.sur5r.net Git - cc65/blob - libsrc/apple2/lseek.s
lseek: use STZ for APPLE2ENH
[cc65] / libsrc / apple2 / lseek.s
1 ;
2 ; Peter Ferrie, 21.11.2014
3 ;
4 ; off_t __fastcall__ lseek(int fd, off_t offset, int whence);
5 ;
6
7         .export         _lseek
8         .import         popax, popptr1
9
10         .include        "zeropage.inc"
11         .include        "errno.inc"
12         .include        "mli.inc"
13         .include        "filedes.inc"
14
15 _lseek:
16         ; Save whence
17         sta     tmp1
18         stx     tmp2
19
20         ; Get and save offset
21         jsr     popptr1
22         jsr     popax
23         sta     ptr2
24
25         ; Get and process fd
26         jsr     popax
27         jsr     getfd           ; Returns A, Y and C
28         bcs     errno
29
30         ; Check for device
31         cmp     #$80
32         bcs     einval
33
34         ; Valid whence values are 0..2
35         ldx     tmp2
36         bne     einval
37         ldx     tmp1
38         cpx     #3
39         bcs     einval
40
41         ; Set fd
42         sta     mliparam + MLI::MARK::REF_NUM
43
44         txa
45         beq     cur
46         lda     #GET_EOF_CALL
47         dex
48         beq     end
49
50 ; SEEK_SET
51         dex
52         txa
53         tay
54         beq     seek_common
55
56 ; SEEK_CUR
57 cur:
58         lda     #GET_MARK_CALL
59
60 ; SEEK_END
61 end:
62         ; MARK_COUNT must == EOF_COUNT, otherwise unexpected behaviour
63         .assert MARK_COUNT = EOF_COUNT, error
64         ldx     #MARK_COUNT
65         jsr     callmli
66         bcs     oserr
67         lda     mliparam + MLI::MARK::POSITION
68         ldx     mliparam + MLI::MARK::POSITION+1
69         ldy     mliparam + MLI::MARK::POSITION+2
70
71 seek_common:
72         adc     ptr1
73         sta     mliparam + MLI::MARK::POSITION
74         txa
75         adc     ptr1+1
76         sta     mliparam + MLI::MARK::POSITION+1
77         tya
78         adc     ptr2
79         sta     mliparam + MLI::MARK::POSITION+2
80
81         ; Set file pointer
82         lda     #SET_MARK_CALL
83         ldx     #MARK_COUNT
84         jsr     callmli
85         bcs     oserr
86
87         ; Need to return the position in EAX
88         .ifdef  __APPLE2ENH__
89         stz     sreg+1
90         .else
91         lda     #0
92         sta     sreg+1
93         .endif
94         lda     mliparam + MLI::MARK::POSITION+2
95         sta     sreg
96         ldx     mliparam + MLI::MARK::POSITION+1
97         lda     mliparam + MLI::MARK::POSITION
98
99         rts
100
101         ; Load errno code
102 einval: lda     #EINVAL
103
104         ; Set __errno
105 errno:  jmp     __directerrno
106
107         ; Set __oserror
108 oserr:  jmp     __mappederrno