]> git.sur5r.net Git - cc65/blob - libsrc/atari/rwcommon.s
afdbb443b0d9433c7c911db5f99b72637aa9bbe6
[cc65] / libsrc / atari / rwcommon.s
1 ;
2 ; common iocb setup routine for read, write
3 ; expects parameters (int fd,void *buf,int count)
4 ;
5         .include "atari.inc"
6         .include "errno.inc"
7         .importzp tmp2,tmp3
8         .import incsp6,ldax0sp,ldaxysp
9         .import __errno,__oserror
10         .import fdtoiocb
11
12         .export __rwsetup
13
14 __rwsetup:
15
16         ldy     #5
17         jsr     ldaxysp         ; get fd
18         jsr     fdtoiocb        ; convert to iocb
19         bmi     iocberr
20         sta     tmp3            ; save it
21         jsr     ldax0sp         ; get size
22         stx     tmp2
23         ldx     tmp3            ; iocb
24         cpx     #$80            ; iocb must be 0...7
25         bcs     iocberr
26         sta     ICBLL,x
27         lda     tmp2            ; size hi
28         sta     ICBLH,x
29         ldy     #3              ; get buf addr (was 2 in orig. version)
30         jsr     ldaxysp
31         stx     tmp2
32         ldx     tmp3
33         sta     ICBAL,x
34         lda     tmp2
35         sta     ICBAH,x
36         jsr     incsp6          ; pop args
37         lda     ICBLL,x
38         ora     ICBLH,x         ; return with Z if length was 0
39         rts
40
41 iocberr:jsr     incsp6          ; pop args
42         ldx     #$FF            ; indicate error + clear ZF
43         rts
44
45
46 ;
47 ; this routine updates errno.  do a JMP here right after calling
48 ; CIOV.  we expect status in Y.
49 ;
50         .export __do_oserror,__seterrno,__inviocb
51 __do_oserror:
52         sty     __oserror       ; save os dependent error code
53 retminus:
54         lda     #$FF
55         tax                     ; return -1
56         rts
57
58 __seterrno:
59         sta     __errno
60         stx     __errno+1
61         rts
62
63 ;
64 ; sets EINVAL error code and returns -1
65 ;
66
67 __inviocb:
68         lda     #<EINVAL
69         ldx     #>EINVAL
70         jsr     __seterrno
71         jmp     retminus        ; return -1