0L0u MAE_ASS (  Error: No DOS(0 )0 / 0/(0/)00ֹ/ / Ȅ`l0  1 1%7x0 1 1 18H 1(哅h k1 y0L0l00DEH B VL0@   Y0`0.` a000. 08&.` 0mm 8 L1ƕƔ 1擥`? (MAIN  Z2X32F DOS U08.HYP ARC U4*6MAE COM U4-RUNAD OBJ U5:HISTORY DOC U5)MASM DOC U5Q2ED DOC U5/\3MONITOR DOC U5%WNOTE64 DOC U51UNIFY BAS U54HYP DOC U8_!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^~S28$HHH өH*HHllhhh@HHLH|)ӝtI)MӍ|hh`HH||)thh(`44DEPH BLV `)`` '4 4 4Ȣ4 4LI4 4 w4 4x '4 44X 4) ~`8 '4 4 4L4L4Error: Not an XL/XE Computer.4.4t5} SpartaDOS Ver 3.2f 25-Feb-94 Copyright (C) 1994 by FTe 4.4 4 4G)@}҅  EEF E x4 d5 d5" #   c5  M c5 , W5 4LL4 L LLHEi ȱEi `|40 `` 7 YL\ 2BHG H-G H ةHhJ \hBL\`@B 442@3Y45245324 `L1( (ҩmi:; < =x:23454 Μ ,  w ,P lνе X0`234 5` P21 ,350 2 9 4 2 9 LD1 9)ҢL1,350 &2 4 2 1`08` S< ACE,0ɋ8` `ύ&'0`e1i1`,07 ,ߍҩҭҍ )  `_ҩҩ,,,8`H)ҩh `#,ҍ ҩ(ҥA,ҩҩ`jj)?j)`Ң`H?ʎ @  0h ``@@B,~-32@3452453c24` ɔ FNot SpartaDOS disketteLɢ FDisk fullLɪ FFile not foundLɣ FIllegal wildcard in nameLɘ FNot binary fileLɤ FFile erase protectedLɕ FNot version II disketteLɩ FDisk write lockedLɖ FDirectory not foundLɀ FBreak AbortLɐ% FWrite protected or bad sectorLɥ FFile name errorLɨ FFunction not supportedLɧ FCan't delete fileLɗ FFile existsL` w  w(0   0a Y©ÍYh   N Y©  NΟ`L 8L`@D , ̍̍)̝BJJJJJ ̝D̝E0 KJ)̝JJJ)̝H̝I D@   Ϭ,0),~  FError -- L`(),! *+  -"#$./0_@ @CA똩)*K HJJJJ 9h) 0:iLhWhXWXͭ LNͭXHWH`, Nnn ͠H͎͌͢ͽ `Mܩ,0 N ͭO` P..*N  . 0PH0  ʩ `$%` Π vAG) ..ܭ` 7`  7`L @ ύ  ύ 乀` Ω* #* Z 0DLϠ ̠ ̭0L0f 0  LϮ Lϭ  /A ̠ LL~υCυD. yϠC  y 婛蝀`ȹ  ` ̢0 8̽ H̽I̠0 (ʢ 0L *)L* *M @ L ( `L(= # , 魗  筙`( L#() LLL I0   䍠 e , ʎi 0L CL] 0G   KQ;`) x뭤B L  ,  ,)ߍ "LLL  ,] 0 # K ح)  "L  밻) 멀 "L` ,L  Ld͙Lj魗  Lj$H0Ld88A e , s eECFD8  8  9L H ,C]Dah LꭖCD L譔  魙8L LL$H0 s ,LxECFD  鬙 9L謓CCC)` L_CC C`C`C`  EFL뭔 K`8mi` /L9 Z"C X `L ꭔ C8 CDC}TCȱC}UC`  eCCD`  _C``Ipi ͟? x0,)C) `II  08` CL # , 魗 `1@R H0>h0   * HH 0hh`hh,L L { P*)0 0*`*)& K9:*$+0;QG` {!*B sﭟͻͼ/ P {0*)((a,,,L ) *)  I0 , *)  I  0 I  K 䍝 ,) *I *c 0L U*) 0 @`L,0 K) MﭝI $ 0 zz  G L  Z v #(> sL L,0`H hɛ ,'L0,L P*H * {0h*L04*  0 )L Lq * { M {0Y) *LJ, -* { M {0 ,  ,) LkL, LLLL: * {, (] 0 # K M {0 LL8*  * 0I LL,H ) ") čɍҍ)*LB 0 ͠E 0)  0  63# ͌;QL   ͩ: ͭ ͩ: ͭ ͩa p ͩmLͭ ͩ- ͭ ͩ- ͭ L͢$ ` 6(ȭ(Ȣ(((ȭ(ȭ(` ȱCL,~LL # wL ʈ`1N@ 1!@1S@@8` v P  > Ȣ L >(ȩ(` (H(h `*$/ȱ$Aȩ *$$ `2Kd}j #H 0K 08}  )L ,08J mHh 8Jm , 3m L  8 L iL?EF,L譞)  #T 0N 0   Q 0` >$H s L)L  CȭC _ 1 /͓ hL\ s)H   EF 묓 hL\ KL\FА֐#eCCD$H0CELW `abcdefghijklmnopqrstuvwxyz{|}~EC$H _8m䍖L ``H譞=L `   hC̓ _`LK8EmEF8m䍚 W 0`8`8`CȱC`CȱC`  hCD ` / ?䭒,06/O)͒/?}` &O`)8O,0, } ,0} 8,0 8JHjmChmD`H)h)/ ?  &CD8 ` ` i͓ L?CC, CȭC CȭC _L 3 `),)   C&̓ͬ L,L   X,}T}U` .C   I1CC`   CC,0  L4L@ٯ` N j  ,0 z` _)8j`m K`, HJjhj`, H**hJ`_/]^/` 0 `y"U a ې;ݒ- ;m ; - ;  ]!K`Z6<` 2 @ ɛ  `  8)ɀɛ ȹ`COPLOASAVAPPENCWERASRENAMCREDIDELDICARUPRINTYPDIDIRMEPAUSVERIFBOOCHKDSPROTECUNPROTECLOCUNLOCXDIAINI?DIBASITIMDATTKE,,,,L̩` FFormat: Are you sure? )_H hY L W,P` 7l FNo cartridge` ̭8 F Volume:  ͭ   0ͩ   0 F͛Bytes/sector: 0 F͛ Total bytes:  l F͛ Bytes free:  lͭ ( F͛ Write lock: ,!0 FOFFL FONL  , ̠ 0  BLL `LX  ΍ 7 PL\l FPress any key to continue L FMemlo: $ 0ͭ 0 F Memhi: $ 0ͭ 0ͩL ̠ ̠L M)MӍӌj E L ̭O NF FParameter ErrorL` *L *L  FCurrent date is   F͛Enter new date: - 3_ɛX KJLL  FCurrent time is  F͛Enter new time: : 3 ɛ F`ɛ )_PAϩ, mJ  J JLO WMJ`:8`M {)pM mM iM {`ȹ 0:`8`L ` 7 VL\ 7 L\%H$H`LPLI L2 X  UD1:autorun.sysstartup.batQ*.*.COM.BATD1:Volume: Directory: FREE SECTORS LI z)͒}`HYP.DOC SS TД$2r@"̘1e CM;iذAM17p9eʸf6ap wdH'̚4nl7ldƨ:禘:91udpᠤC'Ϧ9m,o :c7X`… FXbӜ*9|+oxt$ l'3Mc)&ca߀:]o% M;$qeiF (G[G͑nj( n ]&cI$E᷒]-5NDP0M7 aQlmHwlr#SȣcQR%GUs@JiUaeBT*%yvXVG%d^$pTڑD>uЛ݁zo٠UZjRyU$ c%][y@N1M ŒzA'mh&$W1ڇ\αFx;mR`a۪5PeZC_ҩyo|(JFanfRDB9P @Cؠ. 2fsqxx]=hhzUMItFS2hQO^NotU@MkpWWy[HNzG@>1V]}V;CHDwƊmal]8 ECSl qbZ0B9jU[]%E=jqXbF!%M T[M sAB:s!(7O7Xju9F(qTn zErX[1UdEYmWdE dFbIiO@N{U1*(QnUtN_LqRSG]ij)ToNME@oEv-}Qt+̑:%`eVjjׄ"4 O(([L𔶑`ҲE'OE;NC؀$|[ mH@ЗoA0V2AY(!*cF2!JbUg9}0;/xu6= Ұ"GQd7r^8ǭA?Z!$$8JRh>wY-{@[a(Ck&`ECXw*P\;e"H=u!D{/@ W0+זk돳ruV&[-?rv h\- n g\v2dqӠL.zJ0WD8 A ^| }]mfbpȯZ2ғTzŸ:6 l*MC A|x nAN>\ 6H0\'"h"h\0\ H ChȘ8ڄ Jک[2 ʩۤ㘤| KHKH|yU`0 \LD0 DLBS[\U IS*8eUc Dc` CU\` DU I Dȹ\[S`SЩ` D D ^ANYA He؅ؐ٭8 J2 ʩ D D DmL!H؍:@ٍK@`8Hתh` nA,UL=EM `҅e窥Ӆe`؅م`\< `H Ih\ aA: `R @>LʩiOLTiLD :I< @\ LD H IB} D0 V0~ H$p H D YJ8ب  ũ J J ֪ JLDLG GI ^AS D fD-LB \`@,0J JH h J A隥ɉLB H I$p 0Dҥ ئ٥ԅإՅي@8 J I J lJ D< FL J IѤ JЕHe؅ҽIeمӊH Jh BHHKީ BHH8بLPHH B H҅ӆ MK e*@e;@8H٪h ALʩ_Ii8ҥӥ؅eޥمeߠ MK *@;@8Hh *@;@`H@*hJL@L!@O\ aA\ H $@ DL J~ `}   ADLBPSTVX}RCClCCCCCHCHHD@@CCCB\D7DC{DmDGG&B_E^EEFFFFEFFG/GGEDGFHFIG^K(I9I^KGII5I4IDHFFGSG@IJnIrK&@  @)@LLLLLLLLLULTL_LTLFc L gM i[ȱ!. MV,`Hchc` LcBʆ VLL L膽 [LL$0XHH$P0Y*@Y;@ƅ ^hb! ^ȹb  AT #h ^Y ^` Y T :T8cL@ح`\!. MPȹ[ɛ`P ȹ[ɛPP`Ȣ) ^()` ^ ^`ʍMNM,ߥ.N`N[8eߪ٤`ԥNJ`.N/Nhh Ml24RABQAWQBA!RBI9RBYSCLTDCSDSESECNaEJQENGTESMaHELbIBRINVIWRLCQLLQLORLSQMCSMDaME#bMGQOCQORpSOSQOU^PRQSBSVAQWOR-9=MQUYiy}BCCBCSBEQBGEBLTBMI0BNEBPLBRABVCPBVSpADCANDASLBIT#CMP(COP7CPX8CPY;DEC>EORCINCRJMLYJMPWJSL[JSR]LDA_LDXnLDYsLSRxORA}PEAPEIREPROLRORSBCSEPSTASTXSTYSTZTRBTSBrqaseucim}ygwo21!3%5#)-=9'7/? $4,<:RQASEUCIM]YGWO_l|L\" FVN^J &6.>*fvn~j⒑dt    BRKCLCCLDCLIXCLVDEXDEYINXINYNOPPHAHPHBPHD PHKKPHPPHXPHYZPLAhPLBPLD+PLP(PLXPLYzRTI@RTLkRTS`SEC8SEDSEIxSTPTAXTAYTCD[TCSTDC{TSC;TSXTXATXSTXYTYATYXWAIWDMBXBAXCE%)]iy ^\"ȹ\P " ^LU)? ^ ^ \ɛ[ \؈ ^LULU$P  LU膚膝膞륛 i_֩,H ]hL X ]LUH) ]h`҅إӅ @ _ @1$؅ȱ؅ T 7Y(70519&ʈeeȑ +_ئ /_ QS =_-Hؐii X槥ҥӐh؅ҥم BT/ zS M [H Xh zS QS _LUuu` S Tѥ $P 7YH +RhעL[` SLU ] S Mʆޢ+ ] MP LLU"'ˍSP\' SP)` @ eeLX\ `ҥӢAL $P :T Y L$pLU$0? -PASS-Q _ T 9^ b iY yYL@ _ rLULricحc i[ȱ2ȱ0:? b@Q b\@ \ Not FoundL@Icحlc٥؍icٍc ^ M : b i_ɆΆφ­é҅Ӆ녚@…إÅ٢̆_hhHH…ҥÅ BTʅ̥˅͢B`hh٥H YhLU Y hb͠ 0 ~[ٍYH؍YH/ \ Lɀ LU$p ,L[`YY Y̅ʥͅ漥҅¥Ӆå…إÅ @ @L}UɆ A ]\  M c`LU\@\ +Z rM=.3 M LLU M +R\H) [h؅م /TК_x\B: M2 MNeH ]h XH hE$h LLhWh06\Y3)N MLW\)lQʩMP M P XLUL_2JJ5P00}N|O X ](xǽNXlYhd [L LLU MxXJ,PPP\?K#(Ȣ< >!F [ c` XὤPHH Xhh8 [A ]Ȣ ̢ [(LW,b H ]h X88堅塅ЛЗD,T X ]H M ] XhLhWi,؆JJ8 wPH5P)VPHyNh  L{OH$P;09*" >Y YLX ^ihH ^06h $h` ^Ħ뵠 ^-L^hZY ^`0̦LmYΦυH ]h` YH, ^h ^ ^L^HLYHLYH$Pp0njc^ >Y ^ ^Y ^ة٢Y/ H ^h ^ɛ ^hɆ`䥳 2[g B[ U[LXZ 2[ Y]^ J[ȹ\?@ȹ\) ] _ L8` \ LȐ`mi8 ޅ߅ L8` _8H٪h # Zȹ! .)iج!}GcGcjcؘ8؅م`\!]^`\.L7[]^`]^`\`ȱ.!8ȱe؅ؐ`ȆPLL [8\ `\`ȹ\-#< >^7HȢ [h` [8*ȹ[܈ $\      [ #& $\\ {8`\' b@) b6 )eHeehJ&&& b2`$$%*1`&&) b`"$0\!. ?)iGcؽjc٦\!.?Hh `[ `[ `[ `[\ ]Șʆज़ L`.ٽ! ! !.!𮥴Ъȱ)$0C i[L$]$05ȱ! ^ ^. ^ (^äؙ8` BYL] [,` [LL. /]`8`ȱȱ`ȱŻȱż`ȱŹȱź`  - Label File -Icحlc٢ ^ȱL^ȱ0 ? i[La^ Me= ^ M i[ ^$Ű ^ ,H0 Ĭh`HJJJJ ^h) 0:iإ@ @  X_LU "YWM2.qHqh8ȑȑ@ B U_ȑȥȥ` E BT r dL@!Gcjcȑ`@U ]$ ^ ^ ZL^_ c`ʥH) \h LLU\ ^  LY`HH M1( M'\) H [hHȹhԢ Yh؍YhٍYHH泥  LLL_V`ߪ\ݸ`ߦ`0 Mhh`H`H`   #&),/258;>,X,X),S,S),Y]],Y.ME.MD.ENBRLPERMVPMVNIFEIFNIFPIFMSET***.ENaaFTHXKXuXxX!a-a6a=aRaaFTLULU EaLU Ea Ea0 Ea0愶 S`膸LU [LS , LLU M=HH M Shh٤؈LU  LLU沥hhHȑ؈HLULY`Q\( LL+b M4)0 [ +ZȽ0 rMLaйLU\PƳ0 ƹƺhhLU LLUP \ L X ML0ɗɈ IƩ` bLZM}LĬح8` b/L^ b AG6`ȹ\0:`!R!)2.մ|4VYd)Zch h+hh*D@67+)? 4."0/-+ ) LL*Lɳ *HH Xl +H-,.(`.-,`T  ,A X Y NV-BDIZC SP ;*Hh0 H* Ĭ ߥ [L\R@PH #S S) h  D  J j Y0!mm   (`'(L`*hihHiHLȱ` ¬ 5 ";I "ɭ>! 0 )?;hhU ? Ĭ X ¬* F ݏ0Š LH;9 ~ ¬8 粰 L !X ¬ 粍 [} LH*L@'`( [L7l()d)_}Rh+hihioHhȱV } h+8ɭ HH L ة 0 L h+ة *LLkee`L; 6!7 tE L ǴRl # 0` '\ %ș ș0%   z `\ \ɛ` 6  z %`  %\\\ ,`*ޢ [=\, 6` 8` ⵐ AG6`0:` HH `L; ȵ * H h̬ ¬ u`   }LĬ$e`   ȵe  :  û   ûɛ $ {. Ĭ }67Ln S\* = *Ϣ C 6ݎ0-  L; 10꘤ 6/L6SPYXA@ -` @ 6L\`"Н`  -  cH  h[&*i? Ĭ   Ĭ Ĭ`iee L J J") JJJJJ))) JJJ Ȉ`H ȷh8UL@E@ 0"E3@ @E3@ @E@ "D3ЌD"D3ЌD"D3@ "D3@ bx!YMJ,),#($YX$$#]#)i#$S#$S[[i$$)|mi)S4i#bZH&bTDThDt(ntJrtttrDh2"&&rr&HDDȢʎʎ "` 0[.\0 \]\ uTH 7hTT& ~ ¬ U F .-*Ц uL 蝬$ʎ  z Y`` 62ee Y` z Y` 8+H\ ۭhH h?  eeL W 6Ȅ ۭ / %  dL;BDEiHiI  L0 Џ Lt`8`e ei`H ûh` ȵ  !"#$%&'(- New since version .9 -A long standing buf which could trash the Esc menu has been fixed.The TAB compression could sometimes mess up .BY statements with ASCIIstrings.The debugger is now ZP clean, so all of ZP is available for the user.A faster version of the Hyper_E screen accelerator is included.- New since version .8 -Several intermediate versions were released, from .81 to .84. Dependingupon which version you had, some or all of these changes may already havebeen in place.Fixed problems in the startup code, that could cause crashes eitherstarting the assembler, or returning to it from DOS.The debugger crashed when giving an address in the I command.The RTI instruction was not traced correctly in the debugger. This bug hasbeen here for almost 10 years! I guess in all that time, I never had anoccasion to trace through an RTI.Fixed problems with extra CR's in the assembly listing. Note that the onlyway to send assembly listings to the printer right now, is by using I/Oredirection through DOS, or you can use the 'O P:' command from the monitor.I'll provide an option in the Esc Menu in the future.The editor functions for label searching, and 'JSR', did not work when thesource was entered in lower case.Raw files loaded with the .BI command were not handled properly whenassembling to disk.Changed the editor Save command to remain in the menu, making it easier toassemble or load another file witout having to bring up the menu again.Documentation for the SET directive was incorrect. It is describedcorrectly later in this file.h*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg- Release notes for v.91 -This is almost, but not quite complete. I'm still working on some changesto the debugger, and for now, an older version is included with theassembler. This version resides entirely in main system RAM, whichpartially undermines the fact that the rest of the package is designed tofit mostly in bank select memory. Thus, this version takes up almost 5Kof system RAM, whereas the final version will only require 1-2K.Note for non-SpartaDOS users. The MAE.COM file does not have a DOS II runaddress appended to it, and so it will not automatically run as is.However, I have included a file called RUNAD.OBJ that you should appendonto the end of the MAE.COM file in order to make the assembler auto-run.The RUNAD wasn't included in the file, because it can mess up the automaticreturn to the program from SpartaDOS using the RUN command. I feel it isvery important to be able to easily switch to DOS and back without losinganything. To return to the assembler from any non-Sparta DOS, you can runat the address $A900.Another note for non-Sparta users. The assembler picks up the currentdrive number from the SpartaDOS variable structure. An attempt has beenmade to bypass this step for non-Sparta DOSes, but I don't know for sureif it will work in all cases. Worst case, you will find the default driveset to something other than what is stored in the configure section. Thiscan easily be reset from the assembler menu.Please report any and all bugs and suggestions. I can be reached on GEnieat J.HARRIS32, or on internet at jharris@cup.portal.com. Moreconventional access is available at:John Harris45346 Graceway Dr.Ahwahnee, CA 93601(209)683-3412On to the assembler...- STRENGTHS -Excellent full screen editor with many features such as key macros,automatic 'JSR' and return to subroutine labels, block moves and copies,multiple undo.XEP80 compatable.High level of integration between editor-assembler-debugger. The editorcan take you directly to lines that had assembly errors. The debugger canreference labels in the symbol table and assemble single program lines.Very user friendly -- it will save you a lot of typing. (Now, if I couldhave just gotten it to type this DOC file for me. Sigh...)Local labels referenced between global labels.Can assemble directly to bank select memory or bank select cartridges.Uses very little system RAM. Most of the code resides in bank selectmemory.Full 65816 and 24 bit support.- WEAKNESSES -Simple implementation of macro ability, compared with Mac/65 or other moreadvanced macro assemblers. Only expression values can be passed asparameters.Slower assembly speed than Mac/65 -- especially with large source files.There are a few things that can partly offset this though. You can startthe assembly at Pass 2 if no changes have been made that effect the symboltable values. This can more than double the assembly speed in thesecases. You can also include binary files within the assembly, forpre-assembled code or data segments. If you program in a modular fashion,avoiding the constant reassembly of large unchanged portions of code, youwill of course completely avoid any speed problems.I don't know how many people I may have scared at this point. Thisassembler is not depressingly slow. It takes 45 seconds to assembleitself, and while Mac/65 could do it in 10 seconds, I would spend a wholelot more than 35 seconds fighting with its inept editor. I prefer to ratethe speed of a development system in terms of how long it would take towrite a program with it. In this regard, I don't think this assembler canbe beat. Enough of defending this product. I'm proud of it the way itis, and I hope you'll enjoy using it.- MEMORY USAGE -This assembler is designed to run in one bank of the extended memoryavailable on the 130XE or other memory expanded Atari. This bank numberis configurable. A portion of the assembler must reside outside of bankselect RAM, and in this version, it will occupy $A900-$BBFC. Memory usagefor the source file and symbol table is also configurable. In addition,memory for the symbol table will use bank select RAM when the addressesare within the $4000-$7FFF range, while memory for the source file willalways be in normal system RAM. This allows memory for the source fileand symbol table to overlap, and gives you the largest possible freememory buffer. Having the symbol table in bank select RAM has one otherbenefit. It will usually stay intact so that the labels can be used fromthe debugger. The default values for memory usage are to place the symboltable from $6400-$7FFF and the source buffer from LOMEM to $A8FF. Thefile ED.DOC has specific instructions about changing the memoryconfigurations.Zero page memory is saved and restored from the editor and assembler, sothat they will effectively leave all of ZP available to the user.All three modules use a $100 byte buffer in low memory that is currentlyat $400-$4FF. Please contact me if these locations conflict with yoursetup, and I can assemble a version that uses a different area.When assembling to disk files, a $100 byte buffer is used for disk I/O.The location of this buffer is configurable, as described in ED.DOC, andis currently set to use $500-$5FF.- EXPRESSIONS -Expressions can be made from decimal numbers, hex numbers by using "$",binary numbers by using "%", single ASCII characters with a "'" (singlequote), and label names.Any of these values can be mixed with math operators +-*/, ! (bitwiseOR), & (bitwise AND), and unary -. The | vertical bar can be used inplace of !.There are also special operators that refer to the low byte, high byte,and bank byte (24 bit highest byte) of the calculated expression. Theseoperators are <, >, and ^.There is no operator precedence. All math is evaluated left to right,with the exception of <, >, and ^, which are done after the rest of theexpression has been evaluated.Examples of valid expressions: LDA #-1 ;= $FF LDA #'A-$20 ;= $21 LDA #%101&3 ;= 1 LDA #>$1234+1 ;= $12 LDA #^$123456 ;= $12 LDA #>$123456 ;= $34 (mid byte)All of these expression types can be used in .BY statements as well.Like:LOWS .BY LABEL1 >LABEL2 >LABEL3 .BY 15+3!%1000 etc...- LABELS -The first character of a label may be any letter, or the symbols @, \, _,or ?. All remaining characters may also include numbers plus the symbols., :, ;, <, =, >, and ^. Labels may be up to 15 characters long.Label names, and for that matter all text entered with the assembler, canbe entered in upper or lower case. Labels are not case-sensitive.When the first character of a label is '?', the label is a 'local label'.Locals are defined only in the source code segment between two global(i.e. non-local) labels. References to local labels cannot cross aglobal label definition.Internally, the assembler creates local labels by appending the local ontothe end of the previous global label. Thus in the following code segment:DELAY LDX #100?L DEX BNE ?L'?L' is a local label, and will be entered in the symbol table as DELAY?L.Knowing how the label is stored, allows you to access it from the debuggeror the Esc-V expression evaluator. You can also code a direct referenceto the label DELAY?L if you need to access the local from the other sideof the global label DELAY.Locals are not printed in X-reference or symbol table listings, whichmakes them most useful for simple loop and branch structures where youdon't want to think up unique label names for all occurances.- ADDRESSING MODES -All 6502 and 65816 addressing modes are supported. Any addresses thatevaluate less than $100 will use zero page modes when possibl)ijklmnopqrstuvwxyz{|}~e. Thus,zero page labels must be defined before being used, or assembly errorswill result.There is also a way to force 8 bit, 16 bit, or 24 bit addresses using theoperators <, !, and >. (Yes, I know this is inconsistant with theimmediate operators for low, high and bank bytes -- I didn't write the65816 assembler specifications). This can be really useful for forcingabsolute 16 bit addressing on zero page labels, to add 1 cycle in timecritical applications. For the 65816, it can force direct page addressingfor non-ZP labels, (which of course requires you to move the direct pageregister to the proper page address). All 24 bit addresses must bepreceded by the > character.The operands for the 65816 MVP and MVN instructions should be simple bankbytes -- not full addresses. Ex: MVP $40 $80moves memory from bank $40 to bank $80, using the addresses in X and Y.- PSUEDO OPS -Note that only 2 letters are required, but if additonal letters arepresent they will be truncated without assembly errors. For example, youmay use psuedo ops like '.byte' and '.org'. Personaly, I really likehaving the psuedo ops the same width as all 6502 instructions, and onlyuse 2 letters. .24Sets the symbol table and program counter to use 24 bit addresses.This is only useful for 65816 programs, and may crash your machine if youtry to use it without having a 65816 CPU. .ABThe assembler will generate byte-sized values for accumulator-relatedimmediate constants. (Default) .AWThe assembler will generate word-sized values for accumulator-relatedimmediate constants. This is only useful for 65816 programs. .BA byteFor bank addressing, you can specify an operand to force assemblergenerated object code into bank select RAM. If the operand is >= $80,this value will be stored into location $D301 when storing bytes of objectcode into RAM. Operands less than $80 are placed in the X register, and aSTA $D580,X is performed. This can control certain bank select cartridgedevices. NOTE: For using the second method of bank addressing, theassembler should be able to return the bank select cartridge to normal.There is currently a 'STA $D5DC' for this purpose, but this may not be theright address for your cartridge setup. You should search the disk filefor this instruction, ($8D $DC $D5), and replace it with the appropriateaddress. .BI filenameIncludes the contents of a binary disk file into the assembly. If thisfile does not contain a DOS binary header, it will be assembled as in-linedata at the current PC. Otherwise, a file that contains a header will beloaded at its load address. .BY [+byte] bytes and/or ASCIIStore byte values in memory. ASCII strings can be specified by enclosingthe string in either single or double quotes.If the first character of the operand field is a '+', then the followingbyte will be used as a constant and added to all remaining bytes of theinstruction.Ex: .BY +$80 1 10 $10 'Hello' $9Bwill generate:81 8A 90 C8 E5 EC EC EF 1BValues in .BY statements may also be separated with commas forcompatability with other assemblers.See also .SB which creates ATASCII screen codes. .CLClose output object code file. When using the .OU psuedo op to createobject code files on disk, the file will normally be closed at the end ofassembly. However, if you wish to close the file before that, it can beforced closed with the .CL psuedo op. You may use this to create multipleoutput files in one assembly, or to place something in RAM in addition tothe disk file. .DC word byteDefine constant-filled block. This will fill an area of size 'word' withthe constant 'byte'. .DS wordDefine storage. This will reserve an area of storage equal to size'word'. .ECDo not display macro generated code in the assembly listing. Only themacro call itself will appear. .EJEject -- Send a form feed code to eject the page in an assembly listing. .ENMark End of assembly. This psuedo op *must* be present to end theassembly, or an error will result. .ESDisplay the code resulting from Macro expansions. .HE hex bytesStore hex bytes in memory. This is a convenient method to enter stringsof hex bytes, since it does not require the use of the '$' character. Thebytes are still separated by spaces however, which I feel makes a muchmore readable layout than the 'all run together' form of hex statementthat some other assemblers use. Example: .HE 0 55 AA FF .IBThe assembler will generate byte-sized values for index register-relatedimmediate constants. (Default) .IWThe assembler will generate word-sized values for index register-relatedimmediate constants. This is only useful for 65816 programs. .IN filenameInclude additional files in the assembly. Only the main source file cancontain .IN psuedo ops. You cannot nest them. Default drive processingworks the same here as it does when loading files from the editor, and soyou will usually not need any 'Dn:' types of filespecs. The file nameonly should be sufficient. .LCTurn off (clear) the display of the assembly listing. (Default) .LLDisplay the assembly listing on this line only, even if the full listingis turned off. This can be extremely handy to display the program countervalue at important positions in the source file. .LO longStores a longword, 3 byte value in memory. Only one operand is supported. .LSTurn on (set) the display of the assembly listing. .MC adrMove Code to a different address when storing object code in memory. Thisis in case the .OR assembly address conficts with something already atthat location in memory.!!!name .MD ([label1] [label2]...)Begin macro definition. Described in a separate section. .MEEnd macro definiton. .MGMark the current .IN include file as Macro Global. This keeps this filein memory thruought the assembly, which is required if the file containsmacros that are referenced in other .IN files. .OCTurn off (clear) the storing of object code in memory. .OR adrSets the origin address for the assembly.Note: If there is a label on this line, it will be given the value of thenew origin. This is not the same as in Mac/65 which could use its origindirective to reserve space (*= *+1). You should use the .DS psuedo op forreserving space. .OSTurn on (set) the storing of object code in memory. (Default) .OU filenameCreate an output disk file for the object code. Regretfully, this file ismade up of individual 256 byte segments much like Mac/65 does. Iapologize for the laziness here on my part, but it realy was a lot easierto do this way. You will need to run some type of strip program tode-segment the file. The .OU psuedo op should be placed above the first.OR psuedo op. .PR "text"Print a text message to the screen on pass 1 of the assembly. This isgenerally used with the .VA psuedo op when prompting for values to beentered from the keyboard. .SB [+byte] bytes and/or ASCIIThis is in the same format as the .BY psuedo op, except that it willconvert all bytes into ATASCII screen codes before storing them. TheATASCII conversion is done before any constant is added with the '+'modifier.label .VAWill print a '?', and then accept input from the keyboard. You may enterany value, which will be given to the label in front of the .VA. .WO wordStores a word in memory. Only one operand is supported. SET label = expressionSet the specified label to a new value. This instruction allows a labelto be redefined with different values during the assembly. Any label canbe SET.- CONDITIONAL ASSEMBLY -There are four conditional instructions IFE, IFN, IFP, and IFM,h thatrepresent conditional assembly if Equal, Not equal, Positive, and Minus.The operand of the IF instruction will be evaluated, and if the processorstatus codes match the type of IF statement, then the source codefollowing the IF will be assembled. Mark the end of the conditional blockof code with the psuedo op '***'. (*** is like an ENDIF statement).There is no 'ELSE' instruction, and so you must use complimenting IFstatements.Examples: IFN FLAG . ;This block of . ;code gets asm'ed . ;when FLAG <> 0 *** IFE FLAG . ;This block does . ;when FLAG=0 *** IFN FLAG1!FLAG2 . ;asm'ed if FLAG1 . ;or FLAG2 <> 0 IFE WIDTH-40 . ;This gets asm'ed . ;when width=40 *** IFM WIDTH-40 . ;asm'ed if WIDTH . ;less than 40 *** IFP WIDTH-40 . ;if WIDTH greater . ;or equal to 40- MACROS -Macros must be defined before they are used in your source. Thedefinition looks like this:!!!name .MD ([label1] [label2]...)Where 'name' is the name of the macro, and 'label1' etc. are itsparameters. The three exclamation marks are a special macro identifier,and must precede the macro name. The body of the macro definition willfollow, and should be ended with a .ME psuedo op.The number of parameters used when calling the macro must always match thenumber of labels in the definition. When called, these parameters will beplaced into the label names, in order, where they can be used in the bodyof the macro. Parameters can only be expressions -- there is no methodfor passing arbitrary text strings.Macros can pass up to 8 parameters.Any labels defined within a macro must use a special form. Because macroscan be expanded multiple times, a special label type exists to avoiderrors from multiple label definitions. These label types start withthree periods, followed by any normal label name. These special macrolabels will be given unique numbers with each macro expansion to keep themseparate. You can consider them local labels to each macro expansion.Here's an example of a macro to increment a two byte value:!!!IND .MD (LOC) INC LOC BNE ...SKP INC LOC+1...SKP .METo call this macro, you would use: IND $80- ERROR MESSAGES -These are the error messages that can be produced by the assembler. Errormessages are marked with an '!', and also include the source line numberthat they occured on. If you are assembling a single file, or if theerrors occurs in your main file, you will be able to use the editor ^Hcommand to jump directly to the errors. For errors that occur in includedfiles, you will need to load in that portion, and jump to those linenumbers manually using the ^G goto line number command. BRANCHBranch instruction out of range. OPCODEError in opcode field. This can be either a bad 6502 instruction, badpsuedo op, or an undefined macro. DUPDuplicate label definiton. EOFEnd Of File error. All assemblies must end with a .EN psuedo op. Thisshould be in the main source file, not in any included files. This errorcan also occur if a conditional or macro definition is pending at the .EN. UNDEFUndefined label reference. NESTNested definition. IF conditionals may not be nested. .MD macrodefinitions cannot contain additional definitions. OPERANDError in operand field. ADR MODEAddressing mode not spported. BAD LABELBad characters in label name. MACRO OVMacro overflow in either the number of expansions, or level of nestedexpansions. SYM OVSymbol table overfow. PARMSNumber of macro parameters in the call does not match the definition. LABEL MISSINGMissing label on either a SET psuedo op or in an = equate definition.Welcome to the editor version .8 beta. Changes new to this version arelisted at the end of this file.File Format:The editor saves files in straight ATASCII. It can either keep all spacesexpanded, or can use $7F TAB characters to reduce the size of the file.The text can be freely converted between these formats. TAB compressionand expansion is done on a line by line basis while you are editing, whichis different from the way most editors handle TABs. While you are editinga line, TAB characters are not present, and the line will edit in the sameway as if it had only spaces. When the line is saved back into the file,the program will see if it can convert any sequences of spaces into TABs,based on the configured TAB fields. TABs are not rigidly enforced.Meaning, if you slide a comment field a little to the left to make moreroom, that spacing will be retained, and that particular place simply won'tbe TAB converted. Thus, it is simply a manner of saving memory and filespace. The editor will actually run faster with the TAB setting on.Especially with the XEP80.Currently, this editor will not allow lines longer than the right margin.It will allow 79 column lines with the XEP80 device though. Actually, themax line length is one shorter than RMARGN to avoid problems with the E:device sending an extra EOL. Any lines longer than RMARGN-1 will be splitin two. One other problem with the line length should be pointed out.When using the character insert, it is possible to push a character intothe last column on the screen. Please note that this character will NOT besaved as part of the text, and will disappear the next time the editor getsa chance to draw the line. In fact, I had to set LOGCOL equal to RMARGN*2to prevent inserts from doing line wrap.Eventually, I will fix the editor so that it can handle 79 character linesin 40 column mode. My time recently has been spread much thinner thananticipated.Configurtion:The editor has several configurable parameters that can be modified with asector/file editor. These are located at +3 bytes from the start address,+9 counting the DOS binary header. Here they are: (Words are 6502 Lo,Hi)Word - Text buffer start adr. If 0, the editor will use MEMLO. (Default)Word - Text buffer end. If 0, the editor will use MEMTOP. Default $A8FF.Word - Symbol table start adr. Default $6400. This is located just past the part of the assembler that resides in bank select RAM.Word - Symbol table end. Default $7FFF. This configuration puts the symbol table entirely in bank select memory.Word - Address for a 256 byte disk I/O buffer that is used when assembling to disk files. Default is set to $500.Byte - 0=Replace mode, 1=Insert modeByte - 0=Use spaces only, 1=Convert spaces into Tabs.3 Bytes - Tab settings for asm fields.Byte - When drawing the screen for a particular location, such as a Find or Goto command, this byte sets the screen row where the desired line will be located. If you set this to 0, the line will be on the top row. $0C will put the line in the middle of the screen. Default is 6.Byte - # of lines the PgUp & PgDn command will move by. Setting this to $18 gives single screen paging. If you normally use scrolling for short moves, you can set this value to something like $60 to jump through the file in larger steps.Byte - Line length saved in the Undo buffers. Default is 39. You can increase this to 79, if you want entire XEP80 lines saved. You can also decrease this number to something like 25, if you want to increase the number of history buffers without using extra memory. You would only lose the comment field for any restored lines.Byte - # of Undo buffers. This number sets how many lines of history can be undo'ed. Default is 16. Multiplied by the number above, equals the total size needed for undo storage, located at the end of the text buffer.Byte - Sets what bank of extended memory to put the assembler. It shouldbe a value appropriate for the $D301 register. Default is $E7. If you have no bank select memory, this byte should be $FF.String - Default drive and dir spec. Must be in the form Dn:?????, like "D3:*.*", or "D3:*.SRC" if you want dir listings to only show a certain file type. Filenames for loading and saving do not require a full "Dn:" filespec. If you type just a name, it will be prepended with the default drive selected here.The editor begins in the ESC menu. During the session, the ESC key willbring this menu back.Esc Menu Commands:A - Assemble current file. Hold the Shift key when pressing A to turn on the assembly listing.B - Break to the monitor. Actually issues a 00 BRK instruction.D - Go to DOS. If you return to the editor by running at the start address, the source file will still be intact. This is automatic in SpartaDOS by using the RUN command. For other DOSes, you will need to supply the starting address which is currently $A900 as of version .8 beta.L - Load file. You do not need to type an entire filespec. The default drive 'Dn:' will be prepended if the entered name doesn't have a ':'. Press Shift-L to append into an existing file.P - Do Pass 2 only of the assembly. A full assembly must have already been performed, and then this function may be used if the source code was changed in such a way that didn't effect any label addresses. This can save a lot of assembly time, but please do not use it unless you understand what it does and are certain that no label addresses have been changed since the last assembly.S - Save File. Save displays the last loaded filename. Press Return to accept it, or backspace and change. Press Shift-S to save a marked text block. To do this, mark the starting line with ^Z, then move to the ending line and enter the Esc-Shift-S command. To print a file or text block, first make sure to convert the text to spaces only, and then save to P:.T - Tab convert. It will prompt to convert to Tabs or Spaces. Tab converted text will have $7F TAB characters for any sequences of spaces that can be converted. The conversion is done from back to front for best speed, but it can still take awhile. It is also possible to run out of RAM when converting to spaces. After this command is entered, the editor will remain in the specified mode. In other words, if you do a tab convert to spaces, all future entered lines will remain in an expanded space format.V - (Value) Will allow you to enter any expression, and then displays the calculated value in both hex and decimal. This can be handy for getting the value of labels, or as a simple calculator.X - Perform cross reference listing. The source file must already have been assembled with the A command. It allows you to enter a label name to start from, or just press return to create a cross reference for the entire symbol table. Be prepared for this to take awhile. This is a simple implementation that requires a full pass of assembly for each label. Yeah, I know. On the positive side, it doesn't require any memory to build an XRef table, and so generating an XRef on large files should not have any problems running out of memory. Plus, being able to specify label names directly makes it very easy to get a report for one or two labels of immediate interest.1-9 Directory, and set default drive. If you just want to change the default drive without getting a dir listing, press Esc after pressing the desired number.Shift-Clear - Clear text buffer.Editing Commands:Standard Atari editing keys apply, with a few exceptions. Clr & Set Tabhave no eff      !"#$%&'()*+,-.ect. Use the configure bytes to change tabs. Pressing the Capskey without Shift will always set lower case instead of toggling. UseShift-Caps to set upper case.Return will insert a new line if pressed at the end of the current line.Otherwise, it will just move to the line below.S^Up (Shift&Ctl&Up) Scroll upS^Dn Scroll Down. These two commands are handy, because they scroll immediately, without waiting for the cursor to reach the screen's edge.S^< Page up by configurable # of linesS^> Page DownS^Del Delete to end of line^, Start of line^. End of line^T Top of file^B Bottom of file^I - Toggle Insert/Replace mode.^W - (Write) Begin key macro recording. When done, press Esc. Up to 60 keystrokes can be recorded.^E - Execute Macro^K - Prompts for a number, and then will repeat the next entered key that number of times. ^K cannot be used within a macro, but it can be used to execute ^E multiple times.^F - Find text -- not case sensitive. '%' can be used as a wildcard.S^F Find by searching backwards towards the start of the file.^R - Replace. F&R Max length=15. Replace only works forwards. It will ask for a Find string and a Replace string. For all matches of the find string, the editor will display an inverse '>' symbol in front of the occurance. You may press Y to replace it, N to skip it, A to replace all occurances to the end of the text, or Esc to abort.^N - Next. If the previous operation was a replace, then you will be in the prompted replace mode if the string is found. Otherwise, if the previous operation was a Find, then you will simply be taken to the next occurance.^P - Find Previous match, by searching backwards.^G - Goto line number. You can also enter a '+' or '-' as the first character to move a number of lines relative to the current location.^L - Enter a label name, and the editor will jump to where the label is defined. (By searching from the first column only.)^S - Set mark at current location^M - Go to Mark^J - The editor's version of a JSR. It looks at the operand field of the current line, and jumps to where that label is defined. It also sets a mark at the current line so that you can return with a ^H. The use of this function is not limited to JSR instructions. JMPs, branches, even data variable locations can be traced with this command. For any line that contains an operand field, ^J will attempt to find the location where that label is defined.^H - Return to previous position where a ^J command was entered. ^H is also used to jump to locations that gave assembly errors. During the assembly, up to 16 error positions will be remembered.^Z - Set block start.^X - Cut from block start to current line. (Forwards only -- sorry) If you find you want to mark a block backwards, the easiest way to do this, is to set a mark at the current line, then move backwards to the start of the block. Press ^Z, then press ^M to return to where you started, and give the ^X or ^C command. A clear to end of file command can be done by pressing the keys, ^Z, ^B, ^X.^C - Copy text from block start to current line, into the cut buffer. The text is left unchanged.^V - Paste cut buffer at current line.^D - Duplicate line.^U - Undo line deletes, or changed lines. Does not undo block ops.New for version .8:Several bug fixes regarding use with the XEP80. Only one known bugremains, in that you cannot search for the ATASCII TAB character when usingthe XEP80. I am still trying to work this out.Find command is no longer case-sensitive. Although, text in the Replacefield will still be stored in whatever case it was entered in.Documentation for the Replace command was incomplete, and you may not haveknown what to do in the Replace mode. It's now described under ^R above.The ^N next command will continue in replace mode if that was the mostrecent activity.The ^J JSR function is now independant of the ^S and ^M single bookmark. Anew command, ^H, was added to return from JSRs. ^J will also track up to16 levels of subroutine calls now.^H can take you directly to any source lines that contained assemblyerrors.All bookmarks, and marks set from the ^J and error position reporting, willnow auto-adjust to any changes in the source text, so that they will alwayspoint to the correct line in the source file.Page up and page down functions are calculated by screen position now,instead of by cursor position.More bug fixes. As of this release, I haven't noticed any more editorproblems, and I have been typing a lot of code in the last few weeks.While it's still a good idea to be cautious, and make backups of yoursource, previous warnings about the safety of this editor can be toned downa bit. I'm now using it exclusively for all my code.n0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmMonitor version .9 beta. General:Note: 24 bit support, and the full 65816 instruction set are not completedyet.Filenames default to the current drive number which can be changed.(input of 'FILE' = 'D1:FILE') A full filespec will override the default.Non destructive prompt character (.) for ease in full screen editing. Also,the prompt does not interfere with command decoding. If the cursor is movedup to redo a prior command, the '.' does not need to be deleted.Upper and Lower case accepted.Continuous memory displays can be stepped one line at a time with the spacebar. Press 'C' to return to continuous display. ESC, RETURN, or BREAK willstop the display.ALL addresses and data bytes can be entered in HEX (default), in DECIMAL with# (#1234), in binary with % (%10011010), in ASCII with ' ('A) or as a labelcurrently defined in the MAE symbol table with . (.LABEL). Arithmeticoperators +-*/&! can also be used, and will be performed left to right. Anycombination of these can be mixed at any time in a completely free formatscheme, with no limits on length. (Ex: 2000-#256+'W/100) Very little willbe mentioned about this feature later on, but ALL numbers for ALL commandsaccept this versatile entry system.All commands use spaces as delimiters. A '?' indicates a command error.Parameter uses for commands are abbreviated to:adr: a 16 bit address.by: an 8 bit byte. ('by' with numbers indicates a string of bytes.)bit: a 0 or a 1.char: an ASCII character.Quantities in [brackets] are optional parameters. Default values will beused if they are not entered. All non-bracketted values must be entered.Any other upper case characters or symbols should be entered as stated.'Current address' refers to the last displayed or changed address, (plusone), and is separate from the current program counter or PC. COMMANDS: Display Memory. M [adr] [adr][/]Displays hex and ASCII. Displays 24 locations if only 1 parameter. Displaysfrom current adr if no parms. '/' = to $FFFF. The '/' can be used on allother commands as well. Does not display ASCII control characters whenoutput is being sent to an external device. Peek Memory. P adr1 [adr2..] [*]Special memory display that allows multiple addresses to be entered, and onlyprints one byte per address. * causes continuous print of list of addresses.Push Break to abort. Disassemble D [adr]Disassembles memory starting at adr, or the current adr if not entered. IfMAE is resident, the assembly code can be modified using normal screenediting. Single line assembly can be started from scratch by typing,"-adr ." followed by an assembly mnuemonic. (The '.' is necessary). Fromthe single line assembler, you may enter '*' as the first mnuemonic characterto continue disassembly from that address forward. Change Memory. :adr by1 [by2..by8]The change memory command ':' can be entered directly, or edited from thedisplay memory command. Only 8 data bytes will be changed. ASCII Mem Change C adr ASCII STRINGStores ASCII string at adr. Addresses for both change memory commands mayuse * for current address. (ex. C 1000 COMPUTER. :* 9B.) The secondcommand will put a CR after the ASCII string. Display Registers RDisplays 6502 registers in this form: ,A X Y NV-BDIZC SP ;AB 5D FA 10110001 FF 7014 LDA #$00 Change Registers ; register bytesSupports screen editing of R command. Status flags can be modified in bitform. When entering values directly, a comma will skip to the next register,and you don't need to enter all the values. EX: ';55' will change the Aregister to 55. ';,,20' will change Y to 20. Goto G[S] [adr] [*brkpt] [C by] [r by] [Pf bit]Run program at adr, or PC if not entered. At any time during execution, theBreak key will return to the monitor and display the current registers andPC. Use the 'S' option to run code that ends in an RTS. (Note: When usingthe S option, the PC adr in the register display on return is an internaladdress, not the address where the actual RTS or RTI occurred.)A breakpoint will create a return point to the monitor whenever a particularaddress or condition is reached. *brkpt will place a 00 (BRK) at thebreakpoint address. For this reason, breakpoints can not be used forprograms in ROM. A '?' will be printed in this case. The breakpoint mustalso be set at an opcode rather than an operand location so that it willexecute. The rest of the parameters add conditions to the breakpoint.C + by Counts the number of times the breakpoint is reached. Executioncontinues until the BRK is passed the specified number of times. Breakpointscan also test for specific conditions by specifying (r) reg name and (by)byte it must contain in order to BRK. Processor flags can also be tested by'P' + flag character + (bit) for condition. Use the flag characters as inthe register display.The breakpoint will be skipped over until the specific condition is reached.When both count and condition options are used, the count will apply to thenumber of times the condition is met. Execution speed will be slightlyslower than real time in this mode. Actual speed will depend on how oftenthe program is interrupted to check conditions.NOTE: A peculiar bug in the ATARI hardware causes breakpoints to beintermittenly skipped over. When the BRK interrupt occurs, the programcounter+2 is pushed on the stack, but instead of jumping through theinterrupt vector, the OS will occasionally just return to the program atPC+2. This is usually a very rare occurrance, but can happen more often whenusing conditional breakpoints on very small and quick loops, thus BRKinterrupts are occurring very rapidly. It took many years before I was ableto really understand what was going on, and be assured that the problem wasindeed in the computer, and not a bug in the monitor.ADDITIONAL NOTE: This bug does not occur on the '816 processor! Yeeeehaaa!(Thanks John.) Go command examples.G 2000 = Run program at $2000G 4000 *4124 = Run at $4000, and break at $4124G *3100 A'Q = Run at current PC and break at 3100 when A register equals ASCII 'Q'G *4200 C10 PZ1 = Run at PC and break at 4200 the 16th time the zero flag is set Remove Breakpt *Brkpts remove themselves, and replace what was there when the BRK isexecuted. However, in case the program stops at other than the brkpt, * willremove it. This can occur when the Break key is pressed, conditional orcount values are not reached, or when the BRK is set in an operand ratherthan an opcode. Setting a new brkpt with the G command will also remove anunused BRK. Exit to DOS X Return to Assembler A Fill Memory F adr1 adr2 [by1] [by2 by3...]Fill memory with 0 if no data bytes. Otherwise enter 1 byte, or a sequenceof any number of bytes to fill with. Transfer Mem T adr1 adr2 adr3Move memory from adr1 through adr2 to adr3. Handles overlapping moves. Hunt for chars H adr1 adr2 by1 [by2...][!] Hunt for String H adr1 adr2 'ASCII string [!]Hunt memory for ASCII string or string of hex bytes up to length of 60. Use'!' for a wild card to match anything. Realize the number entry system willlet you search for things like "A9 'A", (as in LDA #'A), but not the reverseof this. Entering "'A A9" will put the hunt into full ASCII form, and searchfor the literal string that you typed in. The second example can actually beentered in the form "! 'A A9", using a wild card to avoid the initial 'identifier. For one more example, let's say you wanted to search for a JSRto a MAE defined label. This can be entered as "20 .LABEL .>LABEL/opqrstuvwxyz{|}~". Change wild card % charChange the wild card for the Hunt command to 'char'. This is used in case acharacter in the search string is '%' or HEX 25. Compare mem K adr1 adr2 adr3Compare memory from adr1 to adr2 with memory starting at adr3. Displays alladdresses with differences. DEC to HEX # decimal number [no2...] HEX to DEC $ by1 [by2...]Displays hex values of a string of decimal numbers and vice versa. Change Output O [filespec]Send output to screen and filespec. O by itself returns to just screenoutput. Default drive processing is not done on this command. Fullfilespecs must be entered for disk files. Because of this, other devices donot need a ':'. ('O P' is sufficient to send output to printer) Re-open Editor IOCB EThis is useful for returning to the text screen from a graphics mode, or80-column display, or to reset the screen after changing RAMTOP. The otherIOCB's used are: #3 disk reads, #4 disk writes, and #6 external output. Query MAE symbol table Q adr (Sorry, I was running out of letters)Search the current symbol table for a label that matches the value enteredfor adr. If found, the label will be printed. This is basically the reverseprocedure for symbol table lookup, and as such will only work well when therequested value has only one label associated to it. Trace Instr I [adr]Traces program an instruction at a time. Automatically traces OS calls(including jumps with implied return) as one step. Trace normally works onprograms in ROM, except 'G' and 'R' options as noted below. After each step,the monitor will wait for one of the following keypresses to control thetracing mode:Space - Steps one instruction at a time.C - Continuous trace.D - Disassemble next instructions. Useful for previewing code that you are about to step through. The program counter will remain at its current location.G - Execute all instructions up to current 'D' command listing. Use to quickly execute loops or other structures. First use 'D' to find a spot past the structure, then 'G' will execute everything up to that point. This command puts a Breakpoint at the end position, and therefore cannot be used if the program is in ROM.S - Execute entire subroutine as one step.R - Return from subroutine. Use this command if you are already in a subroutine, and wish to return to the previous level. A BRK will be placed at the instruction the subroutine returns to, and therefore cannot be used for programs in ROM.P - Peek the value of the operand of the current instruction.Q - Perform a Q monitor command on the operand of the current instruction. If the operand value is defined in the current MAE symbol table, the label name will be printed. You can use this on JMP, JSR and branch intructions to get an idea where you're going, and also on any memory references that have you thinking, "What the heck is *that*?"U - Execute the user function.X - Ignore instruction. Skip to the next one without executing.ESC, RETURN, or BREAK exits trace mode. Change Default Drv / 1-8All default drive accesses change to drive number entered, including uses inthe assembler section. The starting default drive number will be the same asthe current SpartaDOS drive. Binary Load L [@adr][-adr] filenameLoad DOS II binary file where it was saved, or at @adr if entered. Prints a'?' if the file is not DOS II format. Loads appended files, but @adr onlyworks on 1st part. -adr loads raw data with no header using a straight CIOtransfer. Both PC and default address are set to the load address. Binary Save S [-]adr1 adr2 [@adr3] [+]fileSave DOS II binary file from adr1 to adr2. If @adr3 is entered, it will beused as the header allowing the file to load in at a different address thanwhere it was saved. Use '-' for a CIO save without header. If + is entered,append to existing file. Directory V [name or spec] (Sorry, I *am* out of letters)Displays disk directory. Default of Dn:*.*. A filespec of D2: = D2:*.* Sector Read R adr sector# [ending sector] Sector Write W adr sector# [ending sector]Direct sector I/O to default drive. Reads single and double density disksautomatically including single density sectors 1-3 of a DD disk. Hex Arithmetic ? by1(+-*/&!)[by2..] (no spaces)Prints hex and decimal values of expression evaluated left to right.Can also be used for ASCII convert. (?'A) User Function U [adr1] [adr2] [adr3]Accepts up to 3 parameters, which will be stored at $F0, $F2, and $F4. $F2and $F4 will be 0 if not entered, while $F0 will have the current address ifnot entered. In addition, the carry flag will be set if no parms. Thenjumps to the end address of the monitor-3. ($BBFD in top of RAM version)User function expects an RTS return.This assembler isn't designed for a 64Kmachine, but it can be configured tooperate in a limited fashion. Becausethe bulk of the code sits at $4000,that will be right in the middle of RAMif you don't have bank select memory.The best you will be able to do, is setthe text buffer from $6400-$A8FF, andthe symbol table from wherever yourLOMEM is up to $3FFF. That will giveyou about 17K for your text buffer.Instructions on how to configure theaddresses, and where they are located,are contained in the file ED.DOC.You will need to use a disk fileeditor to change the configuration.Skipping 9 bytes from the start of thefile, (6 bytes for the binary headerplus 3), you will want to change thefollowing bytes to:00 64 FF A8 00 24 FF 3FYou should also set the Bank selectconfigure byte to $FF, which willcancel the bank selecting.|INNAMEOUTNAMEBLEBUFADRLADRHSTARTLSTARTHENDLSTARTAENDHENDABYTEISTARTLOSTARTHISTARTADENDLOENDHIENDADBYTESSTARDASTARTADHSTARTADLENDADHENDADLOUTFILEB@(o  ;@ ,;@ ,!6-I:,&A!;,5 +5(#Object file unifier by Mike Collins(,(,(!Enter the name of the object file2(Dev:Path\Fn.Ext><@F))(!Enter the name of the target fileP(Dev:Path\Fn.Ext>Z@d @@i((Reading nMM6-?:C:.hhh hEhDhIhHB VýHԽI`,<@:,!!67%@<%@,.>:, 6-%67,.7%@, AŠנś @@( ((Writing (@@ D:UNIFY.BASThe Hyper E: accelerator will doubleyour screen display speed, while takingup only 150 bytes or so of low memory.If you are using a DOS other thanSpartaDOS, it will take up an addtional30 bytes, but that's still a prettysmall amount.The Hyper E: accelerator was originallywritten by Doug Wokoun. I found somecompatability problems with it, andhave released modified versions.There are three versions of the HyperE: screen accelerator in this archive.HYP.COM is the normal version.HYPS.COM includes a routine to set thescreen color to a user defined valueany time the E: device is opened. Thecolor values are preset to $82 and $0Cintensity, and the only way to changethem right now is with a disk fileeditor. The change is almost at theend of the file, and will start withthe bytes, $A9,$82,$8D,$C6,$02.Finally, for the hackers out there, Iincluded version HYP.ROM that can beburned directly into the OS ROM. Thereare a few advantages to this. It won'ttake up any memory. It will accelerateany programs that use the $E400 vectorsdirectly, and there are alot of those.RAM loaded versions will only speed upprograms that use CIO though E:. Alsothe ROM version can be more securesince it doesn't have to worry abouthaving its handlers overwritten in lowmemory.Installation of the ROM version will bedescribed at the end of this file.Use of HYP.COM and HYPS.COM is assimple as loading the program. Hyper Eis relocatable, and will positionitself right above MEMLO. When itinstalls, it will check to see if theE: handler has already been patched, asis the case with SpartaDOS, and if soit will install into the patchedhandler. This allows Hyper E: toremain compatable with Sparta's I/Oredirection abilities. If no patchedhandler is found, Hyper E: will createit's own, along with a DOSINI routineto reinstall it after a system reset.It is possible that Hyper E: may find apatched handler, but be unable tointegrate itself into it. If thishappens, Hyper E: will display themessage, "Can't Install", and you willbe unable to use the program. Pleasecontact me if you see this message, letme know what is running in your system,and I will try to adapt Hyper E:.- ROM version install -The HYP.ROM file is 149 bytes long, andis designed to execute as the start ofthe OS's E: PUT routine. You will needto know the location of this routine inyour particular ROM, as well as a free149 byte area. In my 130XE ROM, the E:PUT routine is at $F2B0, and there isan unused space at $CB65. This iswhere the supplied file is set to work,but it can easily be changed to otherlocations.The first step is to copy the ROM imageto someplace in RAM, and then find 149bytes of space that you can use. Youcan try searching for a long string of0's. The HYP.ROM file has a loadaddress of $4B65. If you have movedthe ROM down to $4000, and have freespace at $CB65/$4B65, you may simplyload the binary file HYP.ROM.Otherwise, use whatever method you arecomfortable with to place the contentsof the HYP.ROM file into your emptyspace area. The code is relocatable,so you do not have to worry aboutmoving it.Next, the existing PUT routine needs tobe changed to jump to this new code.Right now, the first instruction of thePUT should be "STA $2FB". This needsto be changed to a JMP to the new codewe just loaded. The first instructionof HYP.ROM is "STA $2FB", so that willtake the place of the existing one thatyou are about to overwrite. The bytevalues you want to store, are $4C, thenthe low byte of HYP.ROM, and then thehigh byte. In my example, these byteswould be $4C, $65, $CB. (Make sure youuse the upper ROM address like '$CB',and not the '$4B' temporary RAMaddress!)The final step is a JMP instrustionback to the OS ROM. The JMP is locatedin the HYP.ROM code, $26 bytes from thebeginning. In our example, that wouldbe location $4B8B. This JMP needs to