@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 D8u X;X; ***************X; ** MISC DATA **(X; ***************2X;<X; Blank board lineFX;P!BLANK ===T}====Z =======d =======n =======xX;X; Message numbersX;U} MTITLE MREADY MSET MGOMAUTHORX;X; Message source, destX; and sizesX;.MSGTXL 4V}TITLE=4READY=4SET=4GO=4AUTHOR.MSGTXH 5TITLE=5READY=5SET=5GO=5AUTHOR=MSGADDL 4MSGADD0=4MSGADD1=4MSGADD1=4MSW}GADD1=4MSGADD2=MSGADDH 5MSGADD0=5MSGADD1=5MSGADD1=5MSGADD1=5MSGADD2MSGLNS ===="X;,X; Message text6X}X;@TITLE AIJGHKLKLAHRSAJ A*+,-./;<=>COATX;^READY ARSAH?@EFZ[A==h' ===========rXY};|+SET =========== ======ATUAHVWAX;(GO ===A\]\A======% Z}===A^_^A======X;*AUTHOR AABXYA======== AMN?@RSIJA==== APQRSGHCDAHA=[}=X;X; Title screen flippingX; disk offsets - X; black and whiteX;TBLOCL 2=4=6=8=:=<=> =\}=N===^=TBLOCH ======& ======0TWLOCL  = =====: P===@===0]}DTWLOCH ======N ======XX;bX; Direction mods for MAPlX;v&DIROFS  = ====^}= = X;X; Image start numbersX;COLRIMG = CLR2IMG  =X;X; Computer level info%X; Speed, Journe_}y check, & changeX;&LVLSPED ========&LVLJCHK ========&LVLCHNG =====`}===X;X; Computer 1st move indices X;CSTEPL === X;*X; Halfway flip definition4X;>CHMAPI a}==HX;RX; Box ID addresses\X;f&BOXNLO 4BOARD =4BOARDo p 4BOARD =4BOARD z 4BOARD =4b}BOARD`  4BOARD =4BOARDP &BOXNHI 5BOARD =5BOARDo  5BOARD =5BOARD  5BOARD c}=5BOARD`  5BOARD =5BOARDP X;X; Box Level addressesX;&BOXLLO 4BOARD =4BOARDm  4d}BOARD =4BOARD}  4BOARD =4BOARDb  4BOARD =4BOARDR &BOXLHI 5BOARD =5BOARDm  e}5BOARD =5BOARD}  5BOARD =5BOARDb  5BOARD =5BOARDR $X;.X; Box X/Y PMG positions8X;Bf}PENX T=T=T=TL ===VPENY =|=d=L` \=t==jX;tX; PMG shape data~X;PLYRSHP == =g}= == == ==X;X; Score addressesX;SCORADL 4WHTSCOR=4BLKSCORSCORADH 5WHTSCOR=h}5BLKSCORX;X; Team name addressesX; 'TEAMTXL 4WHTLIN =4BLKLIN 'TEAMTXH 5WHTLIN =5BLKLIN i}X;(X; Disk Flip Q data2X;<"LASTDSK; ;Last entry indexFDELAY@; ;Delay till flipPDIREC@; ;Direc to flipZj}IMGNUM@; ;Image numberdLOCL@; ;Location offsetnLOCH@; ; onto screenxX;X; Other dataX;MAP[; ;Bk}oard real mapMOVMAT<; ;Move matrix;Location offsetnLOCH@; ; onto screenxX;X; Other dataX;MAP[; ;B) X;X; ********************X; ** INITIALIZATION **(X; ********************2X;<"X; All of this is done one tim m}eFX; only -- on startup.PX;ZINITdX;nX; SETUP KEYBOARDxX;QKEYCODE;;Check ATASCIILKEYCODE;; convert tab n}le HINITPLR;;If set (XL), go onQ>;;Else init to $FEFEPKEYCODE; ; (for old ROM)PKEYCODEX;#X; SETUP PLA o}YER/MISSILE GRAPHICSX;"INITPLRQ>;;Clear PM graphics?CLEARPMPPL08 PPL18 PPL28 PPL38 PMISSLES8"1, p} HCLEARPM6X;@Q>J$>T#STWIDTHPSIZEP09;;Set widths to^ 0;; smallh ISTWIDTHrPSIZEM;;(Missiles too)|X;Q> q}5PMAREA;;Set PMG address PPMBASEQ>>;;Turn on PM DMA PDMACTLQ>;;Turn on player andPGRACTL;; missile displa r}yQ>;;Set priorities ofPGPRIOR;; PMG > playfieldX;X;Q>5ROMFONT;;Set charset PCHBASEQ>;;Init sound s} PSKCTLQ> PAUDCTL&PCOLOR4;;Set BKG=Black0PNMIEN;;Disable DLI/VBI:Q>4DLI;;Set DLI vectorD PVDSLSTN Q>5DL t}IXPVDSLSTbQ>4VBI;; and VBI vectorl PVVBLKDv Q>5VBIPVVBLKDQ>PFCOL0;;Set colors PCOLOR0 Q>PFCOL1 u} PCOLOR1 Q>PFCOL2 PCOLOR2 Q>PFCOL3 PCOLOR3 Q>PLR0COL PPCOLR0 Q>PLR1COL PPCOLR1 Q>PLR2COL  PPCO v}LR2 Q>PLR3COL  PPCOLR3*Q>4THELDSP;;Turn on the4PDLIST;; 'thello display>Q>5THELDSPH PDLISTRX;\$X; SET I w}NITIAL GAME CONFIGURATIONfX;pQ>zPTEAMSIZ;;2 PlayersPTEAMSIZ;; (1 ea. team)PPORTNO;;Plyr1 on port 0PBO x}X;;Plyr1 in box 0PCOMPS;;No computer plyrsPCMPLEVL;;Init comp levelsPCMPLEVLPSSTAT;;No active soundQ> y}PTEAMNO;;Plyr1 on team 1PPORTNO;;Plyr2 on port 1PACTIVE;;2 active playersPTEAM;;White team activeQ> z}PPLYRS;;2 human playersPTEAMNO;;Plyr2 on team 2Q>$PBOX;;Plyr2 in box 4.X;8?BQ>L#CLOPPLPPOPLYRY {}8;;Set all old YV1;; posn's to 0` ICLOPPLPjX;tQ>~PCMPLVL;;Dft comp lvl=5Q>PLASTCMP;;No last computer |}!RESTART; ;Go on to titles's to 0` ICLOPPLPjX;tQ>~PCMPLVL;;Dft comp lvl=5Q>PLASTCMP;;No last computer  X;X; ************************X; ** INTERRUPT ROUTINES **(X; ************************2X;<X; -------------F~}X; VBI ROUTINEPX; -------------ZX;dVBIQ>;;Turn off soundn PAUDC1xX;X; DISK FLIPPINGX; -------------X;}QRTCLOK;;Only flip everyM>;; other pass FFLIPTIM !FLIPDON%FLIPTIM$LASTDSK;;If no disks areIDOFLPS;; in} Q, skip !FLIPDONDOFLPS$>;;For each disk:X;!FLIPLOPQDELAY9;;If no delay,FDOFLIP;; go flip it"DELAY9;;}Update delayHCKDPFS;;If we've hit"QDIREC9;; 0, reverse,N>;; the flip6,;; direction@O>J PDIREC9TCKDPFSQ}IMGNUM9;;If not in^FDONXDSK;; flip alreadyhR> ;; go do nextrHDOFLIP;; disk|DONXDSK!NXTDISKDOFLIPQIMGNUM9;;U}pdate the,;; image number ODIREC9 PIMGNUM9QLOCL9;;And set thePVBIPNTR;; new disk,;; image onO>4FRSTDS}K;; screenPSCRPTR;; (keep baseQLOCH9;; addr to findPVBIPNTR;; map index)O>5FRSTDSKPSCRPTR QIMGNU}M9T?T?X; CLC O>FRSTIMG&%>0P@SCRPTR7;;Set char 1:3DO>NP@SCRPTR7;;Set char 2X5bClO>'v}?7O>P@SCRPTR7;;Set char 33O>P@SCRPTR7;;Set char 4X;QTTLFLAG;;If on titleHFCHKDON;; scree}n or%DIREC9;; the disk3;; hasn't justQIMGNUM9;; hit a half-RCHMAPI8;; way pointHFCHKDON;; skip this  AD}R2NDX;;Calc map ?;; index QMAP8;;Get old*&VBITEMP;; color4>;;Update old>"SCRPND9;; scoreHN>;;Set newRP}MAP8;; color\>;;Update newf#SCRPND9;; scorep $VBITEMPzX;!FCHKDONQIMGNUM9;;If the diskFFLPFNSH;; isn't at }anR> ;; end pointHNXTDISK;; do next disk"FLPFNSHQTTLFLAG;;If on titlesHREQUEUE;; go queue disk%LASTDSK;;E}lse, moveQDELAY8;; last diskPDELAY9;; in Q overQIMGNUM8;; finishedPIMGNUM9;; disk QLOCL8 PLOCL9 QLOC}H8 PLOCH9 QDIREC8$ PDIREC9."LASTDSK;;Update last #8#SSTAT;;Set soundB!CHKFOVR;;Do next diskLREQUEUEQ>;;}On titles -VPDELAY9;; re-set delay`X;jNXTDISK2;;Update disk #t"CHKFOVRQLASTDSK;;If there are~GFLIPDON;; any mor}eA;; disks to,;; flip, goSLASTDSK;; and do them EFLIPDON !FLIPLOPX; FLIPDONQSSTAT;;Set sound byT?;;} # of disksR>;; that finishedDSTSOUND;; flippingQ>STSOUNDPAUDC1Q>  PAUDF1Q> PSSTAT(X;2X}; MOVE PLAYER INDICATORS<X; ----------------------FX;PQTTLFLAG;;If on titlesZFMOVEIND;; just go drawd!DRAWIND;; }themn%MOVEIND$ACTIVE;;For each player:xX;#MOVELOP%PORTNO9;;If 'puter, goGMOVCMP;; do 'puter moveX;X; HUMAN} MOVEX;QSTRIG08;;If the triggerHCHKSTIK;; is pressedPATRACT;; clear attractQSTATUS9;; mode and setL>TR}IGGER;; trigger flag PSTATUS9#CHKSTIKQSTICK08;;Get the stickM>N>PVBITEMP;; & save itQ>MINX;;If playe}r is"RPLYRX9;; too far left,DMHCKXHI;; then mask6QVBITEMP;; off left@M>LEFT ;; move bitJ PVBITEMPT!MHCKXH}IQPLYRX9;;If player is^R>MAXX;; too far righthDMHCKYLO;; then maskrQVBITEMP;; off right|M>RIGHT ;; move bit} PVBITEMP MHCKYLOQ>MINY;;If player isRPLYRY9;; too far upDMHCKYHI;; then maskQVBITEMP;; off upM>UP };; move bit PVBITEMP!MHCKYHIQPLYRY9;;If player isR>MAXY;; too far downDDOHUMOV;; then maskQVBITEMP;; off d}ownM>DOWN ;; move bit PVBITEMP DOHUMOV DOMOVE;;Do the move!MOVNIND;;& do next plyrX;&X;COMPUTER MOVE0}X;:!MOVCMP#MOVCLK9;;See if it isD%CMPLEVL9;; time to moveNQLVLSPED8;;LVLSPED:XRMOVCLK9;; 1 NEVER movesbHD}CMPTRK;; 2 moves 1/2lQ>;; 3 moves 2/3vPMOVCLK9;; and so on/4FMOVNIND;;If it's time,!DCMPTRK TRACKIT;; go do mo}veX;MOVNIND0;;Move nextGDRAWIND;; player (if!MOVELOP;; any)X;X; DRAW PLAYERSX; ------------X;#D}RAWIND$ACTIVE;;For each plyr:A;;Calculate PM,;; base for thisO>5MISSLES;; player PVBIPNTRQ>  PVBIPNTR}*DRPLRLPQPLYRX9;;Set X-pos4(>;;If player #0>HSPLPLX;; we've gotH?;; to set eachR'HPOSM3;; of the\3;; missil}ef3;; positionsp 'HPOSM2z33 'HPOSM133 'HPOSM0 HDOERPL#SPLPLXPHPOSP09;;Else just 1#DOERPL%O}PLYRY9;;Erase old plyrQ>;; image &VBITEMP$>ERPLRLP@VBIPNTR73 0 IERPLRL $VBITEMP;;Copy new$ %PL}YRY9;; position. 'OPLYRY9;; to old8 $>;;Set playerB DRWAPLRQPLYRSHP9;; at newL P@VBIPNTR7;; positionV 3` 0j IDR}WAPLRt "VBIPNTR~ X; $VBITEMP;;Do next 0;; (if any) IDRPLRLP X; X; EXIT VBI X; -------- X; !XITVBV }X; X; X; --------------- X; VBI SUBROUTINES X; --------------- X; X; COMPUTE MAP INDEX X; GIVEN SCREEN ADDRESS}( X;2 ADR2NDXQ>;;Init remainder< PVBITEMP;; to zeroF %>; ;This is anotherP $DIV80LPTVBIPNTR;; standard 6502Z U}VBIPNTR;; divide & modd UVBITEMP;; routine. Thisn QVBITEMP;; one dividesx ;;; VBIPNTR by 80. S>P;; The remainder} DD80L1;; is placed in PVBITEMP;; VBITEMP and the #VBIPNTR;; quotient in D80L11;; VBIPNTR HDIV80LP X; QVBI}PNTR;;Multiply Y T?;; by 9 T? T? VVBITEMP;;Multiply X ,;; by 2 OVBIPNTR;;And add them &X; CLC } ; together OVBITEMP;; (along with" 'X; CLC ; the start, O> ;; border) to6 :;; get index@ X;J X;T }X; TRACK-IT: COMP MOVE^ X; Moves in the generalh X; direction of the targetr X; Player number in X| X; TRACKITQ>};;Clear dir PVBITEMP QPLYRX9;;Set DX to ;;; absolute STARGX9;; value of ISETDX;; playerX - N>;; targetX ,} O> SETDXPDX QPLYRY9;;Set DY to ;;; absolute STARGY9;; value of ISETDY;; playerY - N>;; targetY ,& }O>0 SETDYPDY: X;D RDX;;If DY >= DXN ETRACKV;; track VertX  TRKSXDR;;Set X dirb Q>;;Clear partiall PPARTX9;; }X movev QDY;;If DY=0, go FTRKDOMV;; do move ;;;Else, add SDX;; DY-DX to ,;; partial Y OPARTY9;; move PPARTY}9 DTRKDOMV;;If >= 256,  TRKSYDR;; set Y dir !TRKDOMV;;Go do move X; TRACKVQDY;;If DY=0, no FTRKDONE;; move}  TRKSYDR;;Set Y dir Q>;;Clear partial PPARTY9;; Y move QDX;;If DX=0, go FTRKDOMV;; do move* ;;;Else, if4 S}DY;; DX=DY do> FTRACKD;; diagonalH ,;;Else, add DX-R OPARTX9;; DY to partial\ PPARTX9;; X move,f DTRKDOMV;; if >= 25}6,p TRACKD TRKSXDR;; set X dirz X; TRKDOMV DOMOVE;;Do the move TRKDONE:;; and return X; X; Set X dir X; !T}RKSXDR%>RIGHT;;If targetX > QTARGX9;; playerX RPLYRX9;; set direction ETRKXMDR;; for right %>LEFT;;Else, set }TRKXMDRC;; it for left LVBITEMP PVBITEMP:X;X; Set Y dir$X;. TRKSYDR%>DOWN;;If targetY >8QTARGY9;; play}er YBRPLYRY9;; set directionLETRKYMDR;; for downV%>UP;;Else set`TRKYMDRC;; it for upj LVBITEMPt PVBITEMP~:}X;X; X; DO MOVEX; Direction in VBITEMPX; Player number in XX;#DOMOVEQVBITEMP;;Get dir & maskM>;; o}ff Y dirFDOXMVE;;If none, do XT?;;Calc amountS>;; to add to  T?;; Y-pos, OPLYRY9;;And add it PPLYRY9}#DOXMVEQVBITEMP;;Get dir & mask(M> ;; off X dir2FMOVDONE;;If none, exit<V?;;Calc amountFS>;; to add toP ,;; X-}posZOPLYRX9;;And add itd PPLYRX9n MOVDONE:xX;X;X; -------------X; DLI ROUTINEX; -------------X;D}LI5;;Save AQVCOUNT;;If not to 1/2T?;; way pointGDLI2;; set charsetQ>5CHRSET;; to mine HDLI3!DLI2Q>5ROMF}ONT;;Else, set itDLI3PWSYNC;; to the ROMPCHRBAS;; font7;;Restore A95CHRSET;; to mine HDLI3!DLI2Q>5ROMFRP X;X; ******************X; ** MAIN PROGRAM **(X; ******************2X;<"X; This is the body of the mainF X;} program - as run each gamePX;Z!MAINLOPQCONSOL;;Kill game ifdR>;; a consolenFDOSCORE;; key isx DBCNSOL;; press}ed !RESTARTX;X; UPDATE SCORESX; -------------X;DOSCORE$>;;For each team:%SCRLOOPQSCORADL9;;Set point}er toPPOINTER;; score dataQSCORADH9;; (onscreenPPOINTER;; digits)%>;;Digit#=lowQSCRPND9;;Check score}FNXTSCOR;;None to addGSCRDOWN;;It's going downX;X; SCORE INCREASE"X;,"SCRPND9;;Update pending6Q@POINTER7};;Add 1 to score@,;; low digitJO>TP@POINTER7^R>;;Overflow?hDNXTSCOR;;No, do nextrQ>;;Yes, set low|P@PO}INTER7;; to '0'1Q@POINTER7;;If high digitHSCRPLUS;; set addQ>;;Else get starterSCRPLUS,;;Add 1 to high}O>P@POINTER7;;And set itHNXTSCOR;;Go do next teamX;X; SCORE DECREASEX;$SCRDOWN#SCRPND9;;Update pending}Q@POINTER7;;If low digitR>;; is a zero,HSCRMINS;; set it to aQ>;; '9' and point&P@POINTER7;; to high dig}it01:"SCRMINSQ@POINTER7;;Subtract 1D;;; from digitNS>XP@POINTER7bR>;;If the resultlHNXTSCOR;; is a '0' a}ndv)>;; we're on theFNXTSCOR;; high digitQ>;; blank it outP@POINTER7X;NXTSCOR0;;Do next team ISCRL}OOPX;X; COMPUTER MOVEX; -------------X;QLASTSPC;;Skip if noGCHKTRGS;; places to moveQ>;;Set 'puter}PCMPCHK;; checking flag $ACTIVE;;For each player:%CMVPLANQPORTNO9;;If not a 'puter INCMPMOV;; then do next*X;4}QSTATUS9;;If locked, go>M>LOCKED;; see if we canHHCCNGMOV;; changeR CKCMTRG;;Is target good?\FCJNYCHK;;If no go}od, dofQSTATUS9;; journey checkpL>LOCKED;;Else, lock onz PSTATUS9!CJNYCHK;;Do journey chkX;)CCNGMOV%CMPLEV}L9;;If it can't change!QLVLCHNG8;; change targets FCADSTCK;; see if it's there CKCMTRG;;If current targetFCJ}NYCHK;; no good skipX;&CADSTCK GETINDX;;See if 'puter is'HOLDY;; at it's target %TARGNO9 QMOVMAT8 RHOLDY}HCJNYCHK;;No - do journey CKCMTRG;;Yes- still good? FNCMPMOV;;No, do next 'puter$'CMPPLACQSTATUS9;;Yes, push tri}gger. L>TRIGGER8 PSTATUS9B!NCMPMOV;;do next 'puterLX;V(CJNYCHK%CMPLEVL9;;Can it do journey`QLVLJCHK8;; chec}ks?j FNCMPMOV;;No, do next 'putert GETINDX;;Can it move where~ CHKPLAC;; it is? QVALFLAG!HCMPPLAC;;Yes - go do }triggerX;NCMPMOV0;;Move next 'puter ICMVPLANX;X; CHECK FOR DISK PLACINGSX; -----------------------X;!}CHKTRGSQ>;;Not doing checks PCMPCHK$ACTIVE;;For each player$CHKPLCLQSTATUS9;;If trigger not ICHKNPLC;; press}ed do next GETINDX;;Get map index CHKPLAC;;Try to place disk(QSTATUS9;;Turn off trigger2M>TRIGGER< PSTATUS}9FCHKNPLC0;;Do next playerP ICHKPLCLZX;dX; GAME OVER CHECKnX; ---------------xX;QLASTDSK;;If flippingINO}TDONE;; not finishedQLASTSPC;;If nowhere toGGAMDON;; move - doneQ>;;Just checking PCMPCHK$>;;Use special}%GOVRNDX;; indexQMOVMAT8;;Can white move?;; at this pos? Q>WHITEPTEAMNO CHKPLAC QVALFLAGHNOTD}ONE;;Yes - not done %GOVRNDX"QMOVMAT8;;Can black move,?;; at this pos?6 Q>BLACK@PTEAMNOJ CHKPLACT QVALFL}AG^HNOTDONE;;Yes - not donehQGOVRNDX;;If index = lastrRLASTSPC;; & none found|EGAMDON;; game is over#GOVRNDX;};Point at next!MAINLOP;; & continueX; NOTDONEQ>;;Reset game overPGOVRNDX;; index!MAINLOP;; & continueX};X; GAME OVERX; ---------X;GAMDONQ>;;Delay so thatPHOLDIT;; the screenWAIT0$>;; can be seen WAIT1}%>!WAIT2QKEYIN;;Quit right awayR>;; if any key is&HDOOVERS;; pressed0 QCONSOL:R>D HDOOVERSN1X HWAIT}2b0l HWAIT1v "HOLDIT IWAIT0#DOOVERS DBCNSOL;;Debounce keysQ>;;Clear key hit PKEYIN!RESTART;;Go to ti}tlesX;X; SUBROUTINES TO MAINX; -------------------X; X; CHECK COMPUTER MOVE TARGETX; 'puter player # in X}X;#CKCMTRG%TARGNO9;;Get map indexQMOVMAT8;; from target # ? CHKPLAC;;Check target QVALFLAG;;If it's good,*}HCKTRGDN;; exit w/flag4#TARGNO9;;Else, update>QLASTSPC;; target # toHRTARGNO9;; next targetR ECKNOLOK\Q>f P}TARGNO9pCKNOLOK STARGXY;;Set x/yzQSTATUS9;;Turn lock offM>LOCKED PSTATUS9QVALFLAG;;Exit w/flagCKTRG}DN:;; = badX;X;)X; COMPUTE MAP INDEX FROM X/Y POSITIONX; player # in XX;GETINDXQPLYRY9;;Normalize;;; y} to topS>MINY ;; edge ofM>;; board and V?;; divide by PHOLDIT;; 16. Then V?;; multiply$ V?;; the result}. V?;; by 9 to get8 ,;; start of mapB OHOLDIT;; lineL PHOLDITV QPLYRX9;;Normalize` ;;; x to leftj S>MINX ;; ed}ge oft V?;; board and~ V?;; divide by V?;; 8 to get ,;; line offset OHOLDIT;;Add line start O> ;; & start index }?;;Put it in Y :;; and return X; X; X; SET TARGET X/Y POSITION X; 'puter player # in X X; STARGXYC;;Save Y r}eg 5 QTARGNO9;;Get index by ?;; target # QMOVMAT8(  CXYPPOS;;Calc X/Y pos2 QPOINTER;;Copy out< PTARGX9;; X po}sitionF QPOINTER;;Copy outP PTARGY9;; Y positionZ 7;;Restore Yd ?;; registern :x X; X; #X; CALCULATE TARGET X/Y} POSITION X; IN PLAYER/MISSILE TERMS X; Map position in A X; !CXYPPOS SPLXYFI;;Get X/Y pos QPOINTER;;Multiply X} T?;; by 8 and T?;; add left T?;; edge of #X; CLC ; board O>MINX PPOINTER QPOINTER;;Multi}ply Y T?;; by 16 and T?;; add top" T?;; edge of, T?;; board6 X; CLC@ O>MINYJ PPOINTERT :^ X;h X;r )X;} COMPUTE X/Y POSITION FROM MAP INDEX| X; Map index in A X; SPLXYFI;;;Subtract the S> ;; border indices PPOINTER};;This is just Q>;; the standard PPOINTER;; 6502 byte %>;; size div & "DIVLPTPOINTER;; mod (by 9) UPOIN}TER;; routine. ;;; POINTER is QPOINTER;; the remainder S> ;; and +1 is the DDIVNX;; quotient. PPOINTER;; When f}inished, #POINTER;; POINTER is the DIVNX1;; X-pos and& HDIVLP;; POINTER+1 is0 :;; the Y-pos. PPOINTER;; When fgB X;X; *******************X; ** MOVE ROUTINES **(X; *******************2X;<!X; These routines are all usedF}X; in the making of moves byP#X; both human and 'puter playersZX;d X; CHECK PLACE VALID/DO PLACEnX; position index in }YxX; player number in XX;CHKPLACQ>;;Init flag toPVALFLAG;; invalidQMAP8;;If alreadyFDCKPLAC;; somethi}ng:;; there, exitX;#DCKPLAC'MAPPOSN;;Save positionQTEAMNO9;;Set color toPCOLOR;; team numberA;;Save play}er 5;; number$>;;Check for moveVDIRLPQ>;; ok - each dirPCOUNT;;Init dist backQMAPPOSN;;Get next pos",;}; in given,ODIROFS9;; direction6?;;First disk must@QMAP8;; be opponent'sJN>;; color. If itTRCOLOR;; isn't, tr}y^HVNXTDIR;; next dirhX;rVVDRLP#COUNT;;Update dist|C;;Get next pos,;; in currentODIROFS9;; direction? }QMAP8FVNXTDIR;;If empty orGVNXTDIR;; border, doRCOLOR;; next - ifHVVDRLP;; not us go onX;Q>;;Move is} valid PVALFLAGQCMPCHK;;If we wereFVQVDRL;; just checking7;; then exit>:&X;0VQVDRLC;;Go back to:;;}; previousDSDIROFS9;; opponent'sNPHOLDY;; disk - saveX&HOLDX;; pos & dirb CSMPPOS;;CalculatelQCOLOR;; screen p}osvV?;; of this>;; disk & queueQ>;; it up forPNMIEN;; flippingQCLR2IMG9;; Use dist from$COUNT;; start a}s ENQUEUE;; time delayQ> PNMIEN$HOLDX;;Restore pos%HOLDY;; & direction"COUNT;;Update distHVQVDRL;};& Q next diskX;VNXTDIR0;;Try next dir IVDIRLP;; if any leftQCMPCHK;;If we were FCHKGMOV;; just checking*7};; then return4>>:HX;R!CHKGMOVQVALFLAG;;If the move\HGOODMOV;; wasn't anyf7;; good (and itp>;; was for real)z}%BOX9;; zap theQPENX8;; player backPPLYRX9;; to theQPENY8;; starting box PPLYRY9:X; GOODMOVQCOLOR};;Set position%MAPPOSN;; moved toPMAP8;; to the colorC;; of the mover CSMPPOS;;Get scrn posQCOLOR;;Update }theV?;; score of the>;; mover (+1) #SCRPND9QCOLRIMG9;;Set disk at$ STSCIMG;; move pos.Q>;;Init sound8 P}SSTATBQ>;;Reset gameLPGOVRNDX;; over indexVX;`!X; REMOVE POS FROM MOVE MATRIXjX;t$>;;Find the~QMAPPOSN;; c}orres-FNDMENTRMOVMAT9;; pondingFENTRFND;; entry in2;; the moveHFNDMENT;; matrixX;ENTRFND&HOLDX;;Save }it%LASTSPC;;Move lastQMOVMAT8;; move entryPMOVMAT9;; over oursX;$ACTIVE;;Check if any CHKLKLPQPORTNO9;}; 'puter isICHKLKNX;; targeted on QTARGNO9;; our move RHOLDX HCHKLKMV(QSTATUS9;;If yes, unlock2M>LOCKED};; it and set<PSTATUS9;; it on a newF STARGXY;; targetP !CHKLKNXZ!CHKLKMVRLASTSPC;;Else, if ondHCHKLKNX;; last }move,nQHOLDX;; reset to itsxPTARGNO9;; new index STARGXY CHKLKNX0 ICHKLKLP"LASTSPC;;Update #moves7;; l}eft and >;; exit:X;X; MOVE SUBROUTINESX; ----------------X;X; ENQUEUE FLIP ROUTINEX; Image number in }AX; Delay to start in XX; Disk address in POINTERX;"ENQUEUEPHOLDIT;;Save image,QPOINTER;;Check to6%LASTD}SK;; see if image@GNOTINQ;; already in QJ!SRCDSLPRLOCL8;;If address isTHECKNDSK;; the same,^QPOINTER;; then it} ISh RLOCH8rFINQUEUE;;So go modify| QPOINTERECKNDSK1;;(Check allISRCDSLP;; entries)X;"NOTINQ#LASTDSK;;U}pdate #disks%LASTDSK;;Set diskPLOCL8;; addressQPOINTER PLOCH8QHOLDIT;;Set imagePIMGNUM8;; number}V?;;Dir = numV?;; (9 or 0)#X; CLC ; /4 -1S>;;(subs 1)PDIREC8;;Set dirSTDELAYA;;Set delay& }T?;; until start0CLRDLAYPDELAY8::DX;NINQUEUEQHOLDIT;;Figure dirXV?;; that we wantbV?;; it to fliplS>;;I }f "same",vRDIREC8;; (reverses)FSTDELAY;; set delayQ>;;Else, clearFCLRDLAY;; it (it's ours)X;X;X; CAL }CULATE SCREEN OFFSETX; Map index in AX;!CSMPPOS SPLXYFI;;Get X/Y posQPOINTER;;Multiply%>;; Y pos by }'POINTER;; 80 (twoTPOINTER;; lines per%POINTER;; disk) T?;; and X byT?;; 2 (two T?;; chars per* T?;; disk })4 PPOINTER>T?HT?RUPOINTER\,f OPOINTERp PPOINTERz DADINCL#POINTERADINCLC;;Then, add,;; the }resultsOPOINTER;; togetherDADINSCR;; and you#POINTER;; have yourQPOINTER;; offsetADINSCRPPOINTER:}X;X;X; SET SCREEN IMAGEX; Image number in A X; Screen offset in POINTER X; STSCIMG5;;Save imgnum$ QPOIN}TER;;Add screen. ,;; base addx8 O>4FRSTDSK;; to offsetB PPOINTERL QPOINTERV O>5FRSTDSK` PPOINTERj 7;;Calc 1}stt T?;; char of~ T?;; image X; CLC O>FRSTIMG %>;;And save P@POINTER7;; it 3;;Calc and O>;; save 2}nd P@POINTER7;; char 5 C;;Point to O>';; 2nd line ? 7;;Calc and O>;; save 3rd P@POINTER7;; char 3;;Cal}c and O>;; save 4th( P@POINTER7;; char2 :;;All done! ? 7;;Calc and O>;; save 3rd P@POINTER7;; char 3;;Cal; Killer 'thello is a game I wrote for Antic back in 1988. The game WAS accepted for publication but due to some very st}range circumstances was never published (first they mislaid it, then when they found it again, they thought it was for the S}T...). Regardless of its history, it is an amusing little number; even though it's more fun to watch than actually play. }Since it would be a shame to completely waste a perfectly good 8-bit program, I'm releasing it as post-ware. If you like it,} send me a post-card. Here's the address... Snail Mail Mark T. Price (sg) 2144 Loma Drive Hermosa Beach, CA. 90254 } E-Mail mark@godzilla.Quotron.COM The original documentation follows. This information is also given in A}TASCII in the file THELLO.DOC. ---------------------------------------------------------------------------- Killer 'thel}lo By Mark T. Price Like chess, Othello is a thinking man's game. Like chess, it has an enormous number }of possibilities that must be weighed before each move. Like chess, every piece on the board must be taken into consi}deration. Like chess, moves must be planned ahead and your opponent must be second-guessed. And, like chess, all hell brea}ks loose when you tell the players that they don't have to take turns. Killer 'thello is a computer adaptation of the cl}assic board game Othello (also known as Reversi) where just that happens. Like Killer Chess from the February 1988  }Antic, each player moves as fast as he or she can to overwhelm their opponent with speed as well as cunning. It should be n!}oted that Greg "Assembly is EVIL" Knauss had absolutely nothing to do with the design or writing of this game, although "}he wishes he did. TYPING IT IN Go ahead, I dare you. MAKING SELECTIONS When the title screen for 'thello appears, you c#}an select human or computer control for each player and you may also set the number of players on each team. That's right$}, Killer 'thello is played with teams. Up to four on each side, with a maximum of five players total. Notice that the word %} "White" in the upper left hand corner of the screen is highlighted. This means that all selections made will a&}ffect the White team. To make selections for the Black team, press the space bar. This toggles the highlit team be'}tween Black and White. The game defaults to two human players, one on the White team, and one on the Black. To add a human(} player to the current team, press the SELECT key. The number next to each '+' cursor indicates the joystick that will con)}trol that player. The number of human players in the game is limited to four due to the avail- ability of joystick ports. I*}f you try to play with more than two humans on an XL or XE, players 1 and 3 will be controlled by joy- stick 1 and players 2 +}and 4 will be controlled by joystick 2. To add a computer player to the current team, press the OPTION key. A 'C' will be,} placed next to the new cursor indic- ating that this is a computer player. The number next to the 'C' is the level of tha-}t computer player. Press the numbers 1 to 9 to change this. One is the equivalent of a beginning Killer 'thello play.}er, and nine should easily defeat the most exper- ienced. Since only five cursors can appear on the screen at any time/}, you will not be able to select, for instance, four humans if you already have two computer players. To remove player0}s, simply press the respective key; SELECT for human, OPTION for computer until all the players of that type are gone f1}rom that side. Then, add back the number you want (remembering that the space bar will toggle you between the Black and2} White teams). The game will not let you remove all of the players from a team. PLAYING THE GAME Pressing the START key 3}will begin the game. The game will give the person who does this a chance to get ready by printing "READY . . . SE4}T . . . GO!" on the screen. Each team starts out with two disks already laid out on the board. Moves in the game lay dis5}ks on the board. In order for a move to be valid, there must be some number of the opposing team's disks between the n6}ew disk and one of your old ones. There can be no empty space in this line, but the lines can be either horizontal, 7}vertical, or diagonal. When this is done, all of the opponent's pieces in between your new and old disks are flipped to y8}our color. To make a move, move your cursor to a valid spot using the joystick and press the trigger. If the move you at9}tempted to make is not valid, your cursor will be returned to the "Penalty Box" where you started the game. This can be :} very costly in terms of time, so be careful! The computer players begin to move as soon as the game is started and never ;}make illegal moves. The score in the game is the number of disks of your color. It is shown with the numbers in the up<}per left and lower right hand portions of the screen. The game ends when all of the spaces on the board are filled or n=}either team can make any legal moves. Whichever team has the highest score wins (Stunning new concept in computer game>}s). After a short while the title screen will reappear and you may play again. ANOTHER ONE? So, there it is, Killer 'th?}ello. Can Killer 'nopoly be far behind? ---------------------------------------------------------------------------- A c@}ouple of comments: Greg "maddog" Knauss (Author of Killer Chess) DID think this was a pretty neat program, but he hated thA}e method I used to set up the players (I really don't like it much either, but I couldn't think of a simpler method. It waB}s a BITCH to get it working right too). Can Killer 'nopoly be far behind? You bet it can. REALLY far... P.S.: There's aC} bug in the code that doesn't check to see if you're on the playing area when you try to make a move. It doesn't crash, but D}it results in some strange moves when you do it. If you're especially industrious, you can try to fix it. The Mac/65 sourceE} to the game is included in the archive. do it. If you're especially industrious, you can try to fix it. The Mac/65 source)Q X; X; ****************X; ** GAME SETUP **(X; ****************2X;<#X; This code is before each gameF X; is !G}played. It sets up theP!X; board and variables used byZ X; the computer move and gamedX; over checks.nX;xX; SHOW REA!H}DY-SET-GO STUFFX;STARTQ>;;No disks shouldPLASTDSK;; be flipping CLRBORD;;Clear the board SHWTEAM;;Un-hi!I}lite team$>MREADY;;Put up READY MESSAGE;; messageQ>;;Wait 1/2 second WAIT$>MSET;;Put up SET MESSAGE;!J}; messageQ>;;Wait 1/2 second WAIT$>MGO;;Put up GO! MESSAGE;; messageQ>;;Wait 1/4 second" WAIT, CL!K}RBORD;;Clear off message6Q>;;Not doing titles@ PTTLFLAGJX;TX; SET VALUES ON REAL BOARD^X;h%>Z;;Set right sider!L}Q>BORDER;; border|NEGMS1PMAP81)>P HNEGMS1X;Q>EMPTY;;Set board body BLNKMAPPMAP8;; to all empty!M}1)>  HBLNKMAPX;Q>BORDER;;Set left sideNEGMS2PMAP8;; border1 INEGMS2X;%>H;;Set top/bottom&"N!N}EGMS3Q>BORDER;; side borders0 PMAP8:CD;NS> X?b HNEGMS3lX;vX; PUT IN FIRST FOUR DISKSX;%>(; ;Put whi!O}te diskQ>WHITE;; in the realPMAP8;; mapC CSMPPOS;;Get screen posQ>;;Set white disk STSCIMG;; on scree!P}n%>2;;Put anotherQ>WHITE;; white disk inPMAP8;; the real mapC CSMPPOS;;And on theQ>;; screen  STSC!Q}IMG%>);;Put black disk Q>BLACK;; in the real*PMAP8;; map4C> CSMPPOS;; and on theHQ> ;; screenR STSCIMG\!R}%>1;;And put thefQ>BLACK;; other blackpPMAP8;; disk in thezC;; real map and CSMPPOS;; on the screenQ>  !S}STSCIMGX;X; ERASE BOX IDs & LEVELSX;%>ERPNLPQ>;;Set ID to blank SETBOXNQ>;; and level SETBOX!T}L1 IERPNLPX;X; RESET SCORESX;$Q>;;High byte of.PWHTSCOR;; scores=08 PBLKSCORBPSCRPND;;No scoresL!U}PSCRPND;; pendingVQ>;;Low byte of`PWHTSCOR;; scores='2'jPBLKSCOR;; (internal)tX;~Q>;;Init game over!V}PGOVRNDX;; check indexX;!X; SETUP AVAILABLE MOVE MATRIX%X; (ADD # FOR EACH 0 ENTRY IN MAP)X;$>;;No entrie!W}s yet%>P;;SEARCH MAP ADMENLPQMAP8;;If nothing isHADNMENT;; at this spot:2;; Update #entriesC;; Set move mat!X}rixPMOVMAT9;; entry ADNMENT1 IADMENLP;;Set # entries-1&LASTSPC;; (will be 59)X;( X; RANDOMIZE THE MOVE MA!Y}TRIX2X; ENTRY ORDER<X;F$RDMENLPQRANDOM;;For each entry:PM>?;;Get a randomZR><;; entry numberd ERDMENLPn?;;S!Z}wap currentxQMOVMAT8;; and random 5;; entry QMOVMAT9 PMOVMAT87 PMOVMAT9 0;;Do next IRDMENLPX;X; S![}ET INITIAL TARGETS FORX; COMPUTER PLAYERSX;%COMPS;;If no 'putersFINISTAT;; skip itQ>;;(1st comp getsPH!\}OLDIT;; entry #0)$ACTIVE;;For each plyr:""STCMMVSQPORTNO9;;If plyr is a,ISTNCMPM;; 'puter, set6QHOLDIT;; target !]}no.@PTARGNO9;; and targetJ STARGXY;; x/y posTQHOLDIT;;Update next^,;; target (byhOCSTEPL8;; # of comps)r P!^}HOLDIT| STNCMPM0 ISTCMMVSX;X; INIT STATUS TO NOTHINGX;"INISTAT$ACTIVE;;For each plyrQ>;;plyr status=0!_}"INISTLPPSTATUS9;; (nothing is0;; happening) IINISTLPX;!MAINLOP;;Go do gameX;X;X; SUBROUTINES TO SET!`}UPX; --------------------X;&X; TIME DELAY0X; A=#Jiffies to wait:X;DWAIT,;;CalculateNORTCLOK;; time toXWT!a}CLOKRRTCLOK;; wake up &bHWTCLOK;; wait for itl:vX;X; CLEAR THE BOARD ON SCREENX;CLRBORDQ>;;Set # of rows!b} PCOUNTQ>4FRSTDSK;;Set pointer toPPOINTER;; start of boardQ>5FRSTDSK;; (first diskPPOINTER;; position)!c}%>CLRBLIN$>;;Set first half CLRBCHRQBLANK9;; of a blankP@POINTER7;; board line INCYP0  ICLRBCHR !d}AD24YP $>*'CLRBCH2QBLANK9;;Set second half4P@POINTER7;; of a blank> INCYP;; board lineH0R ICLRBCH2\ A!e}D24YPf"COUNT;;Last line done?pHCLRBLIN;;No, go do itz:X;AD24YPC;;ADD 24 TO Y,;; AND POINTERO>? D!f}AD24YPD#POINTER AD24YPD:X;X; PUT MESSAGE UP ON SCREENX;#MESSAGEQMSGTXL9;;Set a pointerPPOINTER;; i!g}nto message QMSGTXH9;; text PPOINTER QMSGADDL9;;Set screen$ PSCRPTR;; pointer to. QMSGADDH9;; message8 PSCR!q}B%DOS SYSB*)DUP SYSBSDATA M65BlINIT M65B=}INT M65B2MAIN M65B(MOVE M65B2README 1STB&FSETUP M65BuTHELCHR M65B%THELLO DOCB)THELLO EXEBTHELLO M65BTHELSCR M65BA TITLES M65PTR;; destinationB QMSGLNS9;;Set number ofL PCOUNT;; lines to copyV %>` MLINLP$> ;;Copy a linej &MCHRLPQ@POINT!r}ER7;; of the messaget P@SCRPTR7~ 3 0 IMCHRLP QSCRPTR;;Update screen ,;; pointer to O>;; next line PSCRPTR!s};; of screen DMNXLIN #SCRPTR "MNXLIN"COUNT;;Last line done? HMLINLP;;No, go do it : X; INCYP3;;INCREMEN!t}T HINYPDON;; Y-REG/POINTER #POINTER;; AS A PAIR INYPDON:ne? HMLINLP;;No, go do it : X; INCYP3;;INCREMEN D X;X; ***********************X; ** MODIFIED CHAR SET **(X; ***********************2X;<"CHRSET ====%v}===F =======P =T==T=@=@=T=Z =T=====T=d =D=D=T====n =%w}T=@=T===T=x =T=@=T=D=D=T= =T====== =T=D=T=D=D=T= =T=D=T===%x}= =====U=U=U ===^=^=^=^=_ ======= ======= ===%y}==== ======= ======= = = = = = = = ======= %z}===(==== ======= ======= =======" =====%{}==, =======6 =======@ =======J ===z=z===T ==%|}=====^ =======h W=W=W=W=W===r =======| =======%}} ======= ======= ======= ======= ====%~}=== ======= ===z=z=== ======= ======= =%}====== ======= W=W=W=W=W=== ======= =======%} ======= =======& ======W=W0 =======: ===%}====D =======N =======X ===z=z=z=z=b =======l %}=====z=z=v =======׀ =====z== ======= W==z====%}= U=====U== =====z==W =======U U======= ==%}=====U W======= =======W ===U=U=U=U=U ===U=U=U=W=W%} ===U=U=U== ===T=T=T=T=T  T=T=T=T=T=T=T=T U=U=U=====  T=T=T===%}==* U=U=U=U====4 =======> ===U=U=U=U=UH =======R =%}==j=j=Z=U=U\ ======U=Uf =======p ===@=@=P=U=Uz ======U=%}U U=U=U=U=U=U=U=U W=W=W=W=W=W=W=W U=U=U=U=U=U== W=W=W=W=W=W== Z=j=j==%}=== ======= ===j=j=Z== ======= ^=z=j===== %}======= ===j=j=Z== ======= P=R=J=z=*=*== ======%}= ===j=j=Z== =======$ U=T=S=R=N=J=:=*. =7======8 *=*=*=%}j=j=Y==B ====W=W==L U=U=U=T=T=S=R=NV W=='=====` J=:=*=i=i=U==j%} ==W=W=W=W==t U=U=U=T=P=P=@=@~ W===;=+='== C===I=i=U== =W=W=W=W=%}W== U=T=P=P=@=@== === = = = =; ===C=z=Y== '====W=W== P=P=%}@=@==== =======  ===@=@=Z==  = =7='==== P=@=@=====%} ======= ===@=@=P==  ===7==== P=@=@===== ====%}===( ===@=@=P==2 ========7==== P=@=@===== ====$@ Killer 'thello By Mark T. Price Like chess, Othello is a thinking man's game. Likechess, it has an)} enormous number of possibilities that must beweighed before each move. Like chess, every piece on the boardmust be t)}aken into consideration. Like chess, moves must beplanned ahead and your opponent must be second-guessed. And, like che)}ss, all hell breaks loose when you tell theplayers that they don't have to take turns. Killer 'thello is a computer adapta)}tion of the classicboard game Othello (also known as Reversi) where just thathappens. Like Killer Chess from the)} February 1988 Antic, eachplayer moves as fast as he or she can to overwhelm their opponentwith speed as well as cunning)}. It should be noted that Greg "Assembly is EVIL" Knausshad absolutely nothing to do with the design or writing of thi)}sgame, although he wishes he did.TYPING IT IN Go ahead, I dare you.MAKING SELECTIONS When the title screen for 'thel)}lo appears, you can selecthuman or computer control for each player and you may also setthe number of players on each te)}am. That's right, Killer 'thellois played with teams. Up to four on each side, with a maximum offive players total. Noti)}ce that the word "White" in the upper left handcorner of the screen is highlighted. This means that allselec)}tions made will affect the White team. To make selectionsfor the Black team, press the space bar. This toggles th)}ehighlit team between Black and White. The game defaults to two human players, one on the Whiteteam, and one on the Black)}. To add a human player to the currentteam, press the SELECT key. The number next to each '+' cursorindicates the joyst)}ick that will control that player. The numberof human players in the game is limited to four due to the avail-ability of j)}oystick ports. If you try to play with more than twohumans on an XL or XE, players 1 and 3 will be controlled by joy-stick)} 1 and players 2 and 4 will be controlled by joystick 2. To add a computer player to the current team, press theOPTION ke)}y. A 'C' will be placed next to the new cursor indic-ating that this is a computer player. The number next to the 'C'is)} the level of that computer player. Press the numbers 1 to 9to change this. One is the equivalent of a beginning Ki)}ller'thello player, and nine should easily defeat the most exper-ienced. Since only five cursors can appear on the scr)}een at anytime, you will not be able to select, for instance, four humansif you already have two computer players. T)}o remove players,simply press the respective key; SELECT for human, OPTION forcomputer until all the players of that )}type are gone from thatside. Then, add back the number you want (remembering that thespace bar will toggle you betwee)}n the Black and White teams).The game will not let you remove all of the players from a team.PLAYING THE GAME Pressi)}ng the START key will begin the game. The gamewill give the person who does this a chance to get ready byprintin)}g "READY . . . SET . . . GO!" on the screen. Each teamstarts out with two disks already laid out on the board. Moves in)} the game lay disks on the board. In order for amove to be valid, there must be some number of the opposingteam's di)}sks between the new disk and one of your old ones.There can be no empty space in this line, but the lines can beei)}ther horizontal, vertical, or diagonal. When this is done, allof the opponent's pieces in between your new and old disks )} areflipped to your color. To make a move, move your cursor to a valid spot usingthe joystick and press the trigger. I)}f the move you attempted tomake is not valid, your cursor will be returned to the "PenaltyBox" where you started the game)}. This can be very costly interms of time, so be careful! The computer players begin to moveas soon as the game is s)}tarted and never make illegal moves. The score in the game is the number of disks of yourcolor. It is shown with the )}numbers in the upper left and lowerright hand portions of the screen. The game ends when all of the spaces on the board)} arefilled or neither team can make any legal moves. Whichever teamhas the highest score wins (Stunning new concept )}in computergames). After a short while the title screen will reappear andyou may play again.ANOTHER ONE? So, there )}it is, Killer 'thello. Can Killer 'nopoly befar behind?ll reappear andyou may play again.ANOTHER ONE? So, there (= 3TT@@TTTDDTT@TTT@TDDTTTDTDDTTDTUUU^^^^_-} (zzWWWW-}W꯯꯯zzWWWWW-}뫫WWzzzzzzzWzUU-}zW뫫UU믭UWWUUUUUUUUWWUUUTTTTTTTTTTTTTUUUTTTUUUU-}UUUUUjjZUUUU@@PUUUUUUUUUUUUWWWWWWWWUUUUUUWWWWWWZjjjjZ^zjꪪ-}jjZPRJz**jjZUTSRNJ:*7***jjYWWUUUTTSRNW'뫧J:*iiUWWWWUUUTP-}P@@W;+'CIiUWWWWWUTPP@@ ;CzY'痗WWPP@@ @@Z 7'P@@@@P7P@-}@@@Pppppp"$DR$B*$A$7()4%",!#+LLLDDDEF-}FFFFFFFFFFFFFFFDDDGLLLLLLTTTUT|QHLLLLLLTKKUTRSHLLLLLLTLLU-}TTTHLLLLLLTMMUTKKHLLLLLLTKKUTLLHLLLLLLTLLU-}TMMHLLLLLLTMMUTKKHLLLLLLTKKUTLLHLLLLLLTLLU-}TMMHLLLLLLTMMUTKKHLLLLLLTKKUTLLHLLLLLLTLLUTMMH-}LLLLLLTMMUTKKHLLLLLLTTTUTLLHLLLLLLTXNUTMMHL-}LLLLLTOPUTTTHLLLLLLIIIIIIIIIIIIIIIIIIIIIIIJLLLyzyz<=>?;-} Щ8ԩ>/Щoҩҍԩ2$/%č 6(Xȍ0$1-}ƅDžL'Ԧ .* + + + v*3 33 .22 .ߩ-}Ԭy1;)0ƴ a*L}( v*I v*JL*JJL)ŕ;ņ7ٝ0 ) )0-}ŘL)Ř0-L) )ĆƆ *֝ƕL(LI(ٝ'ņ! )詀ƆL-})Ř0Řгﰫ2Ř, )ĆƆĆ *֝ƊLg)憥ŏ揔0-}䆐 .*ՠ L* a* *LI(ƙ` +`i;`t3|30-}i L* a*`HT3\3h`Hd3l3h`33I`3 + v* + + + + + + -}+Z4P4 4H48 (4 :/ g/24 :/ g/)4 :/ g/14 :/ g/ L* a-}*~$&$&P4蘝75󆓭 )?<75H7575h75夊 -yK3ꦆL+,e-}`$12 %, +A2 %, +Ƌ`i`Q2V2[2`2e2 iƋ``-} *L'33A0֜i2i 80ZM) s-1 -}L,ƹC3 s- -ڹ75ő s- L,ƹ:3 - . - .)370:75 .7-}5 . œ L+,L+, Ə *L'ڹ75 .ڥڰ -)`88)JJJJ-}e8\JJJei `Hڨ75 -ߥh` - i` i@`8 &8 恈`4`H}&3-}4IʼnH拘}&34;09ʼnh`8&3 :/JԽ03 .ԦƋh`ht3|3`4 :/J-}.3 g/757575Ő ) -L.œ -Ɠh`30\4 ٜ4%33\44-}4JJ3 3`JJ3 - &e恘e恥`Hii$h iXiHi'hii`ҥ-})Ly03Ly03ޜ3 3Ii34 Li04}34\4i4i$4 iXiHi'hii"3Ƚ4Q3-} T14֛I44 2)33344\4\44433Λ3Lj03譛30 3L/ ҩ ҩL-}10LM x)I`ժ) ɗ)@հ)ɯ) 1L0մƹ13 }10L0i;-}ȌȌȌϴ3ƅLb&&8P愈쥄 Feei `8Ii-}8IiŌ 1˥.8uЕА$ 1L1 1Х8u˕ː 1 1`ժ`հ`)  u-}) Ju`H 0  ԍ h@UTUTUTUTUTUTUTUTWVWVWVWVWVWVWVWVj22222P%%%%&)*'(+,+,!(23 #/23!( -}%&:;VWTUTUTUTUTUTUVWVWVWVWVWVWTUTUTU45!(67VWV<=<@BVWVWTUT>?>ACTUTU!"89TUTUTUTU-. 23)*VWVW0123'(#$!(TU2468:<>N^-} P@0  9I:*&%%$%%&&7G<,&%%$%%&&TTTT|dL\t-}~$&%J$$"'  9I:*&%%$%%&&7G<,&%%$%%&&TTTT|dL\t, EIX;X; ********************(X; * *2X; * "KILLER 'THELLO" *<X; * By *FX; 1}* Mark Price *PX; * *ZX; ********************dX;nX; SYSTEM EQUATESxX; --------------X; 1}ATRACTMAUDCTLҠ AUDC1Ҫ AUDF1ҴCHBASECHRBAS COLOR0COLOR1COLOR2C1}OLOR3COLOR4CONSOL DLIST0DMACTL/GPRIORo"GRACTL,HPOSM06HPOSM1@H1}POSM2JHPOSM3THPOSP0^KEYCODEyh KEYINr NMIEN|PCOLR0PCOLR1PCOLR2PC1}OLR3PMBASEԮRANDOM Ҹ RTCLOK SIZEM SIZEP0 SKCTLSTICK0xSTRIG0VCOU1}NT VDSLSTVVBLKD$ WSYNC XITVBVb&X;0X; PM GRAPHICS AREA:X;DPMAREA8NMISSLESPMARE1}AXPL0PMAREAbPL1PL0lPL2PL1vPL3PL2X; X; COLORSX; PFCOL0Ĩ PFCOL1  P1}FCOL2 PFCOL36PLR0COLPLR1COL(PLR2COLXPLR3COLX;X; OTHER CONSTANTSX; #FRSTDSKBOAR1}D4;;1st disk posFRSTIMGX;;1st disk char LOCKED;;Player status*TRIGGER;; bits4BORDER;;Board entries1}> EMPTYH WHITER BLACK\UP;;Direction bitsf DOWNp LEFTz RIGHTMINX`;;Player/missile1}MAXX;; X/Y limits MINY@ MAXYROMFONTX;X; ZERO PAGE ALLOCATIONX; --------------------X;1}X;X; POINTERSX;POINTER;;Genl purposeSCRPTR;;Screen pointerVBIPNTR;;VBI use ONLY$X;.X; VARI1}ABLES8X;BACTIVE;;# of playersLCMPCHK;;Move check flagV!CMPLVL;;Default 'puter lvl`COLOR;;Move colorj1}COMPS;;# of 'puterstCOUNT;;Genl counting~DX;;VBI comp moveDY;;VBI comp move GOVRNDX;;Done chec1}k indexHOLDIT;;Genl purposeHOLDX;; holding forHOLDY;; A, X, & Y!LASTCMP;;Last comp touchedLAST1}SPC;;Last move pos#MAPPOSN;;Map position (temp)PLYRS;;# of humansPORT;;Joyport # (temp)SSTAT;;S1}ound statusTEAM;;Current team #!TTLFLAG;;Doing titles flag VALFLAG;;Valid move flagVBITEMP;;VBI use1} tempX;(X; TEAM INFO2X;<"SCRPND;;Points to add (+/-)F!TEAMSIZ;;# players on teamPX;ZX; DATA FOR EACH PLA1}YERdX;nBOX;;Penalty box #xOPLYRY;;Old positionPLYRX;;X position;; for game over checkPLYRY;1};Y position;; for game over check$PORTNO;;Human=0-3, 'puter=128STATUS;;What he's doingTEAMNO;;Team 1}afiliation;; for game over checkX;X; DATA USED FOR 'PUTERSX;#CMPLEVL;;Level (0 for human)PARTX;;P1}artial movesPARTY;; X & YMOVCLK;;Move clockTARGNO;;Target number"TARGX;;Target X & Y,TARGY;;1} position6X;@X;J TX;^>D:THELCHR.M65h>D:THELSCR.M65r>D:INIT.M65|>D:TITLES.M65>D:SETUP.M65>1}D:MAIN.M65>D:MOVE.M65>D:INT.M65>D:DATA.M65X; INITX;>D:TITLES.M65>D:SETUP.M65>0Xy X;X; ********************X; ** THELLO DISPLAY **(X; ********************2X;<X; 'thello display list:FX;P5}THELDSP p=p=p=p=p=Z WHTLINd Dn BOARDx ===== ===== =====B BL5}KLIN A THELDSPX;X; 'thello display memory: X; (max of 8 chars per line)X;WHTLIN A WHITEABLKLIN5} A A A A A A A A ABLACK AX;"BOARD  = = =A A, =====5}==6 =======@ =======J A A= = = T  = = =A A^WHTSCOR A Ah =5}===A Ar A A| A A==A|A== A A= = =   = = =A A = = ==A A A5} A A A==== A A= = =   = = =A A = = ==A A A A A A=6}=== A A= = =   = = =A A = = ==A A A A A A== = = A 6}A= = = &  = = =A A0 = = ==A A: A AD A A== = =N A A= = = X  = = 6}=A Ab = = ==A AlMSGADD0 A Av A A A A== = = A A= = =   = = =A 6} A = = ==A A A A A A== = = A A= = =   = = =A A = = ==A 6}AMSGADD1 A A A A A A== = = A A= = =   = = =A A  = = ==A A 6}A A  A A== = =* A A= = = 4  = = =A A> = = ==A AH A AR A A6}== = =\ A A= = = f  = = =A Ap = = ==A AzMSGADD2 A A A A A A== =6} = A A= = =   = = =A A = = ==A A A A A A== = = A A= =6} =   = = =A A = = ==A A A A A A== = = A A= = =   = = =A 6 } A ====A A A A$ A A== = =. A A= = = 8  = = =A AB ====A 6 } AL A AV A A== = =` A A= = = j  = = =A At ====A A~ A A6 } A A==== A ABLKSCOR A A= = =   = = =A A  = = = = = = =   = = = = = 6 }= =   = = = = = = =  A A= = =    = = =A A  = = = = = = =   = = = = = 46 X;X; ************X; ** TITLES **(X; ************2X;<!X; This is the game selectionsF!X; processing and tit:}le screenP!X; code. It is run on startupZX; and between games.dX;nX; SETUP THE TITLE DISPLAYxX; -------------------:}----X; RESTARTQ>;;Set titles flagPTTLFLAG;; (for VBI)Q>;;Turn VBI offPNMIEN;; & DLI on$ACTIVE;;Set a:}ll active#STPLXYL%BOX9;; players to home SETBOX;; positions0;; and show whoISTPLXYL;; they are CLRBORD;;Cl:}ear playfield$>MTITLE;;Put up title MESSAGE$>MAUTHOR;; and author name MESSAGE SHWTEAM;;Hilite active tea:}m"X;,X; SETUP TITLE DISK FLIPS6X;@Q>;;No disks flippingJ PLASTDSKT$>;;want 14 of each^)QTSDLOPQTWLOCL9:};;Get disk addresshPPOINTER;; for white diskrQTWLOCH9|PPOINTERQ>;; make it white ENQUEUE;;Activate it:}!QTBLOCL9;;Get disk addressPPOINTER;; for black diskQTBLOCH9PPOINTERQ> ;; make it black ENQUE:}UE;;Activate it0 HQTSDLOPX;Q>;;Enable VBIPNMIEN;; for titlesX;X; PROCESS USER SELECTIONSX; -------:}----------------&X;0X; DO KEYBOARD INPUT:X;D%CHKKEYS%KEYIN;;Read the keyboardNQ>;;Clear it for nextX PKEYINb :}Q@KEYCODE7;;Get ATASCII codelR>1;;If it is betweenvDCKSPAC;; 1 and 9R>;;; (inclusive)ECKSPAC;; then set the:}M>;; default 'puterPCMPLVL;; skill level$LASTCMP;;If there is aGGTCNSL;; last 'puterPCMPLEVL9;; set its lev:}el%BOX9;; and show the SETBOXL;; change on screen !GTCNSLCKSPACR> ;;If the key is aHGTCNSL;; space then:} SHWTEAM;; toggle theQTEAM;; active team N>;; number PTEAM  SHWTEAM;; and show it*X;4X; DO CONSOLE KEY IN:}PUT>X;H#GTCNSLQCONSOL;;Get console keyRV?;;If START is\ECHKSEL;; pressed, startf!START;; the gamepCHKSELV?;;E:}lse, if SELECTzDDOSLCT;; alter # humansV?;;Else, if OPTIONECHKKEYS;; alter # 'puters!DOOPTN;;Else, loop to keys:}X;X; CONSOLE KEY PROCESSINGX; ----------------------X;X; SELECT: NUMBER OF HUMANSX;DOSLCTQ>;;Clear l:}astPLASTCMP;; 'puter playerQ>;;If there are 4RPLYRS;; humans then tryDRMVPLYR;; to take 'em out%RACTIVE;;:}If max active ????????&DRMVPLYR;; take 'em out ????????$$%TEAM;;If teamsiz=max ????????.*RTEAMSIZ8;; take 'em: } out ????????8DRMVPLYR; ; ????????BX;L$ACTIVE;;ADD A HUMANVAPFTEAMQTEAM;;Move players`RTEAMNO9;; down unt:!}iljFAPFFPLR;; last membertA;; of current~?;; team is found3 MOVEDAT0 IAPFTEAM"APFFPLRQPORTNO9;;Move p:"}layersIAPFDOAD;; down untilA;; last human?;; of current3;; team is found MOVEDAT0 GAPFDOAD QTEAMNO9:#}  RTEAM FAPFFPLRAPFDOAD2;;Add new(Q>;; human after2PPORTNO9;; old last< PCMPLEVL9F#PLYRS;;Update #plyrsP:$}!STPADAT;;Fix all dataZX;dRMVPLYR$>;;REMOVE HUMANSn RMPFPLRQTEAMNO9;;Find firstxRTEAM;; member ofFRMPDORM:%};; active team2 HRMPFPLR"RMPDORMQPORTNO9;;If not humanGNORMV;; quit &HOLDXX; RMPLOOP%TEAM;;Get team s:&}izeQTEAMSIZ8FRMPLDON;;If =min quitQPORTNO9;;Get plyr typeIRMPLNDN;;If comp exit%RMPLDON!STPLDAT;; (fix:'} all data)"RMPLNDN%HOLDX;;Move all plyrs2;; after this!RMVPLOP MOVEDAT;; one down a" 2;; spot,36 )ACTIVE@ D:(}RMVPLOPJ"ACTIVE;;Update #plyrsT0^ ERASPL;;Erase plyrh$TEAM;;Update teamr"TEAMSIZ9;; size|$HOLDX;;Update #:)}humans "PLYRS !RMPLOOPX;NORMV!CHKKEYSX;X; OPTION: NUMBER OF 'PUTERSX;DOOPTNQ>;;If teamsiz=max:*}%TEAM;; try to takeRTEAMSIZ8;; out 'puters DRMVCOMPQ>;;If max activeRACTIVE;; try to takeDRMVCOMP;; o:+}ut 'puters $ACTIVEX;&ACFTEAMQTEAM;;ADD A 'PUTER0RTEAMNO9;;Move players:FACFDOAD;; down until DA;; last memb:,}erN?;; of currentX3;; team is foundb MOVEDATl0v IACFTEAMACFDOAD2;;Add new 'puterQ>;; after old last PP:-}ORTNO9QCMPLVL;;Set level=PCMPLEVL9;; cur default&LASTCMP;;This is last comp#COMPS;;Updata # 'puters!STPAD:.}AT;;Fix all dataX; RMVCOMPQ>;;REMOVE 'PUTERSPLASTCMP;;No last 'puter$>;;Find first RMCFTEMQTEAMNO9;; me:/}mber ofRTEAM;; active team  FRMCFCMP2  HRMCFTEM* RMCFCMPQPORTNO9;;Find first4GRMCDORM;; 'puter on>2;; acti:0}ve teamH QTEAMNO9RRTEAM; ;If no 'puters\HNORMV;; on this teamf(ACTIVE;; then quitp FRMCFCMPz DRMCFCMP ENORM:1}VRMCDORM&HOLDXX; RMCLOOP%TEAM;;Get team sizeQTEAMSIZ8;;If=min quitFSTPLDAT;; (fix all data)QTEAMNO:2}9;;If not on teamRTEAM;; quitHSTPLDAT;; (fix all data)%HOLDX;;Move all plyrs2;; after this one"RMVCLOP MOV:3}EDAT;; down a spot2 3 )ACTIVE DRMVCLOP$ "ACTIVE;;Update #plyrs. 18 0B )ACTIVEL FDOERPCV 0` DOERPC ERAS:4}PL;;Erase plyrj $TEAM;;Update team sizet "TEAMSIZ9~ $HOLDX "COMPS;;Update #'puters !RMCLOOP X; X; DATA JUS:5}TIFICATION X; STPADAT#ACTIVE;;FIX FOR ADD QTEAM;;Update #plyrs, PTEAMNO9;; & team size > #TEAMSIZ9 X; :6}"STPLDATQ>;;SET BOXES & PORTS PHOLDIT;;Init team %>;;Init box count 'PORT;;Init port count $>;;FIX ALL PLYRS:7}( %STPLDLPQTEAMNO9;;If on this team2 RHOLDIT< FSTPSBOX;;Go set box/portF %>;;Box=first on 2ndP #HOLDIT;; side & te:8}am = 2Z "STPSBOX'BOX9;;Set box of plyrd QPORTNO9;;If it's a humann GSTPLNPL;; player, set portx QPORT;; to next avail:9} #PORT;; joystick PPORTNO9 STPLNPL3;;Update box 2;;Do next plyr (ACTIVE DSTPLDLP FSTPLDLP X; $>;;SH::}OW IN BOXES %> "STBNUML SETBOX;;Set boxes for 3;; this player 2 !STBXECL(ACTIVE;;If past last FSTBCKY;; then:;} erase ESTBXEMT;; id's for it" STBCKYC;;If this box, RBOX9;; is active6 FSTBNUML;; go show it@ STBXEMTQ>;;Erase :<}id'sJ  SETBOXN;; for thisT Q>;; box^ SETBOXLh 3r )>;;(do all 8)| DSTBXECL X;  DBCNSOL;;Debounce console :=}!CHKKEYS;;Loop for input X; X; SUBROUTINES FOR TITLES X; ---------------------- X; X; MOVE PLAYER DATA FROM X X;:>} INDEX TO Y INDEX X; !MOVEDATQPORTNO9;;Move port # PPORTNO8 QTEAMNO9;;Move team # PTEAMNO8 QBOX9;;Move box #:?} PBOX8& QPLYRX9;;Move x-pos0 PPLYRX8: QPLYRY9;;Move y-posD PPLYRY8N QCMPLEVL9;;Move levelX PCMPLEVL8;;(0 for h:@}umans)b :l X;v X; X; CONSOLE KEY DEBOUNCE X; DBCNSOLQCONSOL;;Get console R>;;If button hit HDBCNSOL;; try a:A}gain Q>;;Wait for 1/30  WAIT;; of a second : X; X; X; ERASE PMG INDICATOR X; (PMG # in X) X; 0 = missil:B}e X; 1-4 = player X; ERASPLA;;Calculate address ,;; of PMG indicator* O>5MISSLES4 PPOINTER;;& set a pointer>:C} Q>H PPOINTERR ?;;Then, erase the\ $ERASPLPP@POINTER7;; whole thingf 1p HERASPLPz : X; X; X; SET SELECTION :D}BOX ID's X; Box # in Y X; Plyr # in X X; SETBOXQPENX8;;Set PMG posn PPLYRX9 QPENY8 PPLYRY9 QPORTNO9;;:E}If it's a GSTBFCM;; human, his ,;; ID = hisO>;; port +17HSTBFPR;; (digit)STBFCMQ>;;Else, a 'C'$#STBFPR :F}SETBOXN;;Set the ID box.QCMPLEVL9; ;Set level box8 SETBOXL;; (blank forB:;; humans)LX;VX;`X; SET CONTENTS IDEN:G}T BOXjX; Content in AtX; Box # in Y~X;SETBOXN'HOLDY;;Save box #5;; and contentQBOXNLO8;;Set pointer to:H}PPOINTER;; ID box QBOXNHI8PPOINTER7;;Get content%>;;And set itP@POINTER7;; on screen%HOLDY;;Get ba:I}ck box #:X;X; X; SET CONTENTS LEVEL BOXX; Content in AX; Box # in Y(X;2SETBOXL'HOLDY;;Save box #<5:J};; and contentFQBOXLLO8;;Set pointer toPPPOINTER;; level boxZ QBOXLHI8dPPOINTERn7;;Get contentx%>;;And se:K}t itP@POINTER7;; on screen%HOLDY;;Get back box #:X;X;X; HIGHLIGHT ACTIVE TEAMX;SHWTEAM%TEAM;;Get :L}team # QTEAMTXL8;;Set pointer toPPOINTER;; team textQTEAMTXH8PPOINTER%>;;Invert all!ITNLOOPQ@:M}POINTER7;; chars ofN>;; team textP@POINTER7"1, IITNLOOP6:H8PPOINTER%>;;Invert all!ITNLOOPQ@8I