]> git.sur5r.net Git - cc65/blobdiff - libsrc/runtime/div.s
Adapted div & mod for popptr1.
[cc65] / libsrc / runtime / div.s
index cdd340272bf21d66738f45b6301e2f1e13d26e50..54da0c7e45d7ab29477fb9ba72be54cdd7d7b047 100644 (file)
@@ -1,37 +1,29 @@
 ;
-; Ullrich von Bassewitz, 07.08.1998
+; Christian Krueger, 24-May-2018
 ;
 ; CC65 runtime: division 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         tosdiva0, tosdivax
-        .import         popsargs, udiv16, negax
-        .importzp       sreg, tmp1, tmp2
+        .import         absvaludiv, negax
+        .importzp       sp, ptr1, tmp1
 
 tosdiva0:
         ldx     #0
 tosdivax:
-        jsr     popsargs        ; Get arguments from stack, adjust sign
-        jsr     udiv16          ; Do the division
-        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
+        pha                         ; check if high-bytes indicate
+        txa                         ; different sign, so that we
+        ldy     #1                  ; negate the result after the operation
+        eor     (sp),y              ; eor with lhs high byte
+        sta     tmp1                ; save post negation indicator to tmp1
+        pla                         ; back to entry accu
+        jsr     absvaludiv
+        ldx     ptr1+1
+        lda     ptr1
+        ldy     tmp1                ; fetch idicator
+        bmi     negate
         rts
-
+negate: jmp     negax