ack/mach/i80/libem/sri4.s
1985-03-18 12:46:51 +00:00

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