; ====================== ; RETROFIRE! ; ; BY: TOM HUDSON ; A.N.A.L.O.G. COMPUTING ; ====================== ; --------------- ; PAGE ZERO USAGE ; --------------- ORG $80 PLOTX DS 1 ;PLOT X VALUE DRAWX DS 1 ;DRAW X VALUE PLOTY DS 1 ;PLOT Y VALUE DRAWY DS 1 ;DRAW Y VALUE PLXHI DS 1 ;PLOT X HI BYTE DRXHI DS 1 ;PLOT Y HI BYTE ACCX DS 1 ;DRAW X ACCUMULATOR ACCXHI DS 1 ACCY DS 1 ;DRAW Y ACCUMULATOR ACCYHI DS 1 DELTAX DS 1 ;DRAW WORK DELXHI DS 1 ;DITTO DELTAY DS 1 ;DITTO INCX DS 1 ;DRAW X INCREMENT INCY DS 1 ;DRAW Y INCREMENT LO DS 1 ;INDIRECT ADDRESS HI DS 1 HOLD DS 1 ;TEMP STORAGE LOHLD DS 1 HIHLD DS 1 ENDPT DS 1 ;DRAW ENDPOINT ENDHI DS 1 COUNTR DS 1 ;DRAW COUNTER CNTHI DS 1 COLOR DS 1 ;PLOT COLOR XOFSET DS 1 ;PLOT X OFFSET X DS 1 ;GRID COORD... Y DS 1 ;HOLD AREAS HGTIX DS 1 ;GRID HEIGHT INDEX DS 1 ;GRID INDEX DESTLO DS 1 ;MOVE DESTINATION... DESTHI DS 1 ;HOLD AREA COPCNT DS 1 ;BYTE COPY COUNT CHARX DS 1 ;CHARACTER X LOC CHARY DS 1 ;CHARACTER Y LOC CHARNO DS 1 ;CHARACTER # CHINDX DS 1 ;CHARACTER INDEX SNUMIX DS 1 ;NUMBER INDEX DIGITS DS 1 ;# OF DIGITS TO DISPLAY SHOBYT DS 1 ;NUMBER HOLD VELADL DS 1 ;VELOCITY ADD LOW VELADH DS 1 ;VELOCITY ADD HIGH TIMER DS 1 ;GENERAL EVENT TIMER STKHLD DS 1 ;STICK POS. HOLD STKPOS DS 1 ;STICK POSITION ALTLOB DS 1 ;LOW ALTITUDE BYTE GRDTYP DS 1 ;GRID TYPE MSGCT DS 1 ;MESSAGE COUNT MSGPTR DS 1 ;MESSAGE POINTER THRCNT DS 1 ;THRUST COUNTER BALO DS 1 ;BINARY ALTITUDE LOW BAHI DS 1 ;BINARY ALTITUDE HI RESULT DS 1 ;DIVISION RESULT DIVISR DS 1 ;DIVISOR SHIPY DS 1 ;SHIP GRID Y SHIPYL DS 1 ;SHIP Y LOW SHIPZ DS 1 ;SHIP GRID Z SHIPZL DS 1 ;SHIP Z LOW SHPLRX DS 1 ;SHIP PLAYER X POS LASTSY DS 1 ;PREVIOUS SHIP Y SHADOY DS 1 ;SHIP SHADOW Y LSHADY DS 1 ;PREVIOUS SHADOW Y SHPLRY DS 1 ;SHIP PLAYER Y SHTEMP DS 1 ;TEMPORARY STORAGE NEWGRD DS 1 ;NEW GRID FLAG NOSPOS DS 1 ;NO SHIP SHOW FLAG GRDDIR DS 1 ;SHIP'S MOVEMENT DIRECTION THRVOL DS 1 ;THRUST VOLUME THRTIM DS 1 ;THRUST TIME DLICNT DS 1 ;DLI COUNTER MULT1 DS 1 ;MULTIPLY #1 MULT2 DS 1 ;MULTIPLY #2 LRES DS 1 ;LOW MULT RESULT HRES DS 1 ;HIGH MULT RESULT SUBY DS 1 ;SHIP Y/Z SUBZ DS 1 ;WORK AREAS TERRIX DS 1 ;TERRAIN POSITION INDEX T1 DS 1 ;TERRAIN... T2 DS 1 ;HEIGHT... T3 DS 1 ;WORK AREAS BASEY DS 3 ;BASE Y POSITIONS BASEZ DS 3 ;BASE Z POSITIONS GYP DS 3 ;SHIP Y POSITIONS GZP DS 3 ;SHIP Z POSITIONS BASEIX DS 1 ;BASE POSITION INDEX PFLASH DS 1 ;PAD FLASH... PFLIX DS 1 ;INDEXES VCHANC DS 1 ;VOLCANO CHANCE VOLY DS 1 ;VOLCANO Y AND Z... VOLZ DS 1 ;POSITIONS VOLIX DS 1 ;VOLCANO POSITION INDEX VOLPX DS 1 ;VOLCANO PLAYER X VOLPY DS 1 ;VOLCANO PLAYER Y VOLRAD DS 1 ;VOLCANO RADIATION FLAG RADLVL DS 1 ;RADIATION LEVEL RADTIM DS 1 ;RADIATION LEVEL TIMER PAUSED DS 1 ;PAUSE FLAG SNDCNT DS 1 ;SOUND COUNTER SSTATS DS 1 ;SOUND STATUSES NUMBRS DS 3 ;ALTITUDE DS 3 ;X VELOCITY DS 2 ;Y VELOCITY DS 2 ;Z VELOCITY DS 3 ;FUEL DS 1 ;SHIPS LEFT DS 3 ;SCORE POSNUM DS 2 ;SHIP/BASE POSITIONS ; ------------------ ; MISC. MEMORY USAGE ; ------------------ PMAREA = $0000 ;PLAYERS/MISSILES MISSLS = PMAREA+768 PL0 = PMAREA+1024 PL1 = PMAREA+1280 PL2 = PMAREA+1536 PL3 = PMAREA+1792 DLIST = $1F00 ;DISPLAY LIST DISP = $2010 ;TOP OF DISPLAY DISP2 = $3000 ;BOTTOM DISPLAY ; -------------- ; SYSTEM EQUATES ; -------------- VDSLST = $200 ;DLI POINTER WSYNC = $D40A ;WAIT FOR SYNC KEY = $2FC ;KEYBOARD KEY CONSOL = $D01F ;CONSOLE KEYS PMBASE = $D407 ;P/M BASE ADDRESS RANDOM = $D20A ;RANDOM NUMBER SETVBV = $E45C ;VBI SETUP XITVBV = $E462 ;VBLANK EXIT COLBK = $2C8 ;COLOR REGISTERS COLPF0 = $2C4 COLPF1 = $2C5 COLPF2 = $2C6 COLPF3 = $2C7 AUDC1 = $D201 ;AUDIO CONTROLS AUDC2 = $D203 AUDC3 = $D205 AUDC4 = $D207 AUDF1 = $D200 AUDF2 = $D202 AUDF3 = $D204 AUDF4 = $D206 AUDCTL = $D208 PRIOR = $026F ;P/M PRIOITY ATTRAC = $4D ;ATTRACT MODE DMACTL = $22F ;DMA CONTROL DLISTL = $230 ;DISP LIST POINTER GRACTL = $D01D ;GRAPHICS CONTROL NMIEN = $D40E ;INTERRUPT ENABLE PCOLR0 = $D012 ;P/M COLORS COLPM0 = $2C0 COLPM1 = $2C1 COLPM2 = $2C2 COLPM3 = $2C3 HPOSP0 = $D000 ;PLAYER HORIZ POSITIONS HPOSP1 = $D001 HPOSP2 = $D002 HPOSP3 = $D003 HPOSM0 = $D004 HPOSM1 = $D005 STICK = $278 ;JOYSTICK 1 ORG $2800 ;LOAD ADDRESS LOC $0800 ;EXECUTE ADDRESS ; ---------------------- ; DISPLAY LIST INTERRUPT ; ---------------------- DLI PHA ;SAVE ACCUM TXA ;SAVE X REGISTER PHA LDX DLICNT ;GET DLI NUMBER LDA ECOLOR,X ;AND RELATED COLOR STA WSYNC ;WAIT FOR SYNC STA $D015 ;AND SAVE COLOR INC DLICNT ;NEXT DLI PLA ;RESTORE X TAX PLA ;RESTORE ACCUM RTI ;ALL DONE!! ; ---------------------------- ; RELOCATE PROGRAM TO $800 ; (USED BY DISK VERSION ONLY!) ; ---------------------------- MOVEIT LDA #$2800/256 ;SET UP ORIGIN STA HI ;ADDRESS IN LDA #$2800&255 ;2-BYTE STA LO ;POINTER, LDA #$0800/256 ;SET UP DESTINATION STA BAHI ;ADDRESS IN LDA #$0800&255 ;2-BYTE STA BALO ;POINTER LDY #0 ;RESET Y REG MOVELP LDA (LO),Y ;MOVE A 256-BYTE STA (BALO),Y ;BLOCK USING THE INY ;Y REG. BNE MOVELP INC HI ;NEXT 256-BYTE INC BAHI ;BLOCK OF DATA LDA HI CMP #$40 ;DONE YET? BNE MOVELP ;NO, KEEP MOVING! JMP PFIRST ;ALL DONE, START GAME!! ; ------------------ ; MAIN PROGRAM START ; ------------------ PFIRST LDX #190 LDA #$0F ;GR.8 BDLOOP STA DLIST,X ;BUILD DISP LST DEX BNE BDLOOP LDA #$70 ;BLANK 8 LINES STA DLIST STA DLIST+1 STA DLIST+2 LDA #$4F ;LOAD MEM SCAN STA DLIST+3 STA DLIST+107 LDA #DISP/256 ;DISP ADDRESS STA DLIST+5 LDA #DISP&255 STA DLIST+4 LDA #DISP2/256 ;DISP 2 ADDRESS STA DLIST+109 LDA #DISP2&255 STA DLIST+108 LDA #$41 ;JVB STA DLIST+188 LDA #DLIST/256 ;DLIST ADDRESS STA DLIST+190 LDA #DLIST&255 STA DLIST+189 LDA #$8F ;DLI'S STA DLIST+31 STA DLIST+57 STA DLIST+118 STA DLIST+128 STA DLIST+138 LDA #1 ;IT'S OUR... STA FTIME ;FIRST TIME! PLANET CLD ;NO DECIMAL MODE! JSR $E465 ;SETUP SOUND REGS JSR CLSCRN ;CLEAR SCREEN LDA #0 ;ZERO OUT PAGE ZERO LDX #127 ;ONLY LAST 128 BYTES CLPAG0 STA $80,X ;CLEAR BYTE DEX ;MORE TO CLEAR? BPL CLPAG0 ;YUP! STA DMACTL ;SET ALL THESE STA NMIEN ;VARIABLES TO STA AUDCTL ;ZERO STA COLPF2 STA COLBK JSR PMCLR ;CLEAR P/M AREAS LDA #$FF ;SET UP ENGINE... LDX #5 ;TEMP DISPLAYS PSLOOP STA PL3+145,X ;IN PLAYER 3, STA PL3+155,X ;EACH 6 SCAN LINES STA PL3+165,X ;HIGH. DEX ;LOOP UNTIL DONE BPL PSLOOP ; -------------------------- ; INITIALIZE STARTING STATUS ; -------------------------- LDA #115 ;VOLCANO CHANCE STA VCHANC ;(+-45%) JSR RNDBAS ;RANDOM BASE LOCATION LDX #16 ;INITIALIZE THE ININUM LDA ININBR,X ;ESSENTIAL NUMERIC STA NUMBRS,X ;VALUES USING STA UNSNUM,X ;ININBR (INITIAL NUMBERS) DEX ;MORE TO MOVE? BPL ININUM ;YUP! LDA #$0A ;COLOR 1 WHITE STA COLPF1 LDA #$0F ;PLAYER 0 WHITE STA COLPM0 ;(SHIP) LDA #$04 ;PLAYER 1 GRAY STA COLPM1 ;(SHADOW) LDA #192 ;PLAYER 3 (ENGINE TEMPS) STA HPOSP3 ;HORIZONTAL POSITION LDA #DLI/256 ;SET UP DLI STA VDSLST+1 ;ADDRESS LDA #DLI&255 STA VDSLST LDA #DLIST&255 ;SET UP DISPLAY LIST STA DLISTL ;ADDRESS LDA #DLIST/256 STA DLISTL+1 LDA #PMAREA/256 ;SET UP PLAYER-MISSILE STA PMBASE ;ADDRESS LDX #VBI/256 ;SET UP VBI LDY #VBI&255 LDA #7 JSR SETVBV LDA #$3E ;TURN DMA ON STA DMACTL LDA #$3 ;ENABLE P/M STA GRACTL LDA #$C0 ;ENABLE INTERRUPTS STA NMIEN LDA #2 ;MAKE BORDER... STA COLOR ;COLOR 2 ; ------------------------ ; DRAW BORDER USING TABLES ; ------------------------ LDX #0 ;START WITH POINT #0 BDRLP STX SHTEMP ;SAVE INDEX LDA XHIGH,X ;GET X COORD HI PHA ;SAVE ON STACK LDA XLOW,X ;GET X COORD LOW PHA ;SAVE ON STACK LDA YLOW,X ;GET Y COORD PHA ;SAVE ON STACK LDA LINTYP,X ;PLOT? BEQ ITSPLT ;YUP! PLA ;PULL DRAW Y STA DRAWY ;AND STORE PLA ;PULL DRAW X LOW STA DRAWX ;AND STORE PLA ;PULL DRAW X HI STA DRXHI ;AND STORE JSR DRAW ;DRAW THE LINE JMP NXTBDR ;DO NEXT POINT ITSPLT PLA ;PULL PLOT Y STA PLOTY ;AND STORE PLA ;PULL PLOT X LOW STA PLOTX ;AND STORE PLA ;PULL PLOT X HI STA PLXHI ;AND STORE JSR PLOTCL ;PLOT THE POINT NXTBDR LDX SHTEMP ;RETRIEVE INDEX INX ;NEXT POINT CPX #15 ;DONE? BNE BDRLP ;NO! ; ------------------------------- ; NOW SET UP CHARACTERS ON SCREEN ; ------------------------------- LDX #73 ;74 CHARACTERS SETCH STX CHINDX ;SAVE INDEX LDA XP,X ;GET CHAR X POS STA CHARX ;AND SAVE LDA YP,X ;GET CHAR Y POS STA CHARY ;AND SAVE LDA CH,X ;GET CHAR # STA CHARNO ;AND SAVE JSR SHONUM ;SHOW THE CHARACTER LDX CHINDX ;GET INDEX, DEX ;MORE CHARACTERS? BPL SETCH ;YOU BET! SHOWEM LDA RANDOM ;GET RANDOM #, AND #$1F ;LIMIT TO 31 AND CLC ;ADD 40 TO GET RANGE ADC #40 ;OF 40-71 STA SHIPY ;STORE IT. LDA RANDOM ;REPEAT FOR Z AND #$1F CLC ADC #40 STA SHIPZ LDA #0 ;NOW WE ZERO OUT LDX #5 ;ALL THE ENGINE CLTEMP STA TEMP1,X ;TEMPERATURES (COOL) DEX BPL CLTEMP STA SIGNS ;AND ZERO THE STA SIGNS+1 ;SIGN VARIABLES STA SIGNS+2 STA SIGNS+3 LDA #$C4 ;ENGINE COLORS ALL GREEN STA ECOLOR+2 STA ECOLOR+3 STA ECOLOR+4 LDA #121 ;INIT RADIATION STA RADLVL ;LEVEL TO LOW LDA #$0F ;AND SHOW WITH STA PL3+121 ;PLAYER 3 LDA #0 ;NEXT WE ERASE ANY LDX #47 ;OTHER RADIATION CLRAD STA PL3,X ;GRAPHICS IN PLAYER 3 INX CPX #122 ;ALL CLEAR? BCC CLRAD ;NOT YET! JSR SHOALT ;SHOW ALTITUDE, JSR SHOXV ;X VELOCITY, JSR SHOYV ;Y VELOCITY JSR SHOZV ;Z VELOCITY JSR SHOFUL ;FUEL JSR SHOSHP ;SHIPS LEFT JSR SHOSCO ;AND SCORE LDA #0 ;GRID TYPE 0... STA GRDTYP ;(HI ALTITUDE) JSR CLMESS ;CLEAR MESSAGE AREA JSR RNDGRD ;RANDOMIZE LAND GRID JSR CLGRDA ;CLEAR GRID GRAPHICS AREA JSR GRID ;DRAW LAND GRID LDA FTIME ;FIRST TIME? BEQ MAINLN ;NO, CONTINUE DEC FTIME ;NO LONGER 1ST TIME, JMP RESTRT ;GO SHOW OPTIONS MAINLN LDA PAUSED ;PAUSED? BNE MAINLN ;YES, WE'RE PAUSED! LDA TIMER ;READY FOR PROCESSING? BEQ DOMESS ;YES! JMP CKCONS ;NO, CHECK CONSOLE DOMESS LDA #1 ;RESET TIMER STA TIMER ;TO 1/60 SEC STA ATTRAC ;NO ATTRACT MODE ; --------------------------- ; CHECK RADIATION LEVEL TIMER ; --------------------------- LDA NUMBRS ;OVER 30000 FT? CMP #3 BCC CKRTIM ;NO! LDA #0 ;YES, HIGH RAD! STA RADTIM CKRTIM LDA RADTIM ;READY FOR MORE RADIATION? BNE ADJALT ;NOT YET. LDA VOLRAD ;IS IT VOLCANO? BNE GOVOLR ;YES! LDX GRDTYP ;GET GRID TYPE (ALT) LDA RADINI,X ;IS THERE RADIATION? BEQ ADJALT ;NO RADIATION STA RADTIM ;RESET RADIATION TIMER GOVOLR LDA RADLVL ;GET RADIATION AMOUNT CMP #48 ;FATAL? BCS RADOK ;NO, WE'RE OK. JMP CRASH ;KABOOM!!! RADOK SEC ;ONE... SBC #1 ;MORE... STA RADLVL ;RADIATION UNIT! TAX ;USE AS INDEX, LDA #$0F ;AND SHOW ON SCREEN STA PL3,X ;USING PLAYER 3 LDA #0 ;RESET VOLCANO STA VOLRAD ;RADIATION FLAG ; --------------- ; ADJUST ALTITUDE ; --------------- ADJALT SED ;SET DECIMAL MODE LDA SIGNS ;ADD OR SUBTRACT? BEQ SUBALT ;SUBTRACT! JMP ADDALT ;ADD! JENDAJ JMP ENDAAJ SUBALT LDA ALTLOB ;GET ALT FRACTION BYTE SEC ;SUBTRACT SBC NUMBRS+4 ;X VELOCITY LO STA ALTLOB ;AND SAVE BACK LDA NUMBRS+2 ;GET ALT LO BYTE SBC NUMBRS+3 ;SUB XV MED STA NUMBRS+2 ;AND SAVE LDA NUMBRS+1 ;GET ALT MED BYTE SBC #0 ;SUB 0 & CARRY STA NUMBRS+1 ;AND SAVE LDA NUMBRS ;GET ALT HI BYTE SBC #0 ;SUB 0 & CARRY STA NUMBRS ;AND SAVE CMP #$90 ;NEGATIVE ALT? BCC JENDAJ ;NO, STILL IN AIR! ; ------------------------------- ; AT THIS POINT, WE'VE HIT GROUND ; ------------------------------- CLD ;NO MORE DECIMAL MODE LDA NUMBRS+3 ;TALLY HIGH-ORDER ORA NUMBRS+6 ;VELOCITIES TO SEE ORA NUMBRS+8 ;IF ANY ARE >0 BNE CRASH ;TOO FAST! LDA NUMBRS+4 ;IS X VELOCITY CMP #$11 ;> 10 FEET/SEC? BCS CRASH ;YES! LDA NUMBRS+7 ;IS Y VELOCITY CMP #$06 ;>5 FEET/SEC? BCS CRASH ;YES! LDA NUMBRS+9 ;IS Z VELOCITY CMP #$06 ;>5 FEET/SEC? BCS CRASH ;YES! LDA TERRIX ;DID WE LAND CMP BASEIX ;ON THE BASE? BNE CRASH ;NO! LDX #1 ;SAFE LANDING LDY #14 ;AT 14TH SCREEN LINE JSR SHOMSG ;SHOW THE MESSAGE LDA #255 ;WAIT 255/60 STA TIMER ;(4.25) SECONDS LDELAY LDA TIMER ;TIME UP? BNE LDELAY ;NO, LOOP BACK LDX #3 FSHFLP ASL NUMBRS+12 ;MULT ROL NUMBRS+11 ;FUEL ROL NUMBRS+10 ;BY 10 DEX ;(THIS IS 4 SHIFTS BPL FSHFLP ;IN DECIMAL MODE) SED ;SELECT DECIMAL MODE LDX #2 CLC ADSCLP LDA NUMBRS+10,X ;ADD ADC NUMBRS+14,X ;FUEL X 10 TO STA NUMBRS+14,X ;SCORE DEX BPL ADSCLP CLD ;NO MORE DECIMAL JSR SHOSCO ;SHOW SCORE SCOTIM LDA #240 ;WAIT 4 SECS STA TIMER STWAIT LDA TIMER ;TIME UP? BNE STWAIT ;NO, WAIT MORE LDA VCHANC ;IS VOLC CHANCE CMP #255 ;AT MAXIMUM? BEQ GOAGIN ;YES! CLC ;NO, INCREMENT ADC #10 ;VOLCANO CHANCE STA VCHANC ;BY ABOUT 4% JSR RNDBAS ;GET NEW BASE LOC. GOAGIN JMP NEWLND ;AND START LANDING CYCLE CRASH LDA RADLVL ;WAS DEATH DUE CMP #47 ;TO RADIATION? BNE IMPCRS ;NO, DUE TO IMPACT LDX #5 ;POINT TO RAD MESSAGE BNE SHOCMS ;GO SHOW THE MESSAGE IMPCRS LDX #2 ;POINT TO IMPACT MSG SHOCMS LDY #14 ;14TH SCREEN LINE JSR SHOMSG ;SHOW THE MESSAGE! CRSHLP LDA SHPLRY ;CONVERT PLAYER Y SEC ;COORD TO GR.8 SBC #34 LDX #19 ;AND PUT IN ALL SCEXY STA EXYP,X ;EXPLOSION Y COORDS DEX BPL SCEXY LDA SHPLRX ;CONVERT PLAYER X SEC ;COORD TO GR.8 SBC #48 ASL A LDX #19 ;AND PUT IN ALL SCEXX STA EXXP,X ;EXPLOSION X COORDS DEX BPL SCEXX LDA #0 ;POSITION SHIP STA SHPLRX ;AND SHADOW STA SHPLRY ;OFF-SCREEN LDX #19 ;NOW RANDOMIZE SCEXIS LDA RANDOM ;EXPLOSION... ORA #$10 STA EXXI,X ;X INCREMENT, LDA RANDOM ORA #$10 STA EXYI,X ;Y INCREMENT, LDA #0 STA EXXA,X ;X ACCUMULATOR, STA EXYA,X ;Y ACCUMULATOR, LDA RANDOM ORA #$10 AND #$3F STA EXLV,X ;PIXEL LIFE. DEX BPL SCEXIS BMI SETEXT EXGO LDA TIMER ;TIME TO ADVANCE EXPL? BNE EXGO ;NOT YET! SETEXT LDA #1 ;IT'S TIME! STA TIMER ;RESET TIMER LDX #19 ;20 PIXELS EXLP STX TEMPCX ;SAVE INDEX LDA EXLV,X ;PIXEL ALIVE? BEQ JXDEC ;NO! LDA EXXP,X ;NOW WE ERASE OLD STA PLOTX ;PIXEL, SETTING UP LDA EXYP,X ;THE X AND Y STA PLOTY ;COORDINATES JSR PCALC ;GET ADDRESS OF PLOT LDY #0 LDA BMASK2,X ;MASK OFF PIXEL EOR (LO),Y STA (LO),Y ;AND ERASE IT! LDX TEMPCX ;GET INDEX BACK DEC EXLV,X ;DECREMENT LIFE BEQ JXDEC ;IT'S DEAD! LDA EXXI,X ;NOW MOVE PIXEL CLC ;IN X DIRECTION ADC EXXA,X STA EXXA,X PHP ;SAVE CARRY FLAG CPX #10 ;IF PIXEL >9, BCS ADEXX ;ADD INCREMENT PLP ;RESTORE CARRY LDA EXXP,X ;OTHERWISE, SBC #0 ;SUBTRACT IT! JMP STOEXX ;GO STORE RESULT JXDEC JMP EXDEC ADEXX PLP ;RESTORE CARRY LDA EXXP,X ;AND ADD ADC #0 ;THE CARRY FLAG STOEXX STA EXXP,X ;SAVE X POSITION CMP #192 ;IN DISPLAY WINDOW? BCS KILEXB ;TOO FAR RIGHT! CMP #10 ;OK ON LEFT? BCC KILEXB ;TOO FAR LEFT! STA PLOTX ;SAVE IN PLOT COORD. LDA EXYI,X ;INCREMENT Y POSITION CLC ADC EXYA,X STA EXYA,X LDA EXYP,X SBC #0 ;SUBTRACT INCREMENT (UP) STA EXYP,X ;SAVE IT CMP #10 ;ON SCREEN? BCC KILEXB ;OFF THE TOP! STA PLOTY ;SAVE IN PLOT COORD. JSR PCALC ;GET PLOT ADDRESS LDY #0 LDA BMASK2,X EOR (LO),Y STA (LO),Y ;AND PLOT PIXEL! EXDEC LDX TEMPCX ;MORE PIXELS? DEX BMI CHKEXF ;NO! JMP EXLP KILEXB LDX TEMPCX ;GET INDEX OF PIXEL LDA #0 ;AND ZERO OUT STA EXLV,X ;LIFE BYTE (IT'S DEAD) BEQ EXDEC ;DO NEXT PIXEL CHKEXF LDX #19 ;TALLY ALL LIFE LDA #0 ;INDICATORS ACCUEX ORA EXLV,X DEX BPL ACCUEX CMP #0 ;ANY ALIVE? BEQ EXDONE ;NO, EXPLOSION DONE! JMP EXGO ;YES, DO MORE EXDONE LDA #255 ;WAIT 255/60 (4.25) SECS STA TIMER CTIMWT LDA TIMER ;TIME UP? BNE CTIMWT ;NO, WAIT MORE DEC NUMBRS+13 ;ONE LESS SHIP BMI OUTSHP ;NO MORE SHIPS! JMP NXTSHP ;GO DO NEXT SHIP OUTSHP LDX #0 ;GAME OVER MESSAGE LDY #14 ;14TH LINE ON SCREEN JSR SHOMSG ;SHOW THE MESSAGE RESTRT LDA KEY ;GET KEYBOARD KEY CMP #$12 ;IS IT A "C"? BNE NOCTGL ;NO TOGGLE LDX COLORS+1 ;SWAP COLORS 1 & 2 LDA COLORS+2 STA COLORS+1 STX COLORS+2 LDA #$FF ;CANCEL KEY STA KEY JMP PFIRST ;REDRAW SCREEN NOCTGL LDX #8 ;TITLE LDY #30 ;30TH LINE JSR SHOMSG LDX #9 ;AUTHOR LDY #45 ;45TH LINE JSR SHOMSG LDX #10 ;MAGAZINE LDY #55 ;55TH LINE JSR SHOMSG LDX GRAVTY ;GET GRAVITY INDEX LDA GCHAR,X ;GET L/M/H STA GRVMSG+15 ;PUT IN MESSAGE LDX #7 ;GRAVITY LDY #75 ;75TH LINE JSR SHOMSG LDA IFUEL1 ;GET FUEL CHAR1 ORA #$10 ;GET CHARACTER OFFSET STA IFUMSG+12 ;PUT IN FUEL MESSAGE LDA IFUEL2 ;GET FUEL CHAR2 ORA #$10 ;GET CHARACTER OFFSET STA IFUMSG+13 ;PUT IN FUEL MESSAGE LDX #6 ;FUEL LDY #85 ;85TH LINE JSR SHOMSG RSTTIM LDA TIMER ;CONSOLE TIME READY? BNE RSTTIM ;NOT YET LDA CONSOL ;GET CONSOLE KEY CMP #7 ;ANY PRESSED? BEQ RESTRT ;NO! CMP #6 ;START KEY? BEQ RESTCK ;YES! RESTART CMP #3 ;OPTION KEY? BNE NOTOPT ;NO, IT'S SELECT! LDA GRAVTY ;GET GRAVITY CLC ;ADD 1 TO GET NEXT ADC #1 ;GRAVITY LEVEL CMP #3 ;BEYOND 0-2? BNE STGRAV ;NO, STORE IT. LDA #0 ;WRAP TO 0 STGRAV STA GRAVTY ;STORE GRAVITY JMP CDELAY ;AND DEBOUNCE CONSOLE NOTOPT LDA IFUEL2 ;INCREMENT FUEL CLC ;AMOUNT (5000-14000) ADC #1 STA IFUEL2 CMP #10 BNE CKFLIM LDA #0 STA IFUEL2 LDA IFUEL1 CLC ADC #1 STA IFUEL1 CKFLIM LDA IFUEL1 ;FUEL > 9000? BEQ CDELAY ;NO, GO DEBOUNCE CONSOLE LDA IFUEL2 CMP #5 ;FUEL = 15000? BNE CDELAY ;NO LDA #0 ;RESET FUEL TO 5000 STA IFUEL1 CDELAY LDA #30 ;WAIT 30/60 (1/2) SEC STA TIMER JMP RESTRT ;KEEP CHECKING CONSOLE RESTCK LDA CONSOL ;CONSOLE RELEASED? CMP #7 BNE RESTCK ;NOT RELEASED, WAIT LDA IFUEL1 ;GET SELECTED FUEL STA ININBR+10 ;AND PLACE IN LDA IFUEL2 ;INITIAL NUMBER ASL A ;TABLE FOR PROPER ASL A ;INITIAL FUEL ASL A ASL A STA ININBR+11 JMP PLANET ;RESTART GAME NXTSHP JSR SHOSHP ;SHOW # OF SHIPS NEWLND LDX #12 ;NOW WE MUST REINI LDA ININBR,X ;RE-INITIALIZE STA NUMBRS,X ;ALL VITAL NUMBERS STA UNSNUM,X ;AND UNSIGNED NUMBERS DEX BPL REINI JMP SHOWEM ;AND RESTART LANDING ADDALT LDA ALTLOB ;THIS ROUTINE CLC ;ADDS OUR X VELOCITY ADC NUMBRS+4 ;TO THE ALTITUDE STA ALTLOB ;WHEN WE'RE GOING UP. LDA NUMBRS+2 ADC NUMBRS+3 STA NUMBRS+2 LDA NUMBRS+1 ADC #0 STA NUMBRS+1 LDA NUMBRS ADC #0 STA NUMBRS ENDAAJ CLD ;NO MORE DECIMAL MODE JSR SHOALT ;SHOW ALTITUDE JSR SHCALC ;SHIP CALCS. LDX #0 ;FIND THE SCALE LDA NUMBRS ;OF THE LANDING GRID BNE GOTSIZ ;BASED ON OUR ALTITUDE LDX #2 CKSIZE LDA NUMBRS+1 ;COMPARE ALTITUDE TO CMP GRDLIM,X ;GRID SCALE LIMITS BCC GOTSIZ DEX BNE CKSIZE GOTSIZ CPX GRDTYP ;SAME SCALE AS PREVIOUS? BEQ DOGRAV ;YUP! BCS GODOWN ;NO, WE'RE GOING DOWN! STX GRDTYP ;SAVE NEW GRID TYPE LDA #1 ;GET RID OF SHIP STA NOSPOS ;TEMPORARILY LDA SHIPY ;CALCULATE NEW JSR CSCUP ;SHIP Y COORD LDA GYP,X ASL A ASL A ASL A ASL A CLC ADC RESULT STA SHIPY LDA SHIPZ ;AND NEW Z COORD JSR CSCUP LDA GZP,X ASL A ASL A ASL A ASL A CLC ADC RESULT STA SHIPZ JMP GENGRD ;GENERATE NEW GRID GODOWN STX GRDTYP ;SAVE NEW GRID TYPE LDA #1 ;GET RID STA NOSPOS ;OF SHIP LDA SHIPY ;CALCULATE NEW JSR CSCDN ;SHIP Y COORD STA SHIPY TYA LDX GRDTYP STA GYP-1,X LDA SHIPZ ;AND SHIP Z COORD JSR CSCDN STA SHIPZ TYA LDX GRDTYP STA GZP-1,X GENGRD JSR CLGRDA ;CLEAR GRID AREA JSR RNDGRD ;RANDOMIZE NEW GRID JSR GRID ;AND DRAW GRID DOGRAV LDA UNSNUM+3 ;HAS SHIP REACHED CMP #$05 ;TERMINAL VELOCITY? BEQ NOGRAV ;YES--DON'T ACCELLERATE SED ;GO TO DECIMAL MODE LDA UNSNUM+5 ;GET X VELOCITY CLC LDX GRAVTY ;GET GRAVITY INDEX 0-2 ADC GRAVS,X ;ADD PROPER GRAVITY STA UNSNUM+5 ;SAVE NEW XV STA NUMBRS+5 LDA UNSNUM+4 ADC #0 STA UNSNUM+4 STA NUMBRS+4 LDA UNSNUM+3 ADC #0 STA UNSNUM+3 STA NUMBRS+3 LDX #3 ;POINT TO XV LDY #0 ;SIGN INDEX JSR NEGHAN ;CHECK FOR NEGATIVE NOGRAV JSR SHOXV ;SHOW XV ON SCREEN RDSTIK LDX STICK ;GET STICK POSITION STX STKHLD ;SAVE IT LDA ENGIX,X ;THRUSTING? BNE THRUST ;YUP! JADJYZ JMP ADJYZP ;ADJUST Y/Z POS THRUST LDA NUMBRS+10 ;TALLY FUEL ORA NUMBRS+11 ORA NUMBRS+12 BNE GOFUEL ;WE'VE GOT FUEL LDA SSTATS ;DID WE ALREADY DO AND #1 ;OUT-OF-FUEL SOUND? BNE NOFUEL ;YES! LDA SSTATS ;SET OUT-OF-FUEL FLAG ORA #1 STA SSTATS LDA #255 ;LOW PITCH STA AUDF3 ;IN SOUND 3 LDA #20 ;20/60 (1/3) SEC STA SNDCNT ;SOUND DURATION LDX #4 ;OUT OF FUEL MESSAGE LDY #14 ;14TH SCREEN LINE JSR SHOMSG ;SHOW MESSAGE NOFUEL JMP NOTHR ;DON'T THRUST (NO FUEL) GOFUEL LDA NUMBRS+10 ;FUEL>10000? BNE FUELOK ;YES, WE'RE OK LDA NUMBRS+11 CMP #$10 ;FUEL>999? BCS FUELOK ;YES, STILL OK LDA SSTATS ;HAVE WE DONE AND #2 ;FUEL LOW SOUND? BNE FUELOK ;YES, GO DO THRUST LDA SSTATS ;SET FUEL LOW FLAG ORA #2 STA SSTATS LDA #80 ;MEDIUM PITCH STA AUDF3 ;IN SOUND 3 LDA #20 ;20/60 (1/3) SEC STA SNDCNT ;SOUND DURATION LDX #3 ;FUEL LOW MESSAGE LDY #14 ;14TH SCREEN LINE JSR SHOMSG ;SHOW THE MESSAGE FUELOK LDY STKHLD ;GET STICK TO FIND LDX ENGIX,Y ;WHICH ENGINE'S FIRING LDY TEMPS-1,X ;GET ENGINE TEMPERATURE LDA ENGTHR,Y ;AND THRUST FOR THAT TEMP BEQ NOTHR ;ENGINE'S DEAD! CMP RANDOM ;ENGINE MAY BE FIRING BCS THROK ;IT IS! NOTHR JMP ADJYZP ;NO THRUST! THROK LDA #10 ;SET UP STA THRVOL ;THRUST VOLUME INC THRCNT ;ONLY ALLOW THRUST LDA THRCNT ;EVERY OTHER TIME AND #1 BNE JADJYZ ;NO THRUST! SED ;GO TO DECIMAL MODE LDA NUMBRS+12 ;AND SUBTRACT SEC ;2 UNITS SBC #2 ;FROM FUEL STA NUMBRS+12 LDA NUMBRS+11 SBC #0 STA NUMBRS+11 LDA NUMBRS+10 SBC #0 STA NUMBRS+10 CLD ;NO MORE DECIMAL MODE JSR SHOFUL ;SHOW THE NEW FUEL AMT. LDX STKHLD ;GET STICK FOR INDEX, LDA VAL,X ;AND GET AMOUNT STA VELADL ;TO ALTER VELOCITY, LDA VAH,X ;EITHER 1 OR -1 STA VELADH ;($01 OR $99) LDY FUELIX,X ;GET INDEX TO VELOCITIES CMP #$99 ;NEGATIVE VEL ALTER? BEQ CKNLIM ;YES LDA UNSNUM,Y ;AT MAXIMUM VELOCITY CMP #$05 ;OF 500 FT/SEC? BEQ ADJYZP ;YES! JMP ADDTHR ;GO ADD THE THRUST CKNLIM LDA UNSNUM,Y ;AT MINIMUM VELOCITY CMP #$95 ;OF -500 FT/SEC BNE ADDTHR ;NO! LDA UNSNUM+1,Y ;AT -500 FT/SEC? CMP #$00 BEQ ADJYZP ;YES! ADDTHR LDY FSIGNS,X ;GET VELOCITY DIRECTION LDA FUELIX,X ;AND VELOCITY INDEX TAX JSR ADDV ;ADD THE VELOCITY JSR SHOYV ;SHOW Y VELOCITY JSR SHOZV ;AND Z VELOCITY ; ------------------ ; ADJUST THE Y COORD ; ------------------ ADJYZP LDY #6 ;CONVERT YV JSR CVDBIN ;TO BINARY LDX GRDTYP ;GET GRID TYPE FOR SCALE LDY VELSHF,X ;AND DIVIDE BY SHFYLP LSR HI ;THE PROPER FACTOR ROR LO ;FOR THE GRID'S DEY ;MAGNIFICATION BNE SHFYLP LDA SIGNS+1 ;IS VELOCITY NEGATIVE? BNE SUBYV ;YES, SUBTRACT IT LDA SHIPYL ;ADD SHIP'S VELOCITY CLC ;TO THE SHIP'S ADC LO ;Y POSITION STA SHIPYL BCC CKYLIM INC SHIPY JMP CKYLIM ;AND CHECK LIMIT SUBYV LDA SHIPYL ;SUBTRACT VELOCITY SEC ;FROM THE SHIP'S SBC LO ;POSITION STA SHIPYL BCS CKYLIM DEC SHIPY CKYLIM LDA #0 ;NOT ON STA NEWGRD ;NEW GRID YET STA GRDDIR ;ZERO GRID DIRECTION LDA SHIPY ;IS SHIP Y CMP #180 ;< 0? BCS YLO ;YES! CMP #112 ;IS IT > 111? BCC NAVY ;NO, GO CHECK Z SEC ;ADJUST IT BACK SBC #112 ;DOWN WITHIN THE STA SHIPY ;Y LIMIT LDX GRDTYP ;NOW ADJUST THE BEQ SETGYI ;SHIP'S NAVIGATIONAL NXTGYI LDA GYP-1,X ;COORDINATES IF CLC ;WE'RE NOT ON ADC #1 ;GRID 0 (HIGHEST) CMP #7 BNE STGYI LDA #0 STA GYP-1,X DEX BNE NXTGYI BMI SETGYI STGYI STA GYP-1,X SETGYI INC NEWGRD ;GOING TO NEW GRID JMP NAVY ;GO ADJUST Z YLO CLC ;ADJUST Y UP ADC #112 ;BY 112 STA SHIPY LDX GRDTYP ;ADJUST NAVIGATIONAL BEQ SETGYD ;COORDINATES NXTGYD LDA GYP-1,X ;IF WE'RE NOT SEC ;ON GRID TYPE 0 SBC #1 BPL STGYD LDA #6 STA GYP-1,X DEX BNE NXTGYD BMI SETGYD STGYD STA GYP-1,X SETGYD INC NEWGRD ;GOING TO NEW GRID LDA #1 ;DIRECTION 1 STA GRDDIR NAVY LDX GRDTYP ;THIS ROUTINE FINDS LDA SHIPY ;THE SHIP'S "Y" LSR A ;NAVIGATIONAL POSITION LSR A LSR A LSR A STA GYP,X LDA #0 SYFINE INX CPX #3 BEQ NOSYF STA GYP,X BNE SYFINE NOSYF LDY #2 ;SHOW SHIP Y JSR SHOPOS ;NAVIGATIONAL POSITION ; --------------- ; NOW THE Z COORD ; --------------- LDY #8 ;THIS ROUTINE IS THE JSR CVDBIN ;SAME AS THE ABOVE LDX GRDTYP ;"Y" ROUTINE, EXCEPT LDY VELSHF,X ;THAT IT ADJUSTS THE SHFZLP LSR HI ;SHIP "Z" COORD. ROR LO DEY BNE SHFZLP LDA SIGNS+2 BNE SUBZV LDA SHIPZL CLC ADC LO STA SHIPZL BCC CKZLIM INC SHIPZ JMP CKZLIM SUBZV LDA SHIPZL SEC SBC LO STA SHIPZL BCS CKZLIM DEC SHIPZ CKZLIM LDA SHIPZ CMP #180 BCS ZLO CMP #112 BCC CKCONS SEC SBC #112 STA SHIPZ LDX GRDTYP BEQ SETGZI NXTGZI LDA GZP-1,X CLC ADC #1 CMP #7 BNE STGZI LDA #0 STA GZP-1,X DEX BNE NXTGZI BMI SETGZI STGZI STA GZP-1,X SETGZI INC NEWGRD LDA #2 ;DIRECTION 2 STA GRDDIR JMP CKCONS ZLO CLC ADC #112 STA SHIPZ LDX GRDTYP BEQ SETGZD NXTGZD LDA GZP-1,X SEC SBC #1 BPL STGZD LDA #6 STA GZP-1,X DEX BNE NXTGZD BMI SETGZD STGZD STA GZP-1,X SETGZD INC NEWGRD LDA #3 ;DIRECTION 3 STA GRDDIR CKCONS LDX GRDTYP ;FIND SHIP'S Z LDA SHIPZ ;NAVIGATIONAL LSR A ;COORDINATES LSR A LSR A LSR A STA GZP,X LDA #0 SZFINE INX CPX #3 BEQ NOSZF STA GZP,X BNE SZFINE NOSZF LDY #3 ;SHOW SHIP'S Z JSR SHOPOS ;NAVIGATIONAL POSITION LDA NEWGRD ;ARE WE ON NEW GRID? BEQ NONEWG ;NO JSR CLGRDA ;CLEAR GRID AREA LDX GRDDIR ;GET GRID DIRECTION AND LDY GDIX,X ;SAVE THE HEIGHTS OF LDA #7 ;THAT GRID SIDE. STA HOLD CGSIDE LDX HSAVE,Y LDA HEIGHT,X ;SAVE LDX HOLD STA HGTSAV,X ;SIDE'S DEY ;COORDS DEC HOLD BPL CGSIDE JSR RNDGRD ;RANDOMIZE NEW GRID LDX GRDDIR ;MOVE THE COORDINATES LDY GDIX,X ;WE JUST SAVED TO LDA #7 ;THE NEW GRID'S STA HOLD ;OPPOSITE SIDE RSTSID LDX HOLD LDA HGTSAV,X LDX HREST,Y STA HEIGHT,X DEY DEC HOLD BPL RSTSID JSR GRID ;DRAW THE GRID NONEWG LDA CONSOL ;ARE ANY CMP #7 ;CONSOLE KEYS PRESSED? BNE WTRELS ;YES, WAIT FOR RELEASE JMP MAINLN ;NO, KEEP PROCESSING WTRELS LDA CONSOL ;IS CONSOLE KEY CMP #7 ;RELEASED? BNE WTRELS ;NOT YET! JMP PFIRST ;RESTART GAME ; ----------------------- ; DESCENT SCALING ROUTINE ; ----------------------- CSCDN LDY #0 ;DIVIDE SHIP COORD CSCLP CMP #16 ;BY 16. PUT QUOTIENT BCC NOCADJ ;IN Y AND REMAINDER SEC ;IN ACCUMULATOR SBC #16 INY JMP CSCLP NOCADJ STA HOLD ;NOT MULT A BY 7 ASL A ;*2 CLC ADC HOLD ;*3 ASL A ;*6 ADC HOLD ;*7 RTS ;ALL DONE! ; ---------------------- ; ASCENT SCALING ROUTINE ; ---------------------- CSCUP STA RESULT ;DIVIDE SHIP COORD LDA #7 ;BY 7 STA DIVISR LDA #0 JSR DIVIDE LDX GRDTYP ;GET GRID TYPE RTS ;AND EXIT. ; ------------------------------ ; DECIMAL TO BINARY WORK ROUTINE ; ------------------------------ CVDBIN LDA NUMBRS+1,Y ;GET DECIMAL NUMBER AND #$0F ;MASK OFF LOW DIGIT STA LO ;SAVE LDA NUMBRS+1,Y ;GET DECIMAL LSR A ;MASK OFF HIGH DIGIT LSR A LSR A LSR A TAX ;PUT IN INDEX LDA LO ;GET PREVIOUS DIGIT CLC ;AND ADD ADC ALT1L,X ;DIGIT2 X 10 STA LO ;SAVE IT LDA NUMBRS,Y ;GET NEXT DECIMAL # AND #$0F ;MASK OFF LOW DIGIT TAX ;PUT IN INDEX LDA LO ;GET PREVIOUS RESULT CLC ;AND ADD ADC ALT2L,X ;DIGIT3 X 100 PART 1 STA LO ;SAVE IT LDA #0 ;AND CARRY ADC ALT2H,X ;DIGIT3 X 100 PART 2 STA HI ;AND SAVE IT RTS ;ALL DONE! ; -------------- ; SHOW SPACESHIP ; -------------- SHCALC NOP ; ------------------------------ ; CONVERT BCD ALTITUDE TO BINARY ; ------------------------------ LDA NUMBRS+2 ;SIMILAR TO ABOVE AND #$0F ;ROUTINE BUT WILL STA BALO ;WORK FOR 3 BCD DIGITS LDA #0 ;AND IS DEDICATED STA BAHI ;FOR ALTITUDE ONLY LDA NUMBRS+2 LSR A LSR A LSR A LSR A TAX LDA BALO CLC ADC ALT1L,X STA BALO LDA NUMBRS+1 AND #$0F TAX LDA BALO CLC ADC ALT2L,X STA BALO LDA BAHI ADC ALT2H,X STA BAHI LDA NUMBRS+1 LSR A LSR A LSR A LSR A TAX LDA BALO CLC ADC ALT3L,X STA BALO LDA BAHI ADC ALT3H,X STA BAHI LDA NUMBRS AND #$0F TAX LDA BALO CLC ADC ALT4L,X STA BALO LDA BAHI ADC ALT4H,X STA BAHI LSR BAHI ;DIVIDE ALT. BY ROR BALO ;4 LSR BAHI ROR BALO LDX GRDTYP ;NOW DIVIDE BY LDA GRDDIV,X ;GRID SCALING FACTOR STA DIVISR LDA BALO STA RESULT LDA BAHI JSR DIVIDE ;DO THE DIVISION ; ---------------------- ; CALC SHIP PLYR X COORD ; ---------------------- LDA SHIPZ ;0-111 LSR A ;DIVIDE BY 4 LSR A ;(NOW 0-27) STA SHTEMP ;SAVE IT LDA SHIPY ;0-111 LSR A ;/2 = 0-55 CLC ADC SHTEMP ;NOW 0-82 CLC ADC #56 ;ADD LEFT LIMIT STA SHPLRX ;GOT X POS. OF PLAYER! ; ---------------------- ; CALC SHIP PLYR Y COORD ; ---------------------- LDA SHIPZ ;0-111 LSR A ;NOW 0-55 STA SHTEMP ;SAVE IT LDA #201 ;BOTTOM OF GRID SEC SBC SHTEMP ;NOW 146-201 STA SHTEMP SEC ;NOW WE MUST SUBTRACT SBC RESULT ;SCALED ALTITUDE STA SHPLRY ;DONE! ; ------------------------------------ ; NOW ADJUST SHADOW HEIGHT FOR TERRAIN ; ------------------------------------ LDA SHIPY ;0-111 LSR A ;0-55 PHA ;SAVE ON STACK AND #7 ;MASK TO 0-7 STA SUBY LDA #7 ;NOW SUBTRACT SEC ;THIS FROM 7 SBC SUBY ;TO FLIP IT AROUND STA SUBY PLA ;GET SHIPY/2 AND #$F8 ;MASK OFF TOP 5 BITS STA TERRIX ;SAVE IN TERRAIN INDEX LDA SHIPZ ;0-111 LSR A ;0-55 PHA ;SAVE AND #7 ;MASK TO 0-7 STA SUBZ LDA #7 ;NOW SUBTRACT SEC ;THIS FROM 7 SBC SUBZ ;TO FLIP IT AROUND STA SUBZ PLA ;GET SHIPZ/2 LSR A ;DIVIDE BY 8 LSR A ;(/16 TOTAL) LSR A CLC ADC TERRIX ;AND ADD TO STA TERRIX ;TERRAIN INDEX ; --------------------- ; HIT VOLCANO ERUPTION? ; --------------------- CMP VOLIX ;IS SHIP OVER VOLCANO? BNE NOVHIT ;NO LDA VOLPX ;IS VOLCANO ACTIVE? BEQ NOVHIT ;NO LDA NUMBRS ;IS ALT>9999? BNE NOVHIT ;YES, NO VOLCANO HIT LDA NUMBRS+1 ;IS ALT>499? CMP #5 BCS NOVHIT ;YES, SHIP SAFE LDA #1 ;UH-OH, WE'VE GOT STA VOLRAD ;VOLCANO RADIATION!!! LDA #0 ;FORCE STA RADTIM ;VOLCANO RADIATION NOVHIT LDX TERRIX ;THIS ROUTINE GETS LDA HEIGHT,X ;THE HEIGHTS OF THE STA T1 ;CORNERS OF THE LDA HEIGHT+1,X ;TERRAIN WE'RE OVER STA T2 ;AND CALCULATES THE LDA SUBZ ;HEIGHT OF THE STA MULT2 ;PARTICULAR POINT JSR TERCAL ;UNDER OUR SHIP. STA T3 ;THIS ROUTINE IS VERY LDX TERRIX ;COMPLICATED, AND LDA HEIGHT+8,X ;SPACE DOES NOT PERMIT STA T1 ;IN-DEPTH DISCUSSION LDA HEIGHT+9,X ;OF THE TECHNIQUE. STA T2 LDA SUBZ STA MULT2 JSR TERCAL STA T2 LDA T3 STA T1 LDA SUBY STA MULT2 JSR TERCAL STA T3 LDA SHTEMP SEC SBC T3 STA SHADOY ;GOT SHADOW HEIGHT CMP SHPLRY ;SHIP BELOW SHADOW? BCS NOMTHT ;NO, SHIP'S AIRBORNE JMP CRASH ;SPLAT!!! NOMTHT RTS ;ALL DONE ; ------------------------- ; TERRAIN HEIGHT CALCULATOR ; ------------------------- TERCAL LDA T1 ;THIS SUBROUTINE CMP T2 ;IS USED BY THE ABOVE BCC TC1 ;SHADOW HEIGHT SEC ;ROUTINE TO FIND SBC T2 ;THE HEIGHT OF THE STA MULT1 ;GROUND AT A JSR MULT ;SPECIFIED POINT. LDA LRES LSR A LSR A LSR A CLC ADC T2 RTS TC1 LDA T2 SEC SBC T1 STA MULT1 LDA #8 SEC SBC MULT2 STA MULT2 JSR MULT LDA LRES LSR A LSR A LSR A CLC ADC T1 RTS ; -------------- ; RANDOMIZE BASE ; -------------- RNDBAS LDX #5 ;6 COORDS INBASE LDA RANDOM ;GET A NUMBER AND #7 ;FROM 0-6 CMP #7 ;IS IT 7? BEQ INBASE ;YES, DON'T ALLOW! STA BASEY,X ;STORE IN Y/Z POSITION DEX BPL INBASE LDA BASEY+2 ;NOW CALCULATE BASE ASL A ;GRID INDEX WITH THE ASL A ;FORMULA: ASL A CLC ;IX=BASEY*8+BASEZ ADC BASEZ+2 STA BASEIX LDY #0 ;SHOW BASE... JSR SHOPOS ;Y POSITION LDY #1 ;SHOW BASE... JSR SHOPOS ;Z POSITION RTS ;AND EXIT. ; ------------------------------- ; MULTIPLY ROUTINE ; ; THIS ROUTINE DOES AN UNSIGNED ; MULTIPLY OF THE VALUES IN MULT1 ; AND MULT2, PLACING THE RESULT ; IN HRES AND LRES. ; ------------------------------- MULT LDA #0 STA HRES LDX #8 MSHIFT ASL A ROL HRES ASL MULT1 BCC MLOOP CLC ADC MULT2 BCC MLOOP INC HRES MLOOP DEX BNE MSHIFT STA LRES RTS ; -------------------------------- ; DIVIDE ROUTINE ; ; THIS ROUTINE DIVIDES A 16-BIT ; NUMBER (LO 8 BITS IN RESULT, ; HI 8 BITS IN ACCUMULATOR) BY THE ; VALUE IN DIVISR. THE QUOTIENT IS ; PLACED IN RESULT. THE REMAINDER ; IS DISCARDED. ; -------------------------------- DIVIDE LDX #8 DIVL1 ASL RESULT ROL A CMP DIVISR BCC DIVL2 SBC DIVISR INC RESULT DIVL2 DEX BNE DIVL1 RTS ; --------------- ; ADD TO VELOCITY ; --------------- ADDV SED ;WANT DECIMAL MODE LDA UNSNUM+1,X ;ADD VELOCITY INCREMENT CLC ;AMOUNT TO VELOCITY ADC VELADL ;INDICATED BY STA UNSNUM+1,X ;X REGISTER. STA NUMBRS+1,X LDA UNSNUM,X ADC VELADH STA UNSNUM,X STA NUMBRS,X NEGHAN CMP #$50 ;IS IT NEGATIVE? BCS NEGVEL ;YES! LDA #0 ;SET SIGN TO 0 (+) STOSGN STA SIGNS,Y ;STORE SIGN CLD ;NO MORE DECIMAL RTS ;AND EXIT! NEGVEL LDA #0 ;SUBTRACT UNSIGNED SEC ;VELOCITY VALUE FROM SBC UNSNUM+1,X ;ZERO AND STORE IN STA NUMBRS+1,X ;SIGNED VALUE LDA #0 SBC UNSNUM,X STA NUMBRS,X LDA #1 ;PUT 1 (-)... BNE STOSGN ;IN SIGN ; ----------------------------- ; SHOW SHIP/OBJECTIVE POSITIONS ; ----------------------------- SHOPOS LDA PYPOS,Y ;GET Y POSITION STA CHARY ;OF MESSAGE LDX POSNIX,Y ;GET COORD INDEX LDY BASEY,X ;GET COORD DIGIT 1 LDA HI1,Y ;CONVERT COORD STA POSNUM ;TO DECIMAL LDA HI2,Y ;AND PLACE IN STA POSNUM+1 ;WORK VARIABLE LDY BASEY+1,X ;GET COORD DIGIT 2 LDA MED1,Y ;ADD DIGIT 2'S SED ;DECIMAL VALUE CLC ;TO WORK AREA ADC POSNUM+1 STA POSNUM+1 LDA POSNUM ADC #0 STA POSNUM LDA BASEY+2,X ;ADD DIGIT 3'S CLC ;DECIMAL VALUE ADC POSNUM+1 ;TO WORK AREA STA POSNUM+1 LDA POSNUM ADC #0 STA POSNUM CLD LDA #2 ;2 DIGITS TO STA DIGITS ;DISPLAY LDX #17 ;17TH IN "NUMBRS" JMP SHOALL ;SHOW THE NUMBER ; ------------- ; SHOW ALTITUDE ; ------------- SHOALT LDA #98 ;98TH SCREEN LINE STA CHARY LDA #3 ;3 DIGITS TO SHOW STA DIGITS LDX #0 ;0TH IN "NUMBRS" JMP SHOALL ;SHOW THE NUMBER ; --------------- ; SHOW X VELOCITY ; --------------- SHOXV LDA SIGNS ;GET 1ST SIGN JSR SHOARR ;SHOW ITS ARROW LDA #112 ;112TH SCREEN LINE STA CHARY LDA #2 ;2 DIGITS TO SHOW STA DIGITS LDX #3 ;3RD IN "NUMBRS" JMP SHOALL ;SHOW IT ; --------------- ; SHOW Y VELOCITY ; --------------- SHOYV LDA #2 ;GET 2ND SIGN CLC ADC SIGNS+1 JSR SHOARR ;SHOW ITS ARROW LDA #122 ;122ND SCREEN LINE STA CHARY LDA #2 ;2 DIGITS TO SHOW STA DIGITS LDX #6 ;6TH IN "NUMBRS" JMP SHOALL ;SHOW IT ; --------------- ; SHOW Z VELOCITY ; --------------- SHOZV LDA #4 ;GET 3RD SIGN CLC ADC SIGNS+2 JSR SHOARR ;SHOW ITS ARROW LDA #132 ;132ND SCREEN LINE STA CHARY LDA #2 ;2 DIGITS TO SHOW STA DIGITS LDX #8 ;8TH IN "NUMBRS" JMP SHOALL ;SHOW IT ; --------- ; SHOW FUEL ; --------- SHOFUL LDA #146 ;146TH SCREEN LINE STA CHARY LDA #3 ;3 DIGITS TO SHOW STA DIGITS LDX #10 ;10TH IN "NUMBRS" JMP SHOALL ;SHOW IT ; ---------- ; SHOW SHIPS ; ---------- SHOSHP LDA #160 ;160TH SCREEN LINE STA CHARY LDA #1 ;1 DIGIT TO SHOW STA DIGITS LDX #13 ;13TH IN "NUMBRS" JMP SHOALL ;SHOW IT ; ---------- ; SHOW SCORE ; ---------- SHOSCO LDA #170 ;170TH SCREEN LINE STA CHARY LDA #3 ;3 DIGITS TO SHOW STA DIGITS LDX #14 ;14TH IN "NUMBRS" ; ------------ ; SHOW NUMBERS ; ------------ SHOALL LDA #31 ;31ST CHAR ACROSS STA CHARX STX SNUMIX ;SAVE "NUMBRS" INDEX SNUMLP LDX SNUMIX ;GET INDEX LDA NUMBRS,X ;GET BCD VALUE JSR SHOBCD ;SHOW IT INC SNUMIX ;NEXT BCD VALUE DEC DIGITS ;1 LESS DIGIT BNE SNUMLP ;NOT FINISHED YET! RTS ;ALL DONE ; ---------------- ; BCD CHAR DISPLAY ; ---------------- SHOBCD STA SHOBYT ;SAVE BCD VALUE LSR A ;SHIFT RIGHT LSR A ;TO GET LSR A ;FIRST DIGIT LSR A ORA #$10 ;ADD CHAR. OFFSET STA CHARNO ;SAVE FOR DISPLAY JSR SHONUM ;AND DISPLAY IT INC CHARX ;NEXT POS. ON SCREEN LDA SHOBYT ;GET BCD BACK AND #$0F ;GET SECOND DIGIT ORA #$10 ;ADD CHAR OFFSET STA CHARNO ;SAVE FOR DISPLAY JSR SHONUM ;AND DISPLAY IT INC CHARX ;NEXT SCREEN POSITION RTS ;AND EXIT ; ----------- ; SHOW ARROWS ; ----------- SHOARR PHA ;SAVE ARROW # LSR A ;DIV BY 2 TAX ;USE FOR INDEX LDA ARRLO,X ;GET SCREEN ADDRESS STA DESTLO ;FOR THE ARROW LDA ARRHI,X ;AND SAVE ON STA DESTHI ;PAGE ZERO LDY #0 ;INITIALIZE COPY INDEX PLA ;GET ARROW # ASL A ;MULTIPLY BY 8 FOR ASL A ;OFFSET INTO ARROW ASL A ;GRAPHICS TABLE TAX ;SAVE INDEX LDA #7 ;THERE ARE 8 BYTES STA DIGITS ;IN EACH ARROW COPARR LDA ARROWS,X ;GET GRAPHICS DATA, STA (DESTLO),Y ;PUT ON SCREEN INX ;NEXT ARROW BYTE TYA ;ADD 40 TO Y REGISTER CLC ;TO POINT TO NEXT ADC #40 ;GRAPHICS 8 LINE TAY ;(40 BYTES PER LINE) DEC DIGITS ;MORE ARROW DATA? BNE COPARR ;YES, KEEP COPYING RTS ;ALL DONE ; -------------- ; CLEAR P/M AREA ; -------------- PMCLR LDA #0 ;PUT ZEROS IN TAY ;ALL 256 POSITIONS PMCLP STA MISSLS,Y ;OF MISSILES, STA PL0,Y ;PLAYER 0 STA PL1,Y ;PLAYER 1 STA PL2,Y ;PLAYER 2 STA PL3,Y ;PLAYER 3 DEY ;DONE? BNE PMCLP ;NOT YET RTS ;EXIT ; ------------ ; CLEAR SCREEN ; ------------ CLSCRN LDX #29 ;CLEAR 30*256 BYTES LDA #DISP/256 ;PUT DISPLAY STA HI ;ADDRESS IN LDA #0 ;PAGE ZERO STA LO ;WORK AREA CLSLP1 TAY ;ZERO Y REGISTER CLSLP2 STA (LO),Y ;CLEAR A BYTE DEY ;DONE WITH 256? BNE CLSLP2 ;NOPE! DEX ;DONE WITH 30? BNE NXTCLR ;NOPE! RTS ;ALL DONE! NXTCLR INC HI ;NEXT 256-BYTE GROUP BNE CLSLP1 ;LOOP BACK ; ------------------------- ; CLEAR GRID AREA OF SCREEN ; ------------------------- CLGRDA LDA #0 ;POINT TO 100TH LINE STA SHPLRX ;OF SCREEN LDA #[DISP+2+100*40]/256 STA HI LDA #[DISP+2+100*40]&255 STA LO LDX #72 ;CLEAR 72 GROUPS CGRDL1 LDY #21 ;OF 22 BYTES LDA #0 CGRDL2 STA (LO),Y ;CLEAR A BYTE DEY ;DONE WITH 22? BPL CGRDL2 ;NOT YET! DEX ;DONE 72 GROUPS? BNE NXTCGD ;NOPE! RTS ;ALL DONE! NXTCGD LDA LO ;POINT TO NEXT LINE CLC ;OF SCREEN ADC #40 ;(40 BYTES IN GR.8) STA LO BCC CGRDL1 INC HI BNE CGRDL1 ; ------------------ ; CLEAR MESSAGE AREA ; ------------------ ; POINT TO 14TH LINE OF SCREEN CLMESS LDA #[DISP+2+14*40]/256 STA HI LDA #[DISP+2+14*40]&255 STA LO LDX #8 ;CLEAR 8 GROUPS CMESS1 LDY #21 ;OF 22 BYTES LDA #0 CMESS2 STA (LO),Y ;CLEAR A BYTE DEY ;DONE 22 BYTES? BPL CMESS2 ;NOT YET! DEX ;DONE 8 GROUPS? BNE NXTCMS ;NOPE! RTS ;ALL DONE NXTCMS LDA LO ;ADVANCE 40 BYTES CLC ;TO NEXT SCREEN LINE ADC #40 STA LO BCC CMESS1 INC HI BNE CMESS1 ; ------------ ; SHOW MESSAGE ; ------------ SHOMSG STY CHARY ;SET SCREEN LINE LDY MSGIX,X ;POINT TO MESSAGE TEXT LDA #2 ;2ND CHAR ON SCREEN STA CHARX LDX #22 ;22 CHARACTERS TO SHOW STX MSGCT STY MSGPTR MSGLP LDX MSGCT ;GET COUNT IN MESSAGE LDY MSGPTR ;POINT TO MESSAGE CHAR LDA MESSGE,Y ;GET CHARACTER STA CHARNO ;GET READY TO SHOW IT JSR SHONUM ;SHOW IT! DEC MSGCT ;LAST CHARACTER? BNE NXTMBT ;NOT YET! RTS ;ALL DONE NXTMBT INC CHARX ;NEXT X POSITION INC MSGPTR ;NEXT CHAR BNE MSGLP ;LOOP BACK ; -------------------------- ; GRAPHICS 8 CHAR. GENERATOR ; -------------------------- SHONUM LDA CHARY STA LO ;SAVE Y POS LDA #0 STA HI ASL LO ;*2 ROL HI ASL LO ;*4 ROL HI ASL LO ;*8 ROL HI LDA LO CLC ADC #DISP&255 ;ADD DISPLAY START STA DESTLO LDA HI ADC #DISP/256 STA DESTHI ASL LO ;*16 ROL HI ASL LO ;*32 ROL HI LDA LO CLC ADC DESTLO ;GET CHARACTER'S STA DESTLO ;SCREEN ADDRESS LDA HI ADC DESTHI STA DESTHI LDA DESTLO ;ADD X OFFSET CLC ;FOR FINAL ADDRESS ADC CHARX STA DESTLO BCC NODHIN INC DESTHI NODHIN LDA CHARNO ;GET OFFSET INTO STA LO ;CHARACTER SET LDA #0 STA HI STA COPCNT ;ZERO COPY COUNT ASL LO ;*2 ROL HI ASL LO ;*4 ROL HI ASL LO ;*8 ROL HI LDA HI ;GET INFORMATION CLC ;FROM O.S. CHARACTER ADC #$E0 ;SET AT $E000 STA HI COPNUM LDY COPCNT LDA (LO),Y ;GET CHAR. IMAGE BYTE LDY #0 STA (DESTLO),Y ;PUT ON SCREEN INC COPCNT ;NEXT CHARACTER BYTE LDA COPCNT ;ARE ALL 8 BYTES CMP #8 ;IN CHARACTER MOVED? BEQ FINISH ;YES! LDA DESTLO ;ADD 40 BYTES TO CLC ;POINT TO NEXT LINE ADC #40 ;ON SCREEN STA DESTLO BCC COPNUM INC DESTHI BNE COPNUM FINISH RTS ;ALL DONE! ; ---------------------- ; RANDOMIZE GRID HEIGHTS ; ---------------------- RNDGRD LDX #63 ;64 POINTS ON GRID LDY GRDTYP ;GET GRID TYPE RGLP LDA RANDOM ;GET RANDOM NUMBER BUT AND #$0F ;LIMIT IT TO THE CMP MAXHGT,Y ;MAXIMUM HEIGHT BCS RGLP ;OF THE GRID TYPE STA HEIGHT,X ;SAVE HEIGHT DEX ;DONE? BPL RGLP ;NO! RTS ;ALL DONE, EXIT ; ------------- ; DRAW THE GRID ; ------------- GRID CLD LDA #0 STA VOLPX ;NO VOLCANO LDX #0 ;CLEAR OUT TXA ;PLAYER 2 CP2LP STA PL2,X DEX BNE CP2LP LDX GRDTYP ;GRID TYPE 0 (HIGH)? BEQ GOTBAS ;YES, SHOW BASE LDX #0 ;COMPARE SHIP'S BASCHK LDA GYP,X ;GRID POSITIONS CMP BASEY,X ;TO BASE'S. BNE NOBASE LDA GZP,X CMP BASEZ,X ;IF THEY'RE NOT EQUAL, BNE NOBASE ;DON'T SHOW BASE! INX CPX GRDTYP BNE BASCHK GOTBAS LDX GRDTYP ; ----------------- ; CALC BASE X COORD ; ----------------- LDA BASEZ,X ;THIS ROUTINE IS ASL A ;SIMILAR TO THE ASL A ;SHIP PLAYER POSITION STA SHTEMP ;CALCULATOR ABOVE. LDA BASEY,X ;IT FINDS THE VOLCANO'S ASL A ;P/M COORDINATES. ASL A ASL A CLC ADC SHTEMP CLC ADC #61 STA HPOSP2 ; ----------------- ; CALC BASE Y COORD ; ----------------- LDA BASEZ,X ASL A ASL A ASL A STA SHTEMP LDA #196 SEC SBC SHTEMP TAY ; ---------------- ; COPY BASE SYMBOL ; ---------------- LDX #4 ;5 BYTES IN BASE PIC. BSCOPY LDA BASPIC,X ;GET BASE PICTURE BYTE STA PL2,Y ;PUT IN PLAYER 2 INY ;NEXT PLAYER BYTE DEX ;NEXT IMAGE BYTE BPL BSCOPY ;COPY ALL 5 BYTES! ; ------------------------ ; MAKE BASE ZERO HEIGHT IF ; WE'RE ON FINAL APPROACH ; ------------------------ LDX GRDTYP ;IF GRID IS NOT CPX #2 ;TYPE 2 (LOW)... BNE NOBASE ;LEAVE TERRAIN ALONE! LDX BASEIX ;OTHERWISE WE MUST LDA #0 ;MAKE THE 4 CORNERS NEWHGT STA HEIGHT,X ;OF THE LANDING GRID STA HEIGHT+1,X ;ALL ZERO HEIGHT! STA HEIGHT+8,X STA HEIGHT+9,X JMP NOVOLC ;AND BYPASS NEXT CODE. ; -------------------------------- ; IF THERE'S NO BASE, LET'S TRY TO ; PLACE A DANGEROUS VOLCANO! ; -------------------------------- NOBASE LDA GRDTYP ;ARE WE AT LOW ALT... CMP #2 ;(GRID TYPE 2)? BNE NOVOLC ;NO, NO VOLCANO! LDA RANDOM ;GET RANDOM # CMP VCHANC ;IS IT > VOLCANO CHANCE? BCS NOVOLC ;YES, NO VOLCANO! VOLCZ LDA RANDOM ;GET RANDOM VOLCANO AND #7 ;Y AND Z COORDINATES CMP #5 ;FROM 1-5 BCS VOLCZ CLC ADC #1 STA VOLZ VOLCY LDA RANDOM AND #7 CMP #5 BCS VOLCY CLC ADC #1 STA VOLY ;NOW GET VOLCANO ASL A ;POSITION INDEX ASL A ASL A CLC ADC VOLZ STA VOLIX ; -------------------------- ; CALC VOLCANO PLAYER COORDS ; -------------------------- LDA VOLZ ;THIS ROUTINE IS ASL A ;SIMILAR TO THE BASE ASL A ;PLAYER POSITION STA SHTEMP ;ROUTINE. IT USES LDA VOLY ;VOLY & VOLZ TO ASL A ;CALCULATE THE ASL A ;VOLCANO'S PLAYER ASL A ;COORDINATES. CLC ADC SHTEMP CLC ADC #59 STA VOLPX LDA VOLZ ASL A ASL A ASL A STA SHTEMP LDA #186 SEC SBC SHTEMP STA VOLPY LDX VOLIX ;NOW SET THE 4 CORNERS LDA #7 ;OF THE VOLCANO TO JMP NEWHGT ;HEIGHT 7. NOVOLC LDA #1 ;SELECT PLOT COLOR STA COLOR LDA #16 ;SET PLOT X OFFSET STA XOFSET ; -------------------------------- ; THE FOLLOWING CODE TAKES THE ; HEIGHT VALUES FROM THE "HEIGHT" ; TABLE AND PLOTS THE GRID ON THE ; SCREEN. ; -------------------------------- LDA #0 STA PLXHI STA DRXHI STA HGTIX STA X NEXTX1 LDA #0 ;ZERO Y INDEX STA Y TAY ;PLOT FLAG NEXTY1 LDA XOFSET ;GET X POSITION CLC ADC X STA PLOTX,Y ;STORE IN PLOTX/DRAWX LDA #170 ;GET Y POSITION SEC SBC Y SEC LDX HGTIX SBC HEIGHT,X ;SUBTRACT GRID HEIGHT STA PLOTY,Y ;STORE IN PLOTY/DRAWY LDA Y ;DRAWING? BNE DRWIT1 ;YES! JSR PLOTCL ;PLOT THE POINT JMP ENDRW1 ;DO NEXT POINT DRWIT1 JSR DRAW ;DRAW TO THE POINT ENDRW1 LDA XOFSET ;ADD 8 TO X OFFSET CLC ADC #8 STA XOFSET INC HGTIX ;NEXT HEIGHT VALUE LDY #1 ;NOW DRAW LDA Y ;ADD 8 TO Y INDEX CLC ADC #8 STA Y CMP #57 ;PAST LIMIT? BCC NEXTY1 ;NO, LOOP BACK. LDA #16 ;RESET X OFFSET STA XOFSET LDA X ;AND INCREMENT X CLC ;FOR NEXT GRID LINE ADC #16 STA X CMP #113 ;PAST LIMIT? BCC NEXTX1 ;NO, LOOP BACK. ; ------------------------------ ; NOW DO OTHER DIRECTION OF GRID ; ------------------------------ LDA #0 ;ZERO OUT Y STA Y LDA #$FF ;SET INDEX TO -1 STA INDEX NEXTY2 INC INDEX ;NEXT INDEX LDA INDEX STA HGTIX ;SAVE IN HEIGHT INDEX LDA #0 ;ZERO OUT X STA X TAY ;SET Y REG FOR PLOT NEXTX2 LDA XOFSET ;FIND X POSITION CLC ADC X STA PLOTX,Y ;STORE IN PLOTX/DRAWX LDA #170 ;GET Y POSITION SEC SBC Y LDX HGTIX SEC SBC HEIGHT,X ;ADJUST FOR HEIGHT STA PLOTY,Y ;STORE IN PLOTY/DRAWY LDA X ;PLOTTING? BNE DRWIT2 ;NO, DRAW IT. JSR PLOTCL ;PLOT THE POINT JMP ENDRW2 ;GO DO NEXT POINT DRWIT2 JSR DRAW ;DRAW TO THE POINT ENDRW2 LDA HGTIX ;NEXT HEIGHT VALUE CLC ADC #8 STA HGTIX LDY #1 ;NOW DRAWING LDA X ;NEXT X POSITION CLC ADC #16 STA X CMP #113 ;PAST LIMIT? BCC NEXTX2 ;NO LDA XOFSET ;NEXT X OFFSET VALUE CLC ADC #8 STA XOFSET LDA Y ;NEXT Y VALUE CLC ADC #8 STA Y CMP #57 ;PAST LIMIT? BCC NEXTY2 ;NO, LOOP RTS ;ALL DONE. ; -------------- ; VERTICAL BLANK ; -------------- VBI CLD ;NO DECIMAL MODE! LDA #0 ;RESET DLI INDEX STA DLICNT ; --------------- ; CHECK FOR PAUSE ; --------------- LDA KEY ;GET KEYBOARD KET CMP #$21 ;SPACE BAR? BNE PCHK ;NO LDA PAUSED ;FLIP THE EOR #$FF ;PAUSE STATUS STA PAUSED LDA #$FF ;RESET KEYPRESS STA KEY PCHK LDA PAUSED ;WE PAUSED? BEQ NOPAU ;NO JMP XITVBV ;PAUSED, NO PROCESSING! NOPAU LDA COLPM3 ;CYCLE CLC ;RADIATION ADC #1 ;COLOR AND #$07 ;BRIGHTNESS ORA #$30 STA COLPM3 LDA TIMER ;HANDLE BEQ NOTDEC ;GENERAL TIMER DEC TIMER NOTDEC LDA RADTIM ;HANDLE BEQ NORDEC ;RADIATION TIMER DEC RADTIM NORDEC LDA VOLPX ;VOLCANO? BEQ FLSHP2 ;NOPE STA HPOSP2 ;POSITION PLAYER 2 LDA RANDOM ;DO RANDOM AND RANDOM ;ERUPTION GRAPHICS LDY VOLPY STA PL2,Y STA PL2+4,Y LDA RANDOM AND RANDOM STA PL2+2,Y LDA RANDOM AND #$3C STA PL2+6,Y LDA #$3A STA COLPM2 BNE NOPFLS ;NO PAD FLASH FLSHP2 INC PFLASH ;INCREMENT LDA PFLASH ;PAD FLASH TIMER AND #$0F BNE NOPFLS ;NO FLASH YET INC PFLIX ;FLIP FLASH COLOR INDEX LDA PFLIX AND #1 TAX ;USE FOR INDEX LDA PCOLRS,X ;GET PAD COLOR STA COLPM2 ;PUT IN PLAYER 2 COLOR NOPFLS LDX LASTSY ;NOW WE ERASE LDA #$FC ;THE OLD SHIP... AND MISSLS,X STA MISSLS,X LDA #$FC AND MISSLS+1,X STA MISSLS+1,X LDX LSHADY ;AND SHADOW LDA #$F3 AND MISSLS,X STA MISSLS,X LDA #$F3 AND MISSLS+1,X STA MISSLS+1,X LDA SHPLRX ;POSITION STA HPOSM0 ;THE SHIP STA HPOSM1 ;AND SHADOW LDX SHPLRY STX LASTSY ;SAVE POSITION, LDA #$02 ;DRAW SHIP... ORA MISSLS,X STA MISSLS,X LDA #$02 ORA MISSLS+1,X STA MISSLS+1,X LDX SHADOY ;AND SHADOW STX LSHADY LDA #$08 ORA MISSLS,X STA MISSLS,X LDA #$08 ORA MISSLS+1,X STA MISSLS+1,X LDA #130 ;SET UP THRUST STA AUDF1 ;FREQUENCY 1 LDA #8 STA AUDF2 ;AND 2 LDA THRVOL ;GET THRUST VOLUME STA AUDC1 ;STORE IN AUDIO 1 LSR A ;DIVIDE BY 8 LSR A LSR A STA AUDC2 ;AND PUT IN AUDIO 2 INC THRTIM ;TIME TO DECREMENT LDA THRTIM ;THRUST VOLUME? AND #7 BNE DOTEMP ;NOT YET LDA THRVOL ;IS VOLUME 0? BEQ DOTEMP ;YES, DON'T CHANGE! DEC THRVOL ;LESS VOLUME! DOTEMP LDX STICK ;GET STICK LDA ENGIX,X ;AND ENGINE NUMBER STA STKPOS ;IS ENGINE BEING USED? BEQ COOLIT ;NO, COOL ALL ENGINES TAX DEX LDA TEMP2,X ;GET ENGINE TEMP CMP #$18 ;IS ENGINE DEAD? BCS COOLIT ;YES, DON'T HEAT MORE! LDA TEMP1,X ;INCREMENT THE CLC ;TEMPERATURE. ADC #1 STA TEMP1,X LDA TEMP2,X ADC #0 STA TEMP2,X JSR SETCLR ;GO DO ENGINE COLORS COOLIT LDX #2 ;COOL ALL 3 ENGINES DEC STKPOS COOLP CPX STKPOS ;IS THIS ENGINE IN USE? BEQ NXCOOL ;IF SO, CON'T COOL IT! LDA TEMP2,X ;GET ENGINE TEMP CMP #$18 ;IS IT DEAD? BCS NXCOOL ;YES, DON'T COOL IT. CMP #0 ;IS ENGINE HOT? BNE COOLOK ;YES, OK TO COOL LDA TEMP1,X ;GET LOW TEMP BYTE CMP #2 ;IS ENGINE COLD? BCC NXCOOL ;YES, DON'T COOL COOLOK LDA TEMP1,X ;COOL OFF THE SEC ;ENGINE BY SBC #2 ;SUBTRACTING 2 STA TEMP1,X ;FROM THE TEMP LDA TEMP2,X SBC #0 STA TEMP2,X JSR SETCLR ;SHOW ENGINE COLOR NXCOOL DEX ;MORE ENGINES? BPL COOLP ;YUP! VBDONE LDA SNDCNT ;GET WARNING TONE COUNT BEQ NOSND ;IF 0, NO TONE. SEC ;OTHERWISE, SBC #1 ;SUBTRACT 1 FROM STA SNDCNT ;THE COUNT, LSR A ;DIVIDE BY 2 ORA #$A0 ;AND MAKE IT THE STA AUDC3 ;VOLUME. NOSND JMP XITVBV ;VBI DONE! ; ----------------- ; SET ENGINE COLORS ; ----------------- SETCLR AND #$1F ;MASK OFF HI TEMP, LSR A ;DIVIDE BY 8 LSR A LSR A STA TEMPS,X ;GET TEMP COLOR INDEX TAY LDA ENGCLS,Y ;GET COLOR CMP ECOLOR+2,X ;SAME AS CURRENT? BEQ NOCCHG ;YES, NO CHANGE STA ECOLOR+2,X ;NEW COLOR: LDA #20 ;SET UP ENGINE TEMP STA SNDCNT ;TONE COUNT ASL A ;AND FREQUENCY STA AUDF3 ;OF 40. NOCCHG RTS ;EXIT ; -------------------------------- ; GR. 8+ PLOTTER ROUTINE ; ; THIS ROUTINE PLOTS IN GRAPHICS 8 ; IN 4 COLORS, DETERMINED BY 0-3 ; IN "COLOR". ; -------------------------------- PLOTCL JSR PCALC 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 #0 ;OF THE ADDRESS AND (LO),Y ;TO BE ALTERED ORA HOLD ;SET THE PLOT STA (LO),Y ;BITS AND STORE! RTS ;FINIS! ; --------------- ; PLOT CALCULATOR ; --------------- PCALC LDA PLOTY ASL A STA LO LDA #0 ROL A STA HI ;*2 ASL LO ROL HI ;*4 ASL LO LDA LO STA LOHLD ROL HI LDA HI STA HIHLD ;*8 ASL LO ROL HI ;*16 ASL LO ROL HI ;*32 LDA LO CLC ADC LOHLD STA LO LDA HI ADC HIHLD STA HI ;+*8=*40 LDA #DISP&255 ;ADD THE DISPLAY CLC ;ADDRESS TO GET ADC LO ;THE ACTUAL STA LO ;ADDRESS OF THE LDA #DISP/256 ;BYTE THAT WILL ADC HI ;BE ALTERED FOR STA HI ;THE PLOT. LDA PLOTX ;MASK PLOTX FOR AND #7 ;PLOT INDEX, LSR A TAX ;PLACE IN X. LDA PLXHI LSR A LDA PLOTX ;GET PLOTX AND ROR A LSR A ;DIVIDE LSR A ;BY 8, CLC ;ADD TO ADC LO ;PLOT ADDRESS STA LO ;FOR FINAL PLOT LDA HI ;ADDRESS. ADC #0 STA HI RTS ;EXIT! ; -------------------------------- ; GRAPHICS 8+ DRAW HANDLER ; ; THIS ROUTINE IS A MODIFICATION ; OF THE GRAPHICS 7+ HANDLER FROM ; A.N.A.L.O.G. #11. ; -------------------------------- DRAW LDA DRAWY ;GET DRAWTO Y 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 ;NOW DO X YMINUS LDA PLOTY ;SUBTRACT SEC ;DRAWY FROM PLOTY SBC DRAWY STA DELTAY ;AND SAVE DIFFERENCE LDA #255 ;Y INCREMENT STA INCY ;=-1 (UP) XVEC LDA DRXHI ;IS DRAWX CMP PLXHI ;> PLOTX? BCC XMINUS ;NO! BNE NOCMP ;MAYBE... LDA DRAWX CMP PLOTX BCC XMINUS ;NO! NOCMP LDA DRAWX ;SUBTRACT PLOTX SEC ;FROM DRAWX SBC PLOTX STA DELTAX ;AND SAVE DIFFERENCE LDA DRXHI SBC PLXHI STA DELXHI ;SAVE HI BYTE TOO LDA #1 ;X INCREMENT STA INCX ;=1 (RIGHT) BNE VECSET ;BRANCH! XMINUS LDA PLOTX ;SUBTRACT SEC ;DRAWX FROM PLOTX SBC DRAWX STA DELTAX ;AND SAVE DIFFERENCE LDA PLXHI SBC DRXHI STA DELXHI ;SAVE HI BYTE TOO LDA #255 ;X INCREMENT STA INCX ;=-1 (LEFT) VECSET LDA #0 ;ZERO OUT STA ACCY ;ALL ACCUMULATORS STA ACCX STA ACCXHI STA ACCYHI LDA DELXHI ;IS DELTAX>DELTAY? BNE XMAX ;YES! LDA DELTAX ;MAYBE... CMP DELTAY BCC YMAX ;NO, Y IS LARGER XMAX LDA DELXHI ;SET UP DRAW STA CNTHI ;COUNTER AND STA ENDHI ;ENDPOINT LDA DELTAX STA COUNTR STA ENDPT LDA ENDHI ;DIVIDE ENDPOINT LSR A ;BY 2 FOR LDA ENDPT ;Y ACCUMULATOR ROR A STA ACCY JMP DRAWGO ;START DRAWING YMAX LDA #0 ;DELTA Y LARGER, STA CNTHI ;STORE IT IN STA ENDHI ;THE DRAW COUNTER LDA DELTAY ;AND ENDPOINT STA COUNTR STA ENDPT LSR A ;DIVIDE BY 2 AND STA ACCX ;SET X ACCUMULATOR DRAWGO LDA COUNTR ;IF COUNTR>0... ORA CNTHI BNE BEGIN ;WE DRAW! RTS ;OTHERWISE, EXIT BEGIN LDA ACCY ;ADD DELTA Y CLC ;TO Y ACCUMULATOR ADC DELTAY STA ACCY LDA ACCYHI ADC #0 STA ACCYHI CMP ENDHI ;AT ENDPOINT? BCC BEGIN2 ;NO, DO X BNE ADJY LDA ACCY ;CHECK LOW BYTE CMP ENDPT BCC BEGIN2 ;DO X ADJY LDA ACCY ;SUBTRACT ENDPOINT SEC ;FROM Y ACCUMULATOR SBC ENDPT STA ACCY LDA ACCYHI SBC ENDHI STA ACCYHI LDA PLOTY ;INCREMENT Y CLC ;POSITION ADC INCY STA PLOTY BEGIN2 LDA ACCX ;ADD DELTA X TO CLC ;X ACCUMULATOR ADC DELTAX STA ACCX LDA ACCXHI ADC DELXHI STA ACCXHI CMP ENDHI ;AT ENDPOINT? BCC PLOTIT ;NO, GO PLOT! BNE ADJX LDA ACCX ;CHECK LOW BYTE CMP ENDPT BCC PLOTIT ;GO PLOT ADJX LDA ACCX ;SUBTRACT ENDPOINT SEC ;FROM X ACCUMULATOR SBC ENDPT STA ACCX LDA ACCXHI SBC ENDHI STA ACCXHI LDA INCX ;WHICH DIRECTION? BMI SUBX ;GOING LEFT BPL ADDX ;GOING RIGHT BBEGIN BNE BEGIN ;LEAPFROG JUMP ADDX LDA PLOTX ;ADD INCREMENT CLC ;TO PLOTX ADC INCX STA PLOTX LDA PLXHI ADC #0 STA PLXHI JMP PLOTIT ;GO DO THE PLOT SUBX LDA PLOTX ;SUBTRACT 1 SEC ;FROM PLOTX SBC #1 STA PLOTX LDA PLXHI SBC #0 STA PLXHI PLOTIT JSR PLOTCL ;PLOT THE POINT LDA COUNTR ;ONE LESS PIXEL SEC ;TO PLOT SBC #1 STA COUNTR LDA CNTHI SBC #0 STA CNTHI ORA COUNTR ;DONE PLOTTING? BNE BBEGIN ;NOT YET! RTS ;FINIS! ; --------- ; GRID DATA ; --------- MAXHGT DB 1,4,8 ;MAXIMUM GRID HEIGHTS GRDLIM DB $00,$80,$10 ;ALTITUDE LIMITS (X100') ; ----------- ; PLOT TABLES ; ----------- COLORS DB $00,$55,$AA,$FF BMASK1 DB $3F,$CF,$F3,$FC BMASK2 DB $C0,$30,$0C,$03 ; ---------------- ; BORDER PLOT DATA ; ---------------- LINTYP DB 0,1,1,1,1,0,1,0 ;0=PLOT, 1=DRAW DB 1,0,1,0,1,0,1 XHIGH DB 0,1,1,0,0,0,0,0 DB 1,1,0,0,1,1,1 XLOW DB 10,54,54,10,10,192,192 ;COORDS DB 192,54,54,192,192,32,32 DB 32 YLOW DB 10,10,180,180,10,10,180 DB 94,94,157,157,53,53,11 DB 93 ; -------------------------------- ; SCREEN CHARACTER POSITIONS, DATA ; -------------------------------- XP DB 27,28,29,30,31,25,26,27 DB 28,29,25,26,27,28,29 DB 25,26,27,28,29,30,31,32 DB 33,34,25,26,27,28,29 DB 25,26,27,28,29 DB 25,26,27,28,25,26,27 DB 25,26,27,25,26,27,25 DB 26,27,28,29,25,26,27 DB 28,29,30,25,26,27,28 DB 29,30,37,37,37,37,37 DB 37,37,37,37 YP DB 16,16,16,16,16,30,30,30 DB 30,30,40,40,40,40,40 DB 58,58,58,58,58,58,58,58 DB 58,58,72,72,72,72,72 DB 82,82,82,82,82 DB 98,98,98,98,112,112,112 DB 122,122,122,132,132,132,146 DB 146,146,146,146,160,160,160 DB 160,160,160,170,170,170,170 DB 170,170,17,25,33,41,49 DB 57,65,73,81 CH DB 51,40,41,48,26,57,48,47 DB 51,26,58,48,47,51,26 DB 47,34,42,37,35,52,41 DB 54,37,26,57,48,47,51,26 DB 58,48,47,51,26 DB 33,44,52,26,56,54,26 DB 57,54,26,58,54,26,38 DB 53,37,44,26,51,40,41 DB 48,51,26,51,35,47,50 DB 37,26,50,33,36,41,33 DB 52,41,47,46 ; -------------------------------- ; TOP-OF-SCREEN MESSAGES & INDEXES ; -------------------------------- MSGIX DB 0,22,44,66,88,110,132 DB 154,176,198,220 MESSGE DB 0,0,0,0,0,0,39,33,45,37 ;GAME OVER DB 0,47,54,37,50,0,0,0,0,0 DB 0,0 SUCLAN DB 0,0,51,53,35,35,37,51 ;LANDED OK DB 51,38,53,44,0,44,33,46 DB 36,41,46,39,0,0 CRSLAN DB 0,0,0,38,33,52,33,44 ;CRASH DB 0,51,40,41,48,0,35,50 DB 33,51,40,0,0,0 LOWFU DB 0,38,53,37,44,0,44,37 ;LOW FUEL DB 54,37,44,0,35,50,41,52 DB 41,35,33,44,0,0 OUTFU DB 0,0,0,0,0,47,53,52,0,47 ;OUT OF FUEL DB 38,0,38,53,37,44,0,0,0 DB 0,0,0 RADCRS DB 0,0,50,33,36,41,33,52 ;RADIATION DB 41,47,46,0,47,54,37,50 DB 44,47,33,36,0,0 IFUMSG DB 0,0,0,0,0,0,38,53,37,44 ;INIT FUEL DB 26,0,0,0,16,16,16,0,0,0 DB 0,0 GRVMSG DB 0,0,0,0,0,0,39,50,33,54 ;GRAVITY DB 41,52,57,26,0,0,0,0,0,0 DB 0,0 TTLMSG DB 0,0,0,0,0,0,50,37,52,50 ;TITLE DB 47,38,41,50,37,1,0,0,0 DB 0,0,0 AUTMSG DB 0,0,0,0,34,121,26,0,52 ;AUTHOR DB 111,109,0,40,117,100 DB 115,111,110,0,0,0,0 MAGMSG DB 0,0,0,33,46,33,44,47,39 ;MAGAZINE DB 0,35,111,109,112,117 DB 116,105,110,103,0,0,0 IFUEL1 DB 0 ;INITIAL FUEL IFUEL2 DB 5 FTIME DB 0 GRAVTY DB 0 ;GRAVITY LEVEL GRAVS DB 10,24,48 ;GRAVITY FACTORS GCHAR DB 44,45,40 ;L,M,H ; ---------------------- ; INITIAL NUMERICAL DATA ; ---------------------- ININBR DB $02,$00,$00 ;ALT DB $00,$00,$00 ;XV DB $00,$00 ;YV DB $00,$00 ;ZV DB $01,$00,$00 ;FUEL DB $02 ;SHIPS DB $00,$00,$00 ;SCORE ; ---------------- ; DIRECTION ARROWS ; ---------------- ARROWS DB 0,$18,$18,$18,$7E,$3C,$18,0 DB 0,$18,$3C,$7E,$18,$18,$18,0 DB 0,$18,$C,$7E,$7E,$C,$18,0 DB 0,$18,$30,$7E,$7E,$30,$18,0 DB 0,$3C,$1C,$34,$64,$C0,0,0 DB 0,0,$C,$98,$B0,$E0,$F0,0 ARRLO DB LOW [DISP+29+112*40] DB LOW [DISP+29+122*40] DB LOW [DISP+29+132*40] ARRHI DB HIGH [DISP+29+112*40] DB HIGH [DISP+29+122*40] DB HIGH [DISP+29+132*40] ; --------------- ; JOYSTICK TABLES ; --------------- ENGIX DB 0,0,0,0,0,0,3,2 ;ENGINE NUMBERS DB 0,3,0,2,0,1,1,0 FUELIX DB 0,0,0,0,0,0,8,6 ;FUEL DATA POINTERS DB 0,8,0,6,0,3,3,0 FSIGNS DB 0,0,0,0,0,0,2,1 ;DIRECTIONS DB 0,2,0,1,0,0,0,0 VAH DB 0,0,0,0,0,0,0,0 ;VELOCITY ADD VALS. DB 0,$99,0,$99,0,0,$99,0 VAL DB 0,0,0,0,0,0,1,1 DB 0,$99,0,$99,0,1,$99,0 ; ---------------------- ; DECIMAL TO BINARY DATA ; ---------------------- ALT1L DB 0,10,20,30,40 DB 50,60,70,80,90 ALT2H DB 0,0,0,1,1 DB 1,2,2,3,3 ALT2L DB 0,$64,$C8,$2C,$90 DB $F4,$58,$BC,$20,$84 ALT3H DB 0,3,7,$B,$F DB $13,$17,$1B,$1F,$23 ALT3L DB 0,$E8,$D0,$B8,$A0 DB $88,$70,$58,$40,$28 ALT4H DB 0,$27,$4E,$75 ALT4L DB 0,$10,$20,$30 GRDDIV DB 88,22,3 ;GRID DIVISION FACTORS VELSHF DB 7,4,1 ;VELOCITY DIVISION FACS ; ---------------------------- ; GRID TERRAIN SAVE WORK AREAS ; ---------------------------- GDIX DB 7,15,23,31 HSAVE DB 56,57,58,59,60,61,62,63 DB 0,1,2,3,4,5,6,7 DB 7,15,23,31,39,47,55,63 DB 0,8,16,24,32,40,48,56 HREST DB 0,1,2,3,4,5,6,7 DB 56,57,58,59,60,61,62,63 DB 0,8,16,24,32,40,48,56 DB 7,15,23,31,39,47,55,63 ENGCLS DB $C4,$16,$34,$02 ;ENGINE COLORS ENGTHR DB 255,200,90,0 ;ENG EFFECTIVENESS RADINI DB 120,255,0 ;RADIATION TIMES BASPIC DB $80,$40,$F0,$20,$10 ;PAD IMAGE PCOLRS DB $00,$32 ;PAD COLORS PYPOS DB 72,82,30,40 POSNIX DB 0,3,6,9 HI1 DB 0,0,0,1,1,2,2 HI2 DB 0,$49,$98,$47,$96,$45,$94 MED1 DB 0,$07,$14,$21,$28,$35,$42 ECOLOR DB $16,$C4,0,0,0 ;DLI COLORS UNSNUM DS 17 ;UNSIGNED NUMBERS SIGNS DS 4 ;SIGN INFORMATION HEIGHT DS 64 ;GRID HEIGHT HGTSAV DS 8 ;HEIGHT SAVE TEMP1 DS 3 ;ENGINE... TEMP2 DS 3 ;TEMPS TEMPS DS 3 ;0,1,2,3 TEMPS ; EXPLOSION DATA EXLV DS 20 ;EXPLOSION LIFE EXXP DS 20 ;X POSITIONS EXYP DS 20 ;Y POSITIONS EXXI DS 20 ;X INCREMENT EXYI DS 20 ;Y INCREMENT EXXA DS 20 ;X ACCUM EXYA DS 20 ;Y ACCUM TEMPCX DS 1 END MOVEIT+$2000