[Z88dk-commits] CVS: z88dk/libsrc/_DEVELOPMENT/l/sdcc divmixed.asm,

Bridge to the z88dk-commits mailing list
Post Reply
alvin

[Z88dk-commits] CVS: z88dk/libsrc/_DEVELOPMENT/l/sdcc divmixed.asm,

Post by alvin »

Update of /cvsroot/z88dk/z88dk/libsrc/_DEVELOPMENT/l/sdcc
In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv10495/sdcc

Added Files:
divmixed.asm divsigned.asm divunsigned.asm modmixed.asm
modsigned.asm modunsigned.asm mul.asm
Log Message:
add compiler primitives

--- NEW FILE: divmixed.asm ---
;--------------------------------------------------------------------------
; divmixed.s
;
; Copyright (C) 2010, Philipp Klaus Krause
;
; This library is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the
; Free Software Foundation; either version 2.1, or (at your option) any
; later version.
;
; This library is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this library; see the file COPYING. If not, write to the
; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
;
; As a special exception, if you link this library with other files,
; some of which are compiled with SDCC, to produce an executable,
; this library does not by itself cause the resulting executable to
; be covered by the GNU General Public License. This exception does
; not however invalidate any other reasons why the executable file
; might be covered by the GNU General Public License.
;--------------------------------------------------------------------------
XLIB __divsuchar_rrx_s
XDEF __divuschar_rrx_s
LIB __div16
LIB __div_signexte

__divsuchar_rrx_s:
ld hl,#2+1
add hl,sp

ld e,(hl)
dec hl
ld l,(hl)
ld h,#0

jp __div_signexte

__divuschar_rrx_s:
ld hl,#2+1
ld d, h
add hl,sp

ld e,(hl)
dec hl
ld l,(hl)

ld a,l ; Sign extend
rlca
sbc a
ld h,a

jp __div16



--- NEW FILE: divsigned.asm ---
;--------------------------------------------------------------------------
; divsigned.s
;
; Copyright (C) 2000-2010, Michael Hope, Philipp Klaus Krause
;
; This library is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the
; Free Software Foundation; either version 2.1, or (at your option) any
; later version.
;
; This library is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this library; see the file COPYING. If not, write to the
; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
;
; As a special exception, if you link this library with other files,
; some of which are compiled with SDCC, to produce an executable,
; this library does not by itself cause the resulting executable to
; be covered by the GNU General Public License. This exception does
; not however invalidate any other reasons why the executable file
; might be covered by the GNU General Public License.
;--------------------------------------------------------------------------

XLIB __divsint_rrx_s

LIB __divu16
XDEF __div16
XDEF __div8
XDEF __divsint_rrx_hds
XDEF __get_remainder

__divsint_rrx_s:
pop af
pop hl
pop de
push de
push hl
push af

jp __div16

__divschar_rrx_s:
ld hl, #2+1
add hl, sp

ld e, (hl)
dec hl
ld l, (hl)

;; Fall through
__divschar_rrx_hds:
__div8:
ld a, l ; Sign extend
rlca
sbc a
ld h, a
__div_signexte:
ld a, e ; Sign extend
rlca
sbc a
ld d, a
; Fall through to __div16

;; signed 16-bit division
;;
;; Entry conditions
;; HL = dividend
;; DE = divisor
;;
;; Exit conditions
;; HL = quotient
;; DE = remainder
;;
;; Register used: AF,B,DE,HL
__divsint_rrx_hds:
__div16:
;; Determine sign of quotient by xor-ing high bytes of dividend
;; and divisor. Quotient is positive if signs are the same, negative
;; if signs are different
;; Remainder has same sign as dividend
ld a, h ; Get high byte of dividend
xor d ; Xor with high byte of divisor
rla ; Sign of quotient goes into the carry
ld a, h ; Get high byte of dividend
push af ; Save sign of both quotient and reminder

; Take absolute value of dividend
rla
jr NC, chkde ; Jump if dividend is positive
sub a, a ; Substract dividend from 0
sub a, l
ld l, a
sbc a, a ; Propagate borrow (A=0xFF if borrow)
sub a, h
ld h, a

; Take absolute value of divisor
.chkde
bit 7, d
jr Z, dodiv ; Jump if divisor is positive
sub a, a ; Subtract divisor from 0
sub a, e
ld e, a
sbc a, a ; Propagate borrow (A=0xFF if borrow)
sub a, d
ld d, a

; Divide absolute values
.dodiv
call __divu16

.fix_quotient
; Negate quotient if it is negative
pop af ; recover sign of quotient
ret NC ; Jump if quotient is positive
ld b, a
sub a, a ; Subtract quotient from 0
sub a, l
ld l, a
sbc a, a ; Propagate borrow (A=0xFF if borrow)
sub a, h
ld h, a
ld a, b
ret

__get_remainder:
; Negate remainder if it is negative and move it into hl
rla
ex de, hl
ret NC ; Return if remainder is positive
sub a, a ; Subtract remainder from 0
sub a, l
ld l, a
sbc a, a ; Propagate remainder (A=0xFF if borrow)
sub a, h
ld h, a
ret


