*** VORTEX *** * BY WALID MAALOULI * * MARCH 2018 * * FOR MINI MEMORY MODULE * ************************** DEF VORTEX PROGRAM ENTRY POINT AORG >7118 START OF MINI MEMORY USER RAM VORTEX LWPI >8338 SET UP WORKSPACE IN RAM PAD *** SET UP BITMAP MODE *** LI R0,>07F1 SET BACKGROUND TO BLACK BLWP @>6034 LI R0,>0207 SIT @ >1C00 BLWP @>6034 LI R0,>0403 PDT @ 0 BLWP @>6034 LI R0,>03FF CT @ >2000 BLWP @>6034 LI R0,>053E SAL @ >1F00 BLWP @>6034 LI R0,>0603 SDT @ >1800 BLWP @>6034 LI R0,>1F00 POINT TO SAL LI R1,>D000 DISABLE SPRITES BLWP @>6024 LI R0,>1C00 POINT TO SIT CLR R1 LI R2,3 3 SECTIONS TO SIT E1 BLWP @>6024 PLACE HIGH BYTE OF R1 INTO SIT INC R0 NEXT SIT BYTE LOCATION AI R1,>100 INCREMENT HIGH BYTE OF R1 JNE E1 R1 WILL GO FROM 0 TO FF DEC R2 REPEAT X2 JNE E1 LI R0,>2000 POINT TO CT LI R1,>F100 WHITE OF BLACK LI R2,>1800 LENGTH OF CT E2 BLWP @>6024 WRITE COLOR BYTE INC R0 NEXT CT LOCATION DEC R2 JNE E2 CLR R0 POINT TO PDT CLR R1 LI R2,>1800 LENGTH OF PDT E3 BLWP @>6024 CLEAR BYTE IN PDT INC R0 NEXT PDT LOCATION DEC R2 JNE E3 LI R0,2 SELECT VR0 AND VALUE 2 BLWP @>6034 START BITMAP MODE *** DISPLAY TITLE SCREEN *** CLR R6 LI R7,1 SET TO DRAW DA MOV @TL(R6),@>8300 LOAD X1 INCT R6 MOV @TL(R6),@>8302 LOAD Y1 INCT R6 MOV @TL(R6),@>8304 LOAD X2 INCT R6 MOV @TL(R6),@>8306 LOAD Y2 INCT R6 BL @LD DRAW SEGMENT CI R6,160 CHECK IF AT END OF DATA JLT DA TA BL @KI WAIT FOR KEY PRESS MOV @>8310,R1 CHECK KEY FLAG CI R1,0 JEQ TA CLR R0 CLEAR SCREEN CLR R1 LI R2,>0C00 ES BLWP @>6024 INC R0 DEC R2 JNE ES *** SELECT KEYBOARD *** CLR R0 MOVB R0,@>8374 *** LOAD KILL ROUTINE DATA INTO CPU RAM *** CLR R6 T2 MOV @K(R6),@>8314(R6) INCT R6 CI R6,20 JLE T2 *** DRAW VORTEX *** IN CLR @>830C CURRENT VORTEX SEGMENT OFFSET LI R7,1 SET TO DRAW CLR R8 LI R6,V POINT TO FIRST COORDINATE NX BL @LS SET UP LINE SEGMENT BL @LD DRAW SEGMENT DECT R6 POINT TO NEXT SEGMENT INC R8 CI R8,8 CHECK IF OUTER VORTEX IS DRAWN JNE NO INCT R6 POINT TO INNER VORTEX DATA NO CI R8,12 CHECK IF AT DATA END JLT NX CLR R6 SET UP GUN DATA OFFSET MOV R6,@>830E SAVE GUN OFFSET C7 LI R7,1 SET TO DRAW BL @DG DISPLAY GUN BL @SR DISPLAY REMAINING LASER SHOTS BL @GD DISPLAY GAME LEVEL *** ROTATE VORTEX *** RV INC @>8312 INCREMENT VORTEX ROTATION COUNTER MOV @>8312,R1 C R1,@SP CHECK IF COUNTER MATCHES ROTATION TIMER JLT C8 CLR @>8312 RESET ROTATION COUNTER MOV @>830C,R6 RETRIEVE CURRENT VORTEX SEGMENT OFFSET AI R6,V POINT TO VORTEX DATA LI R7,1 SET TO DRAW BL @LS SET UP LINE SEGMENT BL @LD DRAW SEGMENT BL @RN GET RANDOM NUMBER MOV @>83C0,R1 RETRIEVE RANDOM SEED SLA R1,8 CI R1,>0F00 JLT CC MOV @>830C,R1 RETRIEVE CURRENT SEGMENT OFFSET (CLOCKWISE TURN) CI R1,14 JNE C1 CLR @>830C RESET OFFSET IF POINTING TO LAST SEGMENT JMP EX C1 INCT @>830C POINT TO NEXT SEGMENT JMP EX CC MOV @>830C,R1 RETRIEVE CURRENT SEGMENT OFFSET (COUNTERCLOCKWISE TURN) CI R1,0 JNE C2 LI R1,14 POINT TO LAST SEGMENT IF POINTING TO FIRST FIRST ONE MOV R1,@>830C JMP EX C2 DECT @>830C POINT TO PREVIOUS SEGMENT EX CLR R7 SET TO ERASE MOV @>830C,R6 AI R6,V POINT TO SEGMENT BL @LS BL @LD ERASE SEGMENT *** PLAYER INPUT *** C8 BL @KI CHECK FOR KEY INPUT MOV @>8310,R1 LOAD KEY FLAG INTO R1 CI R1,0 JEQ RV NO KEY DETECTED LI R1,100 A R1,@>8312 INCREMENT VORTEX ROTATION COUNTER BY 100 CLR R7 SET TO ERASE LI R1,8 MOV @>830E,R6 RESTORE GUN PATTERN OFFSET S R1,R6 POINT TO PREVIOUS PATTERN BL @DG DRAW GUN MOVB @>8375,R8 CHECK WHICH KEY IS PRESSED LI R9,>4400 D PRESSED? CB R8,R9 JNE LT MOV @>830E,R6 RETRIEVE CURRENT GUN OFFSET CI R6,64 CHECK IF AT LAST OFFSET JNE C7 DRAW GUN IF NOT CLR R6 RESET OFFSET TO BEGINNING MOV R6,@>830E SAVE OFFSET B @C7 DRAW GUN LT LI R9,>5300 S PRESSED? CB R8,R9 JNE FR NOT S OR D PRESSED - FIRE GUN MOV @>830E,R6 RETRIEVE GUN OFFSET CI R6,8 CHECK IF AT BEGINNING JNE C4 LI R6,56 SET OFFSET TO LAST VALUE MOV R6,@>830E SAVE OFFSET B @C7 DRAW GUN C4 LI R1,16 S R1,R6 POINT TO PREVIOUS GUN OFFSET MOV R6,@>830E SAVE OFFSET B @C7 DRAW GUN *** SET UP GUN FIRE *** FR MOV @>830E,R6 RETRIEVE GUN PATTERN OFFSET LI R1,8 S R1,R6 POINT TO PREVIOUS PATTERN LI R7,1 SET TO DRAW BL @DG DISPLAY GUN LI R1,S1 FIRE SOUND TABLE ADDRESS LI R2,20 LENGTH OF TABLE BL @SN PLAY SOUND LI R1,8 S R1,R6 POINT TO PREVIOUS PATTERN MOVB @P(R6),R0 X VALUE SRL R0,8 INC R6 MOVB @P(R6),R1 Y VALUE SRL R1,8 DEC R6 SRL R6,3 DIVIDE R6 BY 8 SLA R6,2 MULTIPLY BY 4 MOV @F(R6),@>8308 DX INCT R6 MOV @F(R6),@>830A DY BL @MP ANIMATE PROJECTILE LI R1,S2 POINT TO COLLISION SOUND TABLE LI R2,7 LENGTH OF TABLE BL @SN PLAY SOUND DEC @LN DECREASE NUMBER OF LASER SHOTS BY 1 BL @SR UPDATE LASER SHOTS DISPLAY MOV @>832A,R1 RETRIEVE X MOV @>832C,R2 RETRIEVE Y CI R1,111 CHECK COLLISION BOUNDARIES JLT NH CI R1,143 JGT NH CI R2,115 JGT NH CI R2,83 JLT NH KL B @KV KILL ROUTINE NH MOV @LN,R1 CI R1,0 JNE D1 B @GO GAME OVER ROUTINE D1 B @RV *** DISPLAY GUN ROUTINE *** * R6 = PATTERN OFFSET - STORED IN >830E * R7: 0 = ERASE, 1 = DRAW * X1 = >8300, Y1 = >8302, X2 = >8304, Y2 = >8306 DG MOV R11,R10 SAVE RETURN ADDRESS LI R8,3 NS MOVB @P(R6),R1 LOAD X1 SRL R1,8 MOV R1,@>8300 INC R6 MOVB @P(R6),R1 LOAD Y1 SRL R1,8 MOV R1,@>8302 INC R6 MOVB @P(R6),R1 LOAD X2 SRL R1,8 MOV R1,@>8304 INC R6 MOVB @P(R6),R1 LOAD Y2 SRL R1,8 MOV R1,@>8306 BL @LD DRAW SEGMENT DEC R6 DEC R8 JNE NS REPEAT X3 INCT R6 SET OFFSET TO BEGINNING OF NEXT GUN PATTERN MOV R6,@>830E SAVE OFFSET MOV R10,R11 B *R11 *** KEY INPUT ROUTINE *** KI MOV R11,R10 SAVE RETURN ADDRESS BLWP @>6020 CALL KSCAN MOVB @>837C,R1 SAVE GPL STATUS BYTE LI R2,>2000 BIT 2 MASK COC R2,R1 IS BIT 2 SET? JNE C5 SETO @>8310 SET KEY FLAG IF YES JMP C6 C5 CLR @>8310 CLEAR KEY FLAG IN NO C6 MOV R10,R11 B *R11 *** PIXEL PLOT ROUTINE *** PP MOV R11,R9 SAVE RETURN ADDRESS MOV R1,R4 SLA R4,5 SOC R1,R4 ANDI R4,>FF07 MOV R0,R5 ANDI R5,7 R5 IS BIT OFFSET A R0,R4 R4 IS BYTE OFFSET S R5,R4 MOV R4,R0 BLWP @>602C CLR R2 MOVB @M(R5),R2 R2 IS BIT MASK MOV R2,R3 CLR R4 MOVB R1,R4 CLR @>8334 CLEAR COLLISION FLAG SZCB R4,R3 ISOLATE BIT CI R3,0 IF R3 IS CLEARED THEN BIT WAS SET JEQ CL JMP DN CL INC @>8334 SET COLLISION FLAG DN CI R7,0 R7=0 ERASE, R7=1 DRAW JNE SE SZCB R2,R1 MASK AND CLEAR BIT JMP CO SE SOCB R2,R1 MASK AND SET BIT CO BLWP @>6024 WRITE BYTE BACK MOV R9,R11 B *R11 *** LINE DRAWING ROUTINE *** LD MOV R11,R12 SAVE RETURN ADDRESS C @>8300,@>8304 JEQ $+24 X1=X2? JGT $+12 X1>X2? LI R2,1 X18308 JMP $+16 LI R2,-1 MOV R2,@>8308 JMP $+6 CLR @>8308 C @>8302,@>8306 JEQ $+24 Y1=Y2? JGT $+12 Y1>Y2? LI R2,1 Y1830A JMP $+16 LI R2,-1 MOV R2,@>830A JMP $+6 CLR @>830A MOV @>8300,R0 MOV @>8302,R1 BL @PP PLOT POINT A @>8308,@>8300 A @>830A,@>8302 C @>8300,@>8304 JNE $-30 X18302,@>8306 JNE $-38 Y18304,R0 MOV @>8306,R1 BL @PP PLOT LAST POINT MOV R12,R11 B *R11 *** RANDOM NUMBER ROUTINE *** * >83C0 WILL HAVE THE RANDOM NUMBER GENERATED RN MOV R11,R10 SAVE RETURN ADDRESS LI R4,>6FE5 MPY @>83C0,R4 AI R5,>7AB9 MOV R5,@>83C0 MOV R10,R11 B *R11 *** LINE SEGMENT SETUP ROUTINE *** LS MOV R11,R10 SAVE RETURN ADDRESS CLR @>8300 MOVB *R6+,@>8300 LOAD X1 SWPB @>8300 CLR @>8302 MOVB *R6+,@>8302 LOAD Y1 SWPB @>8302 CLR @>8304 MOVB *R6+,@>8304 LOAD X2 SWPB @>8304 CLR @>8306 MOVB *R6+,@>8306 LOAD Y2 SWPB @>8306 MOV R10,R11 B *R11 *** ANIMATE GUN PROJECTILE ROUTINE *** MP MOV R11,R10 SAVE RETURN ADDRESS MOV R0,@>832A SAVE X MOV R1,@>832C SAVE Y NC A @>8308,R0 ADD X OFFSET A @>830A,R1 ADD Y OFFSET MOV R0,@>832A SAVE X MOV R1,@>832C SAVE Y LI R7,1 SET TO DRAW BL @PP DISPLAY SLUG LI R0,250 DELAY LOOP DY DEC R0 JNE DY MOV @>8334,R12 GET COLLISION FLAG CI R12,0 JNE C9 COLLISION DETECTED. EXIT CLR R7 SET TO ERASE MOV @>832A,R0 GET X MOV @>832C,R1 GET Y BL @PP ERASE SLUG MOV @>832A,R0 MOV @>832C,R1 JMP NC KEEP GOING C9 MOV R10,R11 B *R11 *** KILL ROUTINE *** KV CLR R6 LOAD INITIAL COORDINATES DATA FROM STORAGE T3 MOV @>8314(R6),@K(R6) INCT R6 CI R6,20 JLT T3 T4 CLR R6 LI R7,1 SET TO DRAW LI R8,4 T1 MOV @K(R6),@>8300 LOAD X1 INCT R6 POINT TO NEXT DATA ITEM MOV @K(R6),@>8302 LOAD Y1 INCT R6 MOV @K(R6),@>8304 LOAD X2 INCT R6 MOV @K(R6),@>8306 LOAD Y2 DECT R6 BL @LD DRAW SEGMENT DEC R8 JNE T1 REPEAT UNTIL SQUARE DRAWN CLR R6 INCREASE SIZE OF SQUARE DECT @K(R6) INCT R6 DECT @K(R6) INCT R6 INCT @K(R6) INCT R6 DECT @K(R6) INCT R6 INCT @K(R6) INCT R6 INCT @K(R6) INCT R6 DECT @K(R6) INCT R6 INCT @K(R6) INCT R6 DECT @K(R6) INCT R6 DECT @K(R6) MOV @K(R6),R1 CI R1,55 CHECK IF LARGEST SQUARE SIZE REACHED JGT T4 LI R1,S3 POINT TO CORE EXPLOSION SOUND TABLE LI R2,19 LENGTH OF TABLE BL @SN PLAY SOUND LP LI R1,-30 A R1,@SP DECREASE VORTEX ROTATION TIMER (NEXT LEVEL) INC @GL INCREMENT GAME LEVEL COUNTER D3 LI R1,5 MOV R1,@LN RESET LASER SHOTS TO 5 CLR R0 CLEAR SCREEN CLR R1 LI R2,>1800 BS BLWP @>6024 INC R0 DEC R2 JNE BS B @IN *** DISPLAY LASER SHOTS REMAINING *** SR MOV R11,R10 SAVE RETURN ADDRESS LI R1,1 MOV R1,@>8328 CLR R8 LI R7,1 SET TO DRAW MOV @LN,R1 CI R1,0 JNE T8 CLR R7 SET TO ERASE T8 CLR R6 T5 MOV @LC(R6),@>8300 X1 A R8,@>8300 ADD HORIZONTAL SHIFT INCT R6 MOV @LC(R6),@>8302 Y1 INCT R6 MOV @LC(R6),@>8304 X2 A R8,@>8304 ADD HORIZONTAL SHIFT INCT R6 MOV @LC(R6),@>8306 Y2 BL @LD DRAW SEGMENT CI R6,14 JEQ T9 DECT R6 JMP T5 T9 INC @>8328 MOV @>8328,R1 CI R1,6 JEQ T6 C @>8328,@LN JLE T7 CLR R7 SET TO ERASE T7 AI R8,10 INCREASE HORIZONTAL SHIFT JMP T8 DRAW NEXT FIGURE T6 MOV R10,R11 B *R11 *** GAME OVER ROUTINE *** GO MOV @>830E,R6 RETRIEVE GUN PATTERN OFFSET LI R1,8 S R1,R6 POINT TO LAST PATTERN CLR R7 SET TO ERASE BL @DG ERASE GUN LI R1,S4 POINT TO EXPLOSION SOUND TABLE LI R2,7 LENGTH OF TABLE BL @SN PLAY SOUND LI R7,1 SET TO DRAW LI R1,8 MOV @>830E,R6 S R1,R6 POINT TO LAST PATTERN CLR R8 MOVB @P(R6),R8 GET X FOR TOP VERTEX SWPB R8 INC R6 CLR R10 MOVB @P(R6),R10 GET Y FOR TOP VERTEX SWPB R10 CLR R6 D2 MOV @X(R6),@>8300 X1 A R8,@>8300 ADD X OFFSET INCT R6 MOV @X(R6),@>8302 Y1 A R10,@>8302 ADD Y OFFSET INCT R6 MOV @X(R6),@>8304 X2 A R8,@>8304 INCT R6 MOV @X(R6),@>8306 Y2 A R10,@>8306 BL @LD DRAW SEGMENT INCT R6 CI R6,64 JNE D2 D4 BL @KI WAIT FOR KEY INPUT MOV @>8310,R1 CI R1,0 JEQ D4 LI R1,300 MOV R1,@SP RESET VORTEX ROTATION SPEED TIMER LI R1,1 MOV R1,@GL SET GAME LEVEL TO 1 B @D3 *** GAME LEVEL DISPLAY *** GD MOV R11,R10 SAVE RETURN ADDRESS LI R7,1 SET TO DRAW CLR @>8328 INC @>8328 LEVEL COUNTER CLR R8 Y OFFSET CLR R6 D5 MOV @L(R6),@>8300 X1 INCT R6 MOV @L(R6),@>8302 Y1 A R8,@>8302 ADD Y OFFSET INCT R6 MOV @L(R6),@>8304 X2 INCT R6 MOV @L(R6),@>8306 Y2 A R8,@>8306 ADD Y OFFSET BL @LD DRAW SEGMENT INCT R6 CI R6,32 JNE D5 INC @>8328 C @>8328,@GL CHECK IF GAME LEVEL REACHED JGT D6 AI R8,10 INCREASE VERTICAL SHIFT CLR R6 JMP D5 DRAW NEXT LEVEL INDICATOR D6 MOV R10,R11 B *R11 *** SOUND PLAYER ROUTINE *** * R1 HAS ADDRESS OF SOUND TABLE IN RAM * R2 HAS LENGTH OF TABLE SN MOV R11,R10 SAVE RETURN ADDRESS LI R0,>1F04 ADDRESS OF VDP SOUND BUFFER BLWP @>6028 COPY SOUND TABLE TO VDP BUFFER LI R3,>1F04 POINT TO SOUND TABLE ADDRESS MOV R3,@>83CC LOAD POINTER SOCB @B1,@>83FD SET VDP SOUND TABLE FLAG MOVB @B1,@>83CE START SOUND PROCESSING LIMI 2 ENABLE INTERRUPTS LO MOVB @>83CE,@>83CE WAIT FOR SOUND PLAYBACK TO BE DONE JNE LO LIMI 0 DISABLE INTERRUPTS MOV R10,R11 B *R11 *** DATA SECTION *** M DATA >8040,>2010 BIT MASKING DATA DATA >0804,>0201 P DATA >7FB2,>77BA GUN COORDINATES (XXYY) DATA >87BA,>7FB2 DATA >479B,>3C9B DATA >47A6,>479B DATA >2F63,>275B DATA >276B,>2F63 DATA >462A,>461F DATA >3B2A,>462A DATA >7E13,>860B DATA >760B,>7E13 DATA >B82A,>C32A DATA >B81F,>B82A DATA >CE63,>D66B DATA >D65B,>CE63 DATA >B79B,>B7A6 DATA >C29B,>B79B V DATA >6D8B,>5775 VORTEX AND CORE COORDINATES (XXYY) DATA >5751,>6D3B DATA >913B,>A751 DATA >A775,>918B DATA >6D8B,>7F73 DATA >6F63,>7F53 DATA >8F63,>7F73 F DATA 0,-1,1,-1 GUN FIRE ANIMATION X Y OFFSETS DATA 1,0,1,1 DATA 0,1,-1,1 DATA -1,0,-1,-1 K DATA 126,98,128,98 CORE EXPLOSION COORDINATES X Y DATA 128,100,126,100 DATA 126,98 SP DATA 300 VORTEX ROTATION TIMER GL DATA 1 GAME LEVEL LN DATA 5 REMAINING LASER SHOTS LC DATA 5,2,8,5,2,5,5,2 REMAINING LASER SHOTS INDICATOR COORDINATES X Y X DATA 5,5,0,0,5,5,5,0 SHIP EXPLOSION RELATIVE COORDINATES X Y DATA 5,5,10,0,5,5,10,5 DATA 5,5,10,10,5,5,5,10 DATA 5,5,0,10,5,5,0,5 L DATA 247,2,250,5 GAME LEVEL INDICATOR COORDINATES X Y DATA 250,5,247,5 DATA 247,5,247,2 DATA 247,5,247,8 B1 BYTE >01 S1 BYTE >03,>88,>02,>90,>01 FIRE SOUND BYTE >02,>80,>05,>01 BYTE >02,>84,>0B,>01 BYTE >02,>81,>28,>01 BYTE >01,>9F,>00 S2 BYTE >02,>E6,>F0,>0A COLLISION SOUND BYTE >01,>FF,>00 S3 BYTE >02,>E6,>F0,>21 CORE EXPLOSION SOUNDS BYTE >02,>E6,>F2,>21 BYTE >02,>E6,>F4,>21 BYTE >02,>E6,>F6,>39 BYTE >01,>FF,>00 S4 BYTE >02,>E6,>F0,>21 SHIP EXPLOSION SOUND BYTE >01,>FF,>00 TL DATA 20,40,60,80,60,80,100,40,100,40,188,40 TITLE COORDINATES X Y DATA 85,80,85,60,85,60,105,60,105,60,105,80,105,80,85,80 DATA 113,80,113,60,113,60,133,60,133,60,133,72,133,72,113,72,133,80,125,72 DATA 141,60,161,60,151,80,151,60 DATA 169,80,169,60,169,60,189,60,169,70,181,70,169,80,189,80 DATA 196,40,236,80,196,80,236,40 END VORTEX ******************************************************** * CPU PAD RAM USAGE * * 8300 X1 * 8302 Y1 * 8304 X2 * 8306 Y2 * 8308 DX * 830A DY * 830C CURRENT VORTEX SEGMENT OFFSET * 830E GUN PATTERN OFFSET * 8310 KEY DETECTED FLAG * 8312 VORTEX ROTATION COUNTER * 8314 - 8326 KILL SQUARE COORDINATES * 8328 LASER SHOTS DISPLAY COUNTER * 832A LASER SHOT X * 832C LASER SHOT Y * 8334 COLLISION FLAG * 8338 START OF WORKSPACE REGISTERS