set.s 928 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. .define .set
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! Create set with one bit on
  8. ! Expects in de-reg: size of set to be created
  9. ! Expects on stack: bit number
  10. ! Yields on stack: resulting set
  11. .set: pop h
  12. shld .retadr
  13. mov h,b
  14. mov l,c
  15. shld .bcreg
  16. mov a,e
  17. rar
  18. cc eoddz ! trap if size is odd
  19. xchg ! hl = size of set
  20. pop d ! de = bit number
  21. mov a,e ! c = bit number in byte
  22. ani 7
  23. sta .areg ! save bit number in byte
  24. mvi b,3 ! de = byte number
  25. 1: xra a
  26. mov a,d
  27. rar
  28. mov d,a
  29. mov a,e
  30. rar
  31. mov e,a
  32. dcr b
  33. jnz 1b
  34. mov a,l ! trap if bit number is too large
  35. sub e
  36. mov a,h
  37. sbb d
  38. cc eset
  39. lxi b,0 ! make empty set on stack
  40. 1: push b
  41. dcx h
  42. dcx h
  43. mov a,l
  44. ora h
  45. jnz 1b
  46. lxi h,0
  47. dad sp
  48. dad d ! hl points to byte that will contain a one
  49. lda .areg
  50. mov c,a ! c = bit number in byte
  51. mvi a,1
  52. 1: dcr c
  53. jm 2f
  54. rlc
  55. jmp 1b
  56. 2: mov m,a
  57. lhld .bcreg
  58. mov b,h
  59. mov c,l
  60. lhld .retadr
  61. pchl