70 lines
		
	
	
	
		
			928 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			928 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.define .set
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
.sect .text
 | 
						|
 | 
						|
! Create set with one bit on
 | 
						|
! Expects in de-reg:	size of set to be created
 | 
						|
! Expects on stack:	bit number
 | 
						|
! Yields on stack:	resulting set
 | 
						|
 | 
						|
.set:	pop h
 | 
						|
	shld .retadr
 | 
						|
	mov h,b
 | 
						|
	mov l,c
 | 
						|
	shld .bcreg
 | 
						|
 | 
						|
	mov a,e
 | 
						|
	rar
 | 
						|
	cc eoddz	! trap if size is odd
 | 
						|
	xchg		! hl = size of set
 | 
						|
	pop d		! de = bit number
 | 
						|
	mov a,e		! c = bit number in byte
 | 
						|
	ani 7
 | 
						|
	sta .areg	! save bit number in byte
 | 
						|
 | 
						|
	mvi b,3		! de = byte number
 | 
						|
1:	xra a
 | 
						|
	mov a,d
 | 
						|
	rar
 | 
						|
	mov d,a
 | 
						|
	mov a,e
 | 
						|
	rar
 | 
						|
	mov e,a
 | 
						|
	dcr b
 | 
						|
	jnz 1b
 | 
						|
 | 
						|
	mov a,l		! trap if bit number is too large
 | 
						|
	sub e
 | 
						|
	mov a,h
 | 
						|
	sbb d
 | 
						|
	cc eset
 | 
						|
 | 
						|
	lxi b,0		! make empty set on stack
 | 
						|
1:	push b
 | 
						|
	dcx h
 | 
						|
	dcx h
 | 
						|
	mov a,l
 | 
						|
	ora h
 | 
						|
	jnz 1b
 | 
						|
 | 
						|
	lxi h,0
 | 
						|
	dad sp
 | 
						|
	dad d		! hl points to byte that will contain a one
 | 
						|
	lda .areg
 | 
						|
	mov c,a		! c = bit number in byte
 | 
						|
	mvi a,1
 | 
						|
1:	dcr c
 | 
						|
	jm 2f
 | 
						|
	rlc
 | 
						|
	jmp 1b
 | 
						|
 | 
						|
2:	mov m,a
 | 
						|
 | 
						|
	lhld .bcreg
 | 
						|
	mov b,h
 | 
						|
	mov c,l
 | 
						|
	lhld .retadr
 | 
						|
	pchl
 |