Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 10progsize%=400
- 20DIM prog% progsize%
- 30datasize%=323*4
- 40DIM data% datasize%
- 50FOR O%=0 TO 3 STEP 3
- 60P%=prog%
- 70PROCprog
- 80IF P%-prog% > progsize% THEN ERROR 255, "Prog too big " + STR$(P%-prog%)
- 90NEXT
- 100CALL loaddata
- 105!&81 = 1
- 106?&85 = 0
- 110 PROCrun_path(3,1)
- 120PRINT "Part 1: "; !&81
- 130PROCrun_path(1,1)
- 140PROCrun_path(5,1)
- 150PROCrun_path(7,1)
- 160PROCrun_path(1,2)
- 170PRINT "Part 2: ";
- 175CALL printforty
- 178PRINT
- 180END
- 190DEF PROCrun_path(xstep%,ystep%)
- 200X%=xstep%
- 210Y%=ystep%
- 220CALL counttrees
- 230 LOCAL trees%
- 240trees%=!&74 AND &FFFF
- 250PRINT STR$(xstep%);",";STR$(ystep%);" trees=";STR$(trees%)
- 260CALL mult
- 265ENDPROC
- 270DEF PROCprog
- 280[OPT O%
- 290.loaddata
- 300LDA #&40 \ open file for input
- 310LDX #filename AND &FF
- 320LDY #filename DIV 256
- 330JSR &FFCE \ OSFIND
- 340ORA #0
- 350BNE gotfile
- 360BRK
- 370EQUB &FF
- 380EQUS "Error opening file"
- 390EQUB 13
- 400.gotfile
- 410TAY
- 420LDA #data% AND &FF
- 430STA &70
- 440LDA #data% DIV 256
- 450STA &71
- 460LDX #0
- 470.startbyte
- 480LDA #0
- 490STA (&70, X)
- 500LDA #1 \ bit
- 510STA &72
- 520.byteloop
- 530JSR &FFD7 \ OSBGET
- 540CMP #&FE
- 550BCS enddata
- 560JSR &FFEE \ OSWRCH
- 570CMP #10
- 580BNE notendline
- 590LDA #13
- 600JSR &FFEE \ OSWRCH
- 610JMP endbyte
- 620.notendline
- 630CMP #ASC("#")
- 640BNE nottree
- 650LDA (&70, X)
- 660ORA &72
- 670STA (&70, X)
- 680.nottree
- 690ASL &72
- 700BNE byteloop
- 710.endbyte
- 720CLC
- 730LDA &70
- 740ADC #1
- 750STA &70
- 760LDA &71
- 770ADC #0
- 780STA &71
- 790JMP startbyte
- 800.enddata
- 810LDA #0 \ close file
- 820JMP &FFCE \ OSFIND
- 830.counttrees
- 840\ set &70 to %data
- 850LDA #data% AND &FF
- 860STA &70
- 870LDA #data% DIV 256
- 880STA &71
- 890\ &72 will be the x-offset
- 900STX &72
- 910\ &76 will be the y-offset to add in bytes
- 920TYA
- 930ASL A:ASL A
- 940STA &76
- 950\ &73 is the bit to test
- 960LDA #1
- 970STA &73
- 980\ Y is the byte offset in the row
- 990LDY #0
- 1000\ &74,5 is the count of trees
- 1010STY &74
- 1020STY &75
- 1030.loop
- 1040\ move to the next line in the data
- 1050LDA &70
- 1060CLC
- 1070ADC &76
- 1080STA &70
- 1090LDA &71
- 1100ADC #0
- 1110STA &71
- 1120\ check if we've reached the end
- 1130CMP #(data% + datasize%) DIV 256
- 1140BCC notdataend
- 1150LDA &70
- 1160CMP #(data% + datasize%) AND &FF
- 1170BCS printresults
- 1180.notdataend
- 1190\ add horizontal offset
- 1200LDA &72
- 1210LSR A:LSR A:LSR A
- 1220STY &80
- 1230CLC
- 1240ADC &80
- 1250TAY
- 1260LDA &72
- 1270AND #7
- 1280TAX
- 1290.shiftloop
- 1300ASL &73
- 1310BNE notnextbyte
- 1320LDA #1
- 1330STA &73
- 1340INY
- 1350.notnextbyte
- 1360DEX
- 1370BNE shiftloop
- 1380\ check if we've gone off the end of the line
- 1390CPY #3
- 1400BCC notlineend
- 1410 BNE lineend
- 1420LDA &73
- 1430BPL notlineend \ line end when bit 7 set
- 1440.lineend
- 1450\ subtract 31 from the x-pos
- 1460DEY:DEY:DEY
- 1470LDX #7
- 1480 .subloop
- 1490LSR (&73)
- 1500BNE notsubbyte
- 1510DEY
- 1520LDA #&80
- 1530STA &73
- 1540.notsubbyte
- 1550DEX
- 1560BNE subloop
- 1570.notlineend
- 1580\ test whether there's a tree
- 1590LDA (&70), Y
- 1600AND &73
- 1610BEQ loop
- 1620\ add to the tree count
- 1630CLC
- 1640LDA &74
- 1650ADC #1
- 1660STA &74
- 1670LDA &75
- 1680ADC #0
- 1690STA &75
- 1700JMP loop
- 1710.printresults
- 1720RTS
- 1730.filename
- 1740EQUS "data"
- 1750EQUB 13
- 1770\ routine to multiply a 5-byte integer in &81 by an 8-bit number in &74 and store the result in &81
- 1780.mult
- 1790 \ number to add in &86, clear result in &81
- 1800 LDX #4
- 1810.copyloop
- 1820LDA &81, X
- 1830STA &86, X
- 1831 LDA #0
- 1832STA &81, X
- 1840DEX
- 1850BPL copyloop
- 1860 .multloop
- 1890LSR &74
- 1900\ add value if bit was set
- 1910BCC nomultadd
- 1920CLC
- 1930 LDX #&80 - 5
- 1940.multaddloop
- 1950 LDA &86 + 5 - &80, X
- 1960 ADC &81 + 5 - &80, X
- 1970 STA &81 + 5 - &80, X
- 1980 INX
- 1990BPL multaddloop
- 2000.nomultadd
- 2010\ multiply the number to add by 2
- 2020ASL &86
- 2030ROL &87
- 2040ROL &88
- 2050ROL &89
- 2060ROL &8A
- 2070\ check if the multiplier is zero
- 2080LDA &74
- 2090BNE multloop
- 2100RTS
- 2110\ routine to divide 5-byte number in &81 by 10
- 2115 .divforty
- 2120LDX #40 \ 40 bits
- 2130LDA #0
- 2140.divloop
- 2150ASL &81
- 2160ROL &82
- 2170ROL &83
- 2180ROL &84
- 2190ROL &85
- 2200ROL A
- 2210CMP #10
- 2220BCC divnobit
- 2230SBC #10
- 2240INC &81
- 2250.divnobit
- 2260DEX
- 2270BNE divloop
- 2280RTS
- 2290\ routine to print 5-byte number in &81. Uses &70-&7e as scratch space
- 2300\ corrupts number in &81
- 2310.printforty
- 2320\ generate 13 digits
- 2330 LDY #12
- 2335 .pfortyloop
- 2340 JSR divforty
- 2350\ remainder in a
- 2360CLC
- 2370ADC #ASC("0")
- 2380STA &70, Y
- 2390DEY
- 2400BPL pfortyloop
- 2410INY
- 2420.skiploop \ skip leading zeros
- 2430LDA &70, Y
- 2440CMP #ASC("0")
- 2450BNE doneskip
- 2460INY
- 2470CPY #12 \ leave at least one digit
- 2480BCC skiploop
- 2485.doneskip
- 2490.pdigitloop
- 2500LDA &70, Y
- 2510JSR &FFEE
- 2520INY
- 2530CPY #13
- 2540BCC pdigitloop
- 2550RTS
- 2560]
- 2570ENDPROC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement