sri4.s 824 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. .define .sri4
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! Shift 32 bits signed or unsigned integer right
  8. ! Expects in a-reg.: 1 if signed integer
  9. ! 0 if unsigned integer
  10. ! Expects on stack: number of shifts
  11. ! number to be shifted
  12. ! Yields on stack: result
  13. .sri4: pop h
  14. shld .retadr
  15. mov h,b
  16. mov l,c
  17. shld .bcreg
  18. pop b !number of shifts
  19. pop d !low-order bytes of number to be shifted
  20. pop h !high-order bytes
  21. mvi b,0
  22. ora a
  23. jz 1f !jump if unsigned integer
  24. mov a,h
  25. ral
  26. jnc 1f !jump if positive signed integer
  27. mvi b,255
  28. 1: mov a,c
  29. cpi 32
  30. jnc 3f
  31. 2: dcr c
  32. jm 4f
  33. mov a,b
  34. rar
  35. mov a,h
  36. rar
  37. mov h,a
  38. mov a,l
  39. rar
  40. mov l,a
  41. mov a,d
  42. rar
  43. mov d,a
  44. mov a,e
  45. rar
  46. mov e,a
  47. jmp 2b
  48. 3: mov d,b
  49. mov e,b
  50. mov h,b
  51. mov l,b
  52. 4: push h
  53. push d
  54. lhld .bcreg
  55. mov b,h
  56. mov c,l
  57. lhld .retadr
  58. pchl