]> git.sur5r.net Git - cc65/blob - libsrc/apple2/lseek.s
implement ProDOS seek
[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::RW::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         ldx     #MARK_COUNT ; conveniently same as EOF_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