12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- .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
|