Blame | Last modification | View Log | Download
;--------------------------------------------------------------------------; 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, 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.;--------------------------------------------------------------------------.area _CODE.globl __divsint.globl __divschar__divsint:pop afpop hlpop depush depush hlpush afjp __div16__divschar:ld hl, #2+1add hl, spld e, (hl)dec hlld l, (hl)__div8::ld a, l ; Sign extendrlcasbc a,ald h, a__div_signexte::ld a, e ; Sign extendrlcasbc a,ald 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__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 dividendld a, h ; Get high byte of dividendxor a, d ; Xor with high byte of divisorrla ; Sign of quotient goes into the carryld a, h ; Get high byte of dividendpush af ; Save sign of both quotient and reminder; Take absolute value of dividendrlajr NC, .chkde ; Jump if dividend is positivesub a, a ; Substract dividend from 0sub a, lld l, asbc a, a ; Propagate borrow (A=0xFF if borrow)sub a, hld h, a; Take absolute value of divisor.chkde:bit 7, djr Z, .dodiv ; Jump if divisor is positivesub a, a ; Subtract divisor from 0sub a, eld e, asbc a, a ; Propagate borrow (A=0xFF if borrow)sub a, dld d, a; Divide absolute values.dodiv:call __divu16.fix_quotient:; Negate quotient if it is negativepop af ; recover sign of quotientret NC ; Jump if quotient is positiveld b, asub a, a ; Subtract quotient from 0sub a, lld l, asbc a, a ; Propagate borrow (A=0xFF if borrow)sub a, hld h, ald a, bret__get_remainder::; Negate remainder if it is negative and move it into hlrlaex de, hlret NC ; Return if remainder is positivesub a, a ; Subtract remainder from 0sub a, lld l, asbc a, a ; Propagate remainder (A=0xFF if borrow)sub a, hld h, aret