CP/M 2.2 DOUBLE-DDISKETTE^CPM FROMNORTH * STAR ---------SYSTEM--TRACKS-BIOS USER CPM CCP CPM BDOS --------DIR.SEC1DIR.SEC2DIR.SEC3DIR.SEC4--------CPM DATADATASEC1DATASEC2DATASEC3DATASEC4........ C1 COM C1 COMuCHAIN C DEF/C SUBC2 C b !"#$C3 C %%&'()C4 C **+,-./C5 C 70123456C6 C 789:C7 C j;<=>?@ABCDEFGHC8 C 8IJKLMNOC9 C PQRSCC SUBTCL SUBUASSEMBLECOMVWXYZ[\]^_`abcde*K͞+a{԰'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o!a{   `OE!y6$ -7rBo&))T])))!y~#foʏ> +͆#~t##ha{ !p!*w#œ:**ʳ*!ѷ! (5CRou~EXECFPRINTEXIK 7*^#V#z+V+^+*!=! Broken pipe &-08;1 *&+*|/g}/o#9*&#"z{  "7*"*"*"k"**6 #ppear?  $$5x %arÌ+ !"!j  !  |A !ά! "#|e !"!|  Output filename? Open failureÛ $$5x %ùr!"*| ͌ *|ʸ  ! ͏ !͒ ͕ | !" !"!¤!͘ "#| !"! ͏ â ͌ Input filename? Open failureM d, Z,Ïõ0-u -*| !! , |v !/ 2 !! , |ʖ !/ 2 ! 5 |ʩ 8 ! 5 |ʼ ; ! 5 | > ! 5 | A !' 5 | D G J N ASSEMBLECOM!fghijLINK COMbklmnopqrstuvwC1 C Dxyz{|}~C CCC SUBMIT C 1FILELINKSUBCOMPILE SUBSTDLIB TXTCLINK COM$TIME C #RUNTIME TXTC1 COMP#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77z7:O:GPY|:O:G|`i#z͠8{͠8K|PY##|^|]^%}o}no-|G}O>>Y> > ø$b É ø^) . ç íaÔ x"p!,?!"rt"n&: ͐| ͐* = !,@  i !"!9 a.+.b<.h.!9DM! "**pҕ !~#fo n}ʈ * !~#fo n&|g}o!~#fon&|g}o`is#r͐ *" !9@globalsí b!9DM`is#r͐*p `i~#fo n} ͐ͪ ͐`is#rý !9 Ì+h.Kb<..*|" !M  *|2 !e    * !|   missing closing bracketmissing closing #endif errors in compilation.à r; identifier$-ÈJä%Ì+$''R&!9DM! |F!"Ä`i|]!`i|u`i!|~!"Ä!"! 9invaild identifierò,ÛÌ+\bu!9DM!ͣ|4! ^#Vr+sͦ`is#rz$! n}͐͐`is#r!! 6! n}!͐͐`is#r1! 6`i6#6e! n}I`i6#6e! n}^`i6#6e`i6#6! n}}d*p!,?!ڥ!ͩ!*p! s#r*p"p͐! s#rd*͐ͬ"*! s#r*r!a!"ͩ!+$,R&÷&õcu(-*/A%d,lZs\bc. ø$!9DM`i|Y!!|t!`i! s#rz! ~#fo n}ʥ`i ! ~#fo n}`i ! ~#fo 6`i ÐMp!,?*!9ÉMp! s#r*p~#fos#r`i͐ ! ~#fo 6! ~#fo ! ~#fo ss! ~#fo! ~#fo ! ~#fo sss`i *$w#w!U|`i|M$##*$s#r!W!mM$*#| !o|!8͐|)!Tͤ͐`is#r!jͭ͐8!9]must be constantnegative size illegal]Í, %z%ä%'&''÷&àA%Ì+!9DM! w#wM$|ªW!`o|! 6#6! ^#Vr+sr*! ^#Vr+su! 6#6`ix|{`i~|`í͐ ͐ !͐`ḯ͇|?W!bo|T!d͊Õ!9*,expected commaã %d,þmZ,ÜÉ""H#Ïç7v|»M$|ʻW!!`y|!|W!!ey|!|W!i!9DMMr`is#rM$! s#r! s#r͐͐*$s#r͐*rs#r!!|z͐! s#r͐͐*$s#r͐*rs#r͐!9elseø$æ)Á)"Lsc\b.*!9DMMr`is#rM$! s#r! s#r! s#r! s#r`i͐͐͐͐͐*rs#r͐*$s#r! 9ðø$æ)Ú#.*ç7#Á))dc($s\b!9DMMr`is#rM$! s#r͌! s#r͌! s#r͌! s#r͌! s#r`iͻ"! 6";! w#w͐ bͻ|bͻ! n&b! ^#Vr+s`iͻs;͐ `i6! nͻʟ! n} ‘ͻ|ʟ!͐ |¶!!"*|!=!Ȩ`i"#|!X!"!"9invalid file name for includemissing file name for includenested include not allowedOpen failure on include fileÍ-ÈJä%Ì+$''R&!9DMx! {|ʯ!"`i~|!́̈́`i͇|`i͊|!"!"! 9invalid*r! s#r*r"rd*! s#r*++"*r!aL!>ͩ!*r! s#r*r"rd͐ ͐ͯ! ~#fo ! ns! ~#fo ! ns! ~#fo ! ns! ~#fo ͐s! ~#fo͐s! ~#fo ͐s!!9[global symnol table overflowlocal symbol table overflowlocal symbol table overflowc,Ì+!{]|y!}`;missing semicolonáÝ',.h.$*$w#w͒!͕|M$|*#͛͘í͞*$6#6#endasm7ä%Ì !q|Û!,?**rs#r*$w#wM$|ʛ!!|m!"%Ø!!|ʍ!"%Ø!ÛC(ʲ!+.*$w#w!,?**rs#r14*$s#r! 9illegal function or declaration(illegal function or declarationgobal symbol table overflow)illegal argument name),expected commacharintwrong number argsð,.KÌ+ %z%I)!9DM!A͞|!8`i͡| !Cͤͧ,ͧ;ͧ|͂|ͅW!!ky|2͈*$6#6W!!ny|V͋*$6#6W!!ty|z͎*$6#6W!!xy|ʞ͑*$6#6W!!y|͔*$6#6W!!y|͗*$6#6W!!y|͚*$6#6W!͂|#W!͂|E͝*$6#6W͠*$6 #6M$charint{ifwhileforswitchreturnbreakcontinue;#asmå,s*$^#Vr+s!͟|M$|͢ô*$^#Vr+s}ø$"Ls\bd,Á)c͒|͕͛͘|"͕͐͘͞! s#r͐ ͐͐͡ ͤ͛|\͕͐͐ͤͧ͘͞|͕͐ ͪ͐ͤ͐͐͞͞*rs#r͐ͭ*$s#r͕!9 ø$æ)Ú#.*ç7Ád($r$cd,kLÌ+Á),ád"e<..%h.\bs!9DM! w#wMr! s#rM$! s#r! s#r!  s#r!  s#r! s#r! |t o"|ʈ o"|ʖ o"! s#rM$##*$s#r!!x"|L!! | !}"ù ̓,!̓)`i̓s#r! ^#Vr+s)! s#r4!!"!"|I!!"l"!!"|ʋ!! s#r̓!"|ˆ!!"l"!"|i"̓ ! w#w̓̓! s#r̓̓̓̓/"̓)`i~#fo !" ! ^#Vr+s)! ~#fo !̓ ̓*rs#r̓ *$s#ro"l" ù !9caseBad constantToo many case statments:Missing colondefault:Missing colon},"A%ç7\bc"|""!""#I*\b&$$*n&$%.<.!9DM!?%%͐!%@M%-*/ %D%!x%*!G%|ͣt%J%|͝;À% %}%|‘%!â%*#"+n&ö%-É* %*z%!9DMͧ%ͭ%ͪ%|%!&`iw#wͭ%Ͱ%|&! ~#fo`i^#Vr+sͳ%s%! ~#fo͐6!&!90&Ì+(!>&*&-&illegal symbol nameX&Ö/!9DM`is#r͐*pʨ&!͐͐U&|ʗ&͐î&͐`is#rh&!î&!9&u5vt0!9DM!'`iͺ&͐T`iͽ&!%'`iͽ&`i&!P9-((|&)((|#)()D)((|D)(|>)D)(&)(R),Ì+!9DM͐L)|p)!r)O)missing braketÍ)%+.h.!9DM͐̈́)͇)͊)ì)Ì+!9DM*2$bx!9DM! $͐n} %! ^#Vr+snalready defined symbol or function ""-'Ö/!9DM!,?!`is#r͐*rʎ'!͐͐*'|}'͐Ô'͐`is#rN'!Ô'!9ø'$É ×v|xKb1.h.!9DM͠'*|'ͣ'*|'(*|'Ȩ! s#r*#"(¤! s#r*#"͐ͦ'`is#rzh(͐ A(*OA(͐D(h(͐ e(*#"+͐s(*6͐ҋ(͐²(*|ʤ(*ͩ'!"ò(*ͩ'!"*|(*|(*|(ͬ'ͯ'!Ͳ'͵'!"('!9)*&+ %z% n&*|ͣ"+! n&*|ͣ2+Ý'1z%*n}V+*|M+!)+,+3+/+!9DM! n&0ͯڈ+! n&9ͯÛ+u5vÅwt0!9DM͐X`i͏+!_,`i͒+*!P s#r͐P|+!P w#w`i͕+!R s#r͐P*6,͐Pn}6,!R ^#Vr+s`i!P ^#Vr+sns+͐R`i6!b,`i͒+`i͘+V,!T9 ""v,-Ö/* %&+!9DMg,͐͐*!j,`is#rz,*͐"p,m,|,s,ó,!,!,!9,-*/!9DM,͐*!Á.!9DM! ^#Vr+sn&/|(/ /!9DM`iw#w! ~#fo͐n}ʆ/! ~#fo͐n! ~#fo͐n}z/!Í/`i^#Vr+s8/͐Í/!9Ü/*!9DM`iw#w͐͐  0! ~#fo͐n! ~#fo͐n}/ 0! ~#fo͐n}/ 0! ~#fo͐n}0 0`i^#Vr+sê/! ~#fo͐n&͙/|B0!k0! ~#fo͐n&͙/|d0!k0͐k0!9Õ0Kb.h.1Á.u5Åw5v$!9DMw0!z0}0w0!P w#w͐P*0͐Pn} 0̀00! ̓0!P ^#Vr+sö0!^̓0}0w0!":32|3!a52:32\/3 2 2 2 22 2!" 242'«3!' 2 22'ʝ32|~3!o52Ý32\’3 2 2 2 2_3 2!' 242/ 42* 4222*32/42|3232*|34322422|4`iw#w22|T4͐N4`i^#Vr+s! 2s 24͐! 6! 2`is#rzʡ4`i^#Vr+sn! s{ʞ4! n& 2t44`iw#w`i^#Vr+s! n! s{4! n& 2ç44 2 2z2! 2*O4!52!""*#"+*#"+Jns{+55!"! 9#endif#endifmissing escape charactermissing quotemissing apostropheline too long!9DM*! ns*һ5*#"! n&!9DM! s#r! s#r`i6#6'͐ |6͐ ! s#r! ~#fo! ^#Vr+s6-͐ڭ6͐ ͐0! s! n}0Z6͐+|Z6͐|ʄ6! 6#6! ~#fo! ^#Vr+s! ns͐ ͐! s#r͐ `is#r6! ~#fo͐6͐ 6!9!9DM*J! ns*O6*#"! n&.PL 51 .FI C1.C .FI C2.C .FI C3.C .FI C4.C .FI C5.C .FI C6.C .FI C7.C .FI C8.C .FI C9.C MAILMRGEOVR<CHAIN BAKCHAIN CHAIN $$$WSMSGS OVRZFRESET TST QUICK TST RANDSEEKTST SEEKTIMETSTRANDREADTSTSERVOTSTTSTIDFIELD TST/*********************************************************************/ /* */ /* This C compiler is copied from Dr. Dobb's Journal of Computer */ /* Calisthenics & Orthodontia (issue number 45) */ /* -- Distribution and use is unrestricted for non-commercial use. */ /* */ /* RAF 8-8-80 */ / /* Define system dependent parameters */ /* Stand-alone definitions */ #define BUFSIZ 1030 #define ERROR -1 #define FALSE 0 #define TRUE 1 #define eol 13 #define CR 13 #define LF 10 #define BS 8 #define TB 9 #define FF 12 /* Define symbol table parameters */ #define lvalsize 3 #define SWITCH_MAX 254 #define symsiz 15 #define symtbsz 6000 #define numglbs 300 #define startglb symtab #define endglb startglb+numglbs*symsiz #define starinter to a varble */ #define function 4 /* entry is a function */ /* Define possible entries for "type" */ #define cchar 1 #define cint 2 /* Lenght of possible entries for "type" */ #define lchar 1 #define lint 2 #define lpoint 2 /* Define possible entries for "storage" */ #define statik 1 #define stkloc 2 #define stkarg 3 /* values returned by heirxx */ #define LOADED 0 /* value on top of stack */ #define ADDRESS 1 /* address of lvalue on stack */ 7Ö/!9DM`iw#w͐*Ҙ7!͐!͐7|e7`i^#Vr+sn}^7F7͐Þ7`i^#Vr+sn}}7e7`i^#Vr+sn}ʕ7}77!Þ7!9ð7L7!9DM! w#w! `iͭ7`iͪ7͐7!98: %ånz%PPËQMjcjÀj×jíjÿjjjQ!9DM͐ ͐7`is#r7=U87=U8͐ :͐ w#w7>=l8>8>+x8>8>-„8>8>*8>!9>/œ8>C9>%¨8>e9>&´8>ʇ9>^8>ʩ9>|8>997͐͐7977͐͐7͐* */ /*********************************************************************/ /************************************************/ /* */ /* small-c compiler */ /* rev. 1.1 */ /* by Ron Cain */ /* */ /************************************************/ tloc endglb+symsiz #define endloc symtab+symtbsz-symsiz /* Define symbol table entry format */ #define name 0 #define ident 9 #define type 10 #define indcnt 11 #define storage 12 #define offset 13 #define offset1 14 /* System wide name size (for symbols) */ #define namesize 9 #define namemax 8 /* Define possible entries for "ident" */ #define variable 1 /* a normal varble */ #define array 2 /* array of varbles */ #define pointer 3 /* po #define NOTLOADED 2 /* address in lvalue in array not loaded */ #define CONSTANT 3 /* constant in lval */ /* Define the "while" statement queue */ #define wqtabsz 100 #define wqsiz 6 #define wqmax wq+wqtabsz-wqsiz /* Define entry offsets in while queue */ #define wqsym 0 #define wqsp 1 #define wqloop 2 #define wqlab 3 #define wqend 4 #define wqbody 5 /* Define the literal pool */ #define litabsz 2000 #define litmax litabsz-1 /* Define the input line */ #define linesize 80 #define linemax linesize-1 #define mpmax linemax /* Define the macro (define) pool */ #define macqsize 1000 #define macmax macqsize-1 /* Define statement types (tokens) */ #define stif 1 #define stwhile 2 #define stfor 3 #define stswitch 4 #define streturn 5 #define stbreak 6 #define stcont 7 #define stasm 8 #define stexp 9 /* name of some function called by code gen step */ /* ptrs to next entries */ int wq[wqtabsz]; /* while queue */ int *wqptr; /* ptr to next entry */ char litq[litabsz]; /* literal pool */ int litptr; /* ptr to next entry */ char macq[macqsize]; /* macro string buffer */ int macptr; /* and its index */ char line[linesize]; /* parsing buffer */ char mline[linesize]; /* temp macro buffer */ int lptr,mptr; /t, /* iob # for output file (if any) */ input2, /* iob # for "include" title */ line1, /* current line number in main file */ line2, /* current line in include file */ ctext, /* non-zero to intermix c-source */ cmode, /* non-zero while parsing c-code */ /* zero when passing assembly code */ cif, /* state of preprocess if statement */ lastst; /* last executed statment type */ char *cptr; a:cc1 c1.c -e 8000 a:cc1 c2.c -e 8000 a:cc1 c3.c -e 8000 a:cc1 c4.c -e 8000 a:cc1 c5.c -e 8000 a:cc1 c6.c -e 8000 a:cc1 c7.c -e 8000 a:cc1 c8.c -e 8000 a:cc1 c9.c -e 8000 clink c1 c2 c3 c4 c5 c6 c7 c8 c9 c1 c2 c3 c4 c5 c6 c7 c8 c9 -r e00 -s  MTC MACjDISKDRVRBAKb}DISKDRVRMACb_e~NSTAR DOCERROR BAKERROR DOCC SUBMPLOGIC OVL #ifndef TRUE /* see if need include file */ #include #endif /* */ /* Get required array size */ /* */ /* invoked when declared variable is follwed by "[" */ /* this routine makes subscript the absolute */ /* size of the array. */ needsub() { int num[1]; if (match("]")) return 0; /* null size */ if (number(num)==0) { /* go after a number */ error("must be constant"); /* it isn't */ while(ch() != ',' && ch() != ';' && ch()) gch(); return 1; } #define EQ "@comp" #define GE "@comp+25h" #define GT "@comp+12h" #define LE "@comp+2fh" #define LT "@comp+1ch" #define NE "@comp+19h" #define UGE "@ucomp+13h" #define UGT "@ucomp" #define ULE "@ucomp+1ch" #define ULT "@ucomp+0ah" #define PREINC "@incdec" #define PREDEC "@incdec+08h" #define POSTINC "@incdec+10h" #define POSTDEC "@indec+1ah" /* Now reserve some storage words */ char symtab[symtbsz]; /* symbol table */ char *glbptr,*locptr; * ptrs into each */ /* Misc storage */ int nxtlab, /* next avail label # */ litlab, /* label # assigned to literal pool */ sp, /* compiler relative stk ptr */ argstk, /* function arg sp */ ncmp, /* # open compound statements */ errcnt, /* # errors in compilation */ eof, /* set non-zero on final input eof */ input, /* iob # for input file */ outpu /* work ptr to any char buffer */ int *iptr; /* work ptr to any int buffer */ /* file io buffers */ char finp[BUFSIZ]; /* input file buffer */ char finp2[BUFSIZ]; /* input 2 file buffer */ char fout[BUFSIZ]; /* ouput file buffer */ rg sp */ ncmp, /* # open compound statements */ errcnt, /* # errors in compilation */ cif, /* state of preprocess if statement */ lastst; /* last executed statment type */ char *cptr; if (num[0]<0) { error("negative size illegal"); num[0]=(-num[0]); } needbrack("]"); /* force single dimension */ return num[0]; /* and return size */ } /* */ /* Begin a function */ /* */ /* Called from "parse" this routine tries to make a function */ /* out of what follows. */ newfunc() { char n[namesize],*ptr; if (symname(n) == 0) { error("illegal function or declaration"); kill(); return; } if (!match("(")) { error("illegal function or declaration"); kill(); return; } if(ptr=findglb(n)) { /* already in symbol table ? */ if (ptr[ident] != function) multidef(n); /* already variable by that name */ else if(ptr[offset] == function) multidef(n); /* already function by that name */ else { ptr[offset]=function; csect(n); } /* otherwise we have what was earlier*/ /* assumed to be a function */ } /* if not in table, define as a function now */ else { /* fill in gobal symbol table */ if blanks(); /* if not closing paren, should be a comma */ if( streq(line+lptr,")") == 0) { if(match(",")==0) error("expected comma"); } if(endst())break; } locptr=startloc; /* "clear" local symbol table*/ sp=0; /* preset stack ptr */ while(argstk) { /* now let user declare what types of things */ /* those arguments were */ if (amatch("char",4)) { getarg(cchar); ns(); } else if (amatch("int",3)) { getarg(cint); ns(); } else { char n[namesize],c;int j,count; while(1) { count=0; if (argstk == 0) return; /* no more args */ if (match("*")) { j=pointer; ++count; while(ch()=='*') { ++count; gch(); } } else j=variable; if (symname(n) == 0) illname(); if (findloc(n)) multidef(n); data_parse(n,t,stkarg,j,count); if(endst())return; if(match(",")==0)error("expected comma"); } } /* */ /* Statement parser */ /* */ /* called whenever syntax require lastst=stfor; } else if (amatch("switch",6)) { doswitch(); lastst=stswitch; } else if(amatch("return",6)) { doreturn(); ns(); lastst=streturn; } else if(amatch("break",5)) { dobreak(); ns(); lastst=stbreak; } else if(amatch("continue",8)) { docont(); ns(); lastst=stcont; } else if(match(";")); else if(match("#asm")) { doasm(); ns(); lastst=stasm; } /* if nothing else, assume it's an expression */ else { expression(); ns(); return FALSE; error("Missing left parnthis"); junk(); return TRUE; } /* */ /* need closing parn */ /* written by Mike Bernson 1/81 */ needcparn() { if (match(")")) return FALSE; error("Missing right parnthis"); junk(); return TRUE; } /* */ /* need opening brace */ /* written by Mike Bernson 1/81 */ needobrace() { if (match("{")) return FALSE; error("Missing left brace"); junk(); return TRUE; } /* */ /* need closing brace */ /* written by Mike Bernson 1 (glbptr>=endglb) error("gobal symbol table overflow"); else { ptr=glbptr; glbptr+=symsiz; strcpy(ptr+name,n); ptr[ident]=function; ptr[type]=int; ptr[offset]=function; ptr[offset1]= ptr[indcnt]= ptr[storage]=0; } csect(n); } argstk=0; /* init arg count */ while(match(")") == 0) { /* then count args */ /* any legal name bumps arg count */ if (symname(n)) argstk=argstk+2; else{ error("illegal argument name"); junk(); } error("wrong number args"); break; } } if(statement()!=streturn) { /* do a statement, but if */ /* it's a return, skip */ /* cleaning up the stack */ modstk(0); ret(); } sp=0; locptr=startloc; dumplits(); litlab=getlabel(); } /* */ /* Declare argument types */ /* */ /* called from "newfunc" this routine adds a entry in the */ /* local symbol table for each named argument */ getarg(t) /* t = cchar or cint */ int t; { s */ /* a statement. */ /* this routine performs that statement */ /* and returns a number telling which one */ statement() { if (!ch() && eof) return; else if(amatch("char",4)) { declloc(cchar); ns(); } else if(amatch("int",3)) { declloc(cint); ns(); } else if(match("{")) compound(); else if(amatch("if",2)) { doif(); lastst=stif; } else if(amatch("while",5)) { dowhile(); lastst=stwhile; } else if (amatch("for",3)) { dofor(); lastst=stexp; } return lastst; } /* */ /* Semicolon enforcer */ /* */ /* called whenever syntax requires a semicolon */ ns() {if(match(";")==0)error("missing semicolon");} /* */ /* need semicolon */ /* written by Mike Bernson 1/81 */ /* */ needsem() { if (match(";")) return FALSE; error("Missing semicolon"); junk(); return TRUE; } /* */ /* need opening parn */ /* written by Mike Bernson 1/81 */ needoparn() { if (match("(")) /81 */ needcbrace() { if (match("}")) return FALSE; error("Missing right brace"); junk(); return TRUE; } /* */ /* Compound statement */ /* */ /* allow any number of statements to fall between "{}" */ compound() { ++ncmp; /* new level open */ while(match("}")==0) if(eof) return; else statement(); --ncmp; /* close current level */ } /* */ /* "if" statement */ /* */ doif() { int flev,fsp,flab1,flab2; flev=locptr; /* record current local level */ fsp=sp; /* record current stk ptr */ flab1= getlabel(); /* get label for false branch */ test(flab1); /*get expression, and branch false */ statement(); /* if true, do a statement */ sp=modstk(fsp); /* then clean up the stack */ locptr=flev; /* and deallocate any locals */ if (amatch("else",4)==0) /* if...else ? */ /* simple "if"...print false label */ {sprintlabel(flab1); return; /* and exit */ } /* an "if...else" statement. */ jque[wqloop]= /* and looping label */ que[wqend]=getlabel(); /* continue label */ que[wqlab]=getlabel(); /* and exit label */ addwhile(que); /* add to looping stack */ sprintlabel(que[wqloop]); /* loop label */ test(que[wqlab]); /* see if true */ statement(); /* if so, do a statement */ jump(que[wqloop]); /* loop to label */ sprintlabel(que[wqlab]); /* exit label */ locptr=que[wqsym]; /* deallocate locals */ sp=modstk(que[wqsp]); /* clean up stk ptr */ delwhile(); /* deletble pointer */ que[wqsp]=sp; /* save current stack pointer */ end_label= /* default exit label */ que[wqloop]= /* looping label */ que[wqlab]= /* loop exit varble */ que[wqend]=getlabel(); /* continue label */ addwhile(que); /* add to while stack */ if (needoparn()) { /* check to see if"(" exits */ delwhile(); /* no delete switch entry and */ return; /* return out of switch */ } expression(); /* expression for switch */ push(); if (needcparn()) { /* check for ")" */ de } else if (amatch("default",7)) { end_label=getlabel(); sprintlabel(end_label); if (!match(":")) error("Missing colon"); } else if (match("}")) { jump(que[wqlab]); /* jump past switch data */ temp=0; sprintlabel(label_switch); exec_switch(count,label_switch=getlabel(),end_label); sprintlabel(label_switch); while(temp>>> start of cc3 <<<<<<<<< */ /* */ #ifndef TRUE /* see if need include file */ #include #endif /* Perform a function call */ /* */ /* called from heir11, this routine will either call */ /* the named function, or if the supplied ptr is */ /* zero, will call the contents of HL */ callfunction(ptr) char *ptr; /* symbol table entry (or 0) */ { int nargs; nargs=0; blanks(); /* already saw open paren */ if (ptr==0) push(); /* calling HL */ while (streq(line+lptrturn ((streq(line+lptr,";") ||(ch() == 0))); } suberror(sname) char *sname; { char msg[80]; strcpy(msg,"identifier \""); strcat(msg,sname); strcat(msg,"\" is not a vaild array base"); error_prt(msg); while(1) { if (endst()) return; if (ch()==']') { gch(); return; } gch(); } } illname() { error("illegal symbol name"); junk(); } undefine(sname) char *sname; { char msg[80]; strcpy(msg,"undefine identifier \""); strcat(msg,sname); strcat(msg,"\""; ptr=ptr+symsiz; } return 0; } findloc(sname) char *sname; { char *ptr; ptr=startloc; while(ptr!=locptr) { if(astreq(sname,ptr,namemax))return ptr; ptr=ptr+symsiz; } return 0; } /* Test if next input string is legal symbol name */ symname(sname) char *sname; { int k;char c; blanks(); if (!alpha(ch())) return 0; k=0; while(an(ch())) sname[k++]=gch(); sname[k]=0; return 1; } /* Return next avail internal label number */ getlabel() { return (++nxtlab); */ /* "continue" statement */ /* */ docont() { int *ptr; /* see if any "whiles" are open */ if ((ptr=readwhile())==0) return; /* no */ modstk((ptr[wqsp])); /* else clean up stk ptr */ jump(ptr[wqend]); /* jump to end label */ } /* */ /* "asm" pseudo-statement */ /* */ /* enters mode where assembly language statements are */ /* passed intact through parser */ doasm() { cmode=0; /* mark mode as "asm" */ while,")") == 0) { if (endst()) break; expression(); /* get an argument */ if (ptr == 0) swapstk(); /* don't push addr */ push(); /* push argument */ nargs=nargs+2; /* count args*2 */ if (match(",") == 0) break; } needbrack(")"); if (ptr) call(ptr); else callstk(); sp=modstk(sp+nargs); /* clean up arguments */ } junk() { if(an(inbyte())) while(an(ch())) gch(); else while(an(ch()) == 0) { if(ch() == 0) break; gch(); } blanks(); } endst() { blanks(); re); error_print(msg); } /* */ /* written By Mike Bernson 4/81 */ /* */ multidef(sname) char *sname; { char msg[80]; strcpy(msg,"already defined symbol or function \""); strcat(msg,sname); strcat(msg,"\""); error_print(msg); } needbrack(str) char *str; { if (!match(str)) error("missing braket"); } needlval() { error("must be lvalue"); } findglb(sname) char *sname; { char *ptr; ptr=startglb; while(ptr!=glbptr) { if (astreq(sname,ptr,namemax)) return ptr } /* Print label at start of line */ sprintlabel(label) int label; { printlabel(label); col(); nl(); } /* Print specified number as label */ printlabel(label) int label; { outstr("@"); outdec(label); } /* Test if given character is alpha */ alpha(c) char c; { return((c>='a' && c<='z') || (c>='A' && c<='Z') || c=='_'); } /* Test if given character is numeric */ numeric(c) char c; { return(c>='0' && c<='9'); } /* Test if given character is alphanumeric */ an(c) char c; { return(alpha(c) || numeric(c)); } /* Print a carriage return and a string only to console */ pl(str) char *str; { putch('\r'); while (*str) putch(*str++); } addwhile(ptr) int ptr[]; { int k; if (wqptr==wqmax) { error("too many active whiles"); return; } k=0; while (k=linemax) || (k==26)) break; if (k != '\r') line[lptr++]=k; } line[lptr]=0; /* append null */ if(k<=0 || k==26) { if (input2) { close(input2); input2=0; } else { close(input); input=0; } } if(lptr) { if(ctext && cmode) { comment(); tab(); outstr/* >>>>>> start of cc4 <<<<<<< */ #ifndef TRUE /* check to see if need include file */ #include #endif keepch(c) char c; { mline[mptr]=c; if (mptr=linemax) || (k==26)) break; if (k != '\r') line[lptr++]=k; } line[lptr]=0; /* append null */ if(k<=0 || k==26) { if (input2) { close(input2); input2=0; } else { close(input); input=0; } } if(lptr) { if(ctext && cmode) { comment(); tab(); outstre if (ch() == '\\') { keepch(ch()); gch(); if (!ch()) { error("missing escape character"); break; } keepch(ch()); gch(); } else if(ch()=='"') { keepch(ch()); gch(); while(ch()!='"') { if(!ch()) { error("missing quote"); break; } if (ch() == '\\') keepch(gch()); keepch(gch()); } gch(); keepch('"'); } else if(ch()=='\'') { keepch('\''); gch(); while(ch()!='\'') { if(!ch()) { erame)) while(c=macq[k++]) keepch(c); else { k=0; while(c=sname[k++]) keepch(c); } } else keepch(gch()); } keepch(0); if(mptr>=mpmax) error("line too long"); lptr=mptr=0; while(line[lptr++]=mline[mptr++]); lptr=0; } addmac() { char sname[namesize]; int k; if (symname(sname) == 0) { illname(); kill(); return; } k=0; while(putmac(sname[k++])); while(isspace(ch())) gch(); while(putmac(gch())); if (macptr >= macmax) error("mar return c; } outstr(ptr) char *ptr; { while(outbyte(*ptr++)); } nl() { outbyte('\r'); outbyte('\n'); } tab() { outbyte('\t'); } col() { outbyte(':'); } error(ptr) char *ptr; { char buff[80]; int j,k; strcpy(buff,ptr); strcat(buff," \""); j=lptr-10; if (j<0) j=0; k=strlen(buff); while(j-15= 0; postion -=4) outbyte(hex[(value>>postion) & 0x0f]); outbyte('h'); } 0x0f]); outbyte('h'); }/* number of case statement in switch */ int label; /* label for switch ttring[j++]=c; } number=number%k; k=k/10; } string[j]=0; return string; } /* */ /* to output number as a hex value */ /* */ /* written june 28, 1981 by Mike Bernson */ /* */ outhex(value) int value; { int posti /********************************************************/ /* */ /* expression handler */ /* */ /* table below show precedence of operator */ /* */ /********************************************************/ /* operator * routine * associativity */ /********************************************************/ /* | ++ -- - * & * heir10 * left to right */ /********************************************************/ /* * / % * heir9 * rigth to left */ /************************************/ /* ^ * heir3 * left to right */ /********************************************************/ /* | * heir2 * left to right */ /********************************************************/ /* && * heir1e * left to right */ /********************************************************/ /* || * heir1d * left to right */ /********************************************************/ /* = -= += *= %= * heir1 * left to right */ /* /= &= ^= |= * * */ /***************************************char ptr[]; { ot(ptr); nl(); } ot(ptr) char ptr[]; { tab(); outstr(ptr); } streq(str1,str2) char str1[],str2[]; { int k; k=0; while(str2[k]) { if (str1[k]!=str2[k]) return 0; k++; } return k; } astreq(str1,str2,len) char str1[],str2[];int len; { int k; k=0; while (k=1) { c=number/k + '0'; if (c != '0' || k == 1 || zs) { zs=1; string[j++]=c; } number=number%k; k=k/10; } string[j]=0; return string; } /* */ /* to output number as a hex value */ /* */ /* written june 28, 1981 by Mike Bernson */ /* */ outhex(value) int value; { int posti**********************************/ /* + - * heir8 * left to right */ /********************************************************/ /* << >> * heir7 * left to right */ /********************************************************/ /* < <= > >= * heir6 * left to right */ /********************************************************/ /* == != * heir5 * left to rigth */ /********************************************************/ /* & * heir4 * left to rigth */ /***********************************************************/ #ifndef TRUE /* check to see if need include file */ #include #endif expression() { int lval[lvalsize],status; status=FALSE; rvalue(lval,heir1(lval,&status)); return status; } heir1(lval,status) int lval[]; int *status; { int k; char *ptr; k=heir1d(lval,status); if (ch() != '=' && nch() != '=') return k; *status=FALSE; switch(ch()) { /* just an equal */ case '=' : gch(); equal(lval,k); break; /* add value then store */ case '+' : case '-' : gch();gch(); equal_exp(lval,k); size_adjust(lval); if (ch() == '-') sub(); else add(); k=1; break; case '*' : gch();gch(); equal_exp(lval,k); mult(); k=1; break; case '/' : gch();gch(); equal_exp(lval,k); div(); k=1; break; case '%' : gch();gch(); equal_exp(lval,k); mod(); k=1; break; case '&' : gch();gch(); equal_exp(lval,k); and(); k label=getlabel(); while(1) { if (match("||")) { truejump(label,*status); *status=TRUE; rvalue(lval2,heir1e(lval2,status)); } else { sprintlabel(label); return 0; } } } /* */ /* written by Mike Bernson 1/81 */ /* */ heir1e(lval,status) int lval[]; int *status; { int label; int k,lval2[lvalsize]; k=heir2(lval,status); blanks(); if (ch() != '&' || nch() != '&') return k; rvalue(lval,k); label=getlabel(); while(1) { if (match("&&")) {nt lval[]; int *status; { int k,lval2[lvalsize]; k=heir4(lval,status); blanks(); if (ch() != '^' || nch() == '=') return k; rvalue(lval,k); while(1) { if (match("^")) { push(); rvalue(lval2,heir4(lval2,status)); xor(); *status=TRUE; } else return 0; } } heir4(lval,status) int lval[]; int *status; { int k,lval2[lvalsize]; k=heir5(lval,status); blanks(); if (ch() != '&' || nch()=='&' || nch() == '=') return k; rvalue(lval,k); while(1) { if (matcush(); rvalue(lval2,heir6(lval2,status)); ne(); *status=TRUE; } else return 0; } } heir6(lval,status) int lval[]; int *status; { int k,lval2[lvalsize]; k=heir7(lval,status); blanks(); if ((streq(line+lptr,"<") == 0) && (streq(line+lptr,">") == 0) && (streq(line+lptr,"<=") == 0) && (streq(line+lptr,">=") == 0)) return k; if (streq(line+lptr,">>")) return k; if (streq(line+lptr,"<<")) return k; rvalue(lval,k); while(1) { if (match("<=")) { push(); continue; } ge(); } else if ((streq(line+lptr,"<")) && (streq(line+lptr,"<<")==0)) { inbyte(); push(); rvalue(lval2,heir7(lval2,status)); *status=TRUE; if (cptr=lval[0]) if (cptr[ident]==pointer) { ult(); continue; } if(cptr=lval2[0]) if (cptr[ident]==pointer) { ult(); continue; } lt(); } else if ((streq(line+lptr,">")) && (streq(line+lptr,">>") == 0)) { inbyte(); push(); r=1; break; case '^' : gch();gch(); equal_exp(lval,k); xor(); k=1; break; case '|' : gch();gch(); equal_exp(lval,k); or(); k=1; break; default: return k; } store(lval,k); return 0; } /* */ /* written by Mike Bernson 1/81 */ /* */ heir1d(lval,status) int lval[]; int *status; { int k,lval2[lvalsize]; int label; k=heir1e(lval,status); blanks(); if (ch() != '|' || nch() != '|') return k; rvalue(lval,k); testjump(label,*status); *status=TRUE; rvalue(lval2,heir2(lval2,status)); } else { sprintlabel(label); return 0; } } } heir2(lval,status) int lval[]; int *status; { int k,lval2[lvalsize]; k=heir3(lval,status); blanks(); if (ch() != '|' || nch() =='|' || nch()== '=') return k; rvalue(lval,k); while(1) { if (match("|")) { push(); rvalue(lval2,heir3(lval2,status)); or(); *status=TRUE; } else return 0; } } heir3(lval,status) ih("&")) { push(); rvalue(lval2,heir5(lval2,status)); and(); *status=TRUE; } else return 0; } } heir5(lval,status) int lval[]; int *status; { int k,lval2[lvalsize]; k=heir6(lval,status); blanks(); if ((streq(line+lptr,"==") ==0) && (streq(line+lptr,"!=") == 0)) return k; rvalue(lval,k); while(1) { if (match("==")) { push(); rvalue(lval2,heir6(lval2,status)); eq(); *status=TRUE; } else if (match("!=")) { p rvalue(lval2,heir7(lval2,status)); *status=TRUE; if (cptr=lval[0]) if(cptr[ident]==pointer) { ule(); continue; } if (cptr=lval2[0]) if(cptr[ident]==pointer) { le(); continue; } le(); } else if (match(">=")) { push(); rvalue(lval2,heir7(lval2,status)); *status=TRUE; if (cptr=lval[0]) if (cptr[ident]==pointer) { uge(); continue; } if (cptr=lval2[0]) if (cptr[ident]==pointer) { uge(); value(lval2,heir7(lval2,status)); *status=TRUE; if (cptr=lval[0]) if (cptr[ident]==pointer) { ugt(); continue; } if (cptr=lval2[0]) if (cptr[ident]==pointer) { ugt(); continue; } gt(); } else return 0; } }  if (isbyte(k)) call("@stacks"); else call("@stackl"); defvalue(k); return newsp; } /* Do } lt(); } else if ((streq(line+lptr,">")) && (streq(line+lptr,">>") == 0)) { inbyte(); push(); r/* >>>>>> start of cc6 <<<<<< */ #ifndef TRUE /* see if need include file */ #include #endif heir7(lval,status) int lval[]; int *status; { int k,lval2[lvalsize]; k=heir8(lval,status); blanks(); if (!streq(line+lptr,">>") && !streq(line+lptr,"<<")) return k; rvalue(lval,k); while(1) { if (match(">>")) { push(); k=heir8(lval2); rvalue(lval2,k); asr(); *status=FALSE; } else if (match("<<")) { push(); k=heir8(lval2); rvalue(lvalitem from current item */ case '-' : push(); gch(); k=heir9(lval2,status); rvalue(lval2,k); size_adjust(lval); sub(); *status=FALSE; break; /* operator not "+" or "-" */ default : return 0; } } } heir9(lval,status) int lval[]; int *status; { int k,lval2[lvalsize],temp; temp=0; k=heir10(lval,&temp,status); blanks(); if ((ch() != '*' && ch()!='/' && ch() != '%') || nch() == '=') return k; rvalue(lval,k); while(1) { r,flag; if(match("++")) { if (!(k=heir10(lval,count,status))) { needlval(); return LOADED; } lval[1] += *count; address(lval,k); pre_inc(lval); return LOADED; } else if (match("--")) { if (!(k=heir10(lval,count,status))) { needlval(); return LOADED; } lval[1] += *count; address(lval,k); pre_dec(lval); *status=TRUE; return LOADED; } else if (match("-")) { if (isdigit(nch())) constant(); else { k=heir10(lval,count,status); rvD; } } else if (match("!")) { rvalue(lval,heir10(lval,count,status)); nlogical(); *status=TRUE; return LOADED; } else { k=heir11(lval,status); movmem(lval,lval2,lvalsize*2); lval2[1] += *count; if (match("++")) { if(k == LOADED) { needlval(); return LOADED; } address(lval,k); post_inc(lval); *status=TRUE; return LOADED; } else if (match("--")) { if (k == LOADED) { needlval(); return LOADED; } address(lval #ifndef TRUE /* see if include needed */ #include #endif heir11(lval,status) int *lval; int *status; { int k; char *ptr; int lval2[lvalsize]; k=primary(lval,status); ptr=lval[0]; blanks(); switch(ch()) { /* subscript varble */ case '[' : gch(); /* eat '[' */ switch(ptr[ident]) { /* array of elements */ case array : *status=FALSE; ++lval[1]; 2,k); asl(); *status=FALSE; } else return 0; } } heir8(lval,status) int lval[]; int *status; { int k,lval2[lvalsize]; k=heir9(lval,status); blanks(); if ((ch() != '+' && ch() != '-') || nch() == '=') return k; rvalue(lval,k); while(1) { switch(ch()) { /* add last item to next item */ case '+' : push(); gch(); k=heir9(lval2,status); rvalue(lval2,k); size_adjust(lval); add(); *status=FALSE; break; /* subtract next if (match("*")) { push(); k=heir10(lval2,&temp,status); rvalue(lval2,k); mult(); *status=FALSE; } else if (match("/")) { push(); k=heir10(lval2,&temp,status); rvalue(lval2,k); div(); *status=FALSE; } else if (match("%")) { push(); k=heir10(lval2,&temp,status); rvalue(lval2,k); mod(); *status=FALSE; } else return 0; } } heir10(lval,count,status) int lval[]; int *count; int *status; { int k,lval2[lvalsize]; char *ptalue(lval,k); neg(); *status=TRUE; } return LOADED; } else if (match("*")) { ++*count; k=heir10(lval,count,status); rvalue(lval,k); lval[1] += *count; *count=0; *status=FALSE; return ADDRESS; } else if (match("&")) { k=heir10(lval,count,status); *status=FALSE; if (k == 0 || lval[0]) { error("illegal address"); return LOADED; } else if (lval[1]) return LOADED; else { immed(); outstr(ptr=lval[0]); nl(); return LOADE,k); post_dec(lval); *status=TRUE; return LOADED; } else return k; } } k; } }  else return k;DED; } else { k=heir11(lval,status); movmem(lval,lval2,lvalsize*2); lval2[1] += *count; if (match("++")) { if(k == LOADED) { needlval(); return LOADED; } address(lval,k); post_inc(lval); *status=TRUE; return LOADED; } else if (match("--")) { if (k == LOADED) { needlval(); return LOADED; } address(lval if (const_exp(lval2) && ch()==']') { lval[2]=data_size(lval)* lval2[0]; needbrack("]"); return NOTLOADED; } else { expression(); size_adjust(lval); swap(); address(lval,NOTLOADED); add_address(); needbrack("]"); return ADDRESS; } /* pointer to elements */ case pointer: *status=FALSE; if (const_exp(lval2) && ch()==']') { immed(); outdec(data_size(lval)* lval2[0]); nl(); swap(); rvalue(lval,2); add_address(); } else { expression(); size_adjust(lval); swap(); rvalue(lval,2); add_address(); } needbrack("]"); lval[1] += 1; return ADDRESS; /* not a vaild ident for int num[1]; int k; /* clear lval array for use */ lval[0]= lval[1]= lval[2]=0; if(match("(")) { k=heir1(lval,status); needbrack(")"); return k; } *status=FALSE; if (symname(sname)) { if ((lval[0]=findloc(sname))) return 2; if ((lval[0]=ptr=findglb(sname))) if (ptr[ident] != function) return 2; if (ch() =='(') { if (!(ptr=findglb(sname))) } } if (constant(num)) { return 0; } else { error("invalid expression"); junk(); return 0; } } /* */ /* written 4/23/81 by Mike Bernson */ /* */ size_adjust(lval) int *lval; { int size; size=data_size(lval); if (size == 1) return; if (size == 2) { doublereg(); } } /* */ /* writt if (lval[1] < ptr[indcnt] && ptr[indcnt] > 1) return lpoint; else switch(ptr[type]) { /* type char */ case cchar : return lchar; /* type int */ case cint: return lint; } /* just a plain variable */ case variable : return 1; } } /* */ /* written 4/23/81 By Mike Bernson */ /* */ address(lval,k) int *lval; { char ot("dad\tsp"); nl(); break; } } /* */ /* date written 6/6/81 by Mike Bernson */ /* */ /* check to see if static load or store */ /* */ loadstatic(lval,k) int *lval; int k; { char *ptr; ptr=lval[0]; if (ptr[storage] == statik && k == NOTLOADED) return TRUE; else return FALSE; } /* */ /* date written 4/30/81 By Mike Bernson */ /* */ store(lval,k) int *lval; int k; { char *ptr; psubscript */ default : suberror(ptr); return LOADED; } /* a function call */ case '(' : *status=FALSE; gch(); /* eat '(' */ callfunction(lval[0]); return LOADED; /* not a subscripted or function call (not for this level */ default: return k; } } primary(lval,status) int *lval; int *status; { char *ptr; char sname[namesize]; if (glbptr>=endglb) { error("global symbol table ofverflow"); } else { ptr=glbptr; glbptr+=symsiz; strcpy(ptr+name,sname); ptr[ident]=function; ptr[type]=cint; ptr[offset]= ptr[offset1]= ptr[storage]= ptr[indcnt]=0; } lval[0]=ptr; return 2; } else { undefine(sname); return 0; en 4/23/81 By Mike Bernson */ /* */ data_size(lval) int *lval; { char *ptr; if (!(ptr=lval[0])) return 0; switch(ptr[ident]) { /* array of elements */ case array : switch(ptr[type]) { /* char type */ case cchar: return lchar; /* int type */ case cint : return lint; } /* pointer to elements */ case pointer : *ptr; if (!(ptr=lval[0]) || k != NOTLOADED) return; switch(ptr[storage]) { /* global symbol */ case statik : immed(); outstr(ptr+name); if (lval[2]) { outstr("+"); outdec(lval[2]); } nl(); break; /* local symbol */ case stkloc : case stkarg : immed(); outdec((ptr[offset]+ptr[offset1]*256+lval[2])-sp); nl(); tr=lval[0]; if (k==0) return; switch(ptr[storage]) { /* local or arg type */ case stkloc : case stkarg : switch(ptr[ident]) { /* ident =array */ case array: if (lval[1] == ptr[indcnt]) if (k==ADDRESS) putstk(ptr[type]); else putmem_stack(lval,ptr[type]); break; /* ident is an pointer */ case pointer: if (lval[1] == ptr[indcnt]) if (k==ADDRESS) putstk(ptr[type]); else putmem_stack(lval,ptr[type]); else if (k==ADDRESS) putstk(cint); else putmem_stack(lval,cint); break; /* ident is a variable */ case variable : if (k==ADDRESS) putstk(ptr[type]); else putmem_stack(lval,ptr[type]); break; } break; /* static varbles */ case statik : switch(ptr[ident]) { /* array */ case array : ie : if (k==1) putstk(ptr[type]); else putmem(ptr+name,ptr[type],0); break; } } } /* */ /* written 4/24/81 By Mike Bernson */ /* */ rvalue(lval,k) int *lval; int k; { char *ptr; ptr=lval[0]; if (k==0) return; switch(ptr[storage]) { /* local or arg type */ case stkloc : case stkarg : switch(ptr[ident]) { /* iden /* ident is a variable */ case variable : if (k==ADDRESS) indirect(ptr[type]); else getmem_stack(lval,ptr[type]); break; } break; /* static varbles */ case statik : switch(ptr[ident]) { /* array */ case array : if (lval[1] == ptr[indcnt]) if (k==1) indirect(ptr[type]); else getmem(ptr+name,ptr[type], lval[2]); else etmem(ptr+name,ptr[type],0); break; } } } equal_exp(lval,k) int *lval; int k; { char *ptr; int lval2[lvalsize]; int status; ptr=lval[0]; /* check to see if vaild lval */ if ((ptr[ident]==array && ptr[indcnt] != lval[1]) || k==0 || lval[0] == 0) { needlval(); return; } address(lval,k); push(); rvalue(lval,1); push(); rvalue(lval2,heir1 case 0 : needlval(); break; /* address of variable is on stack */ case 1 : push(); break; /* nothing of variable is on stack */ case 2 : break; } rvalue(lval2,heir1(lval2,&status)); } test(label) int label; { int status; needbrack("("); status=expression(); needbrack(")"); testjump(label,status); } /* */ /* f (lval[1] == ptr[indcnt]) if (k==1) putstk(ptr[type]); else putmem(ptr+name,ptr[type], lval[2]); break; /* pointer */ case pointer: if (lval[1] == ptr[indcnt]) if (k==1) putstk(ptr[type]); else putmem(ptr+name,ptr[type],lval[1]); else if (k==1) putstk(cint); else putmem(ptr+name,cint,0); break; /* variable */ case variablt =array */ case array: if (lval[1] == ptr[indcnt]) if (k==ADDRESS) indirect(ptr[type]); else getmem_stack(lval,ptr[type]); else address(lval,k); break; /* ident is an pointer */ case pointer: if (lval[1] == ptr[indcnt]) if (k==ADDRESS) indirect(ptr[type]); else getmem_stack(lval,ptr[type]); else if (k==ADDRESS) indirect(cint); else getmem_stack(lval,cint); break; if (k==1) indirect(ptr[type]); else address(lval,k); break; /* pointer */ case pointer: if (lval[1] == ptr[indcnt]) if (k==1) indirect(ptr[type]); else getmem(ptr+name,ptr[type],lval[2]); else if (k==1) indirect(cint); else getmem(ptr+name,cint,0); break; /* variable */ case variable : if (k==1) indirect(ptr[type]); else g(lval2,&status)); } /* */ /* written 4/9/81 By Mike Bernson */ /* */ equal(lval,k) int lval[]; int k; { char *ptr; int lval2[lvalsize]; int status; ptr=lval[0]; /* check to see that is expresstion is array must be element */ if (ptr[ident] == array && ptr[indcnt] != lval[1]) { needlval(); return; } switch(k) { /* data is a constant or value */ written by Mike Bernson 3/80 */ /* */ const_exp(val) int val[]; { blanks(); if (hex(val)) return 1; if (number(val)) return 1; if (pstr(val)) return 1; return 0; } constant(val) int val[]; { if (hex(val)) immed(); else if (number(val)) immed(); else if (pstr(val)) immed(); else if (qstr(val)) { immed(); printlabel(litlab); outbyte('+'); } else return 0; outdec(val[0]); nl(); return 1; } hex(val) int val[]; { int check; char look[2]; if (ch() != '0' || (nch() != 'X' && nch() != 'x')) return 0; gch(); gch(); look[1]=0; look[0]=toupper(gch()); if (!(check=strpos("0123456789ABCDEF",look))) { error("invaild hex constant"); junk(); val[0]=0; return 1; } val[0]=check-1; c=inbyte(); k=k*10+(c-'0'); } if (minus<0) k=-k; val[0]=k; return 1; } pstr(val) int val[]; { int k; k=0; if (!match("\'")) return 0; while(ch() != '\'' && ch()) k=(k&255)*256 + estr(); gch(); val[0]=k; return 1; } qstr(val) int val[]; { char c; if (!match("\"")) return 0; val[0]=litptr; while (ch() != '\"') { if(!ch()) break; 'T': return TB; case 'F' : return FF; } if (!isdigit(check)) return check; check=check-'0'; while(isdigit(ch())) check=check*8+gch()-'0'; return check; }  } 2,105,116 db 32,97,110,121,rn 1; } estr() { char check; if (ch() != '\\') return gch(); gch(); switch(toupper(check=gch())) { case 'R' : return CR; case 'N' : return LF; case 'B' : return BS; case #ifndef TRUE /* check to see if include file is needed */ #include #endif /* Begin a comment line for the assembler */ comment() { outbyte(';'); } /* Print all assembler info before any code is generated */ header() { outstr("@start:\tcsect");nl(); ol("jmp\t@init"); ol("extrn\t@and,@asl,@asr,@comp,@com,@div"); ol("extrn\t@gchar,@gint,@incdec"); ol("extrn\t@mult,@neg,@nlog,@or,@pint,@sub"); ol("extrn\t@sxt,@ucomp,@xor,@init,@switch"); ol("extrn\t@gintss,@gintsl,@gcharss,u\t@incdec+10h");nl(); outstr("@predec\tequ\t@incdec+08h");nl(); outstr("@postdec\tequ\t@incdec+1ah");nl(); } /* Print any assembler stuff needed after all code */ trailer() { ol("end"); } /* */ /* rewritten 4/30/81 by Mike Bernson */ /* */ /* Fetch a static memory cell into the primary register */ getmem(sname,typ,off) char *sname; int typ; int off; { if(typ==cchar) { ot("lda\t"); outstr(sname); if (off) { outstr("+"); outdec(off); } nl(); while(1) { look[0]=toupper(ch()); if (!(check=strpos("0123456789ABCDEF",look))) return 1; val[0]=val[0]*16+check-1; gch(); } } number(val) int val[]; { int k,minus;char c; k=minus=1; while(k) { k=0; if (match("+")) k=1; if (match("-")) { minus=-minus; k=1; } } if (!numeric(ch())) return 0; while(numeric(ch())) { if(litptr>=litmax) { error("string space exhausted"); while(ch() !='\"' && ch()) estr(); return 1; } litq[litptr++]=estr(); } gch(); litq[litptr++]=0; return 1; } estr() { char check; if (ch() != '\\') return gch(); gch(); switch(toupper(check=gch())) { case 'R' : return CR; case 'N' : return LF; case 'B' : return BS; case@gcharsl"); ol("extrn\t@pintss,@pintsl,@pcharss,@pcharsl"); outstr("@eq\tequ\t@comp");nl(); outstr("@ge\tequ\t@comp+35h");nl(); outstr("@gt\tequ\t@comp+1ah");nl(); outstr("@le\tequ\t@comp+43h");nl(); outstr("@lt\tequ\t@comp+28h");nl(); outstr("@ne\tequ\t@comp+0dh");nl(); outstr("@uge\tequ\t@ucomp+6ch");nl(); outstr("@ugt\tequ\t@ucomp+51h");nl(); outstr("@ule\tequ\t@ucomp+79h");nl(); outstr("@ult\tequ\t@ucomp+5fh");nl(); outstr("@preinc\tequ\t@incdec");nl(); outstr("@postinc\teqcall("@sxt"); } else { ot("lhld\t"); outstr(sname); if (off) { outstr("+"); outdec(off); } nl(); } } /* */ /* written by Mike Bernson 6/8/81 */ /* */ /* load a byte offset from current stack */ /* */ getmem_stack(lval,typ) int *lval; char *typ; { char *ptr; int off; ptr=lval[0]; off=ptr[offset]+ptr[offset+1]*256+lval[2]-sp; if (typ == cint) if (isbyte(off)) call("@gintss"); else call("@gintsl"); else if (isbyte(off)) call("@gcharss"); else call("@gcharsl"); defvalue(off); } /* */ /* rewritten 4/30/81 By Mike Bernson */ /* */ /* Store the primary register into the specified */ /* static memory */ putmem(sname,typ,off) char *sname; int typ; int off; { if (typ==cchar) { ol("mov\ta,l"); ot("sta\t"); } else ot("shld\t"); outstr(sname); if (off) { outstr("+"); outdec(off); } nl(); } /* Store the specified object type in the primary register */ /* at the addr typ; { int off; char *ptr; ptr=lval[0]; off=ptr[offset]+ptr[offset+1]*256+lval[2]-sp; if (typ == cint) if (isbyte(off)) call("@pintss"); else call("@pintsl"); else if (isbyte(off)) call("@pcharss"); else call("@pcharsl"); defvalue(off); } /* Fetch the specified object type indirect through the */ /* primary register into the primary register */ indirect(typeobj) char typeobj; { if (typeobj == cchar) call("@gchar"); else call("@gint"); } /* add primary and seco ol("pop\td"); sp=sp+2; } /* Swap the primary register and the top of the stack */ swapstk() { ol("xthl"); } /* call routine and subtract 2 from stack pointer */ ccall(sname) char *sname; { sp=sp+2; call(sname); } /* Call the specified subroutine name */ call(sname) char *sname; { ot("call\t"); outstr(sname); nl(); } /* Return from subroutine */ ret() { ol("ret"); } /* Perform subroutine call to calue on top of stack */ callstk() { immed(); outstr("S+5"); natus) { ol("mov\ta,h"); ol("ora\tl"); } ot("jz\t"); printlabel(label); nl(); } /* routine to search switch table */ exec_switch(count,label,end_label) int count; /* number of case statement in switch */ int label; /* label for switch table */ int end_label; /* label to execute when table search ends and not found */ { ot("lxi\td,"); printlabel(label); nl(); ot("lxi\th,"); printlabel(end_label); nl(); ot("mvi\tb,"); outdec(count); nl(); ot("jmp\t@switch"); nl(); mber is a byte */ isbyte(num) int num; { return (num >= 0 && num <=255); } /* Print pseudo-op to define a byte */ defbyte() { ot("db\t"); } /* Print pseudo-op to define storage */ defstorage() { ot("ds\t"); } /* Print pseudo-op to define a word */ defword() { ot("dw\t"); } /* Modify the stack pointer to the new value indicated */ modstk(newsp) int newsp; { int k; k=newsp-sp; if (!k) return newsp; if ( k >= 0) { if(k<7) { if (k&1) { ol("inx\tsp"); k-ess on the top of the stack */ putstk(typeobj) char typeobj; { pop(); putsec(typeobj); } /* store the specified object type in the primary register */ /* at the address in the secondary register */ putsec(typeobj) char typeobj; { if (typeobj == cchar) { ol("mov\ta,l"); ol("stax\td"); } else call("@pint"); } /* */ /* written by Mike Bernson 6/9/81 */ /* */ /* store hl value after call plus */ /* current stack */ /* */ putmem_stack(lval,typ) int *lval; charndary registers */ add_address() { ol("dad\td"); } /* Swap the primary and secondary registers */ swap() { ol("xchg"); } /* Print partial instruction to get an immediate value */ /* into the primary register */ immed() { ot("lxi\th,"); } /* Push the primary register onto the stack */ push() { ol("push\th"); sp=sp-2; } /* push the secondary register on stack */ pushs() { ol("push\td"); sp=sp-2; } /* Pop the top of the stack into the secondary register */ pop() {l(); swapstk(); ol("pchl"); sp=sp+2; } /* Jump to specified internal label number */ jump(label) int label; { ot("jmp\t"); printlabel(label); nl(); } /* test the primary register and jump if treu to label */ truejump(label,status) int label; int status; { if (!status) { ol("mov\ta,h"); ol("ora\tl"); } ot("jnz\t"); printlabel(label); nl(); } /* Test the primary register and jump if false to label */ testjump(label,status) int label; int status; { if (!st } /* output extrn and symbol name */ extrn(n) char *n; { outstr("\textrn\t"); outstr(n);nl(); } /* output control section name and key word */ csect(n) char *n; { outstr(n); col(); ol("CSECT"); } /* output data section name and key word */ dsect(n) char *n; { outstr(n); col(); ol("dsect"); } /* define value using min amount of stroage space */ defvalue(num) int num; { if (isbyte(num)) defbyte(); else defword(); outdec(num); nl(); } /* check to see if nu-; } while(k) { ol("pop\tb"); k=k-2; } return newsp; } } if (k<0) { if (k>-7) { if (k&1) { ol("dcx\tsp"); k++; } while(k) { ol("push\tb"); k=k+2; } return newsp; } } swap(); immed(); outdec(k); nl(); ol("dad\tsp"); ol("sphl"); swap(); return newsp; } /* Double the primary register */ doublereg() { ol("dad\th"); } dad\th"); }  } CHOw#wt!GETCH/* >>>>> start of c9 <<<<<< */ #ifndef TRUE /* check to see if include file is needed */ #include #endif /* Add the primary and secondary registers */ /* (results in primary) */ add() { pop(); ol("dad\td"); } /* Subtract the primary register from secondary */ /* (results in primary) */ sub() { ccall("@sub"); } /* Multiply the primary and secondary registers */ /* (results in primary) */ mult() { ccall("@mult"); } /* Divide the secondary register by the primary */ /* */ /* (results in primary) */ and() { ccall("@and"); } /* Arithmetic shift right the secondary register number of */ /* times in primary (results in primary ) */ asr() { ccall("@asr"); } /* arithmetic left shift the secondary register number of */ /* times in primary (results in primary) */ asl() { ccall("@asl"); } /* From two's complement of primary register */ neg() { call("@neg"); } /* form one's complement of primary register */ com() { call("@com"); } pre_inc(lv value=value | 0x80; defbyte(); outhex(value); nl(); } /* following are the conditional operators */ /* they compare the seconday register against the primary */ /* and put a leteral 1 in the primary if the condition is */ /* true otherwise the clear the primary register */ /* change to not condition */ nlogical() { call("@nlog"); } /* test for logical and */ land() { ccall("@land"); } /* test for logical or */ lor() { ccall("@lor"); } /* test for equal */ eq() { cc for greater than (unsigned) */ ugt() { ccall("@ugt"); } /* test for greater than or equal to (unsigned) */ uge() { ccall("@uge"); } call("@uge"); }  { ccall("@uge"); } ) { ccall("@uge"); }  { strcpy(buff,"Err ccall("@gt"); } /* test for greater than or or equal (signed) */ ge() { ccall("@ge"); } /* test for less than (unsigned) */ ult() { ccall("@ult"); } /* Test for lees than or equal to (unsigned) */ ule() { ccall("@ule"); } /* testxsub c1 y $1.asm $1.c assemble $1 link $1 stdlib runtime )m C7 C jC8 C 8C9 C CC SUBCUSTOM COMsTABLE DIRMPSETUP FILMPERROR FILINCOME LOGMPEXT OVL`MPMENU FIL(quotient in primary, remainder in seconday) */ div() { ccall("@div"); } /* Compute remainder (mod) of seconday by primary */ /* (remainder in primary, quotient ient in secondary) */ mod() { div(); swap(); } /* Inclusive 'or' the primary and the secondary registers */ /* (results in primary) */ or() { ccall("@or"); } /* Exxclusive 'or' then primary and the secondary registers */ /* (results in primary) */ xor() { ccall("@xor"); } /* 'and' the primary and secondary registersal) int *lval; { call("@preinc"); inc_def(lval); } post_inc(lval) int *lval; { call("@postinc"); inc_def(lval); } pre_dec(lval) int *lval; { call("@predec"); inc_def(lval); } post_dec(lval) int *lval; { call("@postdec"); inc_def(lval); } inc_def(lval) int *lval; { char *ptr;; int value; ptr=lval[0]; if (ptr[ident] == pointer && ptr[indcnt] != lval[1]) value=0x80; else value=0; value=value | data_size(lval); if (ptr[type] == cint && ptr[ident] != pointer)all("@eq"); } /* test for not equal */ ne() { ccall("@ne"); } /* test for less than (signed) */ lt() { ccall("@lt"); } /* tet for less than or equal to (signed) */ le() { ccall("@le"); } /* test for greater than (signed) */ gt() { ccall("@gt"); } /* test for greater than or or equal (signed) */ ge() { ccall("@ge"); } /* test for less than (unsigned) */ ult() { ccall("@ult"); } /* Test for lees than or equal to (unsigned) */ ule() { ccall("@ule"); } /* testclink c1 c2 c3 c4 c5 c6 c7 c8 c9.c c1 c2 c3 c4 c8 c9.c -s -r e00 )m C7 C jC8 C 8C9 C CC SUBCL SUBTABLE DIRMPSETUP FILMPERROR FILINCOME LOGMPEXT OVL`MPMENU FIL*K͞+TFQe'+FÎr7 :2!q: ʊ *M8 ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o!a{   `OE!y6$ -7rBo&))T])))!y3͵(>3>@26;q *-;";.,4:+;2+;";|²!}£!9/,4ʹ!¦!90,4>G>)3þ!#'̓&)*͵(1!&,2#%!`/,4^(ͤ&&)*͵(y(~7#^#V#+"1))){S~+2G~`20;25;#~2/;~?>k"=2);#^#V#^#V#"1;^#V"3;:5;ʕ"*;!:0;@ʦ""3;*G;#w"G;*G;~""++21:+"G;*G;+"G;! >" txt!  .`iͭ`iͪ!b`i͹#|n `i!A e Unable to create %s as object fileͶͧ!t x asm! Á .`iͭ`iͪ!"S"W"K"E"C"M"?"]"Q"O!7"I!"G! !uͪ! ( Page !uͰ*"T!"M*T! s#r! ~#fo#ͼ|w *M#"M! ^#V!r+sI Ϳ!! È 000*Q+"Q*\!\`iͳ#| ! unable to rewind source file!b!$!b!Q!bs#rz ͐y Y ! | |Y !  `is#rzB ͐͂ Y ͐"aͅ |Y ! ͈ ͋ ͎ *C*U"Cñ ! 9À @Ú! à Control section namesz *Q!$y} ! Symbol namesz *O!T} :=! ORG | ! !CSECT |!!#DSECT |2!!8;DS |J!!PSDB |b!!hkDW |z!!ÄEQU |ʓ!!ÝEND |ʬ!!øENTRY |!!EXTRN |! !PAGE |! !#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#.¶66*>?w#> w#.7:77G;6!+>"I;*G;~*/;*I;s#r#*1;s#r#*3;s#r#*+;s#r#*-;s#r#:5;w#"I;w#*:;*I;s#r#*<;s#r#*>;s#r#*6;s#r#*8;s#r#:@;w#"I;w#|?‚#}}>@2N(A;ApAÌAA BÄBh ÇÂ/5NW1d v1ÖBûC͐`is#rJ͐! s#r!S! 9!9DM*T! ^#Vr+s)))n}ʵʵʵʵʵʵ ʵʺ ʺʿ ʿ!!!!ì!.Aù=[F =2=&=!9DM!"U*T! ^#Vr+s)))~#fo}2u*T͐)))n}\ʉʟʾO o ʧ "!`is#r!"U͐}2v͐}2w"!}2v*U#"U"*u!)))|g}o}2u"*u!|g}o}2u"*u!))))|g}o}2u"|7!!L*u)))|g}o}2u|L!"*u!))))|g}o}2u"*u!)))|g}o}2u*u!|g}o}2u"*u!)))|g}o}2u!}2v!"U"*u!))))|g}o}2u!`i!M!~D! n}+>UvP|;!MvG,R!MvP|k`in&s!Mv`in&~!9Ö2aNÛ !9DM*A+|͐͊|! ͍!]*A++|͐͊`is#r|! ͍!]*A+|*Qk$y! s#r-`i^#Vr+sk$y! s#r! ! ~#fo͐͐! n}ff> G*A+|*KҮ*Kk$y*C*Kk$y##~#fos#r! n}! ~#fo6! n}! ~#fo6! ~#fo##*Cs#r! ~#fo#*Qs*Q"Kʮ> >T> >ʒ*A+|.*O+"O*A++|;i!!hl*A+|[*O+"O*A++|hi!!hl*Kk$yn}—!o!r*Cu"Cx|»!o!{|þ!{|~!h́|(!ḧ́|*A+|! !hl%! o3!ox|>͇,U!o~!h́|{!!hlÆ!ox|ʑ͇,ʨ!o[!"c~!r! su! s#r͐}2u͐}2vx|!o!ḧ́`*A++|K!vy`is#r͐4!|*U#"U+u͐sl*U#"Up|lp,lsR*A++|»!vy`is#r*U#"U+u͐s*U#"U+u͐s*U##"Up|p,sp,|!|p|p,ss|͝$!9?DN[F =!=!9DM!! ͐063|m!`iw#w69|ʬ͐ Ҡ! ^#Vr+s6s`i^#Vr+s͐|6:<!!<s!9Û aN!9DM͐͐9![FÒE!9DM! n&!|o!! n& !|o!! n}@o!! n}$o!! n}_o!! n}.o!! n}?t!!!Á!E!9DM! ~#fo! ~#fo~!û!"&=2>!9DM! n}!!!!ͯ!Ͳ!|!!͵!͸!`is#r!"! n}"!͵!͐"!9+"ö"2N6!9DM!"=""`is! n}X"k"ʒ"å"`in}h"! %"å"`in}"!%"Ï"`in}ʏ"!("å"`in}ʢ"!("å"`in&í"!9"?#:=2\>>!9DM͹"`is!""&ͼ"|#!""ANDͼ"|#`ins#r!"U͐}2v͐}2w"%!9=ù==2&=!9DM14>AW>ʮ>Bc>ʵ>Co>ʼ>D{>>E‡>>H“>>LŸ>>M«>`i6`i6`i6`i6`i6`i6`i6`i6!7!81! n}:|!7! n}04,0!7`in&8!9Sù==:=2&=!9DMD`i6G>Pq>ʤ>S}>>B‰>>D•>>H¡>!íSWJ|ʾ`i6!M!PJ|`i6!M`i6`i6`i6Þ*A++|;! ~#fo#n&"K! ~#fo##~#fo*C;! ͍G*A+|JG͓͐`is#r|m!͍!]! ~#fo#`i^#Vr+skT#ns! ~#fo͐kT##~#fo*Kk$y##~#fos#r! ~#fo##͐kT##~#fos#r! ~#fo6G*A+|D! ~#fo#*Qs! ~#fo##! ~#fos#rs#r! ~#fo6G*A+|W*Q#"Q!]!9Öv1Ç2">&=jù=-Û =`5(ApAÄB!9DM̓>¯>>»>K>>x>>ʾ>>> >>>[>>is#r`i^#Vr+skT##͐s#r͐kT! ns͐kT#*s*A+|`x|n͊Ï!rx|ʇu"IÏ!o~!Ý !u͍*a!u!u͐!u͓J! !u͐ú!Page !u͐!9E!9DM`iw#w͐*Q[͐k$y͐|O͐#a`i^#Vr+s!a!9Âù= ==">2&=!9DMmp'*a##un}'sp'p|*U#"U+u*a#"a+un&|g}osìs! n}o| !! *OkT͐*OkT*Ss#r*OkT#͐s*OkT##͐s#r*OkT! ns*O#"O!ï{!ÊF@å55ÄB!9DM*!͐ ͐͠`iw#w͐͐ Ғ ͐)| ! ͣ! ~#fo##~#foͦ!  ͩ! ~#foͩ! ~#foͬ! s#r͐u !` b ͩ! ^#Vr+sM ! ^#V!r+s`i^#Vr+s!9á E!9DM*O+`is#r͐ ͐kT͐͞ | ͐# `i^#Vr+só ! !&6#͹"|#`in}#! Ϳ"""|g}o"!6#!9Q##:=2\>>!9DMB#`is!f#h#|E#|#!x#{#ORE#|#`in&þ#B#|#`in}ʥ#! H#N#N#|g}oK#!þ#!9#J$:=2\>>!9DM#`is!##^#|$!$$XOR#|$`in&A$#|&$`in}.$! ###|g}o#!9\$B%:=2>\>!9DMM$! s!s$v$>>P$|”$!$Ê$SHLP$|$M$|¦$! n}ʮ$! S$V$`is#rV$͐Y$!9%!$$<<P$|$!$$SHRP$|/%M$|%! n}%! S$V$`is#rV$͐Y$!9%! n&9%!9T%V&:=2\>>!9DME%`is!i%k%+H%|%E%! s{ʉ%!Ì%!`in}ʛ%!Þ%!++|¯%! K%Q%Q%N%`in! nѯgW|g}oM&!%%-H%|E&E%! sQ%Q%N%`in} &!&!! n}!&!$&!+|E&`in! nѯgW|g}oM&E&`in&M&!9h&z':=2\>>!9DMY&! s!&Á&*\&|ʻ&Y&|&! n}ʥ&! _&e&e&?b&!q'!&&/\&|'Y&|&! n}&! _&e&`is#re&͉͐b&)!9$)ù=-Û \>2õ*!9DM)*a! s#r`i)|œ*`i)! s#rz*! ^#Vr+skT##~#fo)͐ kTn&|g}o|)͐ kT#n&"*C*Kk$y##~#fo*U"͐ kTn&"͐ kTn&|g}oì*Ü*`i)! s#rzʆ*! ^#Vr+sk$y##~#fo)͐ k$y#n&"*C*Kk$y##~#fo*U"!"!ì*Ü*!)!)!ì*͐ "a!)!ì*!9*ù=ÒE =G=2\>[Fþ-!9DM͸*! 6#6*a#un}'ˆ+;*ͻ*|-! 6#6*! w#w! s#r! s#r͐|J-;*'J-*͐|J-Ý-! ͐;**|ʌ-͐||-!*! w#w͐+|‰-*Ý-! ^#Vr+s*&-͐͐k*!õ-! 9- =G!9DM͐>->.>->3.>->p.> .>ʯ.>.>.{/͐͐~#fok-s#r{/-0P.-1P.!͐͐~#fo)-s#r{/-0ڈ.-7ҍ.!͐͐~#fo)))-s#r{/-0.-9.!͐͐~#fo k-s#r{/-0+/-i~#fo~#fos*[#"[+u`i~#fo~#fos!w4! ^#Vr+sä/*[ͅ/!9`1@2N!9DM͐Z1]1|16!9DM*[y1`i6#6͐*Wڵ2*[Ҷ1*[y1*[|1>$2u>R2v*K}2w*K}2x>2y!"[!y4*[#"[+u͐k~#fos*[#"[+u͐k##~#fos*[#"[+u͐k##~#fos*[#"[+u͐k~#fos*[#"[+u͐k~#fos`i^#Vr+sÓ1*[y1!"W!92W1!9DM*A+|2*?03!2 3 Error stw*K}2x>2y*C}2z*C}2{!"[!y4*[#"[+u͐uns`i^#Vr+s4!9l55ï7@!9DM!uc5*E#"Ef5!5Ñ5 i5!"G!9ë5Ç7!9DM͐ͨ5͐ͨ55òN!9DM`iw#w! ~#fo͐n}E6! ~#fo͐n} 96! ~#fo͐n} 96! ~#fo͐n&5`i^#Vr+s5!9W6W1aN!9DM*Wڜ6!q6×6 Relocation count for 1 csect to highQ6*c|ʦ6*A++|6!*W#"Wk!T6*Wk~#fo! nѯg|g}os#r7!q'! ''%\&|-'!'#'MOD\&|g'Y&|?'! n}G'! _&e&`is#re&͐)b&!q'! n&q'!9Ï'ë(:= =2\>>!9DM}'`is!'æ'<̀'|'!'û'HIGH̀'|(̓'<'*a+un}<'*a+"a`in&â(}'|'`in}(! ͆'͌'͉'!â(!!(#(>̀'|A(!3(7(LOẀ'|ʚ(̓'>k(*a+un}>k(*a+"a`in&â(}'|{(`in}ʃ(! ͆'͌'|g}o͉'!â(`in&â(!9ú(:=ö"2 )!9DM!(((ͮ(|(ͱ(`is!(()ͮ(|(! ʹ(`in&)ͷ(ʈ+! 6#6**>B +>G+>O,+>Q+>X8+>[+>CD+>e+Å+`i6#6Å+`i6#6Å+`i6#6Å+`i6#6Å+!*!*!õ-*;*>%—+>ʾ+>@£+>+>$¯+>+>'»+>+,`i6#6! w#w-`i6#6! w#w-`i6#6! w#w-`i6#6! 6#6-*a! s#r;*-!,*;**|r,;**AP,;**Fr,;**Or,;**H~,*`is#r!,͐"a͐*>Hš,>ʵ,>O¦,>,>B²,>,,`i6#6! 6#6-`i6#6! 6#6-`i6#6! 6#6-`i6 #6;*- 9/--A+/--F0/!͐͐~#fo))))--s#r--9x/͐~#fos#r{/!Î/6DN(A!9DM!"[! w#w͐*QF1*[/*[ͅ/*[|/!!!u͈/!//$E!u͋/!"[͐k$y`is#r! w#w͐ ҝ0`i~#fo͐n}R0`i~#fo͐n} m0*[+un&|g}osÝ0*[#"[+u`i~#fo͐ns! ^#Vr+s0*[#"[+u`i~#fons*[#"[+u`i~#fo##~#fos*[#"[+u`i~#fo##~#fos*[#"[+u`ack is full.2*?#"?+)ٝ͐s#r*?#"?+)ٝ*as#r*]#"]*_#"_g3`5òNå55Ç7ï7P8!9DM*G#"G+*Iڅ3R3! U3*U|H4*CX3!3æ3 [3! w#w̓*U3̓3̓un&^3! ^#Vr+só3*Uͩ4*U?4!! s#r! ^#Vr+szE4!;4=4 [3$4È4*c|y4*v&^3*u&^3!j4q4 = [3È4!4Ã4 [3*Sa3!4Ù4: [3!u[3d3!9ø46!9DM`iw#w͐*UW5*[@4*[͵4*[|.5>$2u>T2v*K}2BW1!9DM`iw#w͐͐x7!b͐un&6#|l7!D7g7 Disk full on writting object file7`i^#Vr+s7!"[!9Í7;!9DM͐͊7͐͊7ø7DN5!9DM! w#w!! `iͲ7! 6#6͐ @8! ^#Vr+s`i͐͐ ͉0s͐͐ )! s#r͐  ! s#r7`i͵7!9Y8`5A!9DM`iw#w͐*?;*G#"G+*Iڌ8S8͐)ٝ~#fo>¥8>P9>±8>t9>½8>ʗ9>8>9>8>9>8>:>8>3:>8>U:> 9>r:> 9>ʖ:> 9>ʽ:> )9>:>59> ;> A9>*;>M9>L;Î;!V9i9invalid expression! s#rÎ;!z9Ì9symbol not define! s#rÎ;!9÷9invalid base for constant! s#rÎ;!99invalid constant expression! s#rÎ;!9 :number out of range! s#rÎ;!:(:missing comma! s#rÎ;!9:J:invalid reg pair! s#rÎ;![:g:invalid reg! s#rÎ;!x:Ë:missing right parn! s#rÎ;!:ò:symbol has two values! s#rÎ;!::symbol already define! s#rÎ;!::op not found on card<|ͣ=G*aun&=/=ù=<)=,=C=ù==!9DM==*a! s#r`iw#w! ~#fo͐n}ʪ=@=! ~#fo͐n&ʞ=͐"a!ð=`i^#Vr+s_=!ð=!9= =_E=ͼ=|=ͼ=Ϳ=|==== =G=| >*a#"a+un&=!>2*=7>*=+"=)u~#fo!=>P>invalid expression>!!9DM*=#"=+)u͐s#rACI ADC ADD ADI ANA ANI CALLCC CM CMA /CMC ?CMP CNC CNZ CP CPE CP9DM͐n}&A! ^#Vr+sn&@A7**~#2A7**fAIA#~kAVAFA!`i7**ʃAzA~#ÃAÒAO!9DM! ~#fo!͐͏As#rzA!! ~#fo##w#w! ~#fo~#foA+I@!y9DM! `iA`iA!9BFO[O!9DM͐B! ~#fo͐Bs#rzGB!! ~#fo! ~#fos#r! ~#fo##6#6! ~#fo~#fo7*!#ÎBâBNÌOßO!9DM͐+|B! n&͙B͐++|B! n&!͜B͐+++|B! n&!͜B!! ~#fo##6#6! ~#fo! ~#fos#r!3E!9BErP!9DM! ~#fo~#fo?E!9DM! n} ͝ʎE! n} ͝ʎE! n} ͝ÛEqLàL!9DM! n&͕E|ͣE! n&͘E|ͣ!9DM`iw#w! ~#fo͐n! ~#fo͐n}&F! ~#fo`i^#Vr+sn}#F!RFE! ~#fo͐n! ~#fo͐nѯgWRF!9!9DM! n&0ͯچF! n&9ͯÐFL!9DM͐͐?! s#r͐! s#r͐G͐͐?`is#r͐͐! s#r͐͐!s#r! ~#fo^#Vr+sn&"I!9:I%M[FMG!i9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{bL`in}%LL! ! s#r! 6#6! s! s͐n}-I! ^#Vr+s! 4͐n&1I}I! 4II!! s#r! ^#Vr+sn`is{.-J! 4I! s#r! 4! ^#Vr+sn`is`in&7I}DYJUʕJXʞJOʧJCJSK6L͐~#fo|J! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 íJ! 6íJ! 6! ~#fo! n&! ^#Vr+s~#fo! .Iѯgs#rÖK! ^#Vr+s! ^#! s#rÎ;!;;invalid symbol! s#rÎ;!0;A;relocation error! s#rÎ;!R;d;ds found in csect! s#rÎ;!u;Ã;unknown error! s#rÎ;͐#)ٝ~#fo͐!;; ** Error %s at colum %d **V8`i~#fo##s#rg8!h9;òN!9DM͐|g}o0! s#r͐9-<)H!9DM!"a!\;<`is#rzfGoyDQ$*aO7:O*o`7:)~:,"s!"u*|*uP*~#O"*s*uP#"u*+"O P Q7:,* P:*/P}|2q `PVP:qwQP! {w#:woʄP2w&!o §P . &7:)~:,"s!"u*|Q**sQ! ~Q6*K͞+11'+FÎr7 :2!q: ʊ *M8 ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o!a{   `OE!y6$ -7rBo&))T])))!y3͵(>3>@26;q *-;";.,4:+;2+;";|²!}£!9/,4ʹ!¦!90,4>G>)3þ!#'̓&)*͵(1!&,2#%!`/,4^(ͤ&&)*͵(y(~7#^#V#+"1))){S~+2G~`20;25;#~2/;~?>k"=2);#^#V#^#V#"1;^#V"3;:5;ʕ"*;!:0;@ʦ""3;*G;#w"G;*G;~""++21:+"G;*G;+"G;! >"  Missing file name to linkͤ!9 6#6̓9̓A !C ~#fo̓9)~#foͧ(ҡ !h  File name to long at ͡!C ~#fo̓9)~#fo͡ ! é .!C ~#fo̓9)~#foͪ| !C ~#fo̓9)~#fo! .!C ~#fo̓9)~#foͪ+6!C ~#fo̓9)~#fo! ͭ!/ 4 .TXT! Ͱ`i! ͳ#|Š !X g Can not open ͡! ͡!9 s#rzʇ Ͷ !$M j$k**^͐ͼ͹`iͿ̓9+| ͐!8 s̓9 ͐!9 ^#Vr+s- !C ~#fo##~7,2q*&:q):>O=>O=r:qo& !\&!dOFOO7*^O\!*aO7:O*o`7:)~:,"s!"u*|*uP*~#O"*s*uP#"u*+"O P Q7:,* P:*/P}|2q `PVP:qwQP! {w#:woʄP2w&!o §P . &7:)~:,"s!"u*|Q**sQ! ~Q6#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#.¶66*>?w#> w#.7:77G;6!+>"I;*G;~*/;*I;s#r#*1;s#r#*3;s#r#*+;s#r#*-;s#r#:5;w#"I;w#*:;*I;s#r#*<;s#r#*>;s#r#*6;s#r#*8;s#r#:@;w#"I;w#|?‚#}' 8'J''Ò'î'../ +/(:/x( !9DM*2js#r*0js#r*.js#r*,js#r**js#r*(js#r*&js#r*$js#r*"js#r* js#r*js#r*js#r*es#r*es#r*es#r!Panacea linker version 1.0 copyright (c) March 30, 1981͡! By Mike Bernson̓͡A+|$ !#fo! ͭ!  .COM! Ͱ*`! #|d !B S Can not create ͡! ͡Ͷ!8 n`is#6!!!͐ͼM j)*iMjs#r! ú Pass 1 starting͡*j^#Vr+s`iMe*es#r!9 w#w̓9M.jm ̓9)*h~#foMes#r̓9)*h~#fo ~#fo!; s#r*e~#fo̓;s#r!9 ^#Vr+s *$jw#wM&j#*"js#r*j^#Vr+s! ï Pass 2 starting͡*"j^#Vr+sz `iô *`Ͷ!=9 '.!9DM!  ͐ . ë# )S%*!9DM!͐  |l !O g Not able to rewind file * j^#Vr+s)*iMjs#r͐ " $ ! Not a valid formated text file ͐ " E 9͐ " ! s! Not a valid formated esd card ! ~5o}6͐ % Ò ͐ ( ++͐  ͐ " `is{!evMissing end card `in}$ʻ!öNot a valid formated text file. Missing '$' ͐ " `is!End of card found when looking for card typeiI͐k*n}=͐k*`i^#Vr+s*"j^#Vr+s*"j^#Vr+szv͐W!9à r%)*ë#%ô'ñ!9DMM"j|µJM$j)*e~#fo! s#r! ~#fo~#foMe"Mj++|"!Load address error for csect͂! ~#fo~#fo|P! ~#fo~#fo! ~#fo#n&$k**^͐ͅ! 6! n}P͈͐$¤͈͐R!Error seeking to RLD card͈͂͐͋͐`is#r`i^#Vr+sz ! ~#fo#n&͔͐͐++͐͑lM(j|G!-BRLD que is not empty͂͗! 9_:/)*!9DM*j^#Vr+sk*`is#r!! `i~#foV! w#w͐ `i~#fo͐͐Ys!|g}o| `i~#fo͐n&|g}os! ^#Vr+sî`i~#fo͐Ys`i~#fo ͐\s#r`i~#fo ͐\s#r`i~#fo#M j+s`i~#fo##`i~#fo`i~#fos#rs#rs#r͐è!9)* V+t!9DM͐ʹ`is#r͐ͷ`i^#Vr+szk͐ʹ! (j^#Vr+s! ~#fo###~#fo͐^! n͐s**j^#Vr+s*(j^#Vr+s! ~#fo###~#fo͐©! n*4js#6! n͐|g}os! ~#fo###~#fo#͐! n&?M4j! s#r͐͐! s**j^#Vr+s*(j^#Vr+s! n&"!91 !9DM*"j^#Vr+s!n!ViLink que over flow.M&j)*e͐s#r! ~#foMes#r! ~#fo ~#fo`is#r*e~#fo͐s#r*&j^#Vr+s!9 )*+ø!9Dn}[͐k*`i~#fo#~#fok*~#fos#r`i~#fo#͐s#r`i~#fo#~#fok*n}`i~#fo#~#fok**,j^#Vr+s!9*$j^#Vr+s!!M$j*$js#r{,'Ò' !9DM`iw#w͐Mjq!j ~#fo͐k*|e͐k*n}e͐ï`i^#Vr+s!j ~#fo! !Û not define.! ! !f9{, !9DM! ~#fo~#fo| `iw#w͐M.j}! ~#fo `in}Q`in}RB`in}TB!'=Not a valid type card ͐ + ! s#r͐ " ! sÏ!kÊEnd of file in TXT or RLD card ! ~#foM j+)*i~#fos#r`in}T͐k*##~#fo|͐k*##͐ ( s#r`in}R[͐k*~#fo|[͐k*͐ ( s#r`in}Rz! n&?! sÇ! n&##s͐ ( ! nѯg͐  |!End of file seeking to next card O!9+!9DM`iw#w͐M͎͈͐$.͈͐R7! 6P͔͐++͐͑vMj҉*,js#r**js#r*(js#r͗J! ~#fo##~#fo! ~#fo#n&$k**^͐ͅ! w#w! ~#fo##~#fo|-! Csect ͚! ~#fo͚!% does not have any text records͚͔͐##͐͑͐͋! s#r͔͐++++͈͐͑͐$͈͐Tʶ!ñError seeeking to TXT card͂͐͋͐! ͈͐͐͝$͈͐Ts2! -End of file while reading TXT cardͺ*`͐ ^#Vr+s! n&ͽ*e^#Vr+s!9!9DMM(j|! n&"M*jk*fT! s#r! ~#fo#~#fok*! s#r! ~#fon}! ~#fo~#fo! ~#fo ~#fo`is#r! ~#fo ~#fo! s#r͐k*~#fo͐k* ~#fo! ~#fo ~#fo`is#r! ~#fon&|g}o>Ÿ>ʺ>«>>·>a! ~#fo###~#fo͐ ! n͐|g}os**j^#Vr+s*M*(j^#Vr+s!6!1RLD stack overflowM,jk*fT`is#r`i~#fo͐s`i~#fo###͐s#r`i~#fo#͐͐ )*i~#fos#r! s#r`i~#fo#~#fok*n}`i~#fo#`i~#fo#~#fok*s#r`i~#fo#~#fok*n}…`i~#fo#~#fok* ~#fo! s#r͐k*~#fo|…͐k*`i~#fo#~#fok*n}`i~#fo#~#fok*~#fo|`i~#fo#~#fok*͐k*͐)*h~#foͻ|qMj+|5 Mj++|q! ~#fo͐)*h~#fo~#fos#r `i^#Vr+sMj++|®!éDsect not found in pass 1;M.jd!Too many dsect to link;*2j^#Vr+s)*h͐s#r*.j^#Vr+s!9& '!"!9DM!4 P Control section(s) loaded M&j*e !n  Data section used M2j*h ! ý Starting address of code  Me# ! ending address  Me+# ! ! Data section starts at  Me# !'!8! ending address  Me+# !N!_! Code lenght is  MeMe# !!Ø! Data section lenght is  MeMe# !!ú!  !9!# -'"8'W/!9DM*!!͐ ͐!`iw#w͐͐ "͐)|1"!*"," !! ~#fo͐)~#fo~#fo!!X"Z" !! ~#fo͐)~#fo!! ~#fo͐)~#fo!! s#r͐"! !! ^#Vr+sá"`i^#Vr+s"!9"2#!9DM͐"͐"ͱ#%!%!9%ç/!9DM! ~#fo~#fo%?`is#r`i~#fo! ~#fo##~#fos#r͐i%!9Á%/.)&ë#!9DM! ~#fo~#fou%`is#r! w#w͐ &`i~#fo͐n! ~#fo͐n}&!$͐͐ x%͐ ͐{% &! ^#Vr+sè%͐ ͐~% &!92&/80!9DM!͉͐! ~#fo~#fo,&#|i&!&! ~#fo##!! ~#fo! ~#fo~#fo/&?s#r͐)`is#r! ~#fo! ~#fo͐s#r! ~#fo##~#fo͐s#r!&!͐)!)͐+?`is#r! ~#fo##~#fo|ʽ)!! ~#fo! ~#fo͐~(! ~#fo##~#fo͐s#r! ~#fo~#fo͐s#r!!! ~#fo~#fó()! ~#fo##6#6! ~#fo! ~#fos#r!)!9*à1180!9DM͐|*)*͐+++|3*!)*! ~#fo##^#Vr+sze*! ~#fo^#Vr+sn&*!! ~#fo! ~#fo~#fo*`is#r!ڞ*!*! ~#fo##͐?+s#r! ~#fo! ~#fos#r! ~#fo^#Vr+sn&*!9+-!9-q.!9DM͐͐?! s#r͐! s#r͐h.͐͐?`is#r͐͐! s#r͐͐! s#r͐ ! s#r͐͐ P.͐͐ ! s#r͐|8.͐͐͐͐͐!-!9~#fo-8.͐͐͐͐͐ -! ~#fo͐s#rø-! ~#fo͐s#rÒ-! ~#fos#r@-!9!9DM! ^#Vr+szʾ.͐n`is! ^#Vr+s͐ ns! ^#Vr+s`insy.!9 7*|DM**/.><.~# x. >!10î07* 1\!* 17:)~:,"s!"u*|*uʞ1*~#u1"*s*už1#"u*+"b1:woʯ12w&!o 1 . &7:O*o` &00:qw0! {w7:)~:,"s!"u*|ʎ0**s“0! ~Ž06*u*+"*"*u#"uZ07,2q*&:q):0=0=r:qo& !\&#{,!9DM͐~#fo͐~#fo#8#Z#!9DM͐5#͐5#`#Í/!9DM͐|g}o0! s#r͐9Ҡ#! ~#fos#r͐]#ô#%)&!9DM͐ͮ#`is#r͐͐ #!%͐͐ t$͐ ͐! s#r͐! ~#fo##~#fo_$! ~#fo##~#fo͐s#r! ~#fo~#fo͐s#rq$͐ ͐ͱ#%%͐͐ ! s#r͐! ~#fo~#fo! ~#fo$! ~#fo##~#fo͐s#r! ~#fo~#fo͐s#r%͐ ͐9 'W/!9DM͐n}6'! ^#Vr+sn& ''7*!#B'7**u'X'#~z'e'U'!`i7**~#É'7**ʥ'Ü'~#å'ô'î0!9DM! ~#fo!͐ͱ's#rz'!! ~#fo##w#w! ~#fo~#fo (01!9DM͐(! ~#fo͐(s#rz;(!! ~#fo! ~#fos#r! ~#fo##6#6! ~#fo~#foÄ(81./!9DM͐ҟ(!)! ~#fo##~#fo¼(!)! ~#fo##~#fo`is#r͐! ~#fo! ~#fo~#fo{()!9DM͐*`is#rzG+͐*! s#rzG+͐?͐M+!M+!9b+W/181!9DM͐+|‚+! n&Y+͐++| +! n&!\+͐+++|¿+! n&!\+! ~#fo##^#Vr+sz+! ~#fo^#Vr+s! ns&!! ~#fo! ~#fo~#fo_+*,!! ~#fo##6#6! ~#fo! ~#fos#r! ~#fo^#Vr+s! ns&!9DM`iw#w! ~#fo͐n! ~#fo͐n},! ~#fo`i^#Vr+sn},!-É,! ~#fo͐n! ~#fo͐nѯgW< /~+ x /|} ) , )6!7**:OzR/q#J/  q/  u/_ / _ ¢/   , FNxg>Goy/$/ç/7:,*/:*/}|2q &00:qw0! {w7:)~:,"s!"u*|ʎ0**s“0! ~Ž06*u*+"*"*u#"uZ07,2q*&:q):0=0=r:qo& !\&/* >>>>> start ccl <<<<<< */ /* */ /* Compiler begins execution here */ /* */ #ifndef TRUE /*see if need to use include file */ #include #endif main() { glbptr=startglb; /* clear global symbols */ locptr=startloc; /* clear local symbols */ wqptr=wq; /* clear while queue */ macptr= /* clear the macro pool */ litptr= /* clear literal pool */ nxtlab= /* next label to assign */ sp = /* stackptr (relative) */ errcnt= /* no errors */ eof= /* not eof yet */; /* intro code */ parse(); /* process ALL input */ dumplits(); /* then dump literal pool */ dumpglbs(); /* and all static memory */ dumpextrn(); /* make all function defined extrn */ errorsummary(); /* summarize errors */ trailer(); /* follow-up code */ closeout(); /* close the output */ if (errcnt) unlink("a:$$$.sub"); /* if errors erase submit file */ return; /* then exit to system */ } /* */ /* Process all input text */ /* */ /* At this level, only static declaf if pending */ } } /* */ /* Dump the literal pool */ /* */ dumplits() { int j,k; if (litptr==0) return; /* if nothing there, exit...*/ printlabel(litlab); col(); /* print literal label */ k=0; /* init an index... */ while (k=litptr) { nl(); /* need */ break; } outbyte('ptr=cptr+symsiz; } } /* */ /* dump extrn function */ /* */ dumpextrn() { char *ptr; ptr=startglb; while(ptr!=glbptr) { if (!ptr[offset]) extrn(ptr); ptr=ptr+symsiz; } } /* */ /* Report errors for user */ /* */ errorsummary() { /* see if anything left hanging... */ if (ncmp) error("missing closing bracket"); /* open compund statment ... */ if (!cif) error("missing closing #endif"); nl(); comment(); outdec(errcnt); /* total # errors */ outst/* erase line */ output=0; /* start with none */ pl("Output filename? "); /* ask...*/ gets(line); /* get a filename */ if(ch()==0)return; /* none given... */ if ((output=fcreat(line,fout)) == ERROR) { output=0; /* can't open */ error("Open failure"); } kill(); /* erase line */ } /* */ /* Get (next) input file */ /* */ openin() { input=0; /* none to start with */ while (!input) /* any above 1 allowed */ { kill(); /* clear line */ input= /* no input file */ input2= /* or include file */ output= /* no open units */ ncmp= /* no open compound states */ ctext= /* do not print text */ lastst=0; /* no last statement yet */ cif= /* state of #ifxxxx */ cmode=1; /* enable preprocessing */ litlab=getlabel(); /* label number for literal poll */ /* */ /* compiler body */ /* */ ask(); /* get user options */ openout(); /* get an output file */ openin(); /* and initial input file */ header()rations, */ /* defines, includes, and function */ /* definitions are legal... */ parse() { while (!eof) { /* do until no more input */ if(amatch("char",4)) { declglb(cchar); ns(); } else if(amatch("int",3)) { declglb(cint); ns(); } else if(match("#asm")) doasm(); else if(match("#include")) doinclude(); else if(match("#define")) addmac(); else if(match("#ifndef")) doifndef(); else if(match("#ifdef")) doifdef(); else newfunc(); blanks(); /* force eo,'); /* separate bytes */ } } litptr=0; } /* */ /* Dump all static variables */ /* */ dumpglbs() { int j; dsect("@globals"); cptr=startglb; while(cptr=endloc) { error("local symbol table overflow"); return 0; } ptr=locptr; locptr+=symsiz; break; } strcpy(ptr+name,sname); ptr[ident]=ident_typ; ptr[type]=typ; ptr[storage]=class_id; ptr[offset]=value; ptr[offset+1]=value>>8; ptr[indcnt]=count; return TRUE; } 77-9798`i6#6977͐͐78`i6#6977͐͐78`i6#6977͐͐7 8`i6#6977͐͐7 8`i6#6977͐͐78`i6#6977͐͐78`i6#69͐ :͐͐8! :!90::- %ånLø$,7eÁ)!9DM͐͐:`is#r::|h::|o:͐:͐͐!:$:! s#r!:':|:͐~#fo͐*:͐6#6͐! :! !::͐-:!:É:! 9|| ;;- %ånL; if (input2) { error("nested include not allowed"); kill(); return; } if ((input2=fopen(fname,finp2)) == ERROR) { error("Open failure on include file"); input2=0; } kill(); } doifndef() { char sname[namesize]; int lval[2]; blanks(); if (constant(lval)) { cif=FALSE; return; } if (!symname(sname)) { error("invalid identifier"); kill(); return; } if (findloc(sname) || findglb(sname)) cif=FALSE; else cif=TRUE; } doifdef() { c j=pointer; ++count; while(ch()=='*') { ++count; gch(); } } else j=variable; if (!symname(sname)) illname(); if(findglb(sname)) multidef(sname); data_parse(sname,typ,statik,j,count); if (match(",")==0) return; } } declloc(typ) int typ; { int j; int count; char sname[namesize]; while(1) { count=0; if (endst()) return; if (match("*")) { j=pointer; ++count; while(ch()=='*') { ++count; gch(); } } else cint) size=size+size; } } else { ident_typ=pointer; size=2; } } else { if (ident_typ==pointer) size=2; else if (typ == cint) size=2; else size=1; } switch(class_id) { case statik : if (glbptr>=endglb) { error("global symnol table overflow"); return 0; } ptr=glbptr; glbptr+=symsiz; value=size; break; case stkloc : sp=modstk(sp-size); value=sp; if (locptr>=endloc) { error("local symbol table overflow"); $,)dÁ)!9DM͐͐:! s#r::&E;:&L;͐ü;͐͐::`is#r!;;|ʪ;͐~#fo͐;͐6#6͐! :! :ù;͐;!ü;d;! 9&&;Ê<- %ånL,Ádj!9DM͐͐ ;`is#r;;|'<;|'<;=.<͐<͐͐ ;!<;|v<;͐! ;! ;;͐6#6|=͜<|,=͟<͐! ͍- %ånL,Ádÿj!9DM͐͐ C=`is#rF=I=&Ÿ=L=&ʟ=L==¦=͐=͐͐ O=!>R=|=U=͐! C=! O=X=͐6#6=!=õ=!9&>?-*/L,Ádkk!9DM͐͐ >`is#r>!?*! >|t>! ?*! >|t>͐>͐͐ >! ?>|ʼ>>͐! >! >>͐6#6>!?>|>>͐! >! >>͐6#6>!>Ã>!/********************************************************/ /* */ /* copyright(c) 1981 By Mike Bernson */ /* */ /* submit command for cpm 2.x */ /* read input file and convert to $$$.sub with */ /* $1-$9 to pram from comand line and convert */ /* ^a to control character */ /* */ /********************************************************/ #define ERROR -1 /* error return value */ #define LF 0x0a /* value used for line feed */ #define CR 0x0d /* value used for return */ open input and output data file */ /* also process data and output */ /* data to $$$.sub and set loc 8 ff*/ /* */ /* Date written: Jan 28, 1981 by Mike Bernson */ /* */ /********************************************************/ main(argc,argv) int argc; /* number of arg on command line +1 */ int argv[]; /* pointer to each arg on command line */ { char filename[132]; /* hold input file name */ strcpy(filename,argv[1]); strcat(filename,".sub"); if (open(infcb,filenameconvert '^'a to control char */ /* */ /* date written Jan 28, 1981 By Mike Bernson */ /* */ /********************************************************/ doinput(parm) int parm[]; { int current; /* current character working on */ outoff=1; /* set output offset to zero */ /* pick up 1 line of input */ while(outoff<120) { /* get charcter and see what need to be done */ switch(current=getbuff()) { /* end of file */ case ENDFILE : done(); /* '$' can be $1 return; /* line feed ignore */ case LF : break; /* must be a valid character put in output buffer */ default: putbuff(current); } } } dooutput() { int tempdo; tempdo=((line-1)*128); outbuff[tempdo]=(outoff-1); while(outoff<128) putbuff(0); if (++line>148) error("Too many lines"); } /********************************************************/ /* */ /* done */ /* */ /* function: to write output buffer out */ /* 9==!===!=C?ùB-*/L,Ád*k@kUkkk&+ÀkÖkëkk!9DM͐͐ ?`is#r?!B*!?|?!B*!?|?!B*!?|?!B*!?|?͐ÐB!B*!?|?͐ÐB!B*!?|@͐ÐB͐͐ ?!B"?|ʠ@%?͐! ?! ?͐6#6! ~#fo~#fo"|v@!~#fo n}v@(?@͐"|ʚ@!~#fo n}š@+?@+?ÍB!B"?|)A%?͐! ?! ?͐6#6! ~#fo~#fo"|@!~#fo n}@.?@ #define ENDFILE 0x1a /* value used for end of file */ char infcb[36]; /* pointer to input fcb */ char outfcb[36]; /* output fcb */ char *prt; /* just a spare pointer */ int inpoff; /* input buffer offset */ int outoff; /* output buffer offset */ int line; /* current line number */ char inbuff[128]; /* input buffer */ char outbuff[17000]; /* output buffer */ /********************************************************/ /* */ /* main */ /* */ /* function:) == ERROR) { infcb[0]=1; /* try drive a */ if (bdos(15,infcb) == 0xff) { puts("Input file not found"); exit(); } } for(line=argc; line<12; argv[line++]=""); inpoff=128; line=1; /* process input file and write output */ while(1) { doinput(argv+1); dooutput(); } } /********************************************************/ /* */ /* doinput */ /* */ /* function: to proccess input buffer and */ /* change $1-$9 to text needed and */ /* -$9 or $$ */ case '$' : if ((current=getbuff())=='$') { putbuff('$'); break; } if (current>='0' && current<='9') { prt=parm[current-'0']; while(*prt) putbuff(*prt++); break; } error("Invalid parmeter"); break; /* check for control chraracter */ case '^' : current=getbuff(); if (current>='A' && current<='Z') putbuff(current-'@'); else error("Invalid control character "); break; /* check for end of line */ case CR : in backward record format */ /* */ /* Date written: Dec 16, 1980 By Mike Bernson */ /* */ /********************************************************/ done() { char temp; /* create output file on disk a */ if (open(outfcb,"A:$$$.SUB") != ERROR) outfcb[32]=outfcb[15]; else if (create(outfcb,"A:$$$.SUB") == ERROR) { puts("Output File not created"); exit(); } while(--line) { if (write(outfcb,outbuff+128*(line-1),1) == ERROR) { error("Disk is Full"); exit(); } } close(outfcb); prt=8; *prt=255; exit(); } /********************************************************/ /* */ /* getbuff */ /* */ /* function: to getn next character from */ /* from input buffer and convert */ /* to upper case */ /* */ /* date written: Dec 16, 1980 by Mike Bernson */ /* */ /********************************************************/ getbuff() { if (inpoff == 128) { if (read(infcb,inbuff,1) == ERROR) return ENDFILE; ***********************************************/ /* */ /* error */ /* */ /* function: to print error message follow */ /* by at line (line number) */ /* */ /* date written: dec 16, 1980 By Mike Bernson */ /* */ /********************************************************/ error(msg) char *msg; { puts(msg); /* print error message */ puts(" at line "); /* print "at line" */ outdec(line); /* print line number */ exit() ; /* end back to cpm */ } /*********/* set zero suppress */ putch(num); /* print character */ } number=number % place; place=place/10; } } ssagdec from */ /* to console */ /* */ /* date written: Dec 16, 1980 By Mike Bernson */ /* */ /********************************************************/ outdec(number) int number; { char zero,num; int place; place=10000; zero=0; while(place>0) { num=number/place+'0'; /* get current digit */ if (num != '0' || place ==1 || zero) { zero=1; clink c1 c2 c3 c4 c5 c6 c7 c8 c9 c1 c2 c3 c4 c5 c6 c7 c8 c9 -r e00 -s  8000 a:cc1 c5.c -e 8000 a:cc1 c6.c -e 8000 a:cc1 c7cc1 b:c1.c -e 8000 cc1 b:c3.c -e 8000 cc1 b:c4.c -e 8000 cc1 b:c5.c -e 8000 cc1 b:c6.c -e 8000 cc1 b:c7.c -e 8000 cc1 b:c8.c -e 8000 cc1 b:c9.c -e 8000 :cc1 c9.c -e 8000 clink c1 c2 c3 c4 c5 c6 c7 c8 c9 c1 c2 c3 c4 c5 c6 c7 c8 c9 -r e00 -s  inpoff=0; } return toupper(inbuff[inpoff++]); } /********************************************************/ /* */ /* putbuff */ /* */ /* function: to write chracter to output */ /* buff and inc offset */ /* */ /* input: character to write */ /* */ /* date written: Dec 16, 1980 By Mike Bernson */ /* */ /********************************************************/ putbuff(data) char data; { outbuff[(line-1)*128+outoff++]=data; } /********************************************************/ /* */ /* outdec */ /* */ /* function: to output number in dec from */ /* to console */ /* */ /* date written: Dec 16, 1980 By Mike Bernson */ /* */ /********************************************************/ outdec(number) int number; { char zero,num; int place; place=10000; zero=0; while(place>0) { num=number/place+'0'; /* get current digit */ if (num != '0' || place ==1 || zero) { zero=1; $EBIOTOUPPE TOLOWWE ISALPH ISUPPE!ISLOWWE4ISDIGIGISSPACZSTRLEh STRCPtSTRCASTRPO5SETMEMOVMEEOUT4INB PUTLPUTC^GETCt!GET#KBSTAOPE"$E CREAT)CLOSUNLIN+1REA\OWRITOSETFCRSVSTSTORINI@FREE_LISARGLOA$T }a{_o$T }A[o$T !4$R$T!}A0[0!!$R $T4}AC[C!!$R $TGL~\o^#M$R $T^} m . ]$R$T!t ˆ ^! ‘!o&$R$T#6 bkFw#¥6 $R$T}!!$R$T",<!!$R $T),<!!$R $T<'!!$R $T1+!9$ ,RQ!!az_~*>$T9k?ʊ~͚ځ#hÐʈ.> Š~.#Ð_?ʶ$$T0:ڶA[?7?$R !-18@CHNQ[tx{"|#A!~#fo n}#A.?@1?ÍB!B*!?|A!B*!?|A4?%?͐! ?! ?͐6#6! ~#fo~#fo"|ʮA!~#fo n}®A7?@͐"|A!~#fo n}A7?@:?ÍB!B*!?|ʇB!B*!?|‡B4?%?͐! ?! ?͐6#6! ~#fo~#fo"|]B!~#fo n}]B=?@͐"|ʁB!~#fo n}B=?@@?ÍB!ÐB@!9<><=>=>><<<=>=<<<>>>BC-*/L,Ádkk!9DM͐͐ ͼB`is#rͿB!C*!ÂF- %ånL,ÁdÀj×jíj!9DM! w#w͐! ͐E`is#rEE*pEE/pEE%|E E=ƒE͐sF͐͐ E!|FE|EE͐! ! E`is#r͐! EE͐w#wpF!~FE|"FE͐! ! E`is#r͐! EE͐w#wpF!FE|jFE͐! ! E`is#r͐! EE͐w#wpF!sFÒE! 9*/%F,ÂFnTl.lwånÈJLZlÌ+Ðe.h.plUxÇlôl!9DM!dJͅF|@G͈͐͐͐F`is#r|G͋F![J}0V:V!!$R $TZ}! !$T h!#l$R $T twʆ#{$R   $T ~ʘ#Ïwʣ#Ø$R     $T 5ʼî#~ʾîi`!$R     # * $T }!9ox} $R  $T 9x.>< ~# x  ><#~+ $T (x#|}$R    # / < $T4{2@}$R$T B}2G&o$R$T^#V+V+^ s#r$T\!à!$R )9?$T9!9~^#Vr+s##^#V#^#V+V+^ s#r$T!!$R )9?$T9+#~[ ~# +~ #6#~+:4~_@##5$T91h[.E#h[>Q!!az_~*>$T9k?ʊ~͚ځ#hÐʈ.> Š~.#Ð_?ʶ$$T0:ڶA[?7?$R !-18@CHNQ[tx{B|+C!C*!B|+C͐ûC͐͐ B!CB|vCB! ͼB`is#r͐! BB͐w#wøC!CB|ʲCB! ͼB`is#r͐! BB͐w#wøC!ûC:C!9>><<>><<CD- %ånLÁdz%ËQcjMj!9DM͐͐ C`is#rCC+)DC-5DC=+ZD>iD>-fD>ʪDDCC͐! C`is#r͐! C͐ CC͐w#wDCC͐! C`is#r͐! C͐ CC͐w#wD!DKD!9E! ~#fo##~#fo͐~#fos#r͎͐͐F͐͑F![J[J!gJͅF|G͈͐͐͐F`is#r|wG͋F![J! ~#fo##~#fo͐~#fos#r͎͐͐F͔͐F͐6#6![J[J!jJͅF|H͚F͗F|G͝FH͈͐͐͐F`is#r͐͐͠FͣF͐6#6![J[J!lJͅF|ʙH͐^#Vr+s͈͐͐͐F`is#r͐͐͠F! ~#fo##~#fo͐~#fos#r͐w#w͐w#w![J[J!nJͅF|8I͈͐͐͐F`is#r͐w#w͐|H! ~#fo~#fo|H!pJͦF![J5I! ~#fo##~#fo|I![J5IͩF! ~#fo~#fo! s#rͬFͯF![J[J!JͅF|zI͈͐͐͐F͐͠FͲF͐6#6![J[J͐͐͵F`is#r!?! ͐͸F! ~#fo͐~#fos#r!JͅF| J͐|I͋F![J͎͐͐F͐ͻF͐6#6![J[J!JͅF|TJ͐|*J͋F![J͎͐͐F͐;F͐6#6![J[J͐[J! 9++---*&illegal address!++--æJWÐe.KxP>ʓP>„P>ʙP>P>ʟPâPPâP PâPâP! ! P! P! 9PnTÁdL7!9DM! ~#fo~#fo`is#r`i~#fo n}S!QS!͐QWS͐+|= 0 ) { if (temp==1 || temp==3) *temp1++=':'; *temp1++=clock[temp]+'0'; } /* add am or pm if needed */ switch(am) { case -1 : strcpy(temp1," "); break; case 0 : strcpy(temp1," AM "); break; case 1 : strcpy(temp1," PM ")to send to clock for time */ for(temp=5; temp>=2; temp--) { if (temp==5 && string[1] == ':') { clock[5]=0; continue; } if (temp==3) if (*string++ != ':') { puts("Bad time format missing \":\""); puts("(HH:MM [AM || PM])"); return TRUE; } if (!isdigit(*string)) { puts("Bad digit in time format"); return TRUE; } clock[temp]=(*string++) & 0x0f; } clock[1]=clock[0]=0; if (*string !=0) { puts("Bad time format too many digits (HH:MM [AM clock[5] |= am * 4; /* wait for user to hit return before setting time */ puts("Hit any key to set clock ");bios(3,0); /* send data to clock */ for(temp=5; temp>=0; --temp) { outp(DATA,temp); outp(ADDRESS,clock[temp] | HOLD); outp(DATA,temp | WRITE); outp(DATA,temp); } outp(CONTROL,0); return FALSE; }  }  LSE; }  8)8))8))("Bad hours range is 1-12 only"); return TRUE; } /* set 24 hour mode and am/pm bits */ if (am<0) clock[5] |= 8; else$EMAI@GCHARS @GCHARS @GCHA@SX@GINTS" @GINTS/@GIN=@PCHARSB @PCHARSN @PINTS[@PINTSi@PINx@INCDE~b@O @XO @AN @NLO@COM@AS@AS @SU $E @NE@CO@MUL#@DI a@SWITClBIOBDO EXI@INI$T o&9~$R $T o g#9~$R $T~$R$Tog$T " o&9~#fo$T/ o g9~#fo$T=~#fo$T B o&9s$T N o g9s$T#,09=GKUZcgpt}$T||g}oº$R$T )$R$T {ozg$T#$R$T|/g}/o$T#DM!yxGyOȯ{_zW$R !$T9 DMzzOxW>)_;g;}o{_zW=D$$T(DOOz/W{/_x/Gy/O{_zW{z$R  !$37<@$Tl{#€z€#^#V###n$R $T; break; } return string; } /********************************************************/ /* */ /* time_set */ /* */ /* function: to set the time from input */ /* */ /* input: string that has time to set */ /* am/pm/24 switch */ /* */ /* date_written: Mrach 8, 1981 By Mike Bernson */ /* */ /********************************************************/ time_set(string,am) char *string; int am; { char clock[13]; int temp; /* build array || PM])"); return TRUE; } /* check to see that ten second and tens of hours less then 7 */ if (clock[3]>5) { puts("Bad tens of minutes digit"); return TRUE; } /* check hours dights */ temp=clock[5]*10+clock[4]; if ((temp<1 || temp>24) && am<0) { puts("Bad hours range is 1-24 only"); return TRUE; } if ((temp<1 || temp>12) && am>=0) { puts("Bad hours range is 1-12 only"); return TRUE; } /* set 24 hour mode and am/pm bits */ if (am<0) clock[5] |= 8; else [ o&9s#r$T i o g9s#r$T x}|$T 9~͢ͷ͢͢ͷ͢  ^#V^{W$T )_zW/<_zW r+s|s|$R         - B O T $T }o|g$T }o|g$T }o|g$T| !|!|$R$T9͙+͙+͙+͙+$T9J͙+͙+ͩ+ͩ+$T3ͩ+ͩ+{_z!ɳ7z°{!|$R*+++͢o&$R$T $T$T9*+!^#6!#~ }| #~ 6$T9!***********************$T ***noname$R"!.38;@EGIKMOQSUWY[]_acegikmoqsuw$Q9J͙+͙+ͩ+ͩ+$T3ͩ+ͩ+{_z!ɳ7z°{!|$RUU`i~#fo n}%UiUiUUT͐T! ~#fo~#fo|cU!UT! ~#fo~#foTTUT`i~#fo n`i~#fon&?! ~#fo~#fo*TT!UTTU!9+dad sp V[- %z%kLàZI)ç7ËQiT5iÐe<.h.Lo÷o!9DM͐͐U`is#r! ~#fo~#fo! s#rUU>[OV>^V>([V>ʺWWU! ~#fo n}|VWëW͐w#w! ~#fo##^#Vr+s! U|VU]V! ~#fo͐U͐?s#r!WU!WWU͐UU!͐U90123456789ABCDEFinvaild hex constant0123456789ABCDEFKY, %]z%!9DM`iw#w!Y?Y|lY!ýYBY'ʢYBY|ʢY͐|g}o?EY`is#rlYHY! ~#fo͐s#r!ýY!9'Y, %Ì+]z%!9DM!ZY|Y!~Z! ~#fo*s#rY"gZY|ZgZ*QZ!ZYY"KZY|KZY1Z!~Z*#"+>YsZY*#"+>6!~Z!9"string space exhausted!9DM! ~#fo~#fo`is#r|Z!v[`i~#fo n}Z [p[v[`i~#fo n}Z[ [!i~#fo `i~#fo`i~#fo `i~#fo ssss! ~#fo͐s#r!Å]]]! ͝[!Å]! ͠[|t]!Å]Å]!]͗[ͣ[!Å]!9()global symbol table ofverflowinvalid expression] %z%)rw!9DM]\]]ï^]]`is]>R ^><^>N^>B^>B!^>H^>T-^>N^>F9^>T^Z^! ï^! ï^!ï^! ï^! ï^`in&]|q^`in&ï^`in&`is]]|ʧ^`in&?]`is~^`in&ï^!9^.h. q!_ͻ^;^!_^!_^!_^!_^!"`^!G`^uge equ @ucomp+6ch@ugt equ @ucomp+51h@ule equ @ucomp+79h@ult equ @ucomp+5fh@preinc equ @incdec@postinc equ @incdec+10h@predec equ @incdec+08h@postdec equ @incdec+1ahóa q!aͰaendap!aadb a.+. q!9DM͐aa!badsect bp!b bds %b.h.!9DM!Cbb͐b"b extrn QbÁ.!;Nbnb qiÐe<.h.!9DM͐*`is#r͐|™b͐Åc͐|b͐b͐|g}o|b!c_b`i^#Vr+s͐|b!c_b͐++`is#rb͐Åc͐|lxi d,lxi h,mvi b,jmp @switch(ep!3e%edw Fe qp%h.!9DM͐|ge!}e:e!e:e!e=e͐@eCemov a,hora ljnz Öep!e͓elxi h,îeLi!9DM! n}e!eͫee!eͫe@gchar@ginte|iLiái!9DM! ~#fo~#fo`is#r`i~#fo n`i~#fon&?! ~#fo~#fo*! s#r͐ ++|f͐e|tf!fe|f!feàf͐e|ʘf!feàf!fe͐e!9@gintss@gintsl@gcharss@gcharslfp.<.h.Li!9DM͐+|1g!agfU!WU!W͐w#w! U|hWU]hWU͐U͐?UVU!͐VUÈWU͐UU!͐VU!WU! ~#fo##~#fo#s#r!W͐V!W͐w#wU! ~#fo~#fo V!W͐W! 9]]] X %ånz%)r,{Ì+(!9DMW06XWX _ iy7:O*o`7:)~:,"s!"u*|*uy*~#y"*s*uy#"u*+"òyy{7:,*y:*z}|2q Iz?z:qw:z! {w:wojz2w&!o z . &7:)~:,"s!"u*|z**sz! ~z6*u*+"*"*u#kóq!kk@eqkóq!&kk@ne0kóq!;k-k@uleFkóq!QkCk@le[kóq!fkXk@ugeqkóq!|knk@geÆkóq!k̓k@ultÜkóq!k͙k@ltñkóq!kͮk@ugtkóq!kk@gtkóq!kk@asrkóq!kk@asl lLil!9DM!&ll͐l@preinc7lLil!9DM!Rl1l͐4l@predec`lLi!kl]l@negvlLi!lsl@nlogÐlLil!9DM!l͊l͍͐l@postincýlLil!9DM!lͷl͐ͺl@postdeclàZa,qh.!9DM! ~#fo! onmust be lvalue.ou5vt0A% %z%!9DM!o`io͐T`io!o`io`i"o%o|moÅo(o]o+oÅo+obo!P9identifier "" is not a vaild array baseo-Ád*/A%ç7q,I)Liq\b!9DM`iw#wͺo͐|oͽo!p*!o|Lpo|pLpo͐|*poͽo͐##`is#r!po|IpLpo!po͐|ip͐olpo*͐o"!9),)Ùpu5vt0!9DM!p`i͐p͐T`i͓p!p`i͓p`i͖p!P9undefine identifier ""p1.!9DM sEyuyÈy!9DM͐+|+s! n&s͐++|Is! n&!s͐+++|hs! n&!s͐++++| s! n} s! !s! n&!s͐##^#Vr+szs͐^#Vr+s! ns&!͐͐~#foss!͐##6#6͐͐s#r͐^#Vr+s! ns&HtÈyxy!9DM͐ct!Àu͐##~#fo|t!Àu͐##~#fo`is#r͐͐͐~#fo?t͐t!Àu͐+?`is#r͐##~#fo|Yu!͐͐͐͐~#fo͠v`is#r!8w͐##^#Vr+s|w͐##͐?+s#r͐͐s#r͐^#Vr+sn&|w!9!9DM`iw#w! ^#Vr+sn}ʲw`i^#Vr+sÓw͐ùw!9!9DM! n&0ͯw! n&9ͯ!9DM! n&aͯx! n&zͯ !\&! 6  #F#x]x~#Px _ wx  #7*|DM**xڮx>Goy*{$7**W{:{#~\{G{7{!`i#o`7:)~:,"s!"u*|*uy*~#y"*s*uy#"u*+"òyy{7:,*y:*z}|2q Iz?z:qw:z! {w:wojz2w&!o z . &7:)~:,"s!"u*|z**sz! ~z6*u*+"*"*u#