--- NEW FILE: divunsigned.asm ---
;--------------------------------------------------------------------------
; divunsigned.s
;
; Copyright (C) 2000-2010, Michael Hope, Philipp Klaus Krause, Marco Bodrato
;
; This library is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the
; Free Software Foundation; either version 2.1, or (at your option) any
; later version.
;
; This library is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this library; see the file COPYING. If not, write to the
; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
;
; As a special exception, if you link this library with other files,
; some of which are compiled with SDCC, to produce an executable,
; this library does not by itself cause the resulting executable to
; be covered by the GNU General Public License. This exception does
; not however invalidate any other reasons why the executable file
; might be covered by the GNU General Public License.
;--------------------------------------------------------------------------

;; Originally from GBDK by Pascal Felber.

XLIB __divuint_rrx_s
XDEF __divuchar_rrx_s
XDEF __divuchar_rrx_hds
XDEF __divu8
XDEF __divuint_rrx_hds
XDEF __divu16

__divuint_rrx_s:
pop af
pop hl
pop de
push de
push hl
push af

jr __divu16

__divuchar_rrx_s:
ld hl,#2+1
add hl,sp

ld e,(hl)
dec hl
ld l,(hl)

;; Fall through
__divuchar_rrx_hds:
__divu8:
ld h,#0x00
ld d,h
; Fall through to __divu16

;; unsigned 16-bit division
;;
;; Entry conditions
;; HL = dividend
;; DE = divisor
;;
;; Exit conditions
;; HL = quotient
;; DE = remainder
;; If divisor is non-zero, carry=0
;; If divisor is 0, carry=1 and both quotient and remainder are 0
;;
;; Register used: AF,B,DE,HL
__divuint_rrx_hds:
__divu16:
;; Check for division by zero
ld a,e
or d
;; Two algorithms: one assumes divisor <2^7, the second
;; assumes divisor >=2^7; choose the applicable one.
and #0x80
jr NZ,morethan7bits
or d
jr NZ,morethan7bits
;; Both algorithms "rotate" 24 bits (H,L,A) but roles change.

;; unsigned 16/7-bit division
.atmost7bits
ld b,#16 ; bits in dividend and possible quotient
;; Carry cleared by AND/OR, this "0" bit will pass trough HL.[*]
adc hl,hl
.dvloop7
;; HL holds both dividend and quotient. While we shift a bit from
;; MSB of dividend, we shift next bit of quotient in from carry.
;; A holds remainder.
rla

;; If remainder is >= divisor, next bit of quotient is 1. We try
;; to compute the difference.
sub a,e
jr NC,nodrop7 ; Jump if remainder is >= dividend
add a,e ; Otherwise, restore remainder
;; The add above sets the carry, because sbc a,e did set it.
.nodrop7
ccf ; Complement borrow so 1 indicates a
; successful substraction (this is the
; next bit of quotient)
adc hl,hl
djnz dvloop7
;; Carry now contains the same value it contained before
;; entering .dvloop7[*]: "0" = valid result.
ld e,a ; DE = remainder, HL = quotient
ret

.morethan7bits
ld b,#9 ; at most 9 bits in quotient.
ld a,l ; precompute the first 7 shifts, by
ld l,h ; doing 8
ld h,#0
rr l ; undoing 1
.dvloop
;; Shift next bit of quotient into bit 0 of dividend
;; Shift next MSB of dividend into LSB of remainder
;; A holds both dividend and quotient. While we shift a bit from
;; MSB of dividend, we shift next bit of quotient in from carry
;; HL holds remainder
adc hl,hl ; HL < 2^(7+9), no carry, ever.

;; If remainder is >= divisor, next bit of quotient is 1. We try
;; to compute the difference.
sbc hl,de
jr NC,nodrop ; Jump if remainder is >= dividend
add hl,de ; Otherwise, restore remainder
;; The add above sets the carry, because sbc hl,de did set it.
.nodrop
ccf ; Complement borrow so 1 indicates a
; successful substraction (this is the
; next bit of quotient)
rla
djnz dvloop
;; Take care of the ninth quotient bit! after the loop B=0.
rl b ; BA = quotient
;; Carry now contains "0" = valid result.
ld d,b
ld e,a ; DE = quotient, HL = remainder
ex de,hl ; HL = quotient, DE = remainder
ret


--- NEW FILE: modmixed.asm ---
;--------------------------------------------------------------------------
; modmixed.s
;
; Copyright (C) 2010, Philipp Klaus Krause
;
; This library is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the
; Free Software Foundation; either version 2.1, or (at your option) any
; later version.
;
; This library is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this library; see the file COPYING. If not, write to the
; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
;
; As a special exception, if you link this library with other files,
; some of which are compiled with SDCC, to produce an executable,
; this library does not by itself cause the resulting executable to
; be covered by the GNU General Public License. This exception does
; not however invalidate any other reasons why the executable file
; might be covered by the GNU General Public License.
;--------------------------------------------------------------------------
XLIB __modsuchar_rrx_s
XDEF __moduschar_rrx_s
LIB __div_signexte
LIB __get_remainder
LIB __div16

__modsuchar_rrx_s:
ld hl,#2+1
add hl,sp

ld e,(hl)
dec hl
ld l,(hl)
ld h,#0

call __div_signexte

jp __get_remainder

__moduschar_rrx_s:
ld hl,#2+1
ld d, h
add hl,sp

ld e,(hl)
dec hl
ld l,(hl)

ld a,l ; Sign extend
rlca
sbc a
ld h,a

call __div16

jp __get_remainder


--- NEW FILE: modsigned.asm ---
;--------------------------------------------------------------------------
; modsigned.s
;
; Copyright (C) 2009, Philipp Klaus Krause
;
; This library is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the
; Free Software Foundation; either version 2.1, or (at your option) any
; later version.
;
; This library is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this library; see the file COPYING. If not, write to the
; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
;
; As a special exception, if you link this library with other files,
; some of which are compiled with SDCC, to produce an executable,
; this library does not by itself cause the resulting executable to
; be covered by the GNU General Public License. This exception does
; not however invalidate any other reasons why the executable file
; might be covered by the GNU General Public License.
;--------------------------------------------------------------------------

XLIB __modschar_rrx_s
XDEF __modschar_rrx_hds
LIB __div8
LIB __get_remainder
XDEF __modsint_rrx_s
XDEF __modsint_rrx_hds
LIB __div16

__modschar_rrx_s:
ld hl,#2+1
add hl,sp

ld e,(hl)
dec hl
ld l,(hl)

;; Fall through
__modschar_rrx_hds:
call __div8

jp __get_remainder

__modsint_rrx_s:
pop af
pop hl
pop de
push de
push hl
push af

;; Fall through
__modsint_rrx_hds:
call __div16

jp __get_remainder


--- NEW FILE: modunsigned.asm ---
;--------------------------------------------------------------------------
; modunsigned.s
;
; Copyright (C) 2009-2010, Philipp Klaus Krause
;
; This library is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the
; Free Software Foundation; either version 2.1, or (at your option) any
; later version.
;
; This library is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this library; see the file COPYING. If not, write to the
; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
;
; As a special exception, if you link this library with other files,
; some of which are compiled with SDCC, to produce an executable,
; this library does not by itself cause the resulting executable to
; be covered by the GNU General Public License. This exception does
; not however invalidate any other reasons why the executable file
; might be covered by the GNU General Public License.
;--------------------------------------------------------------------------

XLIB __moduchar_rrx_s
XDEF __moduchar_rrx_hds
XDEF __moduint_rrx_s
LIB __divunsigned
LIB __divu8
LIB __divu16
XDEF __moduint_rrx_hds


__moduchar_rrx_s:
ld hl,#2+1
add hl,sp

ld e,(hl)
dec hl
ld l,(hl)

;; Fall through
__moduchar_rrx_hds:
call __divu8

ex de,hl

ret

__moduint_rrx_s:
pop af
pop hl
pop de
push de
push hl
push af

;; Fall through
__moduint_rrx_hds:
call __divu16

ex de,hl

ret


--- NEW FILE: mul.asm ---
;--------------------------------------------------------------------------
; mulchar.s
;
; Copyright (C) 2000, Michael Hope
;
; This library is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the
; Free Software Foundation; either version 2.1, or (at your option) any
; later version.
;
; This library is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this library; see the file COPYING. If not, write to the
; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
;
; As a special exception, if you link this library with other files,
; some of which are compiled with SDCC, to produce an executable,
; this library does not by itself cause the resulting executable to
; be covered by the GNU General Public License. This exception does
; not however invalidate any other reasons why the executable file
; might be covered by the GNU General Public License.
;--------------------------------------------------------------------------


XLIB __mulint_rrx_s
XDEF __muluchar_rrx_hds
XDEF __mulint_rrx_hds
XDEF __mul16

__mulint_rrx_s:
pop af
pop hl
pop de
push de
push hl
push af

;; Fall through

__muluchar_rrx_hds:
__mulint_rrx_hds:
;; Parameters:
;; hl, de (left, right irrelevant)
ld b,h
ld c,l

;; 16-bit multiplication
;;
;; Entry conditions
;; bc = multiplicand
;; de = multiplier
;;
;; Exit conditions
;; hl = less significant word of product
;;
;; Register used: AF,BC,DE,HL
__mul16:
xor a,a
ld l,a
or a,b
ld b,#16

;; Optimise for the case when this side has 8 bits of data or
;; less. This is often the case with support address calls.
jr NZ,lab2
ld b,#8
ld a,c
.lab1
;; Taken from z88dk, which originally borrowed from the
;; Spectrum rom.
add hl,hl
.lab2
rl c
rla ;DLE 27/11/98
jr NC,lab3
add hl,de
.lab3
djnz lab1
ret



------------------------------------------------------------------------------
Post Reply