@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu  } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED736 FREE SECTORS COPYING---D1:DIRECK.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 138ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ;.TITLE "YAU: Yet Another Uudecoder";.TAB 8,14,20*=$3000;; .INCLUDE D2:SYSEQU.ASM;------------------------------------T}-----------------------; .PAGE "OSS SYSTEM EQUATES FOR ATARI";; FILE = #DN:SYSEQU.ASM;;; I/O CONTROL BLOCK EQUATES;SU}AVEPC=*; SAVE CURRENT ORG;*=$0340; START OF SYSTEM IOCBSIOCB;ICHID*=*+1; DEVICE HANDLER IS (SET BY OS)ICDNOV}*=*+1; DEVICE NUMBER (SET BY OS)ICCOM*=*+1; I/O COMMANDICSTA*=*+1; I/O STATUSICBADR*=*+2; BUFFER ADDRESSICPW}UT*=*+2; DH PUT ROUTINE (ADR-1)ICBLEN*=*+2; BUFFER LENGTHICAUX1*=*+1; AUX 1ICAUX2*=*+1; AUX 2ICAUX3*=*X}+1; AUX 3ICAUX4*=*+1; AUX 4ICAUX5*=*+1; AUX 5ICAUX6*=*+1; AUX 6;IOCBLEN=*-IOCB; LENGTH OF ONE IOCB;; IY}OCB COMMAND VALUE EQUATES;COPN=3; OPENCGBINR=7; GET BINARY RECORDCGTXTR=5; GET TEXT RECORDCPBINR=11; PUT BINZ}ARY RECORDCPTXTR=9; PUT TEXT RECORDCCLOSE=12; CLOSE CSTAT=13; GET STATUS;; DEVICE DEPENDENT COMMAND EQUATES FOR[} FILE MANAGER;CREN=32; RENAMECERA=33; ERASECPRO=35; PROTECTCUNP=36; UNPROTECTCPOINT=37; POINTCNOTE=38\}; NOTE;; AUX1 VALUES REQD FOR OPEN;OPIN=4; OPEN INPUTOPOUT=8; OPEN OUTPUTOPUPD=12; OPEN UPDATEOPAPND=9; O]}PEN APPENDOPDIR=6; OPEN DIRECTORY;; .PAGE;; EXECUTE FLAG DEFINES;EXCYES=$80; EXECUTE IN PROGRESSEXCSCR=$40^}; ECHO EXCUTE INPUT TO SCREENEXCNEW=$10; EXECUTE START UP MODEEXCSUP=$20; COLD START EXEC FLAG;; MISC ADDRESS EQUA_}TES;CPALOC=$0A; POINTER TO CP/AWARMST=$08; WARM START (0=COLD)MEMLO=$2E7; AVAIL MEM (LOW) PTRMEMTOP=$2E5; AV`}AIL MEM (HIGH) PTRAPPMHI=$0E; UPPER LIMIT OF APPLICATION MEMORYINITADR=$2E2; ATARI LOAD/INIT ADRGOADR=$2E0; ATARIa} LOAD/GO ADRCARTLOC=$BFFA; CARTRIDGE RUN LOCATIONCIO=$E456; CIO ENTRY ADREOL=$9B; END OF LINE CHAR;; Character b}defs from sysmac.sml;ATCLR=$7D;CLEAR SCREEN CHARACTERATRUB=$7E;BACK SPACE (RUBOUT)ATTAB=$7F;TABATEOL=$9B;ENDc}-OF-LINEATBEL=$FD;CONSOLE BELLATURW=$1C;UP-ARROWATDRW=$1D;DOWN-ARROWATLRW=$1E;LEFT-ARROWATRRW=$1F;RIGHT-Ad}RROWspace=$20;; CP/A FUNCTION AND VALUE DISPLACEMSNT; (INDIRECT THROUGH CPALOC); IE. (CPALOC),Y;CPGNFe}N=3; GET NEXT FILE NAMECPDFDV=$07; DEFAULT DRIVE (3 BYTES)CPBUFP=$0A; CMD BUFF NEXT CHAR POINTR (1 BYTE)CPEXFL=f}$0B; EXECUTE FLAGCPEXFN=$0C; EXECUTE FILE NAME (16 BYTES)CPEXNP=$1C; EXECUTE NOTE/POINT VALUESCPFNAM=$21; FILENAg}ME BUFFERRUNLOC=$3D; CP/A LOAD/RUN ADRCPCMDB=$3F; COMMAND BUFFER (60 BYTES);CPCMDGO=-6; CP SUBROUTINE VECTOR;h}*=SAVEPC; RESTORE PC;;-----------------------------------------------------------;; .page"Page zero"zpc=$80; page i}zero pcspc1=**=zpccmdptr:.blkb2; pointer to cmd linebinp:.blkb2; pointer into binary bufstrptr:.blkb2dbgptj}r:.blkb2; end of page zero defszpc1=**=spc1;; fp defs;fr0=$D4fr1=$E0flptr=$FCinbuff=$F3cix=$F2;fk}asc=$D8E6; fp -> asciiifp=$D9AA; int -> fpfadd=$DA66; fr0 + fr1 -> fr0fmul=$DADB; fr0 * fr1 -> fr0fmove=$DDl}B6; fr0 -> fr1;; .PAGE "Data defs";inf=$10; input fileoutf=$20; output file;*=$3000JMPSTART; in case goadm}r ignored;; binary buffering stuff; binary buf size must be a ; multiple of 256;BINMAX=8192; how much binary to buffn}er upBINBUF:.blkbBINMAXBINSIZE: .word0BINEMPTY: .byte1;nbytes:.byte0,0,0; 3 ought to be big enoughchksum:.byteo}0,0; ones comp checksum;; debug flag;debug:.byte0;; Debug code;; char in A out to tty;;; debug code;.byte0p}dbgchr:stadbgchr-1tyaphatxaphaldx#0txatayjsrSETLENlda#CPBINRSTAICCOM,Xldadbgchr-1JSRCIOplq}ataxplatayrts;; dump a str, ptr in x,y, terminated by 0.; preserves A;dbgstr:phastxdbgptrstydbgptr+1ldr}y#0dbgs1:lda(dbgptr),ybeqdbgs2jsrdbgchrinybnedbgs1incdbgptrbnedbgs1incdbgptr+1bnedbgs1dbgs2:pls}arts;dbgstre:phastxdbgptrstydbgptr+1ldy#0dbge1:lda(dbgptr),ycmp#ateolbeqdbge2jsrdbgchrinybnet}dbge1incdbgptrbnedbge1incdbgptr+1bnedbge1dbge2:plarts;; print a string, textc form;.byte0dbgstrc:pu}hastxdbgptrstydbgptr+1ldy#0lda(dbgptr),ybeqdbgsc9stadbgstrc-1dbgsc1:inylda(dbgptr),yjsrdbgchrdecv}dbgstrc-1bnedbgsc1dbgsc9:plarts;dbgeol:lda#ATEOLjmpdbgchr;; print a byte (in A) in hex;.byte0dbghex:w}phalsralsralsralsrajsrdbghdpladbghd:and#$0Fstxdbghex-1taxldahex,xjsrdbgchrldxdbghex-1rtx}sdbghxy:tyajsrdbghextxajsrdbghexrtsHEX:.BYTE"0123456789ABCDEF";;;----------------------------------------y}------------------------;; pathname parsing stuff.;; a pathname consists of optional device, name, and optional; extensiz}on.;; a pathname descriptor is a structure containing three fields,; each of which is a byte of max, a byte of length, and{} a (max) bytes; of data. they are:;devdevice spec (2 bytes);namefile name(8 bytes);extfile type(3 bytes);; equ|}ates for pathname descriptor block;pnd.fl =0; flags bytepnd.dm=1; dev max, 1 bytepnd.ds=2; dev size, one byte}}pnd.dt=3; dev text, two bytespnd.nm=5; name max, 1 bytepnd.ns=6; name size, 1 bytepnd.nt=7; name text, 8 ~}bytespnd.em=15; ext maxpnd.es=16pnd.et=17pndsiz=20; total size;; generic component equates;pnc.m=0; m}ax this componentpnc.s=1; size this componentpnc.t=2; text this component;; bits in flag byte;pnf.dp=$01; d}ev spec presentpnf.np=$02; name presentpnf.ep=$04; type presentpnf.wl=$08; wild card somewhere;; if we had m}acros, the macro for building one of these would; look like this:;;.byte0; flags;.byte2; dev max;.byte0;.blk}b2;.byte8; name max;.byte0;.blkb8;.byte3;.byte0;.blkb3;; pointers;spc2=**=zpc1pnptr.blkb2;} string ptrpndptr.blkb2; pathname structpnddef.blkb2; defaultpncptr.blkb2; pathname componentzpc2=**=spc2};ppnt0:.byte0; temp for parse-pathname and friendsppnt1:.byte0ppnt2:.byte0;;pncupc:char-upcase char in A;pn}cupc:cmp#'a; >= 'a ?bccpncupc9; nope, leavecmp#'z+1; < 'z?bcspncupc9; nope, leavesecsbc#$20; shift} to up case. (carry's set)pncupc9:rts;;pnclgl:char in a legal pathname char?;returns carry set if not legal;pn}clgl:cmp#':; colon's okbeqpnclgl9cmp#'.; dot's ok toobeqpnclgl9cmp#'*; star is okbeqpnclgl9cmp#'?}; q-mark is okbeqpnclgl9cmp#'0; 0..9 is okbccpnclgl8; less, no goodcmp#'9+1bccpnclgl9; less, okcmp#}'A; alpha?bccpnclgl8; less is no goodcmp#'Z+1bccpnclgl9; A..Z's okpnclgl8:sec; error returnrtspnclgl9}:clc; ok returnrts;;pnfindc:find a character, in x, in (pnptr), starting;at y. returns idx or -1 in y, EQ if }found, NEQ;if not found. Trashes A;pnfindc:stxppnt1; save charpnfindc1:lda(pnptr),y; get a charbeqpnfindc}8; 0? ok, stop herejsrpncupc; upcase itjsrpnclgl; legal pathname char?bcspnfindc8; nope, go errorcmpppnt1}; compare itbeqpnfindc9; got it, returniny; next!bnepnfindc1pnfindc8:ldy#-1; return 'not found'pnfindc9:}rts;;parsepn::;grok a pathname string into a pathname descriptor.;expects pathname string pointed to by x,y, desc in (}pndptr).;pathname string terminated by any non-pathname char.;; this routine copies in one component. Initial idx in Y, }terminating; character in X, component offset in desc in A;;ppndbg1: .byte"Enter parsepn",ATEOL,0;ppndbg2: .byte"Leave }parsepn",ATEOL,0ppnct:.byte0; terminator charppncf:.byte0; flags for pathname we're parsingppncpf:.byte0; flag} to set in component we're onppncomp:stxppnct; save terminatorclc; first calculate adcpndptr; pointer to pat}hnamestapncptr; componentldapndptr+1adc#0stapncptr+1ppncp1:lda(pnptr),y; get a char; below?iny; and }bump the string idxbeqppncp9; always terminate on nulscmpppnct; hit terminator?beqppncp8; yes, stop this compo}nentcmp#ATEOL; eol?beqppncp9; yes, always terminate on eols, toocmp#space; space?beqppncp9; yes, always t}erminate on spaces, tooiny; and bump the string idxjsrpncupc; upcase itjsrpnclgl; legal char?bcsppncp9; n}ope, stop herecmp#'*; is it one of the wild chars?beqppncp2; yes, flag it as suchcmp#'?bneppncp3ppncp2:pha}; save charlda#pnf.wl; or in the 'wild' flagorappncfstappncfpla; get char backppncp3:styppnt0; save }y for a bitpha; save charldy#pnc.s; component size offsetlda(pncptr),y; get component size; check sizeldy#p}nc.m; component maxcmp(pncptr),y; compare size to maxbcsppncp6; too big! ignore this byteldy#pnc.s; idx for s}ize again;pha; save size for later indexingclc; add one to it foradc#1; next timesta(pncptr),y; put it b}ackpla; get the old size (index) backclc; zap carry again, andadc#pnc.t; add dev text offsettay; into y}pla; get char backsta(pncptr),y; stuff into dev textldappncpf; or in the flag corresponding to orappncf; t}his componentstappncfjmpppncp7; and go back for moreppncp6:pla; throw char awayppncp7:ldyppnt0; get strin}g idx backjmpppncp1ppncp8:;; found terminator. Skip it.inyclc; tell caller we saw itrts;ppncp9:sec; te}ll caller we didn't see itrts;;The main routine of the pathname parser.;parsepn:stxpnptr; set string pointer lo}stypnptr+1; and hi;zzz debug;ldx#ppndbg1\;ldy#ppndbg1^;jsrpstrnul;zzzlda#0; first zap len flds in descs}tappncf; and flags in progressldy#pnd.ds; dev sizesta(pndptr),y; zapldy#pnd.nssta(pndptr),yldy#pnd.ess}ta(pndptr),yldy#0; idx into name stringppndev:ldx#':; do we have a colon?jsrpnfindcbmippndev9; nope, skip} this partlda#pnf.dp; flag to set if we do itstappncpfldy#0; start at zero pleaselda#pnd.dm; do device comp}onentjsrppncompjmpppnnam; go do the nameppndev9:ldy#0; reset string ptrppnnam:lda#pnf.np; flag to set if }we do itstappncpflda#pnd.nm; do name componentldx#'.; stop at dot; y's already setjsrppncomp;; rather }a kludge. If see a dot, always say; ext present, even if no ext text;bcsppnextlda#pnf.eporappncfstappncfppnex}t:lda#pnf.ep; flag to set if we do itstappncpflda#pnd.em; extension, pleaseldx#ATEOL; sort of irrelevant, a}s we'll stop; on any illegal char.jsrppncomp; y's already set.ldappncf; now put in accumulated flagsldy#pn}d.flsta(pndptr),y;zzz debug;ldx#ppndbg2\;ldy#ppndbg2^;jsrpstrnul;zzzrts; done!;;pn2str:(parsed) pathn}ame to string.;expects a pathname descriptor in (pndptr);and a string in X,Y. Generates a namestring;terminated }by ATEOL, suitable for passing to;CIO. Note that it wants a fully qualified;parsed pathname.;ppndbg3: .byte"Enter }pn2str",ATEOL,0;ppndbg4: .byte"Leave pn2str",ATEOL,0;; this pushes one byte into output string;pn2sp:styppnt2; sav}e y value for a bitldyppnt0; get string idxsta(pnptr),y; shove the char;zzz debug;pha; save a;txa; save x};pha;lda(pnptr),y; get char back;pha;lda#'|;jsrprchr;pla;jsrprchr;pla;tax;pla;zzzincppnt0; bum}p the str idxldyppnt2; get y backrts;; copy one component into outgoing string.; y contains offset into desc for co}mponent text, x contains size;pn2scs:lda(pndptr),y; get a charjsrpn2sp; stuff itiny; bump dev text idxdex}; dec sizebnepn2scs; back for morerts;; this inits regs, given an initial offset into the descriptor.; returns Z i}f length 0.;pn2sin:lda(pndptr),y; get the component size;zzz debug;pha;tya;pha;lda#'#;jsrprchr;pla; y} val;pha;jsrprbyte;pla;pha;tay;lda(pndptr),y;jsrprbyte;pla;tay;pla;zzziny; point y at texttax}; save it as a counter, set Z for returnrts;;the main routine;pn2str:stxpnptr; set pathname string lostypnp}tr+1; and hi;zzz debug;ldx#ppndbg3\;ldy#ppndbg3^;jsrpstrnul;ldapnptr+1;jsrprbyte;ldapnptr;jsrprbyte};zzzldy#0; string idxstyppnt0ldy#pnd.ds; dev component sizejsrpn2sin; set up regsbeqpn2str1; No dev???} ok, skip itjsrpn2scs; copy a stringlda#':; get a colonjsrpn2sp; push it in;pn2str1:ldy#pnd.ns; name c}omponent sizejsrpn2sin; set upbeqpn2str2; zero length name?? this should error ...jsrpn2scs; copy it in;pn2s}tr2:lda#'.; get a dotjsrpn2sp; push it in;ldy#pnd.es; name component sizejsrpn2sinbeqpn2str3; zero le}ngth ext?jsrpn2scs; copy it inpn2str3:lda#ATEOL; get an eoljsrpn2sp; push it in;zzz debug;ldx#ppndbg4\;}ldy#ppndbg4^;jsrpstrnul;zzzrts; done!!!;;pnmerge::Merge two pathnames. Move components from the;first into} missing components of the second, ie;merge "D1:FOO.BAR","CRUD.BAZ" -> "D1:CRUD.BAZ";;wants pnddef pointing at pn1, pnd}ptr at pn2;pnmflg:.byte0; flag byte for which comp we're doingpnmc:stapnmflg; store component maskldx#0; idx} for flags bytelda(pndptr,x); get flagsandpnmflg; target path have this component?bnepnmc9; if there, skiplda}(pndptr),y; get component size in target pathnamebnepnmc9; nonzero, try nextlda(pnddef,x); get flags for default p}nandpnmflg; and with maskbeqpnmc9; if not there, skip componentlda(pnddef),y; ok, get the one we're merging fro}mbeqpnmc9; this one zero too?? ok, skip ittax; get size in xinx; inc to include size bytepnmc1:lda(pnddef)},y; get a bytesta(pndptr),y; put it in targetiny; bump component ptrdex; dec countbnepnmc1; round againp}nmc9:rts; done with this component;ppndbg5: .byte"Enter pnmerge",ATEOL,0;ppndbg6: .byte"Leave pnmerge",ATEOL,0pnm}erge:;zzz debug;ldx#ppndbg5\;ldy#ppndbg5^;jsrpstrnul;zzzlda#pnf.dp; device flagldy#pnd.ds; look at dev c}omponent sizejsrpnmc; merge this componentlda#pnf.np; device flagldy#pnd.ns; do namejsrpnmc; ...lda#p}nf.ep; device flagldy#pnd.es; and extensionjsrpnmcpnmzzz:ldy#pnd.fl; merge flags fldslda(pnddef),yora(p}ndptr),ysta(pndptr),y;zzz debug;ldx#ppndbg6\;ldy#ppndbg6^;jsrpstrnul;zzzrts; done!;;;-----------------}------------------------------------------------;cmdidx:.byte0; idx into cmd lineLINELEN: .byte0LINEIDX: .byte0LINE}:.blkb256;cmdmax=60; command line maxcmdbuf.blkbcmdmaxcmddone: .byte0; if command line already processed;done:}.byte0; time to exit flag;iname:.blkb32; input file nameoname:.blkb32; output file nameidname:.byte"D1:FOO.UUE}",ateol; input defaultdefdrv=idname+1odname:.byte"FOO.COM",ateol; output defaultfpn:.byte0,2,0," ",8,0," "},3,0," " ; pathname from fileipn:.byte0,2,0," ",8,0," ",3,0," " ; input pathameopn:.byte0,2,0," ",8,0," } ",3,0," " ; output pathnamedpn:.byte0,2,0," ",8,0," ",3,0," " ; default pathname;;; .PAGE "Utils";FL}USHBINPHALDABINEMPTYBNEFLUSHB99LDX#outfLDA#binbuf&$FFLDY#binbuf/256JSRSETBUFLDYBINSIZE+1LDABINSIZE}JSRSETLENLDA#CPBINRJSRIOCMDFLUSHB99LDA#1; say we're emptySTABINEMPTYLDA#0; say current size STABINS}IZE; is zeroSTABINSIZE+1;lda#BINBUF\; set ptr to beginningstabinp; of buflda#BINBUF^stabinp+1;PLA;} get A backRTS;GENBYTE;; Stuff it in out buf;PHALDABINSIZE+1CMP#BINMAX/256; buffer full?;BCCGENB1AbneGE}NB1AGENBFJSRFLUSHBINGENB1APLALDY#0sta(binp),y;; count and sum it;clcadcchksumstachksumldachksum+1}adc#0stachksum+1incnbytesbnegenb1bincnbytes+1bnegenb1bincnbytes+2genb1b:LDA#0STABINEMPTYINCBIN}SIZEBNEGENB1CINCBINSIZE+1GENB1C:INCbinpbneGENB1Dincbinp+1GENB1D:RTS;; x,Y points to pathname;GETFNAME}stxpndptrstypndptr+1;; zap the pathname;lda#0ldy#pnd.flsta(pndptr),yldy#pnd.dssta(pndptr),yldy#pnd.}nssta(pndptr),yldy#pnd.essta(pndptr),y;ldycmdidx; get cmd line idx;; y points to pathname;lda(cmdptr),y}cmp#ateol; eol?beqgetf9; yup, stopstycmdidx; for next timetyaclcadccmdptrtax; lo byteldacmdptr+1}adc#0; get carrytay; points to namestring nowjsrparsepn; parse itjsrpnmerge;; now skip this one. This is} sort of gross...;ldycmdidxgetf1:lda(cmdptr),y; find a spacecmp#ateolbeqgetf3cmp#spacebeqgetf2inyjmp}getf1getf2:iny; skip itlda(cmdptr),ycmp#ateolbeqgetf3cmp#spacebeqgetf2;getf3:stycmdidxclc; sa}y we winrtsgetf9:stycmdidxjsrpnmerge; merge defaults anywaysec; say we loserts;; IOCB in X, addr hi in Y,} lo in A;SETBUFSTAICBADR,XTYASTAICBADR+1,XRTSSETLENSTAICBLEN,XTYASTAICBLEN+1,XRTSSETAUXSTAICAUX1,X}TYASTAICAUX2,XRTS;; IO command in A;IOCMDSTAICCOM,XJSRCIOLDAICSTA,XRTS;; A,Y point to name;OPENFJ}SRSETBUFLDA#COPNJMPIOCMDOPENINPHATYAPHALDA#OPINLDY#0JSRSETAUXPLATAYPLAJMPOPENFOPENOUTPHA}TYAPHALDA#OPOUTLDY#0JSRSETAUXPLATAYPLAJMPOPENF;;READLINELDX#INFLDY#LINE/256LDA#LINE&$FFJSR}SETBUFLDA#255LDY#0JSRSETLENLDA#CGTXTRJSRIOCMDcpy#0; status?bmireaderr; lose, diePHA;; debug;;}ldx#line\;ldy#line^;jsrdbgstre;;RDL2PLAclcRTSreaderr:tyaphaldx#rdemsg\ldy#rdemsg^jsrdbgstrpla}jsrdbghexjsrdbgeolsecrtsrdemsg:.byteATEOL,"Read error ",0;; getcmd: get a pointer to command line. ; Leave cm}didx pointing at; first non-blank in the command line.;getcmd:;; first try to guess what OS we're running under.; Use t}he algorithm suggested by Dick Curzon.; Look thru $0A. Should see a jmp, another jmp,; and something that's not a jump.;}ldy#0lda($0A),ycmp#$4C; a jmp?bnegetnxl; nopeldy#3lda($0A),ycmp#$4C; a jmp?bnegetnxl; nopeld}y#6lda($0A),ycmp#$4C; a jmp?bnegetcxl; nope, that means xl;; note that the above test will be passed by; Spa}rtados too, which means we'll die horribly.; Someone should come up with a better test...;getnxl:;; not xl; just prompt }for it;jmpncmdgetcxl:ldacmddone; we already do this one?bnencmd; yup, don't do it again;; get default drive} from dos xl, and stuff into our default drive;ldy#cpdfdv+1; idx for drive numlda(cpaloc),y; get the digitstadefd}rv; stuff it in ours;; get command line from DOS XL;ldacpalocstacmdptrldacpaloc+1stacmdptr+1LDY#CPBUFP}LDA(CPALOC),YCLCADC#CPCMDBstacmdidx;; say we've processed this command line.;lda#1stacmddone;; we got one} from cmd line; set done ; flag so we'll exit after we're done;;lda#1stadonejsrcmdsk; skip spacesbcsncmd; n}one? ok, promptrts; return his codes;; no command line, prompt for one;prompt:.byte"YAU>",0ncmd:ldx#prompt\l}dy#prompt^jsrdbgstrldx#0; e: iocblda#cmdbuf\ldy#cmdbuf^jsrsetbuflda#cmdmax\ldy#cmdmax^jsrsetlenl}da#CGTXTR; get recjsriocmdcpy#0; win?bplncmd1; yes, go do itjmpcmderrncmd1:lda#cmdbuf\stacmdptrld}a#cmdbuf^stacmdptr+1ldy#0stycmdidxldaicblen,x; get low order lenbeqcmderr; if zero len cmd, exitlda#0}; if get here, not donestadonejsrcmdsk; skip spacesbcscmderr; if none, say errorrts; return his flags;cmd}err:incdonesecrts;cmdsk:;; skip spaces;ldycmdidxcmds1:lda(cmdptr),y; get onecmp#ateol; none??beqc}mds3; ok, promptcmp#space; sp?bnecmds2; nope, stopinyjmpcmds1cmds2:stycmdidxclcrtscmds3:stycmdidx}secrts;;; match: see if string in (x,y) matches stuff in LINE;match:stxstrptrstystrptr+1ldy#0m1:lda(str}ptr),y; get a bytebeqm2; end of string?cmpline,y; look like what's in line?bnem9; no matchinyjmpm1m2:}clc; say we wonrtsm9:sec; say we lostrts;; find the 'begin ' line;begtxt:.byte"begin ",0endtxt: .byte"en}d",0beginp:lda#fpn\; set path ptrstapndptr; in case welda#fpn^; find onestapndptr+1;ldx#begtxt\ldy}#begtxt^jsrmatchbccbeg1; match? ok, go do pathname stuffrts; say we lostbeg1:;; Y points at first char after} 'begin ';ldaline,y; find non-blankcmp#ATEOL; eol???beqbeg9; yup, quitcmp#space; sp?bnebeg2inyjmp}beg1beg2:;; find a blank;inyldaline,ycmp#ateolbeqbeg9cmp#spacebnebeg2beg3:;; find a non-blank;iny}ldaline,ycmp#ateolbeqbeg9cmp#spacebeqbeg3;; ok, pointing at pathname;clctyaadc#line\taxlda#line}^adc#0tayjsrparsepn;; look at the pathname we got back. if it's got; anything in it, set name and type field bits},; to keep from having things spuriously merged in later.;ldafpn+pnd.fl; get flags byteand#pnf.np|pnf.ep; either na}me or ext?beqbeg9lda#pnf.np|pnf.ep; ok, set bothstafpn+pnd.flbeg9: clcrts;; return next byte from line; barf } if eol.; starting idx in y;nextb:ldaline,ybeqnextbn; nul?cmp#ATEOL; end of line???beqnextbe; that's an err }oriny; bump idxrts; and return the charnextbe:tyaphaldx#shlerr\ldy#shlerr^jsrdbgstr; bitchplatay }lda#0staline,y; so we only bitch oncenextbn:lda#$20; return a spacertsshlerr:.byte"Bogus line! UUE file is bad }.",ATEOL,0;; process a line;ltxt:.byte0,0,0,0; text bytes this linelbin:.byte0,0,0; binary bytes this linelbc:.b }yte0; bin count this bytec:.byte0; tempeatline:ldaline; get size bytesecsbc#$20; uncharacterifystalbc; s }ave itlda#1; start line datastalineidx; at 1uud1:ldalbc; any remaining here?bneuud2jmpuud9uud2:ldylin }eidx; get line idx into yldx#4; get next 4stxbytecldx#0uud3:;ldaline,y; get a uu charjsrnextbsecsbc#$ }20; unchar itand#$3F; mask, for sanity checkstaltxt,x; shove it in hold area;inyinxdecbytecbneuud3styli }neidx; save idx for next time;; guts of uudecode;ldaltxt; get byte 0aslaasla; shift left 2stalbin; store t }op 6 bitsldaltxt+1; get byte 1lsra; shift right lsra; by 4,lsra; leaving lsra; two bitsoralbin; OR } with 6 from beforestalbin; making the first whole byte!;ldaltxt+1; get byte 1 againasla; shift leftasla; b }y 4, asla; leavingasla; top 4stalbin+1; save temporarilyldaltxt+2; get byte 2lsra; shift right 2,lsr }a; leaving bottom 4oralbin+1; OR em instalbin+1; and save em;ldaltxt+2; get byte 2asla; shift left 6,asl }a; leaving top 2aslaaslaaslaaslaoraltxt+3; or with last bytestalbin+2; done!;; now, that wasn't so h }ard, was it?;ldalbin; get a bytejsrgenbyte; shove it outdeclbc; dec line byte countbequud9; done with line? }ldalbin+1; get a bytejsrgenbyte; shove it outdeclbc; dec line byte countbequud9; done with line?ldalbin+2; } get a bytejsrgenbyte; shove it outdeclbc; dec line byte countbequud9; done with line?jmpuud1; around againu }ud9:rts;closef:LDX#INFLDA#CCLOSEJSRIOCMDLDx#outfLDA#CCLOSEJSRIOCMDrts;; commentary;amuse1: .byte }"Yow! ",0amuse2: .byte" -> ",0START:;lda#0; zap counts etcstachksumstachksum+1stanbytesstanbytes+1stan }bytes+2;lda#1stadone; getcmd will clr it if cmdjsrgetcmdbccstart1jmpexitstart1:lda#dpn\stapndptrlda }#dpn^stapndptr+1ldx#idname\ldy#idname^jsrparsepn; parse the default pathnamelda#dpn\stapnddeflda#dpn^ }stapnddef+1;LDY#ipn/256LDx#ipn&$FFJSRGETFNAMEldx#iname\ldy#iname^jsrpn2str;; Open the source file; }LDX#infLDY#iname/256LDA#iname&$FFJSROPENincpy#1; win?beqmain1tyaphaldx#err1\ldy#err1^jsrdbgstr }plajsrdbghexjsrdbgeoljmpfinisherr1:.byte"Open error on infile: ",0main1:;; find the begin;findb:jsrread }linebccfindb1; got oneldx#nobtxt\ldy#nobtxt^jsrdbgstrjmpfinishnobtxt:.byte"No 'begin ' found",ATEOL,0fin }db1:jsrbeginp; try to parse 'begin ...'bcsfindb; nope, try again;; now do target path. beginp parsed fpn for us. };lda#dpn\stapndptrlda#dpn^stapndptr+1ldx#odname\ldy#odname^jsrparsepn; parse the default pathname; }lda#fpn\; use fpn for defaultsstapnddeflda#fpn^stapnddef+1;LDY#opn/256LDx#opn&$FFJSRGETFNAME;lda#dp }n\; use dpn for defaultsstapnddeflda#dpn^stapnddef+1jsrpnmerge;lda#ipn\; and merge in ipnstapnddef; }in case no devicelda#ipn^; specifiedstapnddef+1jsrpnmerge;ldx#oname\ldy#oname^jsrpn2str;; say what we' }re doing;ldx#amuse1\ldy#amuse1^jsrdbgstrldx#iname\ldy#iname^jsrdbgstreldx#amuse2\ldy#amuse2^jsrdb }gstrldx#oname\ldy#oname^jsrdbgstrejsrdbgeol;; Open the bin file;LDX#outfLDY#oname/256LDA#oname&$FFJ }SROPENOUTcpy#1; win?beqmain2tyaphaldx#err2\ldy#err2^jsrdbgstrplajsrdbghexjsrdbgeoljmpfinish !}err2:.byte"Open error on outfile: ",0;main2:LDA#1STABINEMPTY; nothing in bin bufjsrFLUSHBIN; init ptrs etc;; "} Read til eof.;MAINLOOPJSRREADLINEbcsbadeof; couldn't get line?ldx#endtxt\; see end?ldy#endtxt^jsrmatch #}bcccleanupJSREATLINEjmpmainloopbctxt:.byte"Byte count = ",0cktxt:.byte"Checksum = #x",0eoftxt:.byte"Unexpecte $}d EOF!",ATEOL,0badeof:ldx#eoftxt\ldy#eoftxt^jsrdbgstrcleanup:jsrflushbinjsrclosef; close em;; display by %}te count etc;ldx#bctxt\ldy#bctxt^jsrdbgstr;ldanbytes+2;jsrdbghex;ldanbytes+1;jsrdbghex;ldanbytes;j &}srdbghex;; do it in decimal. what a pain;;; rather a kludge here. We need to make an fp; 256, then use it to get top '} byte in.;lda#1; 256^stafr0+1lda#0stafr0jsrifpjsrfmove; move fr0 -> fr1ldanbytes+2; top bytesta (}fr0+1lda#0stafr0jsrifp; make that a floatjsrfmul; mult em togetherjsrfmove; move result back to fr1;l )}danbytes; lo orderstafr0ldanbytes+1; mid orderstafr0+1jsrifp; make a floatjsrfadd; add top bytejsrf *}ascldy#0dec1:lda(inbuff),yphaand#$7Fjsrdbgchrinyplacmp#0bpldec1;jsrdbgeolldx#cktxt\ldy#ckt +}xt^jsrdbgstrldachksum+1jsrdbghexldachksumjsrdbghexjsrdbgeolfinish:jsrclosef; close em;; unless done ,}flag, go back for more commands;ldadonebneexitjmpstartexit:;; make dead sure they're closed;jsrclosef;; Al -}l done!;RTS *=GOADR.wordSTART; .END; /;.TITLE "YAUE: Yet Another Uu Encoder";.TAB 8,14,20*=$3000;; .INCLUDE D2:SYSEQU.ASM;---------------------------------- /}-------------------------; .PAGE "OSS SYSTEM EQUATES FOR ATARI";; FILE = #DN:SYSEQU.ASM;;; I/O CONTROL BLOCK EQUATES; 0}SAVEPC=*; SAVE CURRENT ORG;*=$0340; START OF SYSTEM IOCBSIOCB;ICHID*=*+1; DEVICE HANDLER IS (SET BY OS)ICDNO 1}*=*+1; DEVICE NUMBER (SET BY OS)ICCOM*=*+1; I/O COMMANDICSTA*=*+1; I/O STATUSICBADR*=*+2; BUFFER ADDRESSI 2}CPUT*=*+2; DH PUT ROUTINE (ADR-1)ICBLEN*=*+2; BUFFER LENGTHICAUX1*=*+1; AUX 1ICAUX2*=*+1; AUX 2ICAUX3*= 3}*+1; AUX 3ICAUX4*=*+1; AUX 4ICAUX5*=*+1; AUX 5ICAUX6*=*+1; AUX 6;IOCBLEN=*-IOCB; LENGTH OF ONE IOCB;; 4} IOCB COMMAND VALUE EQUATES;COPN=3; OPENCGBINR=7; GET BINARY RECORDCGTXTR=5; GET TEXT RECORDCPBINR=11; PUT B 5}INARY RECORDCPTXTR=9; PUT TEXT RECORDCCLOSE=12; CLOSE CSTAT=13; GET STATUS;; DEVICE DEPENDENT COMMAND EQUATES F 6}OR FILE MANAGER;CREN=32; RENAMECERA=33; ERASECPRO=35; PROTECTCUNP=36; UNPROTECTCPOINT=37; POINTCNOTE= 7}38; NOTE;; AUX1 VALUES REQD FOR OPEN;OPIN=4; OPEN INPUTOPOUT=8; OPEN OUTPUTOPUPD=12; OPEN UPDATEOPAPND=9; 8} OPEN APPENDOPDIR=6; OPEN DIRECTORY;; .PAGE;; EXECUTE FLAG DEFINES;EXCYES=$80; EXECUTE IN PROGRESSEXCSCR=$ 9}40; ECHO EXCUTE INPUT TO SCREENEXCNEW=$10; EXECUTE START UP MODEEXCSUP=$20; COLD START EXEC FLAG;; MISC ADDRESS EQ :}UATES;CPALOC=$0A; POINTER TO CP/AWARMST=$08; WARM START (0=COLD)MEMLO=$2E7; AVAIL MEM (LOW) PTRMEMTOP=$2E5; ;}AVAIL MEM (HIGH) PTRAPPMHI=$0E; UPPER LIMIT OF APPLICATION MEMORYINITADR=$2E2; ATARI LOAD/INIT ADRGOADR=$2E0; ATA <}RI LOAD/GO ADRCARTLOC=$BFFA; CARTRIDGE RUN LOCATIONCIO=$E456; CIO ENTRY ADREOL=$9B; END OF LINE CHAR;; Characte =}r defs from sysmac.sml;ATCLR=$7D;CLEAR SCREEN CHARACTERATRUB=$7E;BACK SPACE (RUBOUT)ATTAB=$7F;TABATEOL=$9B;E >}ND-OF-LINEATBEL=$FD;CONSOLE BELLATURW=$1C;UP-ARROWATDRW=$1D;DOWN-ARROWATLRW=$1E;LEFT-ARROWATRRW=$1F;RIGHT ?}-ARROWspace=$20;; CP/A FUNCTION AND VALUE DISPLACEMSNT; (INDIRECT THROUGH CPALOC); IE. (CPALOC),Y;CPG @}NFN=3; GET NEXT FILE NAMECPDFDV=$07; DEFAULT DRIVE (3 BYTES)CPBUFP=$0A; CMD BUFF NEXT CHAR POINTR (1 BYTE)CPEXFL A}=$0B; EXECUTE FLAGCPEXFN=$0C; EXECUTE FILE NAME (16 BYTES)CPEXNP=$1C; EXECUTE NOTE/POINT VALUESCPFNAM=$21; FILE B}NAME BUFFERRUNLOC=$3D; CP/A LOAD/RUN ADRCPCMDB=$3F; COMMAND BUFFER (60 BYTES);CPCMDGO=-6; CP SUBROUTINE VECTOR; C}*=SAVEPC; RESTORE PC;;-----------------------------------------------------------;; .page"Page zero"zpc=$80; pag D}e zero pcspc1=**=zpccmdptr:.blkb2; pointer to cmd linebinp:.blkb2; pointer into binary bufstrptr:.blkb2dbg E}ptr:.blkb2; end of page zero defszpc1=**=spc1;; fp defs;fr0=$D4fr1=$E0flptr=$FCinbuff=$F3cix=$F2; F}fasc=$D8E6; fp -> asciiifp=$D9AA; int -> fpfadd=$DA66; fp + fpfmul=$DADB; fr0 * fr1 -> fr0fmove=$DDB6; fr G}0 -> fr1;; .PAGE "Data defs";inf=$10; input fileoutf=$20; output file;*=$3000JMPSTART; in case goadr ignor H}ed;; binary buffering stuff; binary buf size must be a ; multiple of 256;; put it back if we decide to do buffering;; I}BINMAX=8192; how much binary to buffer up;BINBUF:.blkbBINMAX;BINSIZE: .word0;BINEMPTY: .byte1;nbytes:.byte0,0,0 J}; 3 ought to be big enoughchksum:.byte0,0; ones comp checksum;; debug flag;debug:.byte0;; Debug code;; char i K}n A out to tty;;; debug code;.byte0dbgchr:stadbgchr-1tyaphatxaphaldx#0txatayjsrSETLENlda#CPBI L}NRSTAICCOM,Xldadbgchr-1JSRCIOplataxplatayrts;; dump a str, ptr in x,y, terminated by 0.; preserves A; M}dbgstr:phastxdbgptrstydbgptr+1ldy#0dbgs1:lda(dbgptr),ybeqdbgs2jsrdbgchrinybnedbgs1incdbgptrbne N}dbgs1incdbgptr+1bnedbgs1dbgs2:plarts;dbgstre:phastxdbgptrstydbgptr+1ldy#0dbge1:lda(dbgptr),ycm O}p#ateolbeqdbge2jsrdbgchrinybnedbge1incdbgptrbnedbge1incdbgptr+1bnedbge1dbge2:plarts;; print a P} string, textc form;.byte0dbgstrc:phastxdbgptrstydbgptr+1ldy#0lda(dbgptr),ybeqdbgsc9stadbgstrc-1dbg Q}sc1:inylda(dbgptr),yjsrdbgchrdecdbgstrc-1bnedbgsc1dbgsc9:plarts;dbgeol:lda#ATEOLjmpdbgchr;; prin R}t a byte (in A) in hex;.byte0dbghex:phalsralsralsralsrajsrdbghdpladbghd:and#$0Fstxdbghex-1ta S}xldahex,xjsrdbgchrldxdbghex-1rtsdbghxy:tyajsrdbghextxajsrdbghexrtsHEX:.BYTE"0123456789ABCDEF";; T};----------------------------------------------------------------;; pathname parsing stuff.;; a pathname consists of opt U}ional device, name, and optional; extension.;; a pathname descriptor is a structure containing three fields,; each of whi V}ch is a byte of max, a byte of length, and a (max) bytes; of data. they are:;devdevice spec (2 bytes);namefile name( W}8 bytes);extfile type(3 bytes);; equates for pathname descriptor block;pnd.fl =0; flags bytepnd.dm=1; dev ma X}x, 1 bytepnd.ds=2; dev size, one bytepnd.dt=3; dev text, two bytespnd.nm=5; name max, 1 bytepnd.ns=6; nam Y}e size, 1 bytepnd.nt=7; name text, 8 bytespnd.em=15; ext maxpnd.es=16pnd.et=17pndsiz=20; total size;; Z}generic component equates;pnc.m=0; max this componentpnc.s=1; size this componentpnc.t=2; text this component [};; bits in flag byte;pnf.dp=$01; dev spec presentpnf.np=$02; name presentpnf.ep=$04; type presentpnf.wl= \}$08; wild card somewhere;; if we had macros, the macro for building one of these would; look like this:;;.byte0; f ]}lags;.byte2; dev max;.byte0;.blkb2;.byte8; name max;.byte0;.blkb8;.byte3;.byte0;.blkb3;; poi ^}nters;spc2=**=zpc1pnptr.blkb2; string ptrpndptr.blkb2; pathname structpnddef.blkb2; defaultpncptr.blkb _}2; pathname componentzpc2=**=spc2;ppnt0:.byte0; temp for parse-pathname and friendsppnt1:.byte0ppnt2:.byte `}0;;pncupc:char-upcase char in A;pncupc:cmp#'a; >= 'a ?bccpncupc9; nope, leavecmp#'z+1; < 'z?bcspncu a}pc9; nope, leavesecsbc#$20; shift to up case. (carry's set)pncupc9:rts;;pnclgl:char in a legal pathname cha b}r?;returns carry set if not legal;pnclgl:cmp#':; colon's okbeqpnclgl9cmp#'.; dot's ok toobeqpnclgl9cm c}p#'*; star is okbeqpnclgl9cmp#'?; q-mark is okbeqpnclgl9cmp#'0; 0..9 is okbccpnclgl8; less, no good d}cmp#'9+1bccpnclgl9; less, okcmp#'A; alpha?bccpnclgl8; less is no goodcmp#'Z+1bccpnclgl9; A..Z's okp e}nclgl8:sec; error returnrtspnclgl9:clc; ok returnrts;;pnfindc:find a character, in x, in (pnptr), starting f};at y. returns idx or -1 in y, EQ if found, NEQ;if not found. Trashes A;pnfindc:stxppnt1; save charpnfindc1 q}B%DOS SYSB*)DUP SYSBSYAU M65B.YAUE M65B!USDBLR ROMB)COL_4352ASMB ;ENTMENU ASMBEENTMENU M65BKENTMENU OBJ:lda(pnptr),y; get a charbeqpnfindc8; 0? ok, stop herejsrpncupc; upcase itjsrpnclgl; legal pathname char? r}bcspnfindc8; nope, go errorcmpppnt1; compare itbeqpnfindc9; got it, returniny; next!bnepnfindc1pnfindc8: s}ldy#-1; return 'not found'pnfindc9:rts;;parsepn::;grok a pathname string into a pathname descriptor.;expects pa t}thname string pointed to by x,y, desc in (pndptr).;pathname string terminated by any non-pathname char.;; this routine co u}pies in one component. Initial idx in Y, terminating; character in X, component offset in desc in A;;ppndbg1: .byte"Ente v}r parsepn",ATEOL,0;ppndbg2: .byte"Leave parsepn",ATEOL,0ppnct:.byte0; terminator charppncf:.byte0; flags for path w}name we're parsingppncpf:.byte0; flag to set in component we're onppncomp:stxppnct; save terminatorclc; first x} calculate adcpndptr; pointer to pathnamestapncptr; componentldapndptr+1adc#0stapncptr+1ppncp1:lda(p y}nptr),y; get a char; below?iny; and bump the string idxbeqppncp9; always terminate on nulscmpppnct; hit termi z}nator?beqppncp8; yes, stop this componentcmp#ATEOL; eol?beqppncp9; yes, always terminate on eols, toocmp#sp {}ace; space?beqppncp9; yes, always terminate on spaces, tooiny; and bump the string idxjsrpncupc; upcase it |}jsrpnclgl; legal char?bcsppncp9; nope, stop herecmp#'*; is it one of the wild chars?beqppncp2; yes, flag it }} as suchcmp#'?bneppncp3ppncp2:pha; save charlda#pnf.wl; or in the 'wild' flagorappncfstappncfpla; ~} get char backppncp3:styppnt0; save y for a bitpha; save charldy#pnc.s; component size offsetlda(pncptr),y }; get component size; check sizeldy#pnc.m; component maxcmp(pncptr),y; compare size to maxbcsppncp6; too big! } ignore this byteldy#pnc.s; idx for size again;pha; save size for later indexingclc; add one to it foradc# }1; next timesta(pncptr),y; put it backpla; get the old size (index) backclc; zap carry again, andadc#pnc. }t; add dev text offsettay; into ypla; get char backsta(pncptr),y; stuff into dev textldappncpf; or in t }he flag corresponding to orappncf; this componentstappncfjmpppncp7; and go back for moreppncp6:pla; throw } char awayppncp7:ldyppnt0; get string idx backjmpppncp1ppncp8:;; found terminator. Skip it.inyclc; tell c }aller we saw itrts;ppncp9:sec; tell caller we didn't see itrts;;The main routine of the pathname parser.;pars }epn:stxpnptr; set string pointer lostypnptr+1; and hi;zzz debug;ldx#ppndbg1\;ldy#ppndbg1^;jsrpstrnul;zz }zlda#0; first zap len flds in descstappncf; and flags in progressldy#pnd.ds; dev sizesta(pndptr),y; zapl }dy#pnd.nssta(pndptr),yldy#pnd.essta(pndptr),yldy#0; idx into name stringppndev:ldx#':; do we have a colo }n?jsrpnfindcbmippndev9; nope, skip this partlda#pnf.dp; flag to set if we do itstappncpfldy#0; start at }zero pleaselda#pnd.dm; do device componentjsrppncompjmpppnnam; go do the nameppndev9:ldy#0; reset string p }trppnnam:lda#pnf.np; flag to set if we doiastappncpflda#pnd.nm; do name componentldx#'.; stop at dot; } y's already setjsrppncomp;; rather a kludge. If see a dot, always say; ext present, even if no ext text;bcsppnext }lda#pnf.eporappncfstappncfppnext:lda#pnf.ep; flag to set if we do itstappncpflda#pnd.em; extension, pl }easeldx#ATEOL; sort of irrelevant, as we'll stop; on any illegal char.jsrppncomp; y's already set.ldappncf }; now put in accumulated flagsldy#pnd.flsta(pndptr),y;zzz debug;ldx#ppndbg2\;ldy#ppndbg2^;jsrpstrnul;zzz }rts; done!;;pn2str:(parsed) pathname to string.;expects a pathname descriptor in (pndptr);and a string in X,Y }. Generates a namestring;terminated by ATEOL, suitable for passing to;CIO. Note that it wants a fully qualified; }parsed pathname.;ppndbg3: .byte"Enter pn2str",ATEOL,0;ppndbg4: .byte"Leave pn2str",ATEOL,0;; this pushes one byte into } output string;pn2sp:styppnt2; save y value for a bitldyppnt0; get string idxsta(pnptr),y; shove the char;zz }z debug;pha; save a;txa; save x;pha;lda(pnptr),y; get char back;pha;lda#'|;jsrprchr;pla;jsrprchr };pla;tax;pla;zzzincppnt0; bump the str idxldyppnt2; get y backrts;; copy one component into outgoing str }ing.; y contains offset into desc for component text, x contains size;pn2scs:lda(pndptr),y; get a charjsrpn2sp; s }tuffiainy; bump dev text idxdex; dec sizebnepn2scs; back for morerts;; this inits regs, given an initial o }ffset into the descriptor.; returns Z if length 0.;pn2sin:lda(pndptr),y; get the component size;zzz debug;pha;tya };pha;lda#'#;jsrprchr;pla; y val;pha;jsrprbyte;pla;pha;tay;lda(pndptr),y;jsrprbyte;pla;tay; }pla;zzziny; point y at texttax; save it as a counter, set Z for returnrts;;the main routine;pn2str:stx }pnptr; set pathname string lostypnptr+1; and hi;zzz debug;ldx#ppndbg3\;ldy#ppndbg3^;jsrpstrnul;ldapnptr+ }1;jsrprbyte;ldapnptr;jsrprbyte;zzzldy#0; string idxstyppnt0ldy#pnd.fl; get flagslda(pndptr),yand }#pnf.dp; device present?beqpn2str1; nope, skipialdy#pnd.ds; dev v vs:jsrpn2sin; set up regsbeqpn2str1; }No dev??? ok, skipiitjsrpn2scs; copy a stringlda#':; get a colonjsrpn2sp; push it in;pn2str1:ldy#pnd.ns }; name component ss:jsrpn2sin; set upbeqpn2str2; zero length name?? this should error ...jsrpn2scs; copy it i }n;pn2str2:lda#'.; get a dotjsrpn2sp; push it in;ldy#pnd.es; name component sizejsrpn2sinbeqpn2str3; } zero length ext?jsrpn2scs; copy it inpn2str3:lda#ATEOL; get an eoljsrpn2sp; push it in;zzz debug;ldx#ppn }dbg4\;ldy#ppndbg4^;jsrpstrnul;zzzrts; done!!!;;pnmerge::Merge two pathnames. Move components from the;fi }rst into missing components of the second, ie;merge "D1:FOO.BAR","CRUD.BAZ" -> "D1:CRUD.BAZ";;wants pnddef pointing at }pn1, pndptr at pn2;pnmflg:.byte0; flag byte for which comp we're doingpnmc:stapnmflg; store component maskldx# }0; idx for flags bytelda(pndptr,x); get flagsandpnmflg; target path have this component?bnepnmc9; if there, s }kiplda(pndptr),y; get component size in target pathnamebnepnmc9; nonzero, try nextlda(pnddef,x); get flags for d }efault pnandpnmflg; and with maskbeqpnmc9; if not there, skipicomponentlda(pnddef),y; ok, get the one we're mer }ging frombeqpnmc9; this one zero too?? ok, skipiatax; get size in xinx; inc to include size bytepnmc1:lda( }pnddef),y; get a bytesta(pndptr),y; put it in targetiny; bump component ptrdex; dec countbnepnmc1; round }againpnmc9:rts; done with this component;ppndbg5: .byte"Enter pnmerge",ATEOL,0;ppndbg6: .byte"Leave pnmerge",ATEOL },0pnmerge:;zzz debug;ldx#ppndbg5\;ldy#ppndbg5^;jsrpstrnul;zzzlda#pnf.dp; device flagldy#pnd.ds; look a }t dev , siszejsrpnmc; merge this componentlda#pnf.np; device flagldy#pnd.ns; do namejsrpnmc; ...lda#p }nf.ep; device flagldy#pnd.es; and extensionjsrpnmcpnmzzz:ldy#pnd.fl; merge flags fldslda(pnddef),yora(p }ndptr),ysta(pndptr),y;zzz debug;ldx#ppndbg6\;ldy#ppndbg6^;jsrpstrnul;zzzrts; done!;;;----------------- }------------------------------------------------;cmdidx:.byte0; idx into cmd lineLINELEN: .byte0LINEIDX: .byte0LINE }:.blkb256;cmdmax=60; command line maxcmdbuf.blkbcmdmaxcmddone: .byte0; if command line already processed;done: }.byte0; time to exit flag;iname:.blkb32; input file nameoname:.blkb32; output file nameidname:.byte"D1:FOO.COM }",ateol; input defaultdefdrv=idname+1odname:.byte".UUE",ateol; output defaultipn:.byte0,2,0," ",8,0," ",3, }0," " ; input pathameopn:.byte0,2,0," ",8,0," ",3,0," " ; output pathnamedpn:.byte0,2,0," ",8,0," " },3,0," " ; default pathnameineof:.byte0; eof on inf;;; .PAGE "Utils";getbyte:ldaineofbnegetb8ldx#infld }a#0tayjsrsetbufjsrsetlenlda#CGBINR; get binarystaiccom,xjsrciobmigetb7incnbytesbnegetb9incnby }tes+1bnegetb9incnbytes+2jmpgetb9getb7:lda#1staineofgetb8:lda#0getb9:phaclcadcchksumstachksum }ldachksum+1adc#0stachksum+1plarts;; x,Y points to pathname;GETFNAMEstxpndptrstypndptr+1;; zap the path }name;lda#0ldy#pnd.flsta(pndptr),yldy#pnd.dssta(pndptr),yldy#pnd.nssta(pndptr),yldy#pnd.essta(pndp }tr),y;ldycmdidx; get cmd line idx;; y points to pathname;lda(cmdptr),ycmp#ateol; eol?beqgetf9; yup, sto }pstycmdidx; for next timetyaclcadccmdptrtax; lo byteldacmdptr+1adc#0; get carrytay; points to n }amestring nowjsrparsepn; parseiajsrpnmerge;; now skip this one. This is sort of gross...;ldycmdidxgetf1:lda }(cmdptr),y; find a spacecmp#ateolbeqgetf3cmp#spacebeqgetf2inyjmpgetf1getf2:iny; skipiitlda(cmdptr }),ycmp#ateolbeqgetf3cmp#spacebeqgetf2;getf3:stycmdidxclc; say we winrtsgetf9:stycmdidxjsrpnmer }ge; merge defaults anywaysec; say we loserts;; IOCB in X, addr hi in Y, lo in A;SETBUFSTAICBADR,XTYASTAI }CBADR+1,XRTSSETLENSTAICBLEN,XTYASTAICBLEN+1,XRTSSETAUXSTAICAUX1,XTYASTAICAUX2,XRTS;; IO command in }A;IOCMDSTAICCOM,XJSRCIOLDAICSTA,XRTS;; A,Y point to name;OPENFJSRSETBUFLDA#COPNJMPIOCMDOPENINPHA }TYAPHALDA#OPINLDY#0JSRSETAUXPLATAYPLAJMPOPENFOPENOUTPHATYAPHALDA#OPOUTLDY#0JSRSETAUXP }LATAYPLAJMPOPENF;; write the line pointed to by x,y;wrline:txaLDX#outFJSRSETBUFLDA#255LDY#0JSRSET }LENLDA#CPTXTRJSRIOCMDcpy#0; status?bmiwrerr; lose, diePHA;; debug;;ldx#line\;ldy#line^;jsrdbgst }re;;wrl2PLAclcRTSwrerr:tyaphaldx#wremsg\ldy#wremsg^jsrdbgstrplajsrdbghexjsrdbgeolsecrtswre }msg:.byteATEOL,"Write error ",0;; getcmd: get a pointer to command line. ; Leave cmdidx pointing at; first non-blank i }n the command line.;getcmd:;; first try to guess what OS we're running under.; Use the algorithm suggested by Dick Curzo }n.; Look thru $0A. Should see a jmp, another jmp,; and something that's not a jump.;ldy#0lda($0A),ycmp#$4C; a }jmp?bnegetnxl; nopeldy#3lda($0A),ycmp#$4C; a jmp?bnegetnxl; nopeldy#6lda($0A),ycmp#$4C; a jmp }?bnegetcxl; nope, that means xl;; note that the above test will be passed by; Spartados too, which means we'll die ho }rribly.; Someone should come up with a better test...;getnxl:;; not xl; just prompt for it;jmpncmdgetcxl:ldacmd }done; we already do this one?bnencmd; yup, don't do it again;; get dos xl's default dev;ldy#cpdfdv+1lda(cpalo }c),ystadefdrv;; get command line from DOS XL;ldacpalocstacmdptrldacpaloc+1stacmdptr+1LDY#CPBUFPLDA(CP }ALOC),YCLCADC#CPCMDBstacmdidx;; say we've processed this command line.;lda#1stacmddone;; we got one from c }md line; set done ; flag so we'll exit after we're done;;lda#1stadonejsrcmdsk; skip spacesbcsncmd; none? ok }, promptrts; return his codes;; no command line, prompt for one;prompt:.byte"YAUE>",0ncmd:ldx#prompt\ldy#pr }ompt^jsrdbgstrldx#0; e: iocblda#cmdbuf\ldy#cmdbuf^jsrsetbuflda#cmdmax\ldy#cmdmax^jsrsetlenlda#CG }TXTR; get recjsriocmdcpy#0; win?bplncmd1; yes, go do itjmpcmderrncmd1:lda#cmdbuf\stacmdptrlda#cmd }buf^stacmdptr+1ldy#0stycmdidxldaicblen,x; get low order lenbeqcmderr; if zero len cmd, exitlda#0; if g }et here, not donestadonejsrcmdsk; skip spacesbcscmderr; if none, say errorrts; return his flags;cmderr: }incdonesecrts;cmdsk:;; skip spaces;ldycmdidxcmds1:lda(cmdptr),y; get onecmp#ateol; none??beqcmds3 }; ok, promptcmp#space; sp?bnecmds2; nope, stopinyjmpcmds1cmds2:stycmdidxclcrtscmds3:stycmdidxsec }rts;; write the 'begin ' line;begtxt:.byte"begin 666 "begfn:.byte" ",ateolendt1:.byte" ",ateo }lendt2:.byte"end",ateolwrbegin:lda#ipn\; set path ptrstapndptr; in case welda#ipn^; find onestapndptr }+1;; zap dev flg in ipn, so it won't show up in name;ldaipn+pnd.fland#$FF-pnf.dpstaipn+pnd.flldx#begfn\ldy# }begfn^jsrpn2str;; now write it;LDY#begtxt/256LDx#begtxt&$FFJSRwrlinerts;; process a line;ltxt:.byte0,0 },0,0; text bytes this linelbin:.byte0,0,0; binary bytes this linelbc:.byte0; bin count this bytec:.byte0; temps }pitline:lda#0; bin count this linestalbc; save itlda#1; start line datastalineidx; at 1uue1:;; get 3 byte }s;lda#0stalbinstalbin+1stalbin+2jsrgetbytestalbinldaineof; out of data?bneuue2; yup, don't inc cou }ntinclbcjsrgetbytestalbin+1ldaineof; out of data?bneuue2; yup, don't inc countinclbcjsrgetbytestalb }in+2ldaineof; out of data?bneuue2; yup, don't inc countinclbcuue2:;; guts of uuencode;ldalbin; get first b }inarylsra; shift rightlsra; by 2staltxt; for the first binar;ldalbin+1; get the second binarylsra; shift rig }htlsra; 4lsra; .lsra; .staltxt+1; save here for a secldalbin; get the first one againasla; shift l }eftasla; 4asla; .asla; .and#$30; mask the bits we wantoraltxt+1; or with top 4 of second binarystaltx }t+1; yielding second encoded byte;ldalbin+1; get second bin binaryasla; shift left 2aslaand#$3C; mask 4 bits w }e're keepingstaltxt+2; save for a secldalbin+2; get last bin bytelsra; shift right 6lsralsralsralsra }lsraoraltxt+2; or in last 4 bitsstaltxt+2; yielding 3rd encoded;ldalbin+2; get last byteand#$3f; mask for }bottom 6staltxt+3; yielding last encoded!;; now, that wasn't so hard, was it?;ldylineidx; get line idxldaltxt }and#$3F; sanity checkclcadc#$20; make it a charstaline,y; and store itiny;ldaltxt+1and#$3F; sanity chec }kclcadc#$20; make it a charstaline,y; and store itiny;ldaltxt+2and#$3F; sanity checkclcadc#$20; mak }e it a charstaline,y; and store itiny;ldaltxt+3and#$3F; sanity checkclcadc#$20; make it a charstaline, }y; and store itiny;stylineidx;; see if time to flush;ldalbc; how many in this line?cmp#45bcsuue8; time t }o flushldaineof; eof on inf?bneuue8; yup, flushjmpuue1; go back for moreuue8:ldalbc; get bina countclcad }c#$20; make it a charstaline; save as first binaldylineidx; get line idxlda#'y; our trademarkstaline,yiny }lda#ATEOLstaline,yldx#line\ldy#line^jsrwrline; write it for realclcrts;closef:LDX#INFLDA#CCLOSEJ }SRIOCMDLDx#outfLDA#CCLOSEJSRIOCMDrts;; commentary;amuse1: .byte"Yowee! ",0amuse2: .byte" -> ",0START:; }lda#0; zap counts etcstachksumstachksum+1stanbinasstanbinas+1stanbinas+2staineof;lda#1stadone; ge }tcmd will clr it if cmdjsrgetcmdbccstart1jmpexitstart1:lda#dpn\stapndptrlda#dpn^stapndptr+1ldx#idnam }e\ldy#idname^jsrparsepn; parse the default pathnamelda#dpn\stapnddeflda#dpn^stapnddef+1;LDY#ipn/256 }LDx#ipn&$FFJSRGETFNAMEldx#iname\ldy#iname^jsrpn2str;; Open the source file;LDX#infLDY#iname/256LDA#i }name&$FFJSROPENincpy#1; win?beqmain1tyaphaldx#err1\ldy#err1^jsrdbgstrplajsrdbghexjsrdbgeolj }mpfinisherr1:.byte"Open error on infile: ",0main1:;; now do target path.;lda#dpn\stapndptrlda#dpn^stapndp }tr+1ldx#odname\ldy#odname^jsrparsepn; parse the default pathname;lda#dpn\; use dpn for defaultsstapnddef }lda#dpn^stapnddef+1jsrpnmerge;LDY#opn/256LDx#opn&$FFJSRGETFNAME;lda#ipn\; and merge in ipnstapndde }f; in case no devicelda#ipn^; specifiedstapnddef+1jsrpnmerge;ldx#oname\ldy#oname^jsrpn2str;; say wha }t we're doing;ldx#amuse1\ldy#amuse1^jsrdbgstrldx#iname\ldy#iname^jsrdbgstreldx#amuse2\ldy#amuse2^j }srdbgstrldx#oname\ldy#oname^jsrdbgstrejsrdbgeol;; Open the uue file;LDX#outfLDY#oname/256LDA#oname&$ }FFJSROPENOUTcpy#1; win?beqmain2tyaphaldx#err2\ldy#err2^jsrdbgstrplajsrdbghexjsrdbgeoljmpfi }nisherr2:.byte"Open error on outfile: ",0;main2:;LDA#1;STABINEMPTY; nothing in bin buf;jsrFLUSHBIN; init ptrs } etc;; write the begin line;jsrwrbegin;; Read til eof.;MAINLOOPJSRspitLINEbcsbadeof; couldn't write line? }ldaineof; eof?beqmainloop; nope, keep goingldx#endt1\; write blank lineldy#endt1^jsrwrlineldx#endt2\; }write endldy#endt2^jsrwrlinejmpcleanup;bctxt:.byte"Byte count = ",0cktxt:.byte"Checksum = #x",0eoftxt:.byte }"Unexpected EOF!",ATEOL,0badeof:ldx#eoftxt\ldy#eoftxt^jsrdbgstrcleanup:jsrclosef; close em;; display byte }count etc;ldx#bctxt\ldy#bctxt^jsrdbgstr;ldanbytes+2;jsrdbghex;ldanbytes+1;jsrdbghex;ldanbytes;jsr}dbghex;; do it in decimal. what a pain;;; rather a kludge here. We need to make an fp; 256, then use it to get top by}te in.;lda#1; 256^stafr0+1lda#0stafr0jsrifpjsrfmove; move fr0 -> fr1ldanbytes+2; top bytestafr0}+1lda#0stafr0jsrifp; make that a floatjsrfmul; mult em togetherjsrfmove; move result back to fr1;lda}nbytes; lo orderstafr0ldanbytes+1; mid orderstafr0+1jsrifp; make a floatjsrfascldy#0dec1:lda(inbuf}f),yphaand#$7Fjsrdbgchrinyplacmp#0bpldec1;jsrdbgeolldx#cktxt\ldy#cktxt^jsrdbgstrldachksum+1}jsrdbghexldachksumjsrdbghexjsrdbgeolfinish:jsrclosef; close em;; unless done flag, go back for more comman}ds;ldadonebneexitjmpstartexit:;; make dead sure they're closed;jsrclosef;; All done!;RTS *=GOADR.wor}dSTART; .END; -593241(C)1984 ICD.xL_ ,<==("#%  0 ,0 9 $0L8M2280  0  } 96L= , 701/6дک,0`*  , 7hhhL()̀ 1/7L/I/ }0` ZLV / &/1 :H9H`!"PRSWNO?fQ< m 0$20 9 $('`( "  }0 񩠍 `He))))( )h`F)8)Ii )`)Ji(Lm $) , }0)))`$, $-  `$,P K`$, ),) `44`A,N,C,E($/0L5L }n $/0L4LR $/0LL.('*` ,p77hh`8,P8j`+ e+i+* }+`54-nn5 -ꍂ4 `+He+i+h *+ `+5e+i+ n*}+5)$JN5*J8*$`+,P  n5n,P5Ie+i+ n5*ۥ5I+`΃΂.}*N--.' "(`L)` ZLV ` 'Ѝ)` $ I  $ . )_ .}2)  ,-`I `,P))` $` $)@  8$`  W  & M$}/0 K w TE,C b sLV,3   W   ZLV W M T `LV$3 M T ]LV!)`}) & 2 M&8`,PI.L)ݩI,,P轀I.L),}PI݀. `) $` ) = !I  W* ] v ) LV W* ]  vLV W *} W k ]LV"#$%`$I {){%.JJI #-) ` W * %$# ] v}LV   W 򩀅*  ZLV W k y#` 0 E bLV#$%   W  0 y E b sLV (}& m $  G&E (("ܩC`# %#,,FP+`Z,,] 7_ 7PQ 7R}S 7 ,( , ,a ,` , ,TU 7VW 7XY 7 ,% 7 ,Z[ 7#Т $`P,`P ,`hh8`(}a b#`8`,P %LЍ`    N NNN } N N1NN  ֳ(IޕII݀I LL`m!F}F!F F`%F%F`%F)%F)1CEi51CE`¢: :%Fi::11 !7LS1F`EEF!F0 i }"F: wE: :i "F:"FFҭ Fi:::L:DE^E~9 : S4 Y5 c5+F-FFDE}^E *9 : S4 Y5.FF-FF8['FI(F[)FI*F+F,F h4FLX3 5FJFF,+F0F\1F]2F^}$ 5+F)FP6*FQ6'FR6(FS60 5.FX6FY@F(0+F* 5\0F]1F^2F)FmX)F*FmY*F'F8X'F(FY(F } 5.F,+F0.F 'F (FL2.FL0/FFF-F[)FI*FDE^E 9 : S4 c5 h4CED]EDFJF F , },F" 53F\4F]5F^$ 5,FL3 5)FV6*FW6/F6FX6m)F)F@FY6m*F*F6 5* 5\3F]4F^5F 5 /F!}/F.FL3,+F-F,F0L=2L0 Z6L0΢7L:F: :-FFF0FFF8` e0-F 4-F"}F!F !F F F!F  FF!F 1`F?E@E: ><FEF. 55 )  55#} 㩛E`ܢ: : al DE m5CE`^E m5]E`) ʎ wER @ 50 ~Eɀa,D`L $}6l5555L~0S1:5a12*1016B60J 6D!6E"6H#6I V0`` B V䩡7 : Z6L0CEwEP%} EPEP EP%& 6$Fm#F 6$F #F 6$F#F$F0 6 ֩&},,,`<&FР &F)`0)?6`8`LJ:K+*OPUI-=VCBXZ436521, .NM?REYTWQ907~8<>FHDGSA '}7v7w7 u7 7 7 6~ɛ# 7 u7 z7 l7: l7 u7ͩ z7:``y7:բ: ::y7`y7:բ: :y7(}` 7 DISK ERROR START to restart 7    7SPACE Change item`******************* '4352 COLORS!' ** done by RZoG ** of SLIGHT! ******************* opt 21start equ $a000*} org startmain lda #0 sta $22f jsr dlmak jsr tamak jsr on_it jmp loophscr dta b(0)+}pom1 dta b($f)pom2 dta b(0)line dta b(0),b(0),b(0),b(0),b(0) dta b($11),b($22),b($33),b($44) dta b($55),b(,}$66),b($77),b($88) dta b($99),b($aa),b($bb),b($cc) dta b($dd),b($ee),b($ff),b($fe) dta b($ed),b($dc),b($cb)-},b($ba) dta b($a9),b($98),b($87),b($76) dta b($65),b($54),b($43),b($32) dta b($21),b($10),b(0),b(0)dl .}equ $9000tab1 equ $9200tab2 equ $9300dan equ $9400dlmak ldy #0 ldx #6 lda #$70dma1 jsr dma3 dex/} bne dma1 ldx #136dma2 lda #$5f jsr dma3 lda line jsr dma3 0} dex bne dma2 lda #$41 jsr dma3 lda
dldma3 sta dl,y iny 1} bne dma4 inc dma3+2dma4 rtstamak lda #0 taytam1 sta dan,y iny adc #$10 bne tam1 ld2}x #0tam2 lda pom1 sta pom2tam3 ldy pom2 lda dan,y sta tab1,x ldy pom1 lda dan,y sta t3}ab2,x inx dec pom2 bpl tam3 dec pom1 bpl tam2on_it lda
dl 4} sta $231 lda #$21 sta $22f lda #$ff sta $d00d sta $d00e lda #3 sta $d008 5}sta $d009 lda #$0 sta $2c0 sta $2c1 sta $2c8 lda #34 sta $d000 lda #190 sta6} $d001 rtsloop lda #27lo1 cmp $d40b bne lo1 lda #$40 sta $d01b sta $d40a ldx #07}lo2 lda tab1,x sta $d40a sta $d01a lda hscr eor #2 sta hscr sta $d404 lda lo2+28} * eor #1 * sta lo2+2 * inx cpx #136 bne lo2 lda #$0 sta $d40a sta $d9}01a lda lo2+2 eor #1 sta lo2+2 lda hscr eor #2 sta hscr lda $d20f and #$8:} bne loopexit lda #0 sta $d000 sta $d001 rts END OF FILEZ10 ;SAVE#D5:B>ENTMENU.M6520 ;30 ;This routine invokes the Black40 ;Box menu. Use X=USR(1536) from50 ;BASIC, or JSR $0601<} from ML.60 ;70 *= $060080 .OPT OBJ,NO LIST90 PLA 0100 SEI ;kill interrupts0110 LDA =}#20120 STA $D1C0 ;set bank #20130 LDY #$100140 X1 LDX #20150 LDA $D800,Y ;look for 30160 CMP TABLE,X >};particular0170 BEQ X2 ;bytes in the ROM;0180 INY 0190 BNE X1 ;if we don't find0200 RTS ?} ;them, bail out0210 X2 INY 0220 DEX 0230 BMI X30240 LDA $D800,Y0250 CMP TABLE,X0260 BNE X10270 @} BEQ X20280 X3 DEY ;ok found em at $d8yy0290 STY X4+10300 LDA #[RETURN-1]/2560310 PHA ;pusA}h return address0320 LDA #[RETURN-1]&2550330 PHA ;cause the BB pushes0340 PHA ;the Y register B}prior0350 LDA #$FF ;to the code we jump into0360 X4 JMP $D800 ;this is modified by the STY X4+1 instruction0370 C};0380 RETURN LDA #00390 STA $D1C0 ;back to normal0400 CLI 0410 RTS ;and return0420 ;0430 TABLE .BD}YTE $D0,$08,$29 ;bytes to scan for# X;SAVE#D5:B>ENTMENU.M65X;#X;This routine invokes the Black($X;Box menu. Use X=USR(1536) from2!X;BASIC, or JSR F}$0601 from ML.<X;FPF=EIZ7d=;;kill interruptsnQ>xP;;set bank #2%> X1$>Q8;;look for 3G}RTABLE9;;particularFX2;;bytes in the ROM;3HX1;;if we don't find:;;them, bail outX230GX3Q8 H}RTABLE9HX1FX2X31;;ok found em at $d8yy" 'X4,Q>RETURN 65;;push return address@Q>RETURN I}J5;;cause the BB pushesT5;;the Y register prior^!Q>;;to the code we jump intoh8X4!;;this is modified by the STYJ} X4+1 instructionrX;|RETURNQ>P;;back to normal.:;;and returnX;%TABLE ==);;bytes to scan fory>hxѠ<`0 <3H4HHLةX`) E