EjdX;nX; TROLLWARxX; BYX; SCOTT D. LANGSTONX; ROCK ISLAND, ILX;X; SYSTEM EQUATESX;CHBASE ԾHPOSM0HPOSM1HPOSM2HPOSM3HPOSP0HPOSP1HPOSP2HPOSP3RANDOM  WSYNC "XITVBVb,X;6@X;J"TEMP10;;PAGE ZERO VARIABLEST TEMP11^ TEMP12h,GUNTOP;;POINTER TO TOP OF GUN DRAWINGr/GUNBOT;;POINTER TO BOTTOM OF GUN DRAWING|,BOMB;;VARIBLE FOR CHAR FIRED FROM GUN%P0;;POINTER/HORIZ POS PLAYER 0P2;;HORIZ POS PLAYER 2P1;;HORIZ POS PLAYER 1P5;;HORIZ POS MISS 1P6;;HORIZ POS MISS 2P4;;HORIZ POS MISS 0P7;;HORIZ POS MISS 4TEMP1;;VARIABLEX;CHARACTER SETHX;R CHAR =======\ ===U=U=U=U=f ===E=E=Q=Q=p ===A=A=A=Q=z =====:= =< P==P=h==== === === = U===V==== =?==== == P=P=P=`====  =<==<= === ======= ======= =;====== =====@== =`======` == =0=0= ==* ===P=P=== ======= ==?=====  =======3=;$ ==T===_==.TW =======8 =======B =======L ?=?=<=<=<=<=?=?V =======` =======j <=<=<=<=<=<=?=?t =======~ =====<=<=< <=<=<=<==== ======= =======Ϧ =<=<===<=<=< ======= ======= ======= ======= ======= ======= =<=<===<=<= ======= <=<=<=<=<=<==  ======= ======= =======( =======2 =======< ?====?===?F =======P =======Z ?=<=<=?=?=<=<==*=6===]=]===0v$ ==========(GHOST2 |=T=}=9====?==X;#X;SUBROUTINE DLI:USED BY DISPLAYX;INTERURPT TO LOAD ADDRESS X;OF REDEFINED CHARACTER BASEX;DLI5QTR;;CHAR BASE ADDRESSPWSYNC;;WAIT SYNCPCHBASE;;CHAR BASE REGISTER79X;X;SUBROUTINE ZEROSC:CLEARS X;PLAYFIELD AND PLAYERX;MEMORY.EXECUTES 256 TIMES. X;*ZEROSC$>4A>Z1PSCR19;;CLEAR SCREENH PLEV19R PLEV29\ PLEV39fPPL0R9;;CLEAR PLAYERSp PPL1R9z PPL2R9 PPL3R92HZ1:X;X;SUBROUTINE WALL:BUILDSX;PLAYFIELD.GEM IS CHARACTER$X;16 AND 17.WALL IS CHARACTER 12.X;KING IS CHARACTER 20&21X;!WALL$>;;# OF PLAYFLD ROWS-1W2%>;;LOOP W2 PLACESA;; GEM CHARACTERS V? DW1;;GEM CHAR IS PLACED %>;;STARTING IN BYTE 2 OR 0$ W1Q>;;LEFT HALF OF GEM. P@TEMP127;;TEMP12 HOLDS8 (3;;ADDRESS OF A LINE IN THE PLAYFIELDB Q>;;RIGHT HALF OF GEML P@TEMP127V  LINECNT;;JUMP SUB TO` 0;;INCREMENT TEMP12 TOj IW2;;NEXT LINEt Q>~ PLEV78;;LEV7 IS LOWEST %Q>;;PLAYFLD WHERE KING IS PLACED 1 PLEV78 $>';;# OF BYTES PER LINE-1 Q> ;;WALL CHARACTER W3PENDSC9;;LOOP W3 PLACES PLEV99;;SOLID WALL PLEV89;;CHARACTERS 0;;(3 WALLS ARE BIULT) IW3 : X; %X;SUBROUTINE SETTBL6:RANDOMLY SETS 'X;THE ORDER OF HOW FAST TROLLS MOVE. $X;TABLE6 CONTROLS HOW LONG BEFORE X;TROLL MOVES,TABLES 2 AND 3( $X;CONTROL HOW FAST EGG TURNS INTO2 X;A TROLL CHARACTER.< X;F !SETTBL6QRANDOM;;GET RANDOM #P M>;;MAKE 0..15Z PTEMP1;;TEMPORARY SAVE #d >;;POINTER TO WHERE VALUE ISn (%>;;POINTER TO WHERE VALUE IS GOINGx 'CHCKX2;;VALUE OF X CAN ONLY BE 0-15 (> DLOAD6 $> LOAD6QTABLE79;;GET VALUE PTABLE68;;SAVE VALUE PTABLE18;;SAVE VALUE 3;;NEXT DESTINATION +(TEMP1;;IF X=TEMP1 THEN ALL VALUES HAVE #HCHCKX;;BEEN LOADED INTO TABLE6 $> LOAD23Q>;;LOAD AND SAVE PTABLE29;;CORRESPONDING QTABLE59;;TABLE VALUES PTABLE39 0 ILOAD23" :, X;6 X;SUBROUTINE INITIAL:SETS@ X;INITIAL VALUE OF POINTERSJ X;AND COUNTERS. SETS-PMGRAPH,T X;PLAYFIELD,PLAYER COLOR,AND^ X;PLAYER WIDTH/PRIORITYh !X;ALSO LOAD ADDRESS OF DISPLAYr "X;LIST AND ENABLES DISPLAY LIST| X;INTERRUPT. X; INITIALQ> PSCOUNT PGCNT1 PGCNT2 PGCNT3 PEXPTIM PGAMEOVER PVBCNT P ;;PLAYER SIZE P ;;" P ;;" P;;" P ;;" P;;BACKGROUND PSD& PSD10 PTIMER1: PTIMER2D PGH1STN PGH2STX PGH3STb Pl Pv Q> PҊ Q> PSD2 Q> PGUNFLAG PGFLAG PGFLAG1 PGFLAG2 Q> Po;;PLAYER PRIORITY Q>;;SET SOUND P P Q> P Q>) PTEMP13* Q>;;CLEAR SCORE4 PSCR4 > PSCR4 H PSCR4 R #DISPLAYQ>4DLIST;;SET DISP LIST\ P0f Q>5DLISTp P1z Q>4DLI;;SET UP DISPLAY P;;LIST INTERRUPT Q>5DLI P !Q;;ENABLE DISPLAY INTERRUPT L> P !PMGRAPHQ>5PM;;SET UP PMGRAPG P Q>> P/ Q> P %COLORPLFQ>*;;SET PLAYFIELD COLORPQ> P$Q>.P8"COLORPLRQ>L;;SET PLAYER COLORBPLQ>VP`Q>HjPtQ>~P:X;"X;SUBROUTINE PLOR0:SETS POINTERX;TO START OF PLAYER 0 ANDX;SETS X TO POINT TO PLAYER0X;VARIABLESX; PLOR0$> Q>5PL0R HPLSRXX;X;SUBROUTINE PLIR1:SAME ASX;PLOR0 EXCEPT FOR PLAYER 1 X; PLIR1$> Q>5PL1R( HPLSRX2X;<X;SUBROUTINE PLSR2:SAME ASFX;PLOR0 EXCEPT FOR PLAYER 2PX;Z PLSR2$>d Q>5PL2RnPLSRXPTEMP11x Q>4PL2R PTEMP11:X;X;SUBROUTINE MOVGHOST :JUMPSX;SUBRS TO SET POINTERSX;FOR CORRESPONDING PLAYER,!X;CHANGES DRAWING BY SUB CHG1,X;CHANGES VERTICLE POSITIONX;BY SUB HEIGHT,AND CHANGESX;HORIZONTAL POSITION BYX;SUB MOVP (MOVE PLAYERYS)X;MOVGHOST PLOR0 HEIGHT$> CHG1" PLIR1, HEIGHT6$>@ CHG1J PLSR2T HEIGHT^$>h CHG1r !MOVP|X;X;SUBROUTINE HEIGHT:MOVES X;DRAWING OF GHOST UP OR DOWN"X;1 POSITION WITHIN PLAYER 0-2. X;DRAWING DOES NOT MOVE ABOVEX;POSITION 52 OR BELOW 175."X;ONCE DRAWING REACHES BOUNDARY X;(52 OR 175) GFLAG IS SET SOX;DRAWING IS MOVED THE OTHERX;DIRECTION.X;X;!HEIGHTQGTOP9;;LOAD GHOST TOPR>4;;UPPER LIMIT?HNX1Q>;;YES THEN SET FLAG PGFLAG9&NX1R>;;LOWER LIMIT?0HNX2:Q>;;YES THEN SET FLAGD PGFLAG9NNX2QGFLAG9;;GET FLAGXFNX3;;IF=0 MOVE GHOST UPb"GTOP9;;NEW POS (OLD POS-1)l %GTOP9v$> ;;HIEGHT OF GHOSTNX43Q@TEMP117;;OLD POS1P@TEMP117;;NEW POS3;;NEXT DRAWING BYTE0INX4;;DONE?:!NX3QGTOP9;;LOAD TOP OF GHOST#GTOP9;;NEW POS,O> ;;BOTTOM OF GHOST?$> ;;HIEGHT OF GHOST+1 NX5Q@TEMP117;;OLD POS3 P@TEMP117;;NEW POS*1;;RESET POINTER41;;NEXT BYTE>0HINX5;;DONE?R:\X;fX;SUBROUTINE CHG1:CHANGESpX;THE DRAWING(OF A GHOST)zX;THAT IS IN PLAYER 0-2X;+CHG1#GCNT19;;ADD 1 TO COUNTER OF DELAY)QGCNT19;;BEFORE GHOST DRAWING CHANGESR>DNCHG;;IF<4 NO CHANGEQ>;;ELSE SET POINTER TOPGCNT19;;NEXT DRAWING*,;;OF GHOST (ONLY 2 DRAWINGS ARE USED) QGH1ST9O> R> HGST1Q>)GST1PGH1ST9;;SAVE POINTER TO DRAWINGPTEMP1;;ALSO TEMPORARY SAVE"QGTOP9;;LOAD VERT POS OF GHOST$?.,;;SET UP TO ADD8O> ;;ADD 11 TO FIND BOTTOMB#PGTEMP;;OF GHOST AND SAVE VALUEL $TEMP1V#GST11QGHOST9;;GET DRAWING BYTE`P@TEMP117;;SAVE IN PLAYERj2;;NEXT DRAWING BYTEt%3;;NEXT POS WHERE DRAWING IS GOING~)GTEMP;;DRAWING CHANGED?HGST11;;IF EQ THEN DONENCHG:;;EXITX;X;SUBROUTINE PLAYERS:SETSX;INITIAL VALUE OF POINTERX;OF PLAYER0-2 AND READSX;DRAWING OF GHOST INTO THE X;PLAYERS.X;"PLAYERS$> ;;HIEGHT OF GHOST-1Q>FPGTOP;;PLAYER0 GHOST TOPQ>_ PGTOP1;;PLAYER1 GHOST TOPQ>PGTOP2;;PLAYER2 GHOST TOP( PL1QGHOST9;;READ IN DRAWING2PPL0RF9;;OF GHOST AND<PPL1R_9;;STORE IN PLAYERSF PPL2R9P0ZIPL1d&HPOSP0;;SET HORIZONTALn&HPOSP1;;REGISTERSx &HPOSP2&P0;;SET HORIZONTAL&P1;;POINTERS&P2:X;X;SUBROUTINE MOVP:DECREMENTS"X;POINTER OF CURRENT HORIZONTALX;POSITION OF PLAYERS 0-2X;AND STORES NEW VALUEX; MOVP"P0"P0QP0 PHPOSP0QSCOUNT;;GET SCORE COUNTR>;;IF < 20 THEN ONLY"DNMP;;1 GHOST,"P16QP1@ PHPOSP1J QSCOUNTTR>2;;IF < 50 THEN ONLY^DNMP;;2 GHOSTSh"P2r"P2|"P2QP2 PHPOSP2NMP:X;%X;SUBROUTINE GHOSTM:CLEARS MISSILE"X;MEMORY,READS IN GHOST DRAWINGX;SETS HORIZONTAL POSITIONX;GHOSTM$>AZMISPMIS9;;CLEAR MISS'S2 HZMISQRANDOM;;GET RANDOM #P;;SET PLFLD COLOR$> ;;GHOST HIEGHT-1&&%GUNBOT;;Y IS POINTER BOT OF GHOST0 SLOOPQGHOST29;;READ IN/SAVE:PMIS8;;GHOST DRAWINGD1N0X ISLOOPbQ>;;SET HORIZ POS OFl#PP4;;MISS SAVE IN CORRESPONDINGvPHPOSM0;;REGISTERS/POINTERSQ>PP5 PHPOSM1Q>PP6 PHPOSM2Q>PP7 PHPOSM3:X;X;SUBROUTINE LINECNT:LOADSX;ZERO PAGE VARIABLE TEMP12X;WITH START ADDRESS OF A X;LINE OF THE PLAYFIELDX;SCREEN.TEMP12 CAN POINT TO X;LINES 4 THRU 20.*X;4-LINECNTQTEMP12;;LOAD CURRENT SCREEN LINE>,H O>(;;ADD # OF BYTES PER LINERPTEMP12;;TEMP12 POINTER\QTEMP12;;TO NEXT LINEfO>pPTEMP12z#R>5ENDSC;;END OF PLFLD IS ENDSC HEXITSCQTEMP12;;IF NOT = EXIT R>4ENDSC#HEXITSC;;ELSE IF = RESET TEMP12ORGINQ>5LEV0;;SET TEMP12PTEMP12;;TO POINT TOQ>4LEV0;;1ST PLAYFIELDPTEMP12;;LINE EXITSC:X;#X;SUBROUTINE FORCE:CONTROLLS THEX;FLASHING CHARACTER THAT ISX;DISPLAYED IN BOTTOM ROW.%X;CHARACTER FLASHES BY ALTERNATING X;THE ACTUAL DRAWING WITH THEX;ZERO CHARACTER$X;.!FORCE%TEMP13;;SET POINTER TO81;;WHERE FLASHING CHAR ISB 1;;GOINGLQLEV78;;DOES NEW POS HAVEVR>;;KING CHAR IN IT`FEX13;;IF YES THEN EXITj QLEV78;;ELSE MAKE CHAR FLASHt FBOLT~Q>;;STORE ZERO TO REMOVEPLEV78;;CHARACTER1 PLEV78 EX13:BOLTQ>;;STORE CHARS THATPLEV78;;MAKEUP FLASHING 1;;CHARQ> PLEV78:X; X;SUBROUTINE FINDCHAR:ACCEPTS"X;VERTICLE POSITION OF PLAYER 3  X;(THE GUN)AND CALCULATES THEX;CORRESPONDING PLAYFIELDX;ROW IN THAT POSITION(X;2*FINDCHARQSTEMP2;;LOAD PLAYR3 VERT POS<$;;;SUBTRACT AREA WHERE PLAYER CANF(S>(;;MOVE BUT THAT IS NOT ON PLAYFLDPV?;;DIVIDE BY HIEGHT OFZV?;;CHARACTER GIVESdV?;;# OF ROWSn>xQDLIST;;LOAD CURRENTPTEMP10;;SCREEN ADDRESS QDLISTPTEMP10ROW0;;CALCULATE # ROW-1GEXIT30;;TO FIND POS,;;OF PLAYER 3 QTEMP10O>(;;# BYTES PER LINE PTEMP10DROW#TEMP10EROW EXIT30:X;X;SUBROUTINE ONE:WHEN ENERGYX;BOLT HITS TROLL,THIS"X;SUBROUTINE ADDS 1 TO THE,X;CURRENT SCORE6X;@ONEQSCOUNTJR>TFAD1^ #SCOUNTh QSCOUNTrR>d|DSN1Q> PSD2!AD1 SN1R>FDAD1Q>PSD2!AD1#SCR4 ;;HUNDERS COUNTER QSCR4  R>;;>9HSC1;;IF NO EXIT Q>;;"0" PSCR4 #SCR4 ;;THOUSANDS QSCR4  R>;;>9&HSC1;;IF NO EXIT0 Q>;;"0": PSCR4 D#SCR4 ;;TEN THOUSANDSN QSCR4 X R>;;>9bHSC1;;IF NO EXITl Q>;;"0"vPSCR4 ;;RESET SCORE PSCR4  PSCR4 SC1:SOUND%SD;;POINTER TO NOTEQSONG8;;GET NOTET?;;LOWER OCTIVEP;;PLAY NOTE3;;NEXT NOTE THAT WOULD PLAY)> ;;32 NOTES TO PLAYDOKS;;IF < CHECK DELAY!Q>;;ELSE RESET TO SONG STARTPSD:)OKS#SD1;;INC DELAY BEFORE NOTE PLAYS QSD1RSD2;;CMP WITH SONG SPEED  HOKS2*#SD;;NEXT NOTE4Q>;;RESET DELAY>PSD1H OKS2:RX;\!X;SUBROUTINE JS15:SETS INITIALfX;POSITION OF PLAYER 3(THEpX;GUN) AND READS IN THEzX;DRAWING OF THE GUNX;JS15Q>F;;ENDING POSITIONPGUNBOT;;OF GUN DRAWINGQ>>;;STARTING POSITIONPGUNTOP;;OF GUN DRAWINGPHPOSP3;;HORIZ POS PLAYER3$>;;#BTYES GUN DRAWING-1M1QGUN9;;GET DRAWING BYTEPPL3R>9;;SAVE IN PLAYER0;;NEXT BYTEIM1;;DONE?:X;X;VERTICLE BLANK ROUTINE:X;VBROUTINQGAMEOVER$ FNOTOVER.Q>8P;;TURN OFF SOUNDBPLPVP` !XITVBVj'NOTOVER#TIMER1;;HIGH BYTE OF TIMERt HNOTOV1~#TIMER2;;LOW BYTE OF TIMERNOTOV1 FORCE SOUND MOVMISQEXPTIM;;GET SOUND VARIABLE$FNOEX;;IF NE PLAY TROL HIT SOUND"EXPTIM;;NEXT NOTE TO PLAYR>%FOFF;;IF NOTE =240 TURN OFF SOUNDP;;ELSE PLAY NOTE !NOEXOFFQ>;;ZERO TO TURN OFFP PEXPTIM -NOEXQGUNFLAG;;IF FLAG NE THEN FREEZE GUNHVB2-Q;;ELSE CHECK SEE IF PLAYER 3 COLLISION(FVB12$VB3Q>Z;;90 COUNTS OF GUN FREEZE< PGUNFLAGFQ>N;;CHANGE COLOR OF GUNPPZVB2Q>;;CLEAR COLLISIONdPn P;;TRUN OFF GUN FIRE SOUNDx MOVGHOST""GUNFLAG;;DEC GUN FREEZE DELAY !XITVBVVB1Q>;;HIT CLEARPЪ MISSILE MOVGHOSTQ>;;RESTORE GUN COLORPX;X;SUBROUTINE JOYSTICK:READS!X;VALUE OF JOYSTICK 0.IF VALUEX;IS 13 THEN PLAYER3 DRAWING X;(THE GUN) IS MOVED DOWN ONE!X;POSITION.IF VALUE IS 14 THEN!X;GUN IS MOVED UP ONE POSITIONX;"'JOYSTICKQx;;LOAD VALUE OF STICK 0,R> ;;IS IT 136 HSTICK14;;NO CMP WITH OTHERS@$GUNBOT;;BOTTOM OF GUNJ%> ;;HIEGHT OF GUNT(>;;LOWER LIMIT CAN^EEXIT;;NOT MOVE PASTh DOWNQPL3R9;;MOVE DRAWINGrPPL3R9;;DOWN 1 BYTE|XP20;;NEXT BYTE1 HDOWN#GUNTOP;;NEW POSITION #GUNBOT !XITVBVSTICK14R>;;STICK0=14?HEXIT;;NO EXIT$GUNTOP;;TOP OF GUN%> ;;HIEGHT OF GUN(>8;;UPPER LIMIT CANDEXIT;;NOT MOVE PASTUPQPL3R9;;MOVE DRAWINGPPL3R9;;UP 1 BYTE XP32;;NEXT BYTE 1 HUP& "GUNTOP;;NEW POSITION0 "GUNBOT: EXIT!XITVBVD X;N X;SUBROUTINE MISSILE:READSX !X;VALUE OF TRIGGER 0.IF PUSHEDb !X;AND A DELAY OF 16 HAS PASSEDl "X;THEN AN ENERGY BOLT CHARACTERv X;IS DISPLAYED AT PLAYFIELD X;POSITION CORRESPONDING TO X;PLAYER 3(GUN) POSITION X; MISSILEQ;;READ TRIGGER0 FFIRE;;IF PUSHED FIRE ENERGY NOMISQ>;;IF NOT TURN OFF P;;SOUND OF GUN FIRE : "FIRE#VBCNT;;INC DELAY COUNTER QVBCNT;;MUST BE 16 BEFORE R> ;; GUN CAN FIRE DNOMIS;;IF<16 EXIT Q>;;GUN FIRE NOTE!P;;PLAY NOTE !Q>;;RESET COUNTER! PVBCNT !QGUNTOP;;VERT POS GUN TOP*!,4!O>;;MIDDLE OF GUN>!PSTEMP2;;TEMPORARY SAVEH! FINDCHAR;;GET PLAYFLD BYTER!%>;;IS BYTE WHERE GUN IS\!Q@TEMP107;;CLEAR? IFf!HNOMIS;;NO THEN EXITp!Q>;;IF YES FIRE GUNz! P@TEMP107!:!X;!X;SUBROUTINE MOVEMIS:CHECKS!X;EACH BYTE OF PLAYFIELD!X;FOR ENERGY BOLT CHARACTER!X;IF IT IS A BOLT CHARACTER!X;THEN THAT CHAR IS MOVED! X;RIGHT ONE BYTE.(ENERGY BOLT!X;CHAR IS #15 AND CHAR #19)!X;ALSO CHANGES GEM'S RIGHT!X;CHARACTER (#17 OR #18)!X;CHANGING CHARACTER FROM!!X;#17 TO #18 MAKES GEM FLICKER"X;TEMP12 HOLDS START ADDRESS"X;OF A LINE OF PLAYFIELD"X;$"!MOVEMIS$>;;#PLAYFLD LINES-1."!MVS1%>$;;# OF BYTES TO CHECK8"#MSLOOPQ@TEMP127;;GET LINE BYTEB"R>;;IS IT A GEM CHARACTERL"HMSX1;;NO,CHECK OTHER CHARV"Q>;;YES,DISPLAY OTHER GEM`" P@TEMP127j"!NEXTMS;;GET NEXT BYTEt"MSX1R>;;IS IT A GEM CHAR~"$HMSX2;;NO CHECK FOR MISSILE CHAR"Q>;;YES CHANGE GEM" P@TEMP127"!NEXTMS;;GET NEXT BYTE" MSX2R>;;IS IT MISSILE CHAR"0FMSX3;;IF YES JMP TO LOAD OTHER MISSILE CHAR"!R>;;IS IT OTHER MISSILE CHAR" HNEXTMS;;IF NO,GET NEXT BYTE"Q>;;LOAD MISSILE CHAR" !MSX4"MSX3Q>;;LOAD MISSILE CHAR"MSX4PBOMB;;TEMPORARY SAVE" Q>;;REMOVE OLD MISSILE CHAR# P@TEMP127 #)>$;;IS BYTE # 36#+FNEXTMS;;IF YES DO NOT DISPLAY NEW CHAR#"3;; ELSE GET NEXT BYTE TO RIGHT(#Q@TEMP127;;IS BYTE CLEAR2#HREMVMIS;;IF NO TROLL HIT<#QBOMB;;ELSE MOVE MISSILEF#P@TEMP127;;RIGHT 1 BYTEP#!NEXTMS;;GET NEXT LINE BYTEZ#REMVMISQ>;;"0" TO CLEARd#)P@TEMP127;;LEFT HALF OF TROLL DRAWINGn#(3;;MOVE POINTER TO RIGHT HALF DRAWINGx#P@TEMP127;;REMOVE#"Q>;;LOAD DELAY FOR SOUND WHEN#PEXPTIM;;TROLL HIT# ONE;;ADD 1 TO SCORE#NEXTMS1;;NEXT BYTE# HMSLOOP# LINECNT;;NEXT ROW#0#IMVS1;;DONE?#:#X;#X;SUBROUTINE FACELEFT:CHECKS# X;38TH BYTE OF EACH PLAYFIELD# X;LINE TO SEE IF CHARACTER IN$X;THAT BYTE IS FRONT VIEW OF$"X;TROLL.IF IT IS THEN THE TROLL$X;DRAWING IS REPLACED WITH"$!X;DRAWING OF TROLL FACING LEFT,$X;6$FACELEFT%>&;;BYTE 38@$(Q@TEMP127;;TEMP12 HOLDS CURRENT LINEJ$R>;;FRONT VIEW OF TROLLT$HEXIT20;;NO,EXIT^$-Q> ;;CHAR,RIGHT HALF OF TROLL FACING LEFTh$PLACEP@TEMP127r$ Q>;;CHAR LEFT HALF OF TROLL|$1$ P@TEMP127$ EXIT20:$X;$X;SUBROUTINE MOVCRQ:MOVES$X;TROLL CHARACTER LEFT$!X;ONE BYTE AND CHANGES DRAWING$X;OR DOES NOT MOVE TROLL BUT$X;CHANGES DRAWING.$X;ALSO CHECKS TO SEE WHAT$X;(IF ANY) IS IN FRONT OF$ X;TROLL$"X;DRAWING OF TROLL IS TWO BYTES$X;CHARACTER 8&9 OR CHAR 6&7.% X;IF CURRENT TROLL DRAWING IS%X;CHAR 6&7 THEN TROL DRAWING%X;IS CHANGED TO CHAR 8&9.&%X;IF CURRENT DRAWING IS0%X;CHAR 8&9 THEN DRAWING IS:%"X;CHANGED TO CHAR 6&7 AND TROLLD%X;IS MOVE LEFT ONE BYTE.N%X;X%(MOVCRQ%>;;PLAYFLD BYTE TO START ATb%RF1QQ@TEMP127;;LOAD BYTEl%R>;;TROLL CHARACTER?v%$HRF2Q;;IF NE CMP WITH OTHER CHAR%#Q> ;;ELSE,LDA NEW TROLL DRAWING%P@TEMP127;;SAVE%1%Q>;;OTHER HALF OF TROLL%P@TEMP127;;SAVE%3;;RESET POINTER% !RF4Q;;GET NEXT BYTE OF LINE%RF2QR> ;;TROLL CHARACTER?%#FTRL9;;IF NO THEN GET NEXT BYTE% !RF4Q%TRL91;;MOVE POINTER TO FIND%(1;;BYTE (CHARACTER) IN FRONT OF TROLL%Q@TEMP127;;LOAD BYTE&FRFR3;;IF = MOVE TROLL &R>;;IS CHARACTER IN&FGEM;;FRONT OF TROLL A &R>;;GEM CHARACTER?*&$FGEM;;IF YES HAVE TROLL TAKE GEM4&)R>;;ELSE IS CHARACTER ANOTHER TROLL?>&&FDISTRL;;IF YES THEN DISPLAY TROLLH&3;;RESTORE POINTERR&3\&!RF4Q;;GET NEXT BYTEf&#DISTRLC;;TEMPORARY SAVE POINTERp&>z&"TEMP13;;SET POINTER FOR&"TEMP13;;POSITION WHERE&3%TEMP13;;TROLL IS PLACED ON LOWEST PLAYFLD LINE& )>;;IS THAT POINTER BYTE 1?&!DONE2HNONE2;;IF IT IS BYTE 1&DONE21Q>;;THEN HAVE TROLL& PLEV78;;DISTROY GEM IN LOWER&Q> ;;LEFT CORNER OF PLAYFLD&1& PLEV78&Q>& PGAMEOVER&Q>&PSD2' GOVER'!START;;IF YES RESET GAME'NONE2Q>;;IF BYTE # <> 1$'PLEV78;;THEN DISPLAY.'1;;ANOTHER TROLL8'Q>;;ON LOWEST LINEB'PLEV78;;OF PLAYFLDL'A;;RESTORE POINTERV'?`'%!REMTRL;;REMOVE OLD TROLL DRAWINGj'&GEMQ>;;IF CHAR IN FRONT OF TROLLt'P@TEMP127;;IS A GEM CHAR~'1;;THEN REPLACE GEM WITH'Q>;;FRONT VIEW OF TROLL' P@TEMP127'3'!REMTRL3;;SET POINTER SO TROLL'Q>;;DRAWING IS REMOVED' P@TEMP127'3' P@TEMP127'!RF4Q;;NEXT BYTE'RFR3Q>;;LEFT HALF DRAWING'P@TEMP127;;NEW POSITION'3;;MOVE POINTER RIGHT(Q>;;RIGHT HALF OF DRAWING (P@TEMP127;;NEW POS(3;;MOVE POINTER RIGHT(Q>;;REMOVE OLD DRAWING(( P@TEMP1272(RF4Q3;;NEXT BYTE OF LINE<()>';;ALL BYTES CHECKED?F(ERF11;;IF YES EXITP(!RF1Q;;ELSE CHECK NEW BYTEZ( RF11:d(X;n(X;SUBROUTINE EGG:CHECKS 37THx(X;BYTE OF EACH PLAYFIELD(X;LINE TO SEE IF IT IS A(X;CHARACTER THAT DEVELOPS(X;INTO A TROLL CHARACTER(!X;TROLL FORMS OUT OF CHARACTER(X;1,2,&3.FRONT VIEW OF TROLL(X;IS CHARACTER 4&5.(X;(#EGG%>%;;SET POINTER TO BYTE 37(+Q@TEMP127;;TEMP12 HOLDS ADDRESS OF LINE(R>;;STARTING CHAR OF TROLL(HRF5($Q>;;NEXT CHAR OF TROLL SEQUENCE( P@TEMP127):)#RF5R>;;CONTINUE TO FORM TROLL)HRF7")#Q>;;3RD CHAR OF TROLL SEQUENCE,) P@TEMP1276):@)#RF7R>;;CONTINUE TO FORM TROLLJ)HRF6T)3^) Q@TEMP127h)FRSr):|)*RSQ>;;RIGHT HALF OF TROLL,FRONT VIEW) P@TEMP127)1)Q>;;LEFT HALF OF TROLL) P@TEMP127)RF6:)X;)X;SUBROUTINE TROLL:EVALUATES) X;TABLE VALUE THAT REPRESENTS)"X;DELAY BEFORE TROLL IS FORMED,)X;TURNED LEFT,AND MOVED.)X;)"TROLL$>;;# OF PLAYFLD ROWS-1)OO1QTABLE19;;LOAD DELAY*R>;;IF < 255 ADD 1 TO*"DOO2;; DELAY AND GET NEXT LINE* MOVCRQ;;MOVE TROLL&* FACELEFT;;TURN TROLL LEFT0* EGG;;START TROLL FORMING:*QTABLE69;;RESET DELAYD* PTABLE19N*%R>;;253 IS LEAST AMOUNT OF DELAYX*EOO2;;GET NEXT LINEb*#TABLE69;;SPEED UP DELAYl*OO2#TABLE19v*% LINECNT;;SET TEMP12 TO NEXT LINE*0;;DONE CHECKING LINES?*IOO1;;IF<0 THEN DONE*:*X;*!X;SUBROUTINE DISPEGG:EVALUATES* X;TABLE VALUE THAT REPRESENTS*X;DELAY BEFORE CHARACTER*X;THAT FORMS INTO A TROLL*X;WILL APPEAR*X;*DISPEGG$>;;# OF ROWS -1*!%>%;;BYTE WHERE TROLL APPEARS*OO5QTABLE39;;CHECK DELAY+!HOO6;;IF HIGH&LOW TABLE BYTES +QTABLE29;;ARE ZERO THEN+FOO7;;FORM TROLL +OO6;;;ELSE DEC DELAY*+ QTABLE294+S>>+ PTABLE29H+ QTABLE39R+S>\+ PTABLE39f+!OO4p+-OO7Q@TEMP127;;IS TROLL ALREADY DISPLAYEDz+#HOO4;;IF YES THEN GET NEXT LINE+Q>;;ELSE RESET TABLE+ PTABLE29+ QTABLE59+ PTABLE39+Q>;;DISPLAY START OF TROLL+ P@TEMP127+OO4 LINECNT;;NEXT LINE+0;;16 LINES CHECKED?+IOO5+:+X;+*MOVMISQ ;;IS MISS 1 TOUCHING PLAYER3+R>;;IF 8OR> THEN YES,DNM1,!NM3,'NM1Q ;;IS MISS 2 TOUCHING PLAYER3$,R>.,DNM28,!NM3Q>Z;;LOAD LENGHT OF DELAYB,!PGUNFLAG;;STORE TO FREEZE GUNL,Q>N;;CHANGE COLOR OF GUNV,P`,,NM2QSCOUNT;;IF SCORE>70 THEN MOVE GHOSTj,R>Ft, DMEXIT~,"P5;;SET NEW POS OF MISILE,"P5;;AND SAVE,QP5, PHPOSM1,"P7,"P7,QP7, PHPOSM3,"P6,"P6,QP6, PHPOSM2,"P4-"P4 -QP4- PHPOSM0-R> (- EMEXIT2- GHOSTM<- MEXIT:F-X;P-X;SUBROUTINE GOVER:USED ATZ-#X;END OF GAME.PRINTS OUT MESSAGEd-X;"GAME OVER" AND CHECKS TOn-!X;SEE IF START KEY IS PRESSED.x-X;-"GOVERQ>5LEV2;;LOAD ADDRESS OF-"PTEMP12;;LINE WHERE MESSAGE-Q>4LEV2;;IS TO PRINT- PTEMP12-%>';;# OF BYTES-1 PER ROW-Q>;;ZERO TO CLEAR ROW-GV1P@TEMP127;;CLEAR ROW-Q>-1-)>-HGV1-Q>*;;SET COLOR PLFD3-P.%>;;DISPLAY RIGHT TROLL.Q>. P@TEMP127".1,.Q>6. P@TEMP127@.1J.!Q> ;;DISPLAY TROLL THAT WALKST.!P@TEMP127;;AND PRINTS MESSASE^.1h.Q>r. P@TEMP127|.Q>;;POINTER TO LETTER OF.PTEMP1;;MESSAGE.GV2%> ;;CHECK TO SEE IF.Q@TEMP127;;MESSAGE IS DONE.HGV5;;IF <> THEN DONE. DELAY;;ELSE DELAY. MOVCRQ;;MOVE TROLL LEFT.%> ;;CHECK TO SEE IF."GV3Q@TEMP127;;TROLL HAS MOVED.#R>;;IF CHAR 6 THEN TROLL MOVED. FGV4;;SO IF EQ PRINT MESSAGE.3.*)>;;CHECK ROW THAT MESSAGE IS PRINTED."HGV3;;IN ORDER TO FIND A TROLL/!GV2/.GV4$TEMP1;;LOAD POINTER TO MESSAGE LETTER/QSCR79;;GET LETTER&/PLEV2 9;;DISPLAY0/"TEMP1;;NEXT LETTER:/!GV2D/GV5Q>;;IF MESSAGE DONEN/ P@TEMP127;;PRINT FRONT TROLLX/3;;AT THE FAR LEFTb/Q>l/ P@TEMP127v/ GV0"/Q;;IS START KEY PRESSED/R>/ FGEXIT/!GV0/ GEXIT:/X;/X;SUBROUTINE DELAY/X;/ DELAY$>/ D1%>/D21/HD2/00HD1 0:0X; 0!X;MAIN PROGRAM START1:DISPLAYS*0$X;STARTING MESSAGE ,WALKING TROLL40X;,AND GAME TITLE>0X;H0&START1Q;;SAVE CHAR BASE ADDRESSR0PTR\0Q>5CHAR;;STORE REDEFINEDf0P;;CHAR BASE ADDRESSp0 PCHBASEz0 ZEROSC;;CLEAR SCREEN0 INITIAL0$>;0Q>0#ST10PSCR49;;CLEAR SCORE SCREEN000 IST100$>'0ST6QSCR69;;DISPLAY MESSAGE0 PLEV29000IST60Q>;;COLOR WHITE0P1ST7";;FADE MESSAGE1 DELAY1Q;;MESSAGE GONE?$1HST7.1 ZEROSC81#%>#;;SET POINTER FOR DISPLAYINGB1Q>;;TROLLL1 PLEV18V13`1Q>j1 PLEV18t1Q>5LEV1;;SET TEMP12 TO~1PTEMP12;;LINE WHERE1Q>4LEV1;;TROLL WALKS1 PTEMP121ST MOVCRQ;;MOVE TROLL1 DELAY1%>1Q@TEMP127;;IS TROLL AT LINE1FST;;BYTE 19?1Q>;;IF YES THEN DISPLAY1"P@TEMP127;;FRONT VIEW OF TROLL1Q>131 P@TEMP1272 DELAY 2 DELAY2Q>*;;COLOR ORANGE2P(2$>';;DISPLAY "TROLL WAR"22ST9QSCR529;;READ IN LETTER<2PSCR59;;DISPLAY LETTERF20P2IST9Z2 DELAYd2 DELAYn2 DELAYx2 DELAY2Q>;;BUILD REMAINING2!PSCR5;;PICTURES (OF TOLLS)2 PSCR5;;THAT ARE DISPLAYED2PSCR5;;AT TOP OF SCREEN2 PSCR52Q>2 PSCR52 PSCR52 PSCR52 PSCR52Q>2 PSCR52Q>3 PSCR53$>3%ST8QSCR429;;READ IN "SCORE00000""3PSCR49;;SAVE/DISPLAY,3063IST8@3X;J3X;SUBROUTINE START:JUMPST3!X;TO SUBROUTINES TO INITIALIZE^3 X; GAMEh3X;r3START SETTBL6|3 INITIAL3 ZEROSC3 JS153 GHOSTM3Q>3$>5VBROUTIN3%>4VBROUTIN3 \3 ORGIN3 WALL3 PLAYERS3X;3X;MAIN LOOP :CONTROLS PLAY3 X;OF GAME.4MAINLOOPQ>4PM4&#;;CHANGE COLOR OF MISSILE GHOST&4 ORGIN04 TROLL:4 DISPEGGD4 QSCOUNTN4R>X4DMN1b4 DISPEGGl4 QSCOUNTv4R>4DMN14 DISPEGG4MN1 MOVEMIS4 QTIMER2;;TIMER1&2 ARE DELAYS4"R>;;BEFORE TROLL APPEARS,IF=24#DNOSH;;THEN SPEED UP APPEARANCE4$>;;BY SHIFTING VALUE4!OO8VTABLE39;;OF TABLE3 RIGHT4 0;;ONE BIT4IOO84Q>;;RESET TIMERS4 PTIMER14 PTIMER25NOSH!MAINLOOP 5X;5X;MISC WORKSPACE 5X;*5 SCR1(45 LEV9(>5 LEV0PH5 LEV1R5 LEV2\5 LEV3Pf5 ENDSC(p5 LEV7(z5 LEV8P5 LEV4P5 TABLE15 TABLE65 TABLE25 TABLE35 SCR45 SCR5(5X;55 START1