sri2.s 750 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. .define .sri2
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! Shift 16 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 in de-reg.: result
  13. .sri2: pop h
  14. shld .retadr
  15. pop h !hl = number of shifts
  16. pop d !de = number to be shifted
  17. mvi h,0
  18. ora a
  19. jz 1f !jump if unsigned integer
  20. mov a,d
  21. ral
  22. jnc 1f !jump if positive signed integer
  23. mvi h,255 !now h=1 if negative signed number, h=0 otherwise.
  24. 1: mov a,l !return 0 or -1 if hl>=16
  25. cpi 16
  26. jnc 3f
  27. 2: dcr l
  28. jm 4f
  29. mov a,h
  30. rar !set carry bit correct
  31. mov a,d
  32. rar
  33. mov d,a
  34. mov a,e
  35. rar
  36. mov e,a
  37. jmp 2b
  38. 3: mov d,h
  39. mov e,h
  40. 4: lhld .retadr
  41. pchl