]> git.sur5r.net Git - cc65/blob - libsrc/apple2/read.s
Fixed problems that were introduced with r4287.
[cc65] / libsrc / apple2 / read.s
1 ;
2 ; Oliver Schmidt, 12.01.2005
3 ;
4 ; int __fastcall__ read (int fd, void* buf, unsigned count);
5 ;
6
7         .constructor    initprompt
8         .export         _read
9         .import         rwprolog, rwcommon
10         .import         errnoexit
11         .import         RDKEY, COUT
12
13         .include        "zeropage.inc"
14         .include        "errno.inc"
15         .include        "fcntl.inc"
16         .include        "mli.inc"
17         .include        "filedes.inc"
18         .include        "apple2.inc"
19
20         .segment        "INIT"
21
22 initprompt:
23         ; Set prompt <> ']' to let DOS 3.3 know that we're
24         ; not in Applesoft immediate mode and thus keep it
25         ; from scanning our device I/O for DOS commands.
26         lda     #$80            ; Same value used at $D52C
27         sta     PROMPT
28         rts
29
30         .code
31
32 _read:
33         ; Get parameters
34         jsr     rwprolog
35         bcs     errno
36         tax                     ; Save fd
37
38         ; Check for read access
39         lda     fdtab + FD::FLAGS,y
40         and     #O_RDONLY
41         beq     einval
42
43         ; Check for device
44         txa                     ; Restore fd
45         bmi     device
46
47         ; Do read
48         ldy     #READ_CALL
49         jmp     rwcommon
50
51         ; Set counter to zero
52 device: lda     #$00
53         sta     ptr3
54         sta     ptr3+1
55
56         ; Check for zero count
57         lda     ptr2
58         ora     ptr2+1
59         beq     check
60
61         ; Read from device and echo to device
62 next:   jsr     RDKEY
63         jsr     COUT
64
65         ; Clear hi bit and check for '\r'
66         and     #$7F
67         cmp     #$0D
68         bne     :+
69
70         ; Replace with '\n' and set count to zero
71         lda     #$0A
72         ldy     #$00
73         sty     ptr2
74         sty     ptr2+1
75
76         ; Put char into buf
77 :       ldy     #$00
78         sta     (ptr1),y
79
80         ; Increment pointer
81         inc     ptr1
82         bne     :+
83         inc     ptr1+1
84
85         ; Increment counter
86 :       inc     ptr3
87         bne     check
88         inc     ptr3+1
89
90         ; Check for counter less than count
91 check:  lda     ptr3
92         cmp     ptr2
93         bcc     next
94         ldx     ptr3+1
95         cpx     ptr2+1
96         bcc     next
97
98         ; Return success, AX already set
99         rts
100
101         ; Load errno code
102 einval: lda     #EINVAL
103
104         ; Return errno
105 errno:  jmp     errnoexit