From: cuz Date: Sat, 28 Sep 2002 19:41:00 +0000 (+0000) Subject: Fixed the result of the % operator for ints X-Git-Tag: V2.12.0~2221 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=3aab67401eed61ca8a43a8867103fe8964081c0d;p=cc65 Fixed the result of the % operator for ints git-svn-id: svn://svn.cc65.org/cc65/trunk@1408 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/libsrc/runtime/div.s b/libsrc/runtime/div.s index b995b9e87..e419dedff 100644 --- a/libsrc/runtime/div.s +++ b/libsrc/runtime/div.s @@ -8,15 +8,30 @@ ; values if $8000, in which case the negate will fail. .export tosdiva0, tosdivax - .import popsargs, udiv16, adjsres - .importzp sreg + .import popsargs, udiv16, negax + .importzp sreg, tmp1, tmp2 tosdiva0: ldx #0 tosdivax: jsr popsargs ; Get arguments from stack, adjust sign jsr udiv16 ; Do the division - lda sreg ; Result is in sreg, remainder in ptr1 - ldx sreg+1 - jmp adjsres ; Adjust the sign of the result if needed + ldx sreg+1 ; Load high byte of result + +; Adjust the sign of the result. tmp1 contains the high byte of the left +; operand, tmp2 contains the high byte of the right operand. + + lda tmp1 + eor tmp2 + bpl Pos ; Jump if sign of result positive + +; Result is negative + + lda sreg ; Load low byte of result + jmp negax ; Adjust the sign + +; Result is positive + +Pos: lda sreg + rts diff --git a/libsrc/runtime/mod.s b/libsrc/runtime/mod.s index 9e2a73ed8..1a97c6592 100644 --- a/libsrc/runtime/mod.s +++ b/libsrc/runtime/mod.s @@ -8,16 +8,31 @@ ; values if $8000, in which case the negate will fail. .export tosmoda0, tosmodax - .import popsargs, udiv16, adjsres - .importzp ptr1 + .import popsargs, udiv16, negax + .importzp ptr1, tmp1 tosmoda0: ldx #0 tosmodax: jsr popsargs ; Get arguments from stack, adjust sign jsr udiv16 ; Do the division - lda ptr1 ; Result is in sreg, remainder in ptr1 - ldx ptr1+1 - jmp adjsres ; Adjust the sign of the result if needed + ldx ptr1+1 ; Load high byte of result +; Adjust the sign of the result. tmp1 contains the high byte of the left +; operand, tmp2 contains the high byte of the right operand. The sign of +; the result of the modulo operation is the same as that of the left +; operand + + lda tmp1 + bpl Pos ; Jump if sign of result positive + +; Result is negative + + lda ptr1 ; Load low byte of result + jmp negax ; Adjust the sign + +; Result is positive + +Pos: lda ptr1 + rts diff --git a/libsrc/runtime/shelp.s b/libsrc/runtime/shelp.s index 631ff4783..d4f55b1e2 100644 --- a/libsrc/runtime/shelp.s +++ b/libsrc/runtime/shelp.s @@ -7,12 +7,12 @@ ; When negating values, we will ignore the possibility here, that one of the ; values if $8000, in which case the negate will fail. - .export popsargs, adjsres + .export popsargs .import negax, popax .importzp sreg, tmp1, tmp2, ptr4 popsargs: - stx tmp1 ; Remember sign + stx tmp2 ; Remember sign cpx #0 bpl L1 jsr negax ; Negate accumulator @@ -20,29 +20,11 @@ L1: sta ptr4 stx ptr4+1 ; Save right operand jsr popax - stx tmp2 ; Remember sign + stx tmp1 ; Remember sign cpx #0 bpl L2 jsr negax L2: sta sreg stx sreg+1 - -; Calculate the sign of the result, that is sign(op1) * sign(op2) - - lda tmp1 - eor tmp2 - sta tmp2 ; Save it across call -L3: rts - -; Adjust the result of a mod/div/mul operation - -adjsres: - -; Check if we must adjust the sign - - ldy tmp2 - bpl L3 - jmp negax ; Adjust sign - - + rts