62 lines
766 B
ArmAsm
62 lines
766 B
ArmAsm
|
.define .sri4
|
||
|
|
||
|
! Shift 32 bits signed or unsigned integer right
|
||
|
! Expects in a-reg.: 1 if signed integer
|
||
|
! 0 if unsigned integer
|
||
|
! Expects on stack: number of shifts
|
||
|
! number to be shifted
|
||
|
! Yields on stack: result
|
||
|
|
||
|
.sri4: pop h
|
||
|
shld .retadr
|
||
|
mov h,b
|
||
|
mov l,c
|
||
|
shld .bcreg
|
||
|
|
||
|
pop b !number of shifts
|
||
|
pop d !low-order bytes of number to be shifted
|
||
|
pop h !high-order bytes
|
||
|
mvi b,0
|
||
|
ora a
|
||
|
jz 1f !jump if unsigned integer
|
||
|
mov a,h
|
||
|
ral
|
||
|
jnc 1f !jump if positive signed integer
|
||
|
mvi b,255
|
||
|
|
||
|
1: mov a,c
|
||
|
cpi 32
|
||
|
jnc 3f
|
||
|
|
||
|
2: dcr c
|
||
|
jm 4f
|
||
|
mov a,b
|
||
|
rar
|
||
|
mov a,h
|
||
|
rar
|
||
|
mov h,a
|
||
|
mov a,l
|
||
|
rar
|
||
|
mov l,a
|
||
|
mov a,d
|
||
|
rar
|
||
|
mov d,a
|
||
|
mov a,e
|
||
|
rar
|
||
|
mov e,a
|
||
|
jmp 2b
|
||
|
|
||
|
3: mov d,b
|
||
|
mov e,b
|
||
|
mov h,b
|
||
|
mov l,b
|
||
|
|
||
|
4: push h
|
||
|
push d
|
||
|
|
||
|
lhld .bcreg
|
||
|
mov b,h
|
||
|
mov c,l
|
||
|
lhld .retadr
|
||
|
pchl
|