mirror of
https://github.com/cc65/cc65.git
synced 2024-11-13 13:11:06 +00:00
53dd513176
which included commits to RCS files with non-trunk default branches. git-svn-id: svn://svn.cc65.org/cc65/trunk@3 b7a2c559-68d2-44c3-8de9-860c34a00d81
128 lines
2.0 KiB
ArmAsm
128 lines
2.0 KiB
ArmAsm
;
|
|
; 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
|
|
|