IMD 1.16: 31/05/2007 20:01:15 FOGCPM.112 --FOGCPM112C1 COM C1 COMy !"-01-19 88 -07-00 86 ASSEMBLECOM#$%&'()*+,-./012ASSEMBLECOM!34567-CPM114 DOC"-CPM112 DOCLINK COMb89:;<=>?@ABCDC DEF/EFGHIJC SUBKCC SUBLCL SUBMFUNCTIONCRLNSTDLIB TXTOPQC1 C QRSTUVWXYZ[\C2 C b]^_`abcdefghiC3 C %jklmnC4 C *opqrstC5 C 7uvwxyz{C6 C |}~C7 C jC8 C 8C9 C SUBMIT C 4TIME C #WORDPUZLC !WORDPUZLDOCThis is the disk name. *K͞+4}԰'+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#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:77!a{   `OE!y6$ -7rBo&))T])))!y" $)$͋#:+;Gg)xs)m):+;G)xs))" $͖)$͋#* <~G~#)> w" <* <~?*w#> *)G:+;x* <~+P0*~(*~?@)~)~w" <* <~@?%F>@P*>wx>[*>3>3>c*>c*>c*>c*:+;?%:6;?%BD Software C Compiler v1.41 (part II) Can't open file Write error Missing label Missing semicolon Illegal statement Can't create CRL file Illegal operator Lvalue required Lvalue needed with ++ or -- operator Illegal left operand in assignment expressionÔ$e Ø Ä_> X  , ûb "z"p!,?!"rt"n&d ͐| ͐* g !,j ì Ó !"!9$ b.(.c9.e.!9DM!2 ; @globals "**p !~#fo n}ʾ *   !~#fo n&|g}o!~#fon&|g}o`is#r͐ ! *"G !9 6c!9DM`is#r͐*p# `i~#fo n} ͐ ͐`is#r !9> À+e.hc9..*|j !M e missing closing bracket/ *|” !x Ï missing closing #endif/ 2 5 *8 ! errors in compilation.; 2 Puuvw*| !ά! !ά * !"" %,$\%Æ% &7&Ü&!9DM! w#w|=!CE* |ʁ`i6#6! ^#Vr+s *~! ^#Vr+saÈ`i6#6! |™! |ʰ! ͐͐!͐! !, |*! 9x$\%À+à$t!9DM|!! 6 <<! 6>"Q! 6"! w#w͐ Ҟ|ʞ! n&ʞ! ^#Vr+s`isY͐ `i6! n! n} |!invaild file name for includeò͐ |4! )missing file name for includeò!"*|l!Hanested include not aloudò!Ȩ`i"#|¯!äOpen failure on include file!"!"9-KÆ%À+à$'7&!9DM;! |!"L`i|%!invaild identifierL`i|=`i|F!"L!"! 9m-KÆ%À+à$'7&!9DMX! [|!"`i^|¼!ôinvaild identifierad`ig|`ij|!"!"! 9,À+ycLx!9DM! [|ʅ! ^#Vr+s`is#rzu! n}P͐͐`is#rr! 6! n}r͐͐`is#rÂ! 6`i6#6ö! n}š`i6#6ö! n}¯`i6#6ö`i6#6! n}:ʭ*p!,?!! global symnol table overflow!é*p! s#r*p"p͐! s#r*͐"*! s#r*r!aڕ!nÊlocal symbol table overflow!é*r! s#r*r"r*! s#r*++"*r!a!local symbol table overflow!é*r! s#r*r"r͐ ͐! ~#fo ! ns! ~#fo ! ns! ~#fo ! ns! ~#fo ͐s! ~#fo͐s! ~#fo ͐s!é!9û,À+!;͵|!missing semicolon͸È',.e.à$!"!#endasm|$=*|/=!!"ÇÆ%À+à$,7&Ü&dLx(-*/ %^,àòîyceX Ô$!9DM`iK|!illegal function or declarationNQú!(T|!illegal function or declarationNQú`iW! s#rzu! ~#fo n}@`iZr! ~#fo n}]`iZr! ~#fo 6`i];*p!,?!ڹ!ñgobal symbol table overflowN4*p! s#r*p"p`i͐ `! ~#fo 6! ~#fo ! ~#fo ss! ~#fo! ~#fo ! ~#fo sss`i]!"!GI)T|`iK|j*##"Î!pÆillegal argument nameNcf!Ù)*!i|!ö,T|!expected commaNl|A!,?!"r!"*|~!!charo|4!ru{!!>Binto|[!ru{!aswrong number argsN~xʕ!{~!"!,?!"ŕ̈́"! 9,KÀ+$\%4)!9DM!]|!×`i|L! must be constant,F;F|F !×͐|![qnegative size illegal͐`is#r!Ë]͐×!9,$\%Æ% &'Ü& %À+!9DM! w#w*|å!*ͣ|"! 6#6! ^#Vr+sͦ*! ^#Vr+sͩ+! 6#6`iͬ|:ͯ`iͲ|M`i͵͐ ͐ !͐`i͸ͻ|vå!|~,ͣ|¢!Ýexpected comma;!9$^,ùoò,fÕÒ"ú" #7ͱ|*|ú!!charʹ|!ͷͺú!!&*intʹ|C!ͷͺú!IK{ͽ|[ú!!ehifʹ|!"ú!!Ïwhileʹ|ʦ!"ú!!ôforʹ|!"ú!!switchʹ|!"ú!!returnʹ|ͺ!"ú!!(.breakʹ|Hͺ!"ú!!R[continueʹ|uͺ!"ú!{};ͽ|ʊú!Õ#asmͽ|ʮͺ!"úͺ! "*,î*#"!}|*|*+"Ô$ûLîyc^,o)/e!9DM*r`is#r*! s#r! s#r͐ ͐ "͐"r!!hmelse|„͐ü! s#r͐ ͐ "͐"r͐!9Ô$Ô)o)ûLî/eyc*!9DM*r`is#r*! s#r! s#r! s#r! s#r`i͐͐͐͐͐"r͐"! 9ÍÔ$Ô)^#*7í#o)ae/e#îyc!9DM*r`is#r*! s#ri! s#ri! s#ri! s#ri! s#r`ilo|rÌux|rÌ͐{u! s#r͐ ͐~͐ ́x|5rÌ͐{u͐́̈́|XrÌ͐ {͇͐́͐{͐"r͐͊"r!9Ô$Ô)^#*7e#H$/e^, MÀ+o),erf9..$e.ycî!9DM! w#w*r! s#r*! s#r͘! s#r!  s#r!  s#r! s#r! ͛͞|7 ͡É"ͤͧͪ|K ͡É"ͭ|Y ͡É"͘! s#rͰ*##"!!{ À caseͳ|M!! Ͷ|´ ! ì Bad constant͹q ̓ ̓)`i̓s#r! ^#Vr+s)! ͘s#rͼ!!!!Too many case statments͹!%!'!:Ϳ|J!!7!E!Missing colon͹Æ"!!W!_!defaultͳ|ʭ!͘! s#r̓ͼ!!Ç!:Ϳ|ª!!!å!Missing colon͹Æ"!!õ!}Ϳ|ʃ"̓ Ͱ! w#w̓ͼ̓͘! s#r̓̓ͼ̓̓["̓)`i~#fo!1"3",! ^#Vr+s)! ~#fo"̓͡ ͼ̓"r̓"É"Æ"q !9á" %7yce͕"|­"͘"!͛"͞"":*yc/e!9DMͽ"`is#rz"#`i~#fo##~#fo"`i~#fo~#fo"!9#:*yc/e!9DM#`is#rz1#U#`i~#fo##~#fo#`i~#fo~#fo#!9j#,À+(!q#s#(a#|ʂ#!!#Þ#Missing left parnthisd#g#!ù#,À+(!##;Ͱ#|#!!##Missing semicolonͳ#Ͷ#!$,À+(! $ $)#|$!!"$9$Missing right parnthis#$!T$,À+(![$]${K$|l$!!r$Å$Missing left braceN$Q$!*#"!">2ô$dz!9DM! ͱ$͐n}$! ^#Vr+sn&ͱ$$*n&%.9.!9DM!%%@$͐$,%-*/$#%!6%8%;*!&%|ͣX%)%|͝b%$_%|s%!Ä%*#"+n&Ø%-}*$*\%!9DM͉%͏%͌%|¶%!&`iw#w͏%͒%|%! ~#fo`i^#Vr+s͕%sü%! ~#fo͐6!&!9&À+(!&-&illegal symbol name &&=&Ö/!9DM`is#r͐*pʍ&!͐͐:&||&͐Ó&͐`is#rM&!Ó&!9è&Lx_xt0!9DM!&&already defined symbol or function "`i͟&͐T`i͢&!&&"`i͢&`iͥ&!P9'Ö/!9DM!,?!`is#r͐*ry'!͐͐'|h'͐'͐`is#r9'!'!9ã'à$Ø {x~zhc1.e.!9DM͋'*|¹'͎'*|'(*|'Ȩ! s#r*#"'¤! s#r*#"͐͑'`is#rzS(͐ ,(*O,(͐/(S(͐ P(*#"+͐s'*6͐v(͐(*|ʏ(*͔'!"Ý(*͔'!"*|(*|(*|(͗'͚'!͝'͠'!"(ë'!9(*+$\%-((|)((|)((/)((|/)(|))/)()(=),À+!9DM͐7)|m)!Y)h)missing braket:){)$(.e.!9DM͐r)u)x)Ú)À+!9DM*32!"2G52'4!'222'42|3!33missing apostrophe!242\32222ò32!'2G52/r4$2*r4'2'22*J4$2/i42|X42[4'2*|f4i424'2'2G52*2|?5`iw#w2*2|ʽ4͐ҷ4`i^#Vr+s! 2s2Å4͐! 6! -2`is#rz 5`i^#Vr+sn! s{5! n&24<5`iw#w`i^#Vr+s! n! s{<5! n&25G522à2!2*Ow5!d5r5line too long!2!""*#"+*#"+Jns{ʥ5À5!"! 9!9DM*! ns*5*#"! n&!9DM! s#r! s#r`i6#6'͐ |<6͐ ! s#r! ~#fo! ^#Vr+s6-͐6͐ ͐0! s! n}0~6͐+|~6͐|ʨ6! 6#6! ~#fo! ^#Vr+s! ns͐ ͐! s#r͐ `is#r<6! ~#fo͐6͐ 6!9!9DM*J! ns*O7*#"! n&.7Ö/!9DM`iw#w͐*Ҽ7!͐!͐+7|ʉ7`i^#Vr+sn}ʂ7j7͐7`i^#Vr+sn}ʡ7É7`i^#Vr+sn}ʹ7á7<7!7!97dM 8!9DM! w#w! `i7`i7͐8!9=86:$æp\%äPdQ*Rkl6lPlil{lÔlílnR!9DM͐ ͐ 8`is#r8=y88=y8͐-:͐ w#w8>=8>8>+œ8>9>-¨8>9>*´8>E9>/8>g9>%8>ʉ9>&8>ʫ9>^8>9>|8>9:8͐͐8:88͐͐8͐88-89"8;9%8`i6#6:88͐͐8(8`i6#6:88͐͐8+8`i6#6:88͐͐8.8`i6#6:88͐͐818`i6#6:88͐͐848`i6#6:88͐͐878`i6#6:͐-:͐͐:8!-:!9T:;-$æpdMÔ$,Êfo)!9DM͐͐9:`is#r<:?:|Œ:B:|ʓ:͐ ;͐͐E:H:! s#r!:ö:||K:|:͐~#fo͐N:͐6#6͐! 9:! E:;͐Q:! ;í:! 92;;-$æpdMÔ$,aeo)!9DM͐͐;! s#r;;&l; ;&s;͐;͐͐#;&;`is#r!;Ô;&&);|;͐~#fo͐,;͐6#6͐! ;! #;;͐/;!;Ë;! 9 <÷<-$æpdM,eíl!9DM͐͐ ;`is#r;;|Q<;|Q<;=X<͐î<͐͐ -$æpdM,e{l!9DM͐͐ s=`is#rv=y=&=|=&=|===͐,>͐͐ =!==&͂=|#>ͅ=͐! s=! =͈=͐6#6)>!,>=!9P>R?-*/dM,ell!9DM͐͐ 8>`is#r;>!v>y>==*!>>|³>!>×>!=*!>>|³>͐I?͐͐ A>!>>==D>|?G>͐! 8>! A>J>͐6#6F?!? ?!=D>|@?G>͐! 8>! A>M>͐6#6F?!I?>!9Â?C-*/dM,elm&m?m+WmpmÈmám!9DM͐͐ U?`is#rX?!?ê?<*![?|@!??>*![?|@!??<=*![?|@!@@>=*![?|@͐C!%@(@>>*![?|D@͐C!J@M@<<*![?|i@͐C͐͐ ^?!~@Á@<=a?|Ad?͐! U?! ^?͐6#6! ~#fo~#fo"|@!~#fo n}@g?x@͐"|A!~#fo n}Aj?x@j?C! AA>=a?|ʖAd?͐! U?! ^?͐6#6! ~#fo~#fo"|lA!~#fo n}lAm?x@͐"|ʐA!~#fo n}Am?x@p?C!AÞA<*![?|PB!AüA<<*![?|PBs?d?͐! U?! ^?͐6#6! ~#fo~#fo"|&B!~#fo n}&Bv?x@͐"|JB!~#fo n}JBv?x@y?C!VBXB>*![?| C!sBvB>>*![?| Cs?d?͐! U?! ^?͐6#6! ~#fo~#fo"|B!~#fo n}B|?x@͐"|C!~#fo n}C|?x@?C!Cx@!97C?D-*/dM,eùmm!9DM͐͐ C`is#r"C!]C`C>>*!%C|šC!{C~C<<*!%C|šC͐6D͐͐ (C!CòC>>+C|C.C! C`is#r͐! (C1C͐w#w3D!CC<<+C|-D.C! C`is#r͐! (C4C͐w#w3D!6DéC!9`DlE-$æpdMe\%*Rlk!9DM͐͐ BD`is#rEDHD+ʘDHD-¤DKD=«D͐cE͐͐ NDHD>+D>D>-D>EZEQDTD͐! BD`is#r͐! ND͐ WDZD͐w#w`EQDTD͐! BD`is#r͐! ND͐ WD]D͐w#w`E!cEúD!9ÍEF-$æpdM,e6lPlil!9DM! w#w͐! ͐oE`is#rrEuE*EuE/EuE%ExE=E͐F͐͐{E!F F*~E|NF́E͐! ! oE`is#r͐! {Ë́E͐w#wF!TFVF/~E|ʛF́E͐! ! oE`is#r͐! {E͇E͐w#wF!FãF%~E|F́E͐! ! oE`is#r͐! {E͊E͐w#wF!FF! 99G,FpfUmnÏyæpKdMInÀ+f.e.bnxVÁz|nìn!9DM!GGJG++F|ʾG͐͐͐G`is#r|~GG!K! ~#fo##~#fo͐~#fos#r͐͐G͐ G!KK!GG--F|DH͐͐͐G`is#r|GG!K! ~#fo##~#fo͐~#fos#r͐͐G͐ G͐6#6!KK!JHLH-F|ʨHGG|iHGßH͐͐͐G`is#r͐͐GG͐6#6!KK!HðH*F|'I͐^#Vr+s͐͐͐G`is#r͐͐G! ~#fo##~#fo~#fos#r͐w#w͐w#w!KK!-I/I&F|I͐͐͐G`is#r͐w#w͐|vI! ~#fo~#fo|ʚI!|IÌIillegal addressG!KI! ~#fo##~#fo|ʶI!KI!G! ~#fo~#fo! s#r$G'G!KK!II!F|%J͐͐͐G͐G*G͐6#6!KK͐͐-G`is#r!?! ͐0G! ~#fo͐~#fos#r!sJvJ++F|ʼJ͐|’JG!K͐͐G͐3G͐6#6!KK!JJ--F| K͐|JG!K͐͐G͐6G͐6#6!KK͐K! 99KàXfKYÂZ$~.9.e.!9DM͐K|UK!KæK͐$K|iK!KæK͐'K|}K!KæK͐*K|ʡK!K*-K!+0KæK!! ~#fo~#fo3K6K!K,Q+$+!9DM! s#r`is#r͐|:L`iw#w!KK+K|L`i6#6!LL-K|7L͐! s#r`i6#6KKK|ML!òLKK|ʄLK! s͐ ?! n&`is#rML͐|L͐`is#r! ~#fo͐s#r!òL!9L4)7ae!9DM!LL(;LL`is#r!LL);L͐͐L!9M-àXKY!9DM M͐M|7M!͐M|JM!͐M|]M!!sMgHgfUEh!9DM! ~#fo~#fo`is#r͐|™MÛP`i~#fo n}ʷMʷMOÛP`i~#fo n}MDNNO! ~#fo##~#fo`i~#fo n&2N͐+|N`i~#fo n&gM/N`i~#fo n&͐jMAN͐͐mMO! ~#fo##~#fo`i~#fo n&¡N͐+|†N`i~#fo n&gMÞN`i~#fo n&͐jMN͐+|¶N!gMN!͐jMO͐+|N`i~#fo n&gMN`i~#fo n&͐jMOÛP`i~#fo n}"OO\PÛP! ~#fo##~#fo`i~#fo n&‘O͐+|dO`i~#fo n&gMÎO! ~#fo~#fo`i~#fo n&͐pMÿO͐+|°O`i~#fo n&gMÿO͐͐mMÛP! ~#fo##~#fo`i~#fo n&1P͐+|P`i~#fo n&gM.P! ~#fo~#fo`i~#fo n&͐pMYP͐+|FP!gMYP!!͐pMÛP͐+|{P`i~#fo n&gMØP!`i~#fo n&͐pMÛP!9óPpedM 8!9DM! ~#fo~#fo`is#r`i~#fo n}Q`i~#fo n! ~#fo##~#foQͧP[Q͐>Q>2Q>#Q>8Q>/Q>>QAQͧPAQͪPAQAQ! ! ͰP! ͭP! 9vQpfUedM 8!9DM! ~#fo~#fo`is#r`i~#fo n}Q`i~#fo n! ~#fo##~#foQ͐|Q! ~#fo~#fo|QgQ!R͐͐jQmQ!͐pQmQ! ! sQ! pQ! 93R`[h!9DM͐-R`is#r͐+|WReR͐++|eR0R!9zRi1i2j!9DM! ~#fo~#fo`is#r͐| R]U`i~#fo n}ʾRʾRS]U`i~#fo n}R9SʼSS! ~#fo##~#fo`i~#fo n&6S͐+|S`i~#fo n&qR6S`i~#fo n&͐tRS! ~#fo##~#fo`i~#fo n&–S͐+|{S`i~#fo n&qRÓS`i~#fo n&͐tRùS͐+|«S!qRùS!͐tRS͐+|S`i~#fo n&qRS`i~#fo n&͐tRS]U`i~#fo n}TʆTU]U! ~#fo##~#fo`i~#fo n&ƒT͐+|YT`i~#fo n&qRÃT! ~#fo~#fo`i~#fo n&͐wR]U! ~#fo##~#fo`i~#fo n&T͐+|T`i~#fo n&qRT! ~#fo##~#fo`i~#fo n&͐wRU͐+|U!qRU!!͐wR]U͐+|=U`i~#fo n&qRZU!`i~#fo n&͐wR]U!9xUf.9.e.s!9DM! ~#fo~#fo`is#r|ʣU͐++|ʦUoV`i~#fo n}U V VoViU͐lU! ~#fo~#fo|V!UU+lU! ~#fo~#fooUrUoViU`i~#fo n`i~#fon&?! ~#fo~#fo*oUrU!]VdVdad spuUrUoV!9ñV?\-$\% M`[4)7*RújfUjf9.e.dMqq!9DM͐͐{V`is#r! ~#fo~#fo! s#r~V́V>[V>W>(W>nXÐẌ́V! ~#fo n}!WW_X͐w#w! ~#fo##^#Vr+s! ͇V|ʎẂV]ŽW! ~#fo͐͊V͐?s#r!~WÀW]͍V!×XW͐V͓͐V͖V!͙͐V͜V!WöW]͍V!×X͐w#w! ͇V|X́V]X͟V͐͊V͐?͢VͥV͖V!͐ͨV͜V7X͐V͓͐V͖V!͐ͨV͜V!=X?X]͍V! ~#fo##~#fo#s#r!×X͐ͫV!×X͐w#ẅ́V! ~#fo~#foͮV!×X͐×X! 9øX$æp\%NtþyÀ+(!9DMͣX0XͦXXXͦXxX!YͩXͩX! 6ͩXͬX! s! !Y Y0123456789ABCDEFͯX`is#r|gY!8YMYinvaild hex constantͲX͵X! ~#fow#w!Y! ~#fo͐+s#rͣXͬX! s! !YäY0123456789ABCDEFͯX`is#r|¼Y!Y! ~#fo! ~#fo~#fo?͐+s#rͩXzY!9Z,$Ï^\%!9DM`iw#w!ZZ'Y|(Z!yZY'^ZY|^Z͐|g}o?Y`is#r(ZY! ~#fo͐s#r!yZ!9ÔZ,$À+Ï^\%!9DM!ZäZ"ͅZ|´Z!W[! ~#fo*s#r͈Z"@[͈Z|Z@[**[!Z[string space exhausted͋Z͈Z"$[͈Z|$[͎Z [!W[*#"+>͎ZsZ͑Z*#"+>6!W[!9!9DM! ~#fo~#fo`is#r|†[!6\`i~#fo n}ʤ[[0\6\`i~#fo n}ʽ[[[!6\!6\! ~#fo##~#fo`i~#fo nѯg \`i~#fo n& \!6\0\`i~#fo n}$\*\0\!6\!6\!6\!9f\, 84)Æ%'7&$À+LxàrK(!9DM! ~#fo! ~#fo##! ~#fos#rs#rs#r!\ä\(B\|\͐͐E\! s#r!\\)H\͐ Æ^͐w#w! K\|H^! ~#fo! N\s#rz]!Æ^! ~#fo! Q\`is#rs#rzI]`i~#fo n}I]!Æ^T\(9^! Q\`is#r|^*p!,?!ڰ]!]è]global symbol table ofverflowW\^*p`is#r*p"p! ͐Z\`i~#fo 6`i~#fo 6`i~#fo `i~#fo`i~#fo `i~#fo ssss! ~#fo͐s#r!Æ^H^! ]\!Æ^! `\|_^!Æ^Æ^!e^x^invalid expressionW\c\!Æ^!9Þ^$\%NtÏy!9DM͒^\ʸ^͕^{_͕^͕^`is͘^>R^>_>N^>_>B^>_>T^>_>F_> _&_! {_! {_!{_! {_! {_`in&͛^|=_`in&{_`in&`is͒^͛^|s_`in&?͕^`isJ_`in&{_!9Ð_.e.&s!_å_@start: csect͇_͊_!_ý_jmp @init͍_!__extrn @and,@asl,@asr,@comp,@com,@div͍_!_`extrn @gchar,@gint,@incdec͍_!`D`extrn @mult,@neg,@nlog,@or,@pint,@sub͍_!O`t`extrn @sxt,@ucomp,@xor,@init,@switch͍_!`ç`extrn @gintss,@gintsl,@gcharss,@gcharsl͍_!``extrn @pintss,@pintsl,@pcharss,@pcharsl͍_!``@eq equ @comp͇_͊_!aa@ge equ @comp+35h͇_͊_!!a3a@gt equ @comp+1ah͇_͊_!AaSa@le equ @comp+43h͇_͊_!aasa@lt equ @comp+28h͇_͊_!aÓa@ne equ @comp+0dh͇_͊_!aõa@uge equ @ucomp+6ch͇_͊_!aa@ugt equ @ucomp+51h͇_͊_!aa@ule equ @ucomp+79h͇_͊_!bb@ult equ @ucomp+5fh͇_͊_!)b=b@preinc equ @incdec͇_͊_!Kbdb@postinc equ @incdec+10h͇_͊_!rbÊb@predec equ @incdec+08h͇_͊_!bñb@postdec equ @incdec+1ah͇_͊_b&s!bbend;bbs!bbdb bb.(.&s!9DM͐bb!ccdsectb$cs!+c/cds !c?c.e.!9DM!McUc extrn 9c͐9cfEfmvi b,e͐ee!\fhfjmp @switcheexfs!fÃfdw ufÙf&ss$e.!9DM͐|f!føfmov a,h͍f!ffora l͍f!ffjnz ͐f͓͐f͖ffs!fglxi h,f gj!9DM! n}5g!&g-g@gchar gFg!;gAg@gint gTg kjEk!9DM! ~#fo~#fo`is#r`i~#fo n`i~#fon&?! ~#fo~#fo*! s#r͐ ++|g͐Kg|g!gg@gintssNgg!gg@gintslNg3h͐Kg|h!hh@gcharssNg3h!%h.h@gcharslNg͐Qg!9Whs.9.e.j!9DM͐+|·h!ohthlda Hh͐Kh͐|ʡh!hÓh+Kh͐NhQh!hïh@sxtThh!hhlhld Hh͐Kh͐|h!hh+Kh͐NhQhh&s!iidad hhiÄkæk!9DMi! n&i=i kjEk!9DM! ~#fo~#fo! s#r! ~#fo n! ~#fon&?! ~#fo~#fo*`is#r! n}i͐4i|i!ii@pintss7ii!ii@pintsl7i j͐4i| j!ij@pcharss7i j!jj@pcharsl7i͐:i!9Dj&ss.9.e.!9DM͐+||j!\jdjmov a,l5j!ojtjsta 8jÍj!jÈjshld 8j͐;j͐|ʵj!jçj+;j͐>jAjj&s!jjxchgͽjj&s!jjdad djjs.e.!9DM!k kcall j͐jj!9DM͐|͵Ak͐ͯWk kbrf9.e.!9DM͐Hk|skKkvkNk͐QkTkÊk&s!k×kpop d͇k*##"ïk&sj!9DM! n}k!kkmov a,lͩk!kkstax dͩkk!kk@pintͬkls! ll@subllÄk&sl!)l/ldad dlGoy2}$*!#Çy!9DM! n&0ͯںy! n&9ͯ7**yy#~yyy!`i!9DM! n&aͯz! n&zͯ !\&! 6  #F#x_z~#Rz _ yz  #7*|DM**zڰz>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:77!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;! >"G;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!`is#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 !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*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>>ʾ>>> >>>[>>ʮ> >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!ḧ́`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*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͐͐| !! *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ó ! !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ͼ"|#`in&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&!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&)ͷ( )!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**>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;*- -! 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+/-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`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 stack 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}2w*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ÖBW1!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! 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#rzf*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 CPI CPO CZ DAA 'DAD DCR DCX DI EI HLT vIN INR INX JC JM JMP JNC JNZ JP JPE JPO JZ LDA :LDAX LHLD* LXI  MOV @ MVI NOP ORA ORI OUT PCHLPOP PUSHRAL RAR RC RET RLC RM RNC RNZ RP RPE RPO RRC RST RZ SBB SBI SHLD"SPHLSTA 2STAXSTC 7SUB SUI XCHGXRA XRI XTHL@N!9DM͐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##^#Vr+sz8C! ~#fo^#Vr+s! ns&!! ~#fo! ~#fo~#fo͟BjC!! ~#fo##6#6! ~#fo! ~#fos#r! ~#fo^#Vr+s! ns&CßOaNP!9DM͐C!3E! ~#fo##~#foC!3E! ~#fo##~#fo`is#r͐! ~#fo! ~#fo~#fo;C͐XD!3E͐+?`is#r! ~#fo##~#fo|E!! ~#fo! ~#fo͐C! ~#fo##~#fo͐s#r! ~#fo~#fo͐s#r!!! ~#fo~#foC3E! ~#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͐ ! s#r͐͐ G͐͐ ! s#r͐|G͐͐͐͐͐!kG!9~#fozGøG͍͐͐͐͐͐F! ~#fo͐s#r8G! ~#fo͐s#rG! ~#fos#rF!9GàL!9DM! n&G|H! n&#H! n&5HuPÌOêP!9DM͐|LH,H"I͐+++|cH!/H"I! ~#fo##^#Vr+szʕH! ~#fo^#Vr+sn&"I!! ~#fo! ~#fo~#fo2H`is#r!H!"I! ~#fo##͐?+s#r! ~#fo! ~#fos#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! ^#Vr+s~#fos! ^#Vr+sÖK! n}1K! 6#6! ^#Vr+s~#fo! s#r͐n}ʖK͐|ʖK! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+sLK͐6! ! s#r! n}K! ^#Vr+s!K! ^#Vr+s6 òK͐! ^#Vr+sns{L! ^#Vr+sK! n}3L! ^#Vr+s!3L! ^#Vr+s6 LIL! ^#Vr+s`ins_L! ^#Vr+s`insiI͐6!9!9DM! n&AͯڜL! n&Zͯ!9DM! n&aͯL! n&zͯ!9DM! ^#Vr+szM͐n`is! ^#Vr+s͐ ns! ^#Vr+s`insL!9+M%M!9DM͐͐ {M͐^#Vr+s͐ hM͐0pM͐7s!&M͐ ͐͐ ͉͐(M`is͐ ͐͐ )͐(M`in&#&M!9M[F!9DM`iw#w͐~#fon&M}"N͐ ?͐^#Vr+snѯg`is#rM͐)N!9  )6!7**:Oz\Nq#TN7*|DM**ͬNڐN>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*u*+"*"*u#"uP , FNxg>GoyDQ$͐͐ ͉͐(M`is͐ ͐͐ )͐(M`in&#&M!9M[F!9DM`iw#w͐~#fon&M}"N͐ ?͐^#Vr+snѯg`is#rM͐)N!9  )6!7**:Oz\Nq#TN7*|DM**ͬNڐN>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*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#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:77!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;! >"G;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+|$ !  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##~#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 type `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͐MiI͐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&͎͈͐͐$.͈͐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͂͐͋͐! ͈͐͐͝$͈͐T͔͐++͐͑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͐ʹ! s2! -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*(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 )*+ø!9DM*(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*n}[͐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͐)*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͐"͐"#{,!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%ç/!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!&!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{(͐)!)͐+?`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+)!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-!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. >< /~+ 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& !\&!10î07* 1\!* 17:)~:,"s!"u*|*uʞ1*~#u1"*s*už1#"u*+"b1:woʯ12w&!o 1 . &7:O*o`͐͐͐ -! ~#fo͐s#rø-! ~#fo͐s#rÒ-! ~#fos#r@-!9!9DM! ^#Vr+szʾ.͐n`is! ^#Vr+s͐ ns! ^#Vr+s`insy.!9 7*|DM**/.><.~# x. >< /~+ 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& !\&/*********************************************************************/ /* */ /* 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 */ /* */ /*********************************************************************/ /************************************************/ /* */ /* small-c compiler */ /* rev. 1.1 */ /* by Ron Cain */ /* */ /************************************************/  /* 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 startloc 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 /* pointer 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 */ #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 */ #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 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; /* 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 */ output, /* 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; /* 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 */ n& 3! ^#Vr+s^3*ͩ3*?3!! s#r! ^#Vr+sz3!33 334!33  eof, /* set non-zero on final input eof */ input, /* iob # for input file */ outpucc1 c1.c -e 8000 cc1 c2.c -e 8000 cc1 c3.c -e 8000 cc1 c4.c -e 8000 cc1 c5.c -e 8000 cc1 c6.c -e 8000 cc1 c7.c -e 8000 cc1 c8.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  *0005*cc1 c6.c xsub c1 y $1.asm $1.c assemble $1 link $1 stdlib runtime )m ASSEMBLECOM!34567LINK COMb89:;<=>?@ABCDC DEF/EFGHIJC SUBKCC $$$clink c1 c2 c3 c4 c5 c6 c7 c8 c9.c c1 c2 c3 c4 c8 c9.c -s -r e00 )m ASSEMBLECOM!34567LINK COMb89:;<=>?@ABCDC DEF/EFGHIJC SUBKCC SUBLCL $$$STRLESTRCPSTRCA8STRPO_ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D ySTRLESTRCPSTRCA8STRPO_ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D ySTRLE7*!# 7**~# 7** ~# 57**+#~0 !`i %)$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 $TG}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$TL~\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{$T"$R$T!""!2! "$R $T!9N#F#^#V#~#fo$Q6 bkFw#¥6 $R$T}!!$R$T",<!!$R $T),<!!$R $T<'!!$R $T1+!9$ ,RQ!!az_~*>$T9k?ʊ~͚ځ#hÐʈ.> Š~.#Ð_?ʶ$$T0:ڶA[?7?$R !-18@CHNQ[tx{/* >>>>> 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 */ 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(); /* 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 declarations, */ /* 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 eof 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(','); /* separate bytes */ } } litptr=0; } /* */ /* Dump all static variables */ /* */ dumpglbs() { int j; dsect("@globals"); cptr=startglb; while(cptr=endglb) { error("global symnol table overflow"); return 0; } ptr=glbptr; glbptr+=symsiz; value=size; break; /* stack local varble */ case stkloc : sp=modstk(sp-size); value=sp; if (locptr>=endloc) { error("local symbol table overflow"); return 0; } ptr=locptr; locptr+=symsiz; break; /* arg stack */ case stkarg : value=argstk; argstk-=2; if (locptr>=endloc) { error("local symbol table overflow"); return 0; } ptr=locptr; locptr+=symsiz; break; } /* file in symbol table entry */ 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; }  /* a/* no subscript */ if (ident_typ==pointer) size=2; else if (typ == cint) size=2; else size=1; } /* add data element to symbol table */ switch(class_id) { /* global symbol */ case statik : if (glbptr>=endglb) { error("global symnol table overflow"); return 0; } ptr=glbptr; glbptr+=symsiz; value=size; break; /* stack local varble */ case stkloc : sp=modstk(sp-size); value=sp; if (locptr>=endloc) { error("local symbol table overflow"); return 0; } ptr=locptr; locptr+=symsiz; break; /* arg stack */ case stkarg : value=argstk; argstk-=2; if (locptr>=endloc) { error("local symbol table overflow"); return 0; } ptr=locptr; locptr+=symsiz; break; } /* file in symbol table entry */ strcpy(ptr+name,sname); ptr[ident]=ident_typ; ptr[ty #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; } 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 (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(); } 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 { 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; {  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 requires */ /* 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=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(); 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("(")) 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/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. */ jump(flab2=getlabel()); /* jump around the false code */ sprintlabel(flab1); /* print true label */ statement(); /* and do else clause */ sp=modstk(fsp); /* then clean up stack ptr */ locptr=flev; /* dellocate locals */ sprintlabel(flab2); /* print true label */ } /* */ /* "while" statement */ /* */ dowhile() { int que[wqsiz]; /* allocate local queue */ que[wqsym]=locptr; /* record local level */ que[wqsp]=sp; /* and stk ptr */ que[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(); /* delete queue entry */ } /* */ /* "Switch" statement */ /* */ /* written by Mike Bernson 1/81 */ /* */ doswitch() { int value[SWITCH_MAX]; /* value for case statemant */ int label[SWITCH_MAX]; /* value for each label */ int count,tenp; /* number of switches */ int end_label; /* label for default */ int label_switch; /* used for switch label */ int temp,val[2]; int que[wqsiz]; /* local que area */ count=0; /* number of case statements */ que[wqsym]=locptr; /* local vable 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 ")" */ delwhile(); /* not fould detele que entry */ return; /* and exit switch statemant */ } if (needobrace()) { delwhile(); return; } jump(label_switch=getlabel()); sp=sp+2; while(1) { if (amatch("case",4)) { if (const_exp(val) == 0 ) { error("Bad constant"); continue; } if (count>>> 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+lptr,")") == 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(); return ((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,"\""); 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; 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); } /* 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(line); nl(); } lptr=0; return; } } } zs,j; char c; j=zs=0; k=10000; if (number<0) { num if(ch() == 0) return 0; else return line[lptr++]; } kill() { lptr=0; line[0]=0; } inbyte() { while (!line[lptr]) { if (eof) return 0; inline(); preprocess(); } return gch(); } inchar() { if (!line[lptr]) inline(); if (eof) return 0; return (gch()); } inline() { int k; char *unit; while(1) { kill(); if (input==0)openin/* >>>>>> start of cc4 <<<<<<< */ #ifndef TRUE /* check to see if need include file */ #include #endif keepch(c) char c; { mline[mptr]=c; 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("marco table full"); } putmac(c) char c; { macq[macptr]=c; if(macptr < macmax) macptr++; return c; } findmac(sname) char *sname; { 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 postion; char *hex; hex="0123456789abcdef"; for(postion=16; postion >= 0; postion -=4) outbyte(hex[(value>>postion) & 0x0f]); outbyte('h'); } 0x0f]); outbyte('h'); }/* number of case statement in switch */ int label; /* label for switch t; } return 0; } blanks() { while(1) { while(ch()==0) { inline(); preprocess(); if (eof) break; } if(isspace(ch())) gch(); else return; } } outdec(number) int number; { char buff[10]; outstr(sdec(buff,number)); } sdec(string,number) char string[]; int number; { int k,zs,j; char c; j=zs=0; k=10000; if (number<0) { number=(-number); string[j++]='-'; } 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 /********************************************************/ /* */ /* expression handler */ /* */ /* table below show precedence of operator */ /* */ /********************************************************/ /* operator * routine * associativity */ /********************************************************/ /* | ++ -- - * & * heir10 * left to right */ /********************************************************/ /* * / % * heir9 * rigth to left */ /********************************************************/ /* + - * heir8 * left to right */ /********************************************************/ /* << >> * heir7 * left to right */ /********************************************************/ /* < <= > >= * heir6 * left to right */ /********************************************************/ /* == != * heir5 * left to rigth */ /********************************************************/ /* & * heir4 * left to rigth */ /********************************************************/ /* ^ * heir3 * left to right */ /********************************************************/ /* | * heir2 * left to right */ /********************************************************/ /* && * heir1e * left to right */ /********************************************************/ /* || * heir1d * left to right */ /********************************************************/ /* = -= += *= %= * heir1 * left to right */ /* /= &= ^= |= * * */ /********************************************************/ #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=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); 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("&&")) { 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) int 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 (match("&")) { 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("!=")) { push(); 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(); 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();  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(); rvalue(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[ident]==pointer) { uge(); continue; } if (cptr=lval2[0]) if (cptr[ident]==pointer) { uge(); /* >>>>>> 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(lval2,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 item 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) { 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 *ptr,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); rvalue(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 LOADED; } } 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,k); post_dec(lval); *status=TRUE; return LOADED; } else return k; } } k; } }  else return k;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 #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]; 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 subscript */ 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];  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 (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;  } } 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(); } } /* */ /* written 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 :  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 *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();  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; ptr=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 : if (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 variable : 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]) { /* ident =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;  /* 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 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 getmem(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(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 */  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); } /* */ /* 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; 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())) {  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; 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 '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,()) 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; 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 #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,@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\tequ\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(); call("@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 address 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; char  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 secondary 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() { 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"); nl(); 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 (!status) { 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(); } /* 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 number 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--; } 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 */ /* (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 registers! */ /* (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(lval) 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) 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() { ccall("@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"); } /* test 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 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() { ccall("@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"); } /* test/********************************************************/ /* */ /* 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 */ #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: 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,filename) == 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 */ /* "convert '^'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-$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 :  return; /* line feed ingore */ case LF : break; /* must be a viald cjaracter put in output buffer */ default: putbuff(current); }} } /********************************************************/ /* */ /* dooutput */ /* */ /* function: to write output record to disk */ /* put character count at offset 0 */ /* */ /* date written: dec 16, 1980 By Mike Bernson */ /* */ /********************************************************/ dooutput() { outbuff[(line-1)*128]=outoff-1; /* character count */ /* zero buffer till end */ while(outoff<128) putbuff(0); if (++line>148) error("Too many lines"); } /********************************************************/ /* */ /* done */ /* */ /* function: to write output buffer out */ /* 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; 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; } /********************************************************/ /* */ /* 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 */ } /********************************************************/ /* */ /* 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; /* set zero suppress */ putch(num); /* print character */ } number=number % place; place=place/10; } } place=place/10; } } 10; } } ; place=place/10; /* 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 */ } /********************************************************/ /* */ /* outdec */ /* */ /* function: to output number in dec from */ /* to console */ /* */ /* date wri#/********************************************************/ /* */ /* copyright March ,1981 By Mike Bernson */ /* */ /* program used to set and display time on QT */ /* s-100 clock calendar board */ /* */ /* command format: */ /* time [hh:mm:ss] [am,pm] [mm/dd/yy] [day] */ /* */ /********************************************************/ #define CONTROL 129 /* address of control port */ #define ADDRESS 129 /* address port on clock board */ #define DATA 130 /* data port for clock board */ #define HOLD 0x10 /* bit for hold line on clock */ #define READ 0x20 /* bit for read line on clock */ #define WRITE 0x10 /* bit for write line on clock */ #define TRUE 1 #define FALSE 0 main(argc,argv) int argc; char *argv[]; { char string[80],*check; int am; /* if no arg on command line display time */ if (argc==1) { puts("Current time is "); puts(time_display(string)); exit(); } am=-1; check=argv[2]; if (argc==3) { if (isalpha(check[0])) { if (check[0]=='A') am=0; if (check[0]=='P') am=1; if (am != -1 && (check[1] !='M' || check[2] != 0)) { puts("Bad command line must be "); puts(" (HH:MM [AM || PM]) [MM/DD/YY]"); exit(); } } } /* set time value from input */ if (time_set(argv[1],am)) exit(); puts("\nTime set to ");puts(time_display(string)); exit(); } /********************************************************/ /* */ /* time_display */ /* */ /* function: to build a string for current */ /* time in format hh:mm:ss [am,pm] */ /* */ /* */ /* input: string to put current time in */ /* */ /* return: pointer to input string */ /* */ /* date written: March 8, 1981 By Mike Bernson */ /* */ /********************************************************/ time_display(string) char *string; { char clock[6],*temp1; int temp,am; /* set hold on clock and read clock time */ outp(CONTROL,HOLD); temp=-1; while(++temp<6) { outp(DATA,temp | READ); clock[temp]=inp(DATA); } outp(CONTROL,0); am=-1; if ((clock[5] & 8) == 0) am=(clock[5] & 4)/4; clock[5] &= 3; /* convert time to printable string */ temp1=string; temp=6; while(--temp >= 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 "); 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 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 || 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 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))temp]=(*string++) & 0x0f; } clock[1]=clock[0]=0; if (*string !=0) { puts("Bad time format too many digits (HH:MM [AM || 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$/*-!---!---!---!---!---!---!---!---!---!-----------------------------*/ /* WordStar ruler line; use ^OV,^OF,^OT */ #define TRUE 1 #define FALSE 0 #define END "$" #define CLS 26 int right, close, wrong; char *skip; main() /* word puzzle game */ /* by Jim Woolley, FOG Disk Librarian, 12/82 */ /* an exercise in small-c */ { int puzzle[12], answer[50]; right=close=wrong=0; skip="\n\n\n\n\n\n"; inpuzzle(puzzle); inanswer(answer); game(puzzle,answer); result(); } inpuzzle(p) /* define word puzzles */ int p[]; /* char pointer array did not work */ { p[0]=" c c\n garage\n r r\n"; p[1]=" c\n o\n m\n i\n c\n"; p[2]=" 1234567\n Dracula\n"; p[3]=" drinks\n house\n"; p[4]=" oo y\n g db e\n"; p[5]=" ieieceiie\n"; p[6]=" CLAMS\n SHe\n"; p[7]=" t rn\n"; p[8]=" HAir____\n"; p[9]=" mirror\n mirror\n mirror\n mirror\n"; p[10]=" grnese\n grenes\n grseen\n grness\n"; p[11]=END; } inanswer(a) /* define answers */ int a[]; /* char pointer array did not work */ { a[0]="TWO";a[1]="CAR";a[2]="GARAGE";a[3]=END; a[4]="STAND";a[5]="UP";a[6]="COMIC";a[7]=END; a[8]="COUNT";a[9]="DRACULA";a[10]=END; a[11]="DRINKS";a[12]="ON";a[13]="THE";a[14]="HOUSE";a[15]=END; a[16]="WAVING";a[17]="GOODBYE";a[18]=END; a[19]="I";a[20]="BEFORE";a[21]="E";a[22]="EXCEPT";a[23]="AFTER";a[24]="C"; a[25]=END; a[26]="CLAMS";a[27]="ON";a[28]="THE";a[29]="HALF";a[30]="SHELL";a[31]=END; a[32]="NO";a[33]="U";a[34]="TURN";a[35]=END; a[36]="RECEDING";a[37]="HAIRLINE";a[38]=END; a[39]="FULL";a[40]="LENGTH";a[41]="MIRROR";a[42]=END; a[43]="MIXED";a[44]="GREENS";a[45]=END; } game(puzzle,answer) /* play the game */ int puzzle[], answer[]; { int i, ans, correct, cnt, j; char guess[128]; putch(CLS); puts(skip); puts("\nWord Puzzle, by Jim Woolley, 12/82\n\n"); puts("\nI will display word puzzles.\n"); puts("You guess what they are."); ans=0; for (i=0; test(puzzle[i]); i++) { header(); puts(puzzle[i]); puts("\n\nWhat do you think this is?\n"); gets(guess); convert(guess); cnt=0; correct=0; while (test(answer[ans])) { if (strpos(guess,answer[ans])) correct++; ans++; cnt++; } if (correct==cnt) { puts("\nVery good!"); right++; } else if (correct>0) { puts("\nGood try."); close++; } else { puts("\nWrong."); wrong++; } puts(" The answer is"); for (j=(ans-cnt); j0) { num=number/place+'0'; /* get current digit */ if (num != '0' || place ==1 || zero) { zero=1; /* set zero suppress */ putch(num); /* print character */ } number=number % place; place=place/10; } } =1; /* set zero suppress */ putch(num); /* print character */ } number=number % par *sp; { while (*sp != '\0') { *sp=toupper(*sp); sp++; } } result() { header(); puts("You had "); outdec(right); puts(" correct, "); outdec(close); puts(" close, and "); outdec(wrong); puts(" wrong. Thank you."); puts(skip); } /********************************************************/ /* */ /* 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; /* set zero suppress */ putch(num); /* print character */ } number=number % p%WORDPUZL.C is the source file for a word puzzle game found in the FOG games library. It was written primarily as an exercise in small-c, the C language compiler found in the FOG language library. CC SUBLCL SUBMFUNCTIONCRLNSTDLIB TXTOPQC1 C QRSTUVWXYZ[\C2 C b]^_`abcdefghiC3 C %jklmnC4 C *opqrstC5 C 7uvwxyz{C6 C |}~C7 C jC8 C 8C9 C SUBMIT C 4TIME C #WORDPUZLC !WORDPUZL$$$ This is the release date of the disk. C3 C jC4 C oC5 C uC6 C |C7 C 5C8 C C9 C SUBMIT C TIME C WORDPUZLC WORDPUZLDOC C1 .C EC A6 10368 81 C2 .C 1C 9B 12544 98 C3 .C 68 86 4736 37 C4 .C 9C D6 5376 42 C5 .C 9A 47 7040 55 C6 .C DE 36 3712 29 C7 .C 25 2E 13568 106 C8 .C C4 91 7168 56 C9 .C 48 55 3328 26 SUBMIT .C F2 B5 6656 52 TIME .C 05 7D 4480 35 WORDPUZL.C F0 CE 4224 33 WORDPUZL Fog Library Disk FOG-CPM.112 Copyright (1986) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. DISK 1 of 2. Small 'C' compiler. Filename Description -07-00 .86 This is the release date of the disk. -CPM112 .DOC This is the description of the disk contents. C1 .COM 3436 32K [Small 'C' 1 of 32] Mike Bernson version of a Small 'C' compiler. Written in BDS 'C' 1.41. Includes samples. ASSEMBLE.COM C262 21K [Small 'C' 2 of 32] LINK .COM FEE0 13K [Small 'C' 3 of 32] C .DEF AF19 6K [Small 'C' 4 of 32] C .SUB 7EC2 1K [Small 'C' 5 of 32] CC .SUB DED1 1K [Small 'C' 6 of 32] CL .SUB C192 1K [Small 'C' 7 of 32] FUNCTION.CRL A7F7 1K [Small 'C' 8 of 32] STDLIB .TXT 7CA2 3K [Small 'C' 9 of 32] C1 .C ECA6 11K [Small 'C' 10 of 32] C2 .C 1C9B 13K [Small 'C' 11 of 32] C3 .C 6886 5K [Small 'C' 12 of 32] C4 .C 9CD6 6K [Small 'C' 13 of 32] C5 .C 9A47 7K [Small 'C' 14 of 32] C6 .C DE36 4K [Small 'C' 15 of 32] C7 .C 252E 14K [Small 'C' 16 of 32] C8 .C C491 7K [Small 'C' 17 of 32] C9 .C 4855 4K [Small 'C' 18 of 32] SUBMIT .C F2B5 7K [Small 'C' 19 of 32] Sample file that allows nested submits. TIME .C 057D 5K [Small 'C' 20 of 32] Sample file to get and/or set the date. WORDPUZL.C F0CE 5K [Small 'C' 21 of 32] Sample game. WORDPUZL.DOC 54F6 1K [Small 'C' 22 of 32] D. FILE ("&diskf.cheklist.crc") DELE FILE &diskf.cheklist.crc ENDIF SELE B STOR diskf-fn-"."-ft TO malt STOR SUBST(ft,1,2) TO mdate SET ALTE TO &malt SET ALTE ON ? filedesc SET ALTE OFF SET ALTE TO SELE A STOR diskf-"-"-SUBST(dfile,5,3)-"&mdiskno"-".DOC" TO malt SET ALTE TO &malt SET ALTE ON DO WHILE diskno="&mdiskno".AND. .NOT. EOF() IF diskno="000" IF dfile="FOG-DOS" ? " & This is the release date of the disk. CLAS6 FON {4FLETTERS u[*CFONT EXE \)$fCONVPRF EXE `$fDELFONTSHP Pn $DOWNLOADEXE %t^'BDSKSPACEEXE h,l%EFONT EXE \,JFANCFONTPRO tou(FFCONFIGEXE ]e@ as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. New file compression/extraction programs. Conservation of disk space is of primary interest to all users, especially when archival copies of files and programs are involved. Crunch and Archive are capable of saving as much as 70% (especially for fixed length data files). Unfortunately, the designers of these programs cannot all agree on the compression technique. The result is some incompatibility between similar but different programs or even different versions of the same program. The major difference between CRunch and ARChive is two-fold. ARChive compresses files and collects them under a single filename (usually using the extension .ARK for CP/M files and .ARC for MS-DOS files) while CRunch only compresses individual files (and replaces the middle character of the extension with a "Z"). ARChive, both because it collects files together and because there are many utilities which ease selective extraction is preferred to CRunch. The problem is that we cannot yet easily (and quickly) create ARChive files on CP/M systems -- it must be done on an MS-DOS computer. PLEASE do not use CRunch on files which you will submit to the FOG disk library or the FOG publications. Only upload CRunched files to a remote system if you have gotten approval from the SysOp -- many do not allow CRunched files on their systems. Filename Description -01-19 .88 This is the release date of the disk. -CPM114 .DOC This is the description of the disk contents. UNARC .COM FF9D 5K ver. 1.6 [UnARChive utility 1 of 6] Restores files compacted with the MS-DOS ARChive utilities. Note that, like crunched files, not all versions use the same compression technique and can therefore be incompatible with each other. This version extracts all ARC and ARK files know at the time of the release of this disk. ASseMbler source (SLR or M80) is included in an ARC file. UNARC .DOC A3CE 31K ver. 1.6 [UnARChive utility 2 of 6] UNARC .MSG 895C 7K ver. 1.6 [UnARChive utility 3 of 6] UNARCA .COM FE6F 6K ver. 1.6 [UnARChive utility 4 of 6] UNARCOVL.ASM 8562 14K ver. 1.6 [UnARChive utility 5 of 6] UNARC16S.ARK AA6E 67K ver. 1.6 [UnARChive utility 6 of 6] READ .ME 2K [UNARC16S.ARK 1 of 2] UNARC .Z80 123K [UNARC16S.ARK 2 of 2] UNCR .COM 5D9D 7K ver. 2.4 [UnCRunch/Crunch 1 of 6] Uncompact files which have been compressed with CRUNCH (also on this disk). Files which have been compressed with this type of program have a "Z" as the middle letter of the file extension and are often confused with source code files which have not be compressed. Note that there are several variations of the crunch algorythm and that they are not always compatible with each other. CRUNCH .COM 9650 6K ver. 2.4 [UnCRunch/Crunch 2 of 6] Creates compressed files with a "Z" as the middle letter of the file extension. Companion to UNCR (also on this d'isk). USAGE24 .DOC 748F 7K ver. 2.4 [UnCRunch/Crunch 3 of 6] NOTES24 .DOC EF7B 9K ver. 2.4 [UnCRunch/Crunch 4 of 6] CRUN-OVL.ASM E363 8K ver. 2.4 [UnCRunch/Crunch 5 of 6] PATCH24 .DOC 869A 8K ver. 2.4 [UnCRunch/Crunch 6 of 6] not always compatible with each other. CRUNCH .COM 9650 6K ver. 2.4 [UnCRunch/Crunch 2 of 6] Creates compressed files with a "Z" as the middle letter of the file extension. Companion to UNCR (also on this d