]> git.sur5r.net Git - cc65/blob - libsrc/apple2/lseek.s
Added a blank line between .include statements and .import/.export statements
[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         rts
88
89         ; Load errno code
90 einval: lda     #EINVAL
91
92         ; Set __errno
93 errno:  jmp     __directerrno
94
95         ; Set __oserror
96 oserr:  jmp     __mappederrno