2 ; Ullrich von Bassewitz, 05.08.1998
4 ; CC65 runtime: right shift support for ints
8 ; --------------------------------------------------------------------
11 .export tosasra0, tosasrax
12 .import popsreg, return0
18 jsr popsreg ; get TOS into sreg
24 cmp #8 ; Shift count greater 8?
25 beq L4 ; Jump if exactly 8
28 ; Shift count is greater 8. Do the first 8 bits the fast way
34 dey ; Create correct sign bits
39 ; Shift count less than 8 if we come here
41 L2: tay ; Shift count --> Y
42 beq Zero ; Done if shift count zero
44 lda sreg ; get low byte for faster shift
45 ldx sreg+1 ; get high byte
49 L3: cpx #$80 ; get bit 7 into carry
62 L4: lda sreg+1 ; X is zero
67 ; Shift count was zero
73 ; Shift count too large, result is zero
79 ; --------------------------------------------------------------------
82 .export tosshra0, tosshrax
87 jsr popsreg ; get TOS into sreg
93 cmp #8 ; Shift count greater 8?
94 beq L8 ; Jump if exactly 8
97 ; Shift count is greater 8. Do the first 8 bits the fast way
99 sbc #8 ; Carry already set
102 stx sreg+1 ; High byte = 0
104 ; Shift count less than 8 if we come here
106 L6: tay ; Shift count --> Y
107 beq Zero ; Done if shift count zero
109 lda sreg ; get low byte for faster shift
111 ; Do the actual shift
125 L8: lda sreg+1 ; X is zero