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

62 lines
889 B
ArmAsm

.define .inn
! Any size bit test on set.
! Expects in de-reg: size of set (in bytes)
! Expects on stack: bit number
! set to be tested
! Yields in de-reg.: 0 if bit is reset or bit number out of range
! 1 if bit is set
.inn: pop h
shld .retadr
mov h,b
mov l,c
shld .bcreg
pop h
xchg !hl = size, de = bit number
mov a,d !test if bit number is negative
ral
jc 3f
mov a,e
ani 7
mov b,a !save bits 0-2 of bit number in b-reg
mvi c,3
1: xra a
mov a,d !shift bit number right 3 times
rar
mov d,a
mov a,e
rar
mov e,a
dcr c
jnz 1b
mov a,l !test if bit number is small enough
sub e
mov a,h
sbb d
jc 3f
xchg
dad sp
xchg
ldax d !a-register = wanted byte
2: dcr b !dcr doesn't affect carry bit
jm 4f
rar
jmp 2b
3: xra a !return 0 if bit number out of range
4: ani 1
mov e,a
mvi d,0
dad sp
sphl
lhld .bcreg
mov b,h
mov c,l
lhld .retadr
pchl