sample.icasm 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Creates the following sample input for y2019d13
  2. // ####
  3. // # #
  4. // # o#
  5. // #_ #
  6. // ####
  7. ld 0d95, 0 // general register
  8. ld 0d96, 0 // general register
  9. ld 0d97, 0 // general register
  10. ld 0d98, 0 // general register
  11. ld 0d99, 0 // jpt, jpf, eq, lt result register
  12. ld 0d100, 0 // cursor y
  13. ld 0d101, 0 // cursor x
  14. ld 0d102, 5 // max height
  15. ld 0d103, 4 // max width
  16. ld 0d110, 0 // empty
  17. ld 0d111, 1 // wall
  18. ld 0d112, 2 // block
  19. ld 0d113, 3 // paddle
  20. ld 0d114, 4 // ball
  21. ld 0d120, 2 // ball y
  22. ld 0d121, 2 // ball x
  23. ld 0d130, 3 // paddle y
  24. ld 0d131, 1 // paddle x
  25. // print ceiling
  26. PrintCeil:
  27. out 0d101 // output x coord
  28. out 0d100 // output y coord
  29. out 0d111 // output wall tile
  30. add 0d101, 1, 0d101 // add 1 to x coord
  31. lt 0d101, 0d103, 0d99 // check if x is at boundary
  32. jpt 0d99, PrintCeil // loop function if not
  33. PrintFloor:
  34. ld 0d100, 0d102 // load the max height into the height
  35. ld 0d101, 0 // set the width to 0
  36. add 0d100, -1, 0d100 // subtract 1 from the height to get it within bounds
  37. out 0d101 // output the x coord
  38. out 0d100 // output the y coord
  39. out 0d111 // output wall tile
  40. add 0d101, 1, 0d101 // add 1 to the width
  41. lt 0d101, 0d103, 0d99 // check if x is at the boundary
  42. jpt 0d99, PrintFloor + 4 // loop function if not
  43. PrintMiddle:
  44. ld 0d100, 1 // set y to 1
  45. ld 0d101, 0 // set x to x
  46. ld 0d95, 0d103 // set reg. a to the max width
  47. add 0d95, -1, 0d95 // subtract 1 from reg. a
  48. ld 0d96, 0d102 // set reg. b to max height
  49. add 0d96, -1, 0d96 // subtract 1 from reg. b
  50. out 0d101 // output current x
  51. out 0d100 // output current y
  52. eq 0d101, 0, 0d99 // Check if x is equal to 0
  53. jpf 0d99, CURR + 3 // jump ahead 2 if not
  54. out 0d111 // output a wall tile
  55. jpt 1, CursorInc // loop function
  56. eq 0d101, 0d95, 0d99 // check if x is the boundary
  57. jpf 0d99, CURR + 3 // jump ahead 3 if not
  58. out 0d111 // output an wall tile
  59. jpt 1, CursorInc // jump to increment loop
  60. eq 0d101, 0d121, 0d99 // check if the cursor x matches the ball x
  61. jpf 0d99, CURR + 5 // skip this section if not
  62. eq 0d100, 0d120, 0d99 // check if the cursor y matches the ball y
  63. jpf 0d99, CURR + 3 // skip this section if not
  64. out 0d114 // if both checks passed, output the ball tile
  65. jpt 1, CursorInc // jump to cursor increment
  66. eq 0d101, 0d131, 0d99 // check if the cursor x matches the paddle x
  67. jpf 0d99, CursorInc // skip this section if not
  68. eq 0d100, 0d130, 0d99 // check if the cursor y matches the paddle y
  69. jpf 0d99, CursorInc // skip this section if not
  70. out 0d113 // if both checks passed, output the paddle tile
  71. CursorInc:
  72. add 0d101, 1, 0d101 // add 1 to the x
  73. eq 0d101, 0d95, 0d99 // compare cursor x max width of the board
  74. jpf 0d99, CURR + ? // skip this section if not
  75. ld 0d101, 0 // reset cursor x to 0
  76. add 0d100, 1, 0d100 // add 1 to the cursor y
  77. eq 0d100, 0d96, 0d99 // compare cursor y to max height of the board
  78. jpt 0d99, Halt // if they're equal, the whole board has been printed. exit
  79. jpf 0d99, PrintMiddle + 7 // else, loop the function
  80. Halt:
  81. ext // exit