0100 ; ***********************›0110 ; *    STARS 3D DEMO    *›0120 ; *  BY CRAIG PATCHETT  *›0130 ; ***********************›0140 ;›0150 ; System equates›0160 ;›0170 SDMCTL = $022F›0180 NMIEN = $D40E›0190 RANDOM = $D20A›0200 WSYNC = $D40A›0210 SDLSTL = $0230›0220 VDSLST = $0200›0230 COLPF0 = $D016›0240 COLOR4 = $02C8›0250 SETVBV = $E45C›0260 XITVBL = $E462›0270 ;›0280 ; Zero-page equate›0290 ;›0300 INDRCT = $CC    ; for indirect addressing›0310 ;›0320     *=  $3800›0330 ;›0340 ; Get things going›0350 ;›0360 INITIL›0370     JSR STRINI  ; set up stars›0380     JSR DLSINI  ; set up display list›0390     LDA #0      ; set background color›0400     STA COLOR4›0410     LDA #7      ; set up VBLANK›0420     LDX #VBLANK/256›0430     LDY #VBLANK&255›0440     JSR SETVBV›0450     LDA #DLI&255 ; get DLIs going›0460     STA VDSLST›0470     LDA #DLI/256›0480     STA VDSLST+1›0490     LDA #192›0500     STA NMIEN›0510 ALLDON›0520     JMP ALLDON  ; let things run›0530 ;›0540 ; VBLANK routine›0550 ;›0560 VBLANK›0570     JSR CNTDWN  ; take care of star movement›0580     LDA #0      ; reset index›0590     STA INDEX›0600     JMP XITVBL  ; back to system›0610 ;›0620 ; Initialize stars›0630 ;›0640 STRINI›0650     LDA #STRLIN&255 ; set up STRTPL/H arrays›0660     STA STRTPL›0670     LDA #STRLIN/256›0680     STA STRTPH›0690     LDX #0›0700     STX STRPOS›0710     INX ›0720 STRBR1›0730     LDA STRTPL-1,X ; make each address a screen›0740     CLC         ;    width more than the one›0750     ADC #48     ;    before›0760     STA STRTPL,X›0770     LDA STRTPH-1,X›0780     ADC #0›0790     STA STRTPH,X›0800     LDA #0›0810     STA STRPOS,X›0820     INX ›0830     CPX #16›0840     BNE STRBR1›0850     LDA #STRLIN&255 ; clear star memory›0860     STA INDRCT›0870     LDA #STRLIN/256›0880     STA INDRCT+1›0890     LDY #255›0900     LDX #3›0910     LDA #0›0920 STRBR2›0930     STA (INDRCT),Y›0940     DEY ›0950     CPY #255›0960     BNE STRBR2›0970     DEX ›0980     BEQ STRBR3›0990     INC INDRCT+1›1000     JMP STRBR2›1010 STRBR3›1020     LDX #0      ; give each line a star›1030 STRBR4›1040     LDA STRTPL,X›1050     STA INDRCT›1060     LDA STRTPH,X›1070     STA INDRCT+1›1080     LDA #64›1090     LDY #0›1100     STA (INDRCT),Y›1110     INX ›1120     CPX #16›1130     BNE STRBR4›1140     RTS ›1150 ;›1160 ; Initialize display list›1170 ;›1180 DLSINI›1190     LDA #DLIST&255 ; set up for indirect›1200     STA INDRCT  ;    addressing›1210     LDA #DLIST/256›1220     STA INDRCT+1›1230     LDA #0      ; get index ready›1240     STA INDEX›1250     LDY #3›1260 DLSBR4›1270     LDA #$CE    ; ANTIC 14, DLI, LMS line›1280     STA (INDRCT),Y›1290     INY ›1300     BNE DLSBR1›1310     INC INDRCT+1›1320 DLSBR1›1330     LDA RANDOM  ; pick star type›1340     AND #7›1350     PHA ›1360     TAX ›1370     LDA MANCOL,X ; tell STRCOL what color›1380     LDX INDEX   ; this line is›1390     STA STRCOL,X›1400     PLA ›1410     INC INDEX›1420     ASL A       ; times two so we skip over›1430     TAX         ; two screen widths...›1440 DLSBR2›1450     LDA RANDOM  ; pick random offset into›1460     AND #63     ;   line›1470     CMP #48     ; make sure it's less than›1480     BCS DLSBR2  ;   a screen width›1490     CLC ›1500     ADC STRTPL,X ; ...here instead of one›1510     STA (INDRCT),Y ; put it into display list›1520     INY ›1530     BNE DLSBR5›1540     INC INDRCT+1›1550 DLSBR5›1560     LDA STRTPH,X›1570     ADC #0›1580     STA (INDRCT),Y›1590     INY ›1600     BNE DLSBR6›1610     INC INDRCT+1›1620 DLSBR6›1630     CPY #67     ; 192 lines done, finish up›1640     BNE DLSBR4›1650     LDA #$41›1660     STA (INDRCT),Y›1670     INY ›1680     LDA #DLIST&255›1690     STA (INDRCT),Y›1700     STA SDLSTL›1710     INY ›1720     LDA #DLIST/256›1730     STA (INDRCT),Y›1740     STA SDLSTL+1›1750     LDA #$23    ; give us a wide screen›1760     STA SDMCTL›1770     RTS ›1780 ;›1790 ; Display list interrupt routine›1800 ;›1810 DLI›1820     LDX INDEX   ; what line are we on?›1830     LDA STRCOL,X ; load this line's color›1840     STA WSYNC   ; wait for end of last line›1850     STA COLPF0  ; store color›1860     INC INDEX   ; get ready for next line›1870     RTI ›1880 ;›1890 ; Timer routine›1900 ;›1910 CNTDWN›1920     LDX #13     ; move fastest star›1930     JSR SCROLL›1940     JSR SCROLL›1950     LDX #12     ; and its twin›1960     JSR SCROLL›1970     JSR SCROLL›1980 CNTBR1›1990     DEX         ; for the rest...›2000     BMI CNTRET›2010     DEC TIMER,X ; ...countdown timer›2020     BNE CNTBR1›2030     JSR SCROLL  ; scroll if ready›2040     LDA TIMARY,X ; and reset timer›2050     STA TIMER,X›2060     JMP CNTBR1›2070 CNTRET›2080     RTS ›2090 ;›2100 ; Star scroll routine›2110 ;›2120 SCROLL›2130     LDA STRTPL,X ; set up for indirect addressing›2140     STA INDRCT›2150     LDA STRTPH,X›2160     STA INDRCT+1›2170     LDY STRPOS,X ; get star position›2180     LDA (INDRCT),Y ; get byte with star in it›2190     ASL A       ; shift star left one›2200     ASL A›2210     STA (INDRCT),Y ; put it back›2220     BCC SCRBR1  ; did it fall off byte?›2230     LDA #1      ; if so, put it in next one›2240     DEY ›2250     CPY #255    ; did it fall off screen?›2260     BNE SCRBR2›2270     LDY #47     ; if so, put it on other end›2280 SCRBR2›2290     STA (INDRCT),Y›2300     TYA ›2310     STA STRPOS,X ; remember where it is now›2320 SCRBR1›2330     RTS ›2340 ;›2350 TIMER›2360     .BYTE 8,8,6,6,4,4 ; timers for scrolling›2370     .BYTE 3,3,2,2,1,1›2380 TIMARY›2390     .BYTE 8,8,6,6,4,4 ; values to reset timers›2400     .BYTE 3,3,2,2,1,1›2410 MANCOL›2420     .BYTE $22,$24,$26 ; star colors›2430     .BYTE $28,$2A,$2C›2440     .BYTE $2E,$22›2450 ;›2460 DLIST›2470     .BYTE $70,$70,$F0 ; display list›2480     *=  *+579›2490 STRLIN›2500     *=  *+768   ; star (screen) memory›2510 STRTPL›2520     *=  *+16    ; addresses of beginning of›2530 STRTPH›2540     *=  *+16    ; each star line›2550 STRPOS›2560     *=  *+16    ; position of star on line›2570 STRCOL›2580     *=  *+192   ; color of each line›2590 INDEX›2600     *=  *+1     ; used to index into STRCOL›