@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu  } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED736 FREE SECTORS COPYING---D1:DIRECK.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 138ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uZEI2+TEMP10;;POINTER TO BYTE IN PLAYFIELDd)TEMPS;;VARIABLE FOR JOYSTICK VALUE(TEMPT;;VARIABLE FOR TRIGT}GER VALUE#TEMPCH;;POINTER TO CHARACTERTEMP12;;TEMP STORAGE, TEMP11^ TEMPQAREM1;;POINTER TO CURREU}NT POSITION(USE TO REMOVE CHARACTER);;1 TO CLEAR GTIA MODE P ;;WRITE TO WSYNC( P;;CLEAR GPRIORZ Q>t;;LOAD COa}LOR BLUE P Q>;;LOAD COLOR BLUE P" Q>;;LOAD COLOR BLUET P 7;;RETORE THE ACCUM. 9;;EXIT ROUTINE X; b}X; &X;SUBROUTINE ZEROPLRS:CLEARS PLAYER X;MISSILE AREA X; #ZEROPLRS$>;;USE ZERO TO CLEAR A;;SET BYTE POINTERN Zc}1PPL0R9;;CLEAR MEMORY PPL1R9 PPL2R9 PPL3R9 PMIS9H 2;;NEXT BYTEz HZ1;;256 BYTES ZEROED? :;;IF = THEN EXIT d}X; !X;SUBROUTINE LOADCHAR:LOADS 22 &X;CONSECUTIVE NUMBERS THAT POINT TO X;CHAR DRAWINGS OF TROLLS OR 9X;WIZARDS AND SAVEe}S THE POINTERS IN MEMORY STARTING AT 'X;TEMPCHAR.THIS SUBROUTINE IS CALLED #X;PRIOR TO EACH PLAYERS TURN AND X;IS USED TOf} GENERALIZE X;OTHER SUBROUTINES. X; !LOADCHAR%>;;POINTER TO BYTELD1A;;X IS POINTER TO CHARBPTEMPCHAR8;;SAVE POg}INTERt0;;NEXT POINTER1;;NEXT MEMORY BYTEILD1;;ALL 22 NUMBERS SAVED? :;;IF <0 THEN EXIT X; X; !X;SUBROUTINE INh}ITIAL:THIS SUBRX;INITIALIZES ALL VARIABLESX;X;<"INITIALQ>;;# OF MEN ON BOARDn&PTEMP1;;COUNTER FOR # OF TROLi}LS'PTEMP1;;COUNTER FOR # OF WIZARDS6.INIT1Q>DLIST;;LOW BYTE OF DISPLAY LISThP0*Q>DLIST;;HIGH BYTE OF Dj}ISPLAY LISTP1*PMGRAPHQ>PM;;ADDRESS OF PM MEMORY0PbQ>>;;ENABLE PM GRAPHP/Q>P\!COLORPLQ>k};;SET PRIORITY ANDPo;;ENABLE 5TH PLAYERQ>;;COLOR ORANGE-GREENP$Q>;;COLOR GOLDVPQ>;;COLOR GREEl}NPQ>;;COLOR GRAYPPPPQ>N;;COLOR PINKPQ>;;COLOR BLUEJP|!PLRSIZEQ>;;SET PLAYm}ER WIDTHPP P DQ>;;SET PLAYER WIDTHvP ШP jVARPTEMP1*PMANNUM;;POINTER TO NEXT TROLL DRAWIn}NG3PLRDRAW;;POINTER TO LEFT OR RIGHT TROLL DRAWINGPDA1;;DELAY VARIABLE2 PDA1dP;;HIT CLEARQ>2PDA1o};;DELAY VARIABLEQ> PTEMP1Q>*PT1Y;;HIGH BYTE FOR PAGE 0 VARIABLESOUNDQ>;;ENABLE SOUND,P^Qp}>;;"TURN OFF" SOUNDPPP&PXPҊQ>;;SET VOLUMN/DISTORTIONPP PRP҄:;;EXIT q}INITIALIZATIONX;X;'X;SUBROUTINE PLAYERS:THIS SUBROUTINEX;BUILDS THE PLAYFIELD BOARD#X;WHICH IS IN CHECKER BOARD r}FORMX;&PLAYERSQ>P;;HORIZ POS OF PLAYER 0PQ>p;;HORIZ POS OF PLAYER 1LP~Q>;;HORIZ POS OF PLAYER 2Ps}#%>0;;VERT OFFSET OF ALL PLAYERS-PL1$>;;(SIZE-1) OF PLAYING BOARD SQUAREF$PL2Q>;;VALUE FOR CHECKER BOARDx PPt}L0R8 PPL1R8 PPL2R8.Q>3;;VALUE FOR CHECKER BOARD ONE ROW LOWER@ PPL0R8r PPL1R8 PPL2R83;;NEXT PLAYEu}R BYTE "0;;NEXT LINE OF SQUARE OF BOARD: #IPL2;;ALL 8 LINE OF SQUARE DONEl C;;LOAD PLAYER VERT OFFSET , O>;;ADD 8 FOv}R NEXT ROW!?4! )>;;IF >202 THEN BOARD DONEf!!DPL1;;ELSE CREATE ANOTHER ROW$:;;EXIT PLAYERS$X;$ X;ADD401:THIS SUBROUw}TINE ADDS$X;40 OR 1 TO POINTER TEMP10$X;% ADD401,N% QTEMP10% OTEMP140% PTEMP10%QTEMP10&O>H&PTEMP10zx}&:{&X;|&%X;SUB401:THIS SUBROUTINE SUBTRACTS}&X;40 OR 1 TO POINTER TEMP10~&X;& SUB401;& QTEMP10' STEMP140B' PTEMP10y}t'QTEMP10'S>'PTEMP10 (: (X; (X; ("X;SUBROUTINE MOVEPNTR:MOVES THE("X;CHAR POINTER LEFT,RIGHT,UP OR( X;DOWz}N.(X;<(MOVEPNTR%>;;CLEAR Yn(!Q@TEMPS7;;READ JOYSTICK VALUEo( X;AND TEST VALUE TO DETERMINEp(#X;DIRECTION TO MOVE CHAR {}POINTER(R>(FPR7;;BRANCH TO MOVE RIGHT)R> 6)FPR11;;BRANCH TO MOVE LEFTh)R> )FPR13;;BRANCH TO MOVE DOWN)R>|})FPR14;;BRANCH TO MOVE UP0* :;;EXITb*&PR13QTEMP10;;TEST CHAR POINTER*!R>LEV14;;POS TO SEE IF IT*DPR13A;;IS O}}N LOWEST*QTEMP10;;PLAYFIELD LINE*+R>LEV14\+ DPR13A+:+"PR13AQ>(;;# OF BBYTES PER ROW+$!MOVE1;;JMP TO MOVE POIN~}TER DOWN$, PR7QTEMP10;;TEST POINTERV,"R>BOTTOM;;POS TO SEE IF IT,DPR7A;;IS IN LOWER RIGHT,QTEMP10;;LIMIT OF P}LAYFIELD,R>BOTTOM- DPR7AP- :;;EXIT-(PR7AQ>;;USE 1 TO MOVE RIGHT 1 BYTE-/MOVE1 MOVE3;;RESTORE CHAR WHERE POINTE}R IS- ADD401;;MOVE POINTER RIGHT. MOVE4;;DISP NEW POINTERJ. :;;EXIT|.(PR14QTEMP10;;TEST POINTER POS TO.!R>LEV14A};;SEE IF IT IS ON.DNOMV;;UPPER PLAYFIELD LINE/ FPR14BD/!PR14A;;IF NOT,MOVE UPv/PR14BQTEMP10;;SAME AS PR14/R>}LEV14A/ DNOMV 0 !PR14A>0NOMV:;;NO MOVE(EXIT)p0!PR14AQ>(;;# OF BYTES PER ROW0"!MOVE2;;JMP TO MOVE POINTER UP0(PR}11QTEMP10;;TEST POS OF POINTER1R>TOP;;TO SEE IF IT IS81DNOMV;;IN UPPER LEFT LIMITj1FPR11B;;OF PLAYFIELD1"!PR}11A;;ELSE MOVE POINTER LEFT1PR11BQTEMP10;;SAME AS PR112 R>TOP22 DNOMVd2(PR11AQ>;;USE 1 TO MOVE LEFT 1 BYTE2/MO}VE2 MOVE3;;RESTORE CHAR WHERE POINTER IS2$ SUB401;;MOVE POINTER LEFT OR UP2 MOVE4;;DISPLAY NEW POINTER,3 :;;EXIT^3,MOV}E3PTEMP140;;SAVE 1 OR 40 IN VARIABLE3!QTEMP1;;LOAD OLD CHAR HALF3P@TEMP107;;SAVE IN OLD POS33;;NEXT BYTE&4&QTEMP1};;LOAD OTHER HALF OF CHARX4P@TEMP107;;SAVE IN OLD POS4 :;;EXIT4MOVE4%>;;CLEAR Y4Q@TEMP107;;LOAD CHAR 5PTEMP1};;TEMP SAVER5Q>F;;DISPLAY LEFT HALF5P@TEMP107;;OF CHAR POINTER53;;NEXT BYTE5Q@TEMP107;;LOAD CHAR6PTEMP1;;TE}MP SAVEL6Q>G;;DISPLAY RIGHT HALF~6P@TEMP107;;OF CHAR POINTER6 :;;EXIT6X;6X;6X;DELAY:SUBROUTINE FOR DELAY6X;6D}ELAYQ>;;DELAY VALUE7PDA1F7DL1QDA1;;DELAY VARIABLEx7 PDA17DL2"DA17HDL28"DA1@8HDL1r8:s8X;t8X;u}8,X;JOYSTICK:LOADS VALUE OF JOYSTICK 0 OR 1v8X;FROM PAGE 0 VARIABLE TEMPSw8$X;AND MOVES THE CHARACTER(A TROLLx8$X;OR A WIZAR}D)FROM PLAYFIELD BYTEy8 X;(POINTED TO BY TEMP10) TO Az8X;NEW POSITION{8X;8,JOYSTICKQTEMP10;;SAVE STARTING POSITION8PR}EM1;;OF MAN THAT HAS9QTEMP10;;BEEN SELECTD:9PREM1;;TO BE MOVEDl9!Q@TEMPS7;;LOAD JOYSTICK VALUE9R>;;TEST VALUE}:.FSTICK15;;BRANCH TO DISP FRONT VIEW OF MAN4:%PTEMP1;;SET FLAG FOR MAN MOVEDf:R>;;TEST JOYSTICK:%FSTICK7;;BRANCH }TO MOVE MAN RIGHT:R> ;;TEST JOYSTICK:&HNEXTJY;;<> TEST WITH OTHER VALUES.;!STICK11;;JMP TO MOVE LEFT;NEXTJYR>( <#HENDJY;;IF NOT ABOVE VALUE EXIT<"!STICK13;;J}MP TO MOVE MAN DOWN"=ENDJY:;;EXIT JOYSTICKT=5STICK15$>;;POINTER TO FRONT VIEW OF MAN DRAWING= UPDN0%>=3UPDNQTEMPC}HAR9;;LOAD RIGHT HALF OF MAN DRAWING='P@TEMP107;;SAVE IN PLAYFIELD MEMORY> 1;;CLEAR YN>-0;;SET POINTER TO LEFT HALF OF MAN} DRAWING>QTEMPCHAR9;;LOAD DRAWING>'P@TEMP107;;SAVE IN PLAYFIELD MEMORY> :;;EXIT?3STICK7Q@TEMP107;;LOAD BYTE IN PLAYF}IELD MEMORYH?;RTEMPCHAR;;TEST TO SEE IF IT IS A MAN FRONT VIEW OF MANz? HC6;;IF NOT,CONTINUE TO TEST?#$>;;SET POINTER TO} MAN DRAWING?"!UPDN0;;JMP TO CHANGE/MOVE MAN@/C6RTEMPCHAR;;CMP WITH CHAR MOVING RIGHTB@HC8;;IF <>,CONTINUE TESTINGt}@.$> ;;SET POINTER TO CHANGE MAN WITHIN BYTE@!!UPDN0;;JMP TO CHANGE DRAWING@4C8RTEMPCHAR;CMP WITH CHAR MOVEING RIGHT} INTO AHCC;;THE NEXT BYTE TO RIGHT;;USE 2 TO SET POINTER(TEMP10)nA PTEMP140;;TWO BYTES TO RIGHTA ADD401A%>;;}CLEAR YB"Q@TEMP107;;LOAD PLAYFIELD BYTE6BFC122;;IF = MOVE MAN RIGHThB3QTEMPCHAR;;ELSE DETERMINE IF TROLLS OR WIZ TURNB}R>;;IF 1 THEN TROLLS TURNBHC1C;;ELSE WIZS TURNB PREWAR10C SUBWAR2;;JMP SUB TO FIGHTbC :;;EXITC C1CR>;;IF 17 THE}N WIZ TURNCHCCAC PREWAR1*D SUBWAR1\D :;;EXITD&CCA SUB401;;ELSE RESTORE (TEMP10)DCC:D"C122 SUB401;;RESTORE (T}EMP10)$E%>;;CLEAR YVEQ>;;LOAD 0 TO CLEAREP@TEMP107;;PLAYFIELD BYTEE%>;;SET Y TO NEW POSE$>;;LOAD CHAR OFFSET}F% UPDN;;JMPSUB TO DISPLAY NEW VIEWPFQ>F PTEMP140F+!ADD401;;ADD 1 TO TEMP10 TO SET NEW POSF*STICK11Q@TEMP107;;LOA}D PLAYFIELD BYTEG)RTEMPCHAR;;CMP WITH FRONT VIEW OF MANJG#HC6A;;IF<> CMP WITH OTHER CHARS|G-$>;;LOAD CHAR OFFSET FOR MAN} MOVING LEFTG#!UPDN0;;DISPLAY MAN MOVING LEFTGCC6ARTEMPCHAR;;CMP WITH CHAR FOR MAN MOVING LEFT WITHIN BYTEH)HC8A;;I}F <> THEN CMP WITH OTHER CHARSDH6$>;;ELSE LOAD CHAR OFFSET TO MOVE MAN WITHIN BYTEvH!!UPDN0;;JMP TO CHANGE DRAWINGH9C8AR}TEMPCHAR;;CMP WITH MAN MOVING LEFT TO NEW POSHHCCC;;IF <> THEN EXIT IQ>;;VALUE TO BE SUBTRACTED>IPTEMP140;;TEMPOR}ARY SAVEpI, SUB401;;MOVE POINTER TEMP10 LEFT 1 BYTEI"Q@TEMP107;;LOAD PLAYFIELD BYTEIFC82;;IF = THEN MOVE MANJ5QTEMPCH}AR;;ELSE DETERMINE IF TROLL OR WIZARD TURN8J$R>;;CHAR $17 IS 1ST WIZARD CHARjJ#HC2C;;IF <> TEST FOR TROLL TURNJ$ PREWAR2};;JMP TO SAVE TEMP10 POSJ+ SUBWAR1;;JMPSUB FOR ATTACKING SEQUENCEK:2K%C2CR>;;CHAR 1 IS 1ST TROLL CHARdK!HC4C;;IF <> T}HEN RESET TEMP10K' PREWAR2;;JMPSUB TO SAVE TEMP10 POSK+ SUBWAR2;;JMPSUB FOR ATTACKING SEQUENCEK:,LC4C ADD401;;RESET }TEMP10^LCCC:;;EXITLC82$>;;LOAD CHAR OFFSETL$ UPDN0;;DISPLAY NEW VIEW OF MANLC;;LOAD ACCUM WITH 0&M)%>;;SET Y TO} POINT TO OLD POS OF MANXM P@TEMP107;;CLEAR OLD DRAWINGM:M/STICK14Q>(;;VALUE TO CALCULATE 1 ROW ABOVEMPTEMP140;;TEMP}ORARY SAVE N SUB401;;CALCULATE NEW POSRN(Q@TEMP107;;PLAYFIELD BYTE IN NEW POSNFUP0;;IF= THEN MOVE MAN UPN1E01QTEMPCH}AR;;ELSE DTERMINE WHOSE TURN IT ISN'R>;;CHAR $17 IS 1ST WIZARD DRAWINGO HJE14LO' PREWAR2;;JMPSUB TO SAVE TEMP10 POS~O }SUBWAR1;;JMPSUB TO FIGHTO:O.JY14Q>(;;VALUE TO RESET TEMP10 TO OLD POSPPTEMP140;;TEMP SAVEFP ADD401;;RESET TEMP10xP}:P)JE14R>;;CHAR 1 IS 1ST TROLL DRAWINGPHJY14;;IF <> THEN EXITQ" PREWAR2;;ELSE SAVE TEMP10 POS@Q% SUBWAR2;;JMP TO C}ONDUCT FIGHTINGrQ:QUP03;;SET ROW OFFSETQ&Q@TEMP107;;LOAD PLAYFIELD-ROW BYTER,HE01;;IF <> TEST TO SEE WHAT CHAR IT IS}:R ADD401;;ELSE RESET TEMP10lR1QCHECK;;LOAD VARIABLE FOR # OF VERT MOVEMENTSR+R>;;IF > 3 THEN MAN CANNOT BE MOVED UPR}DUOK;;ELSE OK TO MOVE UPS:4S,UOK#CHECK;;ADD 1 TO # OF VERT MOVEMENTSfS%>;;CLEAR YS* ST1213;;DISPLAY VIEW OF MAN MOV}ING UPS& SUB401;;SET TEMP10 TO 1 ROW ABOVES$>;;LOAD CHAR OFFSET.T ST1D1F;;CONTINUE TO DISPLAY`T ST2320;;MAN MOVING }UPT$> ;;CHAR OFFSETT" ST1D1F;;DISPLAY MAN MOVING UPTQ>;;USE 0 TO CLEAR(UP@TEMP107;;CHAR IN OLD POSZU1U P@TEMP10}7U" SUB401;;SET TEMP10 TO NEW POSU9ST1213QTEMPCHAR;;DISPLAY FINAL VIEW OF MAN MOVING"VP@TEMP107;;PLAYFIELD BYTETV3};;NEXT ROW POSVQTEMPCHAR V P@TEMP107V DELAYW:NW/STICK13Q>(;;VALUE TO CALCULATE 1 ROW LOWERWPTEMP140;;TEMP SA}VEW" ADD401;;SET TEMP10 TO NEW POSW"Q@TEMP107;;LOAD PLAYFIELD BYTEXFDOWN0;;IF = MOVE MAN DOWNHXE02QTEMPCHARzXR>}X HJE13X PREWAR1Y SUBWAR1BY:tY JY13Q>(Y PTEMP140Y SUB401 Z:nZ HJY13Z PREWAR1Z SUBWAR2[:6}[ DOWN03;;SET Y TO NEW ROW POSh["Q@TEMP107;;LOAD PLAYFIELD BYTE[#FDOWN1;;IF = THEN MOVE MAN DOWN[!E02[*DOWN1 SUB401};;RESET TEMP10 TO OLD POS0\,QCHECK;;VARIABLE FOR # OF VERT MOVEMENTSb\R>;;IF < 3 THEN\DDOK;;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 POINTE}R 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|`#QTEMPCHAR;;UPPER HALF OF MAN` P@TEMP107;;SAVE IN PLAYFIELD`3;;NEXT PLAYFI}ELD BYTEa-QTEMPCHAR;;OTHER HALF OF UPPER DRAWINGDa%P@TEMP107;;SAVE IN PLAYFIELD BYTEva DELAYa:a,ST1D1F UPDN0;;DI}SPLAY UPPER HALF OF MAN b" ADD401;;CALCULATE 1 ROW BELOW>b$QTEMPCHAR9;;LOWER HALF OF MANpb P@TEMP107;;SAVE IN PLAYFIELD}b3;;NEXT PLAYFIELD BYTEb.QTEMPCHAR9;;OTHER HALF OF LOWER DRAWINGc P@TEMP107;;SAVE IN PLAYFIELD8c DELAYjc:kcX;lc}X;mc X;JOYST0:LOADS THE ADDRESS OFnc X;OF STICK0 AND TRIGGER0 INTOocX;PAGE 0 VARIABLESpcX;cJOYST0Q>;;JOYSTICK 0c PTE}MPSdQ>x2d PTEMPSddQ>;;TRIGGER 0d PTEMPTdQ>d PTEMPT,e:^eJOYST1Q>;;JOYSTICK 1e PTEMPSeQ>ye P}TEMPS&fQ>;;TRIGGER 1Xf PTEMPTfQ>f PTEMPTf: g&TEN12Q>LEV12;;STARTING POS OFRg-PTEMP10;;CHAR POINTER }WHEN TROLLS TURNgQ>LEV12g PTEMP10g:h(TEN122Q>LEV122;;STARTING POS OFLh-PTEMP10;;CHAR POINTER WHEN WIZARD} TURN~hQ>LEV122h PTEMP10h:iPLACE%>;;ROW OFFSETFi"Q>F;;LEFT HALF OF CHAR POINTERxi P@TEMP107;;PLAYFIELD ROW PO}Si3;;NEXT ROW POSiQ>G;;RIGHT HALF OF CHAR POSj%P@TEMP107;;PLAYFIELD ROW POSITION@j:AjX;BjX;Cj!X;TROLLM:SUBROUTINE T}HAT CALLSDj$X;ROUTINES TO EITHER MOVE POINTEREj(X;OR THE TROLL/WIZARD.THIS SUBROUTINEFj X;ALSO MONITORS # OF MEN THATGj#X;HAV}E BEEN MOVED.IF 4 MEN MOVEDHjX;THEN TURN OVERIjX;jTROLLMQ>;;CLEAR VAR FORkPTEMP1;;# OF MEN MOVED.mTM3Q>;;0 T}O CLEAR`m$PWARFL;;FLAG FOR TROLL/WIZ FIGHTm+PTEMP1;;CLEAR VAR THAT RESTORES CHARm*PTEMP1;;AFTER POINTER MOVED OVER} ITmTM13Q>;;0 TO CLEARm PTEMP1m"#TEMP1;;ADD 1 TO # OF TURNSm QTEMP1mR>;;IF <5,TURN NOT OVERmETM15;};IF >=EXITm!TM1;;ELSE MOVE POINTERmTM15%>;;CLEAR Ym' MOVE3;;REMOVE POINTER/RESTORE CHARm :;;EXITmTM1 MOVEPNTR;};MOVE POINTER(n DELAYn%>;;CLEAR YnQ@TEMPT7;;LOAD TRIGGERn*HTM1;;IF NOT PRESSED THEN MOVE POINTER"o) MOVE3;;RESTOR}E CHAR WHERE POINTER ISTo%QTEMP1;;TEST TO SEE IF CHAR ISoRTEMPCHAR;;A TROLL OR WIZo FTM0;;IF IT IS THEN MOVE MANo( }PLACEMAN;;ELSE TEST TO DISP NEW MANp MOVE4;;DISP POINTERNp!TM1;;MOVE POINTERpTM0 DELAYp DELAYp DELAYp DELA}YHqQ>zq PCHECKqTM2%>;;CLEAR Yq JOYSTICK;;MOVE MANr0QTEMPCHAR;;LOAD POINTER TO TROLL/WIZ DRAWINGBr!R>;;1=TROLL} TURN/22=WIZ TURNtr FTESTTROLrQTEMP1;;IF= THEN NO WIZrHTM14;;IS ON PLAYFIELD sQWIZRDS;;IF NOT= THEN WIZ'S;;CLEAR YuQ@TEMPT7;;LOAD TRIGGERu&HTM2;;IF NOT PRESS,JMP TO MOVE MAN*v%QTEMPCHAR;;LOAD FRONT VIEW OF MAN\}vPTEMP1;;TEMP SAVE$w0QTEMPCHAR;;LOAD OTHER HALF OF MAN DRAWINGVwPTEMP1;;TEMP SAVEw PLACE;;DISPLAY POINTERw }QTEMP1x FTM16x DELAY x DELAY!x DELAY"x DELAY#x.!TM13;;JMP TO MOVE ANOTHER MAN OR END TURNPxTM16 DELAYx }DELAYx DELAYx DELAYy!TM1;;JMP TO MOVE POINTER>{>D:TROLL1.M65p{>D:TROLL2.M65{>D:TROLL3.M65{>D:TROLL4.M6}5|>D:TROLL5.M658|>D:TROLL6.M65j|>D:TROLL7.M65|>D:TROLL8.M65}>D:TROLL9.M65}X;}+X;VBRTIN:VERTICLE BLANK RO}UTINE CONTROLS}#X;EITHER TROLL COMBATING WIZARD}X;OR CASTLE BEING STORMED}X;2}VBRTINQ>d}PM} QDLIST}R>CAS}TL;;IF CASTL IS}HVB1;;IN DISPLAY LIST,~#QDLIST;;THEN TROLL CASTLE IS^~R>CASTL;;BEING ATTACKED~2HVB1;;ELSE T}EST DISPLAY LIST FOR OTHER SCREENS~- FIREVAR2;;JMPSUB TO INITIALIZE VARIABLES~, FIREBOMB;;JMPSUB TO FIRE ATTACKERS BOMB~}, MOVEBOMB;;JMPSUB TO MOVE ATTACKERS BOMB&QGUNDELAY;;IF FLAG =0 THENXFNODEC1;;MOVE DEFENDING GUN""GUNDELAY;;ELSE DE}CREASE DELAY!VBC;;EXIT VERTBLANK 'NODEC1Q>*;;RESET COLOR OF PLAYER 3!P) SET0;;JMPSUB TO INIT TROLL VARIABLES}$>%>Q>L PTEMP1~, 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 COLLISIO}Nx'HHIT1;;IF NE THEN DEFENDERS GUN HIT!VBB;;ELSE EXIT VERTBLANK@HIT1Q>;;RESET COLORP;;OF PLAYER 3l!VBA;;J}MP TO EXITVB1QDLISTЄR>CASTR;;IF CASTR IS INHVB2;;DISPLAY LIST THEN4 QDLIST;;WIZARDS CASTLE ISfR>CA}STR;;BEING ATTACKEDHVB2Ʌ' FIREVAR1;;INIT ATTACKERS VARIABLESʅ" FIREBOMB;;FIRE ATTACKERS BOMB" MOVEBOM2;;MOVE AT}TACKERS BOMB.QGUNDELAY;;IF DELAY IS =`$FNODEC2;;THEN MOVE DEFENDERS GUN""GUNDELAY;;ELSE DECREASE DELAY!VBC;;EXIT }VERTBLANK"NODEC2Q>Z;;SET PLAYER 2 COLORP SET0;;INIT TROLL VARIABLES!' FIREVAR1;;INIT ATTACKERS VARIABLES"" }FIREBOMB;;FIRE ATTACKERS BOMBT" MOVEBOM2;;MOVE ATTACKERS BOMB! SET1;;INIT WIZARDS VARIABLES$>Q>! PTEMP1N%>}" MISSILE1;;MOVE DEFENDERS BOMB$Q;;PLAYER2 TO PLAYER COLLISION HHIT2z!VBB;;EXIT VERTBLANK%HIT2Q>;;RESET }COLOR OF PLAYER 2ފPVBAP;;TURN OFF SOUNDB4Q>Z;;VALUE FOR HOW LONG DEFENDERS GUN DISAPPEARStVBBPGUNDELAYV}BCP;;HIT CLEAR؋!b;;EXIT VERT BLANK VB2Q1DLIST2;;IF DLIST2 IS INnHVBC;;THE DISPLAY LISTҌQ0;;THEN }A TROLLR>DLIST2;;IS FIGHTING6HVBC;;A WIZARD$QTEMP1 ;;FLAG FOR TROLL/WIZARD̍HVBC;;HIT BY BOMB1& TVAR;;JMP }TO INIT TROLL VARIABLES2$>3"Q;;TROLLS BOMB IS INPLAYER 3b MOVESQ;;MOVE TROLLS BOMBc$>dQ;;HPOSP3 MOVES}Q;;MOVE TROLLS BOMBƎ FIRETQ;;FIRE TROLLS BOMBǎ WVAR;;INIT WIZ VARIABLESȎ$>Ɏ!Q;;WIZS BOMB IS IN PLAYER 0 MOV}ESQ;;MOVE WIZARDS BOMB$>Q;;HPOSP0* MOVESQ;;MOVE WIZ BOMB\ FIRESQ;;FIRE WIZARDS BOMB%Q;;MISSILE 0 T PLAY}ER COLLISIONM>;;IS PLAYER1,2OR3 HITFVB5;;IF = THEN NOT HIT$QTEMP1;;ELSE DECREASEVFVT1;;THE # OF TROLLS "}TEMP1VT1Q>;;SET FLAG FORPTEMP1 ;;TO END FIGHT*VB5Q ;;MISSILE 3 TO PLAYER COLLISIONPM>;;IS PLAYER 0 HI}TFVB3;;IF = THEN NOT HITQTEMP1;;ELSE DECREASEFVW1;;THE # OF WIZARDS "TEMP1JVW1Q>;;SET FLAG FOR|P}TEMP1 ;;TO END FIGHT$PTEMP13;;SET FLAG FOR WIZARD HITVB3P;;HIT CLEAR!b;;END VERTBLANKX;DSET0$>;;INIT}IALIZEv JOYST0;;JOYSTICK 0%>;;VARIABLESړ T12P3 JOYSTG0>:?X;p SET1$> JOYST1Ԕ%> T12MS8 JO}YSTG0j:kX;l#X;START:ACTUAL START OF THE GAMEmX;DISPLAYS TITLE SCREEN ANDnX;INITIALIZES GAMEoX;#STARTQ>;;SET B}ACKGROUND COLORΕPQ>DLIST1;;LOAD ADDRESS2P1;;OF DISPLAY LISTdQ>DLIST1;;FOR DISPLAYP0;;OF TITLE SCR}EENȖQ>A;;ENABLE GTIAPo;;SAVE IN SHADOW,P;;AND IN GPRIOR^Q>ROWDISP;;LOAD ADDRESSPTEMP10;;OF DISPLAY} LINE—!Q>ROWDISP;;ON TITLE SCREENPTEMP10;;WHERE TROLL WALKS&+$>;;LOAD POINTER TO LAST TROLL DRAWINGX" LOADCHAR;};LOAD TROLL DRAWINGSQ>CHAR;;LOAD ADDRESS OFP;;CHAR BASE$Q>&;;(LENGTH-1)OF PLAYFIELD LINE PTEMP140;;TEMP S}AVE!) ADD401;;SET TEMP10 TO POINT TO TROLLRQ>;;VALUE OF DELAYPDA1;;DELAY VARIABLE&Q>DISPINT;;ENABLE DISPL}AY LISTP;;INTERRUPTQ>DISPINTLP~Q԰L>PF&Q>(;;USE 40 TO MOVE TROLL 20 BYTESx)PT1;;(TROLL MO}VES TWICE IN EACH BYTE)@ SOUND;;ENABLE SOUNDrQ>;;SET POINTER TO SONG PNOTES֜STLOOP DELAY%>;;CLEAR Y: ST}ICK11;;MOVE TROLL LEFTm$NOTES;;LOAD SONG OFFSETQNOTE9;;GET NOTEНP;;PLAY NOTE$#NOTES;;SET POINTER TO NEXT NOTE}QNOTES;;LOAD POINTER4R>;;IF ALL 8 NOTES HAVEfDOKNOTE;;BEEN PLAYEDQ>;;RESET POINTERʞ PNOTESOKNOTE"T1..H}STLOOP;;IF = TROLL IS IN MIDDLE OF SCREEN`%>;;CLEAR Ya';;TURN OFF SOUND!Q>;;LOAD FRONT VIEW OF TROLLğP@TEMP1}07;;SAVE ON SCREEN!Q>;;LOAD OTHER HALF OF TROLL(3;;ADD 1 TO OFFSETZP@TEMP107;;SAVE ON SCREENSTLOOP1 DELAY  D}ELAY" INITIAL;;INITAILIZE VARIABLES" ZEROPLRS;;CLEAR PM MEMORYTQ>;;ENABLE VERTICLE BLANK$>VBRTIN%>VBRTI}N \# PLAYERS;;BUILD PLAYFIELD BOARDX; X;MAINLOOP:CONTROLS GAME PLAYX;*MAINLOOPQTROL0;;IS BYTE INFRO}NT OFFTROLLS;;TROLL CASTLE CLEAR&QTEMP1;;IS A TROLL ON PLAYFIELDH FWIZTURNz1TROLLS JOYST0;;ENABLE JOYSTICK0 TO} BE LOADED3 TEN12;;SET POS WHERE CHAR POINTER IS DISPLAYEDޣ PLACE;;DISPLAY CHAR POINTER*$>;;SET POINTER TO LAST TRO}LL DRAWINGB" LOADCHAR;;LOAD TROLL DRAWINGSt TROLLM;;MOVE TROLL(WIZTURNQWIZRDS;;IS BYTE IN FRONT OFؤFWIZARDS;;WIZ }CASTLE CLEAR $QTEMP1;;IS A WIZ ON PLAYFIELD< FTROLLSn2WIZARDS JOYST1;;ENABLE JOYSTICK1 TO BE LOADED9 TEN122;;SET } POSITION WHERE CHAR POINTER IS DISPLAYEDҥ PLACE;;DISPLAY CHAR POINTER+$>,;;SET POINTER TO LAST WIZARD DRAWING6" LOAD }CHAR;;LOAD WIZARD DRAWINGh$ TROLLM;;CALL SUB TO MOVE WIZARD !MAINLOOP̦pDLIST2 p=p0 Db SCR2M == }==Ƨ ==== ====* ====\ == A DLIST2DLIST1 p=p=p=p=p$ p=p= }p=p=p=OV SCR1M ==== ==== ==== ===P p=p=D ROWDISP A D }LIST1DLIST p=EJ TITLES| D BOARD' ===========! =========D A }v DLISTڬEXPLD =>==|==( (TITLES =========>! =========p! === }======! =========ԭ(TABLE7 ===`=@= =%=@= =0 P==@=P=P=08(TABLE5  }=========j ===== NOTE =======ήTABLE2 TABLE3 2 TKING d }WKING  TOTALT  ȯ TOTALW  )ROWDISP =========,! =========^! ==== }=====! =========°8ROWT ===============8ROWW === }============&>D:TROLL12.M65X>D:TROLL11.M65>D:TROLL10.M65>D:TROLL13.M65>D:TROL }L14.M65 >D:TROLL15.M65R>D:TROLL16.M65 STARTD:TROLL11.M65>D:TROLL10.M65>D:TROLL13.M65>D:TROL>#X;JS15G:USED TO LOAD GUN DRAWINGX;INTO PLAYER MEMORY JS15GQ>F;;VERT ENDING POSPEND1;;OF GUN DRAWINGS PEN }D1(Q>>;;VERT START POS2PTOP1;;OF GUN DRAWINGS< PTOP1F"P;;SAVE HORIZ POS OF PLAYER3PQ>;;HORIZ POS OFZP };;PLAYER2d$$>;;POINTER TO GUN DRAWING BYTEnG1QGUN9;;LOAD DRAWING BYTEx$PPL3R>9;;SAVE IN PLAYER MEMORYQGUN29 };;DRAWING BYTE$PPL2R>9;;SAVE IN PLAYER MEMORY0;;NEXT BYTE"IG1;;IF<0 THEN ALL BYTES MOVED:X;$X;T12P3:LOADS }ADDRESS OF PLAYER 3X;INTO TEMP12"T12P3Q>PL3R;;LOAD ADDRESSPTEMP12;;OF PLAYER3 Q>PL3R;;INTO TEMP POINT }ER PTEMP12:X;$X;T12MS:LOADS ADDRESS OF PLAYER 2X;INTO TEMP12"T12MSQ>PL2R;;LOAD ADDRESSPTEMP12;;O }F PLAYER2 Q>PL2R;;INTO TEMP POINTER PTEMP12:X;"X;JOYSTG0:MOVES GUN (DRAWING INX;PLAYER MEMORY) UP OR DOWN }X;)JOYSTG0Q@TEMPS7;;LOAD JOYSTICK VALUE"R> ;;TEST FOR POS 13,HG14;;BRANCH TO TEST FOR 146$QEND19;;LOAD VERT EN }D POS OF GUN@R>;;IS IT AT LOWER LIMITJEEXITG;;IF >OR= THEN EXITT#END19;;ELSE ADD 1 TO^#TOP19;;VERT POS OF GUNh( }$> ;;#OF BYTES OF GUNDRAWING TO MOVEr?;;LOAD ENDING POS OF GUN|#DOWNG1;;SET TO BYTE TO BE MOVED Q@TEMP1273;;SET TO } DESTINATION P@TEMP1271;;NEXT BYTE TO MOVE0;;DEC # OF BYTES TO MOVE HDOWNG:!G14R>;;IS JOYSTICK VALUE 14 }HEXITG;;IF NOT THEN EXIT!QTOP19;;VERT START POS OF GUNR>@;;IS IT AT UPPER LIMITDEXITG;;IF < THEN EXIT"END19 };;ELSE SUB 1 FROM"TOP19;;GUN'S VERT POS$?;;LOAD VERT START OF GUN DRAWING-$> ;;#OF BYTES OF GUN DRAWING TO BE MOVED& }*UPG3;;SET TO POINT TO BYTE TO BE MOVED0 Q@TEMP127:1;;SET TO DESTINATION BYTED P@TEMP127N3;;NEXT BYTE TO BE MOVEDX }0;;DEC #OF BYTES TO BE MOVEDbHUPGl EXITG:mX;n X;FIREBOMB:MOVES MISSILE BOMBoX;OR EXPLODES MISSILEv%FIREBOMBQP0 };;LOAD COUNTER FOR!FFIRE;;HOW LONG BOMB EXPLODES "P0 QP0HEXIT84;;IF = THEN;;;SUB 2 TO FINDQP0; };LOWEST POSS>;;OF EXPLODING DRAWING?!$>;;# OF BYTES TO BE CLEAREDQ>DISPPPL0R8;;CLEAR EXPLODE3;;DRAWI }NG IN PLAYER00;;ALL BYTES CLEARED IDISPQ>P :4FIREQTEMP1;;TEST FLAG FOR BOMB ALREADY FIRED  FEXIT8 }4*%>;;CLEAR Y4Q@T1Y7;;LOAD TRIGGER VALUE> HEXIT84;;IF NOT PRESSED EXITH&PTEMP1;;SET FLAG FOR BOMB FIREDR,\$ }T15f QTOP19;;START OF GUN DRAWINGpO>;;FIND MIDDLE OF GUNz?QT16;;POS WHERE BOMB STARTSP;;SAVE BOMB HORIZ PO }SPP0;;SAVE IN POINTERQ>;;BOMB DRAWING!PPL0R8;;SAVE IN PLAYER MEMORY 'P0Q>;;SET BOMB COLORPQ> !}PSDELAY1 EXIT84:X; X;MOVEBOMB:MOVES BOMB TO LEFTX;AND EXPLODES BOMBX;'MOVEBOMBQTEMP1;;IF FLAG= 0 "} THENFMOV;;MOVE BOMB:MOV"P0;;SET NEW POS"P0QP0;;HAS BOMB REACHEDR>?;;LEFT LIMIT,IF YES$DEXPLODE;;T #}HEN EXPLODE BOMB.P;;ELSE SAVE NEW POS/"SDELAY10QSDELAY11P8:B'EXPLODEQ>;;SET FLAG FOR EXPLOSIONL $}PTEMP1V;;;SET VERT POS FOR`QP0;;WHERE BOMBjS>;;WILL EXPLODEt?~%$>;;#OF BYTES IN EXPLODE DRAWING(EXPLQ %}EXPLD9;;LOAD EXPLODE DRAW BYTE!PPL0R8;;SAVE IN PLAYER MEMORY3;;NEXT STORAGE BYTE0;;NEXT DRAWING BYTE IEXPLQ> &};;SET FLAG FOR HOW%PP0;;LONG EXPLODE DRAWING LASTQ>;;SET EXPLODE COLORPQ>P:X;$X;MOVEBOM2 '}:MOVES MISSILE TO RIGHTX;AND EXPLODES MISSILEMOVEBOM2QTEMP1 FMOV2: MOV2#P0;;SET NEW POS#P0QP0;;H (}AS IT REACHED THE(R>;;RIGHT LIMIT,IF YES2EEXPLODE;;THEN EXPLODE BOMB<P;;ELSE SAVE NEW POS="SDELAY1>QSDEL )}AY1?PF:PFIREVAR1Q>AZPT16dQ>nPT1YxQ>PT15:FIREVAR2Q>PT16Q>PT1YQ>P *}T15:PF:PFIREVAR1Q>AZPT16dQ>nPT1YxQ>PT15:FIREVAR2Q>PT16Q>PT1YQ>P 2 'BOARD =========! =========! =========$ =,}========="TOP ======E=E=E! E=E=E=E=E=E=E=E=E=E! E=E=E=E=E=E=E=E=E=-}E ! E=E=E======= (LEV14A ==;=<=?=A==E== ! ========= ! ====.}===== ! ==E======= ====>=@=B=C TROL0 TROLS =! =======/}-=.=! =========! ==E=======! =======E==! ====0}=====! =-=.=/=0===/=0=! ==E=======! ==-=.=/=0==E==! ==1}=======! =====/=0===! ==E=======! ====/=0==E==! 2}=========! =========! ====-=.==== ! =/=.=-=.===E=3}=!! ========="! =========#! ==E====/=0==$! ======4}=E==%! =========&! ========='! ==E===-=.=/=0=(! ==/=0=5}===E==)! -=.=/=0======*! =========+! ==E=======,! =6}==-=.=/=0=E=/=0-! ====-=.====.! =========/! ==E==1=2=3=4==07}'LEV12 F=G======E==1! =========2! =========3! ==E====8}=1=2=44&LEV1 Z=[======E==5! =========6! =========7 ==9}E==1=2=4=8LEV122 =9! =======E==:! =========;! ===1=2=4==:}==<! ==E======\=]=! =/=.=====E==>! =========?! =====;}===1=2@! 3=4=E====/=0==A! ===/=0===E==B! =========C! ==<}=======D! ==E===-=.=5=1=2E! =-=.=====E==F! =========G! =}=1=2=3=4=====H! ==E=======I! =======E==J! =========>}-K! .=========L! ==E====1=2=4=M! =-=.===/=0=E==N! ======1?}=2=4=O! =========P! ==E===1=2=3=4=Q! ===-=.===E==R! ====@}=====S! =========T! ==E=======U! ====/=.====V! ==A}=======W! ===/=.=====X! ==E==D=;=<=?==Y! =======E==Z!B} =========[$ ==========\%WIZRDS ==9=:===>=@==]'LEV14 ====C}===E=E=E^! E=E=E=E=E=E=E=E=E=E_! E=E=E=E=E=E=E=E=E=E` E=E=E=====aBOTTOM =D}===E=E=E^! E=E=E=E=E=E=E=E=E=E_! E=E=E=E=E=E=E=E=E=E` E=E=E=====aBOTTOM =s 'CASTL =========! =========! =========! ====F}=====! ;=<=?=A==-=.=/=.=L! W==/=0======! ===/=0===-=.=/! 0=G}======== ! ==>=@=B=C====P=Q ! I=K=J=V=W===== ! -=.===/=0=-=.== H}! /=0==-=.=-=.=== ! P=Q=H=I=W===L=V=H! I=H=I=V=J=K=V=V=T=U! ========I}=! =========(ORIGIN L=M==r======! =========! ===J}======! =========! N=O=r=======! =========! =K}========! =========! N=O==r======! =========L}! =========! =========! L=M=r=======! =======M}==! ========= ! =========!! L=M==r======"! =====N}====#! =========$! =========%! N=O=r=======&! ==O}======='! =========(! =========)! N=O==r======*! P}=========+! =========,! =========-! L=M=r=======Q}.! =========/! =========0! =========1! L=M==r===R}===2! =========3! =========4! =========5! N=O=r==S}=====6! =========7! =========8! =========9! L=M=T}=r======:! =========;! =========<! ==========!U} L=M=r=======>! =========?! =========@! ========V}=A! L=M==r======B! =========C! =========D! ======W}===E! N=O=r=======F! =========G! =========H! ===X}======I! N=O==r======J! =========K! =========L! =Y}========M! L=M=r=======N! =========O! =========PZ}! =========Q'ENDSC R=S=H=I=H=I=H=K=J=IR! H=J=I=K=J=H=I=V=T=WS! =====[}====T! =========U! ==-=.==/=0===V! -=.=/=0=/=.===-=.W! ===\}======X! -=.=-=.=/=0=/=.==Y! =1=2=4=1=2=3=4==Z! 1=2=4===1=2=3=4=[! -=]}.=/=0==-=.=-=.=\! -=.=/=.=-=.==1=2=4]! =========^! =========^}_! =========`! =================^! =========B 'CASTR =========! =========! =========! ====`}=====! =====-=.=/=.=! ==/=0======! ===/=0===-=.=/! 0=a}===-=.===/=. ! ========= ! ==-=.====== ! -=.=/=.=/=0==H=H=I b}! /=0==-=.==D=;=<=? ! =========! =========! I=H=I=V=J=K=V=V=c}T=U! K=J=V===9=:===>=@)ORIGIN2 =========! =========! ===d}======! ========L=M! =========! =========! e}=========! ========N=O! =========! =========f}! =========! ========N=O! =========! =======g}==! ========= ! ========L=M!! ========="! ====q}+B%DOS SYSB*)DUP SYSBSTROLL0 M65B TROLL1 M65B+TROLL10 M65BETROLL11 M65B_TROLL12 M65BTROLL13 M65BTROLL14 M65BTROLL15 M65B5TROLL2 M65B TROLL3 M65B!TROLL4 M65BNTROLL5 M65B eTROLL6 M65BpTROLL7 M65BwTROLL8 M65BTROLL9 M65=====#! =========$! ========L=M%! =========&! ==r}======='! =========(! ========N=O)! =========*! s}=========+! =========,! ========N=O-! ========t}=.! =========/! =========0! ========L=M1! ======u}===2! =========3! =========4! ========L=M5! ====v}=====6! =========7! =========8! ========N=O9! =w}========:! =========;! =========<! ========L=M=x}! =========>! =========?! =========@! ========y}L=MA! =========B! =========C! =========D! =====z}===L=ME! =========F! =========G! =========H! ==={}=====N=OI! =========J! =========K! =========L! =|}=======N=OM! =========N! =========O! =========}}P! ========L=MQ(ENDSC2 =========R! =========S! H=J=I=K=J=~}H=I=V=T=WT! T=U=H=I=H=I=H=K=J=IU! ==-=.==/=0===V! -=.=/=0=/=.===-=.W! ==}=======X! -=.=-=.=/=0=/=.==Y! =1=2=4=1=2=3=4==Z! 1=2=4===1=2=3=4=[! }-=.=/=0==-=.=-=.=\! -=.=/=.=-=.==1=2=41=2=4=1=2=3=4==Z! 1=2=4===1=2=3=4=[! =f 'SCR2M t=t=t=t=t=t=t=t=t=t! t=t=t=t=t=t=t=t=t=t! t=t=t=t=t=t=t=t=t=t! t=t=t=t=}t=t=t=t=t=t! t=========! t=========! =======t=t=! =}========t ! t====-=.==== ! t========= ! ======t=t== }! ==1=2=4=====t ! t==/=0======! t========-=.! =t=======}1=2! 3=4===1=2=3=4==t! t======/=0==! t=========! =t====}====! =========t! t========t=t! t======-=.=/=0! =t==}======! ==1=2=3=4=t===t! t=========! =======t=t=t! t=}t==-=.=====! =t=t=1=2=4=t===t! t====t=t====! =========}! t=t======== ! ==t=====t=t=t!! t=====t===="! =====-=.=}==#! t=t========-$! .===/=0=====t%! t=====t====&! ===/=0=}===='! t=t========(! =========t)! t=====t====/*! 0==}=======+! t=t========,! =========t-! t=t===t=t=t=t=t=t.! }t===t=t=t=t=t==/! t=t=t=t=t=t=t===t0! t=t=t=t=t=t=t===t1! t=========}2! =========3! =====t====4! =1=2=3=4=====t5! t====-=.=/}=0==6! =========7! ===t=t=t====8! ===1=2=4====t9! t====}-=.===-=.:! t=========;! ===t===1=2=3=4<! =========t=! t==}/=.=====t=t>! t=========?! =========@! =========tA!} t=========B! =========C! =========D! =====-=.==}=tE! t=========F! =========G! =========tH! t=t=t=t=t=t=}t=/=0=tI! t===/=0==-=.==J! =======t=t=K! =-=.=/=0=====L! ===}======tM! t=-=.=======N! =t===-=.==t==O! =========P! =}====/=0===tQ! t====-=.===t=tR! t=t====/=0=t==S! =========T}! =1=2=3=4=====tU! t========t=V! ====-=.==t=t=W! =======}==1X! 2=4========tY! t=======t=t=Z! ========t=[! =====}====\! =========t]! t=t=t=t=t=t=t=t=t=t^! t=t=t=t=t=t=t=t=t=t_! t=t=t=}t=t=t=t=t=t=t`! t=t=t=t=t=t=t=t=t=tt=t=t=t=t=t=t=t=t^! t=t=t=t=t=t=t=t=t=t_! t=t=t=5V 0SCR1M ============! =========! ========= =!}=====* ============! =========! =========!} ====== * ============ ! ========= ! =======!}==  ====== * =========p===p! w==w=w==p===p=! =====!}==== ======* =========`===`! f==`=f==`===`=! ==!}======= ======* =========P===U! P==P=U==P===P=! !}========= ======* =========@===D! D==@=D==@===@=!}! ========= ======* =========0===0! 3==3=3==3=3!}==3=3! =========  ======!* ========"="=== "! "=="="=!}="="=="="#! =========$ ======%! =========&! =====!}===='! =========(! =========)! =========*! ==!}=======+! =========,! =========-* ===========!}=.! =========/! =========0 ======1* =========!}===2! =========3! =========4 ======5* ======!}======6! =========7! =========8 ======9* ====!}========:! ======w==p=w;! =p=w==p=w===p=p< =======* ==!}==========>! ======f==`=f?! =`=f==`=f===`=`@ ======A*!} ============B! ======U=U=U=UC! =U=U==U=P===P=PD =====!}=E* ============F! =======@==@G! =D=D==D=D===@=@H ===!}===I* ============J! =======0==0K! =0=3==0=3===0=0L !}======M* ============N! ======= == O! = ="== ="==="=!}"P =================N! ======= == O! = ="== ="==="= v"GUN = ====== =#GUN2 ========MAN |=D=l=8==== MAN1 ====%}=D=(=l MAN2 =====8==!MAN01 =======!MAN02 =======!MAN11 ==%} ==$==+=$!MAN12 == ==$=== )!MAN21 =======.!MAN22 =======3"MAN0L%}1 ===p====8"MAN0L2 ===p====="MAN1L1 =8=0==$===B"MAN1L2 =8=0==$== =%}0G"MAN2L1 =====p==L"MAN2L2 =====p==P WIZ1 8=l=D=D===|=>Q WIZM ====%}=$==2L1 =====p==L"MAN2L2 =====p==P WIZ1 8=l=D=D===|=>Q WIZM ====$ !X;ADD4011:ADDS THE LENGHT OF AX;PLAYFIELD ROW TO TEMP11X;AND THEREBY,SETS TEMP11 TOX;POINT TO NEXT ROW0ADD)}4011QTEMP11;;LOAD POINTER TO CURRENT ROW ,O>(;;ADD # OF BYTES PER ROW PTEMP11QTEMP11O>;;ADD CARRY TO HI)}GH BYTE#PTEMP11(:)X;*!X;LINECNT:MOVES POINTER TEMP11+!X;TO NEXT ROW OR RESETS TEMP11,X;TO FIRST ROW-7LINECNT )}ADD4011;;JMPSUB TO SET POINTER TO NEXT ROW2 R>ENDSC;;ENDSC IS END OF7HEXITSC;;PLAYFIELD SCREEN<QTEMP11;;IF TEMP1)}1<>ENDSCAR>ENDSC;;THEN EXITF HEXITSCK+ORIGIN1Q>ORIGIN;;ELSE RESET TEMP11PPTEMP11;;TO FIRST ROWUQ>ORIG)}INZ PTEMP11_ EXITSC:d6LINECNT2 ADD4011;;JMPSUB TO SET POINT TO NEXT ROWi,R>ENDSC2;;ENDSC2 IS END OF PLAYFIELD)}nHEXITSC2;;IF TEMP11<>ENDSC2sQTEMP11;;THEN EXITxR>ENDSC2} HEXITSC2,ORIGINAQ>ORIGIN2;;ELSE RESET TEMP11)}#PTEMP11;;TO POINT TO 1ST ROWQ>ORIGIN2 PTEMP11 EXITSC2:X;$X;WARS:USED TO HAVE TROLLS ATTACK%X;WIZARD)}S CASTLE/WIZARD DEFENDERS.!X;ALSO MOVES WIZARDS CHAR BOMB%WARS%>;;START POSITION IN A ROW(TLOOPQ@TEMP117;;LOAD PLA)}YFIELD BYTER>X;;CMP TO BOMB CHAR FT58A;;BRANCH TO CHANGE CHARR>Y;;CMP TO OTHER BOMB CHARFT59A;;BRANCH T CHANGE)} CHAR$T2;;LOAD TABLE OFF-SETQT19;;LOAD DELAY VALUER>;;IF VALUE >1 THENET79;; DON'T MOVE ATTACKERS,!TEND;;)}JMP TO TEST NEXT BYTE OR END LOOP+T79Q@TEMP117;;ELSE LOAD PLAYFIELD BYTER>;;CMP TO TROLL CHARFT10;;IF = THEN MOV)}E TROLLR> ;;CMP TO TROLL CHARFT12;;IF = MOVE TROLL1!TEND;;ELSE JMP TO TEST NEXT BYTE OR END LOOP T10Q> ;;LOAD )}NEW TROLL CHAR+ SAVEVAL;;MOVE DRAWING WITHIN SAME BYTE !TEND;;NEXT BYTE OR END LOOP)T12)>";;CMP ROW OFFSET TO POS 1)} BYTE DTOK;;TO LEFT OF WIZARD CHAR  STORZ0;;IF>= REMOVE TROLL( KILL2;;JMPSUB TO REMOVE WIZARD CHAR !TEND%TOK3;)};SET BYTE POINTER TO NEW POS3"$Q@TEMP117;;LOAD VALUE IN NEW POS'1;;RESET POINTER,11R>;;IF VALUE NOT 06'HTEND;;)}THEN DON'T DISPLAY NEW TROLL;Q>;;ELSE USE 0 TO CLEAR@P@TEMP117;;OLD CHARE3;;SET NEW POSJ Q>;;LOAD TROLL DRAWING C)}HARO% SAVEVAL;;JMPSUB TO DISPLAY TROLLT !TENDY"T59AQ>X;;LOAD OTHER BOMB CHAR^PTEMP1;;TEMP SAVEc !T589Ah"T58A)}Q>Y;;LOAD OTHER BOMB CHARm PTEMP1rT589AQ>;;USE 0 TO CLEARwP@TEMP117;;OLD BOMB CHAR|1;;CHECK POINTER OF ROW BY)}TE)>;;IF<5 THEN EXIT DTEND)Q@TEMP117;;ELSE LOAD VALUE IN NEW POS#FT98A;;IF = JMP TO DISPLAY BOMB1;;ELSE SET )}NEW POINTER POS STORZ0;;JMP TO CLEAR BYTES !TEND!T98AQTEMP1;;LDA BOMB CHARP@TEMP117;;DISPLAY BOMBTEND3;)};NEXT ROW BYTE)>#;;IF >= 35 THEN ALL,EWED;;BYTES OF A ROW HAVE BEEN PROCESSED !TLOOPX;&X;WARS2:USED TO HAVE WI)}ZARDS ATTACK#X;TROLLS CASTLE/TROLL DEFENDERS.X;ALSO MOVES TROLL CHAR BOMBWED:3WARS2%>;;STARTING POSITION IN A P)}LAYFIELD ROW)TLOOP2Q@TEMP117;;LOAD PLAYFIELD BYTER>X;;CMP TO BOMB CHARFT58;;IF = CHANGE CHARR>Y;;CMP TO OTHER)} BOMB CHARFT59;;IF = CHANGE CHAR+$T2;;LOAD X WITH OFFSET FOR DELAY TABLEQT19;;LOAD DELAY VALUER>;;IF =1,ET)}2527;;THEN MOVE ATTACKING WIZARD CHARS$!TEND2;;ELSE TEST TO SEE IF DONE(T2527Q@TEMP117;;LOAD PLAYFIELD BYTER>;;CM)}P TO WIZARD CHAR&FT25;;IF = MOVE WIZARD WITHIN BYTE R>;;CMP TO WIZARD CHAR%FT27;;IF = MOVE WIZARD TO NEW POS!TE)}ND2;;TEST TO SEE IF DONE!T25Q>;;LOAD NEW WIZARD CHAR!& SAVEVAL;;JMPSUB TO DISPLAY WIZARD&!TEND2;;TEST TO SEE IF DON)}E+$T27)>;;CMP ROW POS TO 5TH BYTE0 EWOK;;IF> THEN WIZ POS IS OK5$ STORZ0;;ELSE REMOVE WIZARD CHAR:& KILL;;JMPSUB TO)} REMOVE TROLL CHAR?!TEND2;;TEST TO SEE IF DONEDWOK1;;SET NEW ROW POSI"Q@TEMP117;;LOAD PLAYFIELD BYTEN3;;RESET ROW P)}OSS/R>;;TEST TO SEE IF PLAYFIELD BYTE IS CLEARX)HTEND2;;IF NOT THEN DON'T MOVE WIZARD]1;;ELSE SET NEW POSbQ>;;LOAD)} NEW WIZARD CHARg SAVEVAL;;DISPLAY WIZARDl3;SET POINTER TO OLD CHARqQ>;;USE 0 TO CLEAR OLDvP@TEMP117;;PLAYFIELD )}BYTE{!TEND2;;TEST TO SEE IF DONET59Q>X;;LOAD NEW BOMB CHAR PTEMP1 !T589T58Q>Y;;LOAD NEW BOMB CHAR PT)}EMP1 T589Q>;;USE 0 TO CLEAR OLDP@TEMP117;;BOMB CHAR3;;SET NEW BOMB POS IN ROW")>$;;CMP TO RIGHT LIMIT OF RO)}W#FTEND2;;IF = DON'T DISPLAY BOMB'Q@TEMP117;;ELSE LOAD PLAYFIELD BYTE$FT98;;IF DISPLAY BOMB IN NEW POS% STORZ0;;E)}LSE REMOVE WIZARD CHARS !TEND2'T98QTEMP1;;LOAD POINTER TO BOMB*P@TEMP117;;SAVE BOMB CHAR IN PLAYFIELDTEND23;)};NEXT BYTE IN ROW&)>%;;IF = TO 37 THEN ALL BYTES PER!FTED;;ROW HAVE BEEN PROCESSED !TLOOP2TED:X;!X;KILL:CAL)}CULATES # OF WIZARDS&X;THAT HAVE REACHED TROLL DEFENDERS/X;ALSO REPLACES TROLL IF WIZARD IF NECESSARYKILL$T2;;LOAD T)}ABLE OFFSET!"ROWT9;;SUB 1 FROM TABLE VLUE QROWT9HEXITKILL;;IF<> THEN EXIT1;;ELSE SET Y TO POS OF CHAR1;;THAT )}IS TO BE REMOVED"Q@TEMP117;;LOAD PLAYFIELD BYTE R>r;;CMP TO TROLL CHAR'FKILL1;;IF = THEN REMOVE TROLL CHAR1;;ELSE)} TEST OTHER BYTE"Q@TEMP117;;LOAD PLAYFIELD BYTE 3;;SET Y TO NEW POS%)R>r;;CMP PLAYFIELD BYTE TO TROLL CHAR*'FKILL1;)};IF = THEN REMOVE TROLL CHAR/:4KILL11;;SET ROW POS9Q>;;LOAD WIZARD CHAR> SAVEVAL;;DISPLAY WIZARDC 1;;RESET YH2")}TOTALT;;SUB 1 FROM TOTAL # OF TROLL DEFENDERSM QTOTALTRHEXITKILL;;IF <> THEN EXITW)PTKING;;ELSE SET FLAG TO DISPLAY K)}ING\ EXITKILL:]X;^&X;KILL2:CALCULATES # OF TROLLS THAT_"X;HAVE REACHED WIZARD DEFENDERS`$X;AND REMOVES WIZARD IF NECES)}SARYa KILL2$T2;;LOAD TABLE OFFSETf""ROWW9;;SUB 1 FROM TABLE VALUEk QROWW9p$HEXITKIL2;;IF VALUE <> THEN EXITu-3;;ELS)}E SET POINTER TO NEXT PLAYFIELD BYTEz"Q@TEMP117;;LOAD PLAYFIELD BYTER>;;CMP TO WIZARD CHAR'FKILL12;;IF = BRANCH TO )}REMOVE CHAR#3;;SET Y NEW NEXT PLAYFIELD BYTE"Q@TEMP117;;LOAD PLAYFIELD BYTE 1;;RESET YR>;;CMP TO WIZARD CHAR'F)}KILL12;;IF = BRANCH TO REMOVE CHAR:KILL12Q>;;LOAD TROLL CHAR! SAVEVAL;;DISPLAY NEW DRAWING-"TOTALW;;SUB 1 FROM)} # OF WIZARD DEFENDERS QTOTALWHEXITKIL2;;IF<> THEN EXIT-PWKING;;ELSE SET FLAG TO DISPLAY WIZ KING EXITKIL2:X;)}!X;SAVEVAL:TAKES CHAR AND SAVES X;ON PLAYFIELD.THEN ADDS 1 TO(X;POINTER AND SAVE OTHER HALF OF CHAR6SAVEVALP@TEMP11)}7;;SAVE NEW CHAR IN PLAYFIELD BYTE 3;;NEXT BYTE IN PLAYFIELD ROW>;;TRANSFER CHAR2;;SET TO NEXT CHARA.P@TEMP117;)};SAVE NEW CHAR IN PLAYFIELD BYTE:X;X;STORZ0:USED TO CLEARX;TWO BYTES OF PLAYFIELDX;STORZ0Q>'P@TEMP11)}7;;SAVE 0 IN PLAYFIELD BYTE 3;;NEXT BYTE IN PLAYFIELD ROW'P@TEMP117;;SAVE 0 IN PLAYFIELD BYTE:STORZ0Q>'P@TEMP11(f'X;FINDCHAR:THIS SUBROUTINE TAKES THE $X;PLAYER(GUN) AND CALCULATES WHATX;ROW THE PLAYER IS ONX;(&FINDCHAR;;;S-}UBTRACT OFF AREA WHERE2 S> ;;PLAYER IS NOT ON SCREEN<V?;;DIVIDE BY CHAR LENGTHFV?PV?Z>dQDLIST;;LOAD ADDRESSn-}PTEMPCH;;OF SCREENx QDLISTPTEMPCHROW0;;CALCULATE ROW OFF-SETGEXITCH;;IF>0 THEN,;;ADD 40(#OF BYTES PE-}R ROW) QTEMPCH;;TO CALCULATE ROW OFO>(;;SCREEN THAT PLAYERPTEMPCH;;IS ONQTEMPCHO>PTEMPCH!RO-}W EXITCH:X; X;MISSILE1:ALLOWS PLAYER(GUN)X;TO FIRE CHARACTER BOMBX;MISSILE1QSDELAY1 FOFF1Q>P-} "SDELAY1!MF1 OFF1Q> P"$MF1Q@TEMPT7;;LOAD TRIGGER VALUE,$FFIREM;;IF= THEN OK TO FIRE BOMB6:@#FIREM#-}TEMP1;;ADD 1 TO DELAYJ-QTEMP1;;COUNT BEFORE BOMB CAN BE FIREDTR> ;;(DELAY VALUE)^ DNOMIShQ>rPTEMP1;;R-}ESET DELAY|!QTOP19;;VERT START POS OF GUN, O>;;CALCULATE MIDDLE OF GUN. FINDCHAR;;FIND ROW OF SCREEN PLAYER IS ON-})%TEMP1;;OFFSET WHERE BOMB WILL APPEAR0Q@TEMPCH7;;CHECK BYTE WHERE BOMB WILL APPEARHNOMIS;;IF = THENQ>X;;LOAD B-}OMB CHARP@TEMPCH7;;DISPLAY BOMBQ> PSDELAY1 NOMIS:TE WHERE BOMB WILL APPEARHNOMIS;;IF = THENQ>X;;LOAD B,@&X;JS15M:DISLAYS FRONT VIEW OF TROLL%X;WHEN JOYSTICK0 IS IN POSITION 15X; JS15MQTROLWIZ HJS15TQ>;;TURN1} OFF WIZARD SOUNDP:()JS15T%END1;;VERT END POS OF TROLL2$>;;#OF BYTES TO MOVE<#M1QMAN9;;LOAD DRAWING OF 1}TROLLFPPL3R8;;SAVE IN PLAYER 3P QMAN29ZPPL2R8;;SAVE IN PLAYER 2d QMAN19nPPL1R8;;SAVE IN PLAYER 1x1;;NEXT VERT 1}POS0;;NEXT DRAWING BYTEIM1Q>;;TURN OFF TROLL SOUNDPҖ:%MANPOSQ>L;;VERT END POS OF TROLL PEND1 1}Q>E;;VERT START POS OF TROLL PTOP1Q>;;SET PLAYER WIDTHP P P Q>;;COLOR GREENP;;COLPM11}Q>;;COLOR GOLDP;;COLPM2Q>;;COLOR ORANGE-GREEN"P;;COLPM3,Q>9;;HORIZ POS6POSTPP1;;SAVE IN POINTER@P1};;SAVE IN HPOSP1JP;;" HPOSP2TP;;"HPOSP3^:_X;`X;CHANGMAN:USE TO CHANGE THEaX;DRAWING OF THE TROLLbX;c1}CHANGMANQ>d PSDELAY1eQ>DfPh/#END1;;VERT END USEAS FLAG TO MOVE TROLLr*QMANNUM;;LOAD POINTER TO TROLL DRAWI1}NG|,%O>;;MOVE POINTER TO NEXT DRAWINGR>;;IF = 16 THENHM2;;RESET POINTER TOQ>;;FIRST TROLL DRAWINGM2P1}MANNUM;;LOAD POINTER,4OLRDRAW;;ADD OFF SET FOR LEFT OR RIGHT DIRECTION?%$TOP1;;VERT START POS OF TROLL!M3Q2}MAN018;;LOAD DRAWING BYTE!PPL3R9;;SAVE IN PLAYER MEMORY QMAN118 PPL1R9 QMAN218 PPL2R93;;NEXT DRAWING BYTE&2}"2;;NEXT PLAYER DESTINATION BYTE0(END1;;DRAWING CHANGED:HM3D""END1;;RESTORE VERT END POSE QSDELAY1FPN:2}OX;P"X;MOVMAN:USES VALUE OF JOYSTICKQX;TO MOVE TROLL OR WIZARDRX;XMOVMAN#DA19;;ADD 1 TObQDA19;;COUNTER THAT MUS2}TlR>;;BE =5 BEFOREvFJST;;MAN CAN MOVE: JSTQ>;;RESET DELAY COUNTER PDA19%>"Q@JSTCKV7;;LOAD JOYSTICK 2}VALUE"X;AND DETERMINE WHICH DIRECTIONX;TO MAN THE TROLLR>HM7)!JS15M;;JMP SUB TO DISPLAY FRONT VIEWM7QTR2}OLWIZHM7TQ>PQ>PM7TQ@JSTCKV7R>HM11!JS7;;MOVE MAN RIGHT M11R> HM13!JS112};;MOVE MAN LEFT  M13R> *HM144!JS13;;MOVE MAN DOWN> M14R>HHM5R!JS14;;MOVE MAN UP\ M5R>fHM9p JS13A2};;MOVE MAN DIAGONALz!JS7;;RIGHT/DOWN M9R> HM6 JS13A;;MOVE MAN DIAGONAL!JS11;;LEFT/DOWN M6R>HM102} JS14A;;MOVE MAN DIAGONAL!JS7;;RIGHT/UP M10R>  HNOSIGNAL JS14A;;MOVE MAN DIAGONAL!JS11;;LEFT/DOWN NOS2 }IGNAL:JS7QTROLWIZHJS7T;;IF <> MOVE TROLL!JS7W;;ELSE MOVE WIZARD$$JS7TQ>0;;POINTER TO FIRST RIGHT.PLRDRAW;2 };DRAWING OF TROLL8' CHANGMAN;;JMPSUB TO CHANGE DRAWINGBQP1;;HORIZ POSLR>;;IS IT AT RIGHT LIMITV ENOSIGNAL;;IF YES 2 },THEN EXIT`#P1;;ELSE ADD 1 TO POSjQP1t!POST;;SAVE NEW POS~JS11QTROLWIZHJS11T;;MOVE TROLL!JS11W;;MOVE WIZ2 }ARDJS11TQ>;;POINTER TO FIRST"PLRDRAW;;LEFT DRAWING OF TROLL' CHANGMAN;;JMPSUB TO CHANGE DRAWINGQP1;;HORIZ POS2 }R>5;;IS IT AT LEFT LIMITDNOSIGNAL;;IF YES,THEN EXIT"P1;;SUB 1 TO FIND NEW POSQP1!POST;;SAVE NEW POSJS2}13QTROLWIZHJS13T;;IF <> MOVE TROLL !JS13W;;ELSE MOVE WIZ*JS13T CHANGMAN;;JMP TO CHANGE DRAWINGJS13AQTROLWIZ(2} HJS13AT2 !JS13W<$JS13ATQEND1;;VERT END POS OFFR>;;IS IT AT LOWER LIMITPEEX13;;IF YES THEN EXITZ#END1;2};ELSE SET NEW POSd $END1n%>;;# OF BYTES TO MOVEx$DOWNQPL3R9;;VALUE IN OLD POSPPL3R9;;SAVE IN NEW POS QP2}L1R9 PPL1R9 QPL2R9 PPL2R90;;NEXT BYTE TO MOVE1;;ALL BYTES MOVED? HDOWN"#TOP1;;SET NEW VERT TOP 2}POS EX13:JS14QTROLWIZHJS14T;;MOVE TROLL!JS14W;;MOVE WIZ0JS14T CHANGMAN;;JMP TO CHANGE TROLL DRAWINGJS2}14AQTROLWIZHJS14AT;;MOVE TROLL"!JS14W;;MOVE WIZ,,JS14ATQTOP1;;VERT START POS OF TROLL6R>!;;IS IT AT UPPER LI2}MIT@DEX14;;IF YES THEN EXITJ"END1;;ELSE SET NEW POST "TOP1^ $TOP1h%>;;#OF BYTES TO MOVEr#UPQPL3R2}9;;VALUE TO BE MOVED|PPL3R9;;SAVE IN NEW POS QPL1R9 PPL1R9 QPL2R9 PPL2R92;;NEXT BYTE TO MOVE1;;ALL2} BYTES MOVEDHUP EX14:R9;;SAVE IN NEW POS QPL1R9 PPL1R9 QPL2R9 PPL2R92;;NEXT BYTE TO MOVE1;;ALL0 &!X;SET2:INITIALIZES PLAYERS AND$X;VARIABLES. CALLED BEFORE CASTLEX;STORIMG SUBROUTINES 9SET2 ZEROPLRS;;JMPSUB T6}O CLEAR PLAYER/MISSILE MEMORY! JS15G;;JMPSUB TO DISPLAY GUNQ>(PTIMER1;;CLEAR TIMER2PTIMER1<P ;;SET PLAYE6}R WIDTHFP PP ZPdP nQ>;;SET PLAYER PRIORITYxPo:X;#X;SETPOINT:LOAD TABLE OFFSET AND&X;MOVES 6}POINTER TO NEXT TABLE VALUEX;#SETPOINT$T2;;LOAD TABLE OFFSET#T19;;ADD 1 TO TABLE VALUEQT19R>;;IF < 2,D6}ST0;;THEN SET POINTER TO NEXT TABLE POSQ>;;ELSE RESET TABLE VALUEPT19ST0#T2;;NEXT TABLE POSQT2&R>;;TABL6}E LENGHT IS POS 0 THRU 15DST2 Q>;;RESET TO START OF TABLEPT2ST2:7X;8!X;TWAR:SUBROUTINE USED TO HAVE9 X;TR6}OLLS STORM WIZARDS CASTLE:X;@TWAR SET2J9 ORIGINA;;JMP TO INITIALIZE TEMP11 TO PLAYFIELD STARTTQ>CASTR;;LOAD SC6}REEN^ PDLIST;;OF WIZARDS CASTLEhQ>CASTR;;BEING ATACKEDr PDLIST| STTQ>$PWIZRDS;;REMOVE TROLL CHARS 6}THAT*PWIZRDS;;ARE IN FRONT OF WIZ CASTLE PT2;;#"TEMP1;;DECREASE # OF TROLLS9TW1QWKING;;LOAD # OF DEFENDING6 } WIZARDS THAT ARE LEFT&FENDWART;;IF= THEN CASTLE OVER RUNQ>;;CHAR 7&8 FORM TROLLPT5;;THAT APPEARS ANDQ>;;ATT6!}ACKS WIZARDS CASTLE PT5%%>;;ROW NYTE WHERE TROLLS APPEAR$ DISPTM;;JMPSUB TO DISPLAY TROLL* WARS;;JMPSUB TO MO6"}VE TROLLS AND BOMBS SETPOINT1 LINECNT2;;SET POINTER TO NEXT PLAYFIELD LINE&< ADD1;;ADD 1 TO TIMER FOR HOW LONG CASTL6#}E STORMING LASTS0QTIMER1:-R>;;IF TIMER = 200 THAT STORMING IS OVERDDTW1;;ELSE REPEAT ATTACKINGN! JOYST0;;RESET 6$}FOR JOYSTICK 0X$ TEN12;;SET POSITION FOR POINTERb"EWAR PLACE;;SAVE POINTER CHARlQ>BOARD;;DISPLAY MAINvPDLIST6%};;PLAYFIELD SCREENQ>BOARD PDLIST COLORPL;;SET PLAYER COLOR* ZEROPLRS;;CLEAR PLAYER/MISSILE MEMORY- PL6&}AYERS;;JMPSUB TO BUILD "CHECKER" BOARD DELAY:)ENDWARTQ>;;LEFT HALF OF WIZARD KING(PWIZRDS;;2ND BYTE IN FRONT O6'}F CASTLE"Q>;;RIGHT HALF OF WIZARD KING'PWIZRDS;;BYTE IN FRONT OF CASTLE TEN12;;!EWAR;;JMPSUB TO END FIGHT!6(}X;"#X;WWAR:USE TO HAVE WIZARDS STORM#X;TROLLS CASTLE$X;*WWAR SET24< ORIGIN1;;JMPSUB TO INITIALIZE TEMP11 TO PLAYF6)}IELD START> Q>CASTL;;LOAD ADDRESS OFH!PDLIST;;START OF PLAYFIELDR!Q>CASTL;;INTO DISPLAY LIST\ PDLISTf+ 6*}STT;;JMPSUB TO INITIALIZE DELAY TABLESpQ>z PTROL0;;CLEAR BYTES IN FRONTPTROL0;;OF TROLL CASTLEPT2;;CLEAR TA6+}BLE POINTER6"TEMP1;;DECREASE # OF WIZARDS ON MAIN PLAYFIELD0WW1QTKING;;TEST FLAG THAT IS = IF 12 TROLLS FENDWARW6,};;HAVE BEEN CAPTURED%Q>;;RIGHT HALF OF WIZARD DRAWINGPT5$Q>;;LEFT HALF OF WIZARD DRAWING PT58%>#;;SET Y 6-}TO POS WHERE WIZARDS WILL APPEAR IN A ROW% DISPTM;;JMPSUB TO DISPLAY WIZARD% WARS2;;JMP TO MOVE WIZARDS/BOMBS) SETPO6.}INT;;JMPSUB TO TEST TABLE VALUE5 LINECNT;;JMP TO SET TEMP11 TO NEXT PLAYFIELD ROW! ADD1;;ADD 1 TO TIMER'S COUNTQTIM6/}ER1;;LOAD TIMER$R>;;IF TIMER =200.&DWW1;;THEN CASTLE STORMING IS OVER8 JOYST1;;ENABLE JOYSTICK 1B/ TEN122;;SET 60}CHAR POINTER ON MAIN PLAYFIELDL!EWAR;;JMP TO END WARV#ENDWARWQ>m;;CHAR OF TROLL KING`#PTROL0;;SAVE IN FRONT OF CASTLE61}j!Q>n;;OTHER HALF OF TROLL KINGt&PTROL0;;SAVE IN FRONT OF CASTLE~/ TEN122;;SET CHAR POINTER ON MAIN PLAYFIELD!EW62}AR;;JMP TO END WARX;X;ADD1: ADDS 1 TO TIMERX;#ADD1QTIMER1;;LOW BYTE OF TIMER,O> PTIMER1"QTIMER163};;HIGH BYTE OF TIMERO>PTIMER1:X;X;SUBWAR2:USE TO DETERMINEX;THE CHARACTER THAT THEX;TROLL IS MOVIN64}G INTOX;;SUBWAR2Q@REM27;;LOAD CHAR THAT TROLL IS COLLIDING WITH+R>9;;CHAR $39 IS ENTRANCE TO WIZ CASTLE HSB2A!65} TWAR;;JMPSUB TO STORM CASTLE  JOYST0;;ENABLE JOYSTICK 0Q>;;SET FLAG FOR WAR OVER PWARFL(:2(SB2AR>;;CHAR 2366} IS 1ST WIZARD CHAR< DSB3AF$R>-;;CHAR 45 IS LAST WIZARD CHARP ESB3AZ- FIGHT;;JMPSUB TO HAVE TROLL/WIZARD FIGHTd JO67}YST0;;ENABLE JOYSTICK0n/ TEN12;;LOAD CHAR POINTER INTO TEMP STORAGEx* PLACE;;DISPLAY POINTER ON MAIN SCREEN/Q>;;CHAR 68}24 IS LEFT HALF OF WIZARD DRAWINGPT6;;TEMPORARY SAVE."X;TEMP13 IS THE FLAG THAT HOLDS"X;THE VALUE 1 IF WIZARD WAS HIT69} X;BY A MISSILE AND VALUE 0 IF"X;TROLL WAS HIT.VALUE IN TEMP13#X;IS CHANGED IN ORDER TO USE THEX;GENERALIZED CODE SU6:}BWAR3.1QTEMP13;;LOAD FLAG FOR TROLL OR WIZARD KILLEDHSTORE0;;SWITCH VALUEQ> PTEMP13"!SUBWAR3;;JMP TO REMOVE6;} LOOSERSTORE0Q> PTEMP13"!SUBWAR3;;JMP TO REMOVE LOOSER" ENDSUB:,%SB3AR>;;CHAR $EF IS WIZARD KING6HENDSUB6<};;IF <> THEN EXIT@:$>;;ELSE LOAD X WITH CHAR THAT IS RIGHT HALF OF TROLLJ!ENDTWAR;;JMP TO END GAMEKX;L!X;SUBWAR1:USE6=} TO DETERMINE THEMX;CHARACTER THAT THE WIZARDNX;IS MOVING INTOOX;T(SUBWAR1Q@REM27;;LOAD PLAYFIELD BYTE^-R>C;;CHAR 6>}$43 IS ENTRANCE TO TROLL CASTLEh HSB1Ar! WWAR;;JMPSUB TO STORM CASTLE| JOYST1;;ENABLE JOYSTICK 1Q>;;SET FLAG FOR 6?}WAR OVER PWARFL:%SB1AR>;;CHAR >23 IS TROLL CHARS ESB4A- FIGHT;;JMPSUB TO HAVE TROLL/WIZARD FIGHT JOYST1;6@};ENABLE JOYSTICK 1 TEN122;;LOAD CHAR POINTER PLACE;;DISPLAY CHAR POINTER&Q>;;CHAR 2 IS RIGHT HALF OF TROLLPT66A};;TEMPORARY SAVESUBWAR3%>;;CLEAR Y7QTEMP13;;LOAD FLAG TO DETERMINE WHO HAS BEEN KILLED HKILLWZR2/Q@REM27;;LOAD6B} PLAYFIELD BYTE OF MAIN SCREEN!RT6;;CMP TO RIGHT HALF OF MAN&HKT1;;IF <> THE REMOVE CHAR0;;;ELSE SUBTRACT 1 FROM:$Q6C}REM2;;ADDRESS OF PLAYFIELD BYTEDS>N PREM2X QREM2bS>l PREM2vQ@REM27;;TEST TO SEE IF)HKT1;;HAS A CHAR6D} IN IT.IF IT DOES NOT-3;;THEN ADD 1 TO ADDRESS OF PLAYFIELD BYTE/KT1Q>;;USE CHAR 0 TO CLEAR PLAYFIELD BYTE P@REM276E}3 P@REM27:%KILLWZR2Q>;;USE CHAR 0 TO CLEARP@REM17;;PLAYFIELD BYTE3;;NEXT PLAYFIELD BYTEP@REM17;;CLEAR6F} BYTE ENDSUB2:$SB4AR>n;;CHAR $6E IS TROLL KING+HENDSUB2;;IF <> THEN EXIT ELSE END GAME ($>;;CHAR 24 IS RIGHT HAL6G}F OF WIZARDENDTWAR&T5;;TEMP SAVE /0;;SET X TO BE CHAR THAT IS LEFT HALF OF MAN*&T5;;TEMP SAVE4A>)$>;;SET X T6H}O START OF PLAYFIELD AREAH,ENDLOOP2PBOARD9;;SAVE CHAR IN PLAYFIELDRPBOARD9\PBOARD9fPBOARD9pRT5;;TES6I}T ACCUMULATORzFLD24;;CHANGE AS NECESSARYQT5;;IN ORDER TO DISPLAY!NEXTS2;;FRONT VIEW OF MANLD24QT5 NEXTS6J}22(>;;IF X = 240 THEN-HENDLOOP2;;SCREEN IS FILLED WITH MAN CHAR* ZEROPLRS;;CLEAR PLAYER/MISSILE MEMORY!ENDLESS26K}!ENDLESS2;;GAME OVERX;#X;FIGHT:SUBROUTINE TO HAVE TROLLX;COMBAT WITH WIZARDX;FIGHTQ>;;P;;SET HIT CLEA6L}R1PFSQ1;;SET FLAG TO ENABLE MISSILE TO BE FIRED PFSQ2* ZEROPLRS;;CLEAR PLAYER/MISSILE MEMORY ( WIZPOS;;INITIALIZE 6M}WIZARD VARIABLES ' MANPOS;;INITIALIZE TROLL VARIABLES >PTROLWIZ;;SET FLAG TO ALLOW TROLL SUBROUTINES TO BE CALLED$  JS16N}5M;;DISPLAY TROLL.  JS15W;;DISPLAY WIZARD8 #Q>DLIST2;;LOAD DISPLAY LISTB P1;;THAT IS USEDL )Q>DLIST2;;WHEN TROL6O}L FIGHTS WIZARDV P0` Q>j PTEMP1t Q>~ 3PDIRFLAG;;FLAG FOR DIRECTION OF TROLL'S MISSILE 6PDIRFLAG;;FLAG FOR6P} DIRECTION OF WIZARDS MISSILE *PSQFLAG;;FLAG FOR TROLLS MISSILE FIRED .PSQFLAG;;FLAG FOR WIZARDS MISSILE FIRED PDIR6Q}ECT *PWARFL;;SET FLAG FOR FIGHT HAS STARTED Q> &PTEMP1 ;;CLEAR END OF FIGHT FLAG 2PTEMP13;;CLEAR FLAG FOR TROLL O6R}R WIZARD KILLED Q> PDA1;;SET DELAY VALUE QREM1 PTEMP10;;SAVE POS OF #QREM1;;MAN THAT IS ATTACKING PTE6S}MP10 9 STICK15;;DISPLAY FRONT VIEW OF MAN THAT IS ATTACKING Q>( *PJSTCKV;;SET HIGH BYTE FOR JOYSTICK2 %F1$>;;6T}OFFSET FOR TROLL VARIABLE< %&TROLWIZ;;SET FLAG FOR TROLL TURNF Q>xP PJSTCKV;;ENABLE JOYSTICK 0Z  MOVMAN;;MOVE TROLLd #6U}$>;;OFFSET FOR WIZARD VARIABLEn Q>x &PTROLWIZ;;SET FLAG FOR WIZARD TURN #JSTCKV;;ENABLE JOYSTICK 1  MOVMAN;;MOVE 6V}WIZARD DELAY $QTEMP1 ;;IF TEMP1+10 IS = THEN 0FF1;;FIGHT NOT OVER.BRANCH TO CONTINUE FIGHT Q> PDA1;;SET D6W}ELAY VALUE  DELAY;;JMPSUB TO DELAY  DELAY;;THE CHANGE FROM  DELAY;;THE FIGHT SCREEN  DELAY;;TO THE MAIN SCREEN *6X} INIT1;;JMPSUB TO INITIALIZE VARIABLES 4 ZEROPLRS;;JMPSUB TO CLEAR PLAYER/MISSILE MEMORY - PLAYERS;;JMPSUB TO BUILD "CHE6Y}CKER" BOARD : X; $X;DISPTM:USE TO DISPLAY ATTACKING !X;MEN.DISPLAYS MEN RANDOMLY ON X;EACH PLAYFIELD ROW X; !DISP6Z}TM$T2;;LOAD TABLE OFFSET" $OO5QTABLE39;;HIGH BYTE OF DELAY, HOO66 QTABLE29;;LOW BYTE OF DELAY@ FOO7J OO6;T QTABL6[}E29;;SUBTRACT 1 FROM^ S>;;DELAY TABLEh PTABLE29r QTABLE39| S> PTABLE39 :;;EXIT &OO7Q@TEMP117;;LOAD PLAYFIEL6\}D BYTE HOO4;;IF <> THEN EXIT QTABLE79;;DELAY VALUE PTABLE29;;SAVE IN LOW BYTE QTABLE59;;DELAY VALUE PTABLE39;;6]}SAVE IN HIGH BYTE "Q@TEMP117;;LOAD PLAYFIELD BYTE HOO4;;IF <> THEN EXIT *QT5;;LOAD CHAR DRAWING OF ATTACKER P@T6^}EMP117;;SAVE IN PLAYFIELD 1;;NEXT PLAYFIELD BYTE &QT5;;LOAD CHAR DRAWING OF ATTACKER %P@TEMP117;;SAVE IN PLAYFIELD BYTE6_} OO4: X; !X;STT:SUBROUTINE TO LOAD DELAY X;VALUES INTO DELAY TABLE. "X;THE TABLE IS USE TO DETERMINE! X;HOW LONG BE6`}FORE ATTACKER" X;APPEARS ON A ROW# X;& STT$>;;(LENGTH-1) OF TABLE0 #STT2QTABLE79;;LOAD DELAY VALUE: 'PTABLE29;;SAVE 6a}IN LOW BYTE OF DELAYD QTABLE59;;LOAD DELAY VALUEN PTABLE39;;SAVE IN HIGH BYTEX Q>;;SET DELAY VALUEb ;PT19;;SAVE IN TA6b}BLE THAT MUST = 1 BEFORE ATTACKER MOVESl 0;;NEXT TABLE POSv ISTT2 : X; X; @PREWAR1 SAVETEMP;;JMPSUB TO SAVE CURRE6c}NT POS BEING ATTACKED  SUB401;;RESET POINTER : @PREWAR2 SAVETEMP;;JMPSUB TO SAVE CURRENT POS BEING ATTACKED  ADD406d}1;;RESET POINTER : SAVETEMPQTEMP10;;LOW BYTE PREM2;;TEMPORARY SAVE QTEMP10;;HIGH BYTE PREM2 :  ADD404t2(X;SUBROUTINE PLACEMAN:THIS SUBROUTINE2%X;ADDS ANOTHER MAN TO CURRENT ARMYd"X;BUT ONLY IF # OF MEN IS < 10.$X; THE :f}NEW MAN IS PLACED IN FRONTX;OF A CASTLE.X;3PLACEMANQTEMPCHAR;;LOAD POINTER TO MAN DRAWING,R>;;IS MAN A TROLL^):g}FLOADT;;IF YES THEN TEST TO ADD TROLLR>;;IS MAN A WIZARD"FLOADW;;IF YES TEST TO ADD WIZ:&X;X!X; LOADT:ADDS ANO:h}THER TROLL IF$X;THE CHARACTER POINTER IS ON THEX;THE LETTER "T".X;$LOADTQTEMP1;;IS CHAR POINTER R>Z;;ON THE:i} LETTER "T"RHLTEXIT;;IF NOT THEN EXIT QTROL0;;IS SPACE IN FRONT"HLTEXIT;;OF TROLL CASTLE EMPTY.QTEMP1;;COUN:j}TER OF # OF TROLLS ON BOARDR> ;;IF 10 TROLLS THEN EXITL FLTEXIT~(#TEMP1;;ELSE ADD 1 TO # OF TROLLS#Q>;;LEFT HA:k}LF OF TROLL DRAWING"PTROL0;;POS IN FRONT OF CASTLEQ>;;RIGHT HALF OF TROLLF PTROL0x LTEXIT:yX;z!X;LOADW:ADDS:l} ANOTHER WIZARD IF{ X;THE CHARACTER POINTER IS ON|X;THE LETTER "W".}X;$LOADWQTEMP1;;IS CHAR POINTERR>\;;ON LE:m}TTER "W"HWTEXIT;;IF NOT THEN EXIT@QWIZRDS;;IS SPACE IN FRONTr HWTEXIT;;OF WIZ CASTLE EMPTYQTEMP1;;IF # OF WIZ:n}R> ;;ON BOARD =10 THENFWTEXIT;;EXIT:)#TEMP1;;ELSE ADD 1 TO # OF WIZARDSl$Q>;;LEFT HALF OF WIZARD DRAWING#P:o}WIZRDS;;POS IN FRONT OF CASTLEQ>;;RIGHT HALF OF WIZARDPWIZRDS4 WTEXIT:l$Q>;;LEFT HALF OF WIZARD DRAWING#P8TX#X;SUBROUTINE FIRETQ:USE TO ALLOWX;THE TROLL FIRE A MISSILE.X;IF TRIGGER 0 IS PRESSED"X;AND MISSILE IS NOT FIRE>q}D YET,!X;THEN MISSILE IS FIRED IN THE X;DIRECTION EQUAL TO JOYSTICKX;0 POSITIONX;23FIRETQQSQFLAG;;TEST FLAG F>r}OR MISSILED FIRED<'R>;;IF = 1 THEN OK TO FIRE MISSILEFFTQ0P:ZTQ0Q;;LOAD TRIGGERdFTQ1n:x TQ1Qx;;LOAD JO>s}YSTICK VALUE0X;DETERMINE DIRECTION THAT MISSILE IS TO MOVER> FPLACETQR> FPLACETQR> FPLACETQR>>t} FPLACETQ::PLACETQPDIRFLAG;;SAVE DIRECTION MISSILE IS TO MOVE.PSQFLAG;;SET FLAG THAT MISSILE IS FIRED%P>u}1;;LOAD HORIZ POS OF MAN'MISP1;;SAVE AS HORIZ';;POS OF MISSILE,"QTOP1;;TOP OF MAN,O>;;FIND MIDDLE O>v}F MAN6&PMIS2;;SAVE AS MISSILE VERT POS@>J QMIS9TL>;;MISSILE DRAWING^PMIS9;;DISPLAY MISSILEh:;;FIND MIDDLE O<n[ #X;FIRESQ:ALLOWS WIZARD/JOYSTICK1 X;TO FIRE A MISSILEX;/FIRESQQSQFLAG;;LOAD FLAG FOR MISSILE FIRED(R>;;IF=Bx}1 THEN OK TO FIRE2FSQ0<:FSQ0Q;;LOAD TRIGGERPFSQ1Z:d SQ1Qy;;LOAD JOYSTICK VALUEn0X;DETERMINE DIRECTION THBy}AT MISSILE IS TO MOVExR> FPLACESQR> FPLACESQR> FPLACESQR> FPLACESQ:6PLACESQPDIRFLAG;;SABz}VE DIRECTION MISSILE IS MOVING'PSQFLAG;;SET FLAG FOR MISSILE FIRED"%P0;;LOAD HORIZ POS OF MISSILE$'MISP1;;SAVE AS HOB{}RIZ POS OF MAN',QTOP1;;VERT START OF MANO>;;FIND MIDDLE OF MAN"&PMIS2;;SAVE AS VERT POS OF MISSILE,>B|}6 QMIS9@L>;;MISSILE DRAWINGJPMIS9;;DISPLAY MISSILET:UX;V%X;MOVESQ:LOADS VARIABLE OF MISSILEW#X;DIRECTION AND DB}}ETERMINES WHICHXX;DIRECTION TO MOVE MISSILEYX;^MOVESQHMQ711h.QDIRFLAG9;;LOAD DIECTION MISSILE IS MOVINGr&X;DETERMIB~}NE WHICH DIRECTION TO MOVE|R>FMQ7R>  FMQ11R>  FMQ13R> FMQ14:X;X;MQ7:MOVES MISSILE RIGHB}TMQ7QMISP19;;LOAD HORIZ POSR>;;CMP WITH RIGHT LIMIT"DMQ7OK;;IF < THEN MOVE MISSILE%MQ711QMIS29;;VERT POS OF B}MISSILE?)QMIS8;;LOAD DRAWING IN MISSILE MEMORYMT7;;USE "AND" TO TURN OFFPMIS8;;BITS OF MISSILE&Q>;;RESET FLB}AGS TO0PSQFLAG9;;ALLOW ANOTHER:"PDIRFLAG9;;MISSILE TO BE FIREDD:N0MQ7OK#MISP19;;ADD 1 TO HORIZ POS OF MISSILEXMQB}72QMISP19;;LOAD NEW POSb%>;;CLEAR Yl$P@HPOST7;;SAVE IN HORIZ REGISTERv:wX;xX;MQ11:MOVES MISSILE LEFTyX;&MQ1B}1QMISP19;;HORIZ POS OF MISSILER><;;IS IT AT LEFT LIMITEMQ11OK;;IF AT LIMIT!!MQ711;;JMP TO REMOVE MISSILE,MQ11OB}K"MISP19;;ELSE SUB1 FROM HORIZ POS!MQ72;;JMP TO SAVE NEW POSX;X;MQ13:MOVES MISSILE UPX;$MQ13QMIS29;;VERT POB}S OF MISSILER>;;IS IT AT LOWER LIMIT&FMQ711;;IF YES THEN REMOVE MISSILE#MIS29;;ELSE SET NEW POS QMIS29>QB}MIS9;;LOAD OLD POS MT7;;USE "AND" TO CLEAR BITS PMIS9;;SAVE NEW VALUE QMIS9;;LOAD VALUE IN NEW POS )LT8;;USB}E "OR" TO TURN ON MISSILE BITS*PMIS9;;SAVE NEW VALUE4:5X;6X;MQ14:MOVES MISSILE DOWN7X;>!MQ14QMIS29;;MISSILE VERB}T POSHR> ;;IS IT AT UPPER LIMITRFMQ711;;IF YES THEN REMOVE\"MIS29;;ELSE SET NEW POSf QMIS29p>z#QMIS9;;LOAD B}VALUE AT OLD POSMT7;;CLEAR BITS OF MISSILEPMIS9;;SAVE NEW VALUE QMIS9;;LOAD VALUE IN NEW POS)LT8;;USE "OR" TB}O TURN ON MISSILE BITSPMIS9;;SAVE NEW VALUE:X;!X;WVAR:SETS VARIABLES TO ALLOWX;WIZARD TO SHOOT MISSILEX;B}WVARQ>;;MISSILE DRAWINGPT8Q>;;VALUE TO CLEAR BITS"PT7;;0 AND 1 IN MISSILE MEMORYQ>;;HORIZ REGISTERPHPB}OST;;FOR MISSILEQ> PHPOST:X;!X;TVAR:SETS VARIABLES TO ALLOWX;TROLL TO SHOOT MISSILEX;TVARQ>;;VB}ALUE OF$PT8;;MISSILE DRAWING.Q>?;;VALUE TO CLEAR BITS8 PT7;;7AND6 OF MISSILE MEMORYBQ>;;HORIZ REGISTERLPHPOSTB};;FOR MISSILEVQ>` PHPOSTj:?;;VALUE TO CLEAR BITS8 PT7;;7AND6 OF MISSILE MEMORYBQ>;;HORIZ REGISTERLPHPOST@$ %X;SUBROUTINE JS15W:THIS SUBROUTINE"X;IS USE TO READ IN AND DISPLAY"X;THE FRONT VIEW OF THE WIZARD.($X;THE WIZARD F}DRAWING IS DISPLAYED2X;IN PLAYER 0.<X;F*JS15W%END1;;VERT ENDING POS OF WIZP$>;;# OF (BYTES-1) TO MOVEZ&W1QWIF}Z19;;GET BYTE OF WIZ DRAWINGdPPL0R8;;SAVE IN PLAYER 0n#QWIZM9;;GET BYTE OF WIZ DRAWINGx2LMIS8;;"OR" SINCE ONLY MISSILEF} 2AND 3 ARE USED!PMIS8;;SAVE IN MISSILE MEMORY1;;NEXT VERT POS0;;NEXT DRAWING BYTEIW1Q>PҪ:X;XF};&X;SUBROUTINE WIZPOS:THIS SUBROUTINE!X;SETS THE STARTING POS OF THEX;WIZARD AND IS USED DURINGX;THE COMBAT PHASEF}X;WIZPOSQ>;;VERT END OF WIZ PEND1Q>;;VERT START OF WIZ PTOP1"Q>;;SET WIDTH,P6P @Q>;;F}SET COLORJPT$>;;HORIZ POS OF WIZ^POSW&P0;;SAVE IN POINTERh&;;SAVE IN HPOSP0r2;;POS FOR MISS 3|&;;SAVF}E IN HPOSM22;;SET POS OF MISS 222&;;SAVE IN HPOSM2 WSIGNAL:X;X;!X;SUBROUTINE JS7W:USED TO MOVE%X;F}THE WIZARD RIGHT WHEN JPYSTICK 1X;IS IN POSITION 7X;JS7WQP0;;LOAD HORIZ POSR>;;IS IT AT RIGHT LIMITEWSIGNF}AL;;IF YES ,EXIT#P0;;ELSE ADD 1 TO POS$P0&%!POSW;;JMP TO MOVE WIZ TO NEW POS0X;:X;D!X;SUBROUTINE JS11W:USE TO F}MOVEN$X;THE WIZARD LEFT WHEN JOYSTICK 1XX;IS IN POSITION 7bX;lJS11WQP0;;LOAD HORIZ POSvR>5;;IS IT AT LEFT LIMITF}DWSIGNAL;;IF YES ,EXIT"P0;;ELSE SUB 1 FROM POS$P0%!POSW;;JMP TO MOVE WIZ TO NEW POSX;X;"X;SUBROUTINE JS1F}3W:MOVES WIZARDX;DOWN WHEN JOYSTICK 1 IS INX;POSITION 13X;'JS13WQEND1;;VERT END POS OF WIZR>;;IS IT AT LF}OWER LIMITEEX13W;;IF YES ,THEN EXIT#END1;;ELSE SET NEW POS  $END1%>;;# OF BYTES TO MOVE $DOWNWQPL0RF}9;;BYTE IN OLD POS*PPL0R9;;SAVE IN NEW POS4QMIS9;;BYTE IN OLD POS>'M><;;"AND" FOR VALUE OF MISSILE 2/3H%LMIS9;;F}"OR" WITH VALUE IN NEW POSRPMIS9;;SAVE IN NEW POS\QMIS9;;LOAD OLD VALUEfM>;;CLEAR MISSILE 2/3p'PMIS9;;SAVE F}NEW VALUE IN OLD POSz0;;NEXT BYTE TO MOVE1;;ALL BYTES MOVED? HDOWNW"#TOP1;;SET NEW VERT TOP POS EX13W:X;F}X;&X;SUBROUTINE JS14W:MOVES THE WIZARDX;UP WHEN JOYSTICK 1 IS INX;POSITION 14X;)JS14WQTOP1;;VERT START POF}S OF WIZR>!;;IS IT AT UPPER LIMITDEX14W;;IF YES ,THEN EXIT"END1;;ELSE SET NEW POS "TOP1 $TOP1$%>F};;#OF BYTES TO MOVE.#UPWQPL0R9;;VALUE IN OLD POS8PPL0R9;;SAVE IN NEW POSBQMIS9;;VALUE IN OLD POSL*M><;;"ANF}D" TO GET VALUE IN MISSILE 2/3V"LMIS9;;"OR" TO SAVE IN NEW POS` PMIS9j#QMIS9;;LOAD VALUE IN OLD POStM>;;CLEAR MIF}SSILE 2/3~PMIS9;;SAVE NEW VALUE2;;NEXT BYTE TO MOVE1;;ALL BYTES MOVEDHUPW EX14W:N OLD POStM>;;CLEAR MIDc