From: uz Date: Sun, 24 Jun 2012 22:04:00 +0000 (+0000) Subject: Add another entry point to the shift left routine, that shifts A/X by Y X-Git-Tag: V2.14~326 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=b9ffe5de13fef176355916c25d3f7905ab806346;p=cc65 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 --- 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