]> git.sur5r.net Git - cc65/commitdiff
Fixed the result of the % operator for ints
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 28 Sep 2002 19:41:00 +0000 (19:41 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 28 Sep 2002 19:41:00 +0000 (19:41 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1408 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/runtime/div.s
libsrc/runtime/mod.s
libsrc/runtime/shelp.s

index b995b9e873ac1b03f1b8e494f6d7a7d57ab1127a..e419dedffcf08b8fe00717519db762932846958f 100644 (file)
@@ -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
 
index 9e2a73ed8e7324d8485b02b703153a744f056d8e..1a97c65925f6e7d2862a71fbecf8dcf0f2ffd74b 100644 (file)
@@ -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
 
index 631ff4783e2e022481e20f7f131c1989caf1893a..d4f55b1e22bb7ad57289c96b392fedf727166313 100644 (file)
@@ -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