Advertisement
Guest User

Untitled

a guest
Dec 4th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 KB | None | 0 0
  1. 10progsize%=400
  2. 20DIM prog% progsize%
  3. 30datasize%=323*4
  4. 40DIM data% datasize%
  5. 50FOR O%=0 TO 3 STEP 3
  6. 60P%=prog%
  7. 70PROCprog
  8. 80IF P%-prog% > progsize% THEN ERROR 255, "Prog too big " + STR$(P%-prog%)
  9. 90NEXT
  10. 100CALL loaddata
  11. 105!&81 = 1
  12. 106?&85 = 0
  13. 110 PROCrun_path(3,1)
  14. 120PRINT "Part 1: "; !&81
  15. 130PROCrun_path(1,1)
  16. 140PROCrun_path(5,1)
  17. 150PROCrun_path(7,1)
  18. 160PROCrun_path(1,2)
  19. 170PRINT "Part 2: ";
  20. 175CALL printforty
  21. 178PRINT
  22. 180END
  23. 190DEF PROCrun_path(xstep%,ystep%)
  24. 200X%=xstep%
  25. 210Y%=ystep%
  26. 220CALL counttrees
  27. 230 LOCAL trees%
  28. 240trees%=!&74 AND &FFFF
  29. 250PRINT STR$(xstep%);",";STR$(ystep%);" trees=";STR$(trees%)
  30. 260CALL mult
  31. 265ENDPROC
  32. 270DEF PROCprog
  33. 280[OPT O%
  34. 290.loaddata
  35. 300LDA #&40 \ open file for input
  36. 310LDX #filename AND &FF
  37. 320LDY #filename DIV 256
  38. 330JSR &FFCE \ OSFIND
  39. 340ORA #0
  40. 350BNE gotfile
  41. 360BRK
  42. 370EQUB &FF
  43. 380EQUS "Error opening file"
  44. 390EQUB 13
  45. 400.gotfile
  46. 410TAY
  47. 420LDA #data% AND &FF
  48. 430STA &70
  49. 440LDA #data% DIV 256
  50. 450STA &71
  51. 460LDX #0
  52. 470.startbyte
  53. 480LDA #0
  54. 490STA (&70, X)
  55. 500LDA #1 \ bit
  56. 510STA &72
  57. 520.byteloop
  58. 530JSR &FFD7 \ OSBGET
  59. 540CMP #&FE
  60. 550BCS enddata
  61. 560JSR &FFEE \ OSWRCH
  62. 570CMP #10
  63. 580BNE notendline
  64. 590LDA #13
  65. 600JSR &FFEE \ OSWRCH
  66. 610JMP endbyte
  67. 620.notendline
  68. 630CMP #ASC("#")
  69. 640BNE nottree
  70. 650LDA (&70, X)
  71. 660ORA &72
  72. 670STA (&70, X)
  73. 680.nottree
  74. 690ASL &72
  75. 700BNE byteloop
  76. 710.endbyte
  77. 720CLC
  78. 730LDA &70
  79. 740ADC #1
  80. 750STA &70
  81. 760LDA &71
  82. 770ADC #0
  83. 780STA &71
  84. 790JMP startbyte
  85. 800.enddata
  86. 810LDA #0 \ close file
  87. 820JMP &FFCE \ OSFIND
  88. 830.counttrees
  89. 840\ set &70 to %data
  90. 850LDA #data% AND &FF
  91. 860STA &70
  92. 870LDA #data% DIV 256
  93. 880STA &71
  94. 890\ &72 will be the x-offset
  95. 900STX &72
  96. 910\ &76 will be the y-offset to add in bytes
  97. 920TYA
  98. 930ASL A:ASL A
  99. 940STA &76
  100. 950\ &73 is the bit to test
  101. 960LDA #1
  102. 970STA &73
  103. 980\ Y is the byte offset in the row
  104. 990LDY #0
  105. 1000\ &74,5 is the count of trees
  106. 1010STY &74
  107. 1020STY &75
  108. 1030.loop
  109. 1040\ move to the next line in the data
  110. 1050LDA &70
  111. 1060CLC
  112. 1070ADC &76
  113. 1080STA &70
  114. 1090LDA &71
  115. 1100ADC #0
  116. 1110STA &71
  117. 1120\ check if we've reached the end
  118. 1130CMP #(data% + datasize%) DIV 256
  119. 1140BCC notdataend
  120. 1150LDA &70
  121. 1160CMP #(data% + datasize%) AND &FF
  122. 1170BCS printresults
  123. 1180.notdataend
  124. 1190\ add horizontal offset
  125. 1200LDA &72
  126. 1210LSR A:LSR A:LSR A
  127. 1220STY &80
  128. 1230CLC
  129. 1240ADC &80
  130. 1250TAY
  131. 1260LDA &72
  132. 1270AND #7
  133. 1280TAX
  134. 1290.shiftloop
  135. 1300ASL &73
  136. 1310BNE notnextbyte
  137. 1320LDA #1
  138. 1330STA &73
  139. 1340INY
  140. 1350.notnextbyte
  141. 1360DEX
  142. 1370BNE shiftloop
  143. 1380\ check if we've gone off the end of the line
  144. 1390CPY #3
  145. 1400BCC notlineend
  146. 1410 BNE lineend
  147. 1420LDA &73
  148. 1430BPL notlineend \ line end when bit 7 set
  149. 1440.lineend
  150. 1450\ subtract 31 from the x-pos
  151. 1460DEY:DEY:DEY
  152. 1470LDX #7
  153. 1480 .subloop
  154. 1490LSR (&73)
  155. 1500BNE notsubbyte
  156. 1510DEY
  157. 1520LDA #&80
  158. 1530STA &73
  159. 1540.notsubbyte
  160. 1550DEX
  161. 1560BNE subloop
  162. 1570.notlineend
  163. 1580\ test whether there's a tree
  164. 1590LDA (&70), Y
  165. 1600AND &73
  166. 1610BEQ loop
  167. 1620\ add to the tree count
  168. 1630CLC
  169. 1640LDA &74
  170. 1650ADC #1
  171. 1660STA &74
  172. 1670LDA &75
  173. 1680ADC #0
  174. 1690STA &75
  175. 1700JMP loop
  176. 1710.printresults
  177. 1720RTS
  178. 1730.filename
  179. 1740EQUS "data"
  180. 1750EQUB 13
  181. 1770\ routine to multiply a 5-byte integer in &81 by an 8-bit number in &74 and store the result in &81
  182. 1780.mult
  183. 1790 \ number to add in &86, clear result in &81
  184. 1800 LDX #4
  185. 1810.copyloop
  186. 1820LDA &81, X
  187. 1830STA &86, X
  188. 1831 LDA #0
  189. 1832STA &81, X
  190. 1840DEX
  191. 1850BPL copyloop
  192. 1860 .multloop
  193. 1890LSR &74
  194. 1900\ add value if bit was set
  195. 1910BCC nomultadd
  196. 1920CLC
  197. 1930 LDX #&80 - 5
  198. 1940.multaddloop
  199. 1950 LDA &86 + 5 - &80, X
  200. 1960 ADC &81 + 5 - &80, X
  201. 1970 STA &81 + 5 - &80, X
  202. 1980 INX
  203. 1990BPL multaddloop
  204. 2000.nomultadd
  205. 2010\ multiply the number to add by 2
  206. 2020ASL &86
  207. 2030ROL &87
  208. 2040ROL &88
  209. 2050ROL &89
  210. 2060ROL &8A
  211. 2070\ check if the multiplier is zero
  212. 2080LDA &74
  213. 2090BNE multloop
  214. 2100RTS
  215. 2110\ routine to divide 5-byte number in &81 by 10
  216. 2115 .divforty
  217. 2120LDX #40 \ 40 bits
  218. 2130LDA #0
  219. 2140.divloop
  220. 2150ASL &81
  221. 2160ROL &82
  222. 2170ROL &83
  223. 2180ROL &84
  224. 2190ROL &85
  225. 2200ROL A
  226. 2210CMP #10
  227. 2220BCC divnobit
  228. 2230SBC #10
  229. 2240INC &81
  230. 2250.divnobit
  231. 2260DEX
  232. 2270BNE divloop
  233. 2280RTS
  234. 2290\ routine to print 5-byte number in &81. Uses &70-&7e as scratch space
  235. 2300\ corrupts number in &81
  236. 2310.printforty
  237. 2320\ generate 13 digits
  238. 2330 LDY #12
  239. 2335 .pfortyloop
  240. 2340 JSR divforty
  241. 2350\ remainder in a
  242. 2360CLC
  243. 2370ADC #ASC("0")
  244. 2380STA &70, Y
  245. 2390DEY
  246. 2400BPL pfortyloop
  247. 2410INY
  248. 2420.skiploop \ skip leading zeros
  249. 2430LDA &70, Y
  250. 2440CMP #ASC("0")
  251. 2450BNE doneskip
  252. 2460INY
  253. 2470CPY #12 \ leave at least one digit
  254. 2480BCC skiploop
  255. 2485.doneskip
  256. 2490.pdigitloop
  257. 2500LDA &70, Y
  258. 2510JSR &FFEE
  259. 2520INY
  260. 2530CPY #13
  261. 2540BCC pdigitloop
  262. 2550RTS
  263. 2560]
  264. 2570ENDPROC
  265.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement