; =========================== ; LIVEWIRE ; =========================== ; =========================== ; WRITTEN BY: TOM HUORG *+ON ; A.N.A.L.O.G. COMPUTING #12 ; =========================== ; --------------- ; PAGE ZERO USAGE ; --------------- Org $80 LO Org *+1 HI Org *+1 PLOTX Org *+1 ;PLOT X VALUE PLOTY Org *+1 ;PLOT Y VALUE COLOR Org *+1 ;PLOT COLOR DRAWX ORG *+1 ;DRAWTO X DRAWY ORG *+1 ;DRAWTO Y ACCX Org *+1 ;X ACCUM. ACCY Org *+1 ;Y ACCUM. DELTAX Org *+1 ;DRAW WORK AREA DELTAY Org *+1 ;DRAW WORK AREA INCX Org *+1 ;DRAW X INCREMENT INCY Org *+1 ;DRAW Y INCREMENT COUNTR ORG *+1 ;DRAWTO COUNTER ENDPT ORG *+1 ;DRAW ENDPOINT HOLD Org *+1 ;WORK AREA XWORK ORG *+1 YWORK ORG *+1 GRID ORG *+1 ;GRID # WORK OFFSET ORG *+1 ;GRID OFFSET PMTIME Org *+1 ;PLAYER MOVE TIMER PLRGRD Org *+1 ;PLAYER GRID# PLRY ORG *+1 ;PLAYER Y POS. GRIDNO ORG *+1 ;GRID # LAST Org *+1 ;GRID... NEXT ORG *+1 ;DIVIDE... STEP ORG *+1 ;WORK... DEST ORG *+1 ;AREAS VBXHLD ORG *+1 ;X HOLD PFTIME Org *+1 ;PLAYER FIRE TIMER ENDVAL ORG *+1 ;WORK AREA MISNUM Org *+1 ;MISSILE # PRFLIP Org *+1 ;PROJ. FLIP FLAG PRADVT ORG *+1 ;PROJ. MOVE TIMER PRADV1 ORG *+1 ;PROJ. TIMER TIMER ORG *+1 ;GENERAL TIMER INTRFG ORG *+1 ;INTRO FLAG BCDLVL Org *+1 ;LEVEL # SHCOLR ORG *+1 ;CHAR. COLOR SHOBYT ORG *+1 ;CHAR. BYTE POS. YOFSET ORG *+1 ;PLOT Y OFFSET OBTIM1 ORG *+1 ;OBJECT MOVE TIMER OBJNUM Org *+1 ;OBJECT # SHAPIX Org *+1 ;OBJ. SHAPE INDEX LENGTH Org *+1 ;OBJ. LENGTH XI Org *+1 ;OBJ. X INCREMENT YI Org *+1 ;OBJ. Y INCREMENT SHAPCT Org *+1 ;OBJ. SHAPE CNT. HLDGRD Org *+1 ;OBJ. GRID WORK PAUFLG Org *+1 ;PAUSE FLAG ZAP Org *+1 ;ZAP FLAG SAVEX Org *+1 ;WORK AREA SAVEY Org *+1 ;WORK AREA FLASHY Org *+1 ;OBJ. FLASH POS. FLTIME Org *+1 ;FLASH TIME SP1IX Org *+1 ;PLAYER... SP2IX Org *+1 ;SHAPE... SP3IX Org *+1 ;INDEX... SPIX Org *+1 ;AREAS PLTBYT Org *+1 ;PLYR. IMAGE BYTE PSCNT Org *+1 ;PLYR. SHAPE COUNT KILPLR Org *+1 ;KILL PLYR FLAG PAVAIL Org *+1 ;# PROJ. AVAILABLE TRANTM Org *+1 ;TRANSIENT TIMER DESTLO Org *+1 ;DESTINATION... DESTHI Org *+1 ;ADDRESS SHFLIP Org *+1 ;SHORT FLIP FLAG DESTNM Org *+1 ;SHORT PLYR # CPYST Org *+1 ;SHORT IMAGE START DMAC1 Org *+1 ;DMA CTRL WORK GRAC1 Org *+1 ;GRAPHICS CTRL WK. GRIDIX Org *+1 ;GRID INDEX LIVES Org *+1 ;LIVES LEFT GRDADJ Org *+1 ;GRID... GRDWK Org *+1 ;DRAW... GRDWK2 Org *+1 ;WORK... GRDNUM Org *+1 ;AREAS OBJSPD Org *+1 ;OBJ. SPEED JOYPAD Org *+1 ;STICK/PADDLE CPYCNT Org *+1 ;SHORT COPY CNT. BONUS Org *+1 ;BONUS VALUE FIRSOU Org *+1 ;FIRE SOUND COUNT OBDSOU Org *+1 ;OBJ. DEATH SOUND MOVSOU Org *+1 ;PLYR MOVE SOUND PRYHLD Org *+4 ;PROJ. Y HOLDS SCORE Org *+3 ;SCORE SCOADD Org *+3 ;SCORE ADD VALUE MISCAD Org *+1 ;MISC. SCORE ADD NUMOBJ Org *+5 ;OBJECTS LEFT DIFF Org *+1 ;DIFFICULTY ADJUST OBJPRS Org *+6 ;OBJ PRESENT FLAGS ; -------------------- ; MISCELLANEOUS MEMORY ; -------------------- PMAREA = $0000 ;P/M AREA MISSLS = PMAREA+768 PL0 = PMAREA+1024 PL1 = PMAREA+1280 PL2 = PMAREA+1536 PL3 = PMAREA+1792 DISP = $0800 ;DISPLAY ; -------------- ; SYSTEM EQUATES ; -------------- VDSLST = $200 ;DLI VECTOR WSYNC = $D40A ;WAIT/SYNC PTRIG0 = $27C ;PADDLE TRIG. POT0 = $270 ;PADDLE 0 KEY = $2FC ;KEYBOARD CONSOL = $D01F ;CONSOLE BUTTONS PMBASE = $D407 ;P/M BASE ADDR RANDOM_ = $D20A ;RANDOM # SETVBV = $E45C ;VBLANK SET XITVBV = $E462 ;VBLANK EXIT COLBK = $2C8 ;COLORS COLPF0 = $2C4 COLPF1 = $2C5 COLPF2 = $2C6 COLPF3 = $2C7 AUDC1 = $D201 ;AUDIO CONTROL AUDC2 = $D203 AUDC3 = $D205 AUDC4 = $D207 AUDF1 = $D200 ;AUDIO FREQUENCY AUDF2 = $D202 AUDF3 = $D204 AUDF4 = $D206 AUDCTL = $D208 ;MAIN AUDIO CTRL. PRIOR = $026F ;PRIORITY ATTRAC = $4D ;ATTRACT MODE DMACTL = $22F ;DMA CONTROL DLISTL = $230 ;DISP. LIST GRACTL = $D01D ;GRAPHICS CTRL. NMIEN = $D40E ;INTERRUPT ENABLE COLPM0 = $2C0 ;PLAYER COLORS COLPM1 = $2C1 COLPM2 = $2C2 COLPM3 = $2C3 HPOSP0 = $D000 ;PLAYER POSITIONS HPOSP1 = $D001 HPOSP2 = $D002 HPOSP3 = $D003 HPOSM0 = $D004 ;MISSILE POSITIONS HITCLR = $D01E ;COLLISION CLEAR P0PL = $D00C ;PL0 TO PLAYER COLL. STICK = $278 ;JOYSTICK STRIG = $284 ;STICK TRIGGER ORG $2000 ; ---------------------- ; MAIN GAME DISPLAY LIST ; ---------------------- DLIST DB $70,$F0,$70,$4E DW DISP DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E DB $4E DW DISP+$800 DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E,$E DB $E,$E,$E,$E,$E,$E,$E DB $80,$00 DB $47 DW INFOLN DB $41 DW DLIST ; ------------------------- ; TITLE SCREEN DISPLAY LIST ; ------------------------- TITLDL DB $70,$70,$70,$70,$70,$70 DB $70,$47 DW LASTSC DB $70,$70,$46 DW MAGMSG DB $70,$47 DW TITLE DB $30,$46 DW AUTHOR DB $70,$70,$30,$46 CONTRL DW JOYMSG DB $41 DW TITLDL ; ----------------------- ; DISPLAY LIST INTERRUPTS ; ----------------------- DLI1 PHA ;SAVE ACCUM LDA GRAC1 ;GET GR. CTRL STA WSYNC ;WAIT FOR SYNC STA GRACTL ;STORE IT LDA DMAC1 ;GET AND SAVE STA $D400 ;DMA CTRL LDA DLI2 ;NEXT... STA VDSLST+1 ;DLI! PLA ;GET ACCUM RTI ;AND EXIT! DLI2 PHA ;SAVE ACCUM LDA #$0A ;GET WHITE STA WSYNC ;WAIT FOR SYNC STA $D016 ;PUT IN COLOR 0 LDA #$74 ;PUT BLUE... STA $D017 ;IN COLOR 1 LDA #$28 ;PUT ORANGE... STA $D018 ;IN COLOR 2 LDA #$3D ;SET UP... STA $D400 ;DMA CTRL PLA ;GET ACCUM. RTI ;AND EXIT ; --------------- ; SCREEN MESSAGES ; --------------- INFOLN DB 0,0,0,0,0,0,0,0 DB 0,0,$6C,$76,$6C,0,0,0 MAGMSG DB $21,$2E,$21,$2C,$2F,$27 DB 0,$23,$2F,$2D,$30,$35 DB $34,$29,$2E,$27 TITLE DB 0,0,0,0,$6C,$69,$76,$65 DB $77,$69,$72,$65,0,0,0,0 AUTHOR DB 0,$A2,$B9,0,0,$B4,$AF DB $AD,0,$A8,$B5,$A4,$B3 DB $AF,$AE,0 JOYMSG DB 0,0,0,0,$EA,$EF,$F9,$F3 DB $F4,$E9,$E3,$EB,0,0,0,0 PADMSG DB 0,0,0,0,0,$F0,$E1,$E4 DB $E4,$EC,$E5,0,0,0,0,0 LASTSC DB 0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0 ; ---------- ; PROG START ; ---------- LIVE CLD JSR $E465 ;INIT SOUND LDA #0 ;CLEAR PAGE 0 LDX #127 CPAGE0 STA $80,X DEX BPL CPAGE0 LDA #1 ;INIT... STA BCDLVL ;LEVEL # STA INTRFG ;SET INTRO FLAG LDA JOYMSG ;IS... STA CONTRL+1 ;STICK! LDA #0 ;INIT... STA DMACTL ;DMA STA NMIEN ;INTERRUPTS STA AUDCTL ;AUDIO STA HITCLR ;COLLISION STA COLBK ;BACKGND COLOR LDX #3 ;CLEAR SHORTS CLRSHO STA SHORTF,X DEX BPL CLRSHO LDX #5 ;ZERO OBJECT... CLRDED STA OBDEAD,X ;CLR DEAD TABLE DEX BPL CLRDED LDX #2 ;ZERO SCORE CLRSCO STA SCORE,X STA SCOADD,X DEX BPL CLRSCO LDX #7 CLRPRJ STA PROJAC,X ;CLEAR PROJ. DEX BPL CLRPRJ LDX #5 MOVSCO LDA INFOLN,X ;COPY SCORE... STA LASTSC+5,X ;TO LAST... DEX ;SCORE LINE BPL MOVSCO LDA #29 ;SET ALL... LDX #5 ;OBJECTS TO... INIOBS STA OBJSEG,X ;SEGMENT # 29 DEX BPL INIOBS JSR SHOSCO ;SHOW SCORE JSR SNDOFF ;NO SOUNDS LDA #6 ;6 PROJECTILES STA PAVAIL ;AVAILABLE LDA #2 ;SET... STA BONUS ;BONUS=20000 STA LIVES ;2 EXTRA LIVES JSR SHOLIV ;SHOW LIVES LEFT LDA #5 ;SET UP... STA SP2IX ;PLAYER... LDA #10 ;SHAPE... STA SP3IX ;INDEXES LDA TITLDL ;DISPLAY... STA DLISTL+1 ;LIST LDY VBI ;VERTICAL... LDA #7 ;BLANK... JSR SETVBV ;INTERRUPT LDA >PMAREA ;SET UP P/M... STA PMBASE ;BASE ADDRESS JSR PMCLR ;CLEAR P/M LDA #$74 ;PUT BLUE... STA COLPF0 ;IN COLOR 0 LDA #$C4 ;PUT GREEN... STA COLPF1 ;IN COLOR 1 LDA #$0A ;PUT WHITE... STA COLPF2 ;IN COLOR 2 LDA #$34 ;PUT RED... STA COLPF3 ;IN COLOR 3 LDA #$3D ;SET UP... STA DMACTL ;DMA, LDA #3 ;GRAPHICS, STA GRACTL ;AND LDA #$C0 ;INTERRUPT... STA NMIEN ;ENABLE LDA #$11 ;SET P/M... STA PRIOR ;PRIORITY LDA #$0F ;PUT WHITE... STA COLPM1 ;IN PLAYER 1, STA COLPM2 ;PLAYER 2 STA COLPM3 ;AND 3 LDA #$16 ;PUT YELLOW... STA COLPM0 ;IN PLAYER 0 ; ------------ ; INTRO SCREEN ; ------------ INTRO LDA CONSOL ;START KEY... AND #1 ;PRESSED? BNE CKSEL ;NO! GOCHEK LDA CONSOL ;START KEY... AND #1 ;RELEASED? BEQ GOCHEK ;NO, WAIT. JMP DIGIN ;GO DIG IN!! CKSEL LDA CONSOL ;SELECT KEY... AND #2 ;PRESSED? BNE INTRO ;NAW, LOOP BACK. LDA JOYPAD ;TOGGLE... CLC ;STICK/PADDLE... ADC #1 ;INDICATOR... AND #1 STA JOYPAD TAX LDA JPLO,X ;AND SHOW... STA CONTRL ;CONTROLLER... LDA JPHI,X ;MESSAGE... STA CONTRL+1 ;ON SCREEN! LDA #30 ;30 JIFFY... JSR WAIT ;WAIT! JMP INTRO ;AND LOOP. ; --------------------------- ; HERE'S WHERE PROGRAM STARTS ; --------------------------- DIGIN LDA DLIST ;DISPLAY... STA DLISTL+1 ;LIST LDA #0 ;NO LONGER IN... STA INTRFG ;INTRO FOREVR LDA #1 ;WE WANT... STA COLOR ;COLOR 1 STA ZAP ;RESET ZAP. JSR CLRSC ;CLEAR SCREEN LDA GRIDIX ;GET GRID# AND #7 ;FIND WHICH... TAX ;GRID SHAPE... LDA GRDTBL,X ;TO DRAW... STA GRDNUM ;AND STORE JSR SHOLVL ;SHOW LEVEL# JSR DRGRID ;DRAW GRID! CONWT LDA PAUFLG ;WE PAUSED? BNE CONWT ;YUP, LOOP. LDA KILPLR ;PLAYER DEAD? BEQ PLIVE ;NOPE! JSR DECLIV ;ONE LESS LIFE! PLIVE STA ATTRAC ;CANCEL ATTRACT! LDA FLTIME ;FLASH GOING? BNE NOFEND ;YES! STORE... STA HPOSP1 ;FLASH POSITION! NOFEND LDA OBTIM1 ;OBJECTS MOVING? BNE NOOHAN ;NOT YET! LDA OBJSPD ;RESET MOVE... STA OBTIM1 ;TIMER ; ---------------------- ; COPY OBJECT KILL TABLE ; ---------------------- LDX #5 ;THIS SECTION COPDED LDA OBDEAD,X ;COPIES THE STA OBDED2,X ;OBJECT KILL LDA #0 ;TABLE WHICH IS STA OBDEAD,X ;SET UP BY THE DEX ;PROJECTILE BPL COPDED ;HANDLER LDA MISCAD ;MISC.SCORE? BEQ NOMSCO ;NO! STA SCOADD+1 ;SET SCORE ADD... JSR ADDSCO ;AND ADD IT! LDA #0 ;THEN RESET THE STA MISCAD ;ADD VALUE. NOMSCO LDX #5 ;THIS SECTION LDA #0 ;TALLIES ALL CKOBLV ORA OBJPRS,X ;OBJECTS THAT DEX ;ARE ALIVE BPL CKOBLV LDX #4 ;NOW TALLY CKOBWT ORA NUMOBJ,X ;ALL OBJECTS DEX ;THAT ARE NOT BPL CKOBWT ;ON GRID YET CMP #0 ;ANY OBJECTS? BEQ LVLEND ;NO, END OF LEVEL! LDX #5 ;IS OBJECT GENNOL LDA OBJPRS,X ;PRESENT? BNE NXTOGN ;YES, TRY NEXT. TRYTYP LDA RANDOM_ ;LET'S TRY TO AND #7 ;START UP A CMP #5 ;NEW OBJECT BCS TRYTYP ;GET A TYPE TAY ;ANY OF THAT LDA NUMOBJ,Y ;TYPE WAITING? BEQ NXTOGN ;NO, TRY NEXT SEC ;DECREMENT # SBC #1 ;OF OBJECTS STA NUMOBJ,Y ;WAITING. TYA ;THEN SET STA OBJTYP,X ;OBJECT TYPE. NEWGRD LDA RANDOM_ ;GET A RANDOM AND #$0F ;SUB-GRID CMP #15 ;NUMBER BEQ NEWGRD STA OBJGRD,X ;AND SAVE IT LDA #30 ;PUT OBJECT AT STA OBJSEG,X ;FAR END OF GRID LDA #1 ;SET UP... STA OBJINC,X ;OBJ. INCREMENT STA OBJPRS,X ;OBJECT PRESENT NXTOGN DEX ;LOOP BACK TO DO BPL GENNOL ;NEXT OBJECT JSR OBJHAN ;HANDLE OBJECTS JSR SHOHAN ;HANDLE SHORTS NOOHAN LDA CONSOL ;ANY CONSOLE CMP #7 ;KEYS PRESSED? BEQ JCONWT ;NOPE! JMP LIVE ;YES, RESTART GAME JCONWT JMP CONWT ;INDIRECT JUMP LVLEND LDA GRIDIX ;ARE WE ON CMP #63 ;GRID #63? BEQ NOGRDI ;YES, DON'T INC! CLC ;INCREMENT ADC #1 ;GRID # STA GRIDIX ;AND SAVE IT. AND #7 ;ADD 2 TO BNE NODIFI ;DIFFICULTY IF INC DIFF ;ON A MULTIPLE INC DIFF ;OF 8 GRIDS. NODIFI SED ;INCREMENT LDA BCDLVL ;BCD LEVEL # CLC ADC #1 STA BCDLVL CLD ;NOW GO TO NOGRDI JMP FOREVR ;DRAW NEW GRID. ; -------------- ; OBJECT HANDLER ; -------------- OBJHAN LDA OBJNUM ;INCREMENT CLC ;OBJECT # ADC #1 CMP #6 ;DONE? BNE STONUM ;NO, CONTINUE. LDA #$FF ;RESET STA OBJNUM ;OBJECT # RTS ;AND EXIT. STONUM STA OBJNUM ;SAVE OBJ # OBHLP1 LDX OBJNUM ;GET OBJ # LDA OBJPRS,X ;OBJ PRESENT? BEQ OBJHAN ;NO! OBLIVE LDA OBJSEG,X ;WITHIN 2 UNITS CMP #2 ;OF RIM? BCC NOOBFI ;YES, DON'T FIRE LDA RANDOM_ ;RANDOM CHANCE AND #$0F ;OF SHOOTING BNE NOOBFI ;DON'T SHOOT LDA PROJAC ;PROJ. 0 ACTIVE? BNE TRYPR1 ;YES, IGNORE! LDY #0 ;FORCE BRANCH BEQ STOBFI ;TO STORE IT TRYPR1 LDA PROJAC+1 ;PROJ. 1 ACTIVE? BNE NOOBFI ;YES, NO FIRE LDY #1 ;SET INDEX STOBFI LDA OBJSEG,X ;INITIALIZE LSR A ;PROJECTILE STA PROJSG,Y ;SEGMENT # LDA OBJGRD,X ;AND STA PROGRD,Y ;SUB-GRID # ASL A ;MULTIPLY ASL A ;BY ASL A ;16 ASL A ;AND STA PROJGN,Y ;SAVE INDEX! LDA #$FF ;SET INCREMENT STA PROINC,Y ;(TOWARD RIM) LDA #21 ;START THE STA FIRSOU ;FIRE SOUND LDA #1 ;AND STA PROJAC,Y ;PROJECTILE NOOBFI LDA #0 ;SET COLOR 0 STA COLOR ;TO ERASE OBJECT JSR DRWOBJ ;AND ERASE IT LDX OBJNUM LDA OBDED2,X ;OBJ DEAD? BEQ NOOKIL ;YES! START JSR FLASH ;DEATH FLASH LDX OBJNUM LDY OBJTYP,X ;GET OBJECT TYPE LDA POINT1,Y ;GET POINTS STA SCOADD+1 ;AND READY LDA POINT2,Y ;THE SCORE STA SCOADD+2 ;ADD VALUE JSR ADDSCO ;ADD TO SCORE! LDX OBJNUM JMP KILOBJ ;THEN KILL OBJ. NOOKIL LDA OBJSEG,X ;INCREMENT SEC ;OBJECT'S SBC OBJINC,X ;SEGMENT STA OBJSEG,X ;POSITION BMI KILOBJ ;PAST RIM! CMP #30 ;TYPE 3 PAST END? BNE NOTOT3 ;NOPE! INC NUMOBJ+2 ;START TYPE 2 BNE KILOBJ ;FORCE BRANCH NOTOT3 CMP #10 ;AT TYPE 3 TURN? BNE OBHLP2 ;NO! LDA OBJTYP,X ;IS IT CMP #3 ;TYPE 3? BNE OBHLP2 ;NO! LDA #$FF ;REVERSE OBJECT STA OBJINC,X ;INCREMENT OBHLP2 LDA OBJTYP,X ;IS OBJECT CMP #2 ;TYPE 2? BNE SETHUE ;NO, SET COLOR LDA RANDOM_ ;GET RANDOM AND #1 ;DIRECTION TAY ;FOR TYPE 2 LDA OBJGRD,X ;AND CLC ;ADD OR ADC ADDSB1,Y ;SUBTRACT 1 CMP #15 ;PAST LIMIT? BCS SETHUE ;YES! STA OBJGRD,X ;SAVE NEW POS. SETHUE LDA OBJTYP,X ;GET OBJ. TYPE TAX ;AND GET LDA OBJHUE,X ;COLOR # STA COLOR ;SAVE IT JSR DRWOBJ ;AND DRAW OBJECT! JMP OBJHAN ;DO NEXT ONE KILOBJ LDA #0 ;OBJECT IS NO STA OBJPRS,X ;LONGER ALIVE LDA #21 ;SET UP STA OBDSOU ;DEATH SOUND LDA OBJSEG,X ;CHECK BPL JOBHAN ;FOR A LDA OBJGRD,X ;COLLISION CMP PLRGRD ;WITH PLAYER BNE CKSHOR ;NO HIT LDA #1 ;HIT, STA KILPLR ;KILL PLAYER! BNE JOBHAN ;NEXT OBJECT CKSHOR LDA OBJTYP,X ;OBJECT CMP #1 ;TYPE 1? BNE JOBHAN ;NOPE! LDY #3 ;TRY SHORT: TRYSHO LDA SHORTF,Y ;SHORT AVAILABLE? BEQ INISHO ;YUP! DEY ;KEEP... BPL TRYSHO ;TRYING! BMI JOBHAN ;NO SHORT AVAIL! INISHO LDA OBJGRD,X ;MULTIPLY THE ASL A ;OBJECT'S ASL A ;SUB-GRID # ASL A ;BY 16... ASL A CLC ADC #8 ;AND ADD 8 FOR STA SHORTX,Y ;THE SHORT INDEX LDA #1 ;SHORT IS STA SHORTF,Y ;ALIVE! LDA RANDOM_ ;RANDOMIZE... AND #1 ;SHORT... STA SHORTD,Y ;DIRECTION LDA RANDOM_ ;AND THAT... AND #$3F ;DIRECTION'S... STA SHORTT,Y ;TIME! JOBHAN JMP OBJHAN ;NEXT OBJECT DRWOBJ LDX OBJNUM ;GET OBJECT # LDA OBJGRD,X ;GET SUB-GRID # ASL A ;MULTIPLY ASL A ;BY 16... ASL A ASL A STA HLDGRD ;AND SAVE. LDA OBJSEG,X ;DIVIDE LSR A ;SEGMENT BY 2 BCS ODDSEG ;PROCESS ODD # CLC ;IT'S EVEN, ADD ADC HLDGRD ;GRID INDEX TAY ;PUT IN Y REG. LDA SEGX,Y ;GET OBJECT'S STA PLOTX ;X POSITION STA SAVEX ;AND SAVE LDA SEGY,Y ;GET OBJECT'S STA PLOTY ;Y POSITION STA SAVEY ;AND SAVE JMP ODDSKP ;SKIP ODD ROUTINE ODDSEG CLC ;IT'S ODD, ADD ADC HLDGRD ;GRID INDEX TAY ;PUT IN Y REG. LDA SEGX,Y ;GET OBJECT'S CLC ;X POS, ADD ADC SEGX+1,Y ;NEXT X POS. ROR A ;GET AVERAGE STA PLOTX ;PUT IN PLOT X STA SAVEX ;AND SAVE LDA SEGY,Y ;GET OBJECT'S CLC ;Y POS, ADD ADC SEGY+1,Y ;NEXT Y POS. ROR A ;GET AVERAGE STA PLOTY ;PUT IN PLOT Y STA SAVEY ;AND SAVE ODDSKP LDA #30 ;NOW CALCULATE SEC ;THE OBJECT'S SBC OBJSEG,X ;SIZE BASED ON LSR A ;ITS POSITION AND #$FE ;ON THE GRID ASL A ASL A TAY ;PUT INDEX IN Y LDX #0 ;NOW COPY PART COPYSZ LDA SIZTBL,Y ;OF THE SIZE STA SIZEWK,X ;TABLE TO A INY ;SIZE WORK AREA INX ;THIS TABLE HOLDS CPX #8 ;8 SIZE VALUES BNE COPYSZ ;BASED ON DIST. LDX OBJNUM ;GET OBJECT # LDA OBJTYP,X ;AND ITS TYPE ASL A ;AND MULTIPLY ASL A ;BY 8 FOR AN ASL A ;INDEX INTO STA SHAPIX ;THE SHAPE TABLE LDA #8 ;MAX 8 LINES IN STA SHAPCT ;EACH OBJECT DOBLP LDX SHAPIX ;GET LINE# LDA OBJDIR,X ;& ITS DIRECTION TAY ;A NEGATIVE # BMI ENDOBJ ;INDICATES END LDA PXINC,Y ;GET X INCREMENT STA XI ;OF LINE, LDA PYINC,Y ;Y INCREMENT STA YI ;OF LINE, LDA OBJLEN,X ;ABSOLUTE LENGTH TAY ;OF LINE THEN LDA SIZEWK,Y ;SCALED LENGTH STA LENGTH ;AND STORE! PLOTOB LDA PLOTX ;THIS SECTION CLC ;ADJUSTS THE ADC XI ;X AND Y PLOT STA PLOTX ;VALUES... LDA PLOTY CLC ADC YI STA PLOTY LDA SHAPIX ;DON'T PLOT BEQ NOPLT1 ;FIRST LINE! JSR PLOTCL ;PLOT POINT NOPLT1 LDA PLOTY ;INCREMENT Y CLC ;AGAIN TO ADJUST ADC YI ;FOR GR. 7+ STA PLOTY ;ASPECT RATIO LDA SHAPIX ;DON'T PLOT BEQ NOPLT2 ;FIRST LINE JSR PLOTCL ;PLOT POINT NOPLT2 DEC LENGTH ;END OF LINE? BPL PLOTOB ;NOPE! INC SHAPIX ;NEXT LINE DEC SHAPCT ;LAST LINE? BNE DOBLP ;NOT YET! ENDOBJ RTS ;ALL DONE! ; ------------- ; SHORT HANDLER ; ------------- SHOHAN LDX #3 ;MAX. 4 SHORTS SHHANL LDA SHORTF,X ;SHORT ALIVE? BEQ HANNXS ;NO, DO NEXT LDY SHORTD,X ;GET SHORT DIR. LDA SHORTX,X ;GET X POS. CLC ;AND ADJUST ADC ADDSUB,Y ;POSITION CMP #240 ;ON GRID? BCS RESSHD ;NO! DON'T MOVE STA SHORTX,X ;OK, SAVE POS. DEC SHORTT,X ;DIRECTION CHANGE? BPL HANNXS ;NO! RESSHD LDA RANDOM_ ;GET A RANDOM AND #$3F ;DIRECTION TIME STA SHORTT,X ;0-63 & SAVE AND #1 ;RANDOM DIRECTION STA SHORTD,X ;0-1 & SAVE HANNXS DEX ;MORE SHORTS? BPL SHHANL ;YUP! RTS ;ALL DONE! ; ------------ ; ADD TO SCORE ; ------------ ADDSCO LDY #0 ;GET ZERO SED ;SET DECIMAL MODE LDA SCORE+2 ;THIS SECTION CLC ;INCREMENTS ADC SCOADD+2 ;THE 3-DIGIT STA SCORE+2 ;SCORE USING STY SCOADD+2 ;THE 3-DIGIT LDA SCORE+1 ;SCORE ADD ADC SCOADD+1 ;AREA, THEN STA SCORE+1 ;ZEROS OUT STY SCOADD+1 ;THE LDA SCORE ;SCORE ADD ADC SCOADD ;AREA USING STA SCORE ;THE STY SCOADD ;Y REGISTER. CLD ;CLR DECIMAL MODE JSR SHOSCO ;SHOW SCORE LDA SCORE ;IS SCORE AT CMP BONUS ;BONUS LEVEL? BNE NOBONS ;SORRY! JSR INCLIV ;BONUS, ADD LIFE! SED ;SET DECIMAL LDA BONUS ;GET OLD BONUS CLC ;ADD 20000 ADC #2 ;TO IT CLD ;CLR DECIMAL STA BONUS ;AND SAVE BONUS NOBONS RTS ;FINIS! ; ---------- ; SHOW SCORE ; ---------- SHOSCO LDA #$10 ;SET UP COLOR STA SHCOLR ;BYTE FOR SHOW LDX #0 ;ZERO X LDY #0 ;& Y REGS SSCOLP LDA SCORE,Y ;GET SCORE BYTE JSR SHOBCD ;SHOW IT INX ;INCREMENT SHOW INX ;POS. BY 2 INY ;NEXT SCORE BYTE CPY #3 ;DONE? BNE SSCOLP ;NOT YET! RTS ;ALL DONE! ; --------------- ; INCREMENT LIVES ; --------------- INCLIV LDA LIVES ;DO WE HAVE CMP #5 ;5 LIVES NOW? BEQ NOMOLV ;YUP, NO INC! INC LIVES ;ONE MORE LIFE JSR SHOLIV ;SHOW IT NOMOLV RTS ;AND EXIT! ; --------------- ; DECREMENT LIVES ; --------------- DECLIV JSR SNDOFF ;NO SOUND ; --------------------------- ; WAIT FOR PROJECTILES TO END ; --------------------------- WAITPD LDX #7 ;8 PROJECTILES LDA #0 ;ZERO TALLY CKPRLV ORA PROJAC,X ;CHECK ALL DEX ;PROJECTILES BNE CKPRLV ;FOR ACTIVITY CMP #0 ;ANY ACTIVE? BNE WAITPD ;YES! WAIT MORE! ; ----------- ; STOP SHORTS ; ----------- LDX #3 ;4 SHORTS (0-3) STPSHO STA SHORTF,X ;TURN OFF DEX ;ALL OF 'EM BPL STPSHO ;LOOP UNTIL DONE ; -------------------------- ; PUT OBJECTS AT END OF GRID ; -------------------------- LDA #0 ;ERASE STA COLOR ;COLOR LDA #5 ;ERASE ALL 6 STA OBJNUM ;OBJECTS ERSOBJ JSR DRWOBJ ;ERASE IT! LDX OBJNUM ;GET OBJECT # LDA #30 ;PLACE AT STA OBJSEG,X ;SEG #30 LDA #1 ;SET UP MOVE STA OBJINC,X ;INCREMENT RNDOBG LDA RANDOM_ ;GET RANDOM AND #$0F ;SUB-GRID # CMP #$0F ;0-14 BEQ RNDOBG STA OBJGRD,X DEC OBJNUM ;MORE OBJECTS? BPL ERSOBJ ;YEAH, DO 'EM LDA #$0F ;SHOW PLAYER STA COLPM0 ;DEATH HERE STA AUDC1 ;START SOUND MOREWT LDA RANDOM_ ;SET RANDOM AND #$1F ;DEATH SOUND STA AUDF1 ;FREQUENCY LDA #6 ;WAIT 0.1 SEC JSR WAIT DEC COLPM0 ;DEC BRIGHTNESS LDA COLPM0 ;NOW SET STA AUDC1 ;DEATH VOLUME BNE MOREWT ;MORE WAIT LDA LIVES ;MORE LIVES? BEQ DEAD ;NO MORE LIFE! DEC LIVES ;ONE LESS LIFE JSR SHOLIV ;SHOW IT LDA #60 ;WAIT 1 SEC JSR WAIT LDA #0 ;RESET PLAYER STA KILPLR ;KILL FLAG LDA #$16 ;AND STA COLPM0 ;PLAYER COLOR RTS ;AND EXIT! DEAD PLA ;ALL DEAD, PULL PLA ;RETURN ADDR. JMP LIVE ;AND RESTART GAME ; ---------- ; SHOW LIVES ; ---------- SHOLIV LDA #$90 ;SELECT DISPLAY STA SHCOLR ;COLOR LDA LIVES ;GET LIVES LDX #7 ;7TH CHAR ON LINE JSR SHOBCD ;SHOW IT! RTS ;AND EXIT ; ---------- ; SHOW LEVEL ; ---------- SHOLVL LDY #$50 ;SELECT DISPLAY STY SHCOLR ;COLOR LDA BCDLVL ;GET LEVEL# LDX #14 ;14TH CHAR ; ---------------- ; BCD CHAR DISPLAY ; ---------------- SHOBCD STA SHOBYT ;SAVE CHARACTER AND #$0F ;GET NUM 1 ORA SHCOLR ;ADD COLOR STA INFOLN+1,X ;SHOW IT LDA SHOBYT ;GET CHAR. LSR A ;SHIFT RIGHT LSR A ;TO GET LSR A ;NUM 2 LSR A ORA SHCOLR ;ADD COLOR STA INFOLN,X ;SHOW IT RTS ;AND EXIT! ; ---------------------- ; FLASH OBJECT WHEN DEAD ; ---------------------- FLASH LDY FLASHY ;GET Y POS. LDA #0 ;GET READY TO LDX #14 ;CLEAR OLD FLASH CLFLSH STA PL1,Y ;ZERO OUT EACH INY ;BYTE OF FLASH DEX ;DONE YET? BNE CLFLSH ;NO, LOOP. LDA SAVEX ;GET OBJECT'S CLC ;X POS. AND ADC #61 ;ADD 61 FOR STA HPOSP1 ;FLASH HORIZ. LDA SAVEY ;GET Y POS AND CLC ;ADD 26 FOR ADC #26 ;FLASH VERT. TAY ;POSITION STY FLASHY ;AND SAVE LDX #13 ;FLASH = 14 BYTES SEFLSH LDA FLBYTE,X ;GET IMAGE STA PL1,Y ;PUT IN PLAYER 1 INY ;NEXT P/M BYTE DEX ;NEXT IMAGE BYTE BPL SEFLSH ;LOOP. LDA #1 ;SET FLASH STA FLTIME ;DURATION RTS ;ALL DONE! ; ---------- ; TIME DELAY ; ---------- WAIT STA TIMER ;SET TIMER WAITLP LDA TIMER ;TIMER = 0? BNE WAITLP ;NOPE! RTS ;TIMER FINISHED! ; --------------- ; TURN SOUNDS OFF ; --------------- SNDOFF LDA #0 ;ZERO OUT: STA FIRSOU ;FIRE SOUND STA OBDSOU ;OBJ DEATH SOUND STA MOVSOU ;PLYR MOVE SOUND LDX #7 ;ZERO ALL: SNDOF2 STA AUDF1,X ;AUDIO REGISTERS DEX BPL SNDOF2 RTS ;AND EXIT ; --------- ; DRAW GRID ; --------- DRGRID LDA #1 ;TELL INTERRUPT STA INTRFG ;IT'S INTRO JSR SNDOFF ;TURN OFF SOUND LDA #$20 ;TURN OFF TOP STA DMAC1 ;OF SCREEN BY LDA #0 ;SHUTTING OFF STA GRAC1 ;DMA & GRAPHICS LDX #3 ;TURN OFF SHORTS CLSHRT STA SHORTF,X DEX BPL CLSHRT LDX #7 ;TURN OFF CLPRJC STA PROJAC,X ;ALL PROJECTILES DEX BPL CLPRJC JSR PMCLR ;CLEAR P/M AREA STA OFFSET ;ZERO OFFSET LDA #6 ;SET 6 PROJECT. STA PAVAIL ;AVAILABLE LDA GRIDIX ;GET GRID # LSR A ;DIVIDE LSR A ;BY LSR A ;8 TAX ;LOAD APPROPRIATE LDA C0TBL,X ;GRID COLOR STA COLPF0 LDA C1TBL,X ;OBJECT COLOR 1 STA COLPF1 LDA C2TBL,X ;OBJECT COLOR 2 STA COLPF2 LDA OBSTBL,X ;OBJECT SPEED STA OBJSPD LDA GRIDIX ;GET GRID AND #7 ;SHAPE INDEX TAX ;LOAD: LDA OBCNT0,X ;TYPE 0 STA NUMOBJ ;OBJECT COUNT LDA OBCNT1,X ;TYPE 1 STA NUMOBJ+1 ;OBJECT COUNT LDA OBCNT2,X ;TYPE 2 STA NUMOBJ+2 ;OBJECT COUNT LDA OBCNT3,X ;TYPE 3 STA NUMOBJ+3 ;OBJECT COUNT LDA OBCNT4,X ;TYPE 4 STA NUMOBJ+4 ;OBJECT COUNT LDX #4 ;ADJUST ALL DIFFAD LDA NUMOBJ,X ;OBJECT COUNTS CLC ;BY ADDING ADC DIFF ;DIFFICULTY STA NUMOBJ,X ;AND SAVE DEX BPL DIFFAD LDA GRDNUM ;GET GRID # ASL A ;MULTIPLY ASL A ;BY 16 ASL A ASL A STA GRDADJ ;SAVE STA GRDWK ;SAVE TAX ;SET X INDEX LDA #16 ;LOAD 16 BYTES STA GRDWK2 GRDLIN LDA CX,X ;GET CLOSE X STA PLOTX LDA CY,X ;GET CLOSE Y STA PLOTY LDA FX,X ;GET FAR X STA DRAWX LDA FY,X ;GET FAR Y STA DRAWY LDA COLPF0 ;INVISIBLE? BEQ NOGRD1 ;YES, DON'T DRAW JSR PLOTCL ;PLOT CLOSE POINT JSR DRAW ;DRAW TO FAR NOGRD1 DEC GRDWK2 ;CONTINUE DRAWING BEQ GRDBO1 ;UNTIL ALL 16 INC GRDWK ;LINES ARE DONE LDX GRDWK JMP GRDLIN GRDBO1 LDX GRDADJ ;NOW DRAW 15 STX GRDWK ;CLOSE GRID LDA #15 ;BORDER LINES STA GRDWK2 GRDBL1 LDA CX,X ;GET CLOSE X STA PLOTX LDA CY,X ;GET CLOSE Y STA PLOTY LDA CX+1,X ;NEXT CLOSE X STA DRAWX CLC ;FIND POINT ADC PLOTX ;BETWEEN THEM ROR A STA XWORK ;AND SAVE IT! LDA CY+1,X ;NEXT CLOSE Y STA DRAWY CLC ;FIND POINT ADC PLOTY ;BETWEEN THEM ROR A STA YWORK ;AND SAVE IT! LDA #15 ;SET UP A WORK SEC ;AREA TO HOLD SBC GRDWK2 ;THE POINTS STA GRID ;BETWEEN LINES JSR GRIDSV ;AND SAVE THEM LDA COLPF0 ;INVISIBLE GRID? BEQ NOGRD2 ;YES, DON'T DRAW JSR PLOTCL ;PLOT CLOSE POINT1 JSR DRAW ;DRAW TO POINT 2 NOGRD2 DEC GRDWK2 ;MORE LINES? BEQ GRDBO2 ;NO! INC GRDWK ;INCREMENT TO LDX GRDWK ;NEXT LINE JMP GRDBL1 ;AND LOOP GRDBO2 LDX GRDADJ ;NOW DRAW 15 STX GRDWK ;FAR GRID LDA #15 ;BORDER LINES STA GRDWK2 STA OFFSET ;AND SET OFFSET GRDBL2 LDA FX,X ;GET FAR X STA PLOTX LDA FY,X ;GET FAR Y STA PLOTY LDA FX+1,X ;NEXT FAR X STA DRAWX CLC ;AND FIND ADC PLOTX ;MIDPOINT ROR A ;BETWEEN THEM STA XWORK ;AND SAVE IT! LDA FY+1,X ;NEXT FAR Y STA DRAWY CLC ;AND FIND ADC PLOTY ;MIDPOINT ROR A ;BETWEEN THEM STA YWORK ;AND SAVE IT! LDA #15 ;USE THE SAME SEC ;WORK AREA SBC GRDWK2 ;TO HOLD THE STA GRID ;MIDPOINTS JSR GRIDSV ;AND SAVE THEM LDA COLPF0 ;INVISIBLE GRID? BEQ NOGRD3 ;YES, DON'T DRAW JSR PLOTCL ;PLOT FAR POINT 1 JSR DRAW ;DRAW TO POINT 2 NOGRD3 DEC GRDWK2 ;MORE LINES? BEQ GENCOO ;NO! INC GRDWK ;INCREMENT TO LDX GRDWK ;NEXT LINE JMP GRDBL2 ;AND LOOP ; ----------------------------- ; NOW GENERATE COORDINATE TABLE ; ; THIS SECTION BUILDS THE SEGX, ; SEGY, RIMX AND RIMY TABLES. ; THE SEGX&Y TABLES ARE POINTS ; UP AND DOWN THE GRID FOR PRO- ; JECTILES AND OBJECTS. THE ; RIMX&Y TABLES ARE FOR THE ; POSITIONING OF SHORTS. ; ----------------------------- GENCOO LDA #0 STA GRIDNO DIVCTL TAX LDA SEGX,X ;SET UP SEGWK STA SEGWK ;WITH END LDA SEGX+15,X ;COORDINATES STA SEGWK+16 JSR DIVIDE ;DIVIDE SEGWK LDX GRIDNO LDY #0 COPY1 LDA SEGWK,Y ;COPY SEGWK STA SEGX,X ;TABLE TO SEGX INX INY CPY #16 BNE COPY1 ;NOW THE Y COORDS LDX GRIDNO LDA SEGY,X ;SET UP SEGWK STA SEGWK ;WITH END LDA SEGY+15,X ;COORDINATES STA SEGWK+16 JSR DIVIDE ;DIVIDE SEGWK LDX GRIDNO LDY #0 COPY2 LDA SEGWK,Y ;COPY SEGWK STA SEGY,X ;TABLE TO SEGY INX INY CPY #16 BNE COPY2 ; ---------------------------- ; NOW GENERATE RIM COORDINATES ; ---------------------------- LDX GRIDNO LDA RIMX,X ;SET UP SEGWK STA SEGWK ;WITH END LDA RIMX+15,X ;COORDINATES STA SEGWK+16 JSR DIVIDE ;DIVIDE SEGWK LDX GRIDNO LDY #0 COPY3 LDA SEGWK,Y ;COPY SEGWK STA RIMX,X ;TABLE TO RIMX INX INY CPY #16 BNE COPY3 ;NOW THE RIM Y COORDS LDX GRIDNO LDA RIMY,X ;SET UP SEGWK STA SEGWK ;WITH END LDA RIMY+15,X ;COORDINATES STA SEGWK+16 JSR DIVIDE ;DIVIDE SEGWK LDX GRIDNO LDY #0 COPY4 LDA SEGWK,Y ;COPY SEGWK STA RIMY,X ;TABLE TO RIMY INX INY CPY #16 BNE COPY4 LDA GRIDNO ;DO ALL 15 CLC ;GRID LINES ADC #16 STA GRIDNO CMP #240 ;ALL DONE? BEQ ENDDVC ;YOU BET! JMP DIVCTL ;LOOP BACK! ENDDVC LDA #$3D ;RESTART STA DMAC1 ;THE DISPLAY LDA #$03 ;AFTER GRID STA GRAC1 ;IS DRAWN LDA #0 ;NO MORE STA INTRFG ;INTRO STATUS RTS ;FINIS! ; ------------------------------- ; DIVIDE SEGWK TABLE ; ; THIS ROUTINE EXAMINES THE FIRST ; AND LAST BYTES IN THE SEGWK ; TABLE AND FILLS THE BYTES IN ; BETWEEN WITH AN EVEN TRANSITION ; FROM ONE ENDPOINT TO THE OTHER ; ------------------------------- DIVIDE LDA #16 STA STEP STA NEXT LSR A STA DEST DIVLP2 LDA #0 STA LAST DIVLP1 LDX LAST LDA SEGWK,X LDX NEXT CLC ADC SEGWK,X ROR A LDX DEST STA SEGWK,X LDA LAST CLC ADC STEP STA LAST ADC STEP CMP #17 BCS NOSTEP STA NEXT LDA DEST CLC ADC STEP STA DEST JMP DIVLP1 NOSTEP LDA STEP LSR A STA STEP STA NEXT LSR A BEQ ENDDIV STA DEST JMP DIVLP2 ENDDIV RTS ; -------------------- ; GRID COORDINATE SAVE ; -------------------- GRIDSV LDA GRID ASL A ;*2 ASL A ;*4 ASL A ;*8 ASL A ;*16 CLC ;ADD THE ADC OFFSET ;OFFSET VALUE TAX ;SAVE IN INDEX LDA XWORK ;GET X WORK STA SEGX,X ;AND SAVE LDA YWORK ;GET Y WORK STA SEGY,X ;AND SAVE LDA OFFSET ;DON'T CONTINUE BNE SAVEND ;IF OFFSET >0 LDA PLOTX ;GET PLOTX STA RIMX,X ;AND SAVE LDA PLOTY ;GET PLOTY STA RIMY,X ;AND SAVE LDA DRAWX ;GET DRAWX STA RIMX+15,X ;AND SAVE LDA DRAWY ;GET DRAWY STA RIMY+15,X ;AND SAVE SAVEND RTS ;ALL DONE! ; ---------------------- ; VERTICAL BLANK ROUTINE ; ---------------------- VBI LDA DLI1 ;DISPLAY LIST STA VDSLST+1 ;INTERRUPT CLD ;CLR DECIMAL MODE LDA OBTIM1 ;THIS SECTION BEQ NOOBTD ;PROCESSES DEC OBTIM1 ;ALL TIMERS NOOBTD LDA TIMER BEQ NOTIMR DEC TIMER NOTIMR LDA FLTIME BEQ NOFTIM DEC FLTIME NOFTIM LDA KILPLR ;PLAYER DEAD? BEQ CHKINT ;NO, CONTINUE! JMP VBCONT ;SKIP PLAYER STUFF CHKINT LDA INTRFG ;IN INTRO? BEQ NOTINT ;NO, CONTINUE! JMP XITVBV ;EXIT IF INTRO NOTINT LDA KEY ;GET KEYBOARD CMP #$1C ;PAUSE (ESC)? BNE CKZAP ;NO, CHECK ZAP LDA PAUFLG ;GET PAUSE FLAG EOR #$FF ;AND FLIP STA PAUFLG ;AND STORE JMP ENDKEY ;DONE W/KEY CKZAP CMP #$21 ;SPACE BAR? BNE ENDKEY ;NAW, DONE W/KEY LDA ZAP ;USED ZAP YET? BEQ ENDKEY ;YES, NO ZAP DEC ZAP ;ZAP NOW USED LDX #5 ;TIME TO KILL LDA #1 ;ALL OBJECTS ZAPOBJ STA OBDEAD,X DEX BPL ZAPOBJ LDX #3 ;AND KILL ZAPSHO LDA SHORTF,X ;ALL SHORTS BEQ NOSKIL LDA MISCAD ;ALSO SET SED ;MISCELLANEOUS CLC ;SCORE ADD ADC #4 ;FOR 400 POINTS STA MISCAD ;FOR EACH SHORT CLD LDA #0 ;KILL STA SHORTF,X ;SHORT NOSKIL DEX BPL ZAPSHO ENDKEY LDA #0 ;CLEAR STA KEY ;KEYPRESS. LDA PAUFLG ;PAUSED? BEQ NOPAU ;NO, CONTINUE LDA #0 ;TURN OFF STA AUDC1 ;ALL SOUNDS STA AUDC2 ;DURING STA AUDC3 ;THE STA AUDC4 ;PAUSE JMP XITVBV ;THEN EXIT NOPAU LDA FIRSOU ;FIRE SOUND ON? BEQ NOFSND ;NO! DEC FIRSOU ;DEC COUNTER LDX FIRSOU ;PUT IN INDEX LDA FIRFRQ,X ;GET FREQUENCY STA AUDF2 LDA FIRCTL,X ;GET CONTROL STA AUDC2 NOFSND LDA OBDSOU ;OBJ DEATH SOUND? BEQ NOOSND ;NO! DEC OBDSOU ;DEC COUNTER LDX OBDSOU ;PUT IN INDEX LDA OBDFRQ,X ;GET FREQUENCY STA AUDF3 LDA OBDCTL,X ;GET CONTROL STA AUDC3 NOOSND LDA MOVSOU ;MOVE SOUND? BEQ CYCCOL ;NO! DEC MOVSOU ;DEC COUNTER LDX MOVSOU ;PUT IN INDEX LDA MOVFRQ,X ;GET FREQUENCY STA AUDF4 LDA MOVCTL,X ;GET CONTROL STA AUDC4 CYCCOL LDA COLPM2 ;CYCLE CLC ;PLAYER 2 ADC #16 ;COLOR STA COLPM2 ;SAVE IN P/M 2 STA COLPM3 ;AND IN P/M 3 AND #$FC ;ALSO PUT IN STA COLPF3 ;PF3 FOR MISSILES DEC TRANTM ;TRANSIENT TIME BNE NOTRAN ;NO CHANGE LDA OBJHUE+4 ;FLIP BNE TRAN1 ;TRANSIENT LDA #2 ;HUE BNE STOTRN ;TO EITHER TRAN1 LDA #0 ;0 OR 2 STOTRN STA OBJHUE+4 LDA RANDOM_ ORA #$1F ;RESET AND #$3F ;THE STA TRANTM ;TRANSIENT TIME NOTRAN INC PSCNT ;INC PLYR TIMER LDA PSCNT ;READY TO CMP #3 ;CHANGE SHAPE? BNE NOPSIN ;NOT YET! LDA #0 ;BETTER RESET STA PSCNT ;INDEX INC SP1IX ;AND INCREMENT INC SP2IX ;ALL SHAPE INC SP3IX ;INDEXES! NOPSIN LDA PFTIME ;SEE IF WE'RE BEQ FIRE ;READY TO CHECK DEC PFTIME ;IF PLAYER IS JMP CHKPMV ;SHOOTING FIRE LDA #4 ;RESET FIRE STA PFTIME ;TIMER LDA JOYPAD ;USING STICK? BEQ RDSTRG ;YES! LDA PTRIG0 ;GET PADL TRIGGER JMP CMPTRG ;CHECK IT RDSTRG LDA STRIG ;GET STICK TRIGGER CMPTRG BNE CHKPMV ;NOT FIRING! LDA PAVAIL ;ANY PROJ AVAIL? BEQ CHKPMV ;NO! LDX #7 ;FIND AN PRSCAN LDA PROJAC,X ;AVAILABLE BEQ GOTPRN ;PROJECTILE DEX BNE PRSCAN GOTPRN DEC PAVAIL ;1 LESS AVAILABLE LDA #1 ;IT'S NOW STA PROJAC,X ;ACTIVE LDA #21 ;START UP STA FIRSOU ;FIRE SOUND LDA #0 ;INITIALIZE STA PROJSG,X ;SEGMENT # TO 0 LDA PLRGRD ;SET UP STA PROGRD,X ;PROJ GRID# ASL A ;AND ASL A ;MULTIPLY ASL A ;BY 16 ASL A STA PROJGN,X ;FOR INDEX LDA #1 ;INITIALIZE STA PROINC,X ;PROJ INCREMENT CHKPMV LDA JOYPAD ;USING STICK? BEQ GOSTIK ;YES! LDA POT0 ;GET PADDLE LSR A ;DIVIDE BY LSR A ;16 TO GET LSR A ;USABLE VALUE LSR A CMP #15 ;> 14? BMI STOPOS ;NO, GO STORE LDA #14 ;MAX. IS 14 BNE STOPOS ;AND GO STORE GOSTIK LDA PMTIME ;READY FOR STICK? BEQ RDSTIK ;YES! DEC PMTIME ;DEC TIMER JVBC JMP VBCONT ;JMP TO CONTINUE RDSTIK LDA #2 ;RESET STICK TIMER STA PMTIME ;TO 2 JIFFIES LDX STICK ;GET STICK LDA PLRGRD ;GET PLYR GRID # CLC ;ADD THE ADC STKADD,X ;DIRECTION INC BMI SAMPOS ;IF <0 REJECT CMP #15 ;IF <15... BNE STOPOS ;USE IT! SAMPOS LDA PLRGRD ;GET GRID# STOPOS CMP PLRGRD ;SAME AS LAST? BEQ NOPSTO ;YES, DON'T STORE LDX #9 ;START UP STX MOVSOU ;MOVE SOUND STA PLRGRD ;SAVE GRID# NOPSTO ASL A ;MULTIPLY ASL A ;BY 16 FOR ASL A ;POSITION ASL A ;INDEX TAX LDA P0PL AND #$0C ;HIT P2/P3? BEQ NOHSHO ;NO! LDA #1 ;OOPS! HIT SHORT! STA KILPLR ;KILL PLAYER JMP VBEND ;AND EXIT VBLANK NOHSHO LDA SEGX,X ;GET PLAYER'S CLC ;X POSITION AND ADC #61 ;ADJUST FOR P/M STA HPOSP0 ;AND SAVE LDY PLRY ;HOLD OLD Y POS LDA SEGY,X ;GET NEW Y POS CLC ;ADJUST FOR P/M ADC #32 ;BY ADDING 32 STA PLRY ;SET Y POS LDA #0 ;CLEAR OUT LDX #15 ;OLD PLAYER CLRPS STA PL0-8,Y ;IMAGE INY DEX BPL CLRPS LDA #15 ;NOW COPY STA SPIX ;16-BYTE SPLOOP LDA #0 ;PLAYER IMAGE STA PLTBYT ;TO PLAYER 0 LDA SP1IX AND #15 TAX LDA SPIX CMP SPTBL,X BCC NOSP1 CMP EPTBL,X BCS NOSP1 TAX LDA PN1,X ;GET IMAGE 1 STA PLTBYT ;AND SAVE NOSP1 LDA SP2IX AND #15 TAX LDA SPIX CMP SPTBL,X BCC NOSP2 CMP EPTBL,X BCS NOSP2 TAX LDA PN2,X ORA PLTBYT ;ADD IMAGE 2 STA PLTBYT ;AND SAVE NOSP2 LDA SP3IX AND #15 TAX LDA SPIX CMP SPTBL,X BCC NOSP3 CMP EPTBL,X BCS NOSP3 TAX LDA PN3,X ORA PLTBYT ;ADD IMAGE 3 STA PLTBYT ;AND SAVE NOSP3 LDA PLRY CLC ADC SPIX SEC SBC #8 TAY LDA PLTBYT ;GET IMAGE BYTE STA PL0,Y ;PUT IN P/M AREA DEC SPIX ;MORE IMAGE? BPL SPLOOP ;YES! VBCONT LDA PRADV1 ;ADVANCE PROJ? BEQ SETPRA ;YES! DEC PRADV1 ;NO, DEC TIMER JMP FLIPIT ;GO FLIP DISPLAY SETPRA INC PRADVT LDA #1 ;SET ADVANCE STA PRADV1 ;TIMER ; ------------------------------ ; THIS SECTION FLIP-FLOPS THE 4 ; MISSILES IN ORDER TO ALLOW THE ; DISPLAY OF 8 PROJECTILES. AS ; A RESULT, SOME FLICKER CAN BE ; OBSERVED. ; ------------------------------ FLIPIT INC PRFLIP ;INC FLIP INDEX LDA PRFLIP ;GET INDEX AND #1 ;MAKE 0/1 TAY ;SAVE IN Y LDA PREND,Y ;GET # OF LAST STA ENDVAL ;PROJECTILE LDX PRSTRT,Y ;GET # OF FIRST STX VBXHLD ;PROJECTILE LDA #3 ;START W/MISSILE STA MISNUM ;NUMBER 3 PROJLP LDA PROJAC,X ;IS PROJ. ACTIVE? BNE GOTPRJ ;YOU BET. JMP CKPEND ;TRY ANOTHER GOTPRJ LDX MISNUM ;GET MISSILE # LDY PRYHLD,X ;GET LAST POSITION LDA MISSLS-1,Y ;ERASE OLD AND MISLOF,X ;PROJECTILE STA MISSLS-1,Y ;IMAGE LDA MISSLS,Y AND MISLOF,X STA MISSLS,Y LDA MISSLS+1,Y AND MISLOF,X STA MISSLS+1,Y LDX VBXHLD LDA PRADVT ;READY TO AND #1 ;ADVANCE PROJ? BNE NOPADV ;NOT YET LDA PROJSG,X ;GET PROJ SEG# CLC ;AND ADC PROINC,X ;ADD INCREMENT STA PROJSG,X ;THEN SAVE NOPADV LDA PROINC,X ;ENEMY SHOT? BMI NOOHCK ;NO OBJ HIT CHECK LDY #5 OBKILP LDA OBDEAD,Y ;ALREADY DEAD? BNE NXTOCK ;YES! LDA OBJPRS,Y ;OBJECT THERE? BEQ NXTOCK ;NO! LDA OBJTYP,Y ;TRANSIENT? CMP #4 BNE NOTRNC ;NO! LDA OBJHUE+4 ;INVISIBLE? BEQ NXTOCK ;YES! NOTRNC LDA OBJGRD,Y ;SAME GRID # CMP PROGRD,X ;AS PROJ? BNE NXTOCK ;NO! LDA OBJSEG,Y ;SAME SEG # LSR A SEC SBC PROJSG,X ;AS PROJ? BEQ HITOBJ CMP #254 BCC NXTOCK ;NO! HITOBJ LDA OBJTYP,Y ;RESISTOR? BEQ CGPRDR ;YES! LDA #1 ;KILL OBJECT STA OBDEAD,Y JMP KILLPR ;AND PROJ. CGPRDR LDA #$FF ;PROJ NOW HEADING STA PROINC,X ;FOR PLAYER! NXTOCK DEY ;NEXT OBJECT BPL OBKILP ;MORE TO DO! NOOHCK LDA PROJSG,X ;IS PROJ SEG# =0? BEQ KILLPR ;YES, KILL IT! CMP #16 ;=16? BEQ KILLPR ;YES, KILL IT! CLC ;NOW ADD PROJ ADC PROJGN,X ;GRID INDEX TAX ;AND GET LDA SEGX,X ;X COORD LDY SEGY,X ;AND Y COORD CLC ;ADD 64 TO ADC #64 ;X COORD FOR LDX MISNUM ;P/M HORIZ STA HPOSM0,X ;AND SAVE TYA ;GET Y CLC ;ADD 32 TO ADC #32 ;Y COORD FOR TAY ;P/M VERT STY PRYHLD,X ;AND SAVE. LDA MISSLS-1,Y ;NOW DRAW ORA MISLON,X ;PROJECTILE IN STA MISSLS-1,Y ;NEW POSITION LDA MISSLS,Y ORA MISLON,X STA MISSLS,Y LDA MISSLS+1,Y ORA MISLON,X STA MISSLS+1,Y CKPEND DEC MISNUM ;NEXT MISSILE # DEC VBXHLD ;NEXT PROJ. LDX VBXHLD CPX ENDVAL ;DONE? BEQ SHORTS ;YES! JMP PROJLP ;DO NEXT PROJ. KILLPR LDA #0 ;KILL PROJ. STA PROJAC,X CPX #2 ;ENEMY PROJ? BCC NOAVIN ;YES DON'T INC INC PAVAIL ;ANOTHER AVAIL NOAVIN LDA PROJSG,X ;SEGMENT 0? BNE NOKILP ;NO! LDA PROINC,X ;TOWARD RIM? BPL NOKILP ;NO! LDA PROGRD,X ;SAME GRID... CMP PLRGRD ;AS PLAYER? BNE NOKILP ;NO! LDA #1 ;THE PLAYER STA KILPLR ;IS DEAD! NOKILP JMP CKPEND ;NEXT PROJ. ; ------------------------------ ; THIS SECTION HANDLES SHORTS. ; 2 PLAYERS ARE USED TO SHOW A ; MAXIMUM OF 4 SHORTS, SO SOME ; FLICKER MAY BE OBSERVED. ; ------------------------------ SHORTS INC SHFLIP ;TOGGLE FLIP LDA SHFLIP ;MASK FLIP LSR A ;TO EITHER AND #1 ;0 OR 1 TAY ;PUT IN Y LDA CPYSTN,Y ;AND GET IMAGE STA CPYST ;TO USE (+/X) LDA SHFLIP ;GET FLIP, AND #1 ;MASK AND TAY ;PUT IN Y LDA #PL3/256 ;PUT PLAYER 3 STA DESTHI ;IN DESTINATION LDA DISP ;BYTE THAT WILL ADC HI ;BE ALTERED FOR STA HI ;THE PLOT. LDA PLOTX ;MASK PLOTX FOR AND #3 ;PLOT INDEX, TAX ;PLACE IN X. LDA PLOTX ;GET PLOTX AND LSR A ;DIVIDE LSR A ;BY 4, STA YOFSET TAY LDA (LO),Y AND BMASK2,X CMP COLOR1,X BEQ PABORT LDY COLOR ;GET COLOR LDA BMASK2,X ;AND MASK OFF AND COLORS,Y ;PIXEL POSITION STA HOLD ;SAVE IT, LDA BMASK1,X ;MASK OFF PIXEL LDY YOFSET ;OF THE ADDRESS AND (LO),Y ;TO BE ALTERED ORA HOLD ;SET THE PLOT STA (LO),Y ;BITS AND STORE! PABORT RTS ;FINIS! ; ---------------- ; PLOT MASK TABLES ; ---------------- COLORS DB $00,$55,$AA,$FF BMASK1 DB $3F,$CF,$F3,$FC BMASK2 DB $C0,$30,$0C,$03 COLOR1 DB $40,$10,$04,$01 ; ------------ ; DRAW HANDLER ; ------------ DRAW LDA DRAWY CMP PLOTY ;IS DRAWY>PLOTY? BCC YMINUS ;NO! SEC ;SUBTRACT SBC PLOTY ;PLOTY FROM DRAWY STA DELTAY ;AND SAVE DIFFERENCE. LDA #1 ;Y INCREMENT STA INCY ;= 1 (DOWN) BNE XVEC ;BRANCH! YMINUS LDA PLOTY ;SUBTRACT SEC ;DRAWY SBC DRAWY ;FROM PLOTY STA DELTAY ;AND SAVE DIFFERENCE. LDA #255 ;Y INCREMENT STA INCY ;= -1 (UP) XVEC LDA DRAWX ;IS DRAWX CMP PLOTX ;> PLOTX? BCC XMINUS ;NO! SEC ;SUBTRACT SBC PLOTX ;PLOTX FROM DRAWX STA DELTAX ;AND SAVE DIFFERENCE. LDA #1 ;X INCREMENT STA INCX ;IS 1 (RIGHT) BNE VECSET ;BRANCH! XMINUS LDA PLOTX ;SUBTRACT SEC ;DRAWX FROM SBC DRAWX ;PLOTX STA DELTAX ;AND SAVE DIFFERENCE. LDA #255 ;X INCREMENT STA INCX ;IS -1 (LEFT) VECSET LDA #0 ;ZERO OUT: STA ACCY ;Y ACCUMULATOR STA ACCX ;X ACCUMULATOR LDA DELTAX ;IS DELTAX> CMP DELTAY ;DELTAY? BCC YMAX ;NO! STA COUNTR ;SAVE DELTAX STA ENDPT ;IN COUNTR, ENDPT. LSR A ;DIVIDE BY 2 AND STA ACCY ;STORE IN Y ACCUM. JMP DRAWGO ;START DRAW YMAX LDA DELTAY ;DELTAY LARGER, STA COUNTR ;STORE IT IN STA ENDPT ;COUNTR, ENDPT. LSR A ;DIVIDE BY 2 AND STA ACCX ;STORE IN X ACCUM. ; ----------------------- ; NOW WE START THE ACTUAL ; DRAWTO FUNCTION! ; ----------------------- DRAWGO LDA COUNTR ;IF COUNTR=0... BEQ DRWEND ;NO DRAW! BEGIN LDA ACCY ;ADD DELTAY CLC ;TO Y ACCUMULATOR ADC DELTAY STA ACCY CMP ENDPT ;AT ENDPOINT YET? BCC BEGIN2 ;NO, GO DO X. LDA ACCY ;SUBTRACT ENDPT SEC ;FROM Y ACCUMULATOR SBC ENDPT STA ACCY LDA PLOTY ;AND INCREMENT CLC ;THE Y POSITION! ADC INCY STA PLOTY BEGIN2 LDA ACCX ;ADD DELTAX TO CLC ;X ACCUMULATOR ADC DELTAX STA ACCX CMP ENDPT ;AT ENDPOINT YET? BCC PLOTIT ;NO, GO PLOT. LDA ACCX ;SUBTRACT ENDPT SEC ;FROM X ACCUMULATOR SBC ENDPT STA ACCX LDA PLOTX ;AND INCREMENT CLC ;PLOT X ADC INCX STA PLOTX PLOTIT JSR PLOTCL ;PLOT THE POINT! DEC COUNTR ;MORE TO DRAW? BNE BEGIN ;YES! DRWEND RTS ;NO, EXIT! ; ------------------ ; MISCELLANEOUS DATA ; ------------------ GRDTBL DB 0,1,2,3,4,1,5,3 ; L,I,V,E,W,I,R,E ; COLORS (0=GRID, 1=OBJ1 2=OBJ2) C0TBL DB $C4,$36,$74,$F6 DB $54,$06,$00,$26 C1TBL DB $86,$0C,$36,$56 DB $26,$C6,$98,$18 C2TBL DB $98,$46,$A8,$36 DB $84,$18,$C6,$38 ; OBJECT COUNT TABLES (DIFFICULTY) OBCNT0 DB 0,0,0,0,4,6,8,10 OBCNT1 DB 0,0,0,6,8,9,10,11 OBCNT2 DB 8,10,12,14,16,18,20,22 OBCNT3 DB 6,8,10,11,12,14,15,16 OBCNT4 DB 0,0,4,8,10,12,14,16 ; STICK ADD VALUES STKADD DB 0,0,0,0,0,1,1,1 DB 0,$FF,$FF,$FF,0,0,0,0 ; PROJECTILE DATA PROJAC DB 0,0,0,0,0,0,0,0 PROINC Org *+8 PROGRD ORG *+8 PROJGN ORG *+8 PROJSG ORG *+8 PRSTRT DB 3,7 PREND DB $FF,3 MISLON DB $03,$0C,$30,$C0 MISLOF DB $FC,$F3,$CF,$3F ; FLASH (OBJECT DEATH) DATA FLBYTE DB $28,$28,$28,$92,$54,$28,$10 DB $10,$28,$54,$92,$28,$28,$28 ; OBJECT POINTS (250,200,50,100,150) POINT1 DB $02,$02,$00,$01,$01 POINT2 DB $50,$00,$50,$00,$50 ; SHORT DATA SHORTF ORG *+4 SHORTX ORG *+4 SHORTD Org *+4 SHORTT ORG *+4 ; OBJECT DATA OBDEAD ORG *+6 OBDED2 ORG *+6 OBJTYP ORG *+6 OBJINC ORG *+6 OBJGRD ORG *+6 OBJSEG ORG *+6 OBJHUE DB 2,3,2,3,2 SIZEWK DB 0,0,0,0,0,0,0,0 PXINC DB 0,0,1,$FF,1,$FF,1,$FF PYINC DB $FF,1,0,0,$FF,1,1,$FF OBSTBL DB 18,15,14,12 DB 11,10,9,7 OBJDIR DB 4,3,1,2,0,5,$FF,0 DB 4,5,0,6,0,$FF,0,0 DB 0,5,6,4,7,1,$FF,0 DB 6,0,3,1,2,7,$FF,0 DB 4,6,5,7,5,6,4,$FF OBJLEN DB 3,7,7,7,7,7,0,0 DB 3,7,7,7,7,0,0,0 DB 3,3,3,3,3,7,0,0 DB 2,3,3,3,3,3,0,0 DB 1,1,1,3,1,1,3,0 SIZTBL DB 0,0,0,0,0,1,1,1 DB 0,0,0,1,1,2,2,2 DB 0,0,1,1,1,2,2,2 DB 0,1,1,2,2,2,2,3 DB 0,1,1,2,2,2,3,3 DB 1,2,2,2,2,2,3,3 DB 1,2,2,2,3,3,3,4 DB 1,2,2,3,3,3,4,4 ; PLAYER SHAPES PN1 DB $10,$10,$10,$10,$10,$10,$10,$10 DB $08,$08,$08,$08,$08,$08,$08,$08 PN2 DB $00,$00,$00,$00,$80,$40,$20,$10 DB $08,$04,$02,$01,$00,$00,$00,$00 PN3 DB $00,$00,$01,$01,$02,$02,$04,$08 DB $10,$20,$40,$40,$80,$80,$00,$00 ; SHAPE START/END POINTS SPTBL DB 0,1,2,3,4,5,6,7 DB 8,7,6,5,4,3,2,1 EPTBL DB 17,16,15,14,13,12,11,10 DB 9,10,11,12,13,14,15,16 ; JOYSTICK/PADDLE MESSAGE POINTERS JPLO DB JOYMSG,>PADMSG ;GRID DATA TABLES CX DB 14,14,14,14,14,14,14,14 DB 26,39,51,64,75,88,100,113 DB 14,14,14,14,14,14,14,14 DB 14,14,14,14,14,14,14,14 DB 14,20,26,32,38,43,49,59 DB 69,78,84,89,95,101,107,113 DB 113,88,64,39,14,14,14,27 DB 27,14,14,14,39,64,88,113 DB 14,14,14,14,14,29,43,58 DB 70,84,98,113,113,113,113,113 DB 113,106,100,113,113,100,82,65 DB 48,32,14,14,14,14,14,14 CY DB 18,34,52,70,88,105,123,141 DB 141,141,141,141,141,141,141,141 DB 18,25,34,42,50,58,67,75 DB 83,91,100,108,116,125,133,141 DB 18,39,59,80,101,121,141,141 DB 141,141,121,101,80,59,39,18 DB 18,18,18,18,18,35,53,71 DB 89,106,124,141,141,141,141,141 DB 18,49,80,111,141,132,123,114 DB 114,123,132,141,111,80,49,18 DB 141,110,80,61,38,18,18,18 DB 18,18,18,43,68,92,117,141 FX DB 55,55,55,55,55,55,55,55 DB 58,60,62,64,66,68,70,73 DB 55,55,55,55,55,55,55,55 DB 55,55,55,55,55,55,55,55 DB 55,57,58,59,59,60,61,63 DB 65,67,68,69,69,70,71,73 DB 73,68,64,60,55,55,55,57 DB 57,55,55,55,60,64,68,73 DB 55,55,55,55,55,58,61,63 DB 65,67,70,73,73,73,73,73 DB 73,72,70,73,73,70,67,64 DB 61,58,55,55,55,55,55,55 FY DB 67,71,74,77,81,84,87,90 DB 90,90,90,90,90,90,90,90 DB 60,62,65,68,71,73,76,78 DB 81,83,86,89,92,94,97,99 DB 67,73,77,80,84,88,90,90 DB 90,90,88,84,80,77,73,67 DB 67,67,67,67,67,71,74,77 DB 80,83,86,90,90,90,90,90 DB 67,74,80,86,90,89,87,86 DB 86,87,89,90,86,80,74,67 DB 90,85,80,75,71,67,67,67 DB 67,67,67,73,78,82,86,90 SHSTRT DB 0,2 SHYHLD ORG *+2 SHOIMG DB $88,$50,$20,$50,$88 DB $20,$20,$F8,$20,$20 CPYSTN DB 4,9 ADDSUB DB 2,$FE ;ADD/SUB. 2 ADDSB1 DB 1,$FF ;ADD/SUB. 1 ; SOUND DATA FIRCTL DB $00,$A1,$A1,$A2,$A2,$A3 DB $A3,$A4,$A4,$A5,$A5,$A6 DB $A6,$A7,$A7,$A8,$A8,$A9 DB $A9,$AA,$AA FIRFRQ DB 0,194,166,180,152,166 DB 138,152,124,138,110,124 DB 96,110,82,96,68,82 DB 54,68,40 OBDCTL DB $00,$41,$41,$42,$42,$43 DB $43,$44,$44,$45,$45,$46 DB $46,$47,$47,$48,$48,$49 DB $49,$4A,$4A OBDFRQ DB 0,80,40,120,80,160 DB 120,200,160,240,200,24 DB 240,64,24,104,64,144 DB 104,204,144 MOVCTL DB $00,$A1,$A1,$A2,$A2,$A3 DB $A3,$A4,$A4 MOVFRQ DB 0,20,30,20,30,20,30,20,30 ; DATA TABLES SEGWK Org *+17 SEGX Org *+256 SEGY Org *+256 RIMX Org *+256 RIMY Org *+256 End LIVE