71 lines
928 B
ArmAsm
71 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
|