@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;; SHARP SHOOTER; by Matthew J.W. Ratcliff ;; COPYRIGHT 1989; BY ANALOG COMPUTING;; CHECT}KSUM DATA;[48 0B 1E 62 0B 10 10 12 ; 78 1A 5B 6E 9E 58 23 EE ; D8 EB E2 41 52 46 14 71 ; 0B 3A 83 1F A4 53 18 ]BYTE RTSU}=[$60] ; This declaration ; must be the first ; compiled code if ; using this V}pgm with ; OS/A+ versions 2.2 ; and before; Game global target arrayBYTE ARRAY XCS=[26 79 1W}32 26 79 132]BYTE ARRAY YCS=[48 48 48 144 144 144]BYTE ARRAY Tgsel(6)BYTE Jiffy = 20BYTE Jiffy1 = 19BYTE CH = 764X}BYTE TRIGGER= 632BYTE Attract= 77;-------------------------INCLUDE "D:GUNREAD.ACT";-------------------------PROC ZeroTY}ime()CARD Timer=19Timer = 0RETURN;-------------------------; Get elapsed time in jiffies;CARD FUNC GetJTime()CARZ}D tictic = Jiffy1*256 + Jiffy RETURN(tic);-------------------------PROC Blast( CARD xb, BYTE yb )BYTE sCARD dAttra[}ct = 0IF xb < 1 THEN xb = 1FIIF xb >158 THEN xb = 158FIIF yb < 1 THEN yb = 1FIIF yb > 190 THEN yb = 190F\}IPlot(xb-1, yb)Plot(xb+1, yb)Plot(xb, yb-1)Plot(xb, yb+1)s = 16 Sound(0, 100, 8, 15)FOR d = 0 TO 200 DO ; OD]}WHILE s # 0 DO s = s - 1 Sound(0, 140, 8, s) FOR d = 0 TO 100 DO ; OD ODSound(0, 0, 0, 0)RETURN ^};-------------------------; Return the integer square; ROOT of the value passed.;; Algorithm: The integer square ; roo_}t is the count of the total; successive odd numbers, starting; from 1, that can be subtracted; from the parameter before i`}t goes; negative.BYTE FUNC ISqrt( INT r )BYTE i, ji = 1j = 0WHILE (r > 0) DO r = r - i i = i + 2 IF r >= 0 Ta}HEN j = j + 1 FI ODRETURN( j );-------------------------PROC SelTarget( BYTE tg )CARD XBYTE yAttract = 0b}x = XCS(tg)y = YCS(tg) Plot(x-26,y-26)DrawTo(x+26,y-26)DrawTo(x+26,y+26)DrawTo(x-26,y+26)DrawTo(x-26,y-26)IF colorc} # 0 THEN FOR y = 0 TO 15 DO Sound(0, 60, 10, y) FOR x = 0 TO 200 DO ; OD OD Sd}ound(0, 0, 0, 0) FIRETURN;-------------------------INT FUNC ABS(INT NUMBER)IF (NUMBER < 0) THEN RETURN(-NUMBER)FIe}RETURN(NUMBER);---------------------------PROC GAMESCREEN()BYTE I,RINT DXINT DYINT PHI, PHIXY, PHIYCARD XBYTE Yf}Attract = 0color = 1FOR R=5 TO 25 STEP 5 DO DX=R DY=0 PHI = 0 WHILE DX >= DY DO PHIY = PHI+DY+DY+1 g} PHIXY= PHIY-DX-DX+1 X = DX Y = DY FOR I=0 TO 5 DO Plot (XCS(I)+X,YCS(I)+Y) Plot (XCS(I)+Y,YCSh}(I)+X) Plot (XCS(I)+Y,YCS(I)-X) Plot (XCS(I)+X,YCS(I)-Y) Plot (XCS(I)-X,YCS(I)-Y) Plot (XCS(I)-Y,YCS(i}I)-X) Plot (XCS(I)-Y,YCS(I)+X) Plot (XCS(I)-X,YCS(I)+Y) OD PHI = PHIY DY = DY + 1 IF ABS(PHIXY)j}+0 3 THEN color = 1 FI Blast( x, y ) radius = GetRadius(x,y,tgsel(i)) IF radius <= 5 T~}HEN bulls = bulls + 1 BingBong() FI IF radius <= 25 THEN hits = hits + 1 scor}e = score + (26-radius) ELSE misses = misses + 1 BingBap() FI DO UNTIL TRIGGER=}14 OD color = 0 SelTarget( tgsel(i)) i = i + 1 IF i > 5 THEN i = 0 RandTgts()} FI color = Rand(3) + 1 OD OD x = GetJTime() x = x/60 IF x < 3600 THEN x = 3600/x ELSE } x = 0 FI CH = 255 Graphics(0) Poke (710, 20) Position(2,2) PrintE("Sharp Shooter By Mat*Rat") Print("Final }Score for Round ") PrintCE( round ) round = round + 1 Print("Bullets/Min = ") PrintCE( x ) Print("Total Hits = "}) PrintCE( hits ) Print("Total Misses = ") PrintCE( misses ) Print("Bullseyes = ") PrintBE( bulls ) Print("Sco}re = ") PrintCE( score ) IF score > hiscore THEN hiscore = score FI Print("Accuracy = ") x = 100 *} bulls x = x/60 IF x > hipct THEN hipct = x FI PrintC( x ) PrintE("%") PrintE("") Print("High Score = "}) PrintCE( hiscore ) Print("Best Accuracy= ") PrintB( hipct ) PrintE("%") PrintE("") PrintE("Press to p}lay") PrintE("Or typeŠ to exit") DO UNTIL TRIGGER=14 OR CH=28 OD DO UNTIL TRIGGER=15 OR CH=28 OD DO } UNTIL TRIGGER=14 OR CH=28 ODUNTIL (CH = 28)ODCH=255Graphics(0)PrintE("Sharp Shooter, by Mat*Rat")PrintE("(c) 1989,} Analog Computing")RETURN ODUNTIL (CH = 28)ODCH=255Graphics(0)PrintE("Sharp Shooter, by Mat*Rat")PrintE("(c) 1989,; GUNREAD.ACT;; CHECKSUM DATA;[6A BA 3A 75 52 ]; Read the Atari light gun; and convert the readings; of LPENH & L }PENV to current; graphics mode screen coordinates;; Algorithm developed by:; Matthew J. W. Ratcliff; Ratware Softworks; } (c) 1989;; For Analog Computing;; Algorithm:; The DELTA-X gun readings were; apparently DESIGNED to be 160; with DELT }A-Y at 96. These values; work out to be multiples of two,; by powers of two, for each and; EVERY possible Atari graphics }mode; 0 through 15 (full screen modes).; ; The X reading starts at about 89; at the far left of the display,; increases }to 227 at about text; column 34, then drops to zero.; It increases to about 22 at the; far right of the display.;; The Y } reading starts at about 17; at the top to 112 at the bottom.;; GunRead normalizes the X reading; to 0-159, inclusive and } Y to a; range of 0-95. Then the XSHIFT; and YSHIFT tables are accessed,; based on the current graphics mode.; If the va }lue is less than 128, it; is a right shift count (divide).; A value of 128 indicates a single; left shift (multiply by 2). }; ; The end result is a valid X,Y; coordinate reading of the light; gun for the present graphics; mode. It is up to the } user; to assure the screen intensity; (COLOR*16+INTENSITY) is at a level; to get valid gun readings. A value; of at lea }st 10 is recommended.; A "flash" technique may work best; Set all playfield intensities to ; 14, call GunRead, and restore } the; original playfield colors.; PROC GunRead( CARD POINTER xx, BYTE POINTER yy)BYTE ARRAY xshift=[2 } 3 3 1 1 1 0 0 128 1 1 1 2 2 0 0] BYTE ARRAY yshift=[2 2 3 2 1 1 0 0 128 128 128 128 2 3 128 128]CARD GunXBYTE GunYBYT }E DINDEX= $57BYTE LPENH = 564BYTE LPENV = 565BYTE shift, index GunX = LPENHGunX = GunX & $FFGunY = LPENVinde }x = DINDEXIF GunX <= 40 THEN GunX = GunX + 227 IF GunX > 255 THEN GunX = 255 FIFIIF GunX <= 90 THEN GunX = 90FI }GunX = GunX - 90IF GunX > 159 THEN GunX = 159 FIshift = xshift(index)IF shift = 128 THEN GunX = GunX LSH 1E }LSE GunX = GunX RSH shiftFIGunY = GunY - 17 IF GunY > 127 THEN GunY = 0FI IF GunY > 95 THEN GunY = 95FI }shift = yshift(index)IF shift = 128 THEN GunY = GunY LSH 1ELSE GunY = GunY RSH shiftFIxx ^= GunXyy ^= GunYRETUR }Nft = yshift(index)IF shift = 128 THEN GunY = GunY LSH 1ELSE GunY = GunY RSH shiftFIxx ^= GunXyy ^= GunYRETUR ?@ COUNPOLECOUNTSOURCEDESTSPARESOURCDESSPARLEVELOO@A AAA&AD}@@ @ @ @ @@@&&***** THE TOWERS OF HANOI *****&&*}****** by GREGG HESLING *******q +A1A @C@O(COUNT Sq @})!@@ KKRAM is not a problem in this program, so we indiscriminantly waste it D,9@<@,9,}9,9,9,>AR@D(}PPAssign the poles temporary labels and tell how many discs are on each polef6-}6-@'6-@868<,-O68<,-f68<,-11Make the poles and put th}e discs on pole #1m-@@!#-@=(  A m(' }|-@&68<,-&%@96-&P:'@,V6-+'@"P:'@,,n-@&&%@!x @| }[ @"@# @P- @@[Move the top disc and don't save the labels!D-@  (SAVING})68,-268,-;68,-D68,-#CCSave the current labels, then switch the DEST and SPARE poles%; 6-6-6-#}6-&@16-%@; @0(?6-&@ /-@ <(COMPLETE?+Q-@ #( }RESTORING,6-8,56-8,>6-8,G6-8,Q @-aaRestore the previous labels, move the top disc to the DEST pole,} and swap SOURCE with SPARE/W @P-@ -( SWITCHING;6-&@A6-G6-M6-W @01 Move }disc to top of screen2h6-8<,-68<,-&@86-8<,U6-+'@"P:'@,,h6-&P:'@,}7g-@ 1-$@%@&@!&; @Y-$@%@@"&c @g ;##Move disc from S}OURCE to DEST<R-@0-@O:&,$@N(>:AT%++&,!,,R F6-8<,%@-}68<,-J68<,-$@%&@i-@!%@6@-$@%@&@#& @JLo}wer disc down to DESTK2!-$@%@@"&+ @/ 2$OPrint discPW(>:@2%A!$,1-@}$@8(< T(>:@2&@$,W$TErase discUVS( >:@2%A!$+ @,,>:@2&@}$+ @,, V$Zm-&(COUNT= 8-@C(LEVEL=G[-@$%m(&@} ]|-@$%@@#+(SOURCEG-@$%@@#T( DEST p-@$%@@#|(}SPARE ad-@A --@ ;( >$dTo speed things up, change 100 to 1 D:HANOI.}BASARE ad-@A --@ ;( >$dTo speed things up, change 100 to 1 D:HANOI.45; R SIZRAARRAYALEFTRIGHTLEVELLEVECOUNSOR@A3*&&&@wZ }@ @ @ @@&&*********** HEAPSORT ***********&&****** by G}REGG HESLING ******* a @%(Max. size/entry)S6-P:+I:,&&A,'+%@,,a;$,;, ``Re}cursion devours RAM, up to 28% in this program depending on the "maximum size per entry"f,;$@,;$@,;$}@,46.G67$@,.V67@,.\6.f @PccLEFT$ and RIGHT$ will store the pointers, while LEVEL$} will be the "recursive variable saver"d76-@:7$@&@,,$AV%@:7$@,,K"@0dThere is} no left childjjThe address of the current node is stored, then we make the left child the current node and go againx}6-P:'AV,267%@<%@,.>:,Z67%@<%@,.>:&$AV,h6-%@n6-x @ n"(7+}&@,$%@<$,nARRAY$ is printed in sorted order -- left child, parent, then right child#w76-@:7$@&@},,$AV%@:7$@,,;A6-K @ wFollow right leg without saving positions'aaRestore the last saved po}sition -- the parent with a left child -- and go directly to PRINT(K6-&@A6-@:7%@,,$AV%@:7%@},,K @02.(.( records used& records left7l(Entry:  6-@'436-@?6-}I @ lGo to recursive printing routine;mmStore new string, then use a binary tree search to determine the new strin}g's position and set pointers<d 6-$-@&67%,. * B67%@<%B:,,.P6-%@d"@@U}AfG7+&@,$%@<$,37+&@,$%@<$,@ufFollow left or right branch?EVVLeft branch. } If there is a child, go to it. Else, save new entry at this pointF76-@:7$@&@,,$AV%@:7$@,,A }@O67<,.>:,w67%@<%@,.>:&$AV, @UJWWRight branch. If there is a child, go to it. E}lse, save new entry at this pointK76-@:7$@&@,,$AV%@:7$@,,A @O67<,.>:,w67%@}<%@,.>:&$AV, @UP 6-' @eU36-$@&@6-06-P:'AV,3$YooChang}e line 55 to line 56 and type "55 IF COUNT THEN GOSUB 95" to see previous entries and their pointersZa-@a(@:7}$@&@,,$AV%@:7$@,,7+&@,$%@<$,_<5(@:7$@&@,,$AV%@:7$@,,}9 <$D2:HEAPSORT.BAS$@,,7+&@,$%@<$,_<5(@:7$@&@,,$AV%@:7$@,,56 HSTARLOLXENCELOFFSEOFFTABLDTABLACTIVOL@}A @ As A @x @$$******************************$$* MACRO EDITOR} *$$* by Frank Seipel *$$* *$$* COPYRIGHT 1989 *$$* } BY ANALOG COMPUTING *$$******************************h +@A@1-@Q(@} Ġh6-F:A6,"Aim(@.(@ BY FRANK SEIPEL9(@D(@O(@}m(@ please wait%-A6Ar"!% X +( @(+6-F:A5,=A5}AL6-?:A5,XA5I(+( Enter macros. Hit afterI(entering each macro. Any=+(# ke}ypresses will be part of:( the macro.=(I&(A macro is a string of text --I(for instance, you could defineO(( Sh}ift+Control+0 as LIST O("with this program -- and then type K(( Shift+Control+0 instead of LIST.+(K(This pro}gram can be used to!N)(!redefine the macros in memory, orN( write out an AUTORUN.SYS file to"b+(#your disk, which wil}l automaticallyR("install your macros every time you_(boot-up.b(#G#@@K:/6-;6-A}sG6-A$c(%(Hit for next page2)@?(>:A%,B(c(Sum length of all macros may%P&(no}t exceed 128. After using aP(%macro, you may not use it again until&i)(!you have typed some other key, orE(used anot}her macro key.i((If this is a problem, just hit'/,($ before executing the macro)/((-@ * }%2G(>(Enter macro for >:%@H%A(,G(--><+F:B2y,"@" A@+*SAVE*F"}F:Ad,"AU" @`P)%F:Ad,!)@)(>:,6-%@ @`;%AU6-%@}3-@A7 ; S( (*(Would you like to make theseS($your default macros [i.e., would youq$(lik}e to write an AUTORUN.SYSK("consisting of these macros and theq( macro program to D1: ? -->H)@$"@:}y,)"@:Y,,(Yes/(>( Working...H B (No RqWW169,0,141,149,6,165,12,141,46,6,165,13,141,47,6,169,23,13}3,12,169,6,133,13,160,48\qaa162,6,169,6,32,92,228,173,149,6,201,1,240,6,169,1,141,149,6,96,76,224,7,72,138,72,173,147,6fq]}]208,44,173,9,210,197,0,240,17,133,0,162,0,189,127,6,205,9,210,240,11,232,224,10,208,243qii104,170,104,76,95,228,169,1,14}1,147,6,189,137,6,141,148,6,76,80,6,174,148,6,189,150,6,201,255,240,9raa141,252,2,238,148,6,76,80,6,169,0,141,147,6,76,80,}6,242,223,222,218,216,221,219,243,245,2400u9@9@@ D:AUTORUN.SYS:u%6-A6-A}% BDu%6-A66-A% BNu)*@A&)*@@Xu)*@A')*@@}bu)*@)*@@lu@y)*@AU)*@AU"y 6- B,y}*@*@6y 6- B@y*@*@Jy -Ty*@F:, y'6-P:'AV},$6-&$AV'$D:MACROEDT.BAS@y*@*@Jy -Ty*@F:, y'6-P:'AV-d!X;****************************n!X;* *x!X;* Macro keys *!X;* } *!X;* Written by: Frank Seipel *!X;* *!X;* December 30, 1988 *!X;* } *!X;****************************X;SYSVBV_SETVBV\ CHKBCODE LASTKEY}Q> PFIRSTRUNQ "PDOSJUMP,Q 6PDOSJUMP@ Q>INITJP TQ>INIT^P hINIT%>STARTr}$>START|Q> SETVBV QFIRSTRUNR> FDOSJUMPQ> PFIRSTRUN:DOSJUMP!X;X; Actual code} starts hereX;START5;; Save AA 5;; Save XQINPROGRESS;;Already goingHTYPEITOUT;; do next key&QKBCODE;; } compare key0RLASTKEY;; to last-:FEXIT;; quit if sameDPLASTKEY;; store lastN$>;; zero indexXLOOPQKEYCODE}S9;; check ifbRKBCODE;; key is alFMACROPRESSED;; macro keyv 2;; inc X(> ;; done?HLOOP;; no; do nxtEXITX}; Code to exit interrupt7>;; Restore X7;; Restore A !SYSVBVMACROPRESSED X; Initiate macro typing codeQ>};; Tell interruptPINPROGRESS;; to get goingQOFFSETS9;; get offsetPCUROFFSET;; store offset !EXIT;; quit TY}PEITOUT X; code to key macro*$CUROFFSET;; get offset4QDATA9;; get data>R>;; end of macro?HFDONE;; yes; quitR}PCH;; no; type\#CUROFFSET;; inc offsetf!EXIT;; quitpDONEzX; End macro codeQ>;; Tell interruptPINPROGRESS};; quit typing!EXIT;; and quitLKEYCODES =========;; Codes for macro keys (internal)COFFSETS =}======= = ;; Reserve RAM for offsetsINPROGRESS CUROFFSET FIRSTRUN DATAX; Macro key d}ata table==== = ;; Reserve RAM for offsetsINPROGRESS CUROFFSET FIRSTRUN DATAX; Macro key d 45Y p SIZRAARRAYAFIRSTLASTPIVOFIRSLASLEVECOUN@AiiQQQ/d/@4 }@4@6 @5 @5&&*********** QUIKSORT ***********&&****** by GREGG HESLING ******* _ }(Max. size/entryQ6-P:+I:,&&A,'+%@'@,,_;$,;, XX57% of RAM is lost when SIZE } equals 1, but only 1% is lost when SIZE is 65 or moreq/;'@$@,;'@$@,76.R67'@$ }@,.a67@,.g6.q @ccFIRST$ and LAST$ will hold pointers to the beginning and end of arrays that n }eed to be sortediiLines 20-40 take the first entry in the array and move it over until everything less than the pivot? }?is to the left, while everything greater is to the right.26-+&@,$%@26.7<%&@,H+-$%@ }+&@,$%@H7<%&@,3@@#S'67<%&@,.7<%&@,/6-%S67<%&@,.7 }<%&@,(L 67<%&@,.66-+&@,'%@L%@@`1XXIf there are entries to the r }ight of PIVOT, the first and last positions are saved2e6-%@"6-P:'AV,667%@,.>:,T67%@,.>:!}&$AV,e6-P:'AV,7k67%@,.>:,567%@,.>:&$AV,C6-%@[(>:'@%@d,kDi!}splay level;mmIf there are entries to the left of PIVOT, change FIRST and LAST to the new limits and immediately sort<)!} &@6-&@) @ EFFRestore the positions of unsorted arrays (to the right) and sortF++6-@:7&!}@,,$AV%@:7,,K]+6-@:7&@,,$AV%@:7,,96-&@@(~J @ ]ESC/BACK SPACE=~O??AR!}RAY$ is already sorted, so a simple print is sufficientP4-@0(7+&@,$%@<$,4 U.(.( reco!}rds used& records leftZf(Entry: 4'6-@-6-96-C @ fCall recursive sorting algo!}rithm^77Simple routine to tack entry to the end of ARRAY$_Z 6-$-@&67%,. * B67%@<%B:,,.!}P6-%@Z @D2:QUIKSORT.BASd of ARRAY$_Z 6-$-@&67%,. * B67%@<%B:,,. 189 8## 8` BD8E8H8I V 8nl89E819 8% }88  P  klʍ`} Setting Up ATARI 800XL Ram Disk*ExԭӅ˩`ˍX@` L% }S` LYxԭӅ˩ ˍX@`1`R%PWS` H̭ H̄ͮ΄Ϡ% }̑Έ0ϭ hhĭ h`i`qݰɍ 8q 8 eͨ`̩͢&`8 H̄ͮ΄Ϡ$fSCr .LIOFF#*********************************(*MDRIVE2.5*2*----------*<**!F*Ramdiskdriverf) }or800XL*!P*------WithDOS2.5-----*Z** d*UseasRAMDISK.COM(D5:)*n**x*Author:JerryvanDijk**)}Pelikaanhof15**2312EALeiden**TheNetherlands***"*Lastrevision:12-dec-1988****Writtenin)}SynAssembler***#*>>>USESPARTOFPAGE6<<<***#*******************************;#;----------------)}--------------;MDRIVECONSTANTS#;------------------------------;!"MAXSEC.EQ$01;Maxsectorhi ,OFFSET.EQ$)}38;VTOCoff-set!6SECNUM.EQ$45;VTOCdatasec@VSEC.EQ$68;VTOCsecloJDSEC.EQ$69;DIRseclo TSECLOW.EQ$71)};DATAseclow ^SECMID.EQ$8D;DATAsecmid"hSECHIGH.EQ$DD;DATAsechigh"rTESTBYT.EQ$EA;RAMtestbyte|;#;--)}----------------------------;MDRIVEEQUATES#;------------------------------;TEMP.EQ$CB;MemorystatZPAG)}E.EQ$CC;Temp.adrMPROG.EQ$3800;Progbegin RTSTART.EQ$38EC;RTorigin EXSTART.EQ$3930;EXorigin!RAMLOW)}.EQ$C000;LowRAMblkVTOC.EQ$C100;VTOCadrDIR.EQ$C180;DIRadr"LOWBANK.EQ$C200;DATAloadr#HIGHBANK.)}EQ$D800;DATAhiadrSOMERAM.EQ$F123;TestRAM;#&;------------------------------0;DOS2.5CONSTANTS#:;-----)}-------------------------D;ND5.EQ$05;D5:deviceXDRV5.EQ$50;Drive5!bSECLEN.EQ$7F;Sectorlengthl;#v;-)}-----------------------------;DOS2.5EQUATES#;------------------------------; DRVBYT.EQ$70A;Act.drives)}DSIO.EQ$7B0;SIOVcallDINIT.EQ$7E0;InitDOSDDSK.EQ$106B;DSKINVcall;#;------------------------------)};ATASCIICODE'S#;------------------------------;CD.EQ$1D;CursordownCLS.EQ$7D;Clearscreen EOL.E)}Q$9B;Clearscreen;# ;------------------------------*;XLSYSTEMCONSTANTS#4;------------------------------>;)} HIOCB0.EQ$00;IOCB0offset!RNMIOFF.EQ$00;NMIoffvalue\OK.EQ$01;NoerrorcodefPUTBUF.EQ$0B;CIOputbuf)}pDISK.EQ$31;SIOdiscodezNMION.EQ$40;NMIonvalueWRITE.EQ$50;SIOputcmdREAD.EQ$52;SIOgetcmd ST)}ATUS.EQ$53;SIOstatcmdVERIFY.EQ$57;SIOputcmdNOSEC.EQ$90;SectorerrorNOCMD.EQ$A8;CmderrorRAMON)}.EQ$FE;ROMdisable;#;------------------------------;XLSYSTEMEQUATES#;------------------------------;) }DDEVIC.EQ$300;DCBdeviceDUNIT.EQ$301;DCBunitDCOMND.EQ$302;DCBcmdDSTATS.EQ$303;DCBstatus$DBUF)!}LO.EQ$304;DCBbuflo.DBUFHI.EQ$305;DCBbufhi8DAUX1.EQ$30A;DCBsecloBDAUX2.EQ$30B;DCBsechiLICCOM.)"}EQ$342;CIOcmdVICBAL.EQ$344;CIObuflo`ICBAH.EQ$345;CIObufhijICBLL.EQ$348;CIOlenlotICBLH.EQ$349)#};CIOlenhi~PAGE6.EQ$6BC;Freespace PORTB.EQ$D301;Memoryctrl NMIEN.EQ$D40E;NMIcontrol DSKINV.EQ$E453)$};SIOstatusCIOV.EQ$E456;CIOvectorSIOV.EQ$E459;SIOvector;#********************************Checkf)%}orRAMmodule*#*******************************;";Thismoduleisthefirstrun!;whenMDRIVEisexecuted.It!)&};checkswhetherthereisRAM! ;beneaththeOS.Ifthereis ;itrunstheinstallmodule ;otherwiseitsimplyexit)'}s.(;2.ORMPROG<; FMDRIVEP;Z;DisableOSROM'sd;nJSRROMOFFx;;Store&retrieveabyte;)(}LDA#TESTBYTSTASOMERAMLDASOMERAMTAX;;RestoreOSROM's;JSRROMON;;Checkifthere))}isRAM;CPX#TESTBYTBEQINSTALLRTS";#,*******************************6*INSTALLRAMDISKMODULE*)*}#@*******************************J;T;ModuletoinstalltheRAM ^;disk.Itformatsthedisk,h;makestheDOSpat)+}chesandr;copiestheruntimeand|;modulesinplace.; INSTALL;;Firstprintamessage;LDA#PUT),}BUFLDX#IOCB0STAICCOM LDA#MSGSTAICBAL LDA/MSGSTAICBAHLDAMSGLENSTAICBLLLDAM)-}SGLEN+1STAICBLH &JSRCIOV0;:;DisableOSROM'sD;NJSRROMOFFX;b;Clearvtoc&directoryl; vL).}DA#0TAY.0STAVTOC,YSTADIR,YINY BNE.0;;WriteVTOCsector; LDA#2 STAVTOC )/}LDA#110STAVTOC+1 LDA#108STAVTOC+3 LDA#%01111111STAVTOC+OFFSET LDA#%11111111*LDY#OFFSET)0}+14.1STAVTOC,Y>INYHCPY#SECNUM RBNE.1\LDA#%11111000fSTAVTOC,Yp;"z;Copyexecutemoduleinpla)1}ce;LDYEXLEN.2LDAEXSTART-1,YSTARAMLOW-1,YDEY BNE.2;;EnableOSROM's;JSRROMO)2}N;";Copyruntimemoduleinplace; LDYRTLEN .3LDARTSTART-1,Y STAPAGE6-1,Y$ DEY . BNE.38 ;)3}B ;AddD5:toDOSL ;V LDADRVBYT` ORA#DRV5j STADRVBYTt JSRDINIT~ ; ;PatchDOSDSKINVcall ; LD)4}A#MDSK STADDSK LDA/MDSK STADDSK+1 ; ;PatchDOSSIOcall ; LDA#MSIO STADSIO LDA/MSIO)5} STADSIO+1 ; ;Imstallationdone ;( RTS2 ;< ;ThemessageF ;P MSG.DA#CLS,#CD,#CD,#CDZ .DA#CD,#C)6}D,#CDd .AS'SettingUpATA'n .AS'RI800XLRamDis' x .AS'k' .DA#EOL,#EOL MSGLEN.DAMSGLEN-MSG ; ;R)7}untimemodulelength ; RTLEN.DA#RTEND-PAGE6+1 ; ;Executemodulelength ; EXLEN.DA#EXEND-RAMLOW+1 ;)8}# ;------------------------------ ;MDRIVESUBROUTINES# ;------------------------------ ;  ROMOFF" ;, ;Disabl)9}eOSROM's6 ;@ SEIJ LDA#NMIOFFT STANMIEN^ LDAPORTB h STATEMPr LDA#RAMON| STAPORTB RTS ; ):} ROMON ; ;EnableOSROM's ; LDATEMP STAPORTB CLI LDA#NMION STANMIEN RTS ;# *******);}************************ *RUNTIMEMODULE*# *******************************& ;#0 ;ThiscodeiscalledbyDOSif: )<};itexecutesaDSKINV(SIOD ;status)orSIOcall."N ;IfdeviceisD5:anditisa#X ;statuscallthestatusisset"b)=} ;toOKandtheroutineexits."l ;IfdeviceisD5:anditisa v ;SIOcallthentheOSROM's ;aredisabledandajum)>}pis# ;madetotheexecutemoduleto ;executethecommand." ;Ifthedeviceisn'tD5:then ;theroutinecontinue)?}swith ;DSKINVorSIOV. ; ;Runtimecodeorigin: ; .ORPAGE6 .TARTSTART ;# ;----------------------)@}-------- ;DSKINVPATCH# ;------------------------------ ; MDSK* ;4 ;CheckifdeviceisD5:> ;H JSRCHKD)A}EVR BEQDODSK\ ;!f ;IfnotcontinuewithDSKINVp ;z JMPDSKINV ;" ;Otherwisesetstatus&return ; DOD)B}SKLDY#OK STYDSTATS RTS ;# ;------------------------------ ;SIOVPATCH# ;------------------------------)C} ; MSIO ;;CheckifdeviceisD5:;JSRCHKDEV$BEQDOSIO.;8;IfnotcontinuewithSIOVB; L)D}JMPSIOVV;"`;Otherwiserunexecutemodulej; tDOSIOSEI~LDA#NMIOFFSTANMIENLDAPORTB STATEMP)E}LDA#RAMONSTAPORTB JSREXEC LDATEMPSTAPORTBCLILDA#NMIONSTANMIEN CPY#0RTS )F};#;------------------------------;RUNTIMESUBROUTINES#(;------------------------------2; <CHKDEVF; P;Ch)G}eckifSIOdeviceisD5:#Z;Returnswithzeroflagsetis d;itis.n;xLDADDEVICCMP#DISKBNECHKDNL)H}DADUNIT CMP#D5 CHKDNRTS;#;------------------------------;ENDOFRUNTIME#;---------------------------)I}---; RTEND;#********************************EXECUTECOMMANDMODULE*#*******************************)J}; ";Thiscode,whichishidden",;beneaththeOS,executesthe6;RAMDiskSIOcommands.@;J.ORRAMLOWT.TA)K}EXSTART^;h;Decodecommandr;|EXECLDADCOMNDCMP#READBEQGETSECCMP#WRITEBEQPUTSECCMP#)L}VERIFYBEQPUTSECCMPSTATUSBEQSETOK;";Nocommandthenreturnerror;LDY#NOCMDBNEERRXIT)M};";-----------------------------;SETSTATUS"&;-----------------------------0;:SETOKLDY#OKDERRXITSTY)N}DSTATSNRTSX;#b;------------------------------l;PUTSECTOR#v;------------------------------; PUTSEC;)O};Calculatesectoraddress; JSRCALC;;Movedataset-up;LDADBUFLOSTAZPAGELDADBUFHI)P}STAZPAGE+1 BNEMOVE ;#;------------------------------ ;GETSECTOR#*;------------------------------4;)Q} >GETSECH;R;Calculatesectoraddress\; fJSRCALCp;z;Movedataset-up;STXZPAGESTYZPAGE+1)R}LDXDBUFLOLDYDBUFHI;!;Movethedata:FROMaddress#;in(ZPAGE),TOaddressinX,Y;MOVESTXZPAGE)S}+2STYZPAGE+3LDY#SECLEN.0LDA(ZPAGE),YSTA(ZPAGE+2),YDEY BPL.0$BMISETOK.;#8;--------)T}----------------------B;CALCULATESECTORADDRESS#L;------------------------------V;`CALCj;t;Firstcheckth)U}ehighbyte~;LDADAUX2CMP#MAXSECBEQDOCALC;";Ifnotthenaillegalsector;SECERRPLAP)V}LALDY#NOSECBNEERRXIT;;Checkifvtocsector; DOCALCLDADAUX1CMP#VSECBNECHKDIR(;#2)W};Ifitissetaddress$return<;FLDX#VTOCPLDY/VTOCZRTSd;n;Checkifdirectorysectorx;CHKDIR)X}CMP#DSECBNECHKDAT;!;Ifso,setaddress&return; LDX#DIR LDY/DIRRTS;!;Checkifsect)Y}ornottoolow;CHKDATCMP#SECLOWBCCSECERR;;Checkifnottoohigh;"CMP#SECHIGH,BCSSECERR)Z}6;@;FindRAMbankJ;TCMP#SECMID ^BCS.0h;r;Calculatelowbank|;SECSBC#SECLOW JSRMU)[}LTLDA/LOWBANK BNE.1;;Calculatehighbank; .0SECSBC#SECMID JSRMULTLDA/HIGHBANK)\};;Addallup&return; .1CLC&ADCZPAGE+10TAY:LDXZPAGEDRTSN;#X;---------------------------)]}---b;MULTIPLY$80#l;------------------------------v;;MultiplyAccuwith$80.;Resultin(ZPAGE).;MU)^}LTSTAZPAGE LDA#0STAZPAGE+1 LDX#7.0ASLZPAGEROLZPAGE+1DEX BNE.0RTS;#;------)_}------------------------ ;ENDOFEXECUTE#;------------------------------ ; *EXEND4;#>***********************)`}********H*ENDOFMDRIVE2.5*#R*******************************\;f.EN; *EXEND4;#>***********************(R?X`OO?000? (c)1983 Action Computer Services  B JKIHi-b}DiELV`L&@ &@ BLV`L@~@l L@ &` Fj`8冨凪`-c} @EӅӥ @`ʆǪƩ Ɛee` @ƦʆǢ &Ɛeǐ @ @L@ @-d}'&&&8儨児祂*L@&&*ń8&&L@ DA`hihiHHȱȱ-e}L@c !#3`L@JJJJ`H @h`Hȩh [@LA d@LA @LA-f} @LA @H8`HhHh HBLA BHI V䅠LA LB &@LAԆ -g}PIPP` BP @LA BLB BLB BLBH- B8塪墨hLB CLB CLB-q}B%DOS SYSB*)DUP SYSB8SGUN ACTBGUNREAD ACTBHANOI BASBHEAPSORTBASBMACROEDTBASBMACROEDTM65BQUIKSORTBASBRAMDISK OBJBU RAMDISK SYNB3aSHOOTER OBJBqSKEET M65BSKEET OBJ BȹP`텠8堨塪 B芨Oȩ-`PP wBP棩 Ѥģ0--r}6000:,80H & &ehe&eģ0ʥ 8堅塅`$ B&*i0:0i BƦ`-s}¢ 护°ڱ%ȱ%E BLID担CS ;BLIDI CLIDH DLID BLID &B-t} V ANLMȑ` MLN%B VLAS:DE:DH 5B DD A 5Bh)0IDDLA[\ZUVT-u}` )EDD` 0ELB #EL}B )ELB) ` 0ELB A` 0d @-v}ҥ `2)2ҩ`p`0)9E`@0)ӈJJJJ)`Ѕ`ȱ`` -w}Fȥ`HhƣĢ`ƥĤ`Ѣ F`ȱѢĦ-x}`膡``ťƤe8夰LF Ƥ8`ŦeѠ-y}e桊LFnS\S7GIGP:LcG A3G\G4[G[G)[G\G)\G5]GW_G([G\GLG-z}[Gi[G\Gi\G[G\GLG\G[GZ[G\GLG\GZ[G8[GZ[G\G\G[G\GL H\G[GGGm_GHGi-{}^G^GIL5H[G.\GLKH^G\G[G @[G\G8]G]G]GLcH]G_]GLrH_]GYGm_GZGi^G^GILH]GLH-|}^G]G @]G3G4G\G[G5G6G]G`LH`5 LH AeHiHHH`P:eLI -}}A IM IIL6IIȌ I IILOII IIL^IIILmII8 III \E IiIi-~}I \E8II I \EIiI I \EId EIIIILIIILIIL=J8III-} EIIdIIL:JIIL JLI E` LRJLJKJMJNJKJLJ0LJ8KJMJKJLJLJMJiMJKJ-}LJLJNJLaJNJ`O0LJJM?mJ?iJJ?mJ?iJ8JJ8J \EJi-}Ji8J LEJiJiJi LE8JJJi LE8JJ8J LE-}LKJͩJLKJ < EJJͧJJLKJJLKJLK E` LKKKKK0LL8KK-}`KK`L%LMȌLLLgOLLLLLLLLLLLL[OLmLLmLmLm-}LiLiL8LLLL8LLiLiLL LLLL!LLLLN?mL?imL-}m L?mL?im!L \E?mL?im!L?mL?imL \E?mL?im-}!L?mL?i8L \E?mL?imLm L?mL?i8!L \E?mL?i8-}L L?mL?i8!L \E?mL?i8!L?mL?i8L \E?mL?i-}8!L?mL?imL \E?mL?i8L L?mL?im!L \ELLLL-}LLLLLLL KiiHHLL KhhŠ0LXOLLLL8LLLLLULLiLL2L`P:ed-} LvO AhO?mlO?irOqOiOnOhOmO8mOqOmOnOrOnOnOmO KnOmO?mlO?irOqOkOpO-}jOoO8oOqOoOpOrOpOpOoO KpOoOnOmOnOmO AmOnOpOoOpOoO AoOpOmOmoOmOnOmpOnOmOqnO-}0LPnOmO OJrOqOLPrOqOrOqO`LP D FLPSharp Shooter, by Mat*RatP (BLP(c) 1989, Analog Co-}mputingP (BLPP (BL%Q!Connect Light Gun first game portQ (BL0QQ/ (BLYQPress for NEXT game orQ: (BLQ!-}type Š key to exit programQc (BxI ILQxI ILQ`LQQͯQLQQQ?QLQQͯQL-}R EQQMQLQQ?QQ?Q?QQ?QLQ`L!RRRLR8R < E8R @ ERR-}LgRRLWR8R P E8R T ERRLRRLRRL&R E E`LRRͿRLAS8R-} ER ERRLSRLR8R ER © ERRL;SRL+SRLR E-} E`:  |9!LsSlSȌkSmSjSiS P D bSdScSfSeShSgS "L H Q^S_S_SLFU]S ]S-}L@U^S? JS\Sn `GxI ILSILbT DL5TSharp Shooter, by Mat*RatT (BLZT(c) 1989, Analog C-}omputingT? (B`LtT\SoSnS I^S?\SoSnS sOaS`S`SaSLTbS R`SaSLTeSfS8-}`SaScSecSdSedSLTgShS RxILT^S? J^S^SL-U^S Q Ei]SLS_SLS H-}oSnSCSIZE;;SKEETS DISTANCEHSCOREH1};;HI BYTE OF SCORERSCOREL;;LO BYTE OF SCORE\ROUND;;ROUND COUNTERfPOINT;;VALUE OF SKEETSpTSHOT;;STAY 1}OF BULLETzAUINDX;;AUDIO REG.X;X;START SET UPX;Q>4BEGIN;;WHEN RESET ISPDOSVIN;;PRESSQ>5BEGIN;;GAME 1}WILLPDOSVIN;;START OVER.X;X; CLEAR MEMORY FOR PLAYER,X; CHARACTER SET, AND SCREENX;Q>$>CLEAR1}PPLAYERS9PPLAYERS9PPLAYERS9$PPLAYERS9.PPLAYERS98PPLAYERS9BPPLAYERS9LPPLAYERS1}9V2` HCLEARjX;tBEGIN%>;;DRAW~CONTSTQCHARDT8;;CHARACTERS >;;ON THE 3;;SCREEN QCHARDT8STORDTPSCR1}5,QSTORDTO>PSTORDTQSTORDTO>PSTORDT7 0 HSTORDT3()>|2 HCONTST<X;F1}X;SET UP SCREENPX;ZSUSQ>LSTd PSDLSTLn Q>LSTx PSDLSTHQ> PNMIENQ>DLI;;SET DLI PINTL Q>1}DLI PINTHQ> PDLIREGQ> PCOLBKX;X; SET UP P/M GRAPHICSX;STARTQ>5PLAYERS PPMBASEQ>X"1} PPCOLP0, PPCOLP26Q>@ PPCOLP3JQ> T PPCOLP1^Q>xh PHPOSP0r PPLX0| PHPOSP1X;X;CLEAR REGISTERSQ>1} PHPOSP2 PPLX2 PHPOSP3 PPLX3 PSHOTSPHIT PSCOREH PSCOREL PTSHOT PROUNDX; CLEAR NUMBERS ON 1}SCREENQ> PDISPF& PDISPG0 PDISPH: PDISPD PDISPN PDISP X PDISP.b PDISP/l PDISP0vX1};X; SET UP SCREEN POINTERSX;Q>> PSDMCTLQ> PGRACTLQ>x PLOCATIONQ>;;SET SKEETSPLOSKEE1;;IN1} THEREPLOSKEE2;;STARTINGQ>;;POSITION PSIZEP0 PSIZEP1  CLRAIM;;CLEAR GUNSIGHTQ>  PSKEE1* PSKEE24$1}>> RESETH RESET2R TSCORE\X;fX; PRINT TITLE IN SKYpX;z$>PRINTQSKESHO9 PSCR92(>  FLCH1}AR !PRINTSKESHO ASKEET SHOOTAX;X; REDEFINE CHARACTER SETX;LCHARQ9 PCHSET9Q9 PCHSET9 1}2 HLCHAR$ Q>5CHSET. PCHBAS8 $>PB CHANCHQCHDATA9L PCHSET9V 0` ICHANCHj X;t X; WAIT FOR (START) KEY~ X;1} CKEYQCONSOL R> HCKEY PHITCRL X; X;CLEAR TITLE X; $> CSCRQCLRSCR9 PSCR9 2 (> FPULL 1} !CSCR CLRSCR A A X;( X; VCOUNT DELAY ROUTINE2 X;< CHKQVCOUNTF R>{P HCHKZ QCDTMF3d HCHK2n  A1}U0x CHK2QVCOUNT R>{ FCHK2 QCHECK R> GDIR FPULL X; X; BEGIN PLAY X; PULL CLRSKE1;;CLEAR SKEET11}  CLRSKE2;;CLEAR SKEET2 Q>r;;SET PLAYERS PHPOSP0;;TO THERE PPLX0;;POSITIONS Q>;;AND WAIT PLOCATION;;FOR TH1}E STICK"  CLRAIM;;TO BE PUSH UP, Q>6 PAUDC1;;CLEAR AUDIO@ X;J #X;WAIT FOR STICK TO BE PUSHED UPT X;^ PULLSh QSTI1}CKr R>| HPULLS Q> PCHECK QRANDOM;;LOAD RANDOM # PSPEED;;FOR SPEED. Q>;;MAKE SLINING PCDTMF3;;SOUND.1} Q> PAUINDX  AU0 Q> PATRACT !DIR!PICKDIR;;RELEASE SKEETS. X; COUQDIS2;;COUNT LENGTH OF R>;;BULLE1}T ON FCLRSHOT;;THE SCREEN& IGOBULL0 X;: X;JOYSTICK CONTROLD X;N TRIGX $TSHOT;;COUNT SHOTS THATb (>;;HAVE BEEN 1}FIREDl ILRMOVE;;IF TWO HAS BEENv QTRIG0;;FIRED THEN YOUR R>;;OUT OF SHELL FFIRE !LRMOVE FIRE!SHOT;;FIRE GUN1} !GOBULL!SHOOT;;DISPLAY BULLET CLRSHOT!ERASE;;CLEAR SHOOT LRMOVE%STICK;;MOVE YOUR $PLX0;;AIM LEFT OR QSTRX8;1};RIGHT R> FSTOHOZ IRIGHT LEFT; (>( DLEFT2 0 0* LEFT2!STOHOZ4 RIGHT;> (>H ESTOHOZR 2\ 2f 1}STOHOZ&PLX0p &HPOSP0z !HMOVE UDMOVE%STICK;;MOVE YOUR AIM QSTRY8;;UP OR DOWN FMAC IMDN GMUP MDN; QL1}OCATION R> EMAC MOVEDN MOVEDN MOVEDN MAC!CHKMUP; QLOCATIONR>$DMAC. MOVEUP8 MOVEUP1}B MOVEUPL MOVEUPV!CHK`MOVEUP,;;MOVE PL0 UPj QDRAWtO>~ PTEMPO $LOCATION %DRAW0LOOPUPQPIC8 1}PPLAYER0923 )TEMPO HLOOPUPQ> PPLAYER09 "LOCATION: X;MOVEDN,;;MOVE PL0 DOWN QDRAW(O>21} PTEMPO< $LOCATIONF %DRAWPQ>Z PPLAYER09d2nLOOPDNQPIC8x PPLAYER0932 )TEMPO HLOOPDN #LOCATION1}:X;HMOVE,;;HOZ. MOVE QDRAWO> PTEMPO $LOCATION %DRAWLOOPHQPIC8 PPLAYER092"3, )TEMPO61} HLOOPH@ FJUMPUPJJUMPUP!UDMOVETX;^X; SHOOT AT THE SKEEThX;rSHOTQ>;;MAKE AUDIO|PCDTMF3;;GUN SHOTQ>1} PAUINDX QCDTMF3 HCONTS AU0 CONTS$TSHOT;;DISPLAY BULLET2;;15 LOOPS ON THE&TSHOT;;SCREENQ> PDIS1}2 #SHOTSSHOOTQPLX0 PHPOSP1, QDRAWO> & PTEMPO0 $LOCATION: %DRAWDBULLETQPIC28N PPLAYER19X2b1}3l )TEMPOv HBULLET "DIS2 !COLLX;!ERASEQDRAW;;ERASE THE BULLETO>  PTEMPO $LOCATION %DRAWQ>1} PDIS2CLRLOPQ> PPLAYER1923  )TEMPO HCLRLOP $SHOTS;;CHANGE SHOT REG.* DISPNUM4 PUTSHOT>!CHK1}HX;RSOUMAKPAUINDX\Q>f PCDTMF3p AU0z:X;X;COLLISIONX;COLLQP1PLM> HCCOLORX;COLL2Q1}P1PL PHITCRLM> HHIT2!CHKX;CCOLORQSKEE1;;SHOT SKEET1R>;;CHECK IF ITICOLL2;;HAS BEEN HIT$#HI1}T;;BEFORE..QSKEE1;;NO!8O>;;CHANGE CHARACTERBPSKEE1;;MAKE SOMELQ>*;;NOISEV SOUMAK;;AND GIVE ME`$HIT;;SOME P1}OINTS.j DISPNUMt PUTHIT~Q> SCSP QPOINT B16 !COLL2X;HIT2QSKEE2;;SHOT SKEET2R>;;SAME AS BE1}FORE IMAC2#HIT QSKEE2O> PSKEE2Q>*  SOUMAK SCSP QPOINT( B162 MAC2!CHK<X;FB16,;;16-B1}IT MATHPOSCOREL;;ADDITIONZPSCOREL;;ROUTINEdQ>n OSCOREHx PSCOREH TSCORE:X;SMALL2$CSIZE;;KEEP TRAC1}K2;;OF SKEET&CSIZE;;DISTANCE(>1 HSKEE2UPMAKE2QSKEE2;;CHANGEO>;;CHARACTER OFPSKEE2;;THE SKEETQ>1} PCSIZEX;X; P/M OF SKEET (2)X;" SKEE2UP,, QSKEE26O>@ PTEMPOJ $LOSKEE2T %SKEE2^0hLOOPSK2QMG81}r PPLAYER39|23 )TEMPO HLOOPSK2Q> PPLAYER39 "LOSKEE2 QLOSKEE2R> FRESET2:X;SMALL1$1}CSIZE;;KEEP TRACK2;;OF DISTANCE&CSIZE;;SKEET1(>1 HSKEE1UP&"MAKE1QSKEE1;;CHANGE CHARACTER0O>: PSKEE1D1}Q>N PCSIZEXX;bX; P/M OF SKEET (1)lX;v SKEE1UP, QSKEE1O> PTEMPO $LOSKEE1 %SKEE10LOOPSK1Q1}MG8 PPLAYER2923 )TEMPO HLOOPSK1Q> PPLAYER29  "LOSKEE1 QLOSKEE1 R>* FRESET4:>X;H$X; RES1}ET REGISTERS & COUNT ROUNDSRX;\RESET2 CLRSKE2f #ROUNDp #CHECKz QRANDOM PDIRECT2 SIDE2O> PHPOSP3 1}PPLX3Q> PLOSKEE2Q> PSKEE2Q> PTSHOT PAUDF1 PAUDC1 PCDTMV3 $ROUND(>$ FADDUP. DIS1}PNUM8 PUTRODB PHITCRLL:VX;`X; RESET SKEET1 REGISTERSjX;tRESET CLRSKE1~ #CHECK QRANDOM PDIRECT SI1}DE1 PHPOSP2 PPLX2Q> PLOSKEE1Q> PSKEE1 PHITCRL:X;ADDUPQ>;;AT END OF GAME  B16;;GIVE 5 1}POINTS$SHOTS;;FOR EVER BULLET2;;THAT IS LEFT.( &SHOTS2(><< FGAMEF !ADDUPPX;ZGAME$>;;DISPLAY ONdOVER1}QEND9;;THE SCREENnPSCR9;;GAME OVERx2(> FJAM !OVERX;JAMQCONSOL;;WAIT FORR>;;START KEY TOF1}AGAIN;;BEGIN. Q>;;PHPOSP2;;GET PLAYERS 1,2PHPOSP3;;OUT OF THE !JAM;;WAYX;AGAIN CLRAIM !STARTX;1}END AGAME OVERA"X;,SIDE1QDIRECT;;SKEET ONE6!SIDE;;DIRECTION@SIDE2QDIRECT2;;SKEET TWOJSIDER>U;;DIRECTIONT1} GLSIDE^R>h GMIDDLEr IRSIDE|RE:RSIDEQ>2;;LEFT SIDE!REMIDDLEQ>v;;MIDDLE!RELSIDEQ>;;RIGHT S1}IDE!RESKEEU2 SMALL1;;MOVE SKEET1QSPEED;;UP;R>2 DPICK2 SMALL1 QSPEED;R> DPICK2& SM1}ALL10 !PICK2: SKEE2U2 SMALL2;;MOVE SKEET2D;;;UPN QLOCATIONXR>b EPASTl MOVEDN;;GRAVITYvPASTQSPEED;1}R>2 DGOUP SMALL2 QSPEED;R> DGOUP SMALL2X; GOUP!COUX;#X;MAKE 16-BIT AUDIO WITH SUSTAIN1}X; AU0$AUINDX QSOUND19  PAUDF1*24 QSOUND19> PAUDC1H2R QSOUND19\ PCDTMV3f2p &AUINDXzQ> PCDTMF1}3:X;!PICKDIRQDIRECT;;MOVE IN WHATR>U;;DIRECTIONGSLEFT;;SKEET1R> GSKEEU2 ISRIGHT"PICK2QDIRECT1}2;;MOVE DIRECTIONR>U;;SKEET2 GS2LEFTR> GSKEE2U2 IS2RIGHT!COU$SLEFT$PLX2;;MOVE SKEET1. 0;;LEFT8 &1}PLX2B &HPOSP2L !SKEEU2VSRIGHT$PLX2;;MOVE SKEET1` 2;;RIGHTj &PLX2t &HPOSP2~ !SKEEU2S2LEFT$PLX3;;MOVE SKEET1}2 0;;LEFT &HPOSP3 &PLX3 !SKEE2U2S2RIGHT$PLX3;;MOVE SKEET2 2;;RIGHT &HPOSP3 &PLX3 !SKEE2U2 CLRSK1}E1QSKEE1;;CLEAR SKEET1O> PTEMPO  $LOSKEE1 %SKEE1BLANK1Q>( PPLAYER2922<3F )TEMPOP HBLANK1Z:d 1}CLRSKE2QSKEE2;;CLEAR SKEET2nO>x PTEMPO $LOSKEE2 %SKEE2BLANK2Q> PPLAYER3923 )TEMPO HBLANK21}:CLRAIM$>;;CLEAR AIMQ> CLRLOOP2 PPLAYER09 PPLAYER19(> HCLRLOOP" MOVEUP,:6DISPNUM%>;;D1}ISPLAY NUMBER@A;;ON THE SCREENJ;T L01S>d^DL02h3r>|EL01L02,CO> PHUNDRED%>A; L03S1}> DL043>EL03L04, C O> PTEN& A0 O>: PONED :N X;X TSCOREQSCOREL;;PRINT SCOREb PFRO;;ON1} SCREENl QSCOREHv PFRO  IFP FASC %> S01Q@INBUFF7 GS02 3 HS01 S02M> $> S03; S> 1} PDISP9 (>!FS05 !0!1 !)>*!FS044! Q@INBUFF7>!,H!DS03R!S043\!Q>0f!HS03p!S05:z!PUTHITQHUNDRED;1};PUT # OF!PDISP.;;HITS ON!QTEN;;SCREEN! PDISP/!QONE! PDISP0!:!PUTSHOTQHUNDRED;;PUT # OF!PDISP;1};SHOTS ON!QTEN;;SCREEN! PDISP!QONE! PDISP !:"PUTRODQHUNDRED;;PUT # OF"PDISPF;;ROUNDS"QTEN;;ON SC1}REEN$" PDISPG."QONE8" PDISPHB":L"SCSPQSPEED;;SET VALUE OFV" ;;;SKEETS`"R>;;DEPENDING ONj"ESC50;;SPEEDt";~"1}R>2" ESC25"SC10Q> ;;GIVE 10 FOR SLOW" PPOINT":"SC25Q>;;GIVE 25 FOR MED." PPOINT":"SC50Q>2;;GIVE 50 FO1}R FAST" PPOINT":"X;" X; DATA FOR NEW CHARACTER SET#X; #CHDATA 8=x===# ==# =======1}(# =|= = =|2# `=`=|<# ===|= =|= =|F# =====6=>=P# <====Z# ==D% RDLIREGN%HA1X%Q>b% PDLIREGl%A17v%>%7%9%X;%X;COLOR TAB2}LE FOR SKY%X;%TABLE ====% ====% ===r=b=R%! B=========% ===2}=%X;%X;DATA FOR AUDIO SOUNDS%X;&SOUND1 == & ==& == & == *&  == 4& ==>& 2}==H& ==R& ==\& ==f& (=-=p& (=*=z& (=$=& ==&SOUND2  == &  ==& 2}==& ==& ==&X;&X;DATA FOR SCREEN&X;&CHARDT =====& ===== =& ==2 }== &! =="= ======'! ========$= ' +==='! == =======$'! 2 }&= =Q======"=.' ====(= ===8' 3==(==/B' =4==3=====L' 3==#==/2 }==2==%V' == ===(==)=`' 4==3====j' =2==/==5==.=t' $=== =~'X;'X;D2 }ISPLAY LIST'X;'LST ===¦' SCR=SCR' ====' ====' ===' ==' =2 }====' ====A' LST'X;(X;SCREEN DISPLAY (X;(' ====' ===' ==' =0IHPE H @ABCDEFGPȹP`HPHiPHQHiQHh|ک0P1ԩOHЩ@6}X xЍHЩЍHЍHHHHHHH.d/d0dcccddd>/ЩxHЍ H HЍ N6}HH L UL MN4I` L&I3+%%43(//4@@@PN@ТxI` -LjI {*6} eM {H0@ M MrЍHH NҭxH ҍH*H eMMLM HHLJLJLJLKxH6}-O 8(L&J8̰HLJx=O08H԰ J J JLI8H fJ fJ fJ fJLI Hi HH HʹMOD HD6}H` Hi HH HDMOD HH` Hi HH HMOD HL/J*H* eMHH HHH Hi HH6} HOE H HLSK Hi HH H HE HH N NLIH* eM` ) Ѝ)1LIHHHiH* GKH 6}N N NH KLZKHHHiH* GK NH KLImHHmHH MN`HH1 HiHHHi H HHʹZOG H6}G H HF`HH1 HiHHHi H HHʹZOF HF H HD` MHH ҍH MiЍHЍ HH6}HҍҍH- N N` MH ҍH LЍHЍ HH` KHH<LLL` LL ЍLL NLH'!-%6}/6%2HLMHU0ɪ0`2LMvLMLM LH82f LH8ɠ[ LLM K8H԰ JH82 KH8ɠ KLIHOO6}OH*`HU0ɪ0HU0#ɪ0*LIHʎHL"MHHL"MHʎЎHL>MHЎHL>MHi H HHF H`6}Hi H HHG H`DE fJ`8dȪiH8 ȪiHiH`HԭH ؠ0)8 d6}ʈȩ0`HdHdHd`HcHcHc`H.dH/dH0d`H8ɠ82 H`H`2H`8x6}| |``|| | |6><<8lllll88lll86U8|0x p p6}A" P@ |||||||HHHOH ԍЍЩHHhh@²rbRB 6} (-(*($   " $ + & Q"( 3(/436}3#/2% ()432/5.$ `APH & Q"( 3(/434V