]> git.sur5r.net Git - cc65/blob - libsrc/common/_swap.s
Merge pull request #659 from polluks/patch-10
[cc65] / libsrc / common / _swap.s
1 ;
2 ; Ullrich von Bassewitz, 1998-12-09, 2004-11-30
3 ;
4 ; void __fastcall__ _swap (void* p, void* q, size_t size);
5 ;
6
7         .export         __swap
8         .import         popax, popptr1
9         .importzp       ptr1, ptr2, ptr3
10
11
12 __swap: eor     #$FF
13         sta     ptr3
14         txa
15         eor     #$FF
16         sta     ptr3+1          ; Save -(size+1) into ptr3
17
18         jsr     popax           ; Get q
19         sta     ptr2
20         stx     ptr2+1
21
22         jsr     popptr1         ; Get p
23
24 ; Prepare for swap
25
26         ; ldy     #$00          is guaranteed by popptr1
27
28 ; Swap loop
29
30 @L1:    inc     ptr3            ; Bump counter low byte
31         beq     @L3             ; Branch on overflow
32
33 @L2:    lda     (ptr1),y
34         tax
35         lda     (ptr2),y
36         sta     (ptr1),y
37         txa
38         sta     (ptr2),y
39         iny
40         bne     @L1
41         inc     ptr1+1
42         inc     ptr2+1
43         bne     @L1             ; Branch always (hopefully)
44
45 ; Bump the high counter byte
46
47 @L3:    inc     ptr3+1
48         bne     @L2
49
50 ; Done
51
52         rts
53