@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`  `8  ɐ     `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.D8:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDHI%} VY8 B V  @  /DE `E:D8: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 g} 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 ALLOWED MULTCOPYM65 186 COPYING---D1:MULTCOPY.M65l# 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- 144ɛ+,' 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 D8uZEHX;X; =========================X;X; MULTICOPY 2.0X;$X; (C) 1986.X; by Charles F. Johnson anT}d8X; Little Green FootballsBX;LX; Last revision: 03/29/86VX;`X; =========================jX;tX;~X; ----------U}--------------X; Operating system equatesX; ------------------------X; BOOT?  DOSVEC  DOSINI  RTCLV}OK LMARGNR ROWCRST COLCRSU SAVMSCX OLDCHR] RAMTOPj SDLSTL0SDLSTH1COLDSTDW}(STICK0x2STRIG0<COLOR0FCOLOR1PCOLOR2ZCOLOR3dCOLOR4nCRSINHx CH X}ICCOMB ICSTAC ICBALD ICBAHE ICBLLH ICBLHI ICAX1JCOLPF0COLPF2COLPFY}3CONSOL AUDF1 AUDC1 SKCTLDLISTLDLISTH" CIOVV,X;6X; ----------------Z}----@X; IOCB command equatesJX; --------------------TX;^ OPENh CLOSE r GETREC| GETCHR PUTREC [} PUTCHR X;X; -------------------X; Page zero variablesX; -------------------X; SRC DST RCNT\} WCNT NUM FLAG OPN PAGE COUNT& POS0 STHOLD: KBHOLDD TEMPN MULT]}X PCNTb TOPl ADDRv FLEN DIRSCR PNTR1 PNTR2X;X; Screen memoryX;SCREEN1BEG^}INSCREEN2SCREEN1X;X; ------------------------X; SYSTEM RESET will vectorX; through hereX; ----------_}--------------X; %X;  RESET* ;;DOS init4 RESET2>Q>4OPTIONS;;Make OS runHPDOSVEC;;MULTICOPYRQ>5OP`}TIONS;;instead of\PDOSVEC;;DOSf:pX;zX; -------------X; Option screenX; -------------X; OPTIONSQ>a};;Clear choice$>?;;arrayCLCH PCHOICE90 ICLCHX;PCOLDST;;No coldstart PPCNT PPCNT Q>;;Turnb} off cursor PCRSINH$ PBOOT?.  CLSCRN;;Clear screen8  SETSC1;;Set page 1B  SETDL;;Colors & D.L.L X;V PROPT` Q>c};;Print optionsj PCOLCRSt Q>~ PROWCRS Q>5OPTLEN PICBLH Q>4OPTLEN $>4OPTMSG %>5OPTMSG PRINT0 &ICd}BLH X; GET1 Q>;;Clear keypress PCH GETOPT QSTRIG0;;Button pressed? HG1.2;;No, skip !CONT2;;Yes, contie}nue G1.2( QCH2 R>;;Key pressed?< FGETOPT;;No, go backF R> ;;Is it RETURN?P HG1.3;;No, skipZ !CONT2;;Yes, contf}inued G1.3n $>x GET2 RDIRKEY9;;Is it 1,2,3,4? HG2.1;;No, skip QDIRASC9;;Get ASC value HG2.2;;Skip G2.1g} 0;;Count down IGET2;;Do more GGET3;;No match, skip G2.2  DIREC;;Show directory  SETSC1;;Reset screen HGETh}1;;Go back GET3 R>>;;Is it "S"? HGET4;;No, skip #SRC;;SRC=SRC+1" QSRC;;If SRC is >3,, R>;;set to zero6 HG3i}.2@ Q>J G3.2T PSRC^ ,;;Add value forh O>;;screen coder PSM1;;Set all source| PSM2;;numbers in PSM3;;messagej} lines PSM4 PSM5 PSM6 ; S> PSM7 HGOGET1;;Skip to JMP GET4 R>:;;Is it "D"? HGET5;;No, skip #Dk}ST;;DST=DST+1 QDST;;If DST is >3, R>;;set to zero HG4.2 Q>& G4.20 PDST: ,D O>N PDM1;;Set all destX Pl}DM2;;numbers inb PDM3;;message linesl PDM5v O>@ PDM6 ; S> PDM7 HGOGET1;;Skip to JMP GET5 R>;;Is m}it CTRL-ESC? HGET6;;No, skip Q>;;Cancel key PCH $> RESDOS QDVSAVE9;;Restore DOS PDOSVEC9;;vectors 0n} IRESDOS !@DOSVEC:;;Go to DOS* X;4 GET6> $>H G6.2R RCOLKEY9;;Is it one of\ FG6.3;;the colorf 0;;changingo} keys?p HG6.2z FGOGET1;;No match, skip G6.3 (>;;If 3, make it 4 HG6.4 2 G6.4 #COLOR09;;Change color #p}COLOR09;;register #COLSAV9 #COLSAV9 GOGET1 !GET1;;Back to the top X; CONT2QSTRIG0;;Wait until keyFCq}ONT2;;or button isQSKCTL;;released$R>. FCONT28X;BX; -----------------LX; Display filenamesVX; -------------r}----`X;jQ>;;Cancel keypresstPCH~QSRC;;Set directory,;;filenameO>1PDIRNAMQ>PCOUNT;;Clear fis}lecountPPAGE;;& page index CLSCRN;;Clear screenQ>;;Set printingPCOLCRS;;column & rowQ> PROWCRSQSt}RC;;SRC=DST?RDST HDISPLAY;;No, skipQ>4SLINE4;;Yes, prompt PLINEAD( Q>5SLINE42PLINEAD< BUTRETF DISPu}LAYPQ>4FNBUF;;Set pointer toZPPNTR1;;filename bufferd Q>5FNBUFn PPNTR1xX; OPDIR;;Open directoryX; REv}ADNAMES$>;;Read names fromQ>GETREC;;the source disk PICCOM9 Q>4FNAME PICBAL9 Q>5FNAME PICBAH9Q>w} PICBLL9 CIOVX;%> CKDOS"QFNAME8;;Is this file,RDOSNAM8;;DOS.SYS?6HCKFRE;;No, skip@3J)> T Hx}CKDOS^FREADNAMES;;Yes, ignorehX;r CKFRE|$>QFNAME9;;Is this "FREER> S;;SECTORS"?HCKF2;;No, skip!SELy}ECT;;Yes, continueCKF2#COUNT;;Count files$PAGE;;Also count the#PCNT9;;# per page%>  TRANSFERQFNAMEz}8;;Move thisP@PNTR17;;name to the1;;filename buffer ITRANSFERX;,;;Increment the&QPNTR1;;pointer to the0{}O> ;;filename buffer: PPNTR1DDTR2N #PNTR1XTR2b QCOUNTlR>;;Done 1 column?vHTR3;;No, skipQ>;;Prin|}t name$>4FNAME%>5FNAME PRINT0X;Q>;;Set to top ofPLMARGN;;second column PCOLCRSQ> PRO}}WCRS!READNAMES;;Do the restX;TR3R>0;;Done 2 columns? HTR4;;No, skipQ> $>4FNAME;;Print name*%>5~}FNAME4 PRINT0>X;H#PAGE;;Set page indexRQ>4SCREEN2\PSAVMSC;;Set screen tofPSCRNAD;;2nd pagepQ>5SCREEN2}zPSAVMSCPSCRNADQ>;;Set position toPLMARGN;;top left PCOLCRSQ> PROWCRS!READNAMES;;Do the }restX;TR4$>;;Print filenames Q>PUTREC PICCOMQ>4FNAME PICBALQ>5FNAME PICBAH$Q>. PI}CBLL8 CIOVB!READNAMES;;Do the restLX;VX; --------------------`X; Select files to copyjX; --------------------t}X;~ SELECT$>;;Close ch 1 Q>CLOSE PICCOM9 CIOVQ>;;Set margin PLMARGNQCOUNT;;More thanR>1;;48} names?DSEL2;;No, skipQ>4PAGLIN;;Set page$>5PAGLIN;;message HSEL3SEL2 Q>4SLINE2;;No page$>5SLINE2;;}messageSEL3( PLINEAD2&LINEAD<Q>4SCREEN1FPSCRNAD;;Set screen toPPSAVMSC;;page 1ZQ>5SCREEN1dPSCRNAD}nPSAVMSCxQ>PPAGE;;Set page indexPPOS;;& screen pos PRNT1$>&ROWCRS;;Print pointer2;;at top }name &COLCRSQ>  $>4POINTR %>5POINTR PRINT0S1Q>;;Clear keypressPCHX; SLOOP"QSTRIG0;;But}ton pressed?,FCHOSEN;;Yes, skip6QCH@R> ;;RETURN pressed?JHS2;;No, skipT CHOSEN^QSTRIG0;;Wait until keyhFC}HOSEN;;or button isrQSKCTL;;released|R> FCHOSENX; INVNAM;;Register choice,;;Force branchDS1;;Go back}X;S2 QCONSOLR>;;START pressed?HS3;;No, skip!PRECOPY;;Yes, continueS3QCH;;Get keyR>;;Is it }ESC?HS4;;No, skip!OPTIONS;;Restart&S40QSTICK0;;Get stick:PSTHOLD;;Save itDR>;;Center?NHINPUT;;No, ski}pXQCH;;Get keybPKBHOLD;;Save itlR>;;If arrows orvFINPUT;;space bar,R>;;go ahead FINPUTR> FINPUT}R> FINPUTR>!HSLOOP;;Not legal keyX; INPUT SETPOSQ> ;;Erase old$>4BLANK;;pointer %>5BLANK } PRINT0X; QKBHOLD;;Get key*R>!;;Is it SPACE?4HNOTSPC;;No, skip>QCOUNT;;Get file countHR>1;;More than 48?}RDNOTSPC;;No, skip\QPAGE;;Toggle pagefN>;;indexp PPAGEzQ>;;Set position toPPOS;;zero $PAGEQSCLO9;;}Flip screen PSAVMSC PSCRNAD QSCHI9PSAVMSCPSCRNAD!PRNT1;;Back to the topX; NOTSPCQSTHOLD;};Get stickR> ;;Down?FINPOS;;Yes, skipQKBHOLD;;Get keyR>;;Down arrow?$HCKUP;;No, skip. INPOS8#POS;;PO}S=POS+1BCKUPLQSTHOLD;;Get stickV R>;;Up?`FDEPOS;;Yes, skipjQKBHOLD;;Get keytR>;;Up arrow?~HCKRT;;No, sk}ip DEPOS"POS;;POS=POS-1CKRTQSTHOLD;;Get stickR>;;Right?FADD24;;Yes, skipQKBHOLD;;Get keyR>;;}Right arrow?HCKLT;;No, skip ADD24QPOS;;Is POS already R>;;>23?ECKLT;;Yes, skip ,O>;;Add 24$PAGE};;More than the(RPCNT9;;# of filenames?2ECKLT;;Yes, skip<PPOS;;Set positionFCKLTPQSTHOLD;;Get stickZR> ;;Le}ft?dFSUB24;;Yes, skipnQKBHOLD;;Get keyxR>;;Left arrow?HCKLIM;;No, skip SUB24QPOS;;Is POS already R>;};<24?DCKLIM;;Yes, skip;S>;;Subtract 24R>;;Less than zero?DCKLIM;;Yes, skipPPOS;;Set position CKLI}M $PAGEQPOS;;Is POS <0?ICKL2;;No, skipQPCNT9;;Set to last;;;name on page"S>,PPOS6CKL2@QPOS;;Is} POS > lastJRPCNT9;;name on page?TDPRPNT;;No, skip^Q>;;Set to zerohPPOSr PRPNT| SETPOS;;Set positionQ> };;Print pointer $>4POINTR %>5POINTR PRINT0QSTHOLD;;Get stickR>;;Center?FGOS1;;Yes, skipQ>;;Wait f}or 5/60 ,;;secondORTCLOK DELAYRRTCLOK HDELAYGOS1!S1;;Back to the topX;&X; -------------0}X; Start copying:X; -------------DX;N PRECOPYXQCONSOL;;Wait til STARTbR>;;is releasedl FPRECOPYvX; CNVCH}C;;Convert CHOICEQNUM;;Files to copy?HPRE2;;Yes, skip!FINISH;;No, exitPRE2Q>4COPYDL;;Install copyPSDL}STL;;screen displayPDLISTL;;list Q>5COPYDL PSDLSTH PDLISTH$> PRE2.1QCOLOR09;;Save colors  PCOLSAV9}QCPYCOL9;;Set message PCOLOR09;;colors* PCOLPF0940> IPRE2.1HQ>;;Clear readRPRCNT;;counter & write\PWCN}T;;counterfPFLAG;;Clear flagspPOPNzPTOPQRAMTOP;;Find end of;;;data bufferS> PTOP CLOOP1Q>4B}UFFER;;Find startPADDR;;of data buffer Q>5BUFFER PADDRQSRCRDST;;SRC=DST?HC2;;No, skip SPROMT;;Sh}ow promptC2Q>4CLIN;;Set top line PTOPLIN$ Q>5CLIN.PTOPLIN8$>BC2.1LQRDMSG9;;Print READINGV PRWL}INE9`0j IC2.1tQ>;;Set character~PCOLOR3;;colorsPCOLPF3;;(also setQ> ;;hardware regsPCOLOR2;;cuz I/O ca}nPCOLPF2;;delay change)X;C3$RCNT;;Save start addrQADDR;;of file PADLO9 QADDR PADHI9;QTO}P;;Calculate free SADDR;;memory & usePFLEN;;as file length QTOP( SADDR2 PFLEN<HC4;;Not zero, skipF}!WRITE1;;Go writePC4ZQFLAG;;File open?dFC5;;No, skipn$>xC4.1QN1HOLD9;;Display open;;;filenameS> } PNAMLIN90 IC4.1 !DOREADX;C5 CLN2;;Clear name$RCNT;;Find name & FINDNM;;convert itQSRC;;Pr}int name PRNAMEX;$>;;Open file for"Q>OPEN;;input, PICCOM96 Q>4DNUM@ PICBAL9J Q>5DNUMT PICBAH9^Q>}h PICAX19r CIOV|X; DOREAD$>;;Read data intoQ>;;buffer PICCOM9 QADDR PICBAL9 QADDR PICBA}H9 QFLEN PICBLL9 QFLEN PICBLH9 CIOV X; %RCNT QICBLL9;;Save length of& PLLO8;;data in table0 QI}CBLH9: PLHI8D QICSTA9;;Get statusN R>;;End of file?X FRD2;;Yes, skipb Q>;;No, set flagl PFLAG;;and save namev }%> SVN1 QDNUM8;;Save filename PN1HOLD8 1 ISVN1 !WRITE1;;Go write X; RD2 $>;;Close file Q>CLOSE} PICCOM9 CIOV Q>;;Clear flag! PFLAG ! $RCNT!, !QADDR;;Calculate*!OLLO9;;buffer address4!PADDR;;for next} file>! QADDRH! OLHI9R! PADDR\!#RCNT;;RCNT=RCNT+1f! QRCNTp!RNUM;;All files read?z!EWRITE1;;Yes, skip!!C3;;}Read more!X;! WRITE1!QSRC!RDST;;SRC=DST?!HW2;;No, skip! DPROMT;;Show prompt!W2!Q>4CLIN;;Set top line! }PTOPLIN! Q>5CLIN!PTOPLIN!$>"WRLP"QWRMSG9;;Print WRITING" PRWLINE9$"0." IWRLP8"Q>;;Set characterB"P}COLOR2;;colorsL" PCOLPF2V"Q> `" PCOLOR3j" PCOLPF3t"X;~"QOPN;;File open?"FW3;;No, skip"$>"W2.1"QN2HOLD9;};Display open";;;filename"S> " PNAMLIN9"0" IW2.1"!DOWRIT;;Skip ahead"X;"W3# CLN2;;Clear name #$WCNT;;}Find name and# FINDNM;;convert it#QDST(# PRNAME;;Print name2#X;<#$> ;;Open file forF#Q>OPEN;;outputP# PICCOM9Z#} Q>4DNUMd# PICBAL9n# Q>5DNUMx# PICBAH9#Q># PICAX19# CIOV#Q>;;Set flag#POPN#X;# DOWRIT#$> ;;Write d}ata from#Q>PUTCHR;;buffer# PICCOM9#%WCNT;;Get write count#QADLO8;;Get address of#PICBAL9;;data from table$ QA}DHI8$ PICBAH9$QLLO8;;Get length of"$PICBLL9;;data from table,$ QLHI86$ PICBLH9@$ CIOVJ$X;T$QWCNT;;Written all^$}RRCNT;;that were read?h$HW7;;No, skipr$QFLAG;;Partial read?|$FW7;;No, skip$%>$SVN2$QDNUM8;;Save name$ PN2}HOLD8$1$ ISVN2$!CLOOP1;;Back to the top$X;$W7$$> ;;Close file$ Q>CLOSE$ PICCOM9$ CIOV%Q>;;Clear fla}g%POPN%#WCNT;;WCNT=WCNT+1&%QWCNT;;Written all0%RRCNT;;that were read?:%DJW3;;No, skipD%QFLAG;;Partial read?N%F}W8;;No, skipX%JW3b%!W3;;Write morel%W8v%QWCNT;;Done copying?%RNUM%EFINISH;;Yes, exit%!CLOOP1;;No, do the re}st%X;% FINISH% CLSCRN;;Clear screen%Q>4SCREEN1;;Reset screen%PSCRNAD;;and display%PSAVMSC;;FINISHED msg%Q>5}SCREEN1%PSCRNAD%PSAVMSC% Q>4FINLIN& PLINEAD & Q>5FINLIN&PLINEAD & SETDL*&X;4&Q>>& PCOLCRSH&Q>}R& PROWCRS\&Q>!f&$>4RETMSG;;Print promptp& %>5RETMSGz& PRINT0& BUTRET;;Wait&!OPTIONS;;Restart&X;&X; -----}------&X; SUBROUTINES&X; -----------&X;& CLSCRN&Q>4SCREEN1& PPNTR1&Q>5SCREEN1& PPNTR1&$>;;Clear the}'%>;;screen area'C;;(8 pages)'CLS2$' P@PNTR17.'38' HCLS2B' #PNTR1L'0V' HCLS2`' POLDCHRj':t'X;~' SETPOS'}$>;;Set the cursor'QPOS;;position'R>;;Less than 24?'DSETP2;;Yes, skip',' A;;21 + 1'O>;;Set to 2nd col'>};;Set column' SETP2' &COLCRS'QPOS;;Get position'R>;;> 1st column?(DSETP3;;No, skip (;(S>( SETP3((PROWC}RS;;Set row2(:<(X;F( PRINT0P(PICBLL;;Print to E:Z(&ICBAL;;A=String lengthd('ICBAH;;X=Lo addressn(Q>PUTCHR;;Y=Hi ad}dressx( PICCOM($>( !CIOV(X;( SETSC1(Q>4SLINE1;;Set OPTIONS(PLINEAD;;screen (top(Q>5SLINE1;;line and main}(PLINEAD;;screen area)(Q>4SCREEN1( PSAVMSC( PSCRNAD(Q>5SCREEN1(PSAVMSC)PSCRNAD):)X;") SETDL,)}$>6)SDL2@)QCOLSAV9;;Set screenJ)PCOLOR09;;colorsT)0^) ISDL2h)Q>4DLIST;;Install ourr)PSDLSTL;;display list|) Q>}5DLIST) PSDLSTH):)X;) OPDIR)$>;;Open IOCB #1)Q>CLOSE;;for a directory)PICCOM9;;read) CIOV) Q>OPEN) P}ICCOM9) Q>4DIRNAM) PICBAL9) Q>5DIRNAM* PICBAH9*Q>* PICAX19&* !CIOV0*X;:* DIRECD*PDIRNAM;;Store drv #N*},;;Convert toX*O>`;;screen codeb*PDIRNUM1;;Display drv #l* PDIRNUM2v*QDIRSCR;;Flip to*PSAVMSC;;directory screen*}PSCRNAD;;(original E:*QDIRSCR;;screen address)*PSAVMSC*PSCRNAD*Q>4DIRLIN1;;Set top line* PLINEAD*Q>}5DIRLIN1*PLINEAD*Q>;;Clear the screen* $>4CLEAR* %>5CLEAR* PRINT0+ OPDIR;;Open directory +$>;;Set up }to input+Q>GETREC;;filenames from +PICCOM9;;IOCB #1 and*+Q>PUTREC;;print them to4+PICCOM;;IOCB #0 (E:)>+ Q>4FNAMEH+} PICBAL9R+ PICBAL\+ Q>5FNAMEf+ PICBAH9p+ PICBAHz+Q>+ PICBLL9+ PICBLL+Q>;;Set to top of+PROWCRS;;screen+ }NLOOP+QSKCTL;;Key pressed?+R>+FNL2;;No, skip ahead+QSTRIG0;;Trigger?+HNL3;;No, skip+NL2+ DW2;;Wait for }release+NL3,$>;;IOCB #1, CIOV;;Get filename,GCDIR;;End, skip$,Q> ;;Set position., PCOLCRS8,$>;;IOCB #0B, }CIOV;;Print nameL,INLOOP;;Always branchV,CDIR`,Q>CLOSE;;Close dirj, PICCOM9t, CIOV~,Q>4DIRLIN2;;Print,PLINEAD;};prompt message,Q>5DIRLIN2;;on top line,PLINEAD, DWAIT,QSKCTL;;Wait for key,R>;;or trigger,HDW2;;press,} QSTRIG0, HDWAIT,DW2,QSKCTL;;Wait for,R>;;release-FDW2 - QSTRIG0-FDW2-:(-X;2-CLN2<-$> ;;Clear name}F-Q> ;;storage area toP- CLN2.2Z-PN29;;spacesd-0n- ICLN2.2x-:-X;- PRNAME-,;;Store drive #-O>1- PDNUM-}$>- PRNAM2-QDNUM9;;Print filename-;;;being copied-S> ;;directly to-PNAMLIN9;;screen memory-0- IPRNAM2.:}.X;. SPROMT".Q>4SRCLIN;;Set for,.$>5SRCLIN;;source prompt6.HPROMP2;;Skip ahead@. DPROMTJ.Q>4DSTLIN;;Set forT.$>5}DSTLIN;;dest prompt^. PROMP2h.PTOPLIN;;Show promptr.&TOPLIN|.$>. PROMP3.QRBMSG9;;Now prompt.PNAMLIN9;;for} RETURN.0;;or button. IPROMP3. BUTRET.Q>;;Clear key.PCH;;buffer.BR2.QSTRIG0;;Get trigger.FBR3;;Pressed,} skip.QCH;;Get key.R> ;;RETURN?/HBR2;;No, go back/BR3/QSTRIG0;;Wait til&/FBR3;;trigger or key0/QSKCTL;;is }released:/R>D/FBR3N/Q>X/PCHb/:l/X;v/ INVNAM/QPOS;;Current position/R>;;2nd column?/DINV2;;No, skip/S}>/INV2/PTEMP;;Multiply the/Q>(;;current row/PMULT;;by 40 to get/Q>;;the offset/PPNTR1;;into screen/}%>;;memory/INV3/T?0 UPNTR1 0 TMULT0 DINV4 0,*0 OTEMP40 DINV4>0 #PNTR1H0INV4R01\0 HINV3f0,p0O>z0} DINV50 #PNTR10INV50PPNTR1;;Set offset0QPOS;;to screen area0R>;;If in 2nd0DINV6;;column, adjust0,;;th}e pointer0 QPNTR10O>0 PPNTR10 DINV60 #PNTR10INV61,1$PAGE;;Get page index1QPNTR1;;Add the address$1}OSCLO9;;of the start of.1PPNTR1;;the current81QPNTR1;;page to screenB1OSCHI9;;pointerL1 PPNTR1V1%> ;;11 chara}cters`1 INVLOOPj1Q@PNTR17;;Get chart1N>;;Invert it~1P@PNTR17;;Put it back11;;Count 'em1IINVLOOP;;More to do1Q}PAGE;;Get current pg1FINV7;;Skip if page 11Q>0;;Add 481INV71,1OPOS1>;;Use for index1QCHOICE9;;Get choice f}lag1N>;;Toggle bit 01PCHOICE9;;Put it back2Q>x 2 PTEMP2Q>2 PAUDC1(2 SOUND22QTEMP;;Make a sound<2PAUDF1;};to registerF2;;;the choiceP2S>Z2 PTEMPd2 GSND2n2Q>x2,2ORTCLOK2 SNDWAIT2RRTCLOK2 HSNDWAIT2 FSOUND}2SND22:2X;2 CNVCHC2$>2&NUM2CNV22A;;This section3?;;converts the3QCHOICE8;;choice array3FCNV3;;to} sequential"3%NUM;;form, and also,3#NUM;;counts the63A;;chosen files@3 PCHOICE8J3CNV3T32^3(>@h3 HCNV2r3:|3X;3}X; This routine finds the3X; name of the file being3X; operated on, and converts3 X; it to DOS filename format.3X; (Dn}:FILENAME.EXT)3X; Enter with X set to3X; current file index.3X;3 FINDNM3Q>;;Clear TEMP3 PTEMP3QCHOICE9;;Mult}iply by 113,4 T?;;*24 UTEMP4 T?;;*4&4 UTEMP04,:4OCHOICE9;;*5D4 DFIND2N4 #TEMPX4 FIND2b4,l4 T?;;*10v4 UTEMP4,}4OCHOICE9;;*114 DFIND34 #TEMP4 FIND34,;;Add start of4O>4FNBUF;;filename array4PPNTR2;;and set pointer4 QTE}MP4 O>5FNBUF4 PPNTR24%> ;;11 characters4 FIND45Q@PNTR27;;Move name 5PN18;;to buffer51 5 IFIND4*5NAME45}$>>5 &TEMPH5NM2R5A;;Search name\5?;;field forf5QN18;;space characterp5R> z5FPERIOD;;Got space, skip5%TEMP;;St}ore char in5PN28;;name area5#TEMP;;Count up525(>;;Done 8?5HNM2;;No, more to do5 PERIOD5%TEMP;;Get index a}nd5Q> .;;store period5PN285#TEMP;;Inc index5$>5NM36 A;;Search6?;;extension field6QN18;;for space char$6}R> .6FNM4;;Got space, skip86 %TEMPB6PN28;;Store charsL6 #TEMPV62`6(> ;;At end of name?j6HNM3;;No, go backt6NM4~}6(>;;If no extension6HNM5;;erase the6"TEMP;;period6 %TEMP6Q> 6PN286NM56:6X;6"X; Data, tables, messag}es, etc.6X;6 DLIST6 p=p= 7 B 7 LINEAD7 SLINE17 (7 B27 SCRNAD<7 SCREEN1F7 ===P7 ===}Z7 ===d7 ===n7 ===x7 ==7 A7 DLIST7X;7 COPYDL7 p=p=p=p7 G7 TOPLIN7 C}LIN7 p=0=G7 NAMLIN7 A7 COPYDL7X;8 SLINE18 AӽA8SM1"8 AĽA,8DM168 Aί}A@8 SLINE2J8 AӽAT8SM2^8 AĽAh8DM2r8 AýԽA|8 FINLIN8 AӽA8}SM38 AĽA8DM38 AA8 CPYLIN8 AġA8 SLINE48 AŠA8SM48 A}ԯA8 PAGLIN8 AӽA9SM59 AĽA9DM5&9 AýýA+9 AԽA09X;:9 DIRLIN1D}9 A٠AN9 DIRNUM1X9 AA]9 A堠Ab9 DIRLIN2l9 A٠Av9 DIRNUM29 A}A9 A堠A9X;9CLIN9 AӽA9SM69 AA9DM69 A A9 RWLINE9 Areading A9X;9 NA}MLIN9! =========:! ========= :X;: SRCLIN : APUT SRC DISK IN DA*:SM74: A1 }A>: DSTLINH: APUT DST DISK IN DAR:DM7\: A2 Af:X;p: RBMSGz: AHIT RET/BUTTON A:X;: OPTMSG: AӂA==}=: A ӂ Change SOURCEA: A driveA==: A Ă Change DESTINA: AATION driveA==: A - Disk }DireA: ActoryA==: A ̭ Exit A: Ato DOSA==: A ̭Ԃ Text BriA: AghtnessA=: A }̭Ƃ ForegrouA: And colorA=: A ̭‚ BackgrouA: And colorA===: A ΠA: A}A:OPTLEN OPTMSG:X;; RDMSG; AreadingA; WRMSG$; AwritingA.;X;8; RETMSGB; APress RETURN or AG; A}button to restartAL;X;V; BLANK`; A  Aj; POINTRt; AA~;X;; CLEAR; };X;; CPYCOL; H=}==X=;X;; DIRKEY; ===; DIRASC; A1234A;X;; COLKEY< == <X;< COLSAV< ====(<}X;2< DVSAVE<< ===F<X;P< FNBUFZ< @ d<LLOn<@x<LHI<@<ADLO<@<ADHI<@< CHOICE<@<S}CLO< 4SCREEN1=4SCREEN2<SCHI< 5SCREEN1=5SCREEN2< DIRNAM< AD1:*.*A== DOSNAM= ADOS SYSA= FNAME"= A} A,=DNUM6= AD1:A@=N2J= A AT=N1^= A Ah= N1HOLDr= A A }|= N2HOLD= A A=X;= BUFFER =X;=X; -------------=X; Program start=X; -------------=X;=   }=X;= BEGIN=QDOSVEC;;Save the DOS=PDVSAVE;;vectors>QDOSVEC>PDVSAVE>QDOSINI;;Put DOSINI&>PRESET };;vector after0>PDVSAVE;;the JSR in our:>QDOSINI;;code - alsoD>PRESET;;save it...N>PDVSAVEX>Q>4RESET; };Put our codeb>PDOSINI;;address inl>Q>5RESET;;DOSINI tov>PDOSINI;;trap RESET>X;>QSAVMSC;;Save OS screen>PDIR }SCR;;address for>QSAVMSC;;directory>PDIRSCR;;screen>Q>4TITLDL;;Install title>PSDLSTL;;display list> Q>5TI }TLDL> PSDLSTH>$>> SETCOL>QCOLORS9;;Set screen>PCOLOR09;;colors?0 ? ISETCOL? STRTWT ?QCONSOL;;Get console } reg*?R>;;Any key?4?HCONTIN;;Yes, go ahead>?QSKCTL;;Check keyboardH?R>;;Key pressed?R?HCONTIN;;Yes, continue\?Q }STRIG0;;Get triggerf?FCONTIN;;If pressed, skipp?HSTRTWT;;No input...z? CONTIN?QCONSOL;;Wait for key,?R>;;button, }or?HCONTIN;;console to be?QSKCTL;;released?R>? HCONTIN? QSTRIG0? FCONTIN?X;?$>;;Init source?&SRC;;an }d destination? 2;;drives?&DST@!OPTIONS;;Jump to start@X;@ TITLDL$@ p=p=p.@ G8@ TDATAB@ p=p=p=p=pL@ }=p=pV@ =p=`@ p=p=pj@ p=p=pt@ p=p=p~@ @ A@ TITLDL@@ TDATA@ A -MULTICOPY- A@ A } é A@ A A@ A A@ A press start A@@ COLORS@ =4 }= ==A AX;AA BEGIN(AX;2AEI A@ A A@ A press start A@@ COLORS@ =4.N! EIX;BACKGROUND PRINTERX;by(X;A. Giambra2X;<ADDR";;START ADDRESSFDDEVIC;;DEVICEPDUNIT;;D }EVICEZDCOMND;;I/O COMMANDdDSTATS;;DEVICEnDBUFLO;;BUFFER ADDRESSxDTIMLO;;BUFFER ADDRESSDBYTLO };;BUFFER ADDRESSDBYTHI ;;BUFFER ADDRESSDAUX1 ;;SECTOR NUMBERDSKINVS;;OS I/O ROUTINECIOVV;;OS I }/O ROUTINENOTE&;;NOTE SECTORREAD;;OPEN FOR READPUTCHAR ;;PUT CHARACTERS READCOMR;;READ SECTOR CMND }STATUS ;;STATUS COMMANDOPEN;;OPEN DEVICECLOSE ;;CLOSE DEVICEOPENERROR;;CHANNEL OPENNOTFOUND;;WO }RK FLAGIOCB0;;CHANNEL 0IOCB1;;CHANNEL 1"HATABS;;HANDLER TABLE,ICCOMB;;I/O COMMAND6ICSTAC;;I/ }O STATUS@ICBALD;;BUFFER ADDRESSJICBLLH;;BUFFER LENGTHTICAX1J;;AUXILIARY BYTE^ICAX3L;;AUXILIARY BYTEh }DOSVEC ;;DUP SYS ADDRESSrDOSINI ;;DOS INIT| PBPNT PBUFSZPRNBUF PTIMOTLOMEM;;LOW MEM }ORYWARMSTARTtXITVBVb;;VBI EXITSETVB\;;SET VBI ROUTINEVVBLKD$;;VBI VECTOR ADDRCR;;CARRIAGE }RETURNCOMMAND;;TEMP STORAGESECTOR;;SECTOR COUNTINDEX;;WORK INDEXRETRY;;RETRY FLAGFLAG;;WRO }K FLAGBUSY;;BUSY FLAG%X;OFFSET TO RESIDENT PRINT HANDLER&X;RETRY LOGIC0PRINTOFF:X;DX;HANDLER TABLEN }X;X ADDRb OPENITl CLOSEITv RETURN WRITE RETURN RETURN !RETURNDOS  } DUPSAV  VBISAV  TIMER X;$X;THE OPEN ROUTINE SUBSTITUES THE !X;PRINT.SPL FILE NAME INTO THE }X;IOCB, THEN CALLS THE DISK X;OPEN ROUTINE*X;4 OPENIT>QSECTOR;;PRINT.SPL INUSE?HFOPEN1;;TEST OTHER BYTER INU }SE\A;;SAVE X REGISTERf5p$>IOCB0;;CHANNEL 0-EDITORzQ>PUTCHAR;;WRITE CHARS PICCOM9Q>4MSG;;IN USE MESSAGE PI }CBAL9 Q>5MSGPICBAL9Q>PICBLL9;;MESSAGE LENGTHQ>PICBLL9 CIOV;;WRITE IT7>;;RESTORE X RE }G%>OPENERRORC;;GIVE ERROR MSGPICSTA9;;TO BASIC:$ OPEN1.QSECTOR8 HINUSEBQ>4DISKNAMELPICBAL9;;SUB }STITUTE NAMEVQ>5DISKNAME`PICBAL9jQ>;;SET COMMAND TO 1t PCOMMAND~ LOOKUP%>LOOKQHATABS8;;FIND DIS }K HNDLRR> D;;IS IT A 'D'?FFOUND;;YES3;;NO, SKIP 2 BYTES33ILOOK;;LOOK AGAIN FOUND3QHATABS8;;VECT } TABLE ADDRPINDEX;;STORE IN INDEX 3 QHATABS8 PINDEX(%COMMAND;;OFFSET TO OPEN- X;ROUTLINE2Q@INDEX7;;TRAN !}SFER CNTRL<5;;WITH INDIRECT JPF1P Q@INDEX7Z5;;TARGET ADDRESS_%X; IS NOW ON THE STACKdQFLAG;;RESTORE T "}HE CHARi X; SENT BY CIOn RETURNx:;;DO INDIRECT JUMP WRITEPFLAG;;SAVE CHAR SENTX; #} BY CIOQ>;;USED AS OFFSET%X; TO WRITE ROUTINE PCOMMAND HLOOKUPX;!X;THE CLOSE ROUTINE CLOSES $}THE"X;PRINT.SPL FILE,REOPENS IT AND$X;NOTES THE FIRST SECTOR. FINALLY$X;IT CLOSES THE FILE AND FIRES UPX;THE VBI SER %}VICE ROUTINEX; CLOSEITQCOMMAND;;LAST CIO OP?R>;;A WRITE?HRETURN;;NO, SO EXIT"Q>;;STORE OFFSET TO'%X; &} TO CLOSE ROUTINE, PCOMMAND6 LOOKUP;;CALL DISK CLOSE;X; ROUTINE@$>IOCB1;;CHANNEL 1JQ '}>OPEN;;LOAD OPEN CMNDTPICCOM9;;STORE IN IOCB^Q>4DISKNAMEhPICBAL9;;STORE FILE NAMErQ>5DISKNAME|PICBAL9Q> (}READ;;OPEN INPUT PICAX19 CIOV;;CALL OS I/OQ>NOTE;;NOTE SECTOR CMND PICCOM9 CIOV;;CALL I/O ROUTINEQICAX )}39;;GET THE SECTOR # PSECTORQICAX39PSECTORQ>CLOSE;;CLOSE COMMAND PICCOM9 CIOV;;CLOSE THE FILEQ *}>;;INIT WORK AREAS PINDEX PFLAG& PRETRY0 PBUSY:Q>4WARMSTARTDPDOSVEC;;MAKE SURE CAN'TNQ>5WARMSTART;;USE D +}OS CMDXPDOSVECbQ>;;CALL AN IND VBIl%>4VB;;ADDR VBI ROUTINEv $>5VB SETVB;;SET VBI:OUT !XITVBV ,}VBQBUSY;;DON'T LET VBIHOUT;;INTERRUPT ITSELFQFLAG;;TIME TO PRINT?HPRINTER;;YESPCOMMAND;;INIT WORK AREA -}PTIMER;;INITIALIZE TIMERQ>PDUNIT;;DRIVE 1Q>READCOM;;READ COMMAND  PDCOMNDQ>4DATA;;DATA BUFFER ADDR  PDB .}UFLO* Q>5DATA4PDBUFLO>QSECTOR;;LOAD SECTOR NO.H PDAUX1RQSECTOR\ PDAUX1f DSKINV;;READ A SECTORpC; /};GET I/O STATUSzGOUT;;WAS IT BAD I/O?#FLAG;;SET FLAGHOUT;;EXIT PRINTER#TIMER;;INCREMENT TIMER QTIMERR 0}>;;SLOW DOWN OUTPUTHOUTQ>;;RESET TIMER PTIMERQRETRY;;LAST I/O BAD?HTRYAGAIN;;YES,TRY AGAIN#BUSY;;SE 1}T BUSY FLAG%INDEX;;CHARACTER INDEX QDATA8;;LOAD A CHARACTER X; #X;THE FOLLOWING ROUTINE EMULATES$ X;THE OPERATING 2}SYSTEM PRINT. X;HANDLER WRITE ROUTINE8 X;B PRINTL 5;;SAVE CHARACTERV %>W;;WRITE COMMAND` $>(;;BUFFER SIZEj Q>N;;NO 3}RMAL MODEt PDAUX1~ 'DCOMND &PBUFSZ $PBPNT 7;;GET CHARACTER PPRNBUF9;;PUT IN BUFFER 2;;INC BUFF POINTER (P 4}BUFSZ;;= BUFFER SIZE? FBUFFUL &PBPNT;;SAVE POINTER R>;;EOL? FBLFILL;;YES, BLANK FILL %>;;GOOD STATUS !IN 5} BLFILL Q> ;;LOAD A SPACE FILLBFPPRNBUF9 2( (PBUFSZ;;BUFFER FULL?2 HFILLBF< BUFFULF Q>;;CLEAR BUFFERP P 6}PBPNT;;POINTERZ $>;;SET BUFF POINTERd %>n &DBUFLOx 'DBUFLO Q>@;;STORE DEVICE PDDEVIC Q> PDUNIT Q> 7};;DIRECTION=OUTPUT PDSTATS QPBUFSZ;;STORE BUFF SIZE PDBYTLO Q> PDBYTHI QPTIMOT;;TIMEOUT VALUE PDTIMLO 8}  Y IN "BUSY;;BUST FLAG OFF C;;GET STATUS" IAHEAD;;GOOD I/O, #RETRY;;SET RETRY FLAG6 HJP@ AHEADJ %INDEX 9}T 3;;INC CHAR INDEX^ )DATA;;END OF SECTOR?h ENEXTSECTOR;;YESr 'INDEX;;NO, SAVE IT| JP !OUT TRYAGAIN "RET :}RY;;RETRY FLAG OFF #BUSY;;SET BUSY FLAG X; RETADDR !BUFFUL;;RETRY WRITING X; THE BUFFER EXITVB ;}  ;;PRINT HANDLER "X; CLOSE ROUTINE QVBISAV;;RESTORE VBI VECT PVVBLKD QVBISAV PVVBLKD <}Q>4DUPEXIT;;RESTORE X; DOSVEC PDOSVEC Q>5DUPEXIT& PDOSVEC0 HJP: NEXTSECTORD Q>;;RESET =} WORK AREASN PINDEXX PFLAGb QDATA};;GET NEXT SECTORl M>;;GET HIGH BYTEv PSECTOR FNEXT1 #COMMAND;;THERE >}IS MORE NEXT1 QDATA~;;GET LOW BYTE PSECTOR FNEXT2 #COMMAND;;THERE IS MORE NEXT2 QCOMMAND;;MORE SECTORS ?}? FEXITVB;;NO, END VBI !OUT;;EXIT VBI DISKNAME AD:PRINT.SPLA MEMSAV  AD:MEM.SAVA MSG  AԮ̠Π @}A=CR DATA;DISK DATA BUFFER*  4 DUPEXIT> $>IOCB1;;CHANNEL 1H Q>STATUS;;GET STATUS OFR PICCOM9;;MEM.SAV FILE\ A} Q>4MEMSAVf PICBAL9p Q>5MEMSAVz PICBAL9 CIOV )>NOTFOUND;;IS IT THERE? HJUMPDUP;;YES, GET OUT %> F B}INDB QHATABS8;;FIND B DEVICE R> B FFOUNDB;;FOUND IT 3 3 3 IFINDB FOUNDBQ>;;TAKE OUT OF TABL PHATA C}BS8Q>4ADDR;;RESTORE LOMEM$PLOMEM;;TO ORIGINAL VAL. Q>5ADDR8 PLOMEMBQDOS;;RESTORE DOSINILPDOSINI;;TO ORIGI D}NAL VALV QDOS`PDOSINIjQDUPSAV;;RESTORE DOSVECtPDOSVEC;;TO ORIGINAL VAL~QDUPSAVPDOSVEC!@DOSV E}EC:;;JUMP TO DUP.SYS JUMPDUP QDUPSAVPQDUPSAVP!@: RESETQ>;;RESET SECTOR NUM PSECTORP F}SECTORQDOS;;GET DOSINI VECT PDOSADDR;;CREATE JSR ADR QDOSPDOSADDR( DOSADDR2 ;;DOS INIT<!I G}NITMORE;;REINIT HANDLERAX; TABLEFINITPQDOSINI;;GET DOSINI VECTZPDOS;;AND SAVE ITdQDOSINIn P H}DOSxQ>4RESET;;POINT DOSINI TOPDOSINI;;OUR RESET LOGIC Q>5RESETPDOSINI INITMOREQDOSVEC;;SAVE DOSVE I}CPDUPSAV;;IN DUPSAVQDOSVECPDUPSAVQ>4DUPEXIT;;POINT DOSVECPDOSVEC;;TO DUPEXITQ>5DUPEXITPDOSV J}ECQVVBLKD;;SAVE ORIG VBIPVBISAV;;VECTORQVVBLKDPVBISAV"Q>4FINI;;SET LOMEM TO,PLOMEM;;POINT PAST K} END6Q>5FINI;;OF THIS PROGRAM@ PLOMEMJ%>TSEEK^QHATABS8;;LOOK IN HANDLERcX; TABLEhFPUTI L}T;;FOR A FREE SPACErR> P;;IS IT THEw%X; PRINTER HANDLER?| HPUT1 GETIT;;YES, PROCESS ITPUT13;;S M}KIP 2 BYTES33 ISEEK PUTITQ> B;;HANDLER NAMEPHATABS8;;IN TABLE3Q>4ADDR;;STORE ADDRESS OFPHATABS8 N};;OUR VECT TABLE3 Q>5ADDR PHATABS8 :;;EXIT& GETIT0C;;SAVE THE Y REG:5;;ON THE STACKD3NQHATABS8;;GET VEC O}T TABLEXPINDEX;;ADDRESSb3l QHATABS8v PINDEX%>;;OFFSET TO CLOSEX; ROUTINE,Q@INDEX7;; P}LOAD CLOSE ADRO>;;ADD 1 TO ITPEXITVB;;MODIFY JSR CODE3 Q@INDEX7O>PEXITVB7;;RESTORE Y INDEX Q}?:FINI  INITO ITPEXITVB;;MODIFY JSR CODE3 Q@INDEX7O>PEXITVB7;;RESTORE Y INDEX  ORG $2000; ; ᠛; chset DB $00,$00,$00,$00,$00,$00,$00,$00 DBS} $01,$07,$17,$5F,$5F,$5F,$5F,$5F DB $55,$FF,$FF,$FF,$FF,$FF,$FF,$FF DB $50,$F4,$F4,$FD,$D5,$55,$45,$41 DB $5F,$5D,$5D,$5D,T}$5D,$5F,$5F,$5F DB $5F,$57,$67,$97,$57,$5F,$5F,$5F DB $51,$55,$55,$55,$55,$D5,$F5,$FD DB $5F,$1F,$1F,$07,$07,$01,$01,$05 U}DB $5F,$5F,$5F,$5F,$5F,$5D,$54,$55 DB $FD,$FD,$FD,$F4,$F4,$50,$00,$00 DB $05,$1F,$1F,$7F,$57,$55,$51,$41 DB $55,$FF,$FF,$FV}F,$FF,$FF,$FF,$FF DB $40,$D0,$D4,$F5,$F5,$F5,$F5,$F5 DB $45,$55,$55,$55,$55,$57,$5F,$7F DB $F5,$D5,$D9,$D6,$D5,$F5,$F5,$F5W} DB $F5,$75,$75,$75,$75,$F5,$F5,$F5 DB $7F,$7F,$7F,$1F,$1F,$05,$00,$00 DB $F5,$F5,$F5,$F5,$F5,$75,$15,$55 DB $F5,$F4,$F4,X}$D0,$D0,$40,$40,$50 DB $01,$07,$07,$1F,$1D,$15,$14,$14 DB $55,$FF,$FF,$FF,$55,$55,$55,$14 DB $40,$D0,$D0,$F4,$74,$54,$14,$Y}14 DB $75,$75,$75,$75,$75,$7D,$7F,$7F DB $14,$55,$55,$55,$55,$55,$55,$FF DB $5D,$5D,$5D,$5D,$5D,$7D,$FD,$FD DB $7F,$7F,$5Z}F,$47,$47,$41,$50,$54 DB $FF,$FF,$FF,$FF,$FF,$55,$00,$00 DB $FD,$FD,$F5,$D1,$D1,$41,$05,$15 DB $01,$07,$07,$1F,$1D,$1D,$1D[},$1D DB $55,$FF,$55,$55,$55,$41,$55,$00 DB $40,$D0,$D0,$F4,$74,$74,$74,$74 DB $75,$74,$75,$74,$75,$74,$75,$75 DB $55,$55,\}$55,$55,$55,$55,$55,$00 DB $5D,$1D,$5D,$1D,$5D,$1D,$5D,$5D DB $7D,$7F,$5F,$47,$47,$41,$50,$54 DB $55,$FF,$FF,$FF,$FF,$55,$]}00,$00 DB $7D,$FD,$F5,$D1,$D1,$41,$05,$15 DB $3C,$6A,$BF,$F5,$5F,$FB,$6E,$3C DB $3C,$6A,$BF,$F5,$5F,$FB,$6E,$3C DB $3C,$6^}A,$BF,$F5,$5F,$FB,$6E,$3C DB $3C,$6A,$BF,$F5,$5F,$FB,$6E,$3C DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA DB $00,$3F,$3F,$3F,$3F,$3F_},$3F,$00 DB $00,$00,$0F,$0F,$0F,$0F,$00,$00 DB $00,$00,$00,$05,$05,$00,$00,$00 DB $00,$7C,$EE,$EE,$EE,$EE,$7C,$00 DB $00,`}$38,$78,$38,$38,$38,$FE,$00 DB $00,$7C,$EE,$1C,$38,$70,$FE,$00 DB $00,$FE,$1C,$38,$1C,$EE,$7C,$00 DB $00,$1C,$3C,$7C,$EC,$a}FE,$1C,$00 DB $00,$FE,$E0,$FC,$0E,$EE,$7C,$00 DB $00,$7C,$E0,$FC,$EE,$EE,$7C,$00 DB $00,$FE,$0E,$1C,$38,$70,$70,$00 DB $0b}0,$7C,$EE,$7C,$EE,$EE,$7C,$00 DB $00,$7C,$EE,$7E,$0E,$1C,$78,$00 DB $00,$7C,$E0,$7C,$0E,$FE,$7C,$00 DB $00,$E0,$E0,$E0,$E0c},$E0,$FE,$00 DB $00,$38,$FE,$38,$38,$3E,$1E,$00 DB $00,$7C,$FE,$E6,$E0,$E0,$E0,$00 DB $00,$7C,$EE,$FE,$E0,$FE,$7C,$00 DB d}$00,$FC,$FE,$E6,$E6,$E6,$E6,$00 DB $00,$7E,$F6,$F6,$7E,$0E,$7C,$00 DB $00,$E0,$E0,$FC,$EE,$EE,$EE,$00 DB $00,$F8,$78,$78,$e}78,$78,$FC,$00 DB $00,$EE,$EE,$EE,$7C,$38,$10,$00 DB $00,$7C,$E0,$E0,$E0,$FC,$7C,$00 DB $00,$7C,$EE,$EE,$EE,$FE,$7C,$00 Df}B $00,$05,$1F,$1F,$7F,$7F,$7F,$7F DB $00,$01,$47,$DF,$DD,$FF,$FF,$FF DB $00,$40,$D0,$D0,$F4,$74,$74,$74 DB $7F,$7F,$7F,$1Fg},$1F,$1F,$1F,$07 DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DB $F4,$F4,$F4,$D0,$D0,$D0,$D0,$40 DB $07,$07,$01,$01,$00,$00,$00,$00q}B%DOS SYSB*)DUP SYSBSMULTCOPYM65BE BACKPRNTM65BRFLOYD AMA DB $FF,$FF,$FD,$FD,$74,$10,$00,$00 DB $40,$40,$00,$00,$00,$00,$00,$00 DB $01,$05,$15,$15,$55,$55,$56,$54 DB $55,$55,$55,$r}55,$55,$55,$56,$90 DB $80,$60,$58,$58,$56,$56,$56,$56 DB $58,$58,$54,$16,$15,$15,$05,$05 DB $58,$64,$64,$46,$45,$65,$55,$5s}5 DB $96,$56,$56,$58,$58,$58,$60,$60 DB $06,$00,$01,$05,$05,$01,$00,$00 DB $66,$44,$11,$99,$55,$55,$10,$00 DB $60,$00,$00t},$60,$60,$80,$00,$00 DB $02,$1A,$29,$AA,$99,$A5,$65,$A5 DB $9A,$A9,$AA,$FF,$7F,$5D,$5D,$5D DB $A0,$9A,$A9,$E6,$5A,$55,$56,u}$56 DB $95,$A5,$AD,$6F,$1F,$3F,$3F,$3F DB $9D,$9D,$7F,$F3,$FF,$F7,$D1,$40 DB $96,$96,$5E,$FD,$FF,$FF,$FF,$7F DB $3D,$3D,$v}3F,$0F,$0F,$03,$00,$00 DB $00,$00,$40,$D1,$F7,$FF,$FF,$00 DB $1F,$1F,$7F,$FC,$FC,$F0,$C0,$00 DB $01,$07,$1F,$1F,$7F,$7D,$7w}5,$75 DB $55,$FF,$FF,$FF,$FF,$FF,$7D,$BE DB $40,$D0,$F4,$F4,$FD,$7D,$5D,$5D DB $75,$75,$7D,$7F,$7F,$7F,$7D,$74 DB $BE,$7Dx},$FF,$FF,$FF,$55,$00,$00 DB $5D,$5D,$7D,$FD,$FD,$FD,$7D,$1D DB $7D,$7F,$7F,$7F,$7F,$7F,$1D,$04 DB $00,$55,$FF,$FF,$FF,$F7,y}$D1,$40 DB $7D,$FD,$FD,$FD,$FD,$FD,$F4,$50 DB $01,$05,$05,$17,$15,$15,$55,$5D DB $5D,$75,$D5,$75,$5D,$55,$69,$AA DB $40,$z}50,$50,$54,$54,$54,$75,$5D DB $75,$D6,$76,$56,$56,$56,$D6,$75 DB $AA,$8A,$82,$82,$92,$92,$A2,$AA DB $57,$9D,$95,$95,$95,$9{}5,$97,$5D DB $55,$55,$15,$17,$15,$05,$05,$01 DB $AA,$69,$55,$55,$D7,$DD,$75,$75 DB $55,$55,$54,$54,$54,$50,$50,$40 DB $40|},$50,$55,$54,$15,$15,$15,$05 DB $14,$55,$55,$55,$96,$96,$55,$55 DB $01,$05,$55,$15,$54,$54,$54,$50 DB $05,$01,$01,$2A,$2A,}}$AA,$AA,$A2 DB $69,$82,$55,$55,$AA,$AA,$AA,$AA DB $50,$40,$40,$A8,$A8,$AA,$AA,$8A DB $A2,$92,$52,$40,$03,$03,$23,$2A DB $~}AA,$AA,$AA,$FF,$FF,$C3,$C3,$82 DB $8A,$86,$85,$01,$C0,$C0,$C8,$A8run_address LDA #$FF STA $0244 LDA #$00 STA just_loade}d LDX #$FFset_up_loop LDA #$01 STA pm_area+$0300,X LDA $D20A STA starfield,X DEX BNE set_up_loopcode_start LDA #$00} STA $D20E STA $D40E JSR off_video LDA #$E0 STA $D409 LDX #$04b1_loop LDA hi_colours,X STA $D016,X DEX BPL b1_loop} LDA #HIGH pm_area STA $D407 LDA #$01 STA $D01D LDA #$1D STA $D012 LDA #LOW hi_dlist STA $D402 LDA #HIGH hi_dlist S}TA $D403 LDA #LOW dli1 STA $0200 LDA #HIGH dli1 STA $0201 JSR init_looney_tune LDA #$80 STA $D40E JSR on_video LDA #}$36 STA $D400 LDA just_loaded BEQ first_game; ; 堛; LDA }#LOW [score_starts+$0C] STA $CB LDA #HIGH [score_starts+$0C] STA $CC LDX #$00hs1_loop LDY #$00hs2_loop LDA ($CB),Y C}LC ADC #$1D CMP scrn_start+$03E1,Y BMI a_new_high_score BNE hs1_skip INY CPY #$07 BNE hs2_loophs1_skip LDA $CB CLC} ADC #$14 STA $CB LDA $CC ADC #$00 STA $CC INX CPX #$05 BNE hs1_loop BEQ wait_for_starta_new_high_score JSR add_hig}h_score JMP wait_for_startfirst_game INC just_loadedwait_for_start LDA $D01F CMP #$06 BNE wait_for_start JSR release_}wait; ; ; start LDA #$00 LDX #$08quiet_loop STA $D200,X DEX B}PL quiet_loop JSR initialisemain_loop JSR consol_keys JSR vb_wait JSR perform_fire JSR collision_handling JSR handle_m}onsters JSR draw_player LDX #$07m_loop1 LDA $D20A AND m_data,X STA chset+$0128,X STA chset+$0130,X STA chset+$0138,X} STA chset+$0140,X DEX BPL m_loop1 JSR consol_keys JSR vb_wait JSR fire_test JSR perform_fire JSR collision_handling }JSR handle_monsters JSR read_stick LDA stick_direction CMP #$FF BEQ continue LDA #$04 STA frame JSR draw_player LDA s}tick_direction BNE m_skip1 JSR move_right JMP continuem_skip1 CMP #$01 BNE m_skip2 JSR move_left JMP continuem}_skip2 CMP #$02 BNE m_skip3 JSR move_down JMP continuem_skip3 CMP #$03 BNE m_skip4 JSR move_up JMP continuem_skip4} CMP #$04 BNE m_skip5 JSR move_down JSR move_right JMP continuem_skip5 CMP #$05 BNE m_skip6 JSR move_up JSR move_lef}t JMP continuem_Skip6 CMP #$06 BNE m_skip7 JSR move_down JSR move_left JMP continuem_skip7 JSR move_up JSR move_rig}htcontinue JSR draw_player JMP main_looprelease_wait LDX #$04debounce_loop LDA $D01F CMP #$07 BNE release_wait DEX} BPL debounce_loop RTSconsol_keys LDA $D01F CMP #$03 BNE ck1_skip JSR no_noise JSR release_waitck1_loop LDA $D01F} CMP #$03 BNE ck1_loop JSR release_wait RTSck1_skip CMP #$06 BNE ck2_skip JSR no_noise JSR release_wait LDX #$00 TX}S JMP code_startck2_skip RTS no_noise LDA #$00 LDX #$05nn1_loop STA $D200,X DEX DEX BPL nn1_loop RTSju}st_loaded = $E5m_data DB $3C,$7E,$FF,$FF,$FF,$FF,$7E,$3Chi_colours DB $8C,$0E,$00,$4A,$00hi_dlist DB $70,$70,$70,$B0,$4}6 DW hi_scrn_start DB $70,$07,$30,$06,$30,$70,$07 DB $70,$06,$70,$06,$70,$06 DB $70,$06,$70,$06 DB $70,$02,$00,$02,$00,$}02,$41 DW hi_dlisthi_scrn_start DB 0,0,33,46,33,44,47,39,0 DB 48,50,37,51,37,46,52,51,0,0,0 DB 0,0,'floyd',0,'the',0 DB} 'droid',0,0,0 DB 0,0,0,'goes',0,'blastin' DB 71,0,0,0,0 DB 0,0,0,0,168,169,167,168,0 DB 179,163,175,178,165,179 DB 0,0,}0,0,0score_starts DB 0,240,236,225,249,243,239,230 DB 244,0,0,0,16,16,16,17,16,16,16,0 DB 0,240,236,225,249,243,239,230 }DB 244,0,0,0,16,16,16,16,21,16,16,0 DB 0,240,236,225,249,243,239,230 DB 244,0,0,0,16,16,16,16,18,21,16,0 DB 0,240,236,225,}249,243,239,230 DB 244,0,0,0,16,16,16,16,17,18,21,0 DB 0,240,236,225,249,243,239,230 DB 244,0,0,0,16,16,16,16,16,21,16,0 }DB 0,0,0,0,0,0,0,35,'opyright',0 DB 8,35,9,17,25,24,22,0 DB 48,'laysoft',0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,48,'rogrammed'} DB 0,'by',0,48,'aul',0,44,'ay' DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,48,'ress',0,179,180,161,178 DB 180,0,'to',0,'begin'} DB 0,'game',0,0,0,0,0,0,0,0dli1 PHA TXA PHA TYA PHA LDX #$A0 LDY rainbowdli1loop LDA starfield,X STA $D40A STA} $D004 STY $D018 INY DEC starfield,X TXA AND #$01 BEQ dli1skip DEC starfield,Xdli1skip DEX BNE dli1loop STX $D004} LDY #$02dli12loop LDA line_colours,Y LDX #$07dli13loop STA $D40A STA $D018 SEC SBC #$01 DEX BPL dli13loop STA $D4}0A DEY BPL dli12loop INC rainbow JSR looney_tune PLA TAY PLA TAX PLA RTIpm_area = $3800starfield = $3C00l}ine_colours DB $CA,$8A,$1Arainbow = $E7dli2 PHA TXA PHA LDA #$0E LDX #$AA STA $D40A STX $D018 STA $D017 DEXdli2}loop STA $D40A STX $D018 DEX CPX #$A2 BNE dli2loop LDA #$86 LDX #$CC STA $D40A STA $D017 STX $D018 PLA TAX PLA }RTI init_looney_tune LDA #$63 STA $D208 LDA #$03 STA $D20F LDA #$C6 STA $D201 LDA #$00 STA ltdelay }STA the_note STA screach STA phase STA bass STA percuss RTSlooney_tune INC ltdelay LDA ltdelay AND #$01 BEQ ltexit} LDA screach STA $D200 INC screach LDA $D20A AND #$3F STA $D204 LDA percuss STA $D205 CLC ADC #$04 CMP #$09 BCC l}t1skip LDA #$00lt1skip STA percuss LDA bass ORA #$A0 STA $D203 STA $D207 LDX the_note LDA notes,X STA $D202 CLC A}DC #$01 STA $D206 LDA bass CLC ADC #$03 CMP #$0D BCC lt2skip LDA #$00lt2skip STA bass LDA phase CLC ADC #$14 STA} phase BVS ltnextltexit RTSltnext INX CPX #$13 BMI lt3skip LDX #$00lt3skip STX the_note RTSltdelay = $E8the_no}te = $E9phase = $EAscreach = $EBbass = $ECpercuss = $EDnotes DB 80,100,80,120,80,100,80,120 DB 100,120,100,140,120,16}0,140 DB 160,180,160,200initialise; ; ; }ᬠ堠; 堠; 󠠠; } LDA #$00 STA $D40E JSR off_video LDA #HIGH chset STA $D409 LDA #LOW scrn_start STA $CD LDA #HIGH scrn_start STA }$CE LDA #$00 LDX #$03i_loop1 LDY #$00i_loop2 STA ($CD),Y INY BNE i_loop2 INC $CE DEX BPL i_loop1 LDX #$27i_loop3} LDA text,X STA scrn_start+$03C0,X DEX BPL i_loop3 LDA #LOW d_list STA $D402 LDA #HIGH d_list STA $D403 LDA }#LOW dli2 STA $0200 LDA #HIGH dli2 STA $0201 LDA #$80 STA $D40E LDX #$04i_loop4 LDA colours,X STA $D016,X DEX BPL }i_loop4 LDA #$12 STA play_x LDA #$0A STA play_y LDA #$00 STA frame JSR draw_player LDX #$03i_loop5 LDA #$FF STA b_}directions,X LDA #$00 STA first_shot,X DEX BPL i_loop5 STA alive_monsters STA init_monsters JSR handle_monsters LDA #}$00 STA $D208 LDA #$03 STA $D20F JSR on_video RTS play_x = $D0play_y = $D1frame = $DBd_list DB $70,$70 DB $4}4 DW scrn_start DB $04,$04,$04,$04,$04,$04,$04 DB $04,$04,$04,$04,$04,$04,$04 DB $04,$04,$04,$04,$04,$04,$04 DB $04,$84,}$02 DB $41 DW d_listtext DB $37,$39,$3A,$3B,$3C,$3D,$39,$3E DB $00,$2D,$2D,$2E,$2D DB $00,$00 DB $38,$3B,$40,$3B,$3F }DB $00,$2D,$2D,$2D,$2D DB $00,$00 DB $37,$41,$42,$3A,$3B DB $00,$2D,$2D,$2D,$2D,$2D,$2D,$2Dcolours DB $0E,$86,$CC,$38,$0}0vb_wait; ; 렛; 䠠; } LDA $D40B CMP #$74 BNE vb_wait RTSoff_video LDA $D40B BNE off_video STA $D400 RTSon_video LDA $D40}B BNE on_video LDA #$22 STA $D400 RTSread_stick ; ; }䠛; ; ; LDA $D300} AND #$0F LDX #$07r_loop1 CMP joy_values,X BEQ r_skip1 DEX BPL r_loop1 LDX #$FFr_skip1 STX stick_direction RTSst}ick_direction = $D6joy_values DB $07,$0B,$0D,$0E DB $05,$0A,$09,$06 fire_test; }; ᠛; ; ; } LDX #$03test_missile_loop LDA b_directions,X CMP #$FF BEQ available_missiles DEX BPL test_missile_loop RTSav}ailable_missiles LDA $D010 BEQ trigger_pressed RTStrigger_pressed STX $CD JSR read_stick LDX $CD LDA stick_direction} CMP #$FF BNE fire_missile RTSfire_missile STA b_directions,X INC first_shot,X CMP #$00 BNE t_skip1 LDA play_x CLC }ADC #$02 STA miss_x,X LDA play_y CLC ADC #$01 STA miss_y,X RTSt_skip1 CMP #$01 BNE t_skip2 LDA play_x STA miss_x,X} LDA play_y CLC ADC #$01 STA miss_y,X RTSt_skip2 CMP #$02 BNE t_skip3 LDA play_x CLC ADC #$01 STA miss_x,X LDA p}lay_y CLC ADC #$02 STA miss_y,X RTSt_skip3 CMP #$03 BNE t_skip4 LDA play_x CLC ADC #$01 STA miss_x,X LDA play_y }STA miss_y,X RTSt_skip4 CMP #$04 BNE t_skip5 LDA play_x CLC ADC #$02 STA miss_x,X LDA play_y CLC ADC #$02 STA mis}s_y,X RTSt_skip5 CMP #$05 BNE t_skip6 LDA play_x STA miss_x,X LDA play_y STA miss_y,X RTSt_skip6 CMP #$06 BNE t_s}kip7 LDA play_x STA miss_x,X LDA play_y CLC ADC #$02 STA miss_y,X RTSt_skip7 LDA play_x CLC ADC #$02 STA miss_x,X} LDA play_y STA miss_y,X RTSperform_fire; ; 堛; }; LDX #$03next_missile LDA b_directions,X CMP #$FF BNE li}ve_missilereturn DEX BPL next_missile RTSlive_missile LDA first_shot,X BNE move_missile LDA miss_x,X STA x_pos LDA }miss_y,X STA y_pos JSR form_address LDA #$00 LDY #$00 STA ($CB),Ymove_missile LDA #$00 STA first_shot,X LDA b_direct}ions,X BNE p_skip1 INC miss_x,X LDA miss_x,X BPL m_soundp_skip1 CMP #$01 BNE p_skip2 DEC miss_x,X LDA #$28 SEC SBC} miss_x,X BPL m_soundp_skip2 CMP #$02 BNE p_skip3 INC miss_y,X LDA miss_y,X BPL m_soundp_skip3 CMP #$03 BNE p_skip4} DEC miss_y,X LDA #$18 SEC SBC miss_y,X BPL m_soundp_skip4 CMP #$04 BNE p_skip5 INC miss_x,X INC miss_y,X LDA m}iss_y,X BPL m_soundp_skip5 CMP #$05 BNE p_skip6 DEC miss_x,X DEC miss_y,X LDA #$18 SEC SBC miss_y,X BPL m_soundp_s}kip6 CMP #$06 BNE p_skip7 DEC miss_x,X INC miss_y,X LDA miss_y,X BPL m_soundp_skip7 INC miss_x,X DEC miss_y,X LDA #}$18 SEC SBC miss_y,Xm_sound LSR A STA $D200 LDA #$8A STA $D201range_check LDA miss_x,X BMI out_of_range CMP #$28 }BPL out_of_range STA x_pos LDA miss_y,X BMI out_of_range CMP #$18 BPL out_of_range STA y_pos JSR form_address TXA CL}C ADC #$A5 LDY #$00 STA ($CB),Y JMP returnout_of_range LDA #$00 STA $D201 LDA #$FF STA b_directions,X JMP returnd}raw_player; ; ; ; }䠠; 堠; LDA play_x STA x_pos LDA play_y} STA y_pos JSR form_address LDA #$02 STA $CD LDA frame ASL A ASL A ASL A CLC ADC frame TAXd_loop1 LDY #$00d_loo}p2 LDA droid_data,X STA ($CB),Y INX INY CPY #$03 BNE d_loop2 LDA $CB CLC ADC #$28 STA $CB LDA $CC ADC #$00 STA $}CC DEC $CD BPL d_loop1 RTSdroid_data DB $01,$02,$03,$04,$05,$06 DB $07,$08,$09 DB $0A,$0B,$0C,$0D,$0E,$0F DB $10,$11},$12 DB $13,$14,$15,$16,$17,$18 DB $19,$1A,$1B DB $1C,$1D,$1E,$1F,$20,$21 DB $22,$23,$24 DB $00,$00,$00,$00,$}00,$00 DB $00,$00,$00form_address; ; ;  Ġ}堠; 䠠; 󠠠; LDA #LOW scrn_start} STA $CB LDA #HIGH scrn_start STA $CC LDA y_pos STA $CD LDA #$00 STA $CE LDY #$02f_loop1 ASL $CD ROL $CE DEY BPL }f_loop1 LDA $CB CLC ADC $CD STA $CB LDA $CC ADC $CE STA $CC LDY #$01f_loop2 ASL $CD ROL $CE DEY BPL f_loop2 LDA} $CB CLC ADC $CD STA $CB LDA $CC ADC $CE STA $CC LDA $CB CLC ADC x_pos STA $CB LDA $CC ADC #$00 STA $CC RTS } x_pos = $D4y_pos = $D5 move_right LDA #$00 STA frame LDA play_x CMP #$25 BPL right_skip INC play_xright_ski}p RTS move_left LDA #$01 STA frame LDA play_x BEQ left_skip DEC play_xleft_skip RTSmove_down LDA #$02 STA} frame LDA play_y CMP #$15 BPL down_skip INC play_ydown_skip RTSmove_up LDA #$03 STA frame LDA play_y BEQ up_skip} DEC play_yup_skip RTS handle_monsters; ; 󬠛; }栠; ; INC tick_tock LDA alive_monsters BNE move_monsters LDA i}nit_monsters CMP #$FF BEQ h_skip1 INC init_monstersh_skip1 LDX #$00h_loop1 JSR activate_new_monster INX CPX init_mon}sters BNE h_loop1 STX alive_monsters STX new_activation JSR up_levelmove_monsters LDX #$00more_monsters_loop LDA m_di}rections,X CMP #$04 BMI ss4 JMP non_active_monsterss4 LDA new_activation BEQ ss1 JMP a_new_set_of_monstersss1 LDA m_}delays,X BEQ ss2 JMP sleeping_monsterss2 LDA #$04 STA monsta JSR draw_monster LDA tick_tock AND #$01 BEQ force_movem}ent LDA init_monsters CMP #$14 BCC display_monsterforce_movement LDA m_directions,X BNE u_skip1 INC m_xpositions,X LD}A m_xpositions,X BNE test_on_screenu_skip1 CMP #$01 BNE u_skip2 DEC m_xpositions,X LDA m_xpositions,X JMP test_on_scre}enu_skip2 CMP #$02 BNE u_skip3 INC m_ypositions,X LDA m_ypositions,X BNE test_on_screenu_skip3 DEC m_ypositions,X LD}A m_ypositions,Xtest_on_screen STA $D204 LDA #$26 STA $D205 LDA m_xpositions,X BMI is_off_screen CMP #$26 BPL is_off_}screen LDA m_ypositions,X BMI is_off_screen CMP #$16 BMI display_monsteris_off_screen LDA #$00 STA $D205 JSR reactiva}te_monsterdisplay_monster LDA m_frames,X STA monsta JSR draw_monster JMP h_skip2non_active_monster CMP #$0D BEQ h_ski}p2 AND #$0E SEC SBC #$04 LSR A STA monsta BNE just_died_skip LDA #$00 STA $D205 BPL still_dyingjust_died_skip CMP }#$04 BNE still_dying DEC alive_monsters LDA #$00 STA $D203 BPL skip_soundstill_dying ASL A ASL A ASL A ASL} A STA $D202 LDA #$2E STA $D203skip_sound JSR draw_monster INC m_directions,Xh_skip2 INX CPX init_monsters BEQ ss3} JMP more_monsters_loopss3 RTSa_new_set_of_monsters LDA #$00 STA new_activation BEQ display_monstersleeping_monster D}EC m_delays,X JMP display_monsteralive_monsters = $DCinit_monsters = $DDnew_activation = $DEtick_tock = $E4activate_n}ew_monster; ; ; ؠ; } LDA $D20A AND #$07 CLC ADC #$05 STA m_frames,Xreactivate_monster; ; }砛; ; ; ؠ; } LDA $D20A AND #$03 STA m_directions,X BNE a_skip1 LDA #$00 STA m_xpositions,X LDA $D20A AND }#$1F STA m_ypositions,X BPL bounds_checka_skip1 CMP #$01 BNE a_skip2 LDA #$25 STA m_xpositions,X LDA $D20A AND #$1F} STA m_ypositions,X BPL bounds_checka_skip2 CMP #$02 BNE a_skip3 LDA $D20A AND #$3F STA m_xpositions,X LDA #$00 STA }m_ypositions,X BPL bounds_checka_skip3 LDA $D20A AND #$3F STA m_xpositions,X LDA #$15 STA m_ypositions,Xbounds_check} LDA m_xpositions,X CMP #$26 BMI a_skip4 AND #$25 STA m_xpositions,Xa_skip4 LDA m_ypositions,X CMP #$16 BMI a_skip5 }AND #$15 STA m_ypositions,Xa_skip5 LDA $D20A AND #$3F STA m_delays,X RTSdraw_monster; }; ; ؠ堠; ᠠ; } STX $E0 LDA m_xpositions,X STA x_pos LDA m_ypositions,X STA y_pos JSR form_address LDA #$02 STA $CD LDA} monsta ASL A ASL A ASL A CLC ADC monsta TAXrow_loop LDY #$02column_loop LDA evil_monster_data,X STA ($CB),Y INX} DEY BPL column_loop LDA $CB CLC ADC #$28 STA $CB LDA $CC ADC #$00 STA $CC DEC $CD BPL row_loop LDX $E0 RTS mo}nsta = $DFevil_monster_data DB $29,$29,$29,$29,$29,$29 DB $29,$29,$29 DB $AA,$AA,$AA,$AA,$AA,$AA DB $AA,$AA,$AA DB $2B,}$2B,$2B,$2B,$2B,$2B DB $2B,$2B,$2B DB $2C,$2C,$2C,$2C,$2C,$2C DB $2C,$2C,$2C DB $00,$00,$00,$00,$00,$00 DB $00,$00,$00 }DB $C5,$C4,$C3,$C8,$C7,$C6 DB $CB,$CA,$C9 DB $4E,$4D,$4C,$51,$50,$4F DB $54,$53,$52 DB $57,$56,$55,$5A,$59,$58 DB $5D,$5}C,$5B DB $60,$5F,$5E,$63,$62,$61 DB $66,$65,$64 DB $E9,$E8,$E7,$EC,$EB,$EA DB $EF,$EE,$ED DB $72,$71,$70,$75,$74,$73 DB} $78,$77,$76 DB $E0,$DF,$DE,$E3,$E2,$E1 DB $E6,$E5,$E4 DB $D7,$D6,$D5,$DA,$D9,$D8 DB $DD,$DC,$DB collision_handling;} ; 堛; 󠠠; }ᠠ; 򠠠; LDX #$00c_main_loop LDA m_directions,X CMP #$04 } BPL next_monster LDA m_xpositions,X STA x_pos LDA m_ypositions,X STA y_pos JSR form_address LDA #$02 STA $}CDnext_row LDY #$02next_column LDA ($CB),Y AND #$7F BEQ no_collision CMP #$29 BPL no_collision CMP #$25 BMI player}_collision_only SEC SBC #$25 TAY LDA #$FF STA b_directions,Y LDA #$00 STA $D201 BEQ both_collisionsplayer_collision_ }only LDA m_frames,X CMP #$05 BNE no_heart JSR up_strength JMP both_collisionsno_heart JSR down_strengthboth_collision }s LDA #$04 STA m_directions,X JSR up_scorenext_monster INX CPX init_monsters BNE c_main_loop RTSno_collision DEY B }PL next_column LDA $CB CLC ADC #$28 STA $CB LDA $CC ADC #$00 STA $CC DEC $CD BPL next_row BMI next_monster  } down_strength; ; 젛;  }; LDY #$03ds_1loop LDA scrn_start+$03C9,Y SEC SBC #$01 CMP #$2D BMI ds_1skip STA scrn}_start+$03C9,Y CPY #$03 BNE ds_2skipds_2loop LDA scrn_start+$03C9,Y CMP #$2D BNE ds_2skip DEY BPL ds_2loop BMI death}ds_2skip RTSds_1skip LDA #$36 STA scrn_start+$03C9,Y DEY BPL ds_1loop RTSdeath LDA #$00 STA $D201 STA $D203 LDA }#$AE STA $D205 LDA #$1F STA $E1dth_1loop LDA #$FF STA $E2dth_2loop LDA play_x STA x_pos LDA play_y STA y_pos JSR }form_address LDX #$02dth_3loop LDY #$02dth_4loop LDA $D20A STA $D204 AND #$83 CLC ADC #$29 STA ($CB),Y DEY BPL dt}h_4loop LDA $CB CLC ADC #$28 STA $CB LDA $CC ADC #$00 STA $CC DEX BPL dth_3loop DEC $E2 BNE dth_2loop DEC $E1 BN}E dth_1loop LDX #$00 STX $D205 TXS JMP code_startup_strength; ; }젛; ; LDA scrn_start+$03CC CLC ADC #$02 CMP #$37 BPL} ps_1skip STA scrn_start+$03CC RTSps_1skip SEC SBC #$0A STA scrn_start+$03CC LDY #$02ps_1loop LDA scrn_}start+$03C9,Y CLC ADC #$01 CMP #$37 BMI ps_2skip LDA #$2D STA scrn_start+$03C9,Y DEY BPL ps_1loop RTSps_2skip STA }scrn_start+$03C9,Y RTSup_level; ; ; } LDY #$03ul_loop1 LDA scrn_start+$03D5,Y CLC ADC #$01 CMP #$37 BMI ul_skip1 LDA #$2D STA }scrn_start+$03D5,Y DEY BPL ul_loop1 RTSul_skip1 STA scrn_start+$03D5,Y RTSup_score; ; }; LDY #$06us_loop1 LDA scrn_start+$03E1,Y CLC ADC #$01 CMP }#$37 BMI us_skip1 LDA #$2D STA scrn_start+$03E1,Y DEY BPL us_loop1 RTSus_skip1 STA scrn_start+$03E1,Y RTSadd_high_}score; ; 򠠛; ; ؠ}; STX $E3 LDA #LOW [score_starts+60] STA $CB LDA #HIGH [score_starts+60] STA} $CC LDA #$04 SEC SBC $E3 TAXah1_loop BEQ ah1_skip LDA $CB CLC ADC #$14 STA $CD LDA $CC ADC #$00 STA $CE LDY #}$13ah2_loop LDA ($CB),Y STA ($CD),Y DEY BPL ah2_loop LDA $CB SEC SBC #$14 STA $CB LDA $CC SBC #$00 STA $CC DEX  }BPL ah1_loopah1_skip LDA #LOW score_starts STA $CB LDA #HIGH score_starts STA $CC LDA $E3 ASL A ASL A PHA CLC ADC !}$CB STA $CB LDA $CC ADC #$00 STA $CC PLA ASL A ASL A CLC ADC $CB STA $CB LDA $CC ADC #$00 STA $CC LDY #$08ah3_"}loop LDA name_buffer-1,Y TAX LDA name_characters,X STA ($CB),Y DEY BNE ah3_loop LDA $CB CLC ADC #$0C STA $CD LDA $#}CC ADC #$00 STA $CE LDY #$06ah4_loop LDA scrn_start+$03E1,Y SEC SBC #$1D STA ($CD),Y DEY BPL ah4_loop; $}; 堛; LDA $CB CLC ADC #$01 STA $CD LDA $CC ADC #$00 STA $CE LDY #$00en1_loop %}JSR vb_delay LDA #$7F STA ($CD),Y JSR vb_delay LDA name_buffer,Y TAX LDA name_characters,X STA ($CD),Y LDA $D010 BEQ&} en5_skip JSR read_stick LDA stick_direction BNE en1_skip INY CPY #$08 BMI en1_loop LDY #$00 BPL en1_loopen1_skip C'}MP #$01 BNE en2_skip DEY BPL en1_loop LDY #$07 BPL en1_loop en2_skip CMP #$02 BNE en3_skip LDA name_buffer,Y SEC S(}BC #$01 BPL en4_skip LDA #$24 BPL en4_skipen3_skip CMP #$03 BNE en1_loop LDA name_buffer,Y CLC ADC #$01 CMP #$25 B)}MI en4_skip LDA #$00en4_skip STA name_buffer,Y JMP en1_loopen5_skip LDA $D010 BEQ en5_skip RTSvb_delay LDX #$02vb*}1_loop LDA $D40B BNE vb1_loopvb2_loop LDA $D40B BEQ vb2_loop DEX BPL vb1_loop RTSname_characters DB 0character SE+}T 225 ECHO 26 DB charactercharacter SET character+$01 ENDMcharacter SET 208 ECHO 10 DB charactercharacter SET charac,}ter+$01 ENDMname_buffer DB 0,0,0,0,0,0,0,0; ; ; m_framesm_d-}irections = m_frames + $0100m_xpositions = m_directions + $0100m_ypositions = m_xpositions + $0100m_delays = m_ypositio.}ns + $0100b_directions = m_delays + $0100first_shot = b_directions + $04miss_x = first_shot + $04miss_y = miss_x + $0/}4scrn_start = miss_y + $04 END run_addressrst_shot = b_directions + $04miss_x = first_shot + $04miss_y = miss_x + $0/