inn.s 947 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. .define .inn
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! Any size bit test on set.
  8. ! Expects in de-reg: size of set (in bytes)
  9. ! Expects on stack: bit number
  10. ! set to be tested
  11. ! Yields in de-reg.: 0 if bit is reset or bit number out of range
  12. ! 1 if bit is set
  13. .inn: pop h
  14. shld .retadr
  15. mov h,b
  16. mov l,c
  17. shld .bcreg
  18. pop h
  19. xchg !hl = size, de = bit number
  20. mov a,d !test if bit number is negative
  21. ral
  22. jc 3f
  23. mov a,e
  24. ani 7
  25. mov b,a !save bits 0-2 of bit number in b-reg
  26. mvi c,3
  27. 1: xra a
  28. mov a,d !shift bit number right 3 times
  29. rar
  30. mov d,a
  31. mov a,e
  32. rar
  33. mov e,a
  34. dcr c
  35. jnz 1b
  36. mov a,l !test if bit number is small enough
  37. sub e
  38. mov a,h
  39. sbb d
  40. jc 3f
  41. xchg
  42. dad sp
  43. xchg
  44. ldax d !a-register = wanted byte
  45. 2: dcr b !dcr doesn't affect carry bit
  46. jm 4f
  47. rar
  48. jmp 2b
  49. 3: xra a !return 0 if bit number out of range
  50. 4: ani 1
  51. mov e,a
  52. mvi d,0
  53. dad sp
  54. sphl
  55. lhld .bcreg
  56. mov b,h
  57. mov c,l
  58. lhld .retadr
  59. pchl