1
0
mirror of https://github.com/cc65/cc65.git synced 2024-11-14 20:05:05 +00:00
cc65/libsrc/runtime/shr.s

128 lines
2.0 KiB
ArmAsm
Raw Normal View History

;
; Ullrich von Bassewitz, 05.08.1998
;
; CC65 runtime: right shift support for ints
;
; --------------------------------------------------------------------
; signed shift
.export tosasra0, tosasrax
.import popsreg, return0
.importzp sreg
tosasra0:
ldx #0
tosasrax:
jsr popsreg ; get TOS into sreg
cpx #0
bne TooLarge
cmp #16
bcs TooLarge
cmp #8 ; Shift count greater 8?
beq L4 ; Jump if exactly 8
bcc L2 ; Jump if no
; Shift count is greater 8. Do the first 8 bits the fast way
ldy #0
ldx sreg+1
stx sreg
bpl L1
dey ; Create correct sign bits
L1: sty sreg+1
sec
sbc #8
; Shift count less than 8 if we come here
L2: tay ; Shift count --> Y
beq Zero ; Done if shift count zero
lda sreg ; get low byte for faster shift
ldx sreg+1 ; get high byte
; Do the actual shift
L3: cpx #$80 ; get bit 7 into carry
ror sreg+1
ror a
dey
bne L3
; Done with shift
ldx sreg+1
rts
; Shift count == 8
L4: lda sreg+1 ; X is zero
bpl *+3
dex ; X == 0xFF
rts
; Shift count was zero
Zero: lda sreg
ldx sreg+1
rts
; Shift count too large, result is zero
TooLarge:
jmp return0
; --------------------------------------------------------------------
; unsigned shift
.export tosshra0, tosshrax
tosshra0:
ldx #0
tosshrax:
jsr popsreg ; get TOS into sreg
cpx #0
bne TooLarge
cmp #16
bcs TooLarge
cmp #8 ; Shift count greater 8?
beq L8 ; Jump if exactly 8
bcc L6 ; Jump if no
; Shift count is greater 8. Do the first 8 bits the fast way
sbc #8 ; Carry already set
ldy sreg+1
sty sreg
stx sreg+1 ; High byte = 0
; Shift count less than 8 if we come here
L6: tay ; Shift count --> Y
beq Zero ; Done if shift count zero
lda sreg ; get low byte for faster shift
; Do the actual shift
L7: lsr sreg+1
ror a
dey
bne L7
; Done with shift
ldx sreg+1
rts
; Shift count == 8
L8: lda sreg+1 ; X is zero
rts