; values if $8000, in which case the negate will fail.
.export tosdiva0, tosdivax
- .import popsargs, udiv16, adjsres
- .importzp sreg
+ .import popsargs, udiv16, negax
+ .importzp sreg, tmp1, tmp2
tosdiva0:
ldx #0
tosdivax:
jsr popsargs ; Get arguments from stack, adjust sign
jsr udiv16 ; Do the division
- lda sreg ; Result is in sreg, remainder in ptr1
- ldx sreg+1
- jmp adjsres ; Adjust the sign of the result if needed
+ 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
+ rts
; values if $8000, in which case the negate will fail.
.export tosmoda0, tosmodax
- .import popsargs, udiv16, adjsres
- .importzp ptr1
+ .import popsargs, udiv16, negax
+ .importzp ptr1, tmp1
tosmoda0:
ldx #0
tosmodax:
jsr popsargs ; Get arguments from stack, adjust sign
jsr udiv16 ; Do the division
- lda ptr1 ; Result is in sreg, remainder in ptr1
- ldx ptr1+1
- jmp adjsres ; Adjust the sign of the result if needed
+ ldx ptr1+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
+
+ lda tmp1
+ bpl Pos ; Jump if sign of result positive
+
+; Result is negative
+
+ lda ptr1 ; Load low byte of result
+ jmp negax ; Adjust the sign
+
+; Result is positive
+
+Pos: lda ptr1
+ rts
; When negating values, we will ignore the possibility here, that one of the
; values if $8000, in which case the negate will fail.
- .export popsargs, adjsres
+ .export popsargs
.import negax, popax
.importzp sreg, tmp1, tmp2, ptr4
popsargs:
- stx tmp1 ; Remember sign
+ stx tmp2 ; Remember sign
cpx #0
bpl L1
jsr negax ; Negate accumulator
stx ptr4+1 ; Save right operand
jsr popax
- stx tmp2 ; Remember sign
+ stx tmp1 ; Remember sign
cpx #0
bpl L2
jsr negax
L2: sta sreg
stx sreg+1
-
-; Calculate the sign of the result, that is sign(op1) * sign(op2)
-
- lda tmp1
- eor tmp2
- sta tmp2 ; Save it across call
-L3: rts
-
-; Adjust the result of a mod/div/mul operation
-
-adjsres:
-
-; Check if we must adjust the sign
-
- ldy tmp2
- bpl L3
- jmp negax ; Adjust sign
-
-
+ rts