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