Minor improvements, code cleanup and license clarification
[fw/sdcc] / device / lib / z80 / memmove.s
1 ; Copyright (C) 2008-2009
2 ; Philipp Klaus Krause
3
4 ; This file is part of the sdcc Library.  This library is free
5 ; software; you can redistribute it and/or modify it under the
6 ; terms of the GNU General Public License as published by the
7 ; Free Software Foundation; either version 2, or (at your option)
8 ; any later version.
9
10 ; This library is distributed in the hope that it will be useful,
11 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ; GNU General Public License for more details.
14
15 ; You should have received a copy of the GNU General Public License along
16 ; with this library; see the file COPYING.  If not, write to the Free
17 ; Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
18 ; USA.
19
20 ; As a special exception, you may use this file as part of a free software
21 ; library without restriction.  Specifically, if other files instantiate
22 ; templates or use macros or inline functions from this file, or you compile
23 ; this file and link it with other files to produce an executable, this
24 ; file does not by itself cause the resulting executable to be covered by
25 ; the GNU General Public License.  This exception does not however
26 ; invalidate any other reasons why the executable file might be covered by
27 ; the GNU General Public License.
28
29         .area   _CODE
30
31         .globl _memmove
32
33 ; The Z80 has the ldir and lddr instructions, which are perfect for implementing memmove().
34
35 _memmove:
36         push    ix
37         ld      ix, #0
38         add     ix, sp
39         ld      c, 8(ix)
40         ld      b, 9(ix)
41         ld      a, c
42         or      a, b
43         jr      Z, memmove_end
44         ld      e, 4(ix)
45         ld      d, 5(ix)
46         ld      l, 6(ix)
47         ld      h, 7(ix)
48         ld      a, l
49         sbc     hl, de  ; or above cleared carry.
50         ld      l, a
51         ld      h, 7(ix)
52         jr      NC, memmove_up
53 memmove_down:
54         add     hl, bc
55         dec     hl
56         ld      a, e
57         add     a, c
58         ld      e, a
59         ld      a, d
60         adc     a, b
61         ld      d, a
62         dec     de
63         lddr
64         jr      memmove_end
65 memmove_up:
66         ldir
67 memmove_end:
68         ld      l, 4(ix)
69         ld      h, 5(ix)
70         pop     ix
71         ret
72