memmove.s (1841B)
1;-------------------------------------------------------------------------- 2; memmove.s 3; 4; Copyright (C) 2008-2009, Philipp Klaus Krause, Marco Bodrato 5; 6; This library is free software; you can redistribute it and/or modify it 7; under the terms of the GNU General Public License as published by the 8; Free Software Foundation; either version 2, or (at your option) any 9; later version. 10; 11; This library is distributed in the hope that it will be useful, 12; but WITHOUT ANY WARRANTY; without even the implied warranty of 13; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14; GNU General Public License for more details. 15; 16; You should have received a copy of the GNU General Public License 17; along with this library; see the file COPYING. If not, write to the 18; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, 19; MA 02110-1301, USA. 20; 21; As a special exception, if you link this library with other files, 22; some of which are compiled with SDCC, to produce an executable, 23; this library does not by itself cause the resulting executable to 24; be covered by the GNU General Public License. This exception does 25; not however invalidate any other reasons why the executable file 26; might be covered by the GNU General Public License. 27;-------------------------------------------------------------------------- 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 pop af 37 pop hl 38 pop de 39 pop bc 40 push bc 41 push de 42 push hl 43 push af 44 ld a, c 45 or a, b 46 ret Z 47 push hl 48 sbc hl, de ; or above cleared carry. 49 add hl, de ; same carry as the line before 50 jr C, memmove_up 51memmove_down: 52 dec bc 53 add hl, bc 54 ex de, hl 55 add hl, bc 56 inc bc 57 lddr 58 pop hl 59 ret 60memmove_up: 61 ex de, hl 62 ldir 63 pop hl 64 ret 65