]> git.sur5r.net Git - cc65/blobdiff - libsrc/runtime/lsubeq.s
few 6502 and some 65SC02 optimizations
[cc65] / libsrc / runtime / lsubeq.s
index 974626c146c95013e0ff252db8430bf9887ec583..5e3d25783375329749b6c6d415600b750398a4d0 100644 (file)
@@ -1,5 +1,6 @@
-;
+;                                 
 ; Ullrich von Bassewitz, 07.04.2000
+; Christian Krueger, 12-Mar-2017, added 65SC02 optimization
 ;
 ; CC65 runtime: -= operator
 ;
@@ -7,50 +8,55 @@
 ; in ptr1, the high byte is in Y, and the decrement is in eax.
 ;
 
-               .export         lsubeq1, lsubeqa, lsubeq
-               .importzp       sreg, ptr1, tmp1
+        .export         lsubeq1, lsubeqa, lsubeq
+        .importzp       sreg, ptr1
 
+        .macpack        cpu
 
 lsubeq1:
-               lda     #$01
+        lda     #$01
 
 lsubeqa:
-       ldx     #$00
-       stx     sreg
-       stx     sreg+1
-
-lsubeq:        sty     ptr1+1                  ; Store high byte of address
-       ldy     #$00                    ; Address low byte
-       sec
-
-       sta     tmp1
-       lda     (ptr1),y                ; Load byte 0
-       sbc     tmp1
-       sta     (ptr1),y
-               pha                             ; Save byte 0 of result for later
-
-       iny                             ; Address byte 1
-       stx     tmp1
-       lda     (ptr1),y                ; Load byte 1
-       sbc     tmp1
-       sta     (ptr1),y
-       tax
-
-       iny                             ; Address byte 2
-       lda     (ptr1),y
-       sbc     sreg
-       sta     (ptr1),y
-       sta     sreg
-
-       iny                             ; Address byte 3
-       lda     (ptr1),y
-       sbc     sreg+1
-       sta     (ptr1),y
-       sta     sreg+1
-
-       pla                             ; Retrieve byte 0 of result
-
-       rts                             ; Done
+        ldx     #$00
+        stx     sreg
+        stx     sreg+1
+
+lsubeq: sty     ptr1+1                  ; Store high byte of address
+    
+        sec
+        eor     #$FF
+ .if (.cpu .bitand ::CPU_ISET_65SC02)
+        adc     (ptr1)                  ; Subtract byte 0
+        sta     (ptr1)
+        ldy     #$01                    ; Address byte 1               
+ .else
+        ldy     #$00                    ; Address low byte
+        adc     (ptr1),y                ; Subtract byte 0
+        sta     (ptr1),y
+        iny                             ; Address byte 1       
+ .endif  
+        pha                             ; Save byte 0 of result for later
+        txa
+        eor     #$FF
+        adc     (ptr1),y                ; Subtract byte 1
+        sta     (ptr1),y
+        tax
+
+        iny                             ; Address byte 2
+        lda     (ptr1),y
+        sbc     sreg
+        sta     (ptr1),y
+        sta     sreg
+
+        iny                             ; Address byte 3
+        lda     (ptr1),y
+        sbc     sreg+1
+        sta     (ptr1),y
+        sta     sreg+1
+
+        pla                             ; Retrieve byte 0 of result
+
+        rts                             ; Done