diff --git a/libsrc/runtime/Makefile b/libsrc/runtime/Makefile index a7808a82b..a0b41c09c 100644 --- a/libsrc/runtime/Makefile +++ b/libsrc/runtime/Makefile @@ -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 index 000000000..c36ea7944 --- /dev/null +++ b/libsrc/runtime/divt.s @@ -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 +; 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 +