]> git.sur5r.net Git - cc65/blobdiff - libsrc/runtime/mod.s
Adapted div & mod for popptr1.
[cc65] / libsrc / runtime / mod.s
index c4331ed855f52105f8d87c2da897e25c0b7c848d..b3a818fda4d6c324b63f44d4c5c74dad2947b996 100644 (file)
@@ -1,37 +1,32 @@
 ;
-; Ullrich von Bassewitz, 07.08.1998
+; Christian Krueger, 24-May-2018
 ;
 ; CC65 runtime: modulo operation for signed ints
 ;
 
 ; When negating values, we will ignore the possibility here, that one of the
-; values if $8000, in which case the negate will fail.
+; values is $8000, in which case the negate will fail.
 
         .export         tosmoda0, tosmodax
-        .import         popsargs, udiv16, negax
-        .importzp       ptr1, tmp1
+        .import         absvaludiv, negax
+        .importzp       sp, sreg, tmp1
 
 tosmoda0:
         ldx     #0
 tosmodax:
-        jsr     popsargs        ; Get arguments from stack, adjust sign
-        jsr     udiv16          ; Do the division
-        lda     ptr1            ; Load low byte of result
-        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
-
-        bit     tmp1
-        bpl     Pos             ; Jump if sign of result positive
-
-; Result is negative
-
-        jmp     negax           ; Adjust the sign
-
-; Result is positive
-
-Pos:    rts
 
+; Prepare adjustment of the sign of the result. The sign of the result of the
+; modulo operation is the same as that of the left operand.
+
+        pha                         
+        ldy     #1                  ; prepare lhs operant hi-byte fetch
+        lda     (sp),y             
+        sta     tmp1                ; save post negation indicator to tmp1
+        pla                         ; back to entry accu
+        jsr     absvaludiv
+        ldx     sreg+1              ; remainder to return registers
+        lda     sreg
+        ldy     tmp1                ; fetch idicator
+        bmi     negate
+        rts
+negate: jmp     negax