File: cbm_write.s

package info (click to toggle)
cc65 2.19-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,268 kB
  • sloc: ansic: 117,151; asm: 66,339; pascal: 4,248; makefile: 1,009; perl: 607
file content (94 lines) | stat: -rw-r--r-- 2,023 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
;
; Ullrich von Bassewitz, 15.11.2002
;
; Original C code by Marc 'BlackJack' Rintsch, 25.03.2001
;
; int __fastcall__ cbm_write(unsigned char lfn, void* buffer, unsigned int size)
; {
;
;     static unsigned int byteswritten;
;
;     /* if we can't change to the outputchannel #lfn then return an error */
;     if (_oserror = cbm_k_ckout(lfn)) return -1;
;
;     byteswritten = 0;
;
;     while (byteswritten<size && !cbm_k_readst()) {
;         cbm_k_bsout(((unsigned char*)buffer)[byteswritten++]);
;     }
;
;     if (cbm_k_readst()) {
;         _oserror = 5;       /* device not present */
;         byteswritten = -1;
;     }
;
;     cbm_k_clrch();
;
;     return byteswritten;
; }
;

        .include        "cbm.inc"

        .export         _cbm_write
        .importzp       ptr1, ptr2, ptr3
        .import         popax, popa
        .import         __oserror


_cbm_write:
        sta     ptr3
        stx     ptr3+1          ; Save size
        eor     #$FF
        sta     ptr1
        txa
        eor     #$FF
        sta     ptr1+1          ; Save -size-1

        jsr     popax
        sta     ptr2
        stx     ptr2+1          ; Save buffer

        jsr     popa
        tax
        jsr     CKOUT
        bcs     @E2             ; Branch on error
        bcc     @L3             ; Branch always

; Loop

@L1:    jsr     READST
        cmp     #0              ; Status ok?
        bne     @E1

        ldy     #0
        lda     (ptr2),y        ;
        inc     ptr2
        bne     @L2
        inc     ptr2+1          ; A = *buffer++;

@L2:    jsr     BSOUT           ; cbm_k_bsout (A);

@L3:    inc     ptr1            ; --size;
        bne     @L1
        inc     ptr1+1
        bne     @L1

        jsr     CLRCH

        lda     ptr3
        ldx     ptr3+1          ; return size;

        rts

; Error entry, called when READST fails

@E1:    lda     #5

; Error entry, error code is in A

@E2:    sta     __oserror
        lda     #$FF
        tax
        rts                     ; return -1