From b9ffe5de13fef176355916c25d3f7905ab806346 Mon Sep 17 00:00:00 2001 From: uz Date: Sun, 24 Jun 2012 22:04:00 +0000 Subject: [PATCH] Add another entry point to the shift left routine, that shifts A/X by Y without going over the stack. git-svn-id: svn://svn.cc65.org/cc65/trunk@5742 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/runtime/shl.s | 73 +++++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/libsrc/runtime/shl.s b/libsrc/runtime/shl.s index 1963abbdc..31750047b 100644 --- a/libsrc/runtime/shl.s +++ b/libsrc/runtime/shl.s @@ -11,45 +11,70 @@ ; - .export tosaslax, tosshlax - .import popax - .importzp tmp1 + .export tosaslax, tosshlax, aslaxy, shlaxy + .import popax + .importzp tmp1 + + .macpack cpu tosshlax: tosaslax: - and #$0F ; Bring the shift count into a valid range - sta tmp1 ; Save it - + sta tmp1 ; Save shift count it jsr popax ; Get the left hand operand - ldy tmp1 ; Get shift count - beq L9 ; Bail out if shift count zero - - cpy #8 ; Shift count 8 or greater? - bcc L3 ; Jump if not -; Shift count is greater 7. The carry is set when we enter here. +; Run into shlaxy - tax +shlaxy: +aslaxy: + pha tya - sbc #8 - tay - txa - jmp L2 + and #$0F + beq L2 ; Nothing to shift + sec + sbc #8 ; Shift count 8 or greater? + beq L3 ; Jump if exactly 8 + bcc L4 ; Jump if less than 8 + +; Shift count is greater than 8. + + tay ; Shift count into Y + pla ; Get low byte + L1: asl a -L2: dey - bpl L1 + dey + bne L1 tax - lda #$00 + tya ; A = 0 + rts + +; Shift count is zero + +L2: pla + rts + +; Shift count is exactly 8 + +.if (.cpu .bitand CPU_ISET_65SC02) +L3: plx ; Low byte from stack into X + rts ; A is already zero +.else +L3: pla ; Low byte from stack ... + tax ; ... into X + lda #$00 ; Clear low byte rts +.endif -; Shift count is less than 8. +; Shift count is less than 8 -L3: stx tmp1 ; Save high byte of lhs -L4: asl a +L4: adc #8 ; Correct counter + tay ; Shift count into Y + pla ; Restore low byte + stx tmp1 ; Save high byte of lhs +L5: asl a rol tmp1 dey - bne L4 + bne L5 ; Done with shift -- 2.39.5