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/z80/__ultobcd.s

      1 ;--------------------------------------------------------------------------
      2 ;  __ultobcd.s
      3 ;
      4 ;  Copyright (C) 2020, Sergey Belyashov
      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 ___ultobcd
     32 ;
     33 ; void __ultobcd (unsigned long v, unsigned char bcd[5])
     34 ; __ultobcd converts v to BCD representation to the bcd.
     35 ; bcd[] will contain BCD value.
     36 ;
     37 ___ultobcd:
     38 	push	ix
     39 	ld	ix, #0
     40 	add	ix, sp
     41 	ld	bc, #0x2000
     42 ;
     43 ;--- begin speed optimization
     44 ;
     45 	ld	l, 4 (ix)
     46 	ld	h, 5 (ix)
     47 	ld	e, 6 (ix)
     48 	ld	d, 7 (ix)
     49 	ld	a, e
     50 	or	a, d
     51 	jr	NZ, 101$
     52 ;high 2 bytes are zero
     53 	ld	b, #0x10
     54 	ex	de, hl
     55 101$:
     56 	ld	a, d
     57 	or	a, a
     58 	jr	NZ, 102$
     59 ;high byte is zero
     60 	ld	d, e
     61 	ld	e, h
     62 	ld	h, l
     63 	ld	a, #-8
     64 	add	a, b
     65 	ld	b, a
     66 102$:
     67 	ld	4 (ix), l
     68 	ld	5 (ix), h
     69 	ld	6 (ix), e
     70 	ld	7 (ix), d
     71 ;
     72 ;--- end speed optimization
     73 ;
     74 	ld	hl, #0x0000
     75 	ld	e, l
     76 	ld	d, h
     77 ; (ix+0)..(ix+3) - binary value
     78 ; CDEHL - future BCD value
     79 ; B - bits count (32)
     80 103$:
     81 	sla	4 (ix)
     82 	rl	5 (ix)
     83 	rl	6 (ix)
     84 	rl	7 (ix)
     85 	ld	a, l
     86 	adc	a, a
     87 	daa
     88 	ld	l, a
     89 	ld	a, h
     90 	adc	a, a
     91 	daa
     92 	ld	h, a
     93 	ld	a, e
     94 	adc	a, a
     95 	daa
     96 	ld	e, a
     97 	ld	a, d
     98 	adc	a, a
     99 	daa
    100 	ld	d, a
    101 	ld	a, c
    102 	adc	a, a
    103 	daa
    104 	ld	c, a
    105 	djnz	103$
    106 ;
    107 	ld	b, l
    108 	ld	a, h
    109 	ld	l, 8 (ix)
    110 	ld	h, 9 (ix)
    111 	ld	(hl), b
    112 	inc	hl
    113 	ld	(hl), a
    114 	inc	hl
    115 	ld	(hl), e
    116 	inc	hl
    117 	ld	(hl), d
    118 	inc	hl
    119 	ld	(hl), c
    120 ;
    121 	pop	ix
    122 	ret

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