]> git.sur5r.net Git - cc65/blobdiff - libsrc/runtime/mod.s
Added SER_ prefix. Whitespace cleanup
[cc65] / libsrc / runtime / mod.s
index eb120377be84e6560894b9f5ef62bc46ce8cc9a1..58e7405757d829bebc61bb3b8b78006d406ff4fd 100644 (file)
@@ -1,5 +1,5 @@
 ;
-; Christian Krueger, 24-May-2018
+; Ullrich von Bassewitz, 07.08.1998
 ;
 ; CC65 runtime: modulo operation for signed ints
 ;
@@ -8,25 +8,30 @@
 ; values is $8000, in which case the negate will fail.
 
         .export         tosmoda0, tosmodax
-        .import         absvaludiv16, negax
-        .importzp       sp, sreg, tmp1
+        .import         popsargsudiv16, negax
+        .importzp       sreg, tmp1
 
 tosmoda0:
         ldx     #0
 tosmodax:
+        jsr     popsargsudiv16  ; Get arguments from stack, adjust sign
+                                ; and do the division
+        lda     sreg            ; Load low byte of result
+        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. 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     absvaludiv16
-        ldx     sreg+1              ; remainder to return registers
-        lda     sreg
-        ldy     tmp1                ; fetch indicator
-        bmi     negate
-        rts
-negate: jmp     negax