diff --git a/libsrc/common/abs.s b/libsrc/common/abs.s deleted file mode 100644 index 5daa8a14a..000000000 --- a/libsrc/common/abs.s +++ /dev/null @@ -1,16 +0,0 @@ -; -; Ullrich von Bassewitz, 17.06.1998 -; -; int abs (int x); -; - - .export _abs - .import negax - -_abs: cpx #$00 ; test hi byte - bpl L1 - jmp negax ; Negate if negative -L1: rts - - - diff --git a/libsrc/runtime/div.s b/libsrc/runtime/div.s index cdd340272..e10ebc57d 100644 --- a/libsrc/runtime/div.s +++ b/libsrc/runtime/div.s @@ -5,18 +5,18 @@ ; ; When negating values, we will ignore the possibility here, that one of the -; values if $8000, in which case the negate will fail. +; values is $8000, in which case the negate will fail. .export tosdiva0, tosdivax - .import popsargs, udiv16, negax - .importzp sreg, tmp1, tmp2 + .import popsargsudiv16, negax + .importzp ptr1, tmp1, tmp2 tosdiva0: ldx #0 tosdivax: - jsr popsargs ; Get arguments from stack, adjust sign - jsr udiv16 ; Do the division - ldx sreg+1 ; Load high byte of result + jsr popsargsudiv16 ; Get arguments from stack, adjust sign + ; and do the division + 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. @@ -27,11 +27,11 @@ tosdivax: ; Result is negative - lda sreg ; Load low byte of result + lda ptr1 ; Load low byte of result jmp negax ; Adjust the sign ; Result is positive -Pos: lda sreg +Pos: lda ptr1 ; Load low byte of result rts diff --git a/libsrc/runtime/mod.s b/libsrc/runtime/mod.s index c4331ed85..58e740575 100644 --- a/libsrc/runtime/mod.s +++ b/libsrc/runtime/mod.s @@ -5,19 +5,19 @@ ; ; When negating values, we will ignore the possibility here, that one of the -; values if $8000, in which case the negate will fail. +; values is $8000, in which case the negate will fail. .export tosmoda0, tosmodax - .import popsargs, udiv16, negax - .importzp ptr1, tmp1 + .import popsargsudiv16, negax + .importzp sreg, tmp1 tosmoda0: ldx #0 tosmodax: - jsr popsargs ; Get arguments from stack, adjust sign - jsr udiv16 ; Do the division - lda ptr1 ; Load low byte of result - ldx ptr1+1 ; Load high byte of result + 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 diff --git a/libsrc/runtime/mulax3.s b/libsrc/runtime/mulax3.s index 472bc60ec..513ba723e 100644 --- a/libsrc/runtime/mulax3.s +++ b/libsrc/runtime/mulax3.s @@ -3,6 +3,7 @@ ; ; CC65 runtime: Multiply the primary register by 3 ; +; Don't touch the Y-register here, the optimizer relies on it! .export mulax3 .importzp ptr1 diff --git a/libsrc/runtime/neg.s b/libsrc/runtime/negabs.s similarity index 59% rename from libsrc/runtime/neg.s rename to libsrc/runtime/negabs.s index a428fd1e4..ef660f1da 100644 --- a/libsrc/runtime/neg.s +++ b/libsrc/runtime/negabs.s @@ -1,11 +1,16 @@ ; ; Ullrich von Bassewitz, 05.08.1998 ; +; int abs (int x); +; and ; CC65 runtime: negation on ints ; .export negax + .export _abs +_abs: cpx #$00 ; Test hi byte + bpl L1 ; Don't touch if positive negax: clc eor #$FF adc #1 @@ -15,7 +20,7 @@ negax: clc adc #0 tax pla - rts + L1: rts diff --git a/libsrc/runtime/shelp.s b/libsrc/runtime/shelp.s index b1ebeb798..9762dbf44 100644 --- a/libsrc/runtime/shelp.s +++ b/libsrc/runtime/shelp.s @@ -1,17 +1,17 @@ ; ; Ullrich von Bassewitz, 07.08.1998 ; -; CC65 runtime: helper stuff for mod/div/mul with signed ints +; CC65 runtime: helper stuff for mod/div with signed ints ; ; When negating values, we will ignore the possibility here, that one of the -; values if $8000, in which case the negate will fail. +; values is $8000, in which case the negate will fail. - .export popsargs - .import negax, popax - .importzp sreg, tmp1, tmp2, ptr4 + .export popsargsudiv16 + .import negax, popax, udiv16 + .importzp tmp1, tmp2, ptr1, ptr4 -popsargs: +popsargsudiv16: stx tmp2 ; Remember sign cpx #0 bpl L1 @@ -24,7 +24,6 @@ L1: sta ptr4 cpx #0 bpl L2 jsr negax -L2: sta sreg - stx sreg+1 - rts - +L2: sta ptr1 + stx ptr1+1 + jmp udiv16 ; Call the division diff --git a/libsrc/runtime/udiv.s b/libsrc/runtime/udiv.s index 93548d049..4115382c8 100644 --- a/libsrc/runtime/udiv.s +++ b/libsrc/runtime/udiv.s @@ -3,9 +3,10 @@ ; ; CC65 runtime: division for unsigned ints ; +; Don't use tmp1 here, the signed division tunnels data with it! .export tosudiva0, tosudivax, udiv16 - .import popsreg + .import popptr1 .importzp sreg, ptr1, ptr4 @@ -14,50 +15,50 @@ tosudiva0: tosudivax: sta ptr4 stx ptr4+1 ; Save right operand - jsr popsreg ; Get left operand + jsr popptr1 ; Get left operand ; Do the division jsr udiv16 -; Result is in sreg, remainder in ptr1 +; Result is in ptr1, remainder in sreg - lda sreg - ldx sreg+1 + lda ptr1 + ldx ptr1+1 rts ;--------------------------------------------------------------------------- -; 16by16 division. Divide sreg by ptr4. Result is in sreg, remainder in ptr1 +; 16by16 division. Divide ptr1 by ptr4. Result is in ptr1, remainder in sreg ; (see mult-div.s from "The Fridge"). ; This is also the entry point for the signed division udiv16: lda #0 - sta ptr1+1 + sta sreg+1 ldy #16 ldx ptr4+1 beq udiv16by8a -L0: asl sreg - rol sreg+1 - rol a +L0: asl ptr1 rol ptr1+1 + rol a + rol sreg+1 - pha + tax cmp ptr4 - lda ptr1+1 + lda sreg+1 sbc ptr4+1 bcc L1 - sta ptr1+1 - pla + sta sreg+1 + txa sbc ptr4 - pha - inc sreg + tax + inc ptr1 -L1: pla +L1: txa dey bne L0 - sta ptr1 + sta sreg rts @@ -65,18 +66,18 @@ L1: pla ; 16by8 division udiv16by8a: -@L0: asl sreg - rol sreg+1 +@L0: asl ptr1 + rol ptr1+1 rol a bcs @L1 cmp ptr4 bcc @L2 @L1: sbc ptr4 - inc sreg + inc ptr1 @L2: dey bne @L0 - sta ptr1 + sta sreg rts diff --git a/libsrc/runtime/umod.s b/libsrc/runtime/umod.s index 92ebb5f91..5788d569e 100644 --- a/libsrc/runtime/umod.s +++ b/libsrc/runtime/umod.s @@ -5,24 +5,24 @@ ; .export tosumoda0, tosumodax - .import popsreg, udiv16 - .importzp ptr1, ptr4 + .import popptr1, udiv16 + .importzp sreg, ptr4 tosumoda0: ldx #0 tosumodax: sta ptr4 stx ptr4+1 ; Save right operand - jsr popsreg ; Get right operand + jsr popptr1 ; Get right operand ; Do the division jsr udiv16 -; Result is in sreg, remainder in ptr1 +; Result is in ptr1, remainder in sreg - lda ptr1 - ldx ptr1+1 + lda sreg + ldx sreg+1 rts