]> git.sur5r.net Git - cc65/blob - libsrc/cbm/cbm_write.s
libsrc/atari/getdefdev.s: small optimization and fix a typo
[cc65] / libsrc / cbm / cbm_write.s
1 ;
2 ; Ullrich von Bassewitz, 15.11.2002
3 ;
4 ; Original C code by Marc 'BlackJack' Rintsch, 25.03.2001
5 ;
6 ; int __fastcall__ cbm_write(unsigned char lfn, void* buffer, unsigned int size)
7 ; {
8 ;
9 ;     static unsigned int byteswritten;
10 ;
11 ;     /* if we can't change to the outputchannel #lfn then return an error */
12 ;     if (_oserror = cbm_k_ckout(lfn)) return -1;
13 ;
14 ;     byteswritten = 0;
15 ;
16 ;     while (byteswritten<size && !cbm_k_readst()) {
17 ;         cbm_k_bsout(((unsigned char*)buffer)[byteswritten++]);
18 ;     }
19 ;
20 ;     if (cbm_k_readst()) {
21 ;         _oserror = 5;       /* device not present */
22 ;         byteswritten = -1;
23 ;     }
24 ;
25 ;     cbm_k_clrch();
26 ;
27 ;     return byteswritten;
28 ; }
29 ;
30
31         .include        "cbm.inc"
32
33         .export         _cbm_write
34         .importzp       ptr1, ptr2, ptr3
35         .import         popax, popa
36         .import         __oserror
37
38
39 _cbm_write:
40         sta     ptr3
41         stx     ptr3+1          ; Save size
42         eor     #$FF
43         sta     ptr1
44         txa
45         eor     #$FF
46         sta     ptr1+1          ; Save -size-1
47
48         jsr     popax
49         sta     ptr2
50         stx     ptr2+1          ; Save buffer
51
52         jsr     popa
53         tax
54         jsr     CKOUT
55         bcs     @E2             ; Branch on error
56         bcc     @L3             ; Branch always
57
58 ; Loop
59
60 @L1:    jsr     READST
61         cmp     #0              ; Status ok?
62         bne     @E1
63
64         ldy     #0
65         lda     (ptr2),y        ;
66         inc     ptr2
67         bne     @L2
68         inc     ptr2+1          ; A = *buffer++;
69
70 @L2:    jsr     BSOUT           ; cbm_k_bsout (A);
71
72 @L3:    inc     ptr1            ; --size;
73         bne     @L1
74         inc     ptr1+1
75         bne     @L1
76
77         jsr     CLRCH
78
79         lda     ptr3
80         ldx     ptr3+1          ; return size;
81
82         rts
83
84 ; Error entry, called when READST fails
85
86 @E1:    lda     #5
87
88 ; Error entry, error code is in A
89
90 @E2:    sta     __oserror
91         lda     #$FF
92         tax
93         rts                     ; return -1
94