1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-23 04:30:10 +00:00
cc65/libsrc/runtime/divt.s
cuz 1ee3ccfdc2 Added new div() function written by Greg King
git-svn-id: svn://svn.cc65.org/cc65/trunk@1469 b7a2c559-68d2-44c3-8de9-860c34a00d81
2002-10-25 20:42:18 +00:00

44 lines
1.0 KiB
ArmAsm

; 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