]> git.sur5r.net Git - cc65/commitdiff
Added new div() function written by Greg King
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 25 Oct 2002 20:42:18 +0000 (20:42 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 25 Oct 2002 20:42:18 +0000 (20:42 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1469 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/runtime/Makefile
libsrc/runtime/divt.s [new file with mode: 0644]

index a7808a82bdc68e24ce6ea9cc11331687c59bb632..a0b41c09c1e821b2f0d23f1dd22fbe573651aa2c 100644 (file)
@@ -54,6 +54,7 @@ OBJS =        add.o           \
        decsp7.o        \
        decsp8.o        \
                div.o           \
+        divt.o          \
                enter.o         \
                eq.o            \
                ge.o            \
diff --git a/libsrc/runtime/divt.s b/libsrc/runtime/divt.s
new file mode 100644 (file)
index 0000000..c36ea79
--- /dev/null
@@ -0,0 +1,43 @@
+; divt.s
+;
+; 2002-10-22, Greg King
+;
+; This signed-division function returns both the quotient and the remainder,
+; in this structure:
+;
+; typedef struct {
+;     int rem, quot;
+; } div_t;
+;
+; div_t __fastcall__ div (int numer, int denom);
+;
+; Both sides of an assignment-expression must be cast to (long)
+; because cc65 functions can't return structures -- yet.  Example:
+;
+; #include <stdlib.h>
+; div_t answer;
+;
+; (long)answer = (long)div(-41, +3);
+; printf("The quotient is %d, and the remainder is %d.\n",
+;      answer.quot, answer.rem);
+
+       .export         _div
+
+       .import         tosdivax, negax
+       .importzp       sreg, ptr1, tmp1
+
+_div:  jsr     tosdivax        ; Division-operator does most of the work
+        sta     sreg           ; Quotient is in sreg
+        stx     sreg+1
+        lda     ptr1           ; Unsigned remainder is in ptr1
+        ldx     ptr1+1
+
+; Adjust the sign of the remainder.
+; It must be the same as the sign of the dividend.
+;
+       bit     tmp1            ; Load high-byte of left argument
+       bpl     Pos             ; Jump if sign-of-result is positive
+       jmp     negax           ; Result is negative, adjust the sign
+
+Pos:   rts
+