git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

gbdk-lib/libc/asm/sm83/memcpy.s

      1 ;--------------------------------------------------------------------------
      2 ;  memcpy.s
      3 ;
      4 ;  Copies in groups of four. Algorithm is Duff's device.
      5 ;
      6 ;  Copyright (c) 2021, Philipp Klaus Krause
      7 ;  Copyright (c) 2022, Sebastian 'basxto' Riedel <sdcc@basxto.de>
      8 ;
      9 ;  This library is free software; you can redistribute it and/or modify it
     10 ;  under the terms of the GNU General Public License as published by the
     11 ;  Free Software Foundation; either version 2, or (at your option) any
     12 ;  later version.
     13 ;
     14 ;  This library is distributed in the hope that it will be useful,
     15 ;  but WITHOUT ANY WARRANTY; without even the implied warranty of
     16 ;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     17 ;  GNU General Public License for more details.
     18 ;
     19 ;  You should have received a copy of the GNU General Public License 
     20 ;  along with this library; see the file COPYING. If not, write to the
     21 ;  Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
     22 ;   MA 02110-1301, USA.
     23 ;
     24 ;  As a special exception, if you link this library with other files,
     25 ;  some of which are compiled with SDCC, to produce an executable,
     26 ;  this library does not by itself cause the resulting executable to
     27 ;  be covered by the GNU General Public License. This exception does
     28 ;  not however invalidate any other reasons why the executable file
     29 ;   might be covered by the GNU General Public License.
     30 ;--------------------------------------------------------------------------
     31 
     32 	.area   _CODE
     33 
     34 	.globl	_memcpy
     35 	.globl	___memcpy
     36 
     37 	; gets called by memmove for (s >= d)
     38 	; bigger than the old algorithm but faster for n>=5
     39 _memcpy::
     40 ___memcpy::
     41 	;dest in de
     42 	;src in bc
     43 	;n in sp+2,sp+3
     44 	push	de
     45 	ldhl	sp, #5
     46 	ld	a, (hl-)
     47 	ld	l, (hl)
     48 	ld	h, b
     49 	ld	b, a
     50 	ld	a, l
     51 	ld	l, c
     52 	srl	b
     53 	rra
     54 	ld	c, a
     55 	;dest in de (backup in sp+0,sp+1)
     56 	;src in hl
     57 	;n/2 in bc
     58 	;LSB of bc in carry
     59 	jr nc, skip_one
     60 	ld	a, (hl+)
     61 	ld	(de), a
     62 	inc	de
     63 skip_one:
     64 	;n/2 in bc
     65 	;shift second LSB to carry
     66 	srl	b
     67 	rr	c
     68 	;n/4 in bc
     69 	inc	b
     70 	inc	c
     71 	jr nc, test
     72 	jr	copy_two
     73 .irp	idx,copy_four,copy_two
     74 	idx:
     75 	.rept	2
     76 		ld	a, (hl+)
     77 		ld	(de), a
     78 		inc	de
     79 	.endm
     80 .endm
     81 test:
     82 .irp	idx,c,b
     83 	dec	idx
     84 	jr	nz, copy_four
     85 .endm
     86 
     87 end:
     88 	;restore dest
     89 	pop	bc
     90 	;get return address
     91 	pop	hl
     92 	;throw away n
     93 	pop	af
     94 	jp	(hl)

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.