MyPseudoCommands.lib 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #importonce // <-- This is a library, we only want it included once
  2. .filenamespace MyPseudoCommands // <-- Sets up a 'MyMacros' namespace for this file
  3. //-----------------------------
  4. // Help functions
  5. //-----------------------------
  6. .function _16bit_nextArgument(arg) { // <-- Not visible in root scope
  7. .if (arg.getType()==AT_IMMEDIATE) .return CmdArgument(arg.getType(),>arg.getValue())
  8. .return CmdArgument(arg.getType(),arg.getValue()+1)
  9. }
  10. .macro ensureImmediateArgument(arg) {
  11. .if (arg.getType()!=AT_IMMEDIATE) .error "The argument must be immediate!"
  12. }
  13. //-----------------------------
  14. // Library PseudoCommands
  15. //-----------------------------
  16. .pseudocommand @mov arg1:arg2 { //<-- @ puts it in the root scope
  17. lda arg1
  18. sta arg2
  19. }
  20. .pseudocommand @mov16 src:tar {
  21. lda src
  22. sta tar
  23. lda _16bit_nextArgument(src)
  24. sta _16bit_nextArgument(tar)
  25. }
  26. .pseudocommand @lsr16 arg {
  27. lsr _16bit_nextArgument(arg)
  28. ror arg
  29. }
  30. .pseudocommand @asl16 arg {
  31. asl arg
  32. rol _16bit_nextArgument(arg)
  33. }
  34. .pseudocommand @pause cycles {
  35. ensureImmediateArgument(cycles)
  36. .var x = floor(cycles.getValue())
  37. .if (x<2) .error "Cant make a pause on " + x + " cycles"
  38. // Make a delay loop
  39. .if (x>=11) {
  40. .const cfirst = 6 // cycles for first loop
  41. .const cextra = 5 // cycles for extra loops
  42. .var noOfLoops = 1+floor([x-cfirst]/cextra)
  43. .eval x = x - cfirst - [noOfLoops-1]*cextra
  44. .if (x==1){
  45. .eval x=x+cextra
  46. .eval noOfLoops--
  47. }
  48. ldy #noOfLoops
  49. m1: dey
  50. m2: bne *-1
  51. .if (m1>>8 != m2>>8) .error "Pause loop is crossing page. Invalid cycle count!"
  52. }
  53. // Take care of odd cyclecount
  54. .if ([x&1]==1) {
  55. bit $00
  56. .eval x=x-3
  57. }
  58. // Take care of the rest
  59. .if (x>0)
  60. nop #x/2
  61. }
  62. .pseudocommand @nop x {
  63. ensureImmediateArgument(x)
  64. .for (var i=0; i<x.getValue(); i++) nop
  65. }