mirror of
https://github.com/cc65/cc65.git
synced 2024-12-30 20:29:25 +00:00
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
|
||
|
|