þþZEI2+†TEMP10€;;POINTER TO BYTE IN PLAYFIELDd)…TEMPS‚;;VARIABLE FOR JOYSTICK VALUE–(…TEMPT„;;VARIABLE FOR TRIGGER VALUEÈ#†TEMPCH†;;POINTER TO CHARACTERú†TEMP12ˆ;;TEMP STORAGE, †TEMP11Š^ …TEMPQŒÂA„REM1;;POINTER TO CURRENT POSITION(USE TO REMOVE CHARACTER)ô<„REM2’;;POINTER TO DESTINATION CHAR(USE TO REMOVE CHAR)õ.…HPOST”;;VARIABLE FOR HORIZONTAL POSITIONöƒT1Y–;;TEMP STORAGE÷ †JSTCKV˜& X"‚PM ;;START OF PM GRAPHICSŠ ƒMIS ¼„PL0R î„PL1R  „PL2R R„PL3R „7ˆTEMPCHAR ;;TEMP STORAGE OF CURRENT MAN DRAWINGS¶…TEMP1 ;;TEMP STORAGEè†DIRECT ƒDA1 ;;DELAY VARIABLESL„END1 ;;VERT END OF MAN~„TOP1 ;;VERT TOP OF MAN°"‚P0 ;;HORIZ POSITION OF MANâ ‚P1 8†LRDRAW ;;POINTER TO LEFT/RIGHT DRAWINGS OF TROLLF)†MANNUM ;;OFFSET TO TROLL DRAWINGSx †TIMER1 ;;TIMER VARIABLESª†TEMP13 ;;TEMP STORAGE܆TEMPSQ '†SQFLAG ;;FLAG FOR MISSILE FIRED@3‡DIRFLAG ;;VARIABLE FOR DIRECTION OF MISSILEr‚T1 ;;TEMP STORAGE¤ ‚T2 Ö ‚T3 × ‚T5 Ø ‚T6 Ù ‚T7 Ú ‚T8 Û ƒT15 Ü ƒT16  „FSQ1 : „FSQ2 l0…WARFL ;;FLAG FOR WAR BETWEEN TROL/WIZARDž)‡TEMP140 ;;VARIABLE TO ADD 40 OR 14#…MISP1 ;;POSITION OF MISSILEf „MIS2 ˜0…CHECK ;;VARIABLE OF VERT MOVEMENT OF MANʈGUNDELAY Ë2‡TROLWIZ ;;FLAG USE TO DETERMINE WHOSE TURNü‡SDELAY1 ;;SOUND DELAY` '…NOTES ;;POINTER TO NOTE OF SONGa X;b X;c $X;ROUTINE DISPINT:USED BY DISPLAYd X;LIST INTERRUPT TO ALLOW THEe X;TITLE SCREEN TO BE MIXEDf X;GRAPHICS MODES.g X;’ "‡DISPINT5;;SAVE THE ACCUMULATORÄ Q>;;1 TO CLEAR GTIA MODEö P Ô;;WRITE TO WSYNC( PÐ;;CLEAR GPRIORZ Q>t;;LOAD COLOR BLUEŒ Pľ Q>œ;;LOAD COLOR BLUEð PÅ" Q>ˆ;;LOAD COLOR BLUET PƆ 7;;RETORE THE ACCUM.¸ 9;;EXIT ROUTINE¹ X;º X;» &X;SUBROUTINE ZEROPLRS:CLEARS PLAYER¼ X;MISSILE AREA½ X;ê #ˆZEROPLRS$>;;USE ZERO TO CLEAR A;;SET BYTE POINTERN ‚Z1P„PL0R9;;CLEAR MEMORY€ P„PL1R9² P„PL2R9ä P„PL3R9 PƒMIS9H 2;;NEXT BYTEz H‚Z1;;256 BYTES ZEROED?¬ :;;IF = THEN EXIT­ X;® !X;SUBROUTINE LOADCHAR:LOADS 22¯ &X;CONSECUTIVE NUMBERS THAT POINT TO° X;CHAR DRAWINGS OF TROLLS OR± 9X;WIZARDS AND SAVES THE POINTERS IN MEMORY STARTING AT² 'X;TEMPCHAR.THIS SUBROUTINE IS CALLED³ #X;PRIOR TO EACH PLAYERS TURN AND´ X;IS USED TO GENERALIZEµ X;OTHER SUBROUTINES.¶ X;Þ !ˆLOADCHAR%>;;POINTER TO BYTEƒLD1A;;X IS POINTER TO CHARBPˆTEMPCHAR8;;SAVE POINTERt0;;NEXT POINTER¦1;;NEXT MEMORY BYTEØIƒLD1;;ALL 22 NUMBERS SAVED? :;;IF <0 THEN EXIT X; X; !X;SUBROUTINE INITIAL:THIS SUBRX;INITIALIZES ALL VARIABLESX;X;<"‡INITIALQ>;;# OF MEN ON BOARDn&P…TEMP1;;COUNTER FOR # OF TROLLS 'P…TEMP1;;COUNTER FOR # OF WIZARDS6.…INIT1Q>…DLISTÿ;;LOW BYTE OF DISPLAY LISThP0š*Q>…DLIST;;HIGH BYTE OF DISPLAY LISTÌP1þ*‡PMGRAPHQ>‚PM;;ADDRESS OF PM MEMORY0PÔbQ>>;;ENABLE PM GRAPH”P/ÆQ>øPÐ\!‡COLORPLQ>;;SET PRIORITY ANDŽPo;;ENABLE 5TH PLAYERÀQ>ä;;COLOR ORANGE-GREENòPÄ$Q>;;COLOR GOLDVPňQ>È;;COLOR GREENºPÆìQ>;;COLOR GRAYPÀPPÁ‚P´Q>N;;COLOR PINKæPÃQ>˜;;COLOR BLUEJPÇ|!‡PLRSIZEQ>;;SET PLAYER WIDTH®PÐàP ÐP ÐDQ>;;SET PLAYER WIDTHvP ШP ÐjƒVARP…TEMP1œ*P†MANNUM;;POINTER TO NEXT TROLL DRAWINGÎ3P†LRDRAW;;POINTER TO LEFT OR RIGHT TROLL DRAWINGPƒDA1;;DELAY VARIABLE2 PƒDA1dPÐ;;HIT CLEAR–Q>2ÈPƒDA1;;DELAY VARIABLEÉQ>Ê P…TEMP1ËQ>Ì*PƒT1Y;;HIGH BYTE FOR PAGE 0 VARIABLEú…SOUNDQ>;;ENABLE SOUND,PÒ^Q>;;"TURN OFF" SOUNDPÒÂPÒôPÒ&PÒXPÒŠQ>ª;;SET VOLUMN/DISTORTION¼PÒîPÒ PÒRPÒ„:;;EXIT INITIALIZATION…X;†X;‡'X;SUBROUTINE PLAYERS:THIS SUBROUTINEˆX;BUILDS THE PLAYFIELD BOARD‰#X;WHICH IS IN CHECKER BOARD FORMŠX;¶&‡PLAYERSQ>P;;HORIZ POS OF PLAYER 0èPÐQ>p;;HORIZ POS OF PLAYER 1LPÐ~Q>;;HORIZ POS OF PLAYER 2°PÐâ#%>0;;VERT OFFSET OF ALL PLAYERS-ƒPL1$>;;(SIZE-1) OF PLAYING BOARD SQUAREF$ƒPL2Q>Ì;;VALUE FOR CHECKER BOARDx P„PL0R8ª P„PL1R8Ü P„PL2R8.Q>3;;VALUE FOR CHECKER BOARD ONE ROW LOWER@ P„PL0R8r P„PL1R8¤ P„PL2R8Ö3;;NEXT PLAYER BYTE "0;;NEXT LINE OF SQUARE OF BOARD: #IƒPL2;;ALL 8 LINE OF SQUARE DONEl C;;LOAD PLAYER VERT OFFSETž ,Ð O>;;ADD 8 FOR NEXT ROW!?4! )>Ê;;IF >202 THEN BOARD DONEf!!DƒPL1;;ELSE CREATE ANOTHER ROWê$:;;EXIT PLAYERSë$X;ì$ X;ADD401:THIS SUBROUTINE ADDSí$X;40 OR 1 TO POINTER TEMP10î$X;% †ADD401,N% Q†TEMP10€% O‡TEMP140²% P†TEMP10ä%Q†TEMP10&O>H&P†TEMP10z&:{&X;|&%X;SUB401:THIS SUBROUTINE SUBTRACTS}&X;40 OR 1 TO POINTER TEMP10~&X;¬& †SUB401;Þ& Q†TEMP10' S‡TEMP140B' P†TEMP10t'Q†TEMP10¦'S>Ø'P†TEMP10 (: (X; (X; ("X;SUBROUTINE MOVEPNTR:MOVES THE("X;CHAR POINTER LEFT,RIGHT,UP OR( X;DOWN.(X;<(ˆMOVEPNTR%>;;CLEAR Yn(!Q@…TEMPS7;;READ JOYSTICK VALUEo( X;AND TEST VALUE TO DETERMINEp(#X;DIRECTION TO MOVE CHAR POINTER (R>Ò(FƒPR7;;BRANCH TO MOVE RIGHT)R> 6)F„PR11;;BRANCH TO MOVE LEFTh)R> š)F„PR13;;BRANCH TO MOVE DOWNÌ)R>þ)F„PR14;;BRANCH TO MOVE UP0* :;;EXITb*&„PR13Q†TEMP10;;TEST CHAR POINTER”*!R>…LEV14;;POS TO SEE IF ITÆ*D…PR13A;;IS ON LOWESTø*Q†TEMP10;;PLAYFIELD LINE*+R>…LEV14ÿ\+ D…PR13AŽ+:À+"…PR13AQ>(;;# OF BBYTES PER ROWò+$!…MOVE1;;JMP TO MOVE POINTER DOWN$, ƒPR7Q†TEMP10;;TEST POINTERV,"R>†BOTTOM;;POS TO SEE IF ITˆ,D„PR7A;;IS IN LOWER RIGHTº,Q†TEMP10;;LIMIT OF PLAYFIELDì,R>†BOTTOMÿ- D„PR7AP- :;;EXIT‚-(„PR7AQ>;;USE 1 TO MOVE RIGHT 1 BYTE´-/…MOVE1 …MOVE3;;RESTORE CHAR WHERE POINTER ISæ- †ADD401;;MOVE POINTER RIGHT. …MOVE4;;DISP NEW POINTERJ. :;;EXIT|.(„PR14Q†TEMP10;;TEST POINTER POS TO®.!R>†LEV14A;;SEE IF IT IS ONà.D„NOMV;;UPPER PLAYFIELD LINE/ F…PR14BD/!…PR14A;;IF NOT,MOVE UPv/…PR14BQ†TEMP10;;SAME AS PR14¨/R>†LEV14AÿÚ/ D„NOMV 0 !…PR14A>0„NOMV:;;NO MOVE(EXIT)p0!…PR14AQ>(;;# OF BYTES PER ROW¢0"!…MOVE2;;JMP TO MOVE POINTER UPÔ0(„PR11Q†TEMP10;;TEST POS OF POINTER1R>ƒTOP;;TO SEE IF IT IS81D„NOMV;;IN UPPER LEFT LIMITj1F…PR11B;;OF PLAYFIELDœ1"!…PR11A;;ELSE MOVE POINTER LEFTÎ1…PR11BQ†TEMP10;;SAME AS PR112 R>ƒTOPÿ22 D„NOMVd2(…PR11AQ>;;USE 1 TO MOVE LEFT 1 BYTE–2/…MOVE2 …MOVE3;;RESTORE CHAR WHERE POINTER ISÈ2$ †SUB401;;MOVE POINTER LEFT OR UPú2 …MOVE4;;DISPLAY NEW POINTER,3 :;;EXIT^3,…MOVE3P‡TEMP140;;SAVE 1 OR 40 IN VARIABLE3!Q…TEMP1;;LOAD OLD CHAR HALFÂ3P@†TEMP107;;SAVE IN OLD POSô33;;NEXT BYTE&4&Q…TEMP1;;LOAD OTHER HALF OF CHARX4P@†TEMP107;;SAVE IN OLD POSŠ4 :;;EXIT¼4…MOVE4%>;;CLEAR Yî4Q@†TEMP107;;LOAD CHAR 5P…TEMP1;;TEMP SAVER5Q>F;;DISPLAY LEFT HALF„5P@†TEMP107;;OF CHAR POINTER¶53;;NEXT BYTEè5Q@†TEMP107;;LOAD CHAR6P…TEMP1;;TEMP SAVEL6Q>G;;DISPLAY RIGHT HALF~6P@†TEMP107;;OF CHAR POINTER°6 :;;EXIT±6X;²6X;³6X;DELAY:SUBROUTINE FOR DELAY´6X;â6…DELAYQ>ÿ;;DELAY VALUE7PƒDA1F7ƒDL1QƒDA1;;DELAY VARIABLEx7 PƒDA1ª7ƒDL2"ƒDA1Ü7HƒDL28"ƒDA1@8HƒDL1r8:s8X;t8X;u8,X;JOYSTICK:LOADS VALUE OF JOYSTICK 0 OR 1v8X;FROM PAGE 0 VARIABLE TEMPSw8$X;AND MOVES THE CHARACTER(A TROLLx8$X;OR A WIZARD)FROM PLAYFIELD BYTEy8 X;(POINTED TO BY TEMP10) TO Az8X;NEW POSITION{8X;¤8,ˆJOYSTICKQ†TEMP10;;SAVE STARTING POSITIONÖ8P„REM1;;OF MAN THAT HAS9Q†TEMP10;;BEEN SELECTD:9P„REM1;;TO BE MOVEDl9!Q@…TEMPS7;;LOAD JOYSTICK VALUEÐ9R>;;TEST VALUE:.F‡STICK15;;BRANCH TO DISP FRONT VIEW OF MAN4:%P…TEMP1;;SET FLAG FOR MAN MOVEDf:R>;;TEST JOYSTICK˜:%F†STICK7;;BRANCH TO MOVE MAN RIGHTÊ:R> ;;TEST JOYSTICKü:&H†NEXTJY;;<> TEST WITH OTHER VALUES.;!‡STICK11;;JMP TO MOVE LEFTö;†NEXTJYR>( ¾<#H…ENDJY;;IF NOT ABOVE VALUE EXITð<"!‡STICK13;;JMP TO MOVE MAN DOWN"=…ENDJY:;;EXIT JOYSTICKT=5‡STICK15$>;;POINTER TO FRONT VIEW OF MAN DRAWING†= …UPDN0%>¸=3„UPDNQˆTEMPCHAR9;;LOAD RIGHT HALF OF MAN DRAWINGê='P@†TEMP107;;SAVE IN PLAYFIELD MEMORY> 1;;CLEAR YN>-0;;SET POINTER TO LEFT HALF OF MAN DRAWING€>QˆTEMPCHAR9;;LOAD DRAWING²>'P@†TEMP107;;SAVE IN PLAYFIELD MEMORYä> :;;EXIT?3†STICK7Q@†TEMP107;;LOAD BYTE IN PLAYFIELD MEMORYH?;RˆTEMPCHAR;;TEST TO SEE IF IT IS A MAN FRONT VIEW OF MANz? H‚C6;;IF NOT,CONTINUE TO TEST¬?#$>;;SET POINTER TO MAN DRAWINGÞ?"!…UPDN0;;JMP TO CHANGE/MOVE MAN@/‚C6RˆTEMPCHAR;;CMP WITH CHAR MOVING RIGHTB@H‚C8;;IF <>,CONTINUE TESTINGt@.$> ;;SET POINTER TO CHANGE MAN WITHIN BYTE¦@!!…UPDN0;;JMP TO CHANGE DRAWINGØ@4‚C8RˆTEMPCHAR;CMP WITH CHAR MOVEING RIGHT INTO AH‚CC;;THE NEXT BYTE TO RIGHT;;USE 2 TO SET POINTER(TEMP10)nA P‡TEMP140;;TWO BYTES TO RIGHT A †ADD401ÒA%>;;CLEAR YB"Q@†TEMP107;;LOAD PLAYFIELD BYTE6BF„C122;;IF = MOVE MAN RIGHThB3QˆTEMPCHAR;;ELSE DETERMINE IF TROLLS OR WIZ TURNšBR>;;IF 1 THEN TROLLS TURNÌBHƒC1C;;ELSE WIZS TURNþB ‡PREWAR10C ‡SUBWAR2;;JMP SUB TO FIGHTbC :;;EXIT”C ƒC1CR>;;IF 17 THEN WIZ TURNÆCHƒCCAøC ‡PREWAR1*D ‡SUBWAR1\D :;;EXITŽD&ƒCCA †SUB401;;ELSE RESTORE (TEMP10)ÀD‚CC:òD"„C122 †SUB401;;RESTORE (TEMP10)$E%>;;CLEAR YVEQ>;;LOAD 0 TO CLEARˆEP@†TEMP107;;PLAYFIELD BYTEºE%>;;SET Y TO NEW POSìE$>;;LOAD CHAR OFFSETF% „UPDN;;JMPSUB TO DISPLAY NEW VIEWPFQ>‚F P‡TEMP140´F+!†ADD401;;ADD 1 TO TEMP10 TO SET NEW POSæF*‡STICK11Q@†TEMP107;;LOAD PLAYFIELD BYTEG)RˆTEMPCHAR;;CMP WITH FRONT VIEW OF MANJG#HƒC6A;;IF<> CMP WITH OTHER CHARS|G-$>;;LOAD CHAR OFFSET FOR MAN MOVING LEFT®G#!…UPDN0;;DISPLAY MAN MOVING LEFTàGCƒC6ARˆTEMPCHAR;;CMP WITH CHAR FOR MAN MOVING LEFT WITHIN BYTEH)HƒC8A;;IF <> THEN CMP WITH OTHER CHARSDH6$>;;ELSE LOAD CHAR OFFSET TO MOVE MAN WITHIN BYTEvH!!…UPDN0;;JMP TO CHANGE DRAWING¨H9ƒC8ARˆTEMPCHAR;;CMP WITH MAN MOVING LEFT TO NEW POSÚHHƒCCC;;IF <> THEN EXIT IQ>;;VALUE TO BE SUBTRACTED>IP‡TEMP140;;TEMPORARY SAVEpI, †SUB401;;MOVE POINTER TEMP10 LEFT 1 BYTE¢I"Q@†TEMP107;;LOAD PLAYFIELD BYTEÔIFƒC82;;IF = THEN MOVE MANJ5QˆTEMPCHAR;;ELSE DETERMINE IF TROLL OR WIZARD TURN8J$R>;;CHAR $17 IS 1ST WIZARD CHARjJ#HƒC2C;;IF <> TEST FOR TROLL TURNœJ$ ‡PREWAR2;;JMP TO SAVE TEMP10 POSÎJ+ ‡SUBWAR1;;JMPSUB FOR ATTACKING SEQUENCEK:2K%ƒC2CR>;;CHAR 1 IS 1ST TROLL CHARdK!HƒC4C;;IF <> THEN RESET TEMP10–K' ‡PREWAR2;;JMPSUB TO SAVE TEMP10 POSÈK+ ‡SUBWAR2;;JMPSUB FOR ATTACKING SEQUENCEúK:,LƒC4C †ADD401;;RESET TEMP10^LƒCCC:;;EXITLƒC82$>;;LOAD CHAR OFFSETÂL$ …UPDN0;;DISPLAY NEW VIEW OF MANôLC;;LOAD ACCUM WITH 0&M)%>;;SET Y TO POINT TO OLD POS OF MANXM P@†TEMP107;;CLEAR OLD DRAWINGŠM:¼M/‡STICK14Q>(;;VALUE TO CALCULATE 1 ROW ABOVEîMP‡TEMP140;;TEMPORARY SAVE N †SUB401;;CALCULATE NEW POSRN(Q@†TEMP107;;PLAYFIELD BYTE IN NEW POS„NFƒUP0;;IF= THEN MOVE MAN UP¶N1ƒE01QˆTEMPCHAR;;ELSE DTERMINE WHOSE TURN IT ISèN'R>;;CHAR $17 IS 1ST WIZARD DRAWINGO H„JE14LO' ‡PREWAR2;;JMPSUB TO SAVE TEMP10 POS~O ‡SUBWAR1;;JMPSUB TO FIGHT°O:âO.„JY14Q>(;;VALUE TO RESET TEMP10 TO OLD POSPP‡TEMP140;;TEMP SAVEFP †ADD401;;RESET TEMP10xP:ªP)„JE14R>;;CHAR 1 IS 1ST TROLL DRAWINGÜPH„JY14;;IF <> THEN EXITQ" ‡PREWAR2;;ELSE SAVE TEMP10 POS@Q% ‡SUBWAR2;;JMP TO CONDUCT FIGHTINGrQ:¤QƒUP03;;SET ROW OFFSETÖQ&Q@†TEMP107;;LOAD PLAYFIELD-ROW BYTER,HƒE01;;IF <> TEST TO SEE WHAT CHAR IT IS:R †ADD401;;ELSE RESET TEMP10lR1Q…CHECK;;LOAD VARIABLE FOR # OF VERT MOVEMENTSžR+R>;;IF > 3 THEN MAN CANNOT BE MOVED UPÐRDƒUOK;;ELSE OK TO MOVE UPS:4S,ƒUOK#…CHECK;;ADD 1 TO # OF VERT MOVEMENTSfS%>;;CLEAR Y˜S* †ST1213;;DISPLAY VIEW OF MAN MOVING UPÊS& †SUB401;;SET TEMP10 TO 1 ROW ABOVEüS$>;;LOAD CHAR OFFSET.T †ST1D1F;;CONTINUE TO DISPLAY`T †ST2320;;MAN MOVING UP’T$> ;;CHAR OFFSETÄT" †ST1D1F;;DISPLAY MAN MOVING UPöTQ>;;USE 0 TO CLEAR(UP@†TEMP107;;CHAR IN OLD POSZU1ŒU P@†TEMP107¾U" †SUB401;;SET TEMP10 TO NEW POSðU9†ST1213QˆTEMPCHAR;;DISPLAY FINAL VIEW OF MAN MOVING"VP@†TEMP107;;PLAYFIELD BYTETV3;;NEXT ROW POS†VQˆTEMPCHAR ¸V P@†TEMP107êV …DELAYW:NW/‡STICK13Q>(;;VALUE TO CALCULATE 1 ROW LOWER€WP‡TEMP140;;TEMP SAVE²W" †ADD401;;SET TEMP10 TO NEW POSäW"Q@†TEMP107;;LOAD PLAYFIELD BYTEXF…DOWN0;;IF = MOVE MAN DOWNHXƒE02QˆTEMPCHARzXR>¬X H„JE13ÞX ‡PREWAR1Y ‡SUBWAR1BY:tY „JY13Q>(¦Y P‡TEMP140ØY †SUB401 Z:nZ H„JY13 Z ‡PREWAR1ÒZ ‡SUBWAR2[:6[ …DOWN03;;SET Y TO NEW ROW POSh["Q@†TEMP107;;LOAD PLAYFIELD BYTEš[#F…DOWN1;;IF = THEN MOVE MAN DOWNÌ[!ƒE02þ[*…DOWN1 †SUB401;;RESET TEMP10 TO OLD POS0\,Q…CHECK;;VARIABLE FOR # OF VERT MOVEMENTSb\R>;;IF < 3 THEN”\DƒDOK;;DOWN MOVE OKÆ\:;;ELSE RTSø\,ƒDOK#…CHECK;;ADD 1 TO # OF VERT MOVEMENTS*]%>;;CLEAR Y\]+ †ST1213;;JMP TO DISPLAY MAN MOVING DOWNŽ]$> ;;CHAR OFFSETÀ] †ST1D1F;;CONTINUE DISPLAYINGò] †ST2320;;MAN MOVING DOWN$^$>;;CHAR OFFSETV^* †ST1D1F;;CONTINUE DISPLAYING DOWN MOVEˆ^* †SUB401;;SET POINTER TO OLD POS OF MANº^#Q>;;USE 0 TO CLEAR OLD DRAWINGì^ P@†TEMP107_1P_ P@†TEMP107‚_* †ADD401;;SET POINTER TO NEW POS OF MAN´_1!†ST1213;;DISPLAY FINAL VIEW OF MAN IN NEW POSæ_†ST2320$>;;CHAR OFFSET`% …UPDN0;;DISPLAY LOWER HALF OF MANJ`" †SUB401;;CALCULATE 1 ROW ABOVE|`#QˆTEMPCHAR;;UPPER HALF OF MAN®` P@†TEMP107;;SAVE IN PLAYFIELDà`3;;NEXT PLAYFIELD BYTEa-QˆTEMPCHAR;;OTHER HALF OF UPPER DRAWINGDa%P@†TEMP107;;SAVE IN PLAYFIELD BYTEva …DELAY¨a:Úa,†ST1D1F …UPDN0;;DISPLAY UPPER HALF OF MAN b" †ADD401;;CALCULATE 1 ROW BELOW>b$QˆTEMPCHAR9;;LOWER HALF OF MANpb P@†TEMP107;;SAVE IN PLAYFIELD¢b3;;NEXT PLAYFIELD BYTEÔb.QˆTEMPCHAR9;;OTHER HALF OF LOWER DRAWINGc P@†TEMP107;;SAVE IN PLAYFIELD8c …DELAYjc:kcX;lcX;mc X;JOYST0:LOADS THE ADDRESS OFnc X;OF STICK0 AND TRIGGER0 INTOocX;PAGE 0 VARIABLESpcX;œc†JOYST0Q>;;JOYSTICK 0Îc P…TEMPSdQ>x2d P…TEMPSddQ>;;TRIGGER 0–d P…TEMPTÈdQ>„úd P…TEMPT,e:^e†JOYST1Q>;;JOYSTICK 1e P…TEMPSÂeQ>yôe P…TEMPS&fQ>;;TRIGGER 1Xf P…TEMPTŠfQ>…¼f P…TEMPTîf: g&…TEN12Q>…LEV12;;STARTING POS OFRg-P†TEMP10;;CHAR POINTER WHEN TROLLS TURN„gQ>…LEV12ÿ¶g P†TEMP10èg:h(†TEN122Q>†LEV122;;STARTING POS OFLh-P†TEMP10;;CHAR POINTER WHEN WIZARD TURN~hQ>†LEV122ÿ°h P†TEMP10âh:i…PLACE%>;;ROW OFFSETFi"Q>F;;LEFT HALF OF CHAR POINTERxi P@†TEMP107;;PLAYFIELD ROW POSªi3;;NEXT ROW POSÜiQ>G;;RIGHT HALF OF CHAR POSj%P@†TEMP107;;PLAYFIELD ROW POSITION@j:AjX;BjX;Cj!X;TROLLM:SUBROUTINE THAT CALLSDj$X;ROUTINES TO EITHER MOVE POINTEREj(X;OR THE TROLL/WIZARD.THIS SUBROUTINEFj X;ALSO MONITORS # OF MEN THATGj#X;HAVE BEEN MOVED.IF 4 MEN MOVEDHjX;THEN TURN OVERIjX;Öj†TROLLMQ>;;CLEAR VAR FORkP…TEMP1;;# OF MEN MOVED.mƒTM3Q>;;0 TO CLEAR`m$P…WARFL;;FLAG FOR TROLL/WIZ FIGHT’m+P…TEMP1;;CLEAR VAR THAT RESTORES CHARÄm*P…TEMP1;;AFTER POINTER MOVED OVER ITÅm„TM13Q>;;0 TO CLEARÆm P…TEMP1Çm"#…TEMP1;;ADD 1 TO # OF TURNSÈm Q…TEMP1ÉmR>;;IF <5,TURN NOT OVERÊmE„TM15;;IF >=EXITËm!ƒTM1;;ELSE MOVE POINTERÌm„TM15%>;;CLEAR YÍm' …MOVE3;;REMOVE POINTER/RESTORE CHARÎm :;;EXITömƒTM1 ˆMOVEPNTR;;MOVE POINTER(n …DELAYŒn%>;;CLEAR Y¾nQ@…TEMPT7;;LOAD TRIGGERðn*HƒTM1;;IF NOT PRESSED THEN MOVE POINTER"o) …MOVE3;;RESTORE CHAR WHERE POINTER ISTo%Q…TEMP1;;TEST TO SEE IF CHAR IS†oRˆTEMPCHAR;;A TROLL OR WIZ¸o FƒTM0;;IF IT IS THEN MOVE MANêo( ˆPLACEMAN;;ELSE TEST TO DISP NEW MANp …MOVE4;;DISP POINTERNp!ƒTM1;;MOVE POINTER€pƒTM0 …DELAY²p …DELAYäp …DELAYåp …DELAYHqQ>zq P…CHECK¬qƒTM2%>;;CLEAR YÞq ˆJOYSTICK;;MOVE MANr0QˆTEMPCHAR;;LOAD POINTER TO TROLL/WIZ DRAWINGBr!R>;;1=TROLL TURN/22=WIZ TURNtr FˆTESTTROL¦rQ…TEMP1;;IF= THEN NO WIZØrH„TM14;;IS ON PLAYFIELD sQ†WIZRDS;;IF NOT= THEN WIZ'S;;CLEAR Y”uQ@…TEMPT7;;LOAD TRIGGERÆu&HƒTM2;;IF NOT PRESS,JMP TO MOVE MAN*v%QˆTEMPCHAR;;LOAD FRONT VIEW OF MAN\vP…TEMP1;;TEMP SAVE$w0QˆTEMPCHAR;;LOAD OTHER HALF OF MAN DRAWINGVwP…TEMP1;;TEMP SAVEºw …PLACE;;DISPLAY POINTERìw Q…TEMP1x F„TM16x …DELAY x …DELAY!x …DELAY"x …DELAY#x.!„TM13;;JMP TO MOVE ANOTHER MAN OR END TURNPx„TM16 …DELAY‚x …DELAY´x …DELAYæx …DELAYy!ƒTM1;;JMP TO MOVE POINTER>{>ŒD:TROLL1.M65p{>ŒD:TROLL2.M65¢{>ŒD:TROLL3.M65Ô{>ŒD:TROLL4.M65|>ŒD:TROLL5.M658|>ŒD:TROLL6.M65j|>ŒD:TROLL7.M65œ|>ŒD:TROLL8.M65}>ŒD:TROLL9.M65}X;}+X;VBRTIN:VERTICLE BLANK ROUTINE CONTROLS}#X;EITHER TROLL COMBATING WIZARD}X;OR CASTLE BEING STORMED}X;2}†VBRTINQ>d}PM–} Q…DLISTÈ}R>…CASTL;;IF CASTL ISú}HƒVB1;;IN DISPLAY LIST,~#Q…DLIST;;THEN TROLL CASTLE IS^~R>…CASTLÿ;;BEING ATTACKED~2HƒVB1;;ELSE TEST DISPLAY LIST FOR OTHER SCREENSÁ~- ˆFIREVAR2;;JMPSUB TO INITIALIZE VARIABLESÂ~, ˆFIREBOMB;;JMPSUB TO FIRE ATTACKERS BOMBô~, ˆMOVEBOMB;;JMPSUB TO MOVE ATTACKERS BOMB&QˆGUNDELAY;;IF FLAG =0 THENXF†NODEC1;;MOVE DEFENDING GUNŠ""ˆGUNDELAY;;ELSE DECREASE DELAYî!ƒVBC;;EXIT VERTBLANK €'†NODEC1Q>*;;RESET COLOR OF PLAYER 3!€PÄ€) „SET0;;JMPSUB TO INIT TROLL VARIABLES¶€$>è€%>Q>L P…TEMP1~, ˆMISSILE1;;JMPSUB TO FIRE DEFENDERS BOMB°! „SET1;;INIT WIZARDS VARIABLES±% ˆFIREVAR2;;INIT ATTACKER VARIABLEâ! ˆFIREBOMB;;FIRE ATTACKER BOMB‚" ˆMOVEBOMB;;MOVE ATTACKERS BOMBF‚)QÐ;;LOAD PLAYER3 TO PLAYER COLLISIONx‚'H„HIT1;;IF NE THEN DEFENDERS GUN HITƒ!ƒVBB;;ELSE EXIT VERTBLANK@ƒ„HIT1Q>;;RESET COLOR„PÃ;;OF PLAYER 3l„!ƒVBA;;JMP TO EXITž„ƒVB1Q…DLISTЄR>…CASTR;;IF CASTR IS IN…HƒVB2;;DISPLAY LIST THEN4… Q…DLIST;;WIZARDS CASTLE ISf…R>…CASTRÿ;;BEING ATTACKED˜…HƒVB2É…' ˆFIREVAR1;;INIT ATTACKERS VARIABLESÊ…" ˆFIREBOMB;;FIRE ATTACKERS BOMBü…" ˆMOVEBOM2;;MOVE ATTACKERS BOMB.†QˆGUNDELAY;;IF DELAY IS =`†$F†NODEC2;;THEN MOVE DEFENDERS GUN’†""ˆGUNDELAY;;ELSE DECREASE DELAYö†!ƒVBC;;EXIT VERTBLANKŒ‡"†NODEC2Q>Z;;SET PLAYER 2 COLOR¾‡PÂð‡ „SET0;;INIT TROLL VARIABLES!ˆ' ˆFIREVAR1;;INIT ATTACKERS VARIABLES"ˆ" ˆFIREBOMB;;FIRE ATTACKERS BOMBTˆ" ˆMOVEBOM2;;MOVE ATTACKERS BOMB†ˆ! „SET1;;INIT WIZARDS VARIABLES¸ˆ$>êˆQ>!‰ P…TEMP1N‰%>€‰" ˆMISSILE1;;MOVE DEFENDERS BOMB²‰$QÐ;;PLAYER2 TO PLAYER COLLISIONä‰ H„HIT2zŠ!ƒVBB;;EXIT VERTBLANK¬Š%„HIT2Q>;;RESET COLOR OF PLAYER 2ÞŠP‹ƒVBAPÒ;;TURN OFF SOUNDB‹4Q>Z;;VALUE FOR HOW LONG DEFENDERS GUN DISAPPEARSt‹ƒVBBPˆGUNDELAY¦‹ƒVBCPÐ;;HIT CLEARØ‹!bä;;EXIT VERT BLANK Œ ƒVB2Q1<Œ!R>†DLIST2;;IF DLIST2 IS INnŒHƒVBC;;THE DISPLAY LISTÒŒQ0;;THEN A TROLLR>†DLIST2ÿ;;IS FIGHTING6HƒVBC;;A WIZARDš$Q…TEMP1 ;;FLAG FOR TROLL/WIZARDÌHƒVBC;;HIT BY BOMB1Ž& „TVAR;;JMP TO INIT TROLL VARIABLES2Ž$>3Ž"QÐ;;TROLLS BOMB IS INPLAYER 3bŽ †MOVESQ;;MOVE TROLLS BOMBcŽ$>dŽQÐ;;HPOSP3”Ž †MOVESQ;;MOVE TROLLS BOMBÆŽ †FIRETQ;;FIRE TROLLS BOMBÇŽ „WVAR;;INIT WIZ VARIABLESÈŽ$>ÉŽ!QÐ;;WIZS BOMB IS IN PLAYER 0øŽ †MOVESQ;;MOVE WIZARDS BOMBùŽ$>úŽQÐ;;HPOSP0* †MOVESQ;;MOVE WIZ BOMB\ †FIRESQ;;FIRE WIZARDS BOMBŽ%QÐ;;MISSILE 0 T PLAYER COLLISIONÀM>;;IS PLAYER1,2OR3 HITòFƒVB5;;IF = THEN NOT HIT$Q…TEMP1;;ELSE DECREASEVFƒVT1;;THE # OF TROLLSˆ "…TEMP1ºƒVT1Q>;;SET FLAG FORìP…TEMP1 ;;TO END FIGHT‘*ƒVB5Q Ð;;MISSILE 3 TO PLAYER COLLISIONP‘M>;;IS PLAYER 0 HIT‚‘FƒVB3;;IF = THEN NOT HIT´‘Q…TEMP1;;ELSE DECREASEæ‘FƒVW1;;THE # OF WIZARDS’ "…TEMP1J’ƒVW1Q>;;SET FLAG FOR|’P…TEMP1 ;;TO END FIGHT®’$P†TEMP13;;SET FLAG FOR WIZARD HITà’ƒVB3PÐ;;HIT CLEAR“!bä;;END VERTBLANK“X;D“„SET0$>;;INITIALIZEv“ †JOYST0;;JOYSTICK 0¨“%>;;VARIABLESÚ“ …T12P3 ” ‡JOYSTG0>”:?”X;p” „SET1$>¢” †JOYST1Ô”%>• …T12MS8• ‡JOYSTG0j•:k•X;l•#X;START:ACTUAL START OF THE GAMEm•X;DISPLAYS TITLE SCREEN ANDn•X;INITIALIZES GAMEo•X;œ•#…STARTQ>;;SET BACKGROUND COLORΕPÈ–Q>†DLIST1;;LOAD ADDRESS2–P1;;OF DISPLAY LISTd–Q>†DLIST1ÿ;;FOR DISPLAY––P0;;OF TITLE SCREENÈ–Q>A;;ENABLE GTIAú–Po;;SAVE IN SHADOW,—PÐ;;AND IN GPRIOR^—Q>‡ROWDISP;;LOAD ADDRESS—P†TEMP10;;OF DISPLAY LINE—!Q>‡ROWDISPÿ;;ON TITLE SCREENô—P†TEMP10;;WHERE TROLL WALKS&˜+$>;;LOAD POINTER TO LAST TROLL DRAWINGX˜" ˆLOADCHAR;;LOAD TROLL DRAWINGSŠ˜Q>„CHAR;;LOAD ADDRESS OF¼˜Pô;;CHAR BASEî˜$Q>&;;(LENGTH-1)OF PLAYFIELD LINE ™P‡TEMP140;;TEMP SAVE!™) †ADD401;;SET TEMP10 TO POINT TO TROLLR™Q>È;;VALUE OF DELAY„™PƒDA1;;DELAY VARIABLE¶™&Q>‡DISPINT;;ENABLE DISPLAY LISTè™P;;INTERRUPTšQ>‡DISPINTÿLšP~šQÔ°šL>€âšPÔF›&Q>(;;USE 40 TO MOVE TROLL 20 BYTESx›)P‚T1;;(TROLL MOVES TWICE IN EACH BYTE)@œ …SOUND;;ENABLE SOUNDrœQ>;;SET POINTER TO SONG¤œ P…NOTESÖœ†STLOOP …DELAY%>;;CLEAR Y: ‡STICK11;;MOVE TROLL LEFTm$…NOTES;;LOAD SONG OFFSETžQ„NOTE9;;GET NOTEÐPÒ;;PLAY NOTEž$#…NOTES;;SET POINTER TO NEXT NOTEžQ…NOTES;;LOAD POINTER4žR>;;IF ALL 8 NOTES HAVEfžD†OKNOTE;;BEEN PLAYED˜žQ>;;RESET POINTERÊž P…NOTESüž†OKNOTE"‚T1.Ÿ.H†STLOOP;;IF = TROLL IS IN MIDDLE OF SCREEN`Ÿ%>;;CLEAR YaŸ'Ò;;TURN OFF SOUND’Ÿ!Q>;;LOAD FRONT VIEW OF TROLLÄŸP@†TEMP107;;SAVE ON SCREENöŸ!Q>;;LOAD OTHER HALF OF TROLL( 3;;ADD 1 TO OFFSETZ P@†TEMP107;;SAVE ON SCREEN¿ ‡STLOOP1 …DELAY  …DELAYð " ‡INITIAL;;INITAILIZE VARIABLES"¡ ˆZEROPLRS;;CLEAR PM MEMORYT¡Q>;;ENABLE VERTICLE BLANK†¡$>†VBRTIN¸¡%>†VBRTINÿê¡ \ä¢# ‡PLAYERS;;BUILD PLAYFIELD BOARD¢X;¢ X;MAINLOOP:CONTROLS GAME PLAY¢X;²¢*ˆMAINLOOPQ…TROL0;;IS BYTE INFRONT OFä¢F†TROLLS;;TROLL CASTLE CLEAR£&Q…TEMP1;;IS A TROLL ON PLAYFIELDH£ F‡WIZTURNz£1†TROLLS †JOYST0;;ENABLE JOYSTICK0 TO BE LOADED¬£3 …TEN12;;SET POS WHERE CHAR POINTER IS DISPLAYEDÞ£ …PLACE;;DISPLAY CHAR POINTER¤*$>;;SET POINTER TO LAST TROLL DRAWINGB¤" ˆLOADCHAR;;LOAD TROLL DRAWINGSt¤ †TROLLM;;MOVE TROLL¦¤(‡WIZTURNQ†WIZRDS;;IS BYTE IN FRONT OFؤF‡WIZARDS;;WIZ CASTLE CLEAR ¥$Q…TEMP1;;IS A WIZ ON PLAYFIELD<¥ F†TROLLSn¥2‡WIZARDS †JOYST1;;ENABLE JOYSTICK1 TO BE LOADED ¥9 †TEN122;;SET POSITION WHERE CHAR POINTER IS DISPLAYEDÒ¥ …PLACE;;DISPLAY CHAR POINTER¦+$>,;;SET POINTER TO LAST WIZARD DRAWING6¦" ˆLOADCHAR;;LOAD WIZARD DRAWINGh¦$ †TROLLM;;CALL SUB TO MOVE WIZARDš¦ !ˆMAINLOOP̦pþ¦†DLIST2 p=p0§ Db§ …SCR2M”§ ====Ƨ ====ø§ ====*¨ ====\¨ ==Ž¨ AÀ¨ †DLIST2ò¨†DLIST1 p=p=p=p=p$© p=p=p=p=p=OV© …SCR1Mˆ© ====º© ====ì© ====ª ===Pª p=p=D‚ª ‡ROWDISP´ª Aæª †DLIST1«…DLIST p=EJ« †TITLES|« D®« …BOARDà«' ===========¬! =========D¬ Av¬ …DLISTÚ¬…EXPLD =>=ò=|==( ­(†TITLES =========>­! ==Þ=ß=à=á=â=ã=ä=åp­! =æ=ç=è=é=ê=ë=ì==¢­! =========Ô­(†TABLE7 þ=ˆ==`=@= =%=@= =0® P==@=P=P=08®(†TABLE5 =========j® =====œ® „NOTE ó=Á=Ù=¢=ó=¶=Ù=¢Î®†TABLE2 ¯†TABLE3 2¯ …TKING d¯ …WKING –¯ †TOTALT  ȯ †TOTALW  ú¯)‡ROWDISP =========,°! =========^°! =========°! =========°8„ROWT ===============ô°8„ROWW ===============&±>D:TROLL12.M65X±>D:TROLL11.M65Š±>D:TROLL10.M65¼±>D:TROLL13.M65î±>D:TROLL14.M65 ²>D:TROLL15.M65R²>D:TROLL16.M65„²à¶² …START