]> git.sur5r.net Git - cc65/blob - libsrc/cbm/cbm_write.s
Used a library-reference method to calibrate lightpen drivers.
[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         .import         CKOUT, READST, BSOUT, CLRCH
35         .importzp       ptr1, ptr2, ptr3
36         .import         popax, popa
37         .import         __oserror
38                                                    
39
40 _cbm_write:
41         sta     ptr3
42         stx     ptr3+1          ; Save size
43         eor     #$FF
44         sta     ptr1
45         txa
46         eor     #$FF
47         sta     ptr1+1          ; Save -size-1
48
49         jsr     popax
50         sta     ptr2
51         stx     ptr2+1          ; Save buffer
52
53         jsr     popa
54         tax
55         jsr     CKOUT
56         bcs     @E2             ; Branch on error
57         bcc     @L3             ; Branch always
58
59 ; Loop
60
61 @L1:    jsr     READST
62         cmp     #0              ; Status ok?
63         bne     @E1
64
65         ldy     #0
66         lda     (ptr2),y        ;
67         inc     ptr2
68         bne     @L2
69         inc     ptr2+1          ; A = *buffer++;
70
71 @L2:    jsr     BSOUT           ; cbm_k_bsout (A);
72
73 @L3:    inc     ptr1            ; --size;
74         bne     @L1
75         inc     ptr1+1
76         bne     @L1
77
78         jsr     CLRCH
79
80         lda     ptr3
81         ldx     ptr3+1          ; return size;
82
83         rts
84
85 ; Error entry, called when READST fails
86
87 @E1:    lda     #5
88
89 ; Error entry, error code is in A
90
91 @E2:    sta     __oserror
92         lda     #$FF
93         tax
94         rts                     ; return -1
95