]> git.sur5r.net Git - cc65/blob - libsrc/apple2/lseek.s
Merge pull request #141 from mrdudz/testsuite
[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
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     popax
22         sta     ptr1
23         stx     ptr1+1
24         jsr     popax
25         sta     ptr2
26
27         ; Get and process fd
28         jsr     popax
29         jsr     getfd           ; Returns A, Y and C
30         bcs     errno
31
32         ; Check for device
33         cmp     #$80
34         bcs     einval
35
36         ; Valid whence values are 0..2
37         ldx     tmp2
38         bne     einval
39         ldx     tmp1
40         cpx     #3
41         bcs     einval
42
43         ; Set fd
44         sta     mliparam + MLI::MARK::REF_NUM
45
46         txa
47         beq     cur
48         lda     #GET_EOF_CALL
49         dex
50         beq     end
51
52 ; SEEK_SET
53         dex
54         txa
55         tay
56         beq     seek_common
57
58 ; SEEK_CUR
59 cur:
60         lda     #GET_MARK_CALL
61
62 ; SEEK_END
63 end:
64         ; MARK_COUNT must == EOF_COUNT, otherwise unexpected behaviour
65         .assert MARK_COUNT = EOF_COUNT, error
66         ldx     #MARK_COUNT
67         jsr     callmli
68         bcs     oserr
69         lda     mliparam + MLI::MARK::POSITION
70         ldx     mliparam + MLI::MARK::POSITION+1
71         ldy     mliparam + MLI::MARK::POSITION+2
72
73 seek_common:
74         adc     ptr1
75         sta     mliparam + MLI::MARK::POSITION
76         txa
77         adc     ptr1+1
78         sta     mliparam + MLI::MARK::POSITION+1
79         tya
80         adc     ptr2
81         sta     mliparam + MLI::MARK::POSITION+2
82
83         ; Set file pointer
84         lda     #SET_MARK_CALL
85         ldx     #MARK_COUNT
86         jsr     callmli
87         bcs     oserr
88
89         rts
90
91         ; Load errno code
92 einval: lda     #EINVAL
93
94         ; Set __errno
95 errno:  jmp     __directerrno
96
97         ; Set __oserror
98 oserr:  jmp     __mappederrno