66 lines
		
	
	
	
		
			947 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			947 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.define .inn
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
.sect .text
 | 
						|
 | 
						|
! 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
 | 
						|
 |