ORG $2000 MSB ON HP EQU $0300 ;HORIZONTAL POSITION VP EQU $0301 ;VERTICAL POSITION SL EQU $0302 ;SCORE LOW SH EQU $0303 ;SCORE HIGH R1 EQU $0304 ;RANDOM NUMBER SEEDS R2 EQU $0305 R3 EQU $0306 R4 EQU $0307 SPD EQU $0308 ;WAITING SPEED FRM EQU $0309 ;LINE FROM VALUE GT EQU $030A ;LINE GOTO VALUE RN3 EQU $030B ;RNADOM NUMBER FOR LINE POSITION RN4 EQU $030C ;RNADOM NUMBER FOR LINE DIRECTION LNP EQU $030D ;LINE NUMBER POSITION RN8 EQU $030E ;RANDOM NUMBER FOR 2000 CHANCE LP EQU $030F ;LINE LOCATION IN LOOP HSL EQU $0310 ;HIGH SCORE LOW HSH EQU $0311 ;HIGH SCORE HIGH AB3 EQU $0312 ;ABOVE 10,000? SDD EQU $0316 ;SCORE DECIMAL DIGITS JSR $FE93 ;40 COLUMN MODE LDA $4E ;SEED RANDOM NUMBER GENERATOR STA R1 STA R2 LDA $4F STA R3 STA R4 LDX #$FF ;HIDE SEED OUT OF RANDOM NUMBER RAN JSR RND DEX BNE RAN ;LOOP RANDOM NUMBER GENERATION JSR $FC58 LDA #$00 STA HSH STA HSL DMT LDA RLS,X BEQ DTR2 JSR $FDED INX JMP DMT DTR2 LDX #$00 DMT2 LDA RLS2,X BEQ VBGNP JSR $FDED INX JMP DMT2 VBGNP JSR PAUSE VBGN JSR $FC58 ;HOME LDA #$00 STA AB3 LDA #$AB ;PRINT BOX AROUND NUMBER STA $04B9 STA $04BD STA $06B9 STA $06BD LDA #$AD STA $04BA STA $04BB STA $04BC STA $06BA STA $06BB STA $06BC LDA #$FC STA $0539 STA $053D STA $05B9 STA $05BD STA $0639 STA $063D LDA #$DC STA $053A STA $063C LDA #$AF STA $053C STA $063A LDX #$03 ;COUNT DOWN FROM 3 CNTDN TXA CLC ADC #$B0 ;ADD B0 TO PRINT CHARACTER STA $05BB ;PRINT IN SCREEN CENTER JSR $FBDD ;BEEP LDY #$0A ;WAIT 10 10THS OF SECOND DLY LDA #$C3 ;10TH OF SECOND PARAMETER JSR $FCA8 ;WAIT SUBROUTINE DEY BNE DLY ;LOOP WAIT DEX BNE CNTDN ;LOOP COUNT DOWN JSR $FC58 ;HOME LDA #$FF ;SET WAIT SPEED STA SPD LDA #$14 ;SET START TO HORIZONTAL CENTER STA HP LDA #$0C ;SET START TO VERTICAL CENTER STA VP LDA #$00 ;SET SCORE TO 0 STA SL STA SH BGN LDY #$80 LPDY TYA PHA STA $C030 LPSND DEY BNE LPSND PLA TAY DEY BNE LPDY JSR RND AND #$03 ;GET RIGHTMOST TWO BITS FROM NUMBER STA RN4 CMP #$02 ;TEST IF PLOTING VERTICAL OR HORIZONTAL LINE BCC VLP ;BRANCH TO VERTICAL LINE PLOT HLP JSR GRN3 ;GET RANDOM NUMBER BETWEEN 0 AND 2 (3 POSITIONS) LDA HP CLC ADC RN3 CMP #$28 BCS HLP STA LNP ;SET LINE NUMBER POSITION JMP LPAD ;GOTO LINE POSITION ADDRESSES (FROM AND GOTO) VLP JSR GRN3 LDA VP CLC ADC RN3 CMP #$18 BCS VLP STA LNP LPAD LDA RN4 ;LOAD LINE DIRECTION AND TEST DIRECTION BEQ HLSL ;HORIZONTAL LINE STARTING LEFT CMP #$01 BEQ HLSR ;HORIZONTAL LINE STARTING RIGHT CMP #$02 BEQ VLSU ;VERTICAL LINE STARTING UP LDA #$17 ;VERTICAL LINE STARTING DOWN STA FRM ;STORE FROM LOCATION LDA #$00 STA GT ;STORE GOTO LOCATION JMP LP3 ;JUMP TO LINE PLOT 10000 SCORE TEST VLSU LDA #$00 STA FRM LDA #$17 STA GT JMP LP3 HLSR LDA #$27 STA FRM LDA #$00 STA GT JMP LP3 HLSL LDA #$00 STA FRM LDA #$27 STA GT LP3 LDA FRM STA LP LDX #$09 LDY #$C4 ;INCREASE SPEED IF SCORE ABOVE 2500 JSR ISAV BCC SKSI LDX SPD CPX #$01 BEQ SKSI DEX STX SPD ;INCREATING SPEED SKSI LDX #$27 LDY #$10 JSR ISAV ;TEST IF WHOLE SCORE IF OVER 10000 (BB8) BCC LLP LDA #$01 STA AB3 LDA RN4 ;LOAD LINE DIRECTION LSR LSR ;PUT IF VERTICAL LINE IN CARRY BCC NVL3 ;BRANCH IF NOT VERTICAL LINE LDA #$00 STA $25 LDA LNP STA $24 JSR $FC22 ;SET VTAB AND HTAB POSITIONS LDA #$AA JSR $FDED ;PLOT ENDPOINTS OF LINE LDA #$17 STA $25 LDA LNP STA $24 JSR $FC22 LDA #$AA JSR $FDED JMP LLP NVL3 LDA LNP STA $25 LDA #$00 STA $24 JSR $FC22 LDA #$AA JSR $FDED LDA LNP STA $25 LDA #$27 STA $24 JSR $FC22 LDA #$AA JSR $FDED ;ENDPOINT '*' CHARACTER LLP LDA HP STA $24 LDA VP STA $25 JSR $FC22 LDA #$A0 ;ERACE OLD POSITION JSR $FDED LDA $C000 ;GET KEY INPUT STA $C010 ;CLEAR KEYBOARD CMP #$80 BCC NKP ;BRANCH IF NO KEY PRESS CMP #$A0 BNE DNPP JSR PAUSE ;PAUSE IF SPACEBAR PRESSED DNPP CMP #$FF ;END IF DELETE PRESSED BNE DNTND JSR $FC58 DKPJ JMP DMS DNTND CMP #$8B ;TEST IF UP KEY PRESSED BEQ UKP CMP #$D7 BEQ UKP CMP #$F7 BEQ UKP CMP #$88 ;TEST IF LEFT KEY PRESSED BEQ LKP CMP #$C1 BEQ LKP CMP #$E1 BEQ LKP CMP #$8A ;TEST IF DOWN KEY PRESSED BEQ DKP CMP #$D3 BEQ DKP CMP #$F3 BEQ DKP CMP #$95 ;TEST IF RIGHT KEY PRESSED BEQ RKP CMP #$C4 BEQ RKP CMP #$E4 BEQ RKP JMP NKP ;BRANCH IF NO OTHER KEY PRESSED UKP LDY VP ;LOAD AND SHIFT VERTICAL POSITION DEY CPY #$FF ;TEST IF ON EDGE BNE UKO ;BRANCH TO SAVE POSITION INY ;IF ON EDGE DON'T SHIFT UKO STY VP JMP NKP ;JUMP TO ERACE OLD POSITION LKP LDY HP DEY CPY #$FF BNE LKO INY LKO STY HP JMP NKP DKP LDY VP INY CPY #$18 BNE DKO DEY DKO STY VP JMP NKP RKP LDY HP INY CPY #$28 BNE RKO DEY RKO STY HP NKP LDX #$18 LDA RN4 LSR LSR BCC CVPOL ;VERTICAL OR HORIZONTAL LINE LDA HP ;TEST IF OVER LINE CMP LNP BEQ ANTS JMP NOL CVPOL LDA VP CMP LNP BNE NOL ANTS JSR INSC DEX BNE ANTS ;ADD 24 TO SCORE STA $C030 NOL JSR INSC ;ADD 1 TO SCORE LDA #$00 STA $24 STA $25 JSR $FC22 JSR DS ;PRINT SCORE LDX #$EA LDY #$60 JSR ISAV BCC DNWG JMP YWTG DNWG LDA AB3 BNE NA3T ;IF ABOVE 10000 DISPLAY NOTHING LDA RN4 LSR LSR BCS DLWV LDA LP STA $24 LDA LNP STA $25 JMP DLP DLWV LDA LP STA $25 LDA LNP STA $24 DLP JSR $FC22 LDA #$AA JSR $FDED ;DISPLAY LINE NA3T LDY LP JSR AIDY LDX #$13 LDY #$88 JSR ISAV BCC DALL ;IF BELOW 5000 DISPLAY ALL JSR RND AND #$0F BNE SKDA ;SKIP POSITION 15/16 CHANCE DALL LDA HP STA $24 LDA VP STA $25 JSR $FC22 LDA #$CF JSR $FDED ;PRINT 'O' FOR POSITION SKDA LDY SPD SDWLP LDA #$05 JSR $FCA8 DEY BNE SDWLP ;TIME DELAY LDX LP CPX GT BEQ LPE ;BRANCH IF LINE FINISHED LDA RN4 LSR BCC LPS DEX CPX #$FF BNE LP1 LPS INX LP1 STX LP ;MOVE LINE POINTER JMP LLP LPE LDA RN4 LSR LSR BCS ELU1 LDA LNP STA $25 LDA FRM STA $24 JMP DLEC ELU1 LDA LNP STA $24 LDA FRM STA $25 DLEC JSR $FC22 ;ERACE LINE WITH SPACE LDA #$A0 JSR $FDED LDA #$25 JSR $FCA8 ;SLOW DOWN ERACE LDY FRM JSR AIDY ;TEST IF DIE LDX FRM CPX GT BEQ SKTB ;TEST IF DONE ERACEING LDA RN4 LSR BCC LPS2 DEX CPX #$FF BNE LP2 LPS2 INX LP2 STX FRM ;INCREASE ERCE POINTER JMP LPE SKTB JMP BGN RND ROR R4 ;EOR SHIFT RANDOM NUMBER GENERATOR ROUTINE LDA R3 STA R4 LDA R2 STA R3 LDA R1 STA R2 LDA R4 ROR ROL R1 EOR R1 ROR R4 ROR R3 ROR R2 ROR STA R1 RTS GRN3 JSR RND ;GET RANDOM NUMBER AND #$03 ;GET RIGHTMOST TWO BITS BEQ STV ;CHANCE 1/2 ON SIDES VS CENTER SEC SBC #$02 ;SHIFT 3 VALUES TO -1,0,+1 STV STA RN3 RTS INSC LDY SL ;INCRAMENT SCORE INY BNE DISH ;TEST IF HIGH BIT ROLE OVER LDY SH INY STY SH ;INCRAMENT HIGH BIT LDY #$00 DISH STY SL RTS ISAV CPX SH ;TEST SCORE VALUE BCC RTCS BNE RTCC CPY SL BCC RTCS RTCC CLC RTS RTCS SEC RTS AIDY LDA RN4 ;TEST IF DIE LSR LSR BCC UVI1 CPY VP ;COMPARE X&Y W/ LINE BNE ROK1 ;BRANCH ALIVE LDY LNP CPY HP BNE ROK1 JMP RNOK ;BRANCH DEAD UVI1 CPY HP BNE ROK1 LDY LNP CPY VP BNE ROK1 JMP RNOK ROK1 RTS RNOK PLA ;POP STACK PLA JSR $FC58 LDA #$60 TTP LDX #$06 STA $C030 ;LOW LOOSE TONE DTX LDY #$FF DTY DEY BNE DTY DEX BNE DTX CMP #$00 BEQ DMS SEC SBC #$01 JMP TTP DMS LDX HSH LDY HSL JSR ISAV BCC DMS2 LDA SH STA HSH LDA SL STA HSL DMS2 LDX #$00 LDSV1 LDA PYS,X BEQ DDS1 JSR $FDED INX JMP LDSV1 DDS1 JSR DS ;DISPLAY SCORE LDX #$00 LDSV2 LDA PHS,X BEQ DDS2 JSR $FDED INX JMP LDSV2 DDS2 LDA HSH STA SH LDA HSL STA SL JSR DS LDX #$00 KDT LDA PTXT,X ;PLAY AGAIN? BEQ DDT JSR $FDED INX JMP KDT DDT STA $C010 ;YES OR NO? KWFK2 LDA $C000 CMP #$80 BCC KWFK2 STA $C010 CMP #$D9 BEQ GTVB CMP #$F9 BEQ GTVB CMP #$CE BEQ EDP CMP #$EE BEQ EDP JMP DDT GTVB JMP VBGN ;AGAIN EDP JSR $FC58 ;END RTS DS LDA SH ;DISPLAY SCORE ROUTINE PHA LDA SL STA SH PLA STA SL PHA LDA SH PHA LDX #$00 L3 LDY #$10 LDA #$00 CLC L4 ROL CMP #$0A BCC SKP SBC #$0A SKP ROL SH ROL SL DEY BPL L4 STA SDD,X INX CPX #$05 BNE L3 LDX #$04 L1 LDA SDD,X BNE L2 DEX BNE L1 L2 LDA SDD,X ORA #$B0 JSR $FDED DEX BPL L2 PLA STA SL PLA STA SH RTS PAUSE STA $C010 ;PAUSE ROUTINE PHA KWFK LDA $C000 CMP #$80 ;WAIT FOR KEY PRESS BCC KWFK STA $C010 PLA RTS YWTG JSR $FC58 ;WINNING GAME LDX #$00 KDT2 LDA PTWG,X BEQ DDT2 JSR $FDED INX JMP KDT2 DDT2 JSR $FBDD ;TRIPPLE BEEP JSR $FBDD JSR $FBDD RTS PTXT DFB 141 ASC "Play Again (Y/N)?" DFB 00 PTWG ASC "You won the Game!!!" DFB 00 RLS ASC "Move with arrow keys or WASD" DFB 141 ASC "Line attacks from side of screen" DFB 141 ASC " Given by zing sound" DFB 141 ASC "On line's path (danger)=+25 pts/cycle" DFB 141 ASC " Given by buzzing" DFB 141 ASC "Not on line's path (safe)=+1 pt/cycle" DFB 141 ASC "Die if..." DFB 141 ASC " Hit by line front" DFB 141 ASC " Caught by line recoil" DFB 141 DFB 00 RLS2 ASC "Keys" DFB 141 ASC " Space is pause" DFB 141 ASC " Delete is end" DFB 141 ASC "After __ pts..." DFB 141 ASC " 2,500-Lines speed up slowly" DFB 141 ASC " 5,000-Your dot displayed randomly" DFB 141 ASC " 10,000-Only line endpoints displayed" DFB 00 PYS ASC "Your score:" DFB 00 PHS DFB 141 ASC "High score:" DFB 00