sinegen.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import string
  2. import math
  3. import sys
  4. M_PI = 3.14159265358979323846
  5. def writefile(fp,val):
  6. global out,el
  7. if not len(out):
  8. out = " .db "
  9. el+=1
  10. out += "$%02x," % val
  11. if el == cnt/8 :
  12. out=out[:-1]
  13. out+="\n"
  14. fp.write(out)
  15. out =""
  16. el=0
  17. def sine(val,r,scale,stepping):
  18. global M_PI,flip
  19. re = int(math.sin(val*(M_PI*scale)/r)*r) + r
  20. re = re & 0xff
  21. if flip and val%2:
  22. re = (r*2) - re
  23. re = re * stepping
  24. #print "sine %s -> %s " % (val,re)
  25. return re
  26. def main():
  27. global cnt,flip
  28. asmfile = sys.argv[1]
  29. basename = string.replace(asmfile,".s","")
  30. cnt = int(sys.argv[2])
  31. upper = int(sys.argv[3])
  32. if len(sys.argv) >= 5:
  33. stepping = int(sys.argv[4])
  34. else:
  35. stepping = 1
  36. if len(sys.argv) >= 6 and sys.argv[5]=='flip':
  37. flip = 1
  38. else:
  39. flip = 0
  40. half = int(cnt) / 2
  41. if cnt%8:
  42. print "ctn should be modulo 8"
  43. sys.exit(1)
  44. fp = open(asmfile,'w')
  45. out = "\n\n\n%s:\n\n" % (basename)
  46. fp.write(out)
  47. out = ""
  48. for i in range(0,cnt):
  49. writefile(fp,sine(i,upper/2,(float(upper)/cnt),stepping))
  50. out = str()
  51. el = 0
  52. if __name__ == '__main__':
  53. if len(sys.argv) >= 4:
  54. main()
  55. else:
  56. print "usage: %s filename cnt(int) upper(int) [stepping (int)] ['flip']" % sys.argv[0]