IMD 1.18: 22/01/1996 7:48:40 micro cornucopia kaypro user group disk 36 small c library of 100 functions   åååååååååå  36-DISK DOCCC COM€ CC COMe !CC DEF;"#$%&'()CC DOCN*+,-./0123CRC COM456CRCKLISTCRC7D COM89:DELBR COMg;<=>?@ABCDEFGREADME TXTHSCLIB1 LBR€IJKLMNOPQRSTUVWXSCLIB1 LBR€YZ[\]^_`abcdefghSCLIB1 LBR8ijklmnoSCLIB2 LBR€pqrstuvwxyz{|}~SCLIB2 LBR€€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž�SCLIB2 LBR€�‘’“”•–—˜™š›œ�žŸåå ********* Welcome To Disk K36 -- Small C COMPILER & Library *********** Disk 36 contains a library of 105 C functions. Most of these are described in Jim Hendrix's "Small C Handbook". Fred Scacchitti designed the library to produce minimum size files by combining modules from Hendrix's library, a modified public domain library, and his own library. Many of the functions are written in assembly-language, and most are useable with any CP/M system. Two libraries -- SCLIB1.LBR AND SCLSCLIB2 LBR€ ¡¢£¤¥¦§¨©ª«¬­®¯SCLIB2 LBRo°±²³´µ¶·¸¹º»¼½UW C ¾¿WC C ÀÁååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååIB2.LBR -- contain all the C functions. They're squeezed into libraries so you'll need to extract them to another disk. To use the files in the library type -- DELBR [filename] If you don't know about C or C libraries, read Hendrix's "Small C Handbook". Happy C'ing. ************************************************************åå  Ã#eral enable/disable of the tran!9"!!"s(>€wÂ4"Í<2:g.ù!"!"!¥åÍŸ€Gú�þ Êiþ>ÊíÍŸú�þ Â|>Ãi>Å!¥å>Í ús#r# Éì<·ÊY+}2�@2*=ÃY+>2ê<ÃY+¯2ê<ÃY+>ÿ2ò<ÍÄ(¯2òþ À{=øÊ�þÒ�PGMNAMEÍúCåÍ'̓ÕÅ!Rå!PåÍ%ÑÑ|µÊC"ÁÑá>ÿ¸Ê�Ãiøþ ÊÉ!RÅw#ú> ÊCþ Â-6áMÉb Íúrw*F=+ÍqN·Ê1,Í4OÃßcrtl: Unable to open output file$åÅ!R Ê©#~þ.Š#~þC©¯2>!FåÍØÁáÉáÑÁÅÕåÍoŸgÉ*|·ÊÇåÍþÁ:_Í*!ùÃÁá·Êâ}2öí Íú Aborted  $!"s( #" å* LÑÍÃr|µÊ" * ë!}Ãþ !ôå!åÍ{pÁÁ" !€å!åÍ{pÁÁ" !€å!åÍ{pÁÁ" !"õ "ó "ç "ë "é "á "É "× "Õ " "y ! ë!}!"û "Ù *� "Å ! ë!"}!ÿÿ"ï "í Í£Í:ÍS3!ê å!åÍ{pÁÁ"ÿ*ÿúë!Íâr" * #" å*ÿúâ ÑÍÃr|µÊö * ë!}ÃÎ *ÿú" !"÷ !"ù Í®_ÍïÍj Íͽ_*ñ åÍþÁÁÉtoo many command argumentsSmall-C Version 2.10 10/7/84 (fas) *ë |µÂ ! å!åÍ>ÁÁ|µÊ� !åÍßÁà ! åÍÛ=Á|µÊµ !}2ú!åÍßÁ!}2úà !åÍßÁ|µÊÅ Ã ! åÍÛ=Á|µÊØ Íþ(à ! åÍÛ=Á|µÊë ̈́à !$ åÍÛ=Á|µÊþ ÍÏ6à Í[EÑ|·ú}þ Â! åÕÍEÑÑ|·úáÉÁ!ÿÿÉÁÑÕÅ"Í:þ Â? Í*&ÉÁÑáåÕÅ"ë"$"^#Vë"*~#¶Âž!å*åÍGÑÑ|µÊ‡!ÿÿÉ*s#r*"*^#Vr+s*#ë* s#r:*w&oÉÁáåÅå*|·ÊÚåÍÏÁÁÉá"ëÍ:æþ Âõ Í*&ÉÁáåÅå*|·ÊåÍ!ÁÁÉá~·Ê ^#åÍÃÉÁÑáåÕÅ~#·ÊCåOÅÕÍÏÑÁ|·Ê?ÁÉáÃ'!ÉÁÑá"ë"ÕåÅ*n&åÍâá*$"ëÍ*M> 2*ëåÕÅåyþáÊ–å*~áþÊÅÍõÍr"ñ·ÂÅ:=ÊÅ2*€"ëÍÁÑáÀÁÑá€Í*|µÂÞ!Ãá!ÿÿÉÑáåÕ}´ÊòëÍÉà !U å!5 ë!·gÍkrÍhr!U å!5 ë!ÈgÍkrÍhr!U å!5 ë!}hÍkrÍhr!U å!5 ë!ÅhÍkrÍhr!U  ë!žjÍkr!5  ë!QiÍkr!U  ë!ÀjÍkr!5  ë!.jÍkr!U ë!sjÍkr!5 ë! iÍkr!U ë!¯jÍkr!5 ë!ÃiÍkr!U å!5 ë!ëgÍkrÍhr!U å!5 ë!ügÍkrÍhr!U å!5 ë!]gÍkrÍhr!U å!5 ë!lgÍkrÍhr!U å!5 ë!}gÍkrÍhr!U å!5 ë!�gÍkrÍhr!U å!5 ë! gÍkrÍhrÉ!ìÿ9ù*ï ë!ÿÿÍŒr|µÊ©!ŸåÍ´;ÁÍ0!9ùÉÍ2?* Írë!"͆rå* Írë!<͆rÑÍqr|µÊe!9ë!Íkr!9ë!9ÍkrÑÕ!ͦr|µÊJ!9ë* #" >€¾ÊÂ!É6ßÿÉÁáåÅ!6€!ÉÁá"Ñë" åÕÅÍù"|µÈ$"*ë* s#r*å* åÍ£áá*n&åÍâá*~þrÊzþR£*ëÍ·ò“*åÍá!É*s#rÃú*~þwʱþWÂî*ëÍ*ëÍ·òÓ*åÍá!É*s#r*!>¶wÃú*åÍá!É*ÉÁá"åÅ|·.È!"*!~æÊ„!å*åÍÏáá*$"*^#Vë"*" *ë* z¼Ú`Âl{½Òl*6#"ÃL!å*åÍGÑÑ|·ò„!"*ëÍ·ò—!"*åÍá*ÉáÑÁÅÕåþ:ÂÀÖ@þ ÚÃÖ ÃÃ:& .Íß.Íß&.Í! 6É}·Êþ.ÊþÊþaÚûþ{ÒûÖ -ÃÍ2?Ãj Éexternstatic#asm#include#defineÅÅ!9ë!ÍkrÑÕ*Ç Í¦r|µÊÅ !Í(råÍÖeÁ!9ë! Íkr!ÍOr#|µÊ * ëáåå!Í(råÍY,ÁÁåÍO9Á!9åÁÑÕÅ!Í(rÍgrÁÑÕÅ!͆råÁÑÕÅ*Ç Í rÑÍqr|µÊ· Í™;à!,åÍ¥:ÁÃ\ Ã9 ÁÁÉÅ:ûÍrÍõr|µÊ !Í(r¯´úµÊ!yåÍr:Á!Í(rë!Í(rÍiqåÍO9ÁÍ™;Ãw!Í(r¯´úwµÊw!Í(råÍÖeÁ!9ë!Íkr!ÍOr#|µÊt!åÍO9Á!ÍOrë!Í™råÁÑÕÅ!͆rÑÍqr|µÊiÍ™;Ãt!,åÍ¥:ÁÃ.à ÁÉDS *ç |µÊ�!�åÍ´;ÁÉno closing bracketÅ!9ë!"Û "ý Íkr!"ñ !}2ù}2ø}2÷}2û}2ü}2ö!}2ú* " !Í[rë*ƒ ͦr|µÊþ!… ëáå)Í$r"Å!Í(rë! Í’r|µÊ+ !% å!åÍQ;ÁÁ!åÍØÁ!Í(r"ƒ !9ë!Íkr!ÍOr#|µÊs !… å!Í[r+Ñ)å!9T]Í+r##Íkr++Í+rÍhrÃ? !@ å!åÍ.;ÁÁ!h å!åÍQ;ÁÁ!ðå!åÍ{pÁÁ"} *} ì" ! å!åÍ{pÁÁ"ý*ý" !å!åÍ{pÁÁ"� ! å!åÍ{pÁÁ" !Lå!åÍ{pÁÁ" * ë!Íâr" *Ír}!Írë!"͆rå!Írë!>͆rÑÍqr|µÊ7!9ë!ÍkrÃG!Í[r+ë!Ír}Ãç!Í(rë!}!9ë!9ÍkrÃp!9ë* Íkr!Í(rå!ÀåÍ%ÁÁ"ï |µÂ–!ÿÿ"ï !ÂåÍ´;ÁÍ0!9ùÉnested include files not allowedropen failure on include file!Gå!åÍ>ÁÁ|µÊ!å!Í(råÍPÁÁÍw!!É!Lå!åÍ>ÁÁå!Í(rë!͆rÑÍqr|µÊC!å!Í(råÍPÁÁÍw!!É!ÉcharintÅÅÍ�)|µÊ]ÁÁÉ!ÆåÍÛ=Áå!ÉåÍÛ=ÁÑÍqr|µÊ�!9ë!Íkr!9ë!Íkræ!9ë!Íkr!9ë!Íkr!( å!åÍê,ÁÁ|µÂ»ͯ)!( åÍ *Á|µÊÐ!( åÍÊ)Á!ËåÍÛ=Á|µÊÝ!ÍåÍÛ=Á|µÊø!9ë!ÍkrÃ0!ÐåÍÛ=Áßþ.ÊþÊÃþ.Â}·Ê#|-ÃÉÁáåÅåÍ=Ñ}æþ Â<åÕÍ=ááÉÑáåÕ|·ÂLÍÑÑÉ"!~æÊ]!ÿÿÉ*$"^#Vë"*~#¶ÂÈ*(€ >wÂ�!å*åÍGÑÑ|µÊ±:þ ±!ÿÿÉ*s#r*"*^#Vr+s*#ë* s#r*~æþÂÿ*!~öw!ÿÿÉ~o&É*|·ÊåÍ$ÁÉÍo&æþÂ$!ÿÿþ Â2å ÍáÉÁáåÅå*|·ÊMë!PåÕÍ}ÁÁÁÉá"+V6+^6OåÕë Í*+^#6Ñás#r# Í*É33ÁÑáåÕÅ;;x·Â’åÍ3ÁÉ"ÕÑÕz³ÊÈåÅÍ$Á|·Ê½Ñ*ë|ºÂÈ}»ÂÈ!ÑÉ}áw#æþ –6Ñ*ÉÁÑáåÕÅz·Âý{þÂæåÍÆáÉþÂïÍÛÉþÂúåÍ$áÉà åÕÍ * Írë!-͆r|µÊû* ÍråÍŽ-ÁÃ×* ÍråÍK.Áå* Írë! Í™rÑÍr|µÊf* Írë!0Íâr"ý ÃûÃiÃ¥!}2÷Ãû!}2øÃû!}2ùÃû!}2ûÃû!}2üÃû!}2öÃû!å!åÍ.;ÁÁ!2å!åÍ.;ÁÁ!8å!åÍ.;ÁÁ!åÍØÁÃûÍçq%LiAsM}P‡I‘N›OÃ¥ÃãÁÉusage: cc [file]...[-a] [-i] [-l#] [-m] [-n] [-p] [-o] !ÿÿ"í * " *õ #"õ ë*ƒ ͦr|µÊÀ!… ë*õ )Í$r" * Írë!-͆r|µÊ|ÃF* å!àåÍ%ÁÁ"í |µÂ³!âå!åÍ.;ÁÁ* å!åÍQ;ÁÁ!åÍØÁ!"ó Í0ÉÃF*ó #"ó +|µÊÖ!"ë ÃÜ!"í Í0Éropen error: !U å!5 ë!§gÍkrÍhr  |µÊ0!9åÍìÍhrÑÕ!͆r|µÊ%!ÒåÍ´;Á!9ë!Íkr!Í(rë!͆r|µÊM!( åÍSaÁÄÑÕ!ÍŒr|µÊ„!9å! Í(rë!Írå!Í(rå!Í(råÍÌÁÁÁÍhr!( åÁáåÅå! Í(rå!Í(rå! å!Í(råÍÆ*ë! 9ùë!ïåÍÛ=Á|µÂÀÁÁÉÃRÁÁÉ(**)()[declaration type not allowed,ÅÅ*y |µÊ!{åÍ´;Á*3 |µÊ!‘åÍ´;Á*Ó ¯´ò#!§åÍ´;ÁÍ�)|µÊ.ÁÁÉ!ÃåÍÛ=Á|µÊI!9ë!ÍkrÃT!9ë!Íkr!( å!åÍê,ÁÁ|µÂiͯ)!9ë!Íkr!ÅåÍÛ=Á|µÊß!9åÍìÍhr|µÊÆ!9ë!Íkr!Í(rë!͆r|µÊÃ!9å!Í(rë!ÍrÍhrÃÜ!9ë!Íkr!9ë!ÍkrÃ&!ÇåÍÛ=Á|µÊú!9ë!ÍkrÃ&!Í(r!åÍ>ÁÁ|µÊ!åÍñÁÍw!Ã"!!+!å!åÍ>ÁÁ|µÊ<!åÍñÁÍw!Ã"!*Ó ¯´úv*ç ë!Í’r|µÊY*Ó "1 *á ë*Ó Íârå!åÍfÁÁ"á !ÿÿ"Ó !/!åÍÛ=Á|µÊ‰Í¥!Ã"!!1!å!åÍ>ÁÁ|µÊ§̓"!"ÿ Ã"!!4!å!åÍ>ÁÁ|µÊÅÍ_#!"ÿ Ã"!!:!å!åÍ>ÁÁ|µÊãͺ#!"ÿ Ã"!!=!å!åÍ>ÁÁ|µÊ Í.$! "ÿ Ã"!!A!å!åÍ>ÁÁ|µÊ Í %! "ÿ Ã"!!H!å!åÍ>ÁÁ|µÊ= ÍR&! "ÿ Ã"!!M!å!åÍ>ÁÁ|µÊ[ ÍÇ&! "ÿ Ã"!!U!å!åÍ>ÁÁ|µÊy Í '! "ÿ Ã"!ÍŽ'|µÊ„ Ã"!!Z!å!åÍ>ÁÁ|µÊ¥ ÍG(Íw!!"ÿ Ã"!!a!å!åÍ>ÁÁ|µÊÆ Ís(Íw!!"ÿ Ã"!!g!å!åÍ>ÁÁ|µÊç Í©(Íw!!"ÿ Ã"!!p!åÍÛ=Á|µÊý !"é Ã"!!r!ë!͆r|µÊ!( åÍÊ)ÁÃ/áåë!}áåë!}ÃT!( å!å!å!å! å!åÍÆ*ë! 9ùë!ÒåÍÛ=Á|µÂi!ÔåÍ´;ÁÍ6a*ÿ" !"ã !âåÍÛ=Á|µÂ!!( å!åÍê,ÁÁ|µÊÞ!( åÍ\*Á|µÊ¯!( åÍÊ)ÁÃÛ!( å!å!å*ã å! å!åÍÆ*ë! 9ùë*ã "ã Ãé!äåÍ´;ÁÍH)Í2?* å!úåÍÊ<ÁÁ|µÂ!üåÍÛ=Á|µÂ!þåÍ´;ÁÍ�)|µÊÃ!Ãx!"á *ã "å *ã |µÊƒ!å!åÍ>ÁÁ|µÊU!åÍ*ÁÍw!À! å!åÍ>ÁÁ|µÊu!åÍ*ÁÍw!À!åÍ´;ÁÃÃ-Íåë!ÍŒr|µÊ•Í!e*Ç |µÊ°*Ý åÍà-ÁÍ«;!åÍ, ÁÁÉillegal function or declaration(no open paren)illegal argument name),noùÉ(;;))!îÿ9ù!9ë*y Íkr!9ë*{ Íkr!9å!9ë*} ÍkrÍhr! 9å͇.Á*Å ë!Íârë!Íkr!N&åÍã)ÁÍ #!P&åÍã)Á!"{ !"y !9åÍÈ-ÍhråÍ[eÁÍå! 9Í$råÍ[eÁ!Í(råÍÐ-ÁÍòdÑÕ*} ÍÃr|µÊú%!åÍÖeÁ!9T]Í+r##Íkr++Í+råÍà-Á!,åÍ¥:Á!9T]Í+r##Íkr++Í+råÍO9ÁÍ™;ç%!åÍÖeÁ!åÍO9ÁÍ™;*{ |µÊ&*{ åÍ[eÁ! 9Í$råÍÐ-ÁÍ6/ÁáåÅ"} !Í(r"{ !Í(r"y !9ùÉ()*y |µÂb&!¨&åÍ´;Á*} ë* ÍÉr|µÊz&!¶&åÍ´;ÁÉ*} ##"} ++åÍÈ-ÍhråÍÐ-Á*} ##"} ++åÍp[Á!Å&åÍã)ÁÉnot in switchtoo many cases:*y |µÊâ&*{ |µÊß&!þ&åÍ´;ÁÃê&!'åÍ´;Á!'åÍã)ÁÍÈ-"{ åÍÐ-ÁÉmuë!͆råÁÑÕÅ!͆rÑÍr|µÊ&!9ë!Íkr*Ó ëÁáåÅ"Ó !( åÁáåÅå! Í(rå*á ë*Ó Íârå! å!åÍÆ*ë! 9ùëÃeÃ#!ÊåÍÛ=Á|µÂuÁÁÉÃ#ÁÁÉnot allowed in switchnot allowed with gotomust declare first in block*[(),Å!"Ç !Í(r|µÂé!9ë!ÿÿÍkr!9ë!Í(rÍkrÍ6a!ÛåÍÛ=Á|µÊo!ÝåÍÛ=Á|µÊV!Í(r|µÊK!Í(rå!Í(rå!9åÍãÁÁÁ!ßåÍÛ=Á|µÂHÃKÃ!áåÍã)ÁÃo!Í(rå!Í(rå!9åÍãÁÁÁ!Í(rë!ÿÿ͆rå!Í(rëÁáåÅ͆rÑÍr|µÊ´!å! 9ë!ÍkråÍ6^ÁÁ!9ë!Íkr!Í(råÍ, Á!Í(rå!Í(råÍÈ ÁÁ!Í(rÁÉÁ={,}Å!9åÍÐ]Á|µÊ[!Í(rë!͆rååÍÛ=Á|µÊ!Íþ(!"ÿ Ã"!Í #Íw!!"ÿ *ÿ Écharint{ifwhiledoforswitchcasedefaultgotoreturnbreakcontinue;#asm!–!åÍÛ=Á|µÂ�!!˜!åÍ´;ÁÕ!!"é É;no semicolonÅÅ!9ë*á Íkr!9ë* Íkr!"Ó *ç #"ç !v"åÍÛ=Á|µÂó!*ë |µÊí!!x"åÍ´;ÁÃó!Ãð!ÍåÃÊ!*ç +"ç ÁáåÅå!åÍfÁÁ"á áå" * ë* ÍÃr|µÊh"* åÍ*,Á" * Ír|µÂ_"* ë* ÍÃr|µÊ\"!Í[r+ë* #" +Ír}Ã5"Ãe"* " Ã"áå" !ÿÿ"Ó ÁÁÉ}no final }ÅÅ!9åÍÈ-ÍhrÁáåÅå!åÍ YÁÁÍå!#å!åÍ>ÁÁ|µÂ¿"ÁáåÅåÍÐ-ÁÁÁÉ!9åÍÈ-Íhr*ÿ ë!ÍŒrå*ÿ ë! ÍŒrÑÍr|µÊï"áååÍ[eÁÁáåÅåÍÐ-ÁÍåáååÍÐ commacharintwrong number of arguments!ùÿ9ù*ã |µÂ=!9ùÉ!¡åÍÛ=Áå!¤åÍÛ=ÁÑÍqr|µÊe!9ë!ÍkrÃp!9ë!Íkr!9å!( å!åÍê,ÁÁÍhr|µÂ�ͯ)!¦åÍÛ=Á|µÊš!¨åÍÛ=Á|µÊ§!«åÍÛ=Á|µÊöÍ-0ë!]ÍŒr|µÊÑÍ�)|µÊÎÃÑô!Í(rë!͆r|µÊë!­åÍ´;Á!9ë!Íkr!Í(r|µÊh!9å!( åÍ\*ÁÍhr|µÊ`ÑÕ!Í(r}áåë! Í(r}*å åÁáåÅå!åÍY,ÁÁÑÍâråÁáåÅå!å͵,ÁÁÁÃh!ÊåÍ´;Á*ã ë!Íâr"ã Í�)|µÊƒ!9ùÉ!ÚåÍÛ=Á|µÂ˜!ÜåÍ´;ÁÃ/!9ùÉ(**)()[declaration type not allowednot an argument,no comma*Ï ë!͆rë*ë Ír|µÊüÉ!&!åltiple defaultsnot in switch:*1 ¯´ú7'µÊ7'!f'åÍ´;ÁÃ='!"3 !( å!åÍê,ÁÁ|µÊZ'ÍÞ'åÍ[eÁÃb'!„'åÍ´;ÁÍw!Énot allowed with block-localsbad labelÅÍ2?!9ë* Íkr!( å!åÍê,ÁÁ|µÊØ'ÍÁ/ë!:͆r|µÊË'ÍÞ'åÍÐ-Á!ÁÉÑÕ* ÍâråÍß/Á!ÁÉÁ!( åÍ\*Á" |µÊ(* Ír|µÊ(!;(åÍ´;ÁÃ)(!( å!å!åÍÈ-å! å!åÍÆ*ë! 9ùë" * å!åÍY,ÁÁÉnot a labelÍ�)|µÂb(Í #!å!åÍfÁÁÃo(!å!åÍfÁÁÍ!eÉÅ!9å*Å åÍS/ÁÍhr|µÂ‹(ÁÉáåÍ+rå!åÍfÁÁáåÍ$råÍ[eÁÁÉÅ!9ë*Å Íkr!9åÁáåÅåÍS/ÁÍhr|µÂÍ(ÁÉáåÍ$r|µÊÝ(Ãà(õ(áåÍ+rå!åÍfÁÁáåÍ$råÍ[eÁÁÉ!! Í(rë!ÍŒrÑÍqr|µÊ!®åÍ´;Á!Í(rå!Í(rÍ+rå*Ç ë!Í(rÍârÑÍârÍhr!Í(rë!͆r|µÊXÍfì!9åÍp[Á|µÊ¬!Í(rë!͆r|µÊƒ!ÓåÍ´;Ááåå! Í(råÍ6^ÁÁ!Í(rå!Í(rÍ+rë!ÍârÍhrÁÉmust assign to char pointer or arraycannot assign to pointerÅ!AåÍÛ=Á|µÊÿ!ÁÉ!9åÍp[Á|µÂ!9ë!Íkrá寴ò4!CåÍ´;Á!9ëáåÍérÍkr!YåÍã)ÁáåÁÉÁ]negative size illegal]Å!"3 "1 !"Ç "ÿ ÍÈ-"Ý *ÿ" :øÍr|µÊ’* å!åÍQ;ÁÁ!( å!åÍê,ÁÁ|µÂ±!²åÍ´;ÁÍ0ÁÉ*Ù |µÊÇ*ß åÍÐ-Á!"Ù !9å!( åÍ *ÁÍhr|µÊ2áåÍrë!ÍŒr|µÊø!( åÍÊ)ÁÃ/áåÍr-ÁÁÁÉelse!øÿ9ù!9å!9åÍ9ÁÁ!9å!9åÍòGÁÁÁáåÅåÁáåÅåÍ$9ÁÁ*Ï ë!,ÍŒr|µÊN#ÃY#!åÍß/ÁÃ#!9ùÉ!øÿ9ù!9å͇.Á!9Í$råÍÐ-Á!9Í$rå!åÍ YÁÁÍå!9Í$råÍ[eÁ!9Í$råÍÐ-ÁÍ6/!9ùÉ!öÿ9ù!9å͇.Á!9åÍÈ-ÍhråÍÐ-ÁÍå!($åÍã)Á!9Í$råÍÐ-Á!9Í$rå!åÍ YÁÁáååÍ[eÁ!9Í$råÍÐ-ÁÍ6/Íw!! 9ùÉwhile!ôÿ9ù!9å͇.Á!9åÍÈ-Íhr!9åÍÈ-Íhr!%åÍã)Á!%åÍÛ=Á|µÂm$Í #Íw!ÁáåÅåÍÐ-Á!%åÍÛ=Á|µÂš$!9Í$rå!åÍ YÁÁÍw!áååÍ[eÁ!9Í$råÍÐ-Á!%åÍÛ=Á|µÂÈ$Í #! %åÍã)ÁÁáåÅåÍ[eÁáååÍÐ-ÁÍå!9Í$råÍ[eÁ!9Í$råÍÐ-ÁÍ6/! 9  "û ÍK0!<)åÍÛ=Á|µÊ)Ã2)*ë |µÊ")Ã2)* å*ñ åÍQ;ÁÁÃ)Í0!"û É#endasmÃH)Í-0åÍk.Á|µÊk)*Ï åÍk.Á|µÊh)ÍÁ/ÃU)É)*Ï åÍk.Á|µÂ‰)*Ï |µÂƒ)É)ÍÁ/Ãk)Í2?ÉÍ2?* å!­)åÍÊ<ÁÁå*Ï ë!͆rÑÍqrÉ;!»)åÍ´;ÁÍH)Éillegal symbol!Ó)åÍ´;ÁÉalready definedÁáåÅåÍÛ=Á|µÂù)!ú)åÍ´;ÁÉmissing token!*åÍ´;ÁÉmust be lvalueÁáåÅå*ÿúå!å*ÿúâ å!Èå!åÍ 8ë! 9ùë|µÊX** É!É* ë!Íâr" * ë*ÿÍÉr|µÊÂ** ë* ÍrÍâr" ÁáåÅå* å!åÍ=ÁÁÁ|µÊ«** ë!ÍârÉ* ë!Íârë!Íâr" Ãi*!É!Í(rë! ͆r|µÊ+! Í(råÍ *Á" |µÊï** É* |µÂ+!ñ+åÍ´;Á!*Ï |µÂ 3Ãt1Ã3Ãt1É#ifdef#ifndef#else#endif*Ë ë!ͦr|µÊR3* ë*Ë #"Ë ë!Ír}É;Å*û |µÊt3* " Ít1*ë |µÊq33ÁÉÀ3* " ÍK03ÁÉ!ÿÿ"Ë *Ï |µÊX6͉/|µÊ¯3! åÍ.3Á͉/|µÊ¬3ÍÁ/Þ3ÃU6*Ï ë!"͆r|µÊ64*Ï åÍ.3ÁÍÁ/*Ï ë!"ÍŒrå* ë!ÍârÍrë!\͆rå* ë!ÍârÍrë!\ÍŒrÑÍrÑÍqr|µÊ(4*Ï |µÂ4!ˆ6åÍ´;ÁÃ(4ÍÁ/åÍ.3ÁÃÉ3ÍÁ/!"åÍ.3ÁÃU6*Ï ë!'͆r|µÊ½4!'åÍ.3ÁÍÁ/*Ï ë!'ÍŒrå* ë!ÍârÍrë!\͆rå* ë!ÍârÍrë!\ÍŒrÑÍrÑÍqr|µÊ¯4*Ï |µÂ¤4!‘6åÍ´;Áï4ÍÁ/åÍ.3ÁÃP4ÍÁ/!'åÍ.3ÁÃU6*Ï ë!/͆rå*Ñ ë!*͆rÑÍr|µÊ05!åÍß/Á*Ï ë!*͆rå*Ñ ë!/͆rÑÍr|µÂ%Å ++å!Í(rå!Í[r+Ñ)Í$rÍhrÃí.ÁÉtoo many active loops*Å ë*� ÍÉr|µÊR/*Å ë!Íâr"Å ÉÁÑÕÅ*� ÍÐr|µÊn/!z/åÍ´;Á!ÉÁÑÕÅ!ÍârÉÉout of context!åÍÿpÁ* Írë! ͆r|µÊ§/!É* Írë! ͆r|µÊ½/!É!ÉÅ!9ë*Ï Íkr|µÊÚ/!åÍß/ÁáåÁÉÁÁáåÅ|µÊ÷/* ëÁáåÅ" Ãý/* " * Ír"Ñ "Ï |µÊ0* Ír"Ñ É* ë!}!åÍß/ÁÉ*Ï |µÂG0*ë |µÊA0!ÉÍS3Ã-0ÍÁ/ÉÅÅ*í ë!ÿÿ͆r|µÊ_0Í:*ë |µÊj0ÁÁÉ!9ë*ï Íkrë!ÿÿ͆r|µÊŒ0!9ë*í Íkr* å!å!Í(råÍß0ÁÁÁ|µÂÎ0áååÍþÁ*ï ë!ÿÿÍŒr|µÊÅ0!ÿÿ"ï ÃË0!ÿÿ"í ÃÙ0!åÍß/ÁÁÁÉÃM0ÁÁÉ;Å!9ë! Í(rÍkr!9å!Í(råÍ$ÁÑÁ!Í(rë* Íkr|µÂ9*ý" ÁÑÕÅ* ÍkrÉ* ë!}!Í(r" |µÊ<9ÉÁáåÅ|µÊN9ÁáåÅåÍÑjÁÉ!÷ÿ9ù!9ë!Íkr!9ë!'Íkr! Í(r¯´òŽ9! 9ë! Í(rÍérÍkr!-åÍ¥:Á!Í(rë!Í r|µÊ_:!9ë!Íkr!9ë! Í(rÍkrÑÕ!Í(rͽr|µÊç9!Í[r!9åÍ+rë! Í(rÍârÍhrù9!9å!Í(r0Ñ}!Írë!0ÍŒrå! Í(rë!͆rÑÍqrë!Í(rÍqr|µÊ=:!9ë!Íkr!ÍråÍ¥:Á! 9ëáåÍkr!9å! Í(rë! ͉qÍhrÃŽ9! 9ùÉÁáåÅåÍr:ÁÍ™;ÉÍ¢;ÁáåÅåÍ:ÁÉÁáåÅÍrë! Í r|µÊ¤:!Í[r+ÍråÍ¥:ÁÃ:É* |µÊÜ:* ë* ͆r|µÊÈ:!ó:åÍ´;Á!É* #" +ë!Ír}Ãì:!Írå*ñ åÍ ;ÁÁ!ÍrÉstaging buffeÉÃ=+* å*ÿúë!ÍârÑÍÉr|µÊ1+!,åÍ´;Á!åÍØÁ!Í(rÍ+r" * ë! Ír}* ë!Ír}* ëÁáåÅ}!Í(rå* å!å͵,ÁÁÁ* " " ! Í(rÍråÍk.Á|µÊ¹+* #" +å!Í[r+ÍrÑ}Ã�+!Í(rë! ͆r|µÊí+* å* ë* ÍârÑ}!Í(rë* #" Íkr* Églobal symbol table overflowlocal symbol table overflow!9å!Í(rÍgr!Í[r+Írë! Í r|µÊT,Ã;,ÁáåÅÉÅ!9å!Í(rå!ÍOrÑÍrÍhr!ÍOr#|µÊ°,!9åÁÑÕÅ!Írå! Í(rë!Í(rÍrë!ÿÍrÑÍqrÍhrÃs,áåÁÉÁ!ÍOr#|µÊé,!Í[r+ë!Í(r}!9å!Í(rë!ÍrÍhrõ,É;ÅÍ2?*Ï åÍõ-Á|µÂ-!35*Ï |µÊ5!åÍß/ÁÃ"5Ít1*ë |µÊ"5Ã%5Ãã4!åÍß/ÁÃU6*Ï åÍk.Á|µÊM6!9ë!Íkr*Ï åÍk.Áå!Í(rë!ͦrÑÍr|µÊ€5! å!Í[r+Ñë*Ï }ÍÁ/ÃH5! ë!Í(rë!}! å* å! å* Lå!då!åÍ 8ë! 9ùë|µÊ6!9å*  å!åÍY,ÁÁÍhr!9å* å!Í[r+ÑÍrÑ}|µÊÿ5!ÍråÍ.3ÁÃÕ5*Ï åÍk.Á|µÊ6ÍÁ/Ãÿ5ÃJ6!9ë!Íkr!9å! å!Í[r+ÑÍrÑ}|µÊJ6!ÍråÍ.3Áà 6ÃU6ÍÁ/åÍ.3ÁÆ3*Ë ë!Í r|µÊo6!Ÿ6åÍ´;Á!åÍ.3Á* " !åÍß/Á3ÁÉno quoteno apostropheline too long!¼6åÍ´;Á!"é Éno matching #if...Å! å!åÍê,ÁÁ|µÂê6ͯ)Í0ÁÉ!9ë!Íkr! å* å! }ë!Írë! ÍŒr|µÊ&1!ÍOr|µÊ&1!Ã)1!|µÊa1!Írë!ÿÿ͆r|µÊF1!3ÁÉ! Í[r+å!Írë!ÍrÑ}Ãï0! Í(rë!}áå3ÁÉ3ÁÍK0*ë |µÊ€1É!3åÍÛ=Á|µÊã1*Õ #"Õ *× |µÊŸ1Ãt1Í2?! å!åÍê,ÁÁ! å* å! å* Lå!då!åÍ 8ë! 9ùë|µÂà1*Õ "× Ãt1!3åÍÛ=Á|µÊF2*Õ #"Õ *× |µÊ2Ãt1Í2?! å!åÍê,ÁÁ! å* å! å* Lå!då!åÍ 8ë! 9ùë|µÊC2*Õ "× Ãt1!!3åÍÛ=Á|µÊŠ2*Õ |µÊ„2*× ë*Õ Í†r|µÊs2!"× Ã�2*× |µÂ�2*Õ "× Ã‡2Í­6Ãt1!'3åÍÛ=Á|µÊÄ2*Õ |µÊ¾2*× ë*Õ Í†r|µÊ´2!"× *Õ +"Õ ÃÁ2Í­6Ãt1*× |µÊÏ2Ãt1*ý |µÊ3*ý ë*ñ ͆r|µÊó2!;å*ñ åÍ ;ÁÁ* å*ý åÍQ;ÁÁr overflow!Írå!Í(råÍÏÁÁë!ÿÿ͆r|µÊ-;Íu;É!Í(rå!Í(råÍ!ÁÁë!ÿÿ͆r|µÊP;Íu;É!Í(rå!Í(råÍ.;ÁÁ! å!Í(råÍ ;ÁÁÉ!‹;å!åÍ!ÁÁ!åÍØÁÉoutput error ! åÍ¥:ÁÉ! åÍ¥:ÁÉ!:åÍ¥:ÁÉÅ*é |µÊ¿;ÁÉ!"é * å!åÍQ;ÁÁ!Í(rå!åÍW<ÁÁ:÷Ír|µÊú;!å!åÍÏÁÁ:ùÍr|µÊ9áååÍß/Á!ÁÉ!ÁÉÁÅÍ2?!9å* å! Í(rå! Í(råÍ=ÁÁÁÍhr|µÊV>áååÍß/Á*Ï åÍk.Á|µÊQ>Í-0Ã>>!ÁÉ!ÁÉÁÅÅ!"u Í2?!"w !Í(rÍrë! Í’r|µÊ¡>!9ë*w #"w +å!Í[r+ÍrÑ}Ãm>!9ë*w ë!}* å!9åÍÊ<ÁÁ"w |µÊ?* ë*w Írë!=ÍŒrå* ë*w Írå* ë*w ë!ÍârÍrÑÍŒrÑÍr|µÊáåÅÍ’rÉ!Í(rë!ëg͆r|µÊ(G!Í(rëÁáåÅÍrÉ!Í(rë!üg͆r|µÊIG!Í(rëÁáåÅÍrÉ!Í(rë!]g͆r|µÊhG!Í(rëÁáåÅÉ!Í(rë!lg͆r|µÊ‰G!Í(rëÁáåÅÍârÉ!Í(rë!}g͆r|µÊªG!Í(rëÁáåÅÍiqÉ!Í(rë!�g͆r|µÊËG!Í(rëÁáåÅ͉qÉ!Í(rë! g͆r|µÊíG!Í(rëÁáåÅ͉qëÉ!ÉÉ!ðÿ9ù!9åÍTHÁ|µÊH!9åÍÊXÁ!9Í$r|µÊAH!Í(rë!Íkr!Í(rå!9Í$rÍhrÃNH!Í(rë!Íkr!9ùÉ!èÿ9ù!9å!ëKå!Í(råÍÓAÁÁÍhr!/KåÍÛ=Á|µÊ�HÍUK!Í(rÍ$r|µÊ£H!Í(rÍ$råÍÝ[Á!1KåÍÛ=Á|µÊ¾H!9ë!§gÍkrÃÚI!4KåÍÛ=Á|µÊÙH!9ë!·gÍkrÃÚI!7KåÍÛ=Á|µÊôH!9ë!ÈgÍkrÃÚI!:KåÍÛ=Á|µÊ(råÍÊXÁ!Í(rÍ$r|µÊÌC!Í(rÍ$r|µÂ9C!Í(rëáåÍkr!Í(rë!]g͆r|µÊ�C*á "á ÁáåÅå!åÍ$9ÁÁ!Í(rÍ$rå! Í(rå! Í(råÍ7WÁÁÑÍråÍí[ÁÃÉC!Í(rÍ$rå! Í(rå! Í(råÍ7WÁÁÑÍråÍÝ[Á!Í(råÁáåÅåͶcÁÁÃOD!Í(råÁáåÅåͶcÁÁ!Í(rë!]g͆rå!Í(rë!lg͆rÑÍqr|µÊOD!Í(rå!Í(råÍ7WÁÁ|µÊDÍNg!Í(rå! Í(råÍ7WÁÁ|µÊODÍicÍNg!Í(rë!lg͆r|µÊODÍic!Í(r|µÊÛE!Í(rå! Í(rÍ$rå! Í(rÍ$rÑÍrÍhr|µÊáD!Í(rå! Í(rÍ$rå!Í(rå! Í(rÍ$råÍÞEÁÁÁÍhrÁáåÅå!åÍ$9ÁÁ!Í(r ë!ÍkrÃTE!Í(rÍ$rë!͆rå!Í(rÍ$!9ùëÉ>> <<!+Må! å!/Må!Í(råÍ Aë!9ùëÉ+ -!MMå! å!SMå!Í(råÍ Aë!9ùëÉ* / %ÅÅ!�PåÍÛ=Á|µÊ‘M!Í(råÍSMÁ|µÂ{MÍ*!ÁÁÉ!/hå!Í(råÍXÁÁ!ÁÁÉ!“PåÍÛ=Á|µÊÍM!Í(råÍSMÁ|µÂ·MÍ*!ÁÁÉ!Vhå!Í(råÍXÁÁ!ÁÁÉ!–PåÍÛ=Á|µÊN!Í(råÍSMÁ|µÊõM!Í(råÍÊXÁÍh!Í(rå!Í(rÍ$rÍîrÍhr!ÁÁÉ!˜PåÍÛ=Á|µÊiN!Í(råÍSMÁ|µÊCN!Í(råÍÊXÁÍÙg!Í(rå!Í(rÍ$rÍõrÍhr!ÁÁÉ!šPåÍÛ=Á|µÊ·N!Í(råÍSMÁ|µÊ‘N!Í(råÍÊXÁÍ h!Í(rå!Í(rÍ$rÍérÍhr!ÁÁÉ!œPåÍÛ=Á|µÊIO!Í(råÍSMÁ|µÊßN!Í(råÍÊXÁ!9å!Í(rÍ+rÍhr|µÊO!Í(rå?!ÁÁÉ!Í(rÍr|µÊ&?!Í[r*u #"u Ã,?!ÁÁÉÃg>ÁÁÉ*Ï |µÊL?͉/|µÊH?ÍÁ/ÃI?ÉÃ2?* ë* ͆r|µÊ\?ÉÍS3*ë |µÊj?Ãm?Ã2?ÉÃq?!øÿ9ù!9ë!Íkr!9å!Í(rå!Í(råÍÓAÁÁÍhr!Í(råÍ\>Á|µÊþ?*w åÍß/Á!Í(r|µÂÕ?!9ë!Íkr!9åÍÈ-Íhr!Í(rå!Í(rå!Í(rå!Í(råÍÂ@ë!9ùëù@!Í(r|µÊ«@!Í(rå!Í(rå!Í(rå!Í(råÍÂ@ë!9ùë!Í(råÍÝ[Á!9åÍÈ-ÍhråÍ[eÁÁáåÅåÍÐ-Á!Í(råÍÝ[ÁáååÍÐ-Á! Í(rå! Í(rå!Í(rå!Í(rë!ÍkrÍhrÍhrÍhr!ë!9ùëÉ!Í(rë!9ùëÉÃ�?!9ùÉ!Í(r|µÊÙ@ÁáåÅåÍÊXÁÃ÷@ÁáåÅÍ$r|µÊ÷@ÁáåÅÍ$råÍÝ[Á!Í(rå!I!9ë!]gÍkrÃÚI!=KåÍÛ=Á|µÊ*I!9ë!lgÍkrÃÚI!@KåÍÛ=Á|µÊEI!9ë!}gÍkrÃÚI!CKåÍÛ=Á|µÊ`I!9ë!�gÍkrÃÚI!FKåÍÛ=Á|µÊ{I!9ë! gÍkrÃÚI!IKåÍÛ=Á|µÊ–I!9ë!ëgÍkrÃÚI!MKåÍÛ=Á|µÊ±I!9ë!ügÍkrÃÚI!QKåÍÛ=Á|µÊÌI!9ë!ÍkrÃÚI!Í(rë!9ùëÉ!Í(r|µÂóIÍ*!ë!9ùëÉ!Í(rÍ$r|µÊVJ!Í(r|µÊJÍ™c!Í(råÍÊXÁ!Í(rå!Í(rå!THå! Í(rå!9åÍ,Bë! 9ùë!Í(r|µÊSJÍËdÃÆJ!Í(r|µÊ—J!Í(råÍÊXÁ!Í(rå!Í(rå!THå! Í(rå!9åÍ,Bë! 9ùëÃÆJ!9åÍTHÁ|µÊ®J!9åÍÊXÁ!Í(r å!9 Í$rÍhr!SKåÍÛ=Á|µÊK!9å!Í(rÍ$rÍhr!9ë!Í(rÍkrÍUK!Í(rrë!͆rÑÍr|µÊ4E!Í(rå!Eãé!Í(r ë!Í(rÍkrÃTE! Í(rå!@Eãé!Í(r ë! Í(rÍkr!Í(rë!lg͆r|µÊ¤E!Í(rÍ$rë!͆rå!Í(rÍ$rë!͆rÑÍr|µÊ¤EÍic!åÍÝ[ÁÍëg!Í(rë!lg͆rå!Í(rë!]g͆rÑÍqr|µÊÛE!Í(rå!Í(råÍjWÁÁÁÁÉ!Í(rë!§g͆r|µÊÿE!Í(rëÁáåÅÍqrÉ!Í(rë!·g͆r|µÊ F!Í(rëÁáåÅÍxrÉ!Í(rë!Èg͆r|µÊAF!Í(rëÁáåÅÍrÉ!Í(rë!}h͆r|µÊbF!Í(rëÁáåÅ͆rÉ!Í(rë!Åh͆r|µÊƒF!Í(rëÁáåÅÍŒrÉ!Í(rë!Qi͆r|µÊ¤F!Í(rëÁáåÅÍ™rÉ!Í(rë!.j͆r|µÊÅF!Í(rëÁáåÅÍ rÉ!Í(rë! i͆r|µÊæF!Í(rëÁáåÅͦrÉ!Í(rë!Ãi͆r|µÊG!Í(rëÁÁáåÅÍrÍhrÃ!O!Í(rë!Íkr!Í(rë!Íkr!Í(rë!Íkr!ÁÁÉ!žPåÍÛ=Á|µÊÙO!Í(råÍSMÁ|µÂtO! PåÍ´;Á!ÁÁÉ!9å!Í(rÍ+rÍhr!Í(råÁáåÅÍrÍhr!Í(rÍ$r|µÊ´O!ÁÁÉáååÍP]Á!Í(råÁáåÅÍrÍhr!ÁÁÉ!9å!Í(råͶPÁÍhr!°PåÍÛ=Á|µÊ9PÁáåÅ|µÂ PÍ*!ÁÁÉ!/hå!Í(råÍXÁÁ!Í(rÍ$rë!ÍråÍVhÁ!ÁÁÉ!³PåÍÛ=Á|µÊ†PÁáåÅ|µÂXPÍ*!ÁÁÉ!Vhå!Í(råÍXÁÁ!Í(rÍ$rë!ÍråÍ/hÁ!ÁÁÉÁáåÅÁÁÉÁÁÉ++--~!-*&illegal address++--!äÿ9ù!9å! Í(råͺSÁÍhr!9å! Í(rÍ+rÍhrÍ2?*Ï ë![͆rå*Ï ë!(͆rÑÍqr|µÊ;SÍ(rãå! AãéÁÉ!îÿ9ù!9å!Í(rå!Í(råÍÓAÁÁÍhr!Í(råÍ\>Á|µÂKA!Í(rë!9ùëÉ!Í(r|µÊaA!Í(råÍÊXÁ!Í(råÍ\>Á|µÊ¿A*w åÍß/Á*u ë!Í(r"u !5 ë*u )Í$rå!U ë*u )Í$rå!Í(rå!Í(rå!9åÍ,Bë! 9ùëÃÊA!ë!9ùëÉÃaA!9ùÉÅÅÅ!9å!9åÍ9ÁÁ!9å! Í(rå! Í(rãå!þAãéÁÍhr!Í(rÍ$r|µÊ#B!Í(rå!åÍ$9ÁÁáåÁÁÁÉÁÁÁÅÅ!9å!9åÍ9ÁÁ!Í(r ë!Íkr!Í(rë!Íkr!Í(rÍ$r|µÊáB! Í(rå!Í(råÍÓAÁÁ|µÊ“B!Í(råÍÊXÁ!Í(rÍ$r|µÂµB!Í(rë* Íkr!Í(rÍ$rå!Í(rå! Í(råÍ7WÁÁÑÍråÍí[ÁÃODÍ™c! Í(rå!Í(råÍÓAÁÁ|µÊC!ÍëÁáåÅÍkr!9ëáåÍkr!Í(råÍ¥XÁ!ë!9ùëÉ!9ù?|=^=&=+=-=*=/=%=>>=<<==?!øÿ9ù!9åÍÈ-Íhr!9åÍÈ-Íhr!Í(råÍueÁ!9å!9åÍòGÁÁ!Í(råÍ[eÁ!Í(råÍÐ-Á!ÚKå!åÍ>ÁÁ|µÂºK!ÜKåÍ´;Á!9å!9åÍòGÁÁ!Í(råÍÐ-Á!9ùÉ:colon expected!Lå!�hå!å!å!Lå! Í(råÍq?ë! 9ùëÉ||!:Lå!Õhå!å!å!=Lå! Í(råÍq?ë! 9ùëÉ&&![Lå!å!]Lå!Í(råÍ Aë!9ùëÉ|!{Lå!å!}Lå!Í(råÍ Aë!9ùëÉ^!›Lå!å!�Lå!Í(råÍ Aë!9ùëÉ&!»Lå!å!ÁLå!Í(råÍ Aë!9ùëÉ== !=!ßLå!å!éLå!Í(råÍ Aë!9ùëÉ<= >= < >!Må! å! Må!Í(råÍ Aë  !Í(r ë!Íkr!’SåÍÛ=Á|µÊ«R!Í(r|µÂGQ!”SåÍ´;ÁÍH)!¤SåÍã)Á!ë!9ùëÉ!Í(rÍrë!͆r|µÊjQ!Í(råÍÊXÁÃ’Q!Í(rÍrë!ÍŒr|µÊ’Q!¦SåÍ´;Á!9ë!Íkr!9å!9åÍ9ÁÁ!9ë!Íkr!å!å!THå! 9å!9åÍ,Bë! 9ùë!¶SåÍã)Á!9Í$r|µÊJRÁáåÅå!åÍ$9ÁÁ!9Í$r|µÊGR!Í(rÍrë!͆r|µÊ5R!9Í$rë!ÍråÍí[ÁÃDR!9Í$råÍí[ÁÍ]gÃhR!Í(rÍrë!͆r|µÊeRÍNgÍ]g!Í(rå! Í(rë!ÍkrÍhr!Í(rå!Í(rÍrÍhr!9ë!ÍkrÃ8S!¸SåÍÛ=Á|µÊ*S!Í(r|µÂÎR!åÍ;VÁÃS!Í(rÍrë!ÍŒr|µÊùR!Í(råÍÊXÁ!åÍ;VÁÃS!Í(råÍ(rå!9åͬeÁÁÁÃG[*Í ë!Qi͆r|µÊ<[!aiå!Í(rå!9åͬeÁÁÁÃG[!Í(råÍueÁÃU[!Í(råÍueÁÁáåÅåÁáåÅåÍ$9ÁÁ!9ùÉ(,)ÅÅÅ!9å!9åÍ9ÁÁ!9å! Í(råÍòGÁÁÁáåÅå!åÍ$9ÁÁ!Í(r|µÂ´[!Á[åÍ´;Á!Í(rÁÁÁÉÁÁÁmust be constant expressionÍycÁáåÅåÍO9ÁÍ™;É͉cÁáåÅåÍO9ÁÍ™;É!9å!Í(rÍgrÁÑÕÅ!Íkr!9T]Í+r##ÍkråÍ–\Á|µÊ6\ÍycÃ\ÁáåÅåÍd]Á|µÊJ\ÍycÃ\ÁáåÅåÍÐ]Á|µÊ\ÁÑÕÅ!Íârë!ÍkrÍyc*Ý åÍà-Á!+åÍ¥:ÁÃ\!ÉÁáåÅÍ+råÍO9ÁÍ™;!ÉÅÅ!9å!9ë!ÍkrÍhr!L]åÍÛ=Á|µÊ»\ÃÙ\!N]åÍÛ=Á|µÊÖ\!9ë!ÍkrÃÙ\ÃÜ\ë\*Ï åÍK.Á|µÂï\!ÁÁÉ*Ï åÍK.Á|µÊ ]!9åÍeÁÃWÍ.e*á ë!Í(rå!åÍfÁÁ"á ÁÁÁÉ),)CCARGC!Í(rÍ$rë!ÍŒr|µÊSW!ÉÁáåÅÍ$r|µÊfW!É!É!Í(rÍ$rë!ÍŒrå!Í(rÍ$rë!ÍŒrÑÍr|µÊ®W!Í(rë!ÍkrÃXÁáåÅÍ$r|µÊX!Í(rå!Í(rÍ+rÍhr!Í(rå!Í(rÍ$rÍhr!Í(rå!Í(rÍ$rÍhrÉÁáåÅÍ$r|µÊpXÁáåÅ Í$r|µÊ^XÍ™cÁáåÅåÍÊXÁ!Í(rå!Í(rÍ$rë!Írãå!PXãéÁÍËdÁáåÅåÍ¥XÁÉÍHcÁáåÅ ë!ÍkrÁáåÅåÍÊXÁ!Í(rå!Í(rÍ$rë!Írãå!šXãéÁÁáåÅåÍ¥XÁÉÁáåÅÍ$r|µÊÀXÁáåÅåÍþbÁÃÉXÁáåÅå͇bÁÉÁáåÅÍ+rë!ÍŒrå!Í(rÍ$rë!͆rÑÍr|µÊYÁáåÅåÍÔaÁà (aåÍr:ÁÁáåÅåÍO9ÁÍ™;Ãa!/aåÍe:ÁÉNOCCARGCMVI A,XRA A!( åÍ:ÁÍ«;:úÍr|µÊOaÍ«;Í™;É:úÍr|µÊua!ŠaåÍr:ÁÁáåÅåÍ:ÁÍ™;ÉaÁáåÅåÍ:ÁÍ«;!‘aåÍe:ÁÉEXTRN EXTRNÁáåÅÍ$rë!͆r|µÊ¸a!ÁaåÍeÁÃÀa!ËaåÍeÁÉCCGCHAR##CCGINT##Å!9å!Í(rÍ+rÍhráåÍrë!ÍŒråÁáåÅÍrë!͆rÑÍr|µÊ.b!FbåÍr:ÁáååÍ:ÁÍ™;!KbåÍeÁÃDb!SbåÍr:ÁáååÍ:ÁÍ™;ÁÉLDA CCSXT##LHLD ÁáåÅå!åÍY,ÁÁë*á ÍâråÍÝ[Á!€båÍe:ÁÉDAD SPÅ!9å!Í(rÍ+rÍhráåÍrë!ÍŒråÁáåÅÍrë!͆rÑÍr|µÊÓb!ëbåÍe:Á!óbåÍr:ÁÃÛb!øbåÍr:ÁáååÍ:ÁÍ™;ÁÉMOV A,LSTA SHLD ÁáÍ;VÁ!9å! Í(rå!"Í(rë!ÍkrÍhrÍhrÃ8S!Í(rë!9ùëÉÃQ!Í(r|µÂTS!Í(rë!9ùëÉ!Í(rÍrë!͆r|µÊS!Í(råÍP]Á!ë!9ùëÉ!Í(rë!9ùëÉ!9ù[can't subscript]can't subscript](ÅÅ!VåÍÛ=Á|µÊéS!9å!Í(råÍTHÁÍhr!VåÍã)ÁáåÁÁÉ!å!Í(rå!å͵,ÁÁÁ!( å!åÍê,ÁÁ|µÊõU!9å!( åÍ\*ÁÍhr|µÊâTÁáåÅÍr|µÂ:TÍV!ÁÁÉÁáåÅåÍYbÁ!Í(rëÁáåÅÍkr!Í(rå!Í(rÍrÍhrÁáåÅÍrë!͆r|µÊ©T!Í(rë!Íkr!Í(rå!Í(rÍrÍhrÁáåÅÍrë!͆r|µÊÜT!Í(rå!Í(rÍrÍhr!ÁÁÉ!ÁÁÉ!9å!( åÍ *ÁÍhr|µÊ¦UÁáåÅÍrë!å!Í(rë! ÍiqåÍ-0ë!0ÍârÑÍgrÃï\áå|µÊ6]!9ëÁáåÅÍérÍkr!Í(rëÁáåÅÍkr!ÁÁÉÁÁ+-ÍycÁáåÅåÍ:ÁÍ™;ÉÅ!9ë!Íkr!Î]åÍÛ=Á|µÂ‚]!ÁÉ*Ï ë!'ÍŒr|µÊ¹]!9åÁÑÕÅ!ÿÍrë!ÍiqåÍœ^ë!ÿÍrÑÍgrÂ]ÍÁ/!Í(rëáåÍkr!ÁÉÁ';! åÍÛ=Á|µÂã]!3É!Í(rë*Ç Íkr*Ï ë!"ÍŒr|µÊ^*Ï |µÂ ^Ã^Íœ^å!åÍ6^ÁÁÃð]ÍÁ/* ë*Ç #"Ç +ë!}!3É3*Ç ëÁáåÅë!Í r|µÊ[^!…^åÍ´;Á!åÍØÁ!Í(rå* ë*Ç å!Í(rå͵,ÁÁÁ*Ç ëÁáåÅ"Ç Éliteral queue overflowÅÅ*Ï ë!\ÍŒrå*Ñ ë!͆rÑÍqr|µÊÂ^ÍÁ/ÁÁÉÍÁ/*Ï ë!n͆r|µÊÝ^ÍÁ/! ÁÁÉ*Ï ë!t͆r|µÊõ^ÍÁ/! ÁÁÉ*Ï ë!b͆r|YÁáåÅåÍ—aÁÉ!ìÿ9ù!Í(r|µÊ#Y!j[åÍã)Á!9å!9åÍ9ÁÁ!9åÍTHÁ|µÊIY!9åÍÊXÁ!l[åÍÛ=Á|µÊhYÁáåÅåÁáåÅåÍ$9ÁÁÃkYÃnYÃ#Y!Í(r|µÊ�Y!n[åÍã)Á!9Í$r|µÊÄYÁáåÅå!åÍ$9ÁÁ!9Í$r|µÊ³Y!9ùÉ!Í(råÍ[eÁ!9ùÉ!9Í$r|µÊJ[!9 Í$r"Í *Í ë!}h͆rå*Í ë!žj͆rÑÍqr|µÊZ!�hå!Í(rå!9åͬeÁÁÁÃG[*Í ë!Åh͆rå*Í ë!¯j͆rÑÍqr|µÊNZ!Õhå!Í(rå!9åͬeÁÁÁÃG[*Í ë!Ãi͆r|µÊvZ!Óiå!Í(rå!9åͬeÁÁÁÃG[*Í ë!.j͆r|µÊžZ!>jå!Í(rå!9åͬeÁÁÁÃG[*Í ë!Àj͆r|µÊÄZ!9Í$rå!åÍ$9ÁÁÃG[*Í ë! i͆r|µÊìZ!iå!Í(rå!9åͬeÁÁÁÃG[*Í ë!sj͆r|µÊ[!„jå!åÅÍ$rë!͆r|µÊ'c!0cåÍe:Á!8cåÍe:ÁÃ/c!?cåÍeÁÉMOV A,LSTAX DCCPINT##!YcåÍe:Á!acåÍe:ÁÉMOV D,HMOV E,L!rcåÍe:ÁÉXCHG;;!‚cåÍr:ÁÉLXI H,!’cåÍr:ÁÉLXI D,!¯cåÍe:Á*á ë!Íâr"á ÉPUSH H!Í(r Í$r|µÊÍcÍËdÃÖcÁáåÅåÍ×cÁÉÅÅ!9ë!»dÍkráåÍr|µÊd!Í[r+å!Í[r+ÍrÑ}Ãäc!9ë* Íkr!ÍOrë!Í(rÍÉr|µÊ®dáåå!ÃdåÍÊ<ÁÁ|µÊ«d!ÍOr!9ë!Íkr!ÍOrÍråÍK.Á|µÊ«dáååÁáåÅÍrë!Í(rÍârÑ}ë!0ͦr|µÊ�dáååÁáåÅÍr Ñ}!9ë!Íkrèd!9ë!ÍkrÃHdÃd*á "á ÁÁÉ XCHG;; DAD SP!ÞdåÍe:Á*á "á ÉPOP D!ídåÍe:ÁÉXTHL!ûdåÍeÁÉCCSWIÍŒr|µÊ¦U!Í(rëÁáåÅÍkr!Í(rë!ÍkrÁáåÅÍrë!ÍŒr|µÊoUÁáåÅÍrë!͆r|µÊiU!Í(rå!Í(rÍrÍhr!ÁÁÉÁáåÅåÍP]Á!Í(rå!Í(rå!Í(rÍrÍhrÍhr!ÁÁÉ!9å!( å!å!å!å! å!åÍÆ*ë! 9ùëÍhr!Í(rëÁáåÅÍkr!Í(rë!Íkr!ÁÁÉ!Í(råÍý[Á|µÂVÍV!ÁÁÉÁÁ()!(VåÍ´;Á!åÍÝ[ÁÍH)Éinvalid expressionÅÅÅ!9ë!ÍkrÍ2?!Í(r|µÂZVÍ™c* å!*WåÍÊ<ÁÁ|µÂ»VÍ�)|µÊwVûV!9å!9åÍòGÁÁ!Í(r|µÂ”VÍädÍ™c!9å!Í(rÍgr!,WåÍÛ=Á|µÂ¸VûVÃZV!.WåÍã)Á!Í(rå!0WåÍÊ<ÁÁ|µÂîV!Í(rë!ÍråÍË`Á!Í(r|µÊ W!Í(rµÊ _ÍÁ/!ÁÁÉ*Ï ë!f͆r|µÊ%_ÍÁ/! ÁÁÉ!9ë!Íkr!9ë!Íkr!ÍOr#ë!Í’rå*Ï ë!0Í rÑÍrå*Ï ë!7Í™rÑÍr|µÊŽ_!9åÁÑÕÅ!ÍråÍÁ/Ñë!0ÍârÍhrÃ;_ÁÑÕÅ!͆r|µÊ£_ÍÁ/ÁÁÉáåÁÁÉÁÁÉî_ÍÈ-"ß *ß åÍ[eÁÉÅ*ÿú" * å*ÿúâ ÑÍÃr|µÊ.`* Írë!͆r|µÊ `* Írë!͆r|µÊ `!Ã`!|µÊ!`* åÍSaÁ* " ÃÈ_!9å!œ`åÍ *ÁÍhr|µÊ]`áåÍrë!͆r|µÊ]`!Ã``!|µÊ’`!¡`åÍSaÁ:üÍrë!͆r|µÊŠ`!§`åÍe:ÁÃ’`!·`åÍe:Á!Ç`åÍe:ÁÁÉMAINULINKZZZCCP:: DB 1ZZZCCP:: DB 0END!aå* å! å* Lå!då!åÍ 8ë! 9ùë|µÂaÁáåÅ|µÊa!  TCH##!eåÍr:ÁÁáåÅåÍ:ÁÍ™;ÉCALL !*eåÍe:ÁÉRETÍyc!ReåÍ:ÁÍ™;Íäd!VeåÍe:Á*á "á É$+5PCHL!peåÍr:ÁÁáåÅåÍà-ÁÍ™;ÉJMP !šeåÍe:Á!¢eåÍe:Á!¨eåÍr:ÁÁáåÅåÍà-ÁÍ™;ÉMOV A,HORA LJZ ÁáåÅÍ$rå!åÍ$9ÁÁ!Í(rå!Í(rãå!ÔeãéÁÉÁÑÕÅ!͆r|µÊðe!ùeåÍr:ÁÃøe!ýeåÍr:ÁÉDB DW ! fåÍe:ÁÉDW $+2Å!9å!Í(rë*á ÍârÍhráå|µÂ6f!Í(rÁÉá寴ú’fÑÕ!ͦr|µÊ’fÑÕ!Ír|µÊff!'gåÍe:Á!ÍOr#áå|µÊŠf!.gåÍe:Á!9åÁÑÕÅ!ÍârÍhrÃff!Í(rÁÉá寴òëfÑÕ!ùÿÍ’r|µÊëfÑÕ!Ír|µÊÂf!4gåÍe:Á!Í[r+áå|µÊãf!;gåÍe:Á!9åÁáåÅÍgrÃÂf!Í(rÁÉ!Í(r|µÊùfÍicáååÍÝ[Á DCX H CALL CCPINT##CALL CCDECI## DAD SP MOV D,H MOV E,L CALL CCGCHAR## INX H MOV A,L STAX DCALL CCINCC## DAD SP MOV D,H MOV E,L CALL CCGCHAR## DCX H MOV A,L STAX DCALL CCDECC## DAD D POP D CALL CCPINT##CALL CCDDPI## POP D CALL CCPINT##CALL CCPDPI##!%påÍe:Á!+påÍe:ÁÉPOP HPUSH H!CpåÍe:Á!IpåÍe:ÁÉPOP DPUSH D!kpåÍe:ÁÁáåÅå!bpãé!qpåÍe:ÁÉPOP BPUSH BÃ{p!9Í+rëÁáåÅÍiqå!å͘pÁÁÉØpÅ!9Í+rå!å>ÍÿpÁÑÍÃr|µÊöp!9Í+r|µÊØp*å!å! 9Í+rå>Í:qÁÁÁ!9ë*Íkr*ë!9Í+r"áåÁÉ!ÁÉÁÃÿp;ÁÁ|µÊkÍ2p!9å!Í(r(ÍgrÃ2kÍp!9å!Í(r ÍgrãmÁáåÅå!ÏmåÍÊ<ÁÁ|µÊ—kÁáåÅ å!ïmåÍÊ<ÁÁ|µÊ{k!2påÍPpÁ!9å!Í(r(ÍgrÔk!påÍPpÁ!9å!Í(r Ígrãm:öÍr|µÊ�mÁáåÅå!÷måÍÊ<ÁÁ|µÊÑk!nåÍe:Á!9å!Í(rÍgrÃŒmÁáåÅå!nåÍÊ<ÁÁ|µÊl!2nåÍe:Á!9å!Í(rÍgrÃŒmÁáåÅå!@nåÍÊ<ÁÁ|µÊ/l!XnåÍe:Á!9å!Í(rÍgrÃŒmÁáåÅå!fnåÍÊ<ÁÁ|µÊ^l!}nåÍe:Á!9å!Í(rÍgrÃŒmÁáåÅå!‹nåÍÊ<ÁÁ|µÊ�l!ÊnåÍe:Á!9å!Í(r?ÍgrÃŒmÁáåÅå!ØnåÍÊ<ÁÁ|µÊ¼l!oåÍe:Á!9å!Í(r?ÍgrÃŒmÁáåÅå!%oåÍÊ<ÁÁ|µÊël!goåÍe:Á!9å!Í(rBÍgrÃŒmÁáåÅå!uoåÍÊ<ÁÁ|µÊm!· /* ** Small-C Compiler Version 2.10 ** ** Copyright 1982 J. E. Hendrix ** ** Modified version by F.A.Scacchitti 10/7/84 ** ** Upgrades are in chronological order. For more information regarding ** differences between this version and the one described in J.E.H.'s ** Small-C Manual, refer to CC.DOC. ** ** 2.06 ** -modified error pause to terminate on Control X ** CC22.C error() ** -increased all values to conform to 2.1 ** CC.DEF ** -added autext function per J.E.H.'s 2.1 (37) ** CC3!BgåÍe:Á!IgåÍe:Á!Í(r|µÊgÍic!Í(rÁÉÁINX SPPOP BDCX SPPUSH BDAD SPSPHL!WgåÍe:ÁÉDAD H!fgåÍe:ÁÉDAD D!ugåÍeÁÉCCSUB##!†gåÍeÁÉCCMULT##!˜gåÍeÁÉCCDIV##Í�gÍicÉ!°gåÍeÁÉCCOR##!ÀgåÍeÁÉCCXOR##!ÑgåÍeÁÉCCAND##!âgåÍeÁÉCCLNEG##!ôgåÍeÁÉCCASR##!håÍeÁÉCCASL##!håÍeÁÉCCNEG##!'håÍeÁÉCCCOM##!PhåÍe:Á!ÍOrë!ͦr|µÊLhÃOhÃ/hÉINX H!whåÍe:Á!ÍOrë!ͦr|µÊshÃvhÃVhÉDCX H!†håÍeÁÉCCEQ##!²håÍe:Á!ºhåÍe:Á!ÀhåÍr:ÁÁáåÅåÍà-ÁÍ™;ÉMOV A,HORA LJNZ !ÎhåÍeÁÉCCNE##!úhåÍe:Á!iåÍe:Á!iåÍr:ÁÁáåÅåÍà-ÁÍ™;ÉMOV A,!9ë!ÍÃr|µÊ)q!9Í+r|µÊ$q!MåÍØÁ!3É!9ë!Íâr3É3Ã:q!9T]Í+r+Íkr#|µÊhq!9T]Í+r#Íkr+ë!9Í+r}Ã:qÉDM!yÒtq¯xGyO°È¯{_zW³ÈÃnqDMz¨õz·üÊqx·üÒq>õë)ÍÚqʶqÍâqú¶q}öo{‘_z˜Wñ=Ê¿qõßqñðÍÊqëÍÊqëÉz/W{/_Éx/Gy/OÉ{_zW³É{‘z˜ÉëáN#F#x±Êr~#»~#ÂéqºÂéq`iéëø||g}oÃrëø)ÃréÃr##9~oŸgÉÃ+r##9~#foÉ##9T]Ír+}É##9T]Ír#}ÉÁÑÅ}É##9T]Í+r+Ãkr##9T]Í+r#ÃkrÁÑÅ}|É}³o|²gÉ}«o|ªgÉ}£o|¢gÉͬrÈ+ÉͬrÀ+ÉëͬrØ+ÉͬrÈØ+ÉͬrÐ+ÉͬrØ+É|î€gz¹r{½!ÉÍ×rÐ+ÉÍ×rØ+ÉëÍ×rØ+ÉÍ×rÈØ+Éz¼ÂÞr{½!É{•ozœgÉÍîr#É|/g}/oÉ|µÂýr.É!oåÍe:Á!9å!Í(rBÍgrÃŒmÁáåÅå!ÅoåÍÊ<ÁÁ|µÊIm!âoåÍe:Á!9å!Í(rÍgrÃŒmÁáåÅå!ðoåÍÊ<ÁÁ|µÊxm!påÍe:Á!9å!Í(rÍgrÃŒm!Í[r+Írå*ñ åÍ ;ÁÁãm!Í[r+Írå*ñ åÍ ;ÁÁÃÑjÉ LXI H,0 DAD SP CALL CCGINT## XCHG;; LXI H,2 DAD SP CALL CCGINT## XCHG;; DAD SP CALL CCGINT##CALL CCDSGI## DAD D CALL CCGINT##CALL CCDDGI## DAD SP CALL CCGCHAR##CALL CCDSGC## DAD D CALL CCGCHAR##CALL CCDDGC## DAD SP MOV D,H MOV E,L CALL CCGINT## INX H CALL CCPINT##CALL CCINCI## DAD SP MOV D,H MOV E,L CALL CCGINT##2.C primary() ** CC4.C *ccptr, *symtab ** CC41.C trailer() ** 2.07 ** -cleaned up and revised CC11.C to eliminate all that garbage ** mods include : ** -set M80 to always true (no -c option) ** CC11.C ask() ** -added -i option to command line to initialize ** storage areas to zeroes only when desired ** CC1.C int iflag; ** CC11.C ask() ** -redid initialization to default to DS instead ** DB or DW to speed up compile time ** CC11.C dumpzero() ** -removed FULL_C, C80, SMALHORA LJZ !iåÍeÁÉCCLT##!AiåÍe:Á!GiåÍe:Á!MiåÍr:ÁÁáåÅåÍà-ÁÍ™;ÉXRA AORA HJP !ZiåÍeÁÉCCLE##!žiåÍe:Á!¦iåÍe:Á!¬iåÍe:Á!³iåÍe:Á!¹iåÍe:Á!¿iåÍr:ÁÁáåÅåÍà-ÁÍ™;ÉMOV A,HORA LJZ $+8XRA AORA HJP !ÌiåÍeÁÉCCGT##!jåÍe:Á!jåÍe:Á! jåÍr:ÁÁáåÅåÍà-ÁÍ™;!$jåÍe:Á!*jåÍr:ÁÁáåÅåÍà-ÁÍ™;ÉXRA AORA HJM ORA LJZ !7jåÍeÁÉCCGE##!cjåÍe:Á!ijåÍe:Á!ojåÍr:ÁÁáåÅåÍà-ÁÍ™;ÉXRA AORA HJM !|jåÍeÁÉCCULT##!™jåÍr:ÁÁáåÅåÍà-ÁÍ™;ÉJMP !§jåÍeÁÉCCULE##!¸jåÍeÁÉCCUGT##!ÉjåÍeÁÉCCUGE##ÁáåÅÍr|µÊ¦mÁáåÅå!§måÍÊ<ÁÁ|µÊ5kÁáåÅ å!ÇmåÍÊ<É|¢gÉͬrÈ+ÉͬrÀ+ÉëͬrØ+ÉͬrÈØ+ÉͬrÐ+ÉͬrØ+É|î€gz¹r{½!ÉÍ×rÐ+ÉÍ×rØ+ÉëÍ×rØ+ÉÍ×rÈØ+Éz¼ÂÞr{½!É{•ozœgÉÍîr#É|/g}/oÉ|µÂýr.É!  L_VM, PDS, #defines ** CC.DEF and everyplace else encountered ** -fixed minor bug in auto-external function causing erroneos ** defining of external nothings ** ** 2.08 ** -more cleanup of old garbage got rid of all unnecessary #def's ** including CMD_LINE and NEW_CMD_LN ** CC.DEF, CC11.C and all other places encountered ** -added ## suffixes to all CALL calls to eliminate the CALL ** externals from STDIO.H ** -upgraded peephole() to accomodate new ptr values ** CC41.C, CC42.C ** -remove Stay tuned folk for the following: ** ** >installed all fixes and pertinent upgrades per J.E.H.'s 2.1 ** (13, 14, 15, 16, 26, 27, 34, 36, 38, ) ** >added multi-dimensioned arrays ** >added arrays of pointers eg. *argv[], *num[i] ** >added multiple levels of indirection eg. **argv, ***ptr ** >added type longs ** >added floating point ** >added structures and unions ** >complete 'C' preprocessor external of compiler */ /* ** Macro Definitions */ /* ** compile options */ #define M80 compiler runstring to allow return to CP/M's ** CCP rather than return via warm boot ** CC1.C nbflg ** CC11.C ask() ** -added code generation for -n option ** CC4.C nbflg ** CC41.C trailer() ** -added static's to preprocessor to allow non-global definitions ** of static variables ** CC11.C parse() ** CC41.C trailer() ** -added or verified the following fixes to upgrade to J.E.H.'s 2.1 ** #1 - CC13.C, CC21.C ** #3 - CC12.C ** #7 - CC22.C ** #8 - CC12.C ** #9 - CC22.C ** #1 14 /* ** symbol table parameters */ #define NUMLOCS 25 #define STARTLOC symtab #define ENDLOC (symtab+(NUMLOCS*SYMAVG)) #define NUMGLBS 200 #define STARTGLB ENDLOC #define ENDGLB (ENDLOC+((NUMGLBS-1)*SYMMAX)) #define SYMTBSZ 3050 /* NUMLOCS*SYMAVG + NUMGLBS*SYMMAX */ /* ** System wide name size (for symbols) */ #define NAMESIZE 9 #define NAMEMAX 8 /* ** possible entries for "IDENT" */ #define LABEL 0 #define VARIABLE 1 #define ARRAY 2 #define POINTER 3 #dd all unnecessary external defines from CC1.C, CC2.C ** CC3.C and CC4.C (left in as comments) ** ** 2.09 ** -defined HASH ** -defined DYNAMIC ** -changed CCALLOC to calloc and upgraded to conform to J.E.H's 2.1 ** CC11.C ** -changed CCAVAIL to avail and upgraded to conform to J.E.H's 2.1 ** CC21.C ** -modified ifline() to properly nest #ifdef's per J.E.H's 2.1 ** CC22.C ** -modified trailer to autodeclare externals for both DYNAMIC and ** !DYNAMIC defines ** CC41.C ** -modified traile /* generate m80 compatable library calls */ #define PHASE2 /* 2nd and later compiles */ #define SEPARATE /* compile separately */ #define OPTIMIZE /* compile output optimizer */ #define NOCCARGC /* no calls to CCARGC */ #define HASH /* use hash search for macros */ #define DYNAMIC /* allocate memory dynamically */ /* #define POLL /* poll for operator interruptions */ #define COL /* terminate labels with a colon */ #define TAB 9 /* put out tabs of this value */ #define UPPER 0 - ** #11 - ** #16 - CC12.C ** #22 - C. A. L. L. ** #24 - CC33.C ** #25 - CC12.C ## #28 - CC41.C ** #30 - CC42.C ** #31 - CC21.C ** #35 - CC41.C ** #37 - CC.DEF, CC32.C, CC41.C ** #40 - CC12.C ** #41 - CC1.C, CC2.C, CC3.C, CC4.C ** ** -added the conditional operator {e1 ? e2 : e3 } ** CC31.C heir1(), ducond() ** -changed stdiol.h to stdio.h -CC1.C, CC2.C, CC3.C, CC4.C ** -problems occur when using the (*funct)() syntax. Consider ** this feature not installed. ** **efine FUNCTION 4 /* ** possible entries for "TYPE" ** low order 2 bits make type unique within length ** high order bits give length of object */ /* LABEL 0 */ #define CCHAR (1<<2) #define CINT (BPW<<2) /* ** possible entries for "CLASS" */ /* LABEL 0 */ #define STATIC 1 #define AUTOMATIC 2 #define EXTERNAL 3 #define AUTOEXT 4 /* ** "switch" table */ #ifdef PHASE2 #define SWSIZ (2*BPW) #define SWTABSZ (60*SWSIZ) #else /* PHASE2 */ #define SWr to link to ULINK (runtime module) if source ** contain a main() ** CC41.C ** -modified runtime module - refer to those modules for specifics ** CLIB.DOC ** -seperated modules into standard C functions and ** genrerated clib.rel ** -modified compiler runtime module to minimize size, eliminate ** redirected input and unnecessary routines ** CCRTL.MAC ** -added permission for *(funct)() syntax as arguments ** CC12.C declglb(), doargs() J.E.H.'s (3) ** ** 2.10 ** -added -n option to  /* force symbols to upper case */ #define LINK /* will use with linking loader */ /* ** machine dependent parameters */ #define BPW 2 /* bytes per word */ #define LBPW 1 /* log2(BPW) */ #define SBPC 1 /* stack bytes per character */ #define ERRCODE 7 /* op sys return code */ /* ** symbol table format */ #define IDENT 0 #define TYPE 1 #define CLASS 2 #define OFFSET 3 #define NAME 5 #define OFFSIZE (NAME-OFFSET) #define SYMAVG 10 #define SYMMAX   SIZ 4 #define SWTABSZ 100 #endif /* PHASE2 */ /* ** "while" statement queue */ #define WQTABSZ 30 #define WQSIZ 3 #define WQMAX (wq+WQTABSZ-WQSIZ) /* ** entry offsets in while queue */ #define WQSP 0 #define WQLOOP 1 #define WQEXIT 2 /* ** literal pool */ #define LITABSZ 800 #define LITMAX (LITABSZ-1) /* ** input line */ #define LINEMAX 127 #define LINESIZE 128 /* ** command line */ #define MAXARGS 32 /* maximum number of option arguments */ mendeä  thå  useò  purchaså hió manuaì foò á  morå  completå � treatmenô oæ Smalì C. Foò informatioî regardinç thå contentó anä structurå oæ thå Smalì � à librarù, refeò tï thå filå CLIB.DOC and Hendrix's Manual. Thió  compileò  waó originallù obtaineä froí Micrï Cornucopiá  iî � Decembeò 198³ aó versioî 2.03A®  Thå package¬  aó received¬  waó � puô togetheò bù Bilì Randlå anä seô uð foò uså witè  ASM.COM®  Iô � waó  upgradeä tï uså Microsoft'ó M80/L8° tï takå advantagå oæ thå � featureó  oæ  thianä returî  tï � CP/Í wheî pauseä duå tï error®  Thå compileò maù bå compileä witè � POLÌ  defineä tï allo÷ operatoò interruptioî anä abortinç  durinç � compilation®  However¬  É  personallù  felô thió woulä slo÷  dowî � compilå timå anä preferreä á simpleò aborô feature¬ wherå É coulä � aborô  iæ  thå  erroò encountereä woulä affecô thå  resô  oæ  thå � compilation. * - Global initialization option -i Thió  featurå decreaseó compilatioî time¬  especiallù wheî  largå � arrayó arå declareä globally®  /* ** output staging buffer size */ #define STAGESIZE 800 #define STAGELIMIT (STAGESIZE-1) /* ** macro (define) pool */ #ifdef HASH #define MACNBR 100 #define MACNSIZE 1100 /* 100*(NAMESIZE+2) */ #define MACNEND (macn+MACNSIZE) #define MACQSIZE 500 /* 100*5 */ #else /* HASH */ #define MACQSIZE 1100 #endif /* HASH */ #define MACMAX (MACQSIZE-1) /* ** statement types */ #define STIF 1 #define STWHILE 2 #define STRETURN 3 #define STBREAK 4 #define STCONT ó packagå anä subsequentlù iô  waó  cleaneä  up¬ � upgradeä  tï uså thå hasè searchinç functioî anä á dynamiã memorù � scheme®  Refeò  tï thå filå CC.DEÆ foò á  completå  chronologicaì � historù  oæ  changeó anä detailó regardinç moduleó  oò  functionó � changed®  Iô  ió  assumeä thå useò ió somewhaô familiaò witè  thå � M80/L8° software. Thió  compileò containó mosô oæ thå functionó anä improvementó oæ � J® E® Hendrix'ó Versioî 2.± compiler® Iî additioî tï hió upgradeó � thå followinç havå beeî instal Small - C Documentation Version 2.10 10/8/84 by F. A. Scacchitti 25 Glenview Lane Rochester, NY 14609 (716) 482 - 7159 Thió  documenô  ió intendeä tï supplemenô J®  E®  Hendrix'ó  "Thå � Smalì  Ã Handbook¢ anä wilì onlù discusó thå differenceó  betweeî � thió versioî oæ Smalì à anä thaô describeä iî thå Manual®  Iô  ió � recom Mosô versionó oæ thå compileò  (aô � leasô  thå  oneó I'vå seen)¬  bù default¬  initializå alì  globaì � variableó tï zerï bù generatinç eitheò D ° oò D× 0®  Arrayó  arå � initializeä viá D 0¬ 0¬ 0¬ 0¬ 0¬ 0¬ ® ® ® ® ® ® ® ® ® . Thió  addó significantlù tï compilå timå iæ thå useò haó declareä � largå  globaì  arrays®  Thå  compileò  no÷ issueó  á  DÓ  î  thuó � allocatinç î byteó oæ uninitializeä memory®  Iæ thå -é switcè  ió � used¬  memorù  wilì  bå  initializeä tï zeroeó aó  before®  Aó  á � furthuò  5 #define STASM 6 #define STEXPR 7 #define STDO 8 /* compile "do" logic */ #define STFOR 9 /* compile "for" logic */ #define STSWITCH 10 /* compile "switch/case/default" logic */ #define STCASE 11 #define STDEF 12 #define STGOTO 13 /* compile "goto" logic */ led: * - Abort via Control-X when the -p option is used * - Global initialization option -i * - No boot option -n * - static Type Specifiers for global declarations * - Conditional operator {expr1 ? expr2 : expr3} * - 4k file buffers for input, output and include files * - Special runtime package for compiler support ŠFEATURES and ENHANCEMENTS * - Abort via Control-X when the -p option is used Thió featurå allowó thå useò tï aborô thå compileò    examplå, thå Eratostheneó Primå Numbeò  Sievå  takeó  8° � secondó tï compilå wheî thå -é switcè ió useä buô onlù 1· secondó � iæ  iô isn't®  Aî additionaì 5µ secondó ió requireä witè eacè foò � assemblù anä linking. * - No boot option -n Thió  featurå allowó rapiä returî tï thå CP/Í prompô  oî  prograí � completioî  aô á cosô oæ 800è byteó oæ codå space®  Iô ió useä iî � conjunctioî witè thå runtimå packagå iî thå à librarù (CLIB.REL)® � Iæ  thå thå -î switcè ió useä anä thå prograí containó  á  mlù � noticeä  wheî  onå  startó tï compilå anä listenó  tï  thå  diskó � churn¬  churn¬ churn¬ churî anä then¬ churî somå more® Obviously¬ � wheî  churning¬  yoõ ain'ô compiling®  Onå waù tï eliminatå  thió � timå wastinç activitù ió tï increaså thå sizå oæ thå filå bufferó � sucè  thaô  largeò  portionó oæ sourcå anä  outpuô  codå  maù  bå � handled® Aî added¬ buô unproven¬ featurå ió lesó weaò anä teaò oî � thå disë drives. * - Special runtime package for compiler support Thå Runtimå Modulå useä witã anä i© iî takinç fulì advantagå oæ thió feature®  Thå � statiã typå specifieò implieó thaô thå variablå shoulä bå  memorù � resident¬ yeô knowî onlù tï thå modulå iô ió compileä in® Thió ió � accomplisheä  simplù  bù  generatinç  á singlå  coloî  foò  typeó � specifieä aó statiã anä thå originaì doublå coloî foò thoså  thaô � arå not. * - Conditional operator {expr1 ? expr2 : expr3} Thió  ió jusô anotheò enhancemenô tï brinç Smalì à closeò tï  Biç � C®  Thió  operatoò  ió describeä quitå thoroughl thå necessarù  codå  tï  causå � moduleó  iî  CLIB.REÌ  tï  automaticallù bå  linkeä  wheî  iô  ió � searched by L80. ŠUSING THE COMPILER Thå majoò differencå betweeî usinç thió compileò anä Hendrix'ó ió � thió compileò doeó noô creatå á defaulô outpuô file® Iæ nï outpuô � filå ió specified¬ thå outpuô wilì gï tï thå consolå wherå iô maù � bå stoppeä anä starteä viá Controì Ó anä Controì Q® Iæ thå outpuô � ió  suspendeä bù Controì S¬  Controì à maù bå useä tï  aborô  thå � compile®  Thå  compileò ió invain(© � function¬  D ZZZCCÐ ± wilì bå generateä bù thå compileò prioò tï � thå  ENÄ statement®  Iæ iô isn'ô specifieä thå compileò generateó � D  ZZZCCР 0®  Thå globaì variablå ZZZCCÐ determineó  wherå  thå � stacë shoulä bå placeä anä thå returî patè tï CP/M®  Iî short¬ iæ � thå -î optioî ió useä thå stacë ió placeä aô thå baså oæ thå  CCÐ � anä thå prograí returnó tï CP/Í viá á returî instruction®  Iæ thå � -î  optioî isn'ô specifieä thå stacë ió placeä aô thå baså oæ thå � BDOÓ anä returî ió performeäè thió compileò waó originallù writteî � iî à anä containeä assemblù languagå enhancements.(É thinë !© Thå � presenô  modulå CCRTL.MAà containó mosô oæ thå routineó  requireä � bù  thå  compileò anä ió structureä arounä thå 4ë  filå  buffers® � Limiteä  I/Ï  redirection¬  argv/argã handlinç anä speciaì  aborô � featureó arå included®  Thå resultanô sizå oæ thå compileò  afteò � linkinç  CCRTL.REL¬   CC1.REL¬  CC2.REL¬  CC3.REL¬  CC4.REL¬  anä � searchinç  CLIB.REÌ tï picë uð á fe÷ necessarù functioî ió ¼ 29ù iî  Kernigaî  ¦ � Ritchie'ó  "Thå  Ã Programminç Language¢ anä workó aó  specified® � Thå  useò  shoulä  trù thå exampleó iî  thieò  manual®  Thå  codå � generateä  bù thió operatoò ió almosô exactlù thå samå aó aî  if-� elså statement¬ howeveò iæ doeó leaä tï morå succincô anä eleganô � codå aô thå sourcå level. * - 4k file buffers for input, output and include files Anotheò  enhancemenô  whicè reduceó compilå time®  Mosô  Smalì  Ã � compileró uså 12¸ bytå filå bufferó foò filå I/O® Thió ió readiokeä bù runninç thå prograí  cc.coí � followeä bù thå desireä optionó (iî thå runstring)® Somå exampleó � follow: cc compile console input to console output cc test.c compile test.c direct output to console cc test.c -p -a -l2 compile test.c direct output and source to console pause on errors and sound bell cc test.c >test.mac compile test.c direct output and source to console pause on errors and sound bell cc test.c >tes viá á warí boot®  Refeò tï  CLIB.DOà � anä ULINK.MAà foò detailó regardinç operatioî oæ thió feature. * - static Type Specifiers for global declarations Globaì  variableó  arå morå rapidlù accesseä (botè  fetchinç  anä � storing©  anä requirå lesó codå tï accesó thaî  locaì  variables® � Refeò   tï  Chapteò  1¹  oæ  Hendrix'ó  manuaì  foò  á   completå � explanation®  Mosô Smalì à compileró makå alì globaì declarationó � public®  Thió  obviouslù  presentó á probleí (especiallù foò  thå �Švariableó K® � Smaller than most. Threå submiô fileó arå includeä witè thå source¬ CCM.SUB¬ CCR.SU � anä CCC.SUB® Theså fileó wilì producå m8° sourcå files(.mac)¬ l8° � sourcå  files(.rel© anä á finaì objecô file(.com)¬  respectively® � Thå  useò ió encourageä tï examinå and/oò modifù theså  fileó  tï � meeô hió oò heò owî particulaò needs. Onå  finaì  note¬  iî caså yoõ haven'ô haä  accesó  tï  Hendrix'ó � manual®  Iô ió noô necessarù tï specifù externaì functionó iî thå � source®  Thå  compileò  generateó   t.mac -p -a compile test.c direct output to the file test.mac pause on errors and sound bell cc test.c new.c >test.mac -l2 -i compile test.c and new.c direct output to test.mac display source on screen initialize global variables to zero cc test.c >test.mac -o -n -l1 compile test.c direct output to test.mac optimize for size over speed generate no boot flag th file - !× ~·ÊÍT #ÃÍM ÍM ¯2­ 2® 2¯ 2° É!× >2Õ åÍ3áþÂo:Õ ·Â�:¸ ·ÊÍ@ ***No CRC Files found***$>·Éæþ ʉþ ʉw#:Õ <2Õ þPÚ6:Õ ·Ê.6¯ÉÍ@ Can not parse string !× ~·Ê½ÍT #ñÍM !× ÊÕ> ¾ÊÐ6 #ÂÈ6^#6!× ~·ÊéÍT #ÃÝ!¯ 4ÍM ɾÀ#x¹ÈÃñå]Í #eÍ ¯wá~·Ê ÍT #Ã>2· Í@ - Ís ÒMÍ@ File not found !° 4à >2Ò ÍoÀ:µ G:² ¸Â„:´ G:³ ¸Â„Í@ *Match* ¯2¸ !­ 4¯ÉÍ@ <-- is, was --> :´ Í) > ÍT :µ Í) ÍM ¯2¸ !® 4¯<ÉÍÀ2´ ~#þ ÊëÍ@ Not a space between CRC values¯<ÉÍÀ2µ G¯É-CATALOG???  tï gro÷ untiì iô reacheó á higè leveì oæ  compatabilitù � witè à aó describeä bù Ë ¦ R®  Iî it'ó presenô form¬  iô ió quitå � competetivå  witè manù oæ thå CP/Í 8° compileró presentlù oî  thå � market. RROR++ ¯<É*² |æ€õ):¶ …oñÊ% |î g}î—o"² ÉõÍ2 ñæþ Ú; ÆÆ0ÃT ã~ÍT #~·ÂA ãÉ> ÍT > ÅÕåæ_ÕÍh ÑÍáÑÁÉ:± þFÀ{͇ɀͯ2h2|:· ·Ê² !\º  Í :\2Æ !º \ Í \ÍÃÚ !Æ \ Í \Í!º \ Í \Í<7È=懇‡‡‡Æ�o&åÇ  Í á] Í ¯2h2|2· ÉÍ ÀÍ À~æþ$#É~# x±Â ÉÑ Í:± þFÂ} *‚}æÂ= "€>õ͇ñÂ1 ]Í<Âu  ^ ÍÃu CANNOT CLOSE CRCFILE$]ÍÍ� ++ABORTED++$Ñ Í:Ò ·Ê~ ¯2± ÍM Í@ Quantity of file CRC that matched - :­ ̓ :® ·Ê ÍM Í@ Quantity of file CRC that did not insert source in output file as comments COMPILER OPTIONS (SWITCHES) -a sound alarm on errors -i initialize global variables to zero -l1 insert as comments in output file * -l2 display source on screen as compile progresses * -n set noboot flag -o optimize for size over speed -p pause on errors * only one of these may be specified ŠCOMPILING THE COMPILER Compilinç thå compileò ió nï differenô theî compilinç anù otheò ã � prÍ@ ++ Now searching for "-CATALOG" file++ !õ Í ÍÂ) Í.Â) !× Íå”>.¾Â”#Íô”Í͔͡”ÍÍ›Íø›ÍøÊtþK›ÍÍ›͸›*« ÍýÃ=:¸ ·Â=Í”Ã="« Í ÀÍ ʳþ À ª~#þ.ÀÍ ÊÈþ À ¿É~þ ÊÖþ À#~þ ÊÖþ ÊÖ¿ÉÍôÀÍøÈþ.À+¿ÉÍøÀ~#þ0Úþ:Ò¿Éþ0É~#þ!ÚþÒ¿ÉþAÉÍ.ÀOÍ.ÀGy°¿É~#þ0ÚMÖ0þ ÚKæÖþ ÚMþÒM¿É·É:m2± þFÂSÄCRCKLIST$$$›Íø›ÍøÊtþK›‰, ݈ õ*€ë*‚}“|šÚù!"‚ë*€{•zœÒë*~ëÍ]Í·ÂÊ€*‚"‚Ü ÖÍñÃî DISK FULL: CRCFILE$€Í!"‚ë*~ëñÃ#CRC.COM 5.0 6/18/82CRCKFILE???!9"‡ 1‡ ÍM Í@ CRC Ver 5.0 CTL-S pauses, CTL-C aborts :]þ ÂOÍ@ ++Searching for CRCKLIST file++ÍÊÇÍ@ Now searching for "CRCKFILE" file++ ! Í ÍÂ1‡ Í.Â) F!×  ÍñÂÍ¡Â]ÍñÂ͸Â!â ÍýÃÇÍ”ÃÇÃ0CRCKLIST???CRCKFILE???!9"‡ ‰ M à*,ë*.}“|šÚ‰!".ë*,{•zœÒ{**ëÍ Í·Âu€*.".ÃG*.",€Í!".ë**ë*,}´>È*.#".ɯ22)! ",". Í<ÂÙ ÇÍÃî NO FILECRC FILE$! × Í >.Í ¯Í@ Checking wi match - :® ̓ :¯ ·ÊJ ÍM Í@ Quantity of lines failed parse test - :¯ ̓ :° ·Ê~ ÍM Í@ Quantity of file(s) not found - :° ̓ *‡ ùÉdÍ”  Í” Æ0ÃT ÿ �Ò– €Wy³Ê© ö0ÍT 0zÉtiilogram®  Whaô ió differenô thaî normaì ió thå linkinç procedure® � Thå filå CCRTL.REÌ (à Compileò Ruî Timå Library© shoulä bå linkeä � firsô  tï ensurå thaô modulå satisfieó itó entrù pointó prioò  tï � searchinç CLIB.REL. Thå submiô filå CCCC.SU provideó aî examplå oæ propeò compiling¬ � assembling and linking of of this compiler. FUTURE OF THE COMPILER Needlesó  tï saù Smalì à haó comå á lonç waù sincå Roî Caiî firsô � presenteä  iô iî Maù oæ 1980®  Iô ió mù firí belieæ thaô iô  wilì � continuå*‚#"‚ɯ2i2}! "€!"‚]Í]Í<ÂS ;ÍÃî NO DIR SPACE: CRCFILE$1‡ >2Ò Ís Ò :· ·Ê~Í# ++FILE NOT FOUND++$:± þFÂ*‚}æÂ’"€>õ͇ñ†]Í<ÂÊ ³ÍÃÊ CANNOT CLOSE CRCFILE$ÃîCRCKLISTCRCSK FULL: CRCFILE$€ÍÍà å w# ÂþÑÍÉ!]ÍÍùÍ� DONE$!eÍ ÊS!]QÍ !eZÍ Í@ --> FILE: XXXXXXXX.XXX CRC = ÍoÊSÃ) \Í<‘Í@ ++OPEN FAILED++à !"² !"Ó *Ó |þÊÈ Í·Ê¹ÍþÊ) \Í·ÂÖ!€~2¶ #"Ó Í Ã�þÂî:³ Í) > ÍT :² Í) ¯ÉÍ@ ++FILE READ E   --> FILE: SCLIB1 .LBR CRC = 30 D7 --> FILE: SCLIB2 .LBR CRC = D5 F9 --> FILE: D .COM CRC = 66 48 --> FILE: CRC .COM CRC = B2 07 --> FILE: 36-DISK .DOC CRC = 70 88 --> FILE: DELBR .COM CRC = EF 3A --> FILE: CC .COM CRC = EE D0 --> FILE: CC .DEF CRC = 9D CA --> FILE: CC .DOC CRC = 4E CB --> FILE: UW .C CRC = D2 4A --> FILE: WC .C CRC = DC 5C^#Vë"; *; ˆ ͪ  å*; Áq#pÃ�Ãn*„ " É!‹ p+q*Š )ë*= ^#Vë"; !Œ 6> !Œ ¾Úi*Œ &ë*; >¦OÍK :Œ <2Œ ÂE:/ÒÖ *; ^#V*% ÍÔ DMÍf kÍK :ÒÖ *; NÍf ÍE*; ~þ€Ú»WÍK þÍE *; ~þ€ÚÓSÍK ÃÖÍEÉ Í= !— 6:!— ¾Ú':/Ò :Ò –Í= !:— ¾Ò‰Í= :— <2— Ââ* "• !"‘ >!• Í. Ò *• ë*&͵ ë"( *• ë*&͵ >Í µÊj*( #"( *DM*( ëÍV"( !"� ( � Í ÒúÍK!"� }2— :— <2— O:¹Úð*� ë*� å*‘ Á "“  “ Í Úâ>!— ¾ÒÓÀÍ= *“ DMÍ**• +"• *( ë*� "� Ø*� #"� Ã*&ëC 4Ø:Ò!4Ã:Ò!5É( Í µÖŸ! ¦ÒI3Í= ÿÍ: [Í= ÉÍt:\þÊa:\=_Í: :]þ Ât Å?]Í\ : Òƒ! 6?ÃŽÿ Í: 2  Å ]ÍQ  Å?\Í\ ÅÍ: DM, ÍQ !Ñ "= *3 ##)ë*= "; */ &#Íì "! *3 #"#  !! Íò "% >ÿ!1 Í. Ÿ2' É\Í: 2 : þÿÊ©: 懇‡‡‡Æ€o&"* ~þåÊ›*# +"# ** DMÍY Ò›** DMÍ  å*; Áq#p* " . å** #DM*; ëá -Âe**  å*; Ñw* #" )ë*= å*; ëás#r*; "; Í: 2 ÃÉ!S 6!"V * "n >!S ¾Òd*S &T ) ^#Vë"K O!l ^#Vë"M :S =2S M K Í Òa*K "G *ÃtÍò û!ô9å~#fo+ëás#r!Íd ʶ!ö9å~#fo##ëás#rë^#Vë^!-Í) ʶ!ö9^#Vë^#Vë#ë!ê9s#rÃj!ê9å~#fo#ëás#rë+!ê9^#Vë~·Ê³!ê9^#Vë^ëé!ê9^#Vë^Õ!ÚåÍñ ÑÑ!ë!ô9s#rðÍh †ÃYÃ!ô9^#V!Í8 Êë!ûå!ðåÍñ ÑÑ!åÍñ Ñ!3åÍñ Ñ!åÍ»Ñ!@åÍ Ñë!è9s#rz³Â!båÍñ Ñ!åÍ»Ñ!ö9^#Vë^#VÕ!Ö9åÍq,ÑÑ!‹å!Ö9åÍÜ,ÑÑ!Ô9åÍž Ñ! 9å!Ž9å!�9å!@å!Ü9åÍaë! 9ù!Î9s#r!ÿÿÍ) Ê„!Ô9å!�åÍñ ÑÑ!åÍ»Ñ!å!Ö9å͘ÑÑë!Ò9s#r!Ò9^#V!ÿÿÍ) ÊÀ!Ô9å!³åÍñ ÑÑ!åÍ»Ñ!ë!Ì9s#rÃß!Ì9å~#fo#ëás#rë+!Ì9^#V!Î9~#foÍc ÊÅ!¶å!Î9^#V!*( ÍÔ ë*‘ "‘ Í Ã3É*1 #"ž "  "¢ *5 "œ >œ Í# µÊR :œ ÒB *ž +"ž !œ Íò ë+s#rÃ( !¤ 6Í: "š *š ~2¥ *¢ #"˜ *˜ +"˜ >Í µÊ¶ :¥ 2¥ Ò’ *  +"  :¤ <2¤ O>¹Ò³ !¤ 6*š #"š *š ~2¥ Ãp ̓Í: ÆAOÍK �Í= *ž Ͱ�Í= * Í·›Í= * Ͱ�Í= *# Í·›Í= *  Ͱ¬Í= ÉÉ. æg æ”ÂS -ÂA É>ÿØ>É!  ~þ?Êl W æº>À#Â^ :·À /æÉ!:' ·Â—  ·Ê‘ #‹ É W ²Ê¢ #™ Éi`N#F�oˆgÉDM!>õ)ë—)ë�‘o|˜gÒÎ ñ=¼ ÉDM!>)ë)ëÒã =ÂÛ É^#Vë) Âì É^#Vë|·g}o ÂöM "I ë*K Íö )ë*= ^#Vë"O I G Í ÚÇ*G )ë*= N#F*O ëÍ? þÿÂJ*G #"G Ã(*I )ë*= ^#V*O DMÍ? þÿÂm*I +"I ÃJI G Í ÚÄ*G )ë*= ^#Vë"Q *I )ë*= å*G )ë*= ãN#Fáq#p*I )ë*= å*Q ëás#r*G #"G *I +"I ÃK I Í G M åÍ ÑÍ Ò!M G Í Ò:S <2S O!T å*G ëás#r*S &l ) å*M ëás#r*I "M Ã^I K Í ÒX:S <2S O!T å*K ëás#r*S &l ) å*I ëás#r*G "K ÃíûÉ!"„ "†  † Í Ò#*† #"† )ë*= å*„ #"„ )ë*= ãN#Fáq#p † Í Ÿõ*„ )ë*= å*† ) ë*= ^#VáN#FÍ? ÖÖŸÁH¡Ò *† #"† )ë*= ^#Vë";  *; ^#Vë"ˆ *„ )ë*=  Íá ë!Ž9åÍxÑÑë!Ð9s#r!ÿÿÍ) ÊG!Ì9^#V! Íá ë!Œ9å!ÄåÍñ ÑÑ!åÍ»Ñ!Ì9^#V! Íá ë!Œ9å!×åÍñ ÑÑ!å!Î9^#Vë))ë!Ž9Í8.Í^.!Ø9^#VÕÍ$!9ùÍ©.¤!êåÍñ Ñ!åÍ»Ñ!9å!Î9^#Vë)ë!9^#VëÍœ1Í#.€Íß0áÍK.!9Í8.Í©.ʶ!9Í8.Í#.@Í�1Ê!@ë!9s#r!9åÍ1.@ÍŠ.áåÍ8.Í /áÍK.Ã9!9Í8.ͽ1ë!9s#r!9åÍ1.áÍK.!9^#VÕ!ê9^#VÕ!Ö9^#VÕÍ�ÑÑÑë!9~#foÍ8 Êv!åÍñ Ñ!åÍ»Ñ!9^#VÕ!ê9^#VÕ!Ô9^#VÕÍŒ ÑÑÑë!9~#foÍ8 ʳ!8åÍñ Ñ!åÍ»ÑÃÍ!Ð9^#VÕÍŽÑÃÎ!_åÍñ Ñ!Ò9^#VÕÍŽÑÉIllegal Option: '%c' delbr v%s 1.1 6Ãÿ Hit Space: ÍKÃK : k Used: /k Not used: k ë*% ÍÔ DMÃf : remain on 1 !9" !Ñ ùÍJÍú> Í# µÊ->! Í. Ò*ͪÍe> Í# µÊ<Í×Í * ùÉv ÍK É ÍK  ÍK É!B r+s+p+qA ? Í Úp*A É*? É:]þ$ÂŽ Ål]ÍQ !]6 !E 6!C 6 :C Í Ú*C &l ~2D þU¼:E 2 :D þSÂÊ:E 2:D þFÂØ:E 2:D þVÂæ:E 2:D þPÂô:E 2 :D ÖNÆÿŸ2E ! É_{•ozœgÉO{‘oz˜gÉi`N#F‘o˜gÉo&•oœgÉ_{–_z#žWëÉà þÈÅOÍK ÁÃ= YÃáã -ÂS Éáã{-Â_ É!¨ s+p+q*¦ å« ͼ 2ª <2© :¨ !© ¾Ú—  ÍK !© 4Ã� !© 6:ª =!© ¾Ú» *© &« NÍK !© 4œ Éáã>õ3ÊÕ Íá Æ0õ3}´ÂÄ Z;ñÂ× {ÉÅ ¯)¹Úî ‘#Âæ ÁÉÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ  -Jun-84 AztecUsage: delbr filename(.LBR assumed) Strip all files from a "Novosielski" archive. Not enough memory. ALLOC returned NULL .lbrTrouble getting directory from %s Cannot open %s. Cannot create %s. Extracting: %-12s Error seeking this entry - aborting. Error reading this entry - aborting. Error writing this entry - aborting. Íò Öÿ!l å!49^#VÕÍ% ÑÑë!9s#rz³Âˆ!ÿÿÉ!å!9^#VÕÍn ÑÑ!9^#VÕÍÑë!9s#r!9^#VÕÍÑëÍ- ë!9~#fo))ë!9s#r!å!9^#VÕÍn ÑÑ!ë! 9s#r!ë! 9s#rÃ! ÍîÑÑÉÍò þÿ! 9N#F! ^#VÕ`i^#VáÍ� ÊÕ! ^!Íá Ê:!ÿÿÉ!ûÿå`iÑån&Íá ëás`i~#¶Â`ÅÍvÑ! ^#VÕ! ^#VÕ! ^ÕÍ�ÑÑÑë!9s#r!ÍI ʸ!9~#¶ÂŸ!â!å`iÑån&Í ëás!ÿÿÉ! ^#V`is#r!9~#foë! s#r`iå~#fo#ëás#rë+^!ÿÍá ÉÍò ! 9N#F! ^#VÕ`i^#VáÍ� Ê#!9^#V!ÿÍá åÅÍ$ÑÑÉ!9^#VÕ`iå~#fo#ëás#rë+Ñs!ÿÍá ÉÍò !ÿÿå! 9^#VÕÍ$ÑÑÉÍò !O3DM`iÈ3ëÍ� Ê„`i DMõÿåÍ…ÑÃdÉÍò þÿ! 9N#F!ë!9s#r`i~·Ê! ^!Íá ÊÉ!ÿÿåÅÍ$ÑÑë!9s#r! ^ÕÍŽÑë!9å~#foÍ ëás#r! ^!Íá Ê*Ì3å! ^ùÕ`iÍñ ëáùÁë|µÉz¬2Ç1ÍŽ ë:Ç1·úù }´Éͧ ë}´É}“Â3 |’ÊB !¯É}“ÂB |’Ê3 !}´Éë|ªú[ }“|š?>Îo&Ézæo&Éë|ªúu }“|š>Îo&É|æo&Éz2Ç1ÍŽ :Ç1·úù |µÉ|·ò™ /g}/o#z·ò§ /W{/_ç ÅDM!>2Æ1)ë)ëÒº #}‘o|˜gÒÒ :Æ1=2Æ1² Á}´É:Æ1=2Æ1² Á}´ÉÅDM!>)ë)ëÒñ =Âé Á}´É}/o|/g#}´É|µÊB Ã3 |²g}³o´Éë{æ_Ê: |´ò² |7g}o ´Éë{æ_Ê: )Â5 }´Éë}“o|šgµÉëáÅN#F#ë ëN#F#z¸Ú^ {¹Òb ##^#VëÁéëáÅBK^#Vz·úˆ #y¾Ê‚ ###Ãp #x¾Â} #~#foÁéë}“|š>?Îo&Éë}“|š>Îo&Éë{æ_Ê: |·g}o² ´É|ªg}«o´É~# x±ÂÇ ÉÑ!9ÅÕÈ1~#ÂÞ !ë ãéÁ|µÉ§ÉÍò ! 9å! 9^Vë^#VÕ!9^#VáÍ� Â`!9^#Vë^#VÕ!9^#VáÍ� Ê]!9^#V!9~#foÍž Â`!9^#Vë^#VÕ!9^#VáÍ� Â`ÃÓ!9^#Vë^#VÕ!9^#Vë##^#Vë))ë!9~#foÑÍ) ÊÔ!9^#Vë^#Vë##^#VÕ!9^#Vë##Ñå~#foëás#r!9^#Vë^#Vë^#VÕ!9^#VëÑs#rÃì!9^#Vë^#VÕ!9^#VëÑs#r!9^#Vë##^#Vë))ë!9~#foë!9~#foÍ) ÊT!9^#Vë##^#VÕ!9^#Vë##Ñå~#foëás#r!9^#Vë^#VÕ!9^#VëÑs#rÃh!9^#VÕ!9^#VëÑs#r!9^#Vë"Ò1É*ùÍ…ÍÃ{ÍÒ Í�ëÉÍÒ *È1DM*Ê1ëÍëo&ÉÍÒ Í­o&ÉÍÒ *È1ë*+++ë*Ê1DM*Ì1ëéÅ!9N#F#^#Vkb6#> 6 #=ÂØ>6#=Âáë þ: > æþAÚNþ[Ò9å~#fo#ëás#rë+! 9^#V!9~#foÍc ÊW ! 9^#V!49~#foÍc ÊW !9^#VÕÍÑÊ\!å!9^#VÕÍn ÑÑÃþ!ë!(9s#r!ë!*9s#rÆ!*9å~#fo#ëás#rë+!*9^#V!ÍI Êø!9^#VÕÍÑÍá ë!,9s#r!,9^#VÕÍÉ-Ñë!,9s#r!,9^#V! Í8 Êõ!,9^#VÕ!*9å~#fo#ëás#rë+ë!9ÑsÃu!.å!*9å~#fo#ëás#rë+ë!9Ñs!ë!*9s#rÃ4!*9å~#fo#ëás#rë+!*9^#V!ÍI ʦ!9^#VÕÍÑÍá ë!,9s#r!,9^#VÕÍÉ-Ñë!,9s#r!,9^#V! Í8 Ê£!,9^#VÕ!*9å~#fo#ëás#rë+ë!9ÑsÃ#!å!*9^#V!9Ñs!9åÍž Ñ!9ë!&9s#rÃá!&9å~#fo#ëás#rë+!&9^#Vë~·Ê; !&9^#Vë^!;Í) Â#VëÑs#r! ^#Vë"Ì3!ë! s!9^#VëÉÍò þÿ! 9N#F! ^!Íá Ê™! ^#VÕ`i^#VáÍ= ë!9s#r!9^#VÕ! ^#VÕ! ^ÕÍŒ ÑÑÑÿÿÍ) Ê™!å`iÑån&Í ëás!ÿÿÉ! 9^#V!ÿÿÍ) ÊÒ!ûÿå`iÑån&Íá ëás!ë`is#r! s#r!É`i~#¶ÂãÅÍvÑ! ^#V!Í) Ê!å!9å! ^ÕÍŒ ÑÑÑÿÿÍ) €! 9^#VëÉ! ^#V`is#r! ^#VÕ! ^#Váë! s#r!å`iÑån&Í ëás! 9^#VÕ`iå~#fo#ëás#rë+Ñs!ÿÍá ÉÍò þÿ! 9N#F! ^#V!Í) Ê¡`ië! s#rÉ*Ì3|µÊÁ*Ì3ë!9s#r*Ì3^#Vë"Ì3Ãè! ^#VÕÍ^Ñë!9s#rz³Âè!ë! s#rÃ’!å`iÑån&Í ëás!#VÕ! åÍ%&ÑÑÑÉÍò !Z3å! 9^#VÕ͸ÑÑÉÍò þÿ!O3DM`i~·ÊS `i DMÈ3ëÍ� ÊP !ÉÃ/ ! 9^#Vë#^!+Í) ë!9s#r! 9^#Vë^ëÃV!9~#¶ÊŒ !Ã� !å! 9^#VÕ͘ÑÑë! s!ÿÿÍ) ʰ !ÉÃi!9~#¶Êà !ÃÆ !Í å! 9^#VÕ͘ÑÑë! s!ÿÿÍ) Êí !ÉÃi!9~#¶Ê!Ã!Í å! 9^#VÕ͘ÑÑë! s!ÿÿÍ) Ê*!É!åÍ1.Í^.! ^ÕÍ$ë!9ùÃi!úÿ"E3!ÉÍh r| w³ að L!ë! s! ^ë)))ä3^#V!”Í) Ê“!Ö!ë! s#r!ë`is#r! s#r! s#r`iÉÍò !9N#F!PYÍá DM`i Í) Ê÷! 9^#VÕ! åÍîÑÑÿÿÍ) Ê÷!ÿÿÉ! 9^#VÕÅÖ@ÃþaÚNþ{ÒNÖ`w# þ.Ê/·ÊHÊÍUw#Ã{…o|Îg ·ÊHÍUw#Â9!¯ÁÉ!ÿÿ|·ÁÉþaØþ{ÐÖ É!9^#V*Ô1ë!þ9}“|šÚ€*Ô1ë"Ô1ë|µÉ!¯ÉÍò þþ!dåÍ^Ñ"Ö1|µÂ¢! åÍ»Ñ!å!�å!ˆ9åÍß-ÑÑÑ!å:€o&Íá ë!†9Ñs!ºå*Ö1Ñs#r!„9ë!9s#r!|µÊ¤Ãþ!9å~#fo#ëás#r!9^#Vë^! Í) Â&!9^#Vë^! Í) Ê)Ãï!9^#Vë~·Ê¤!9DM!9^#Vë~·Ê‘!9^#Vë^! Í8 Ê‘!9^#Vë^! Í8 Ê‘!9å~#fo#ëás#rë+^Õ`i#DM+ÑsÃ<!ë`is!9åÍûÑÃä*Ö1å*Ø1åÍÑÑ!åÍ»ÑÉÍò ÍZ!9~#¶ÊÕ!ÙåÍã%ÑÍ{ÉA:$$$.SUBÍò !ýÿ"E3!ÿÿÉÍò !ÉÍò * !&9^#Vë^!*Í) Â* !&9^#Vë^! Íc Ê8 !.å!(9^#VëÑsÃÐ!9å! 9^#V! Íá ë!89~#foåÍq,ÑÑ!9å!9^#VÕÍÑͪ1áÍK.!9å!9^#VÕÍÑëÍ- ͪ1ÍŠ.áåÍ8.Í5/áÍK.!9åÍ1.€ÍŠ.áåÍ8.Íß0áÍK.! 9^#Vë))ë!89~#foå!9Í8.áÍK.!9^#VÕÍÑë!9s#r!9^#VÕÍÑëÍ- ë!9å~#foÍ ëás#r!9^#VÕ! 9^#Vë)ë!<9~#foÑs#r!å!9^#VÕÍn ÑÑ! 9å~#fo#ëás#rë+Ãþ!9^#VÕÍ…Ñ! 9^#VëÉrÍò ! 9å~#fo+ëás#rë#ëÍd Ê� !9^#VÕÍÑÃs ÉÍò õ !9å~#fo#ëás#r!9^#Vë~·Êà !9^#Vë^Õͳ-Ñå! 9^#VëÑsæ É|¢g}£o´É|/g}/o´ÉéáÅ^#V#DM!9ë99^#V! s#rÉÍò øÿ!9^#Vë###ëͪ #ë!9s#r*Ò1ë!9s#rz³ÂT!Î1ë!9s#rë"Ò1"Î1!"Ð1!9^#Vë^#V! 9s#rÉ! 9^#V!9s#r! 9^#Vë^#V! 9s#r! 9^#Vë##^#V!9~#foÍ� ÊH! 9^#Vë##^#V!9~#foÍ) ÊÚ! 9^#Vë^#VÕ! 9^#VëÑs#rÃ1!9^#VÕ! 9^#Vë##Ñå~#foëÍ= ëás#r! 9^#Vë##^#Vë))ë! 9å~#foëás#r!9^#VÕ! 9^#Vë##Ñs#r!9^#Vë"Ò1! 9^#V!É! 9^#V*Ò1Í) Ê©!9^#Vë))åÍ^Ñë!9s#rz³Âx!É!9^#VÕ!9^#Vë##Ñs#r!9^#V!åÍ­Ñ*Ò1ë! 9s#rÃiÉÍò üÿ! 9^#V!üÿë!9s#r*Ò1ë!9s#rÃå!9^#Vë^#V!9s#r!9^#V!9~#foÍž Ê!9^#  *Ø12ëÍH Â2!9^#VÕÍ–,Ñ#åÍ^Ñå*Ø1)ë*Ö1Ñs#rz³Â:!åÍ»Ñ!9^#VÕ*Ø1#"Ø1+)ë*Ö1^#VÕÍq,ÑÑÉcon:CON:lst:LST:prn:PRN:Íò ! 9^#VÕ!å! 9^#VÕ͘ÑÑÑÉÍò øÿ!à3ë! 9s#r!ë!9s#rÃ×! 9å~#foëás#r!9å~#fo#ëás#r!9^#V! Íc Ê! 9^#V!^#V!ãÍ)  ö!øÿ"E3!ÿÿÉ!84DMÃ`iDM`i~#¶Ê<!9^#VÕ`i^#VÕÍ8,ÑÑÊ<Ã! ^#V!9s#r!9^#V!Íá #ë!9s#r!9^#V!Íá Ê•!9^#Vë^Õ! 9^#VëÑsz³Â•!öÿ"E3!ÿÿÉ!9^#V!Íá ÊÌ!9^#Vë#^Õ! 9^#Vë#Ñsz³ÂÌ!öÿ"E3!ÿÿÉ! ^#VÕ! 9^#V!Ñs#r!9^#Vë##^Õ! 9^#Vë##Ñs!#r!ÉÍò üÿ!9N#F!ë!9s#rÃ/#!9å~#fo#ëás#r!9^#V!9~#foÍc Ê$`i#DM+^!9s#r! 9^#VëÃó#!9^#V! Í) Ê�#! å!åÍŒÑÑ*3#"3Íá Âo#à #!9^#V! Í) ʵ#! å!åÍŒÑÑ!"3ÃÌ#!9^#V! ÍH ÊÌ#*3#"3Ãþ#!9^#V! Í) Êð#! å!9^#VÕÍŒÑÑÃþ#Íh _#Ï#!9^#VÕ!9^#VÕÍŒÑÑà #!9^#VëÉÍò !9^#V!Íc Â[$!9^#V! Íd Â[$!9^#Vë)))ã3^z³Âi$!ýÿ"E3Í1.ÿÿÿÿÉ!9^#Vë)))æ3^#VBK!9^#Vëà %Å!åÍŒÑÑÿÍ) Ê©$!ýÿ"E3Í1.ÿÿÿÿÉÅ!#åÍŒÑÑ!ë!$ s! 9å!! ^#VëÍœ1Í#.Ím/Í^.!$ ^ëͪ1Ív.Íô.ÍŠ.áåÍ8.Íô.áÍK.Ã%!úÿ"ië!9~#foÍ� Ê<!9^#V`iÍ= å!9^#V`iå! 9^#VÕÍEÑÑÑÊ<`iÉ!9^#VëÉÍò !9N#F!€å!åÍŒÑÑÅ!!åÍŒÑÑ"E3|µÊt!ÿÿÉ! 9^#VÕ!$ ^!€å!9^#VÕÍß-ÑÑÑ!$ ^! 9~#foÍá ë!$ sz³ÂÈ`i!å~#fo#ëás#r!ÉÍò üÿ!9N#F! 9å~#fo+ëás#r!ë!9s#rÃú`i#DM!9^#V!9~#foÍc ʃ ! 9^#VÕÍŒÑë`is!9s#r!9^#V!Í) Ê: !ÿÿÉ!9å~#fo#ëás#r! 9^#V!Í) Ê€ !9^#V! Í) Ê€ ! å!åÍŒÑÑ! ë`isà Ãõ!9^#VëÉÍò !9^#V!Íc ± !9^#V! Íd Ê» !ýÿ"E3!ÿÿÉ!9^#Vë)))à3DM! 9^#VÕ! 9^#VÕ! ^#VÕ! ^ë)3^#VëÍñ ÑÑÑÉÍò ú^.Íô*ë!9ù!,9s#rÃÕ)!9å! å!69Í8.Í^.ÍZ+ë!9ù!,9s#rÃÕ)!9å!å!69Í8.Í^.ÍZ+ë!9ù!,9s#rÃÕ)!29Í8.ͽ1ë!,9s#rÕÍ–,Ñë!09s#rÃí)!29Í8.ͽ1ë!>9s#r!>9^#VÕ`iÍñ Ñ!H9å~#fo++ëás#rÃ1&Íh ov(dœ(u)x;)sa)cƒ)•)!9ë!,9~#foÍ= ë!09s#r!09^#V!89~#foÍd Ê*!89^#V!09s#r!<9~#¶ÊK*!69å~#fo+ëás#rë#ë!09~#foÍd ÊK*!:9^#VÕ`iÍñ ÑÃ*!ë!.9s#rÃh*!.9å~#fo#ëás#r!,9^#Vë~·Ê¨*!.9^#V!89~#foÍc ʨ*!,9å~#fo#ëás#rë+^Õ`iÍñ ÑÃY*!<9~#¶Âß*!69å~#fo+ëás#rë#ë!09~#foÍd Êß*! å`iÍñ Ñò*Ãð*!>9^#VÕ`iÍñ ÑÃ1&ÉÍò ! 9N#F9^#Vë###^Õ! 9^#Vë###Ñs!”å! 9^#V!Ñs#rÅ! 9^#VÕ!9^#VÕ!9^#VÕ!9^#VÕ!9^#V!^#VëÍñ ë! 9ù!Íc Ê…!ãå! 9^#V!Ñs#r!ÿÿÉ!9^#VëÉÍò !9^#V!Íc ³!9^#V! Íd ʽ!ýÿ"E3!ÿÿÉ!9^#Vë)))à3DM! ^#VÕ! ^#VëÍñ Ñë!9s#r!ë! s! s! s`is!ãë! s#r!9^#VëÉÍò !Ú1DMÃ)`i&DM`i 3ëÍ� ÊD!% ^z³ÊNÃ!!ùÿ"E3!ÿÿÉÅ! 9^#VÕÍÅÑÑÊi!úÿ"E3!ÿÿÉ! 9^#V!Íá ʃÅ!åÍŒÑÑÅ!åÍŒÑÑÿÍ) ÊÆ! 9^#V!Íá ʹÅ!åÍŒÑÑÿÍ) ÊÃ!ÿÿ"E3!ÿÿÉÃæ! 9^#V!Íá Í) Êæ!ûÿ"E3!ÿÿÉ!ë!! s#r!# s!$ s`iå!E3Í1.ÿÿÿÿÉÍh ˆ$¼$ù$ü$!ë!# s! 9Í8.Í#.Ír1ÊX%!ë!! s#r!$ s!úÿ"E3Í1.ÿÿÿÿÉ! 9Í8.ͽ1Íá ë!$ s! 9Í8.Í#.Í›/ͽ1ë!! s#r! 9Í8.ÉÍÒ !ß%ÍÒ "Å*Ê1ë!€"Ê1ÍÁÅ*È1ëÍ·ÂØ%*È1!4ÂÊ%#4*Ì1+"Ì1}´Â %ÁÉo&"E3Á*Ì1ÉÍò Üÿ!9å!.9^#VÕÍÅÑÑ!9å!åÍŒÑÑÉÅ!9^#V#N#F#nëx±Ê#&s# Ã&ÁÉÍò Äÿ!D9N#F!F9å~#fo#ëás#rë+^!>9s#rz³Êó*!>9^#V!%Í) Êâ*!ë!9s!ë!<9s#r! ë!:9s#r!ÿë!89s#r!F9^#Vë^!>9s#r!-Í) ÊÌ&!ë!<9s#r!F9å~#fo#ëás#rë+^!>9s#r!>9^#V!0Í) Êç&!0ë!:9s#r!ë!69s#r!F9å~#fo#ëás#ÿ!DM!9^#V!9s#r!9^#V!$~·Ês!!9^#V!$^Õ!€ÑëÍ= DMë!9~#foÍž ÊU!!9^#VBKÅ!9^#VÕ! 9^#VÕÍ6"ÑÑÑÊs!!ÿÿÉ!9^#V`iÍ= ëͪ ë!9s#rz³ÊÞ!!9^#VÕ!9^#V`iå! 9^#VÕÍš%ÑÑÑë!9s#rz³ÊÞ!!9^#V!9~#foÍ= ëÍ- PYÉ!9^#V!Í- PYDM`ië!9~#foÍ� Ê-"!9^#V`iÍ= å!9^#V`iå! 9^#VÕÍ6"ÑÑÑÊ-"`iÉ!9^#VëÉÍò !9N#F!€å!åÍŒÑÑÅ!!åÍŒÑÑ"E3Í) Âq"*E3Í) ÊŒ"!"E3!å!€å!€åÍ &ÑÑÑØ"*E3|µÊ˜"!ÿÿÉ! 9^#VÕ! 9^#VÕ!$ ^!€åÍß-ÑÑÑÅ!"åÍŒÑÑ"E3|µÊÐ"!ÿÿÉ!$ ^! 9~#foÍá ë!$ sz³Â#`i!å~#fo#ëás`iͪ1Í^.! 9Í8.Ív.Í 0ͽ13^Õ!9å~#fo+ëás#rëÑs!9å`iͪ1ÍŠ.áåÍ8.Íæ/áÍK.Í©.Â+!9^#VëÉÍò þÿ!9N#F! 9Í8.Í#.Ír1Ê,! 9Í8.ͽ1Íá ë!9s#r! 9å! 9Í8.Í#.Í›/Í#.ÿÿÿÍ /áÍK.`iëÍ ͪ1Í^.!9Í8.Ív.Í 0ͽ1)ë!9~#fo3^Õ!9å~#fo+ëás#rëÑs! 9å`iëÍ ͪ1ÍŠ.áåÍ8.Íæ/áÍK.!9^#VÕÅ!9Í8.Í^.Íô*ë!9ùëÉ!9Åÿ^#V#~#fox±Ê\,¾Âa,·Ê\,# ÃH,Á!ÉÁÚk,!}´É!ÿÿ}´É!9Åÿ^#VÕ#~#fox±Ê“,~·Ê“,# Â,áÁÉ!9~#fo¯¾Ê«,#â,ë}´É!9Å^#VÕ#^#V#N#FëÑÃH,!9Å^#VÕÕ#^#V#N#FëÑÂ,Åÿ!9^#VÕ#~#foëx±Ê“,~·Êý,# Ãî,ëÂ9^#V!Ñs#r! 9^#V!Íá #ë!% s!Íá Ê@!qå!9^#V!Ñs#rÃS!Wå!9^#V!Ñs#r!ÉÍò !å! 9^#V!%Ñs!ÉÍò !9N#FÅ!åÍŒÑÑ!ë!% s!ÉÍò !ÉÍò !9^#V!Íc ÂÂ!9^#V! Íd ÊÌ!ýÿ"E3!ÿÿÉ!9^#Vë)))à3DM! 9^#VÕ! 9^#VÕ! ^#VÕ`i^ë) 3^#VëÍñ ÑÑÑÉÍò úÿ!DM!9^#V!9s#r!9^#V!$~·Ê‚!9^#V!$^Õ!€ÑëÍ= DMë!9~#foÍž Êd!9^#VBKÅ!9^#VÕ! 9^#VÕÍEÑÑÑÊ‚!ÿÿÉ!9^#V`iÍ= ëͪ ë!9s#rz³Êí!9^#VÕ!9^#V`iå! 9^#VÕÍ’%ÑÑÑë!9s#rz³Êí!9^#V!9~#foÍ= ëÍ- PYÉ!9^#V!Í- PYDM`rë+^!>9s#r!0ÍH ÊL'!>9^#V!9ÍI ÊL'!69^#V! Íá ë!>9~#foÐÿë!69s#rÃò&!>9^#V!.Í) ÊÁ'!ë!89s#r!F9å~#fo#ëás#rë+^!>9s#r!0ÍH ÊÁ'!>9^#V!9ÍI ÊÁ'!89^#V! Íá ë!>9~#foÐÿë!89s#rÃg'!>9^#V!dÍ) Ê÷'!29å!J9å~#fo##ëás#rë++^#Vëͪ1áÍK.Ãk(!>9^#V!lÍ) ÊH(!F9å~#fo#ëás#rë+^!>9s#r!29å!J9å~#foëás#rëüÿÍ8.áÍK.Ãk(!29å!J9å~#fo##ëás#rë++^#VëÍœ1áÍK.!>9^#Vëö)!9å!å!69Í8.Í^.ÍZ+ë!9ù!,9s#rÃÕ)!29Í8.Í#.Ír1Êï(!9å! å!69Í8.Í™.Í^.Íô*ë!9ù!,9s#r!-å!.9å~#fo+ëás#rëÑsÃ)!9å! å!69Í8.Í  ,!9Å^#VÕÕ#^#V#N#Fá¯Ãî,Å!9^#V#në~·Ê0-»Ê6-#Ã#-!¯ÁÉ|µÁÉÅ!9^#V#n믾ÊR-#ÃI-x±Ê0- +~»ÂR-Ã6-!9~þ ʇ-þ ʇ-þ ʇ-Ü-!9~þAÚœ-þ[Òœ-!}·É!9~þaÚœ-þ{Ú‡-!¯É!9~þ0Úœ-þ:Òœ-Ç-!9~þaÚÄ-þ{ÒÄ-Ö o&·É!9~þAÚÚ-þ[ÒÚ-Æ o&·ÉÅ! 9~G+~O°Ê!.+~W+~_+~+ng²Ú.{µÚ.x±Ê!.w# Ã. ë ëx±Ê!.w+ Ã.ÁÉÑ!åëë*Ê3Ã<.Ñ!åëë*È3w#w#w#wÉë*È3~#~#~#~Éá"-3*È3V+^+ÕV+^Õ*-3éá"-3*Ê3Ñs#r#Ñs#r*-3é*Ê3ë*È3"Ê3ë"È3É*È3¯>žw#Ÿ.É*È3~·Âl1#®.Ãa1¯=Áɯ<ÁÉÅ*È3ë*Ê3###·úÝ.®ú¿.Ãá.®ú».¾Ú».¿.+Âã.¯ÁÉÅ*È3ë*Ê3¯ã ÌÌãü ##0123456789abcdef/333””òòòããããããããZÎ3_Î3dÔ3iÔ3nÔ3sÔ3z4PUTLIST MACy!\PUTS C ~?:READ C €'ÜRENAME C „äÁREVERSE C ‡PREWIND C ‰ñ¶SIGN C ‹ìSTDIO H ´STRCAT C �STRCHR C �ýÊSTRCMP C ‘æSTRCPY C “W"STRLEN C ”úSTRNCAT C •½ÎSTRNCMP C ˜8åSTRNCPY C ›-ߎ#Âÿ.ÁÉÅ*È3ë*Ê3¯ž#Â/ÁÉÅ*È3ë*Ê3¦#Â*/ÁÉÅ*È3ë*Ê3¶#Â?/ÁÉÅ*È3ë*Ê3®#ÂT/ÁÉ*È3~/w#Âd/É*Ê3~æ?ÈÅG*È3^#V#~#fo)ë)ëÒ‰/#Â�/DM*È3s#r#q#pÁÉ*Ê3~æ?ÈW*È3###~·úÀ/å·~w+²/á®/Éå7~w+ÂÄ/áÂÀ/É~#ÂÔ/O·ð!93Íœ.ÉÅ*È393ÍÒ/y273*Ê3A3ÍÒ/:73©273ÍS093*È3w#Â0Á:73·ú™.ÉÅ*È393ÍÒ/y273*Ê3A3ÍÒ/ÍS0=3*È3w#ÂB0Á:73·ú™.É!=3¯w#ÂY0> 283!93·~�w#Âj0ŸæO=3!A3·ž#Â0yÞš0!934!835Âd0É!835ÊÌ0!93·~�w#§0ŸO=3!A3·Ž#º0yΚ0ÃŽ0=3!A3·Ž#ÂÕ0ÉÅ*Ê3A3~#Âè0*È3=3~#Âø0  �ERATOS C ÝóFA C "¾FB C É6FC C $ß¿FFD C +b9FM C . ªISPRINT C ÁISPUNCT C 9SISSPACE C W,ISUPPER C †5ISXDIGITC óHITOA C ø¯ITOAB C /¡ITOD C $¯ITOO C *þ�The files named .CPM are actually .COM files for CP/M. If you copy the files to a CP/M system without using 22DISK, just rename all *.CPM to .COM STRRCHR C žÞ�TIME C óH¦TOASCII C ¡oTOLOWER C ¢rTOPOFMEMMAC¤ô<TOUPPER C ¦ŽUALLOC C ¨Œ[ULINK MAC­/+,UNGETC C Ü÷ÜUNLINK MACÞœ*UTOI C â´WRITE C åqöXTOI C éiZZBUF MACíâvZZFIO MACïB²ÿ !93¯w#Â1> 283!93·~�w#Â1ÒB193!A3·Ž#Â+1ÎÒB1Â61!835Â1*È393w#ÂQ1ÁÉÍÃ.Êl1!¯ÉÍÃ.Êa1!¯<ÉÍÃ.úl1Ãa1ÍÃ.úl1Êl1Ãa1ÍÃ.úa1Ãl1ÍÃ.úa1Êa1Ãl1ë*È3s#r#6#6Éë*È3s#r#z·ò¤16ÿ#6ÿÉ*È3^#VëÉ€4ITOU C /pœITOX C 5¬LCC SUB7†DLEFT C :aÊLEXCMP C < ù�LIBID C HA§MALLOC C IȯMAX C Lã®MIN C MbcNEWLIB SUBNðþOTOI C U2OUTP MACXåPAD C [×QPOLL C ]žŸPRNTF C ar¦PUTCHAR C wȸ  ÿ ÿ ÿ ÿ /* ** stdiol.h -- header for resident stdio/crtl/call ** -Set up for Version 2.08 compiler 8/4/84 (fas) */ #define stdin 0 #define stdout 1 #define stderr 2 #define stdport 3 #define stdlist 4 #define ERR -2 #define EOF -1 #define YES 1 #define NO 0 #define TRUE 1 #define FALSE 0 #define NULL 0 #define CR 13 #define LF 10 #include stdio.h /* ** itod -- convert nbr to signed decimal string of width sz ** right adjusted, blank filled; returns str ** ** if sz > 0 terminate with null byte ** if sz = 0 find end of string ** if sz < 0 use last byte for data */ itod(nbr, str, sz) int nbr; char str[]; int sz; { char sgn; if(nbr<0) {nbr = -nbr; sgn='-';} else sgn=' '; if(sz>0) str[--sz]=NULL; else if(sz<0) sz = -sz; else while(str[sz]!=NULL) ++sz; while(sz) { str[--s#define NOCCARGC /* no argument count passing */ /* ** itoa(n,s) - Convert n to characters in s */ itoa(n, s) char *s; int n; { int sign; char *ptr; ptr = s; if ((sign = n) < 0) /* record sign */ n = -n; /* make n positive */ do { /* generate digits in reverse order */ *ptr++ = n % 10 + '0'; /* get next digit */ } while ((n = n / 10) > 0); /* delete it */ if (sign < 0) *ptr++ = '-'; *ptr = '\0'; reverse(s); } turns str ** ** if sz > 0 terminate with null byte ** if sz = 0 find end of string ** if sz < 0 use last byte for data */ itou(nbr, str, sz) int nbr; char str[]; int sz; { int lowbit; if(sz>0) str[--sz]=NULL; else if(sz<0) sz = -sz; else while(str[sz]!=NULL) ++sz; while(sz) { lowbit=nbr&1; nbr=(nbr>>1)&32767; /* divide by 2 */ str[--sz]=((nbr%5)<<1)+lowbit+'0'; if((nbr=nbr/5)==0) break; } while(sz) str[--sz]=' '; return str; } /* ** return 'true' if c is a printable character ** (32-126) */ isprint(c) int c; { return (c>=32 && c<=126); } #define NOCCARGC /* no argument count passing */ /* ** return 'true' if c is a punctuation character ** (all but control and alphanumeric) */ ispunct(c) int c; { return (!isalnum(c) && !iscntrl(c)); } /* ** return 'true' if c is a white-space character */ isspace(c) int c; { /* first check gives quick exit in most cases *z]=(nbr%10+'0'); if((nbr=nbr/10)==0) break; } if(sz) str[--sz]=sgn; while(sz>0) str[--sz]=' '; return str; } /* ** itoo -- converts nbr to octal string of length sz ** right adjusted and blank filled, returns str ** ** if sz > 0 terminate with null byte ** if sz = 0 find end of string ** if sz < 0 use last byte for data */ ito#define NOCCARGC /* no argument count passing */ /* ** itoab(n,s,b) - Convert "unsigned" n to characters in s using base b. ** NOTE: This is a non-standard function. */ itoab(n, s, b) int n; char *s; int b; { char *ptr; int lowbit; ptr = s; b >>= 1; do { lowbit = n & 1; n = (n >> 1) & 32767; *ptr = ((n % b) << 1) + lowbit; if(*ptr < 10) *ptr += '0'; else *ptr += 55; ++ptr; } while(n /= b); *ptr = 0; reverse (s); }  /* ** itox -- converts nbr to hex string of length sz ** right adjusted and blank filled, returns str ** ** if sz > 0 terminate with null byte ** if sz = 0 find end of string ** if sz < 0 use last byte for data */ itox(nbr, str, sz) int nbr; char str[]; int sz; { int digit, offset; if(sz>0) str[--sz]=0; else if(sz<0) sz = -sz; el/ return(c<=' ' && (c==' ' || (c<=13 && c>=9))); } /* ** return 'true' if c is upper-case alphabetic */ isupper(c) int c; { return (c<='Z' && c>='A'); } /* ** return 'true' if c is a hexadecimal digit ** (0-9, A-F, or a-f) */ isxdigit(c) int c; { return ((c<='f' && c>='a') || (c<='F' && c>='A') || (c<='9' && c>='0')); } o(nbr, str, sz) int nbr; char str[]; int sz; { int digit; if(sz>0) str[--sz]=0; else if(sz<0) sz = -sz; else while(str[sz]!=0) ++sz; while(sz) { digit=nbr&7; nbr=(nbr>>3)&8191; str[--sz]=digit+48; if(nbr==0) break; } while(sz) str[--sz]=' '; return str; } #include stdio.h /* ** itou -- convert nbr to unsigned decimal string of width sz ** right adjusted, blank filled; re  se while(str[sz]!=0) ++sz; while(sz) { digit=nbr&15; nbr=(nbr>>4)&4095; if(digit<10) offset=48; else offset=55; str[--sz]=digit+offset; if(nbr==0) break; } while(sz) str[--sz]=' '; return str; } /* ** left -- left adjust and null terminate a string */ left(str) char *str; { char *str2; str2=str; while(*str2==' ') ++str2; while(*str++ = *str2++); } /* ** max.c by F.A.Scacchitti 9 - 10 - 84 */ max(a,b) int a, b; { if(a > b) return(a); return(b); } /* ** min.c by F.A.Scacchitti 9 - 10 - 84 */ min(a,b) int a, b; { if(a < b) return(a); return(b); } XSUB LIB80 NEWCLIB= ULINK LIBID UNGETC FFLUSH REWIND CTELL CTELLC CSEEK FILELIB FREAD READ FWRITE WRITE GRABUF GRABIO FREBUF FREEIO FPRINTF FSCANF PRNTF FPUTS FGETS GETS PUTS FPUTC FGETC PUTCHAR GETCHAR GETCHX CPMIO CPMDISK,096,097,098,099,100, /**** [ \ ] ^ U ` ****/ 055,056,057,058,059,060, /**** a-z ****/ 075,076,077,078,079,080,081,082,083,084,085,086,087, 088,089,090,091,092,093,094,095,096,097,098,099,100, /**** { | } ~ ****/ 061,062,063,064, /**** DEL ****/ 101 }; lexorder(c1, c2) char c1, c2; { return(Ulex[c1] - Ulex[c2]); }  ; outp(port#,data) ; added 2/84 (fas) OUTP:: INX SP ; Skip over return address INX SP POP H ; Load data in L POP B ; Load port # in C DB 0EDH, 069H ; Do instruction PUSH B ; Restore stack PUSH H DCX SP DCX SP ; All gone RET END #define NOCCARGC /* no argument count passing */ /* ** Place n occurrences of ch at dest. */ pad(dest, ch, n) char *dest, *#define NOCCARGC /* no argument count passing */ /* ** lexcmp(s, t) - Return a number <0, 0, or>0 ** as s is <, =, or > t. */ lexcmp(s, t) char *s, *t; { while(*s == *t) { if(*s == 0) return (0); ++s; ++t; } return (lexorder(*s, *t)); } /* ** lexorder(c1, c2) ** ** Return a negative, zero, or positive number if ** c1 is less than, equal to, or greater than c2, ** based on a lexicographical (dictionary order) ** colating sequence. ** */ char Ulex[128] PUTLIST CALLOC MALLOC UALLOC AVAIL FREE POLL ABS ATOI ATOIB DTOI ISALNUM ISALPHA ISASCII ISATTY ISCNTRL ISDIGIT ISGRAPH ISLOWER ISPRINT ISPUNCT ISSPACE ISUPPER ISXDIGIT ITOA ITOAB ITOD ITOO ITOU ITOX LEFT LEXCMP OTOI REVERSE SIGN STRCAT STRCHR STRCMP STRCPY STRLEN STRNCAT STRNCMP STRNCPY STRRCHR TOASCII TOLOWER TOUPPER UTOI XTOI PAD FEOF FERROR CLEARERR DELAY DOLDDR DOLDIR INP OUTP TOPOFMEM UNLINK MIN MAX ABORT BDOS CALL1 CALL2 CALL3 CALL4#include libid() { puts("\n\n This library created 11/24/84 by F. A. Scacchitti\n\n"); } #define NOCCARGC /* no argument count passing */ #include stdio.h /* ** Memory allocation of size bytes. ** size = Size of the block in bytes. ** Returns the address of the allocated block, ** else NULL for failure. */ malloc(size) char *size; { return (Ualloc(size, NO)); } n; int ch; { /* n is a fake unsigned integer */ while(n--) *dest++ = ch; } #define NOCCARGC /* no argument count passing */ #define ABORT 3 #define PAUSE 19 #include stdio.h /* ** Poll for console input or interruption */ poll(pause) int pause; { int i; i = bdos(6,255); if(pause) { if(i == PAUSE) { while(!(i = bdos(6,255))) ; if(i == ABORT) abort(0); return (0); } if(i == ABORT) abort(0); }  = { /**** NUL - / ****/ 000,001,002,003,004,005,006,007,008,009, 010,011,012,013,014,015,016,017,018,019, 020,021,022,023,024,025,026,027,028,029, 030,031,032,033,034,035,036,037,038,039, 040,041,042,043,044,045,046,047, /**** 0-9 ****/ 065,066,067,068,069,070,071,072,073,074, /**** : ; < = > ? @ ****/ 048,049,050,051,052,053,054, /**** A-Z ****/ 075,076,077,078,079,080,081,082,083,084,085,086,087, 088,089,090,091,092,093,094,095 CALL5 ZZFIO ZZBUF /E A: PIP A:=B:NEWCLIB.REL[v] #include stdio.h /* ** otoi -- convert unsigned octal string to integer nbr ** returns field size, else ERR on error */ otoi(octstr, nbr) char *octstr; int *nbr; { int d,t; d=0; *nbr=0; while((*octstr>='0')&(*octstr<='7')) { t=*nbr; t=(t<<3) + (*octstr++ - '0'); if ((t>=0)&(*nbr<0)) return ERR; d++; *nbr=t; } return d; }    return (i); }  /* ** prntf("format string"[, arg, arg, ...]) -- formatted print ** operates as described by Kernighan & Ritchie with ** the following exceptions: ** ** - only d, c, and s formats supported ** - maximum field-width specification of 9 ** - no field seperator specification ** ** Modified version of J. E. Hendrix's printf distributed ** with Small-C Versi len = -1; while(sptr[++len]); /* get length */ if(right) while(((width--) - len) > 0) putchar(pad); while(len) { putchar(*sptr++); --len; --width; } while(((width--) - len) > 0) putchar(pad); } } #define NOCCARGC /* no argument count passing */ /* * putchar() Normal console output via BDOS(2) */ #include l = *nxtarg; while(c = *ctl++) { if(c != '%') { putchar(c); continue; } if(*ctl == '%') { putchar(*ctl++); continue; } cx = ctl; right = 1; pad = ' '; if(*cx == '-') { right = 0; ++cx; } if(*cx == '0') { pad = '0'; ++cx; } width = *cx - '0'; if(width < 1 || width >9) width = 0; else cx++; sptr=str; c = *cx++; i = *(--nxtarg); switch(c) { case /* ** read.c by F. A. Scacchitti 11/24/84 */ #include extern int zzbuf; read(fd,buffer,cnt) int fd, cnt; char *buffer; { int i, n; char *tbuff, flag; tbuff = &zzbuf; n=0; while(cnt >0){ if((flag = bdos(20,fd)) != NULL) { *(fd + 40) = flag; return(n); }else i = 0; while(i <= 127 && cnt > 0){ buffer[n] = tbuff[i]; i++; cnt--; n++; } } return(n); } on 2.0. This version uses putchar for ** for output and is renamed to prntf to avoid mutiple ** global defines. It is designed to occupy minimum code ** space and can be used interchangeably with printf(),as ** long as the exceptions are taken into consideration. ** ** F. A. Scacchitti 10/7/84 */ #include /* ** Making the following variables static greatly reduces size ** while increasing speed. However, if static globals aren't ** available on your compiler, the prntf.mac fi putchar(c) char c; { bdos(2,c); if (c == CR) bdos(2,LF); }  ; ; putlist(c) ; ; F. A. Scacchitti 8/4/84 ; ; CBDOS EQU 5 ;/* bdos entry point */ LF EQU 10 EOL EQU 13 ; ; CP/M BDOS CALLS ; LSTOUT EQU 5 ;write character to list device ; ; Storage varibles found in ulink() or ulinq() ; EXTRN ZZTEMP ; ; PUTLIST:: POP B POP D PUSH D PUSH B SHLD ZZTEMP MVI C,LSTOUT ; cpm(LSTOUT,c); CALL CBDOS ; (mod to cb'd': sz = 7; if(i < 0) { i = -i; sgn='-'; } else sgn=' '; str[--sz] = NULL; while(sz) { str[--sz] = (i % 10 + '0'); if((i = i / 10) == 0) break; } if(sz) str[--sz] = sgn; while(sz > 0) str[--sz]=' '; break; case 'c': str[0] = i; str[1] = NULL; break; case 's': sptr = i; break; default : continue; } ctl = cx; /* accept conversion spec */ if(c == 'd') while(*sptr==' ') ++sptr; /* ** rename(old,new) char *old, *new; by F.A.Scacchitti 9/11/84 */ #define NOCCARGC #include rename(old,new) char *old, *new; { int fcbloc; if ((fcbloc = grabio()) == NULL) return(ERR); fcb(fcbloc, old); fcb(fcbloc + 16, new); freeio(fcbloc); if(bdos(23,fcbloc) >= 0) return(NULL); return(ERR); } #define NOCCARGC /* no argument count passing */ /* ** reverse string in place */ reverse(s) char *s; { char *j; intle must be ** edited to remove the additional colon generated by the ** compiler to ensure no problems occur with multiple global ** definitions. An alternative to this method would involve ** renaming all the static variable with some little used ** prefix. (eg. qqq, xxx, ppp) */ static int i, width, len, *nxtarg, sz; static char *ctl, *cx, c, right, str[7], *sptr, pad, sgn; prntf(argc) int argc; { i = CCARGC(); /* fetch arg count from A reg first */ nxtarg = &argc + i - 1; ctdos(fas)) LDA ZZTEMP CPI EOL ; if(c==EOL) JNZ PUTLS1 MVI E,LF ; cpm(LSTOUT,LF); MVI C,LSTOUT CALL CBDOS ; (mod to cbdos(fas)) PUTLS1: LHLD ZZTEMP ; return(c & 0377) MVI H,0 RET END #define NOCCARGC /* no argument count passing */ /* *puts(string) Print string to console via BDOS(9) */ puts(string) char *string; { int i; i = 0; while(string[i] != 0){ putchar(string[i]); i++; } }    c; j = s + strlen(s) - 1; while(s < j) { c = *s; *s++ = *j; *j-- = c; } }  /* ** rewind.c by F. A. Scacchitti 9/11/84 */ #define NOCCARGC #include rewind(fd) int fd; { return(cseek(fd, 0, 0)); } /* ** sign -- return -1, 0, +1 depending on the sign of nbr */ sign(nbr) int nbr; { if(nbr>0) return 1; if(nbr==0) re d = dest; while(n-- > 0) { if(*d++ = *sour++) continue; while(n-- > 0) *d++ = 0; } *d = 0; return (dest); } /* ** strrchr(s,c) - Search s for rightmost occurrance of c. ** s = Pointer to string to be searched. ** c = Character to search for. ** Returns pointer to rightmost c or NULL. */ strrchr(s, c) char *s, c; { char *ptr; ptr = 0; whi/* ** return length of s */ strlen(s) char *s; { char *t; t = s - 1; while (*++t) ; return (t - s); } /* ** concatenate n bytes max from t to end of s ** s must be large enough */ strncat(s, t, n) char *s, *t; int n; { char *d; d = s; --s; while(*++s) ; while(n--) { if(*s++ = *t++) continue; return(d); } *s = 0; return(d); }  /* ** ------------ Memory Allocation */ /* ** Allocate n bytes of (possibly zeroed) memory. ** Entry: n = Size of the items in bytes. ** clear = "true" if clearing is desired. ** Returns the address of the allocated block of memory ** or NULL if the requested amount of space is not available. */ #include extern char *zzmem; Ualloc(n, clear) char *n; int clear; { char *oldptr; if(n < avail(YES)) { if(clear) pad(zzmem, NULL, n); oldptr = zzmem; zzmem += turn 0; return -1; } /* ** concatenate t to end of s ** s must be large enough */ strcat(s, t) char *s, *t; { char *d; d = s; --s; while (*++s) ; while (*s++ = *t++) ; return(d); } /* ** return pointer to 1st occurrence of c in str, else 0 */ strchr(str, c) char *str, c; { while(*str) { if(*str ==le(*s) { if(*s==c) ptr = s; ++s; } return (ptr); } /* ** return ASCII equivalent of c */ toascii(c) int c; { return (c); } /* ** return lower-case of c if upper-case, else c */ tolower(c) int c; { if(c<='Z' && c>='A') return (c+32); return (c); } /* ** strncmp(s,t,n) - Compares two strings for at most n ** characters and returns an integer ** >0, =0, or <0 as s is >t, =t, or 0 aUording to ** st */ strcmp(s, t) char *s, *t; { while(*s == *t) { if(*s == 0) return (0); ++s; ++t; } return (*s - *t); } /* ** copy t to s */ strcpy(s, t) char *s, *t; { char *d; d = s; while (*s++ = *t++) ; return(d); } ; ; ; End of memory function ; Returns top memory location in HL CBDOS EQU 5 TOPOFMEM:: LDA CBDOS+2 ; Get base of BDOS (mod to cbdos (fas)) MOV H,A ; Save page in HL MVI L,0 RET END /* ** return upper-case of c if it is lower-case, else c */ toupper(c) int c; { if(c<='z' && c>='a') return (c-32); return (c); }   e Small-C compiler. ; ; This module contains the following routines: ; ; -ULINK entry point just like J. E. Hendrix Vers. 2.1 ; ; -Initialization of stack, memory buffers, and argument ; passing (argv, argc). ; ; ; call to main() ; links to main in user program ; ; -Cleans house and returns to CP/M ; ; ; ; ; Now then here's the starting code ; ; ; ; 1st - Save CPM's stack pointer, establish file i/o constructs set ; new default buffer and establish start of available memory. ; ; ; where do we put the stack ; LDA ZZZCCP ; let's check ORA A ; JZ SETSTK ; just below the BDOS MOV A,H SUI 8 ; just below the CCP MOV H,A ; SETSTK: SPHL ; set stack pointer ; MVI C,0 ; Init argc LXI H,ARGV ; Pointer to first entry of argv array ; ; CPM does not tell us what the first word of the command ; line was (the name of pgm), so we fake it by pointing it ; to an ascii string with '*' in it ; LXI D,PGM ; Pointer to 'pgmname' string CALL SVARG ; Save next argumenCLOSE EQU 16 ; FCBSIZE EQU 36 ;size, in bytes, of an FCB BUFFER EQU 6 ;offset to disk sector buf. in I/O struct. UNGOT EQU 5 ;offset to char ungotten by ungetc() FLAG EQU 33 ;file-type flag byte (in unused part of FCB) FREEFLG EQU 128 ;This I/O structure is available BUFSIZ EQU 1024 ;how long the sector buffer is NBUFS EQU 8 ;number of I/O buffers TBUFSZ EQU 128 ;size of default disk buffer ; EXTRN MAIN, ZZBUF, ZZZCCP ; ; ULINK:: ; LXI H,0 ; get CPM's stack pointer DAD SP SHLD ZZSTAK in procedure MVI A,2 ; Load up the argument count ; CALL MAIN ; Transfer to the C world.... ; ; anchors ; away ; my ; bo ; y ; y ; y ; y ; y ; EXIT:: MVI B,NBUFS ; Prepare to scan for open files MVI C,CLOSE LXI H,ZZBUF+TBUFSZ+FLAG LXI D,FCBSIZE+BUFFER+BUFSIZ SCANEM: MOV A,M ; Get free flag CPI FREEFLG ; Is it free ? JZ NOPEN ; Yes - not open, go get next PUSH B ; No - prepare to close PUSH D PUSH H LXI D,-FLAG DAD 2nd - Get the default disk and set stack at base of BDOS or CCP ; depending on the status ZZZCCP. 0 = bdos 1 = ccp ; ; 3rd - Parse the CPM input line and modify it so that we can pass ; the C program in the argc, argv form that it expects. ; HL = pointer to next argv entry ; DE = pointer to next character in command line ; B = number of characters left in line ; C = argument count (argc) ; ; 4th - Call MAIN to commence operation of the user program ; ; 5th - Work, work, work and thent ; ; Ok, now for the real stuff. Set DE pair to point to ; CPM command line and start searching for arguments LXI D,CPMARG ; Pointer to CPM arg line LDAX D ; Load # character in line MOV B,A ; Save it in B NXTSP: INX D ; Point to next character DCR B ; Decrement character count JM ENDCMD ; End of cmd line LDAX D ; Load next character in line CPI ' ' ; Space? JZ NXTSP ; Yes...continue searching CALL SVARG ; Nope, save starting point of this arg ; Loop looking for either end of li; save it for later ; MVI C,26 LXI D,ZZBUF CALL CBDOS ; Set the default buffer out there ; SETIO: MVI B,NBUFS LXI H,ZZBUF+TBUFSZ+FLAG LXI D,FCBSIZE+BUFFER+BUFSIZ MVI A,FREEFLG SETIO2: MOV M,A ;set all buffers to free DAD D ;on to next buffer DCR B JNZ SETIO2 ;if there is one... SHLD ZZMEM ;put it where it belongs ; MVI C,25 ; get logged-in disk CALL CBDOS INR A STA ZZDFLT ; save it ; LDA CBDOS+2 ; get base of BDOS MOV H,A ; save page in HL MVI L,0 D XCHG ; DE --> Start of FCB CALL CBDOS ; Close the file POP H ; Restore scan setup POP D POP B NOPEN: DAD D ; Point to next flag DCR B ; Last one ? JNZ SCANEM ; No - keep scanning until done ; MVI C,26 LXI D,80H CALL CBDOS ; Reset the default buffer ; LHLD ZZSTAK ; Load stack pointer SPHL LDA ZZZCCP ; How do we get back ? ORA A RNZ ; this way to CCP ; ; or ; ; this way to warm boot ; LDA ZZDFLT ; Grab orig. logged-in disk MOV E,A D return to here via exit(), abort() ; or normal return from program. ; ; 6th - Close any open files (buffers are not flushed) ; ; 7th - Restore CP/M's stack pointer, select the disk you entered ; with, reset the default buffer and return to CP/M either ; via a JMP 0 (ZZZCCP = 0) or RET (ZZZCCP = 1). ; ; CBDOS EQU 5 ;/* bdos entry point */ CPMARG EQU 128 ;/* CP/M command line */ MAXARG EQU 24 ;/* Maximum number of input args */ STDIN EQU 0 STDOUT EQU 1 STDERR EQU 2 STDLST EQU 4 CBDOS EQU 5 ne of a space NXTCH: INX D ; Point to next character DCR B ; Decrement character count JM ENDWRD ; End of cmd line, but need to end arg LDAX D ; Load next character in line CPI ' ' ; Space? JNZ NXTCH ; Nope...keep looking MVI A,0 ; Yes, replace it with a zero byte STAX D JMP NXTSP ; Look for start of next arg ENDWRD: MVI A,0 STAX D ENDCMD: MVI B,0 ; Zero B (BC now is 16 bit argc) PUSH B ; First arg to main procedure LXI H,ARGV ; Point to argv array PUSH H ; Second argument to ma  CR E ; (cvt. back to 0-n) MVI C,14 ; and log it in again CALL CBDOS ; (mod to cbdos (fas)) ; JMP 0 ; ; SVARG: MOV M,E ; Save pointer to start of string INX H MOV M,D INX H INR C ; Increment argc RET PGM: DB '*',0 ; ARGV: DS MAXARG*2 ; ZZDFLT:: DB 0 ; default disk ; ZZSTAK:: DW 0 ; CP/M's stack ; ZZMEM:: DW 0 ; useable memory pointer ; ZZTEMP:: DW 0 ; available to anyone ; ; ; END ULINK f(d<4) ++d; else return ERR; *nbr=*nbr<<4; *nbr=*nbr+(*hexstr++)-t; } return d; } ; ; ZZBUF.MAC by F. A. Scacchitti 9-18-84 ; ; Default Buffer for disk I/O ; ; Used to preserve standard CP/M buffer for input arguments ; and mark the end of the code space. ; ZZBUF:: NOP END  ; File i/o storage varibles ; ; ZZUNIT:: DS 2 ;I/O structure address to act on ZZIP:: DS 2 ;int *ZZIP; ZZCHP:: DS 2 ;ch t=*nbr;t=(10*t) + (*decstr++ - '0'); if ((t>=0)&(*nbr<0)) return ERR; d++; *nbr=t; } return d; } /* ** write.c by F. A. Scacchitti 11/24/84 */ #include extern int zzbuf; write(fd,buffer,cnt) int fd, cnt; char *buffer; { int i, n; char *tbuff, flag; tbuff = &zzbuf; n = fd + 33; /* prevents fcb buffer flush */ *n = NULL; n=0; while(cnt >0){ i = 0; while(i <= 127 && cnt > 0){ tbuff[i] = buffer[n]; i++; cnt--; efine MEM 65369 pointer to first time byte for the 820-I */ #define MEM 65366 /* pointer to first time byte for the 820-II */ char array[LINSIZ]; int num[6]; int lolim[] = { 1, 1, 84, 0, 0, 0}; int hilim[] = {31, 12, 99, 23, 59, 59}; main(argc,argv) int argc, *argv; { char *entry; argv++; /* point to option */ entry = *argv; /* set up 2nd indirect pointer *entry = **argv */ switch (*entry) { case 'P': if(!gudtim(gettim())) settim(); if(gud /* ** ungetc.c by fas 8/30/84 */ #include #define FCBSIZE 36 #define UNGOT 5 ungetc(c,fd) char c, *fd;{ if(fd[FCBSIZE+UNGOT] != EOF) return(EOF); fd[FCBSIZE+UNGOT] = c; return(c); } ; ; unlink(name) ; UNLINK:: DELETE:: POP B POP D PUSH D PUSH B PUSH D ; name ; /* open file to unlink in LXI H,"r" ; Mode ; order to get fcb for it. */ PUSH H CALL FOPEN ; unit = fopen(name,'r'); POP D POP D SHLD UNIT MVIar *ZZCHP; ZZDP:: DS 2 ;char *ZZDP; ZZFILE:: DS 2 ;file name ZZMODE:: DS 2 ;char *mode;(read or write) ZZCH:: DS 2 ;char ch; ZZT:: DS 2 ;int t; ZZFN:: DS 2 ;int ZZFN; i/o function (for cpmio) ZZNUBU:: DS 2 ;# TEMPORARY BUFFER STORAGE ZZMXSC:: DS 1 ;# SECTOR COUNTER ZZSVCH:: DS 2 ;char *ZZSVCH; saved character pointer END /* ** time.c Time set/display Program by F.A.Scacchitti 9/23/84 ** Copyright 1984 25 Glenview Lane ** All righn++; } if((flag = bdos(21,fd)) != NULL) { *(fd + 40) = flag; return(n); } } return(n); } #include stdio.h /* ** xtoi -- convert hex string to integer nbr ** returns field size, else ERR on error */ xtoi(hexstr, nbr) char *hexstr; int *nbr; { int d,t; d=0; *nbr=0; while(1) { if((*hexstr>='0')&(*hexstr<='9')) t=48; else if((*hexstr>='A')&(*hexstr<='F')) t=55; else if((*hexstr>='a')&(*hexstr<='f')) t=87; else break; itim()) prntim(); break; case 'S': if(settim()) prntim(); break; default: argc = 0; break; } if (argc != 2){ prntf(" usage: time p prints time and date\n"); prntf(" time s to set time and date\n"); } } prntim(){ /* Routine to print time and date */ char *clkmem; putchar(VERTAB); clkmem = MEM; clkmem++; switch (*clkmem){ case 1: prntf("January"); break; case 2: prntf("February"); break; case 3: prntf("M C,19 ; bdos(19,unit); CALL BDOS ; (mod to cbdos(fas)) LHLD UNIT ; freeio(unit); PUSH H CALL FREEIO POP D RET ; return; UNIT: DS 2 EXTRN BDOS EXTRN FOPEN EXTRN FREEIO END ;#include stdio.h /* ** utoi -- convert unsigned decimal string to integer nbr ** returns field size, else ERR on error */ utoi(decstr, nbr) char *decstr; int *nbr; { int d,t; d=0; *nbr=0; while((*decstr>='0')&(*decstr<='9')) { ts reserved Roch, NY 14609 ** ** Written in Small-C (Version 2.09) ** ** Time Utility for the Xerox 820 ** ** time p ---> prints current time and date ** time s ---> enter time set routine ** ** This program is designed to be used with an auxiliary printf routine ** (prntf) to minimize program size. (printf may be substituted for prntf) ** (fas) ** */ #include #define CLEAR 26 #define BACKSP 8 #define SPACE 32 #define VERTAB 11 #define LINSIZ 18 /*#d  arch"); break; case 4: prntf("April"); break; case 5: prntf("May"); break; case 6: prntf("June"); break; case 7: prntf("July"); break; case 8: prntf("August"); break; case 9: prntf("September"); break; case 10: prntf("October"); break; case 11: prntf("November"); break; case 12: prntf("December"); break; default: abort('?'); } clkmem--; prntf(" %d, 19%d %02d:%02d:%02d",*clkmem++,*++clkmem,*++clkmem, *++clkmem,*+1; } } } printf(" %d primes", count); }  /* ** fa.c File Append Program by F.A.Scacchitti 9/23/84 ** ** Written in Small-C Version 2.09 or later ** ** Appends one files on to another ** ** printf may be substituted for prntf (fas) */ #include int fdin, fdin2; main(argc,argv) int argc, argv[]; { int fdin, fdin2; char c; if (argc != 3) { prntf("\nfa usage: fa hilim[i]) return(FALSE); return(TRUE); } gettim(){ /* Routine to get time data from memory to an array */ int i; char *clkmem; clkmem = MEM; for (i = 0; i <=5; i++) num[i] = *clkmem++; } /* Eratosthenes Sieve Prime Number Program in C */ /* Uses local (automatic) Variables */ #include #define SIZE } if((fdin = fopen(argv[1],"r")) == NULL) { puts("\nUnable to open input file.\n"); exit(); } if((fdout = fopen(argv[2],"w")) == NULL) { puts("\nUnable to create output file.\n"); exit(); } while((count = read(fdin,inbuf,BUFSIZE)) == BUFSIZE) { write(fdout,inbuf,count); i += count; } i += count; write(fdout,inbuf,count); fclose(fdin); fclose(fdout); } +clkmem); } settim(){ /* Routine to set time and date */ int i; char c, *clkmem; clkmem = MEM; /* Display the time set header */ putchar(CLEAR); prntf("Enter the time and date as dd/mm/yy hh:mm:ss\n"); prntf("\n eg. for 1:45 P.M. on August 12, 1984\n"); prntf(" Enter ---> 12/08/84 13:45:00\n"); prntf(" dd/mm/yy hh:mm:ss"); prntf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); /* Get the input string */ i = -1; while (((c = getchar()) != CR) && i++ < 17) if e> \n"); exit(); } if((fdin = fopen(argv[1],"a")) == NULL) { prntf("\nUnable to open file %s\n",argv[1]); exit(); } if((fdin2 = fopen(argv[2],"r")) == NULL) { prntf("\nUnable to create file %s.\n",argv[2]); exit(); } while((c = fgetc(fdin2)) != EOF) fputc(c,fdin); fclose(fdin); fclose(fdin2); }  8190 #define SIZEP1 8191 char flags[SIZEP1]; main() { int i, prime, k, count, iter; /* variables defined here are local */ printf("10 iterations :"); for (iter = 1; iter<=10; iter ++) { count = 0; for (i = 0; i<= SIZE; i++) flags[i] = TRUE; for (i = 0; i<= SIZE; i++) { if (flags[i]) { prime = i + i + 3; k = i + prime; while (k <= SIZE) { flags [k] = FALSE; k += prime; } count = count + /* ** fc.c File Copy Program by F.A.Scacchitti 9/23/84 ** ** Written in Small-C Version 2.09 or later ** ** Copies file from file to file ** Byte modifications may be made during transfer ** ** printf may be substituted for prntf (fas) ** */ #include main(argc,argv) int argc, argv[]; { int fdin, fdout; /* file i/o channel pointers */ char c; if (argc != 3) { prntf("\nfc usage: fc \n"); exit(); } if((fdin = fope(c == BACKSP) if (i == 0){ i = -1; putchar(SPACE);} else i = i - 2; else array[i] = c; /* Convert the characters to integer values */ for (i = 0; i <= 18; i = i + 3) num[i/3] = ((array[i] - '0') * 10) + (array[i+1] - '0'); prntf("\n\n"); /* Store the values to memory if they're valid */ if (gudtim()) { for (i = 0; i <=5; i++) *clkmem++ = num[i]; return(TRUE); }else{ prntf(" Incorrect data entered - time not updated"); return(FALSE); } /* ** fb.c File Copy (Bin) Program by F.A.Scacchitti 9/23/84 ** ** Written in Small-C Version 2.09 or later ** ** Copies file from file to file ** Byte modifications may be made during transfer */ #include #define BUFSIZE 8192 main(argc,argv) int argc, argv[]; { int fdin, fdout; /* file i/o channel pointers */ int i, count; char *inbuf; i = 0; inbuf = malloc(BUFSIZE); if(argc != 3) { puts("\nfc usage: fc \n"); exit();   n(argv[1],"r")) == NULL) { prntf("\nUnable to open file %s\n",argv[1]); exit(); } if((fdout = fopen(argv[2],"w")) == NULL) { prntf("\nUnable to create file %s.\n",argv[2]); exit(); } while((c = fgetc(fdin)) != EOF) /* ** Here's where we can modify the file */ fputc(c,fdout); fclose(fdin); fclose(fdout); } /* ** ffd.c formfeed Program by F.A.Scacchitti 11/26/84 ** Copyright 1984 25 Glenview Lane ** All rights CPMDISK MACö(àCPMIO MACù©CSEEK C  ‘[CTELL C ’CTELLC C #jDELAY MAC%d(DOLDDR MAC+4DOLDIR MAC.4¨DTOI C 1]EXIT MAC5âFEOF C 9"FERROR C ;æÿFFLUSH C =ÍoFGETC MACB#èjFGETS MACejFILELIB MAC|Jåeto create output file\n"); exit(); } while((c = fgetc(fdin)) != EOF) /* ** Here's where we modify the file */ fputc((modify(c)),fdout); fclose(fdin); fclose(fdout); } /* this routine double spaces an ascii file */ modify(c) char c; { if( c == CR) { fputc(CR,fdout); return(LF); }else return(c); }  cc -a -p -l2 $1.c >$1.mac m80 $1=$1 l80 $1,$2,$3,$4,$5,$6,$7,$8,$9,clib/s,$1/n/e ; ; abort.mac by F. A. Scacchitti 11 - 24 - 84 ; ; abort(error code) ; EXTRN EXIT ; ABORT:: ; POP B ; throw away return address POP H ; get abort code ORA A ; code passed ? JZ ABORT2 ; no - leave it as is MOV A,L STA ABCODE ; yes - imbed it in the message ABORT2: LXI D,ABTMSG ; Load abort message MVI C,9 CALL 5 JMP EXIT ; ABTMSG: DB 0DH, 'Aborted ' ; ABCODE: DB 07,0D,'$' ; END reserved Roch, NY 14609 ** ** Written in Small-C (Version 2.10) ** ** ** ** ** ** */ #include int i; main() { for(i = 1; i <= 66; i++) putlist(LF); } /* ** fm.c File Modification Program by F.A.Scacchitti 9/23/84 ** ** Written in Small-C Version 2.09 or later ** ** Copies from source file to new file modifying on the fly. ** Mod. description is in modify routine. ** ** This program may be uFPRINTF C Æå¸FPUTC MACÙŸEFPUTS MACø•�FREAD C ÐFREBUF C »°FREE C `IFREEIO MACÖÉFSCANF C  FWRITE C -C2GETCHAR C /’GETCHX C 1®GETS MAC3DGRABIO MACF¯¶GRABUF C NœsINP MACPG1ISALNUM C S‘| [ABORT MACéABS C º ATOI C 4kATOIB C oAVAIL C xBDOS MAC ±’CALL1 MAC%ê1CALL2 MAC+€ŒCALL3 MAC9¬üCALL4 MACA91CALL5 MACF.eECALLOC C tW×CLEARERRC w>{CLIB DOCytý CLIB LSTí ÐÆ/* ** abs -- returns absolute value of nbr */ abs(nbr) int nbr; { if(nbr < 0) return (-nbr); return (nbr); } #define NOCCARGC /* no argument count passing */ /* ** atoi(s) - convert s to integer. */ atoi(s) char *s; { int sign, n; while(isspace(*s)) ++s; sign = 1; switch(*s) { case '-': sign = -1; case '+': ++s; } n = 0; while(isdigit(*s)) n = 10 * n + *s++ - '0'; return (sign * n); } sed as a shell for any ascii file ** modification utilities. */ #include int fdin, fdout; /* file i/o channel pointers */ char c; /* the byte we're modifying */ main(argc,argv) int argc, argv[]; { if (argc != 3) { puts("\nfm usage: fm \n"); exit(); } if((fdin = fopen(argv[1],"r")) == NULL) { puts("\nUnable to open input file\n"); exit(); } if((fdout = fopen(argv[2],"w")) == NULL) { puts("\nUnable ISALPHA C UŒòISASCII C VþéISATTY C Xu�ISCNTRL C ZÔ€ISDIGIT C \ºISGRAPH C ]ÌAISLOWER C ^vISPRINT C _ÁISPUNCT C `9SISSPACE C bW,ISUPPER C d†5ISXDIGITC eóHITOA C gø¯ITOAB C k/¡ÿ ÿ   #define NOCCARGC /* no argument count passing */ /* ** atoib(s,b) - Convert s to "unsigned" integer in base b. ** NOTE: This is a non-standard function. */ atoib(s, b) char *s; int b; { int n, digit; n = 0; while(isspace(*s)) ++s; while((digit = (127 & *s++)) >= '0') { if(digit >= 'a') digit -= 87; else if(digit >= 'A') digit -= 55; else digit -= '0'; if(digit >= b) break; n = b * n + digit; } return (n); } L AND RETURN QUOTIENT IN HL, REMAINDER IN DE ;(SIGNED DIVIDE) ; CCDIV:: DIV: MOV B,H MOV C,L MOV A,D XRA B PUSH PSW MOV A,D ORA A CM CCDENEG MOV A,B ORA A CM CCBCNEG MVI A,16 PUSH PSW XCHG LXI D,0 CCDIV1: DAD H CALL CCRDEL JZ CCDIV2 CALL CCCMPBCDE JM CCDIV2 MOV A,L ORI 1 MOV L,A MOV A,E MOV H,A ; RET ; END  ;----- call1.mac Small-C arithmetic and logical library ; ; part 1 Multiply Routine ; ; ; ; ;MULTIPLY DE BY HL AND RETURN IN HL ;(SIGNED MULTIPLY) ; CCMULT:: MULT: MOV B,H MOV C,L LXI H,0 CCMLT1: MOV A,C RRC JNC CCMLT2 DAD D CCMLT2: XRA A E SUB C MOV A,D SBB B RET END ; ;----- call3.mac Small-C arithmetic and logical library ; ; ; part 3 switch routine ; ; ; EXECUTE "SWITCH" STATEMENT ; ; HL = SWITCH VALUE ; (SP) -> SWITCH TABLE ; DW ADDR1, VALUE1 ; DW ADDR2, VALUE2 ; ... ; DW 0 ; [JMP default] ;#define NOCCARGC /* no argument count passing */ /* ** Return the number of bytes of available memory. ** In case of a stack overflow condition, if 'abort' ** is non-zero the program aborts with an 'S' clue, ** otherwise zero is returned. */ external char *zzmem avail(aburt) int aburt; { char x; if(&x < zzmem) { if(aburt) abort('M'); return (0); } return (&x - zzmem); }  SUB C MOV E,A MOV A,D SBB B MOV D,A CCDIV2: POP PSW DCR A JZ CCDIV3 PUSH PSW JMP CCDIV1 CCDIV3: POP PSW RP CALL CCDENEG XCHG CALL CCDENEG XCHG RET ; ;NEGATE THE INTEGER IN DE ;(INTERNAL ROUTINE) ; CCDENEG: MOV A,D CMA MOV D,A MOV A,E CMA MOV E,A INX D RET ;  MOV A,B RAR MOV B,A MOV A,C RAR MOV C,A ORA B RZ XRA A MOV A,E RAL MOV E,A MOV A,D RAL MOV D,A ORA E RZ JMP CCMLT1 END ; ;----- call2.mac Small-C arithmetic and logical library ; ; ; part 2 divide routine ; ; ;DIVIDE DE BY H continuation ; CCSWITCH:: XCHG ;;DE = SWITCH VALUE POP H ;;HL -> SWITCH TABLE SWLOOP: MOV C,M INX H MOV B,M ;;BC -> CASE ADDR, ELSE 0 INX H MOV A,B ORA C JZ SWEND ;;DEFAULT OR CONTINUATION CODE MOV A,M INX H CMP E MOV A,M INX H JNZ SWLOOP CMP D JNZ SWLOOP MOV H,B ;;CASE MATCHED ; ; bdos.mac by F. A. Scacchitti 9 - 18 - 84 ; ; This assembly routine allows CPM calls from Small C. ; ; bdos(function,data) or cpm(function,data) ; ; NOTE - This function only returns what the bdos call ; placed in the accumulator ; BDOS:: ; CPM:: ; POP H ; Pop rtn address POP D ; Pop input parameter in DE register pair POP B ; Pop function code into C register PUSH B ; Restore stack PUSH D PUSH H CALL 5 MOV L,A ; Sign extend A into HL register pair RLC SBB A  ;NEGATE THE INTEGER IN BC ;(INTERNAL ROUTINE) ; CCBCNEG: MOV A,B CMA MOV B,A MOV A,C CMA MOV C,A INX B RET ; ;ROTATE DE LEFT ONE BIT ;(INTERNAL ROUTINE) ; CCRDEL: MOV A,E RAL MOV E,A MOV A,D RAL MOV D,A ORA E RET ; ;COMPARE BC TO DE ;(INTERNAL ROUTINE) ; CCCMPBCDE: MOV A,  MOV L,C SWEND: PCHL END  ; ;----- call4.mac Small-C arithmetic and logical library ; ; ; part 4 arithmetic shift routines ; ; ;SHIFT DE ARITHMETICALLY RIGHT BY HL AND RETURN IN HL ; CCASR:: XCHG DCR E RM MOV A,H RAL MOV A,H RAR MOV H,A MOV A,L RAR MOV L,A JMP INX H DAD SP MOV D,H MOV E,L CALL CCGINT INX H JMP CCPINT ; ; ; CCDDPI:: CDPDPI:: ; DAD D CCPDPI:: POP B ;;RET ADDR POP D PUSH B ; ;STORE A 16-BIT INTEGER IN HL AT THE ADDRESS IN DE ; CCPINT:: PINT:: MOV A,L STAX D INX D MOV A,H STAX D RET ; ;INCLUSIVE "OR" HL AND DE INTO HL H A FULL 16-BIT INTEGER FROM THE ADDRESS IN HL ;INTO HL ; CCGINT:: MOV A,M INX H MOV H,M MOV L,A RET ; CCDECC:: INX H INX H DAD SP MOV D,H MOV E,L CALL CCGCHAR DCX H MOV A,L STAX D RET ; CCINCC:: INX H INX H DAD SP MOV D,H MOV E,L CALL CCGCHAR INX H MOV A,L  ;TEST IF DE <= HL (SIGNED) ; CCLE:: CALL CCCMP RZ RC DCX H RET ; ;TEST IF DE >= HL (SIGNED) ; CCGE:: CALL CCCMP RNC DCX H RET ; ;TEST IF DE < HL (SIGNED) ; CCLT:: CALL CCCMP RC DCX H RET ; ;COMMON ROUTINE TO PERFORM A SIGNED COMPARE ; OF DE AND HL ;THIS ROUTINE PERFORMS DE - HL  CCASR+1 ; ;SHIFT DE ARITHMETICALLY LEFT BY HL AND RETURN IN HL ; CCASL:: XCHG DCR E RM DAD H JMP CCASL+1 ; END  ; ;----- call5.mac Small-C arithmetic and logical library ; ; ; part 5 main routine - multiply, divide, switch and ; shift routines in seperate modules ; CCDCAL:: PCHL CCDDGC:: DAD D JMP CCGCHAR ; CCDSGC::  ; CCOR:: MOV A,L ORA E MOV L,A MOV A,H ORA D MOV H,A RET ; ;EXCLUSIVE "OR" HL AND DE INTO HL ; CCXOR:: MOV A,L XRA E MOV L,A MOV A,H XRA D MOV H,A RET ; ;"AND" HL AND DE INTO HL ; CCAND:: MOV A,L ANA E MOV L,A MOV A,H ANA D MOV H,A RET ; ;IN STAX D RET ; ; ; CCDDPC:: CDPDPC:: ; DAD D CCPDPC:: POP B ;;RET ADDR POP D PUSH B ; ;STORE A SINGLE BYTE FROM HL AT THE ADDRESS IN DE ; CCPCHAR:: PCHAR:: MOV A,L STAX D RET ; CCDECI:: INX H INX H DAD SP MOV D,H MOV E,L CALL CCGINT DCX H JMP CCPINT ; CCINCI:: INX H AND SETS THE CONDITIONS: ; CARRY REFLECTS SIGN OF DIFFERENCE (SET MEANS DE < HL) ; ZERO/NON-ZERO SET ACCORDING TO EQUALITY. ; CCCMP:: MOV A,H ;;INVERT SIGN OF HL XRI 80H MOV H,A MOV A,D ;;INVERT SIGN OF DE XRI 80H CMP H ;;COMPARE MSBS JNZ CCCMP1 ;;DONE IF NEQ MOV A,E ;;COMPARE LSBS CMP L CCCMP1: LXI H,1 ;;PRESET TRUE COND RET  INX H INX H DAD SP ; ;FETCH A SINGLE BYTE FROM THE ADDRESS IN HL AND ;SIGN EXTEND INTO HL ; CCGCHAR:: MOV A,M ; ;PUT THE ACCUM INTO HL AND SIGN EXTEND THROUGH H. ; CCARGC:: CCSXT:: MOV L,A RLC SBB A MOV H,A RET ; CCDDGI:: DAD D JMP CCGINT ; CCDSGI:: INX H INX H DAD SP ; ;FETC ALL THE FOLLOWING COMPARE ROUTINES, HL IS SET TO 1 IF THE ;CONDITION IS TRUE, OTHERWISE IT IS SET TO 0 (ZERO). ; ;TEST IF HL = DE ; CCEQ:: CALL CCCMP RZ DCX H RET ; ;TEST IF DE <> HL ; CCNE:: CALL CCCMP RNZ DCX H RET ; ;TEST IF DE > HL (SIGNED) ; CCGT:: XCHG CALL CCCMP RC DCX H RET ;    ; ;TEST IF DE >= HL (UNSIGNED) ; CCUGE:: CALL CCUCMP RNC DCX H RET ; ;TEST IF DE < HL (UNSIGNED) ; CCULT:: CALL CCUCMP RC DCX H RET ; ;TEST IF DE > HL (UNSIGNED) ; CCUGT:: XCHG CALL CCUCMP RC DCX H RET ; ;TEST IF DE <= HL (UNSIGNED) ; CCULE:: CALL CCUCMP RZ RCbrarù  followinç � specicationó  describeä  iî "Thå à Programminç  Language"®  Thió � librarù  ió  á  combinatioî oæ moduleó  obtaineä  froí  Hendrix'ó � library¬  á  modifieä  publiã domaiî runtimå librarù anä  moduleó � writteî  bù  myself®  Thå  followinç  sourcå  fileó  contaiî  thå � functionó describeä iî thió document: ABORT .MAC ABS .C ATOI .C ATOIB .C AVAIL .C BDOS .MAC CALL1 .MAC CALL2 .MAC CALL3 .MAC CALL4 .MAC CALL5. .MAC CALLOC .C #define NOCCARGC /* no argument count passing */ #include stdio.h /* ** Cleared-memory allocation of n items of size bytes. ** n = Number of items to allocate space for. ** size = Size of the items in bytes. ** Returns the address of the allocated block, ** else NULL for failure. */ calloc(n, size) char *n, *size; { return (Ualloc(n*size, YES)); } /* ** clearerr.c by F. A. Scacchitti 11/22/84 ** ** Clears errors and end of file marks in fd. ** */ #include C PUTCHAR .C PUTLIST .MAC PUTS .C READ .C RENAME .C REVERSE .C REWIND .C SIGN .C STRCAT .C STRCHR .C STRCMP .C STRCPY .C STRLEN .C STRNCAT .C STRNCMP .C STRNCPY .C STRRCHR .C TOASCII .C TOLOWER .C TOPOFMEM.MAC TOUPPER .C UALLOC .C ULINK .C UNGETC .C UNLINK .MAC UTOI .C WRITE .C XTOI .C ZZBUF .MAC  DCX H RET ; ;COMMON ROUTINE TO PERFORM UNSIGNED COMPARE ;CARRY SET IF DE < HL ;ZERO/NONZERO SET ACCORDINGLY ; CCUCMP:: MOV A,D CMP H JNZ CCUCP1 MOV A,E CMP L CCUCP1: LXI H,1 RET ; ;SUBTRACT HL FROM DE AND RETURN IN HL ; CCSUB:: MOV A,E SUB L MOV L,A MOV A,D SBB H MOV H,A RET ; ;FOR CLEARERR.C CPMDISK .MAC CPMIO .MAC CSEEK .C CTELL .C CTELLC .C DELAY .MAC DOLDDR .MAC DOLDIR .MAC DTOI .C FEOF .C FERROR .C FFLUSH .C FGETC .MAC FGETS .MAC FILELIB .C FPRINTF .C FPUTC .MAC FPUTS .MAC FREAD .C FREBUF .C FREE .C FREEIO .MAC FSCANF .C FWRITE .C GETCHAR .C GETCHX .C GETS .MAC GRABIO .MAC GRABUF .C INP .MAC I clearerr(fd) int fd; { *(fd + 40) = NULL; }  CLIB.DOC by F. A. Scacchitti 25 Glenview Lane Rochester, NY 14609 11 - 24 - 84 Thió  'C§ Librarù containó mosô oæ thå functionó describeä iî  J® � E®  Hendrix'ó  "Thå Small-à Handbook"®  Theså functionó arå  alsï � describeä iî thå Maù 198´ Dr®  Dobb'ó Journal®  Mù intent¬  aó ió � his¬   ió  tï  providå  á  completå  standarä  li ZZFIO .MAC ŠRatheò  thaî  tryinç tï providå á Unix-likå environmenô (anä  thå � resultinç  overhead)¬  I'vå attempteä tï puô á  packagå  togetheò � whicè  ió  morå conducivå to CP/M®  Thió Librarù ió  designeä  tï � producå  minimuí  sizå fileó whilå retaininç thå flavoò  oæ  'C'® � Manù  oæ  thå  functionó arå writteî iî assembleò  and¬  aó  timå � permits¬  morå  functionó  wilì bå optimizeä foò  botè  sizå  anä � speed®  Mosô functionó containeä iî thió librarù arå useablå witè � anù CP/Í 8° sM THE TWO'S COMPLEMENT OF HL ; CCNEG:: CALL CCCOM INX H RET ; ;FORM THE ONE'S COMPLEMENT OF HL ; CCCOM:: MOV A,H CMA MOV H,A MOV A,L CMA MOV L,A RET CCLNEG:: MOV A,H ORA L JNZ $+6 MVI L,1 RET LXI H,0 RET ; ; END SALNUM .C ISALPHA .C ISASCII .C ISATTY .C ISCNTRL .C ISDIGIT .C ISGRAPH .C ISLOWER .C ISPRINT .C ISPUNCT .C ISSPACE .C ISUPPER .C ISXDIGIT.C ITOA .C ITOAB .C ITOD .C ITOO .C ITOU .C ITOX .C LEFT .C LEXCMP .C LIBID .C MALLOC .C MAX .C MIN .C OTOI .C OUTP .MAC PAD .C POLL .C PRNTF .  ystem¬  however¬  manù oæ thå I/Ï functionó interacô � witè eacè otheò aó welì aó thå runtimå routines®  Anyonå adaptinç � anù  portionó oæ thió librarù shoulä evaluatå thå sourcå codå  oæ � thå particulaò module(s© iî question® Aó witè alì libraries¬ its§ � valuå  manifestó itselæ wheî useä witè á linking-loadeò thaô  haó � searcè capabilities® (eg® Microsoftó M80/L80/LIB8° package) .pa ŠFEATURES OF THE LIBRARY 104 functionó (5 aliases© arå available¬  includinç mosô standarä � 'C§ functions. Smallelobaì ZZZCCÐ ½ ° placeó thå stacë aô thå baså � oæ thå BDOÓ anä returnó viá warí booô. (jmp 0) Defininç thå globaì ZZZCCÐ ½ ± placeó thå stacë aô thå  baså �Š oæ thå CCÐ anä returnó tï thå CCP. ZZZCCÐ maù bå generateä aó á compileò functioî viá á switch¬ � oò addeä aó thå followinç inlinå codå tï á prograí oò headeò � file. #asm zzzccp:: db 1 #endasm Iæ  lefô undefineä iô wilì defaulô tï warí boot®  nce® However¬ theså bufferó arå noô � restricteä  tï  filå  I/O®  Theù maù bå  allocateä  viá  thå � grabuf(© functioî anä deallocateä viá frebuf()® Cautioî musô � bå  useä  tï insurå thaô anù uså oæ theså bufferó  doeó  noô � exceeä  thå ± K-bytå limit®  Thå resultó oæ failinç tï  staù � withiî thå limitó ió unpredictable. Sequentiaì    dynamiã   memorù   allocation/deallocatioî   schemå � (calloc,malloc¬  anä  free© startó aô thå enä oæ thå lasô  buffeò � anä  endó aôlloc./dealloc. schema along with the standards. .pa ŠFUNCTIONS IN THE LIBRARY Onlù  thå  functionó noô describeä iî  J®  E®  Hendrix'ó  Small-à � Manuaì, or those that differ from his, wilì bå described. abort(code) exitó  thå  prograí  displayinç thå  "Aborted¢  messagå  anä � optionaì  codå  passeä bù thå user®  Iæ nï codå ió passeä  á � default code of control g (bell) is used. abs(nbr) int nbr atoi(str) char *str atoib(str,base) char *str; int base; avail(abort)ò  prograí  sizå thaî mosô - minimuí prograí  sizå  ió  25¶ � bytes. This would be the result of the following 'C' code. #include main() { } Argã anä argö arå handleä bù thå runtimå modulå anä alwayó passeä � tï thå useò program® Á maximuí oæ 2´ argumentó maù bå passeä witè � 23 availablå tï the user. Fileó maù bå openeä iî read¬  writå oò appenä  modes®  Read/writå � (+© modeó arå noô supported. All I/O buffers are allocated outside program space including: Thå linkeò � wilì indicatå iô aó undefined¬ witè nï consequence® CP/Í  integritù ió maintaineä bù thå runtimå modulå anä  restoreä � aô  prograí completion®  Also¬  alì opeî fileó  arå  closed¬  buô � buffers are NOT flushed. prntf(© ió á speciaì versioî oæ printæ whicè onlù supportó thå d¬ � c¬  anä ó specifications® Fielä lengtè specifieró (wheî used© arå � limiteä tï á sizå oæ ¹ anä fielä separatoò specificationó  aren'ô � alloweä anä shoulä noô bå used® Thió modulå occupieó 82¸ byteó oæ � co thå stack®  Thå useò musô maintaiî thå integritù  oæ � thió  area®  Iæ  á  buffeò ió seô freå belo÷ onå thaô  shoulä  bå � maintained, thå  schemá  wilì  indicatå  alì  memorù  abovå  anä � includinç thå releaseä buffeò ió available®  Allocatinç anä usinç � anotheò buffeò aô thió poinô maù undesirablù wipå ouô datá  whicè � should have been maintained. Optionallù  eliminatå  thå  warí  booô  thaô  occuró  oî  prograí � termination®  Thió  ió accomplisheä in the following manner: Defininç  thå g int abort; bdos(fn,data) int fn, data; standarä CP/Í bdoó calì fî ió thå functioî codå anä datá  ió � thå  settinç oæ thå då register®  Returnó whateveò thå  calì � places in the accumulator. calloc(nbr,sz) int nbr, sz; cfree(addr) char *addr; clearerr(fd) int fd; cpm(fn,data) same as bdos(fn,data) cpmdisk(nbr) int nbr; log in disk number nbr. cseek(fd,offset,mode) ctell(fd) int fd; ctellc(fd) int fd; delay(n) int n; delaù  foò  î  millisecondó, bas1 128 byte default disk I/O buffer 8 1 K byte file buffers (available for general use) Thå  defaulô disë I/Ï buffeò ió seô bù thå runtimå modulå tï � preservå thå contentó oæ thå ruî strinç residinç aô thå CP/Í � defaulô  buffer®   Thå  standarä  defaulô  buffeò  (80h©  ió � restoreä aô prograí completion. Thå   ¸  filå  bufferó  arå  automaticallù   allocateä   anä � deallocateä  bù  thå  filå handlinç routineó  anä  thå  useò � needn'ô worrù abouô sequedå space. getchx(©  ió  á  speciaì versioî oæ getchar(© whicè  useó  direcô � consolå inpuô ratheò thaî thå standarä consolå input® Iô doeó noô � reflecô  characteró  tï  thå  screeî oò  trað  thå  CP/Í  controì � characters. grabuf(©  anä  frebuf(© allo÷ thå useò accesó tï á selæ  managinç � memorù allocatioî scheme®  Eacè buffeò returneä bù grabuf(© ió 1Ë � byteó oæ memorù anä shoulä noô bå exceeded®  Althougè thió  isn'ô � standard¬  iô  doeó providå á somewhaô bomâ resistanô (noô proof© � memory a  eä oî á  ´  Mhú  clocë  (25° � nanoseconä cyclå time). delete(name) char *name; dolddr(source, destination, n) int source, destination, n; perform z80 lddr instruction. doldir(source, destination, n) int source, destination, n; perform z80 ldir instruction dtoi(decstr, nbr) char *decstr; int nbr; Šexit(code) exit(); exits program and returns to CP/M fcb(fd,name) char *name; int fd; construct a file fcb on file name at location fd. (located in filel left(str) char *str; lexcmp(str1, str2) char *str1, *str2; Šlibid() displays the date and originator of this library malloc(sz) int sz; max(a, b) int a, b; returns the greater of a or b min(a, b) int a, b; returns the lesser of a or b otoi(str,nbr) char *str; int nbr; outp(nbr,data) int nbr, data; transmits data out of port nbr. pad(dest, ch, n) char *dest, *n; int ch; poll(pause) int pause; printf(format[,arg1,arg2,...]) prntf(format[,arg1,arg2,...t®  Iô doeó  noô � reflecô  characteró  tï thå screeî oò trað thå CP/Í  controì � characters. Šgets(str) char *str; grabio() returnó  thå  addresó  oæ  thå  firsô  availablå  filå   I/Ï � structure. If none is available NULL is returned. grabuf() returnó  thå  addresó oæ thå firsô availablå buffeò  iî  thå � file I/O structure. If none is available NULL is returned. inp(nbr) int nbr; returns the value read in at port nbr isalnum(c) char c; isalpha(c) chpofmem() returns base of system bdos toupper(c) char c; ualloc(n, clear) char *n; int clear; ungetc(c, fd) char c; int fd; unlink(name) same as delete(name) utoi(str, nbr) char *str; int nbr; write(fd,buffer,n) int fd, n; char *buffer; xtoi()(str, nbr) char *str; int nbr; .pa ŠLIBRARY STRUCTURE Thå  clib.reì  Small-C systeí librarù moduleó arå loadeä  iî  thå � followinç sequencå tï avoiä backwarä referencinç bù L80: ULINK** LIBID* UNGETC RENAME FREAD READ FWRIib module) fclose(fd) int fd; (located in file lib module) feof(fd) int fd; ferror(fd) int fd; fflush(fd) int fd; fgetc(fd) int fd; fgets(str, sz, fd) char *str; int sz, fd; fopen(filename, mode) char *name, mode; (locateä iî fileliâ modulå - onlù r¬ w¬ anä á modeó ) fprintf(fd, format[, arg1, ar2,...]) int fd; char *format; fputc(c, fd) char c; int fd; fputs(str, fd) char *str; int fd; fread(buffer, sz, n, fd) char *buffer; int fd, n, sz; frebuf(buff) int buf]) ió á speciaì versioî oæ printæ whicè onlù supportó thå d¬ c¬ � anä  ó specifications®  Fielä lengtè specifieró (wheî  used© � arå   limiteä   tï  á  sizå  oæ  ¹   anä   fielä   separatoò � specificationó  aren'ô alloweä anä shoulä noô bå used® putc(c, fd) same as fputc(c, fd) putchar(c) char c; putlist(c) char c; outputs character c to the list device. puts(str) char *str; read(fd, buff, n) int fd, n; char *buff rename(old,new) char *old, *new; reverse(strar c; isascii(c) char c; isatty(fd) int fd; iscntrl(c) char c; isdigit(c) char c; isgraph(c) char c; islower(c) char c; isprint(c) char c; ispunct(c) char c; isspace(c) char c; isupper(c) char c; isxdigit(c) char c; itoa(nbr, str) int nbr; char *str; itoab(nbr, str, base) int nbr, base; char *str; itod(nbr, str, sz) int nbr,sz; char *str; itoo(nbr,str,sz) int nbr,sz; char *str; itou(nbr,str,sz) int nbr,sz; char *str; itox(nbr,str,sz) int nbr,sz; char *str; TE WRITE FFLUSH REWIND CSEEK CTELL CTELLC FILELIB GRABUF* GRABIO* FREBUF* FREEIO* FPRINTF FSCANF PRNTF* FPUTS FGETS GETS PUTS FPUTC FGETC PUTCHAR GETCHAR GETCHX* CPMIO* CPMDISK* PUTLIST* CALLOC MALLOC UALLOC* AVAIL* FREE POLL* ABS ATOI ATOIB DTOI ISALNUM ISALPHA ISASCII ISATTY ISCNTRL ISDIGIT ISGRAPH ISLOWER ISPRINT ISPUNCT ISSPACE ISUPPER ISXDIGIT ITOA ITOAB ITOD ITOO ITOU ITOX LEFT LEXCf; freå  thå  buffeò  bufæ allocateä bù grabuf(©  anä  makå  iô � available for use. free(addr) same as cfree(addr) freeio(fd) int fd; freå  thå  filå structurå allocateä bù grabio(© anä makå  iô � available for use. fscanf(fd, format, arg, arg, . . . ) fwrite(buff, sz, n, fd) char *buf; int sz, n, fd; getc(fd) same as fgetc(fd) getchar() getchx(© ió á speciaì versioî oæ getchar(© whicè useó direcô  consolå � inpuô  ratheò thaî thå standarä consolå inpu) char *str; rewind(fd) int fd; scanf(format, arg1, arg2, . . .) sign(nbr) int nbr; strcat(dest, sour) char *dest, *sour; strchr(str, c) char *str, c; strcmp(str1, str2) char *str1, *str2; Šstrcpy(dest, sour) char *dest, *sour; strlen(str) char *str; strncat(dest, sour, n) char *dest, *sour; int n; strncmp(str1, str2, n) char *str1, *str2; int n; strncpy(dest, sour, n) char *dest, *sour; int n; strrchr(str, c) char *str, c; toascii(c) char c; tolower(c) char c; to  MP OTOI REVERSE SIGN STRCAT STRCHR STRCMP STRCPY STRLEN STRNCAT STRNCMP STRNCPY STRRCHR TOASCII TOLOWER TOUPPER UTOI XTOI PAD FEOF FERROR CLEARERR DELAY* DOLDDR* DOLDIR* INP* OUTP* TOPOFMEM* UNLINK MIN* MAX* CALL1** CALL2** CALL3** CALL4** CALL5** BDOS* ABORT ZZFIO** ZZBUF** * indicates a non standard function ** indicates a system function SYSTEM MODULES Refeò  tï  thå  sourcå fileó oæ th.C #STRLEN.C #STRNCAT.C #STRNCMP.C #STRNCPY.C #STRRCHR.C #TOASCII.C #TOLOWER.C #TOPOFMEM.MAC #TOUPPER.C #UALLOC.C #ULINK.MAC #UNGETC.C #UNLINK.MAC #UTOI.C #WRITE.C #XTOI.C #ZZBUF.MAC #ZZFIO.MAC ; ; cpmdisk(disk) ; ; F. A. Scacchitti 8/4/84 ; CBDOS EQU 5 ;/* bdos entry point */ LF EQU 10 EOL EQU 13 ; ; CP/M BDOS CALLS ; SELECT EQU 14 ;log-in a drive ; ; CPMDISK:: POP D POP H PUSH H PUSH D MOV A,L ; if(d~=0) ORA H JZ ù anä  serveó  tï � marë  thå  startinç poinô foò I/Ï bufferó anä thå dynamiã  memorù � allocation scheme.  #ABS.C #ATOI.C #ATOIB.C #AVAIL.C #BDOS.MAC #CALL1.MAC #CALL2.MAC #CALL3.MAC #CALL4.MAC #CALL5.MAC #CALLOC.C #CPMDISK.MAC #CPMIO.MAC #CSEEK.C #CTELL.C #CTELLC.C #DELAY.MAC #DOLDDR.MAC #DOLDIR.MAC #DTOI.C #EXIT.MAC #FFLUSH.C #FGETC.MAC #FGETS.MAC #FILELIB.MAC #FPRINTF.C #FPUTC.MAC #FPUTS.MAC #FREAD.C #FREBUF.C #FREE.C #FREEIO.MAC #FSCANF.C #FWRITE.Clt cpm buffer LF EQU 10 EOL EQU 13 ; ; CP/M BDOS CALLS ; CLOSE EQU 16 ;close a file CPMSTR EQU 9 ;print '$' delimited string on console CREATE EQU 22 ;make a file DMA EQU 26 ;set DMA (I/O address) DELETE EQU 19 ;delete a file GETCH EQU 1 ;read character from console GETSTR EQU 10 ;read string from console LSTOUT EQU 5 ;write character to list device OPEN EQU 15 ;open a file PUTCH EQU 2 ;write character to console QUERY EQU 25 ;get logged-in drive id READ EQU 20 ;read a sector SELECT EQU 1eså moduleó  foò  morå  detailó � regarding operation. ULINË  (25± bytes© containó thå routineó tï steeò thå 'C§ prograí � froí CP/Í tï thå useò prograí anä bacë agaiî tï CP/M® Thió modulå � ió thå onlù onå iî thå librarù tï havå aî entrù poinô defineä  aó � á startinç point¬ thereforå thå prograí wilì alwayó starô here® CALL±  (3²  bytes©  containó  thå codå tï  supporô  thå  multiplù � operator. ( * ) CALL²  (9´  bytes©  containó  thå  codå  tï  supporô  thå  dividå � and modulus operators. ( / DISKIF1 XCHG ; cpm(SELECT,d-1); DCX D MVI C,SELECT CALL CBDOS ; (mod fas) DISKIF1: RET END ; ; cpmio(fn,unit) ; ; F. A. Scacchitti 9/4/84 ; CBDOS EQU 5 ;/* bdos entry point */ CPMARG EQU 128 ;/* CP/M command line */ MAXARG EQU 32 ;/* Maximum number of input args */ STDIN EQU 0 STDOUT EQU 1 STDERR EQU 2 STDLST EQU 4 CTRLZ EQU 26 ;control z NULL EQU 0 ;pointer to nothing FCBSIZE EQU 36 ;size, in bytes, of an FCB NEXTP EQU 0 ;offset to next-character pointer  #GETCHAR.C #GETCHX.C #GETS.MAC #GRABIO.MAC #GRABUF.C #INP.MAC #ISALNUM.C #ISALPHA.C #ISASCII.C #ISATTY.C #ISCNTRL.C #ISDIGIT.C #ISGRAPH.C #ISLOWER.C #ISPRINT.C #ISPUNCT.C #ISSPACE.C #ISUPPER.C #ISXDIGIT.C #ITOA.C #ITOAB.C #ITOD.C #ITOO.C #ITOU.C #ITOX.C #LEFT.C #LEXCMP.C #LIBID.C #MALLOC.C #MAX.C #MIN.C #OTOI.C #OUTP.MAC #PAD.C #POLL.C #PRNTF.C #PUTCHAR.C #PUTLIST.MAC #PUTS.C #READ.C #RENAME.C #REVERSE.C #REWIND.C #SIGN.C #STRCAT.C #STRCHR.C #STRCMP.C #STRCPY4 ;log-in a drive WRITE EQU 21 ;write a sector ; ; File i/o storage varibles found in ulink() ; EXTRN ZZUNIT EXTRN ZZIP EXTRN ZZCHP EXTRN ZZDP EXTRN ZZFILE EXTRN ZZMODE EXTRN ZZCH EXTRN ZZT EXTRN ZZFN EXTRN ZZNUBU EXTRN ZZMXSC ; ; Characteristics variable storage found in ulink() ; EXTRN ZZSVCH EXTRN ZZDFLT EXTRN ZZSTAK EXTRN ZZMEM ; EXTRN CPMDISK ; ; Default disk I/O buffer ; EXTRN ZZBUF ; CPMIO:: POP B POP D POP H SHLD ZZFN XCHG SHLD ZZUNIT PUSH D PUSH H PU % ) Š CALL³  (2¶  bytes©  containó  thå  codå  tï  supporô  thå  switcè � statement. CALL´ (2± bytes© containó thå codå tï supporô thå righô anä  lefô � shifô operators. ( >> << ) CALLµ  (23µ  bytes©  containó  thå  codå  tï  supporô  alì  otheò � arithmetiã  anä  logicaì operatoró aó welì aó memorù anä  addresó � fetch and store operations. ZZFIÏ  (23  bytes© containó storagå foò globaì variableó useä  bù � file I/O and fgetc, fputc, etc . . . ZZBUÆ  (± byte© ió thå lasô modulå iî thå librarin I/O structure UNUSED EQU 2 ;offset to unused-positions-count in I/O structure BUFFER EQU 6 ;offset to disk sector buffer in I/O structure UNGOT EQU 5 ;offset to char ungotten by ungetc() FLAG EQU 33 ;file-type flag byte (in unused part of FCB) FREEFLG EQU 128 ;This I/O structure is available for the taking EOFFLG EQU 2 ;The end of this file has been hit WRTFLG EQU 1 ;This file open for writing BUFSIZ EQU 1024 ;how long the sector buffer is NBUFS EQU 8 ;number of I/O buffers TBUFF EQU 128 ;defau  SH B LHLD ZZUNIT ; cpmdisk(*unit); MOV L,M MVI H,0 PUSH H CALL CPMDISK POP H LHLD ZZUNIT ; ZZIP = unit+FCBSIZE; LXI D,FCBSIZE ; cpm(DMA,&ZZIP[BUFFER]); DAD D LXI D,BUFFER DAD D SHLD ZZNUBU ;# SAVE TO UPGRADE DURING LOOPING XCHG MVI C,DMA CALL CBDOS ; (mod fas) LHLD ZZFN ; t = cpm(ZZFN,unit); MOV C,L MVI A,8 ;# READ/WRITE UP TO 8 SECTORS STA ZZMXSC ;# SAVE IT LHLD ZZUNIT XCHG IOLOOP: PUSH H ;# NEW CONSTRUCT TO ACCOMODATE 1K BUFFERS PUSH D ;# SAVE IT A 1){ fcbdata[33] = 0; if(cpmio(20,fd) == EOF); if(zzmxsc == 8) return(EOF); unused = 1024 - (zzmxsc * 128); }else{ unused = 0; } *(fd + 38) = unused; *(fd + 36) = fd + 42; return (NULL); } getval(offset) int offset;{ zzzext = offset / 80; zzzrec = offset % 80; } gettof(fcbdata) char *fcbdata; { int tempofs; return(fcbdata[12] * 80 + fcbdata[32]); } #include stdio.h /* ** cseek(fd,offset,base) by F.A.Scacchitti 9/15/84 ** ** Position fd to the 128-byte record indicated by ** "offset" relative to the point indicated by "base." ** ** BASE OFFSET-RELATIVE-TO ** 0 first record ** 1 current record ** 2 end of file (last record + 1) ** ** Returns NULL on success, else EOF. */ extern char zzmxsc; char zzzext, zzzrec; cseek(fd, offset, base) int fd, offset, base; { char *fcbdata; int tempofs,  3997 cycles @ 250 nanosec per ; --------------------------- ; 0.99925 milliseconds ; ; ; Delay Loop set for 10 usec. per count based on 4 MHz clock ; DELAY2: DCX B ;# 5 ORA A ;# 4 ORA A ;# 4 MOV A,B ;# 5 ORA C ;# 4 JNZ DELAY2 ;# 10 RET ;# ;#------ ;# 32 cycles @ 250 nanosec per = 12.5 usec. END  ; lddr(source, dest, n) DOLDDR:: INX SP ; Skip over return address INX SP POP B ; Load n POP D ; Load destination LL FOR REPEAT PERFORMANCE PUSH B ; PUSH H ;# DON'T WRITE BLANKS MOV A,C CPI READ POP H JZ NOWRIT PUSH H LHLD ZZNUBU MOV A,M POP H CPI 1AH ;# END OF FILE CHAR ? JZ IOEXIT ; NOWRIT: CALL CBDOS ;# READ/WRITE A SECTOR PUSH PSW CALL CCSXT## SHLD ZZT POP PSW ORA A ;# CHECK FOR LAST SECTOR JNZ IOEXIT ;# IF LAST GET OUT OF HERE LDA ZZMXSC DCR A ;# CHECK FOR 8 SECTORS DONE JZ IOEXIT STA ZZMXSC LHLD ZZNUBU ;# GET BUFFER ADDRESS LXI D,128 DAD D ;# COMPUTE  /* ** ctell.c by F. A. Scacchitti 9/11/84 */ #define NOCCARGC #include ctell(fd) int fd; { char *fcb; int bsec, osec, t; fcb = fd; bsec = (*(fd + 36) - fd - 42) / 128 ; t = fcb[32]; if((osec = t % 8) == 0 && t != 0) osec = 8; if(t < 0) t = 128; return((fcb[12] * 128) + t - osec + bsec); }  /* ** ctellc.c by F. A. Scacchitti 9/11/84 */ #define NOCCARGC #include ctellc(fd) int fd; { return(( unused; fcbdata = fd; switch (base) { case 0: getval(offset); break; case 1: tempofs = gettof(fcbdata); if(tempofs >= 8) tempofs -= (8 - zzmxsc); getval(tempofs + offset); break; case 2: while(bdos(20, fd) == NULL); tempofs = gettof(fcbdata); getval(tempofs - offset); break; default: return (EOF); } fcbdata[12] = zzzext; fcbdata[32] = zzzrec; if(fcbdata[33] != POP H ; Load source DB 0EDH, 0B8H ; Do LDDR instruction PUSH H ; Restore stack PUSH D PUSH B DCX SP DCX SP RET END  ; doldir(source, dest, n) DOLDIR:: INX SP ; Skip over return address INX SP POP B ; Load n POP D ; Load destination POP H ; Load source DB 0EDH, 0B0H ; Do LDIR instruction PUSH H ; Restore stack PUSH D PUSH B DCX SP DCX SP RET NEW BUFFER ADDRESS SHLD ZZNUBU ;# SAVE TIL NEXT TIME XCHG MVI C,DMA CALL CBDOS ;# SET THE NEW BUFFER POP B POP D POP H JMP IOLOOP IOEXIT: POP B ;# CLEAN UP POP D POP H MVI C,DMA ; cpm(DMA,ZZBUF); LXI D,ZZBUF CALL CBDOS ; (mod fas) LHLD ZZT ; if(t~=0) return(-1); MOV A,H ; else return(0); ORA L JNZ CPMIF1 LXI H,0 JMP CPMIF2 CPMIF1: LXI H,-1 CPMIF2: RET ; END *(fd + 36) - fd - 42) % 128 ); } ; ; delay(n) ; int n; ; ; n = number of milliseconds to delay ; DELAY:: POP H ; Return address POP D ; Delay Value PUSH D ; Restore Stack PUSH H ; DELAY1: ;# 51 (overhead) 12.5 usec. LXI B,123 ;# 10 CALL DELAY2 ;# 3963 (17 + 10 + (123 X 32)) DCX D ;# 5 MOV A,D ;# 5 ORA E ;# 4 JNZ DELAY1 ;# 10 RET ;-------- ;    END #define NOCCARGC /* no argument count passing */ #include stdio.h /* ** dtoi -- convert signed decimal string to integer nbr ** returns field length, else ERR on error */ dtoi(decstr, nbr) char *decstr; int *nbr; { int len, s; if((*decstr)=='-') {s=1; ++decstr;} else s=0; if((len=utoi(decstr, nbr))<0) return ERR; if(*nbr<0) return ERR; if(s) {*nbr =U 4 CTRLZ EQU 26 ;control z NULL EQU 0 ;pointer to nothing FCBSIZE EQU 36 ;size, in bytes, of an FCB NEXTP EQU 0 ;offset to next-char. pointer in I/O struct. UNUSED EQU 2 ;offset to unused-pos.-count in I/O struct. BUFFER EQU 6 ;offset to disk sector buf. in I/O struct. UNGOT EQU 5 ;offset to char ungotten by ungetc() FLAG EQU 33 ;file-type flag byte (in unused part of FCB) FREEFLG EQU 128 ;This I/O structure is available for the taking EOF EQU 0FFH ;# END OF FILE BYTE FOR UNGOTTEN CHAR ID EOFFLG.h> ferror(fd) int fd; { char c; c = *(fd + 40); return(c == EOF ? FALSE : c); }  /* ** fflush.c by F. A. Scacchitti 9/15/84 */ #define WRITE 1 #define OPEN 15 #include fflush(fd) int fd; { int unused, charptr; char mode, record, extent; mode = *(fd + 33); if(mode != WRITE) return(NULL); charptr = *(fd + 36); unused = *(fd + 38); extent = *(fd + 12); record = *(fd + 32); if(fclose(fd) != NULL || bdZZDFLT EXTRN ZZSTAK EXTRN ZZMEM ; EXTRN GETCHAR EXTRN CPMIO ; FGETC:: GETC:: POP B POP H ; get args PUSH H PUSH B ; c=cget(unit); PUSH H CALL CGET POP D MOV A,L ; if(c=='\r') ANI 7FH ; /* mask parity in compare */ CPI EOL JNZ GETCRET PUSH H ; cget(unit); PUSH D ; /* to skip LF */ CALL CGET POP H POP H GETCRET: RET ; ; cget(unit) ; CGET:: POP D POP H PUSH H PUSH D MOV A,H ORA A ; if(unit < 256) { JNZ CGET1 ; /* assume stdin */  -*nbr; return ++len;} else return len; } ; exit.mac by F. A. Scacchitti 9 - 18 - 84 ; ; abort(error code) ; ; EXTRN ZZFINI ; EXIT:: ; ABORT:: ; POP B ; throw away return address POP H ; get abort code ORA A ; code passed ? JZ ABORT2 ; no - leave it as is MOV A,L STA ABCODE ; yes - imbed it in the message ABORT2: LXI D,ABTMSG ; Load abort message MVI C,9 CALL 5 JMP ZZFINI ; ABTMSG: DB 0 EQU 2 ;The end of this file has been hit WRTFLG EQU 1 ;This file open for writing BUFSIZ EQU 1024 ;how long the sector buffer is NBUFS EQU 8 ;number of I/O buffers TBUFF EQU 128 ;default cpm buffer LF EQU 10 EOL EQU 13 ; ; CP/M BDOS CALLS ; CLOSE EQU 16 ;close a file CPMSTR EQU 9 ;print '$' delimited string on console CREATE EQU 22 ;make a file DMA EQU 26 ;set DMA (I/O address) DELETE EQU 19 ;delete a file GETCH EQU 1 ;read character from console GETSTR EQU 10 ;read string from console LSos(OPEN,fd) < NULL) return(EOF); *(fd + 36) = charptr; *(fd + 38) = unused; *(fd + 12) = extent; *(fd + 32) = record; *(fd + 33) = mode; return(NULL); } ; ; ; fgetc(unit) by F. A. Scacchitti 11 - 24 - 84 ; ; getc(unit) ; ; CBDOS EQU 5 ;/* bdos entry point */ CPMARG EQU 128 ;/* CP/M command line */ MAXARG EQU 32 ;/* Maximum number of input args */ STDIN EQU 0 STDOUT EQU 1 STDERR EQU 2 STDLST EQ CALL GETCHAR ; getchar(); POP D ;/* return to caller of getc() POP D ; to bypass CR check */ RET ; return; } CGET1: SHLD ZZUNIT LXI D,FLAG ; if(unit[FLAG] & EOF_FL) DAD D MOV A,M ANI EOFFLG JZ GTCIF1 LXI H,-1 ; return(-1); RET GTCIF1: LHLD ZZUNIT ; ip = unit + FCBSIZE; LXI D,FCBSIZE DAD D SHLD ZZIP ; LXI D,UNGOT ;# CHECK FOR UNGOTTEN CHAR. DAD D MOV A,M CPI EOF ;# IS IT EOF ? JZ GTCCON ;# YES-CONTINUE WITH FGETC MOV B,A ;# NO-LET'S GET THE DH, 'Aborted ' ; ABCODE: DB 07,0D,'$' ; END /* ** feof.c by F. A. Scacchitti 11/22/84 ** ** Returns true only if end of file is reached. ** */ #include feof(fd) int fd; { char c; c = *(fd + 40); return(c == EOF ? TRUE : FALSE); } /* ** ferror.c by F. A. Scacchitti 11/22/84 ** ** Returns true only if a file error has occurred. ** */ #include 255 */ ORA A JZ FGETS3 POP D ; cp LHLD ZZSVCH ; if (cp<>save_cp) XCHG ; /* read something */ MOV A!  ; fcbsize() ; ; ; Now then here's the file i/o code ; CBDOS EQU 5 ;/* bdos entry point */ CPMARG EQU 128 ;/* CP/M command line */ MAXARG EQU 32 ;/* Maximum number of input args */ STDIN EQU 0 STDOUT EQU 1 STDERR EQU 2 STDLST EQU 4 CTRLZ EQU 26 ;control z NULL EQU 0 ;pointer to nothing FCBSIZE EQU 36 ;size, in bytes, of an FCB NEXTP EQU 0 ;offset to next-char. pointer in I/O struct. UNUSED EQU 2 ;offset to unused-pos.-count in I/O struct. BUFFER EQU 6 ;offset to disk sector buf. in I/O struc# CLEAR IT ; LHLD ZZIP ;ZZIP[NEXTP]=&ZZIP[BUFFER]; LXI D,BUFFER DAD D XCHG LHLD ZZIP LXI B,NEXTP DAD B MOV M,E INX H MOV M,D LHLD ZZUNIT ; fcb(unit,name); PUSH H LHLD ZZFILE PUSH H CALL FCB POP H POP H LHLD ZZUNIT ; cpmdisk(*unit); MOV L,M MVI H,0 PUSH H CALL CPMDISK POP H LHLD ZZMODE ;if(*mode=='R'||*mode=='A'){ MOV A,M ; ANI 5FH ;# CONVERT TO UPPERCASE CPI 'R' ;# MODE = R ? JNZ FOPIF1 ; FOPIF0: MVI C,OPEN ; if(cpm(OPEN,unit)<0){ ZZCHP EXTRN ZZDP EXTRN ZZFILE EXTRN ZZMODE EXTRN ZZCH EXTRN ZZT EXTRN ZZFN EXTRN ZZNUBU EXTRN ZZMXSC EXTRN ZZSVCH ; ; ; ; Characteristics variable storage found in ulink() ; ; EXTRN ZZDFLT EXTRN ZZSTAK EXTRN ZZMEM EXTRN ZZTEMP ; ; Start of file buffers found at end of program ; EXTRN GRABIO EXTRN FREEIO EXTRN CPMIO EXTRN CPMDISK ; ; Required to set buffer in append mode ; EXTRN PUTC ; ; Default disk I/O buffer ; EXTRN ZZBUF ; ; Storage variables used by append mode ; Cod to cbdos(fas)) ORA A JP FOPIF3 LHLD ZZUNIT ; freeio(unit); PUSH H CALL FREEIO POP H LXI H,NULL ; return(NULL); RET ; } FOPIF3: LHLD ZZIP ; ZZIP[UNUSED] = BUFSIZ; LXI D,UNUSED DAD D LXI D,BUFSIZ MOV M,E INX H MOV M,D LHLD ZZUNIT ; unit[FLAG] = WRITE_FL; LXI D,FLAG DAD D MVI A,WRTFLG ORA M MOV M,A JMP FOPIF4 ; } FOPIF5: LHLD ZZUNIT ; else{ freeio(unit); PUSH H CALL FREEIO POP H LXI H,NULL ; return(NULL); RET ; ; } FOPIF4: t. UNGOT EQU 5 ;offset to char ungotten by ungetc() FLAG EQU 33 ;file-type flag byte (in unused part of FCB) FREEFLG EQU 128 ;This I/O structure is available EOF EQU 0FFH EOFFLG EQU 2 ;The end of this file has been hit WRTFLG EQU 1 ;This file open for writing BUFSIZ EQU 1024 ;how long the sector buffer is NBUFS EQU 8 ;number of I/O buffers TBUFF EQU 128 ;default cpm buffer LF EQU 10 EOL EQU 13 ; ; CP/M BDOS CALLS ; CLOSE EQU 16 ;close a file CPMSTR EQU 9 ;print '$' delimited string on conso LHLD ZZUNIT XCHG CALL CBDOS ; (mod to€cbdos (fas)) ORA A JP FOPIF2 LHLD ZZUNIT ; freeio(unit); PUSH H CALL FREEIO POP H LXI H,NULL ; return(NULL); RET ; } FOPIF2: LHLD ZZIP ; ZZIP[UNUSED] = 0; LXI D,UNUSED DAD D LXI D,0 MOV M,E INX H MOV M,D ; } JMP FOPIFX FOPIF1: ; else if(*mode=='W'){ LHLD ZZMODE MOV A,M ANI 5FH CPI 'W' ;# WRITE MODE ? JZ FOPIFA ;# YES - GO DO IT CPI 'A' ;# APPEND MODE ? JNZ FOPIF5 ;# NO - BACK TO CALLER OF FOPURREC: DB 0 CUREXT: DB 0 OLDREC: DB 0 OLDEXT: DB 0 ; ; fopen(name,mode) ; FOPEN:: ; POP B ;get args POP H ;mode SHLD ZZMODE POP D XCHG SHLD ZZFILE PUSH H PUSH D PUSH B CALL GRABIO ; unit = grabio(); SHLD ZZUNIT MOV A,H ; if(unit==NULL) ORA L ; return(NULL); RZ LXI D,FCBSIZE ; ZZIP = unit+FCBSIZE; DAD D SHLD ZZIP ; LXI D,UNGOT ;# OFFSET TO UNGOTTEN CHAR DAD D MVI M,0FFH ;# EOF TO AVOID EXTRA CHAR ; DCX H ;# POINT TO ERROR BYTE MVI M,0 ;; LHLD ZZMODE ;# MOV A,M ;# GET MODE ANI 5FH CPI 'A' ;# APPEND MODE ? JNZ FOPIFX ;# NO - RETURN NORMALLY ; AMSCRD: ; LDA CUREXT ;# SAVE EXTENT AND RECORD NUMBERS STA OLDEXT ;# TWO DEEP LDA CURREC STA OLDREC LHLD ZZUNIT LXI D,12 DAD D MOV A,M ;# GET CURRENT EXTENT # STA CUREXT LXI D,20 DAD D MOV A,M ;# GET CURRENT RECORD # STA CURREC ; LHLD ZZUNIT ;# YES - LET'S READ TO THE END XCHG ;# DE --> FCB MVI C,READ CALL CBDOS ;# READ A SECTOR ORA A le CREATE EQU 22 ;make a file DMA EQU 26 ;set DMA (I/O address) DELETE EQU 19 ;delete a file GETCH EQU 1 ;read character from console GETSTR EQU 10 ;read string from console LSTOUT EQU 5 ;write character to list device OPEN EQU 15 ;open a file PUTCH EQU 2 ;write character to console QUERY EQU 25 ;get logged-in drive id READ EQU 20 ;read a sector SELECT EQU 14 ;log-in a drive WRITE EQU 21 ;write a sector ; ; ; File i/o storage varibles found in ZZFIO.MAC ; ; EXTRN ZZUNIT EXTRN ZZIP EXTRN EN ; ;# NO MODES LEFT TO TRY ; MVI C,OPEN ;# FIRST LET'S SEE IF IT'S THERE LHLD ZZUNIT XCHG CALL CBDOS ORA A JP FOPIF3 ;# YES - SET IT UP FOR USE ; ;# NO - LET'S MAKE ONE LHLD ZZMODE ;# SET MODE TO 'W' ON NEW FILE MVI M,'W' ;# TO AVOID WASTING TIME AND CODE ;# SEARCHING AN EMPTY FILE ; FOPIFA: MVI C,DELETE ; cpm(DELETE,unit); LHLD ZZUNIT XCHG CALL CBDOS ; (mod to cbdos(fas)) MVI C,CREATE ; if(cpm(CREATE,unit)<0){ LHLD ZZUNIT XCHG CALL CBDOS ; (m"   JZ AMSCRD ;# READ TO PHYSICAL END OF FILE ; LHLD ZZUNIT LXI D,12 DAD D LDA OLDEXT MOV M,A ;# RESTORE LAST EXTENT # LXI D,20 DAD D LDA OLDREC MOV M,A ;# RESTORE LAST RECORD # ; LXI H,ZZBUF SHLD ZZTEMP ;# SAVE THE BUFF. WE'RE READING FROM AMCHRD: LHLD ZZTEMP ;# HL --> TEMPORARY BUFFER MOV A,M ; CPI 0AH ;# LINE FEED CHECK JNZ NOTLF INX H ;# INCREMENT POINTER SHLD ZZTEMP ;# AND GO ON TO NEXT CHARACTER JMP AMCHRD ; NOTLF: CPI 1AH ;# END OF FILE MARKER ? JZ case? */ JC FCBIF2 SUI 61H-41H ; A -= 'a'-'A' JMP FCBIF2 ; } FCBIF1: LDA ZZDFLT ; else A = default_drive; FCBIF2: STAX B ; *fp++ = A; INX B MVI H,' ' ; fp = fcbfill(fp,name,' ',8); MVI L,8 CALL FCBFILL MVI L,3 ; fp = fcbfill(fp,name,' ',3); CALL FCBFILL MVI H,0 ; fp = fcbpad(fp,0,4); MVI L,4 CALL FCBPAD LXI H,16 ; fp[16] = 0; DAD B MVI M,0 RET ; return; ; ; fcbfill(dest,name,pad,size) ; B D H L ; FCBFILL:: MOV A,L ; while(L>0 && (A= *D)~='. D SHLD ZZDP FCLWH1: ; while(cp='a' && A<='z') JC FILL1 CPI 7AH+1 ; 'z' 9 Jun 80 rj JNC FILL1 SUI 61H-41H ; A = A - 'a' + 'A'; FILL1: STAX B ; *B++ = A; INX B INX D ; D++; DCR L ; L--; JMP FCBFILL ; } FILL2: LDAX D ; while(*D~='.' && *D~=0) CPI '.' JZ FILL3 CPI 0 JZ FILL3 INX D ; D++; JMP FILL2 FILL3: CPI '.' ; if(*D=='.') JNZ FILL4 INX D ; D++; FILL4: ; fall into... ; ; fcbpad(dest,paNIT XCHG CALL CBDOS ; (mod tocbdos(fas)) ORA A JP FCLIF5 LXI H,0 ; t = 0; SHLD ZZT FCLIF5: LHLD ZZUNIT ; freeio(unit); PUSH H CALL FREEIO POP H LHLD ZZT ; return(NULL+t); RET ; ; fcb(fp,name) ; FCB:: POP H ;get args POP D ;name POP B ;fp PUSH B PUSH D PUSH H INX D ; if(name[1]==':'){ LDAX D DCX D CPI ':' JNZ FCBIF1 LDAX D ; A = *name - '@'; SUI 40H ; '@' 9 Jun 80 rj INX D ; name += 2; INX D CPI 61H-41H ; if(A>'a'-'A') /* lowerturn(Uprint(stdout, CCARGC() + &argc - 1)); } /* ** Uprint(fd, ctlstring, arg, arg, ...) ** Called by fprintf() and printf(). */ Uprint(fd, nxtarg) int fd, *nxtarg; { int arg, left, pad, cc, len, maxchr, width; char *ctl, *sptr, str[17]; cc = 0; ctl = *nxtarg--; while(*ctl) { if(*ctl!='%') {fputc(*ctl++, fd); ++cc; continue;} else ++ctl; if(*ctl=='%') {fputc(*ctl++, fd); ++cc; continue;} if(*ctl= MVI L,0 RZ ; return NULL; LXI H,1 ; t = 1; SHLD ZZT LHLD ZZUNIT ; if(unit[FLAG] & WRITE_FL){ LXI D,FLAG DAD D MOV A,M ANI WRTFLG JZ FCLIF1 LXI H,CTRLZ ; putc(CTRL_Z,unit); PUSH H LHLD ZZUNIT PUSH H CALL PUTC POP H POP H LHLD ZZUNIT ; ZZIP = unit + FCBSIZE; LXI D,FCBSIZE DAD D SHLD ZZIP LHLD ZZIP ; cp = ZZIP[NEXTP]; LXI D,NEXTP DAD D MOV E,M INX H MOV D,M XCHG SHLD ZZCHP LHLD ZZIP ; ZZDP = &ZZIP[BUFFER]+BUFSIZ; LXI D,BUFFER+BUFSIZ DADd,size) ; B H L ; FCBPAD:: MOV A,L ; while(L>0){ ORA A JZ PAD2 MOV A,H ; *B++ = H; STAX B INX B DCR L ; L--; JMP FCBPAD ; } PAD2: RET ; return; ; ; END #define NOCCARGC /* ** Yes, that is correct. Although these functions use an ** argument count, they do not call functions which need one. */ #include stdio.h /* ** fprintf(fd, ctlstring, arg, arg, ...) - Formatted print. ** Operates as described#  ='-') {left = 1; ++ctl;} else left = 0; if(*ctl=='0') pad = '0'; else pad = ' '; if(isdigit(*ctl)) { width = atoi(ctl++); while(isdigit(*ctl)) ++ctl; } else width = 0; if(*ctl=='.') { maxchr = atoi(++ctl); while(isdigit(*ctl)) ++ctl; } else maxchr = 0; arg = *nxtarg--; sptr = str; switch(*ctl++) { case 'c': str[0] = arg; str[1] = NULL; break; case 's': sptr = arg; break; U 21 ;write a sector ; ; File i/o storage varibles found in ulink() ; EXTRN ZZUNIT EXTRN ZZIP EXTRN ZZCHP EXTRN ZZDP EXTRN ZZFILE EXTRN ZZMODE EXTRN ZZCH EXTRN ZZT EXTRN ZZFN EXTRN ZZNUBU EXTRN ZZMXSC ; ; Characteristics variable storage found in ulink() ; EXTRN ZZSVCH EXTRN ZZDFLT EXTRN ZZSTAK EXTRN ZZMEM ; EXTRN PUTCHAR EXTRN PUTLIST EXTRN CPMIO ; FPUTC:: PUTC:: POP B ;rtn addr POP D ;unit POP H ;c PUSH H PUSH D PUSH B MOV A,D ORA A ; if(unit < 256) { JNZ PUU 2 ;offset to unused-positions-count in I/O structure BUFFER EQU 6 ;offset to disk sector buffer in I/O structure UNGOT EQU 5 ;offset to char ungotten by ungetc() FLAG EQU 33 ;file-type flag byte (in unused part of FCB) FREEFLG EQU 128 ;This I/O structure is available for the taking EOFFLG EQU 2 ;The end of this file has been hit WRTFLG EQU 1 ;This file open for writing BUFSIZ EQU 1024 ;how long the sector buffer is NBUFS EQU 8 ;number of I/O buffers TBUFF EQU 128 ;default cpm buffer LF EQU 10 EZZIP LXI D,NEXTP ; cp = ip[NEXTP]; DAD D MOV E,M INX H MOV D,M XCHG SHLD ZZCHP LHLD ZZIP ; if(ip[UNUSED]==0){ LXI D,UNUSED DAD D MOV A,M INX H ORA M JNZ PTCIF1 LXI H,WRITE ; if(cpmio(WRITE,unit)~=0) PUSH H LHLD ZZUNIT PUSH H CALL CPMIO POP D POP D MOV A,H ORA L JZ PTCIF2 LXI H,-1 ; return(-1); RET PTCIF2: LHLD ZZIP ; else { ip[UNUSED] = BUFSIZ; LXI D,UNUSED DAD D LXI D,BUFSIZ MOV M,E INX H MOV M,D LHLD ZZIP ; cp = &ip[BUFFER case 'd': itoa(arg,str); break; case 'b': itoab(arg,str,2); break; case 'o': itoab(arg,str,8); break; case 'u': itoab(arg,str,10); break; case 'x': itoab(arg,str,16); break; default: return (cc); } len = strlen(sptr); if(maxchr && maxchrlen) width = width - len; else width = 0; if(!left) while(width--) {fputc(pad,fd); ++cc;} while(len--) {fputc(*sptr++,fd); ++cc; } if(left) while(width--) {fputc(paTC4 ; /* assume stdout, stderr */ MOV A,E ; /* or stdlist. */ CPI STDOUT ; if(unit == stdout) { JNZ PUTC1 PUSH H CALL PUTCHAR ; putchar(c); POP H RET ; return;} PUTC1: CPI STDERR ; elseif(unit == stderr) { JNZ PUTC2 CALL PUTCHAR ; putchar(c); RET ; return;} PUTC2: CPI STDLST ; elseif(unit == stdlist) { JNZ PUTC3 PUSH H CALL PUTLIST ; putlist(c); POP H RET ; return;} PUTC3: JMP PTCER1 ; else goto putcerr; } PUTC4: PUSH H ; if(cput(c,unit)<0) PUSH DOL EQU 13 ; ; CP/M BDOS CALLS ; CLOSE EQU 16 ;close a file CPMSTR EQU 9 ;print '$' delimited string on console CREATE EQU 22 ;make a file DMA EQU 26 ;set DMA (I/O address) DELETE EQU 19 ;delete a file GETCH EQU 1 ;read character from console GETSTR EQU 10 ;read string from console LSTOUT EQU 5 ;write character to list device OPEN EQU 15 ;open a file PUTCH EQU 2 ;write character to console QUERY EQU 25 ;get logged-in drive id READ EQU 20 ;read a sector SELECT EQU 14 ;log-in a drive WRITE EQ]; LXI D,BUFFER DAD D SHLD ZZCHP ; } ; } PTCIF1: LHLD ZZIP LXI D,UNUSED ; ip[UNUSED]--; DAD D MOV E,M INX H MOV D,M DCX D MOV M,D DCX H MOV M,E LHLD ZZCHP ; ip[NEXTP] = cp+1; INX H XCHG LHLD ZZIP LXI B,NEXTP DAD B MOV M,E INX H MOV M,D LDA ZZCH ; return((*cp = c) & 0377); LHLD ZZCHP MOV M,A MVI H,0 MOV L,A RET END d,fd); ++cc;} } return(cc); }  ; ; putc(c,unit) ; ; CBDOS EQU 5 ;/* bdos entry point */ CPMARG EQU 128 ;/* CP/M command line */ MAXARG EQU 32 ;/* Maximum number of input args */ STDIN EQU 0 STDOUT EQU 1 STDERR EQU 2 STDLST EQU 4 CTRLZ EQU 26 ;control z NULL EQU 0 ;pointer to nothing FCBSIZE EQU 36 ;size, in bytes, of an FCB NEXTP EQU 0 ;offset to next-character pointer in I/O structure UNUSED EQ ; goto putcerr; CALL CPUT POP D MOV A,H ORA A JM PUTCERR MOV A,L ; if(c=='\r') CPI EOL JNZ PUTCRET LXI H,LF ; cput('\n',unit); PUSH H PUSH D CALL CPUT POP D POP D MOV A,H ORA A JM PUTCERR PUTCRET: POP H ; return(c); RET PUTCERR: ;putcerr: POP B ; return(-1); PTCER1: LXI H,-1 RET ; ; cput(c,unit) ; CPUT:: POP B POP D POP H PUSH H PUSH D PUSH B SHLD ZZCH XCHG SHLD ZZUNIT LXI D,FCBSIZE ; ip = unit + FCBSIZE; DAD D SHLD $   ; ; fputs(cp,unit) ; ; CBDOS EQU 5 ;/* bdos entry point */ CPMARG EQU 128 ;/* CP/M command line */ MAXARG EQU 32 ;/* Maximum number of input args */ STDIN EQU 0 STDOUT EQU 1 STDERR EQU 2 STDLST EQU 4 CTRLZ EQU 26 ;control z NULL EQU 0 ;pointer to nothing FCBSIZE EQU 36 ;size, in bytes, of an FCB NEXTP EQU 0 ;offset to next-character pointer in I/O structure UNUSED EQU 2 ;offset to unused-positions-count in I/O structure BUFFER EQU 6 ;offset to disk sector buffer in I/O structure UNGOT EQU); } #define NOCCARGC /* no argument count passing */ extern char *zzmem; /* ** free(ptr) - Free previously allocated memory block. ** Memory must be freed in the reverse order from which ** it was allocated. ** ptr = Value returned by calloc() or malloc(). ** Returns ptr if successful or NULL otherwise. */ free(ptr) char *ptr; { return (zzmem = ptr); } #asm cfreeXTRN ZZFILE EXTRN ZZMODE EXTRN ZZCH EXTRN ZZT EXTRN ZZFN EXTRN ZZNUBU EXTRN ZZMXSC ; ; Characteristics variable storage found in ulink() ; EXTRN ZZSVCH EXTRN ZZDFLT EXTRN ZZSTAK EXTRN ZZMEM ; EXTRN PUTC ; FPUTS:: POP B POP D ; unit POP H ; cp PUSH H PUSH D PUSH B FPUTS1: MOV A,M ; while((c=*cp++) <> NULL) { INX H ORA A JZ FPUTS3 PUSH H MOV C,A MVI B,0 PUSH B PUSH D CALL PUTC ; if(putc(c,unit)==EOF) POP D POP B MOV A,H ORA A JZ FPUTS2 POP B RETunt, they do not call functions which need one. */ #include stdio.h /* ** fscanf(fd, ctlstring, arg, arg, ...) - Formatted read. ** Operates as described by Kernighan & Ritchie. ** b, c, d, o, s, u, and x specifications are supported. ** Note: b (binary) is a non-standard extension. */ fscanf(argc) int argc; { int *nxtarg; nxtarg = CCARGC() + &argc; return (Uscan(*(--nxtarg), --nxtarg)); } /* ** scanf(ctlstring, arg, arg, ...) - Formatted read. ** Operates as described by Kernighan 5 ;offset to char ungotten by ungetc() FLAG EQU 33 ;file-type flag byte (in unused part of FCB) FREEFLG EQU 128 ;This I/O structure is available for the taking EOFFLG EQU 2 ;The end of this file has been hit WRTFLG EQU 1 ;This file open for writing BUFSIZ EQU 1024 ;how long the sector buffer is NBUFS EQU 8 ;number of I/O buffers TBUFF EQU 128 ;default cpm buffer LF EQU 10 EOL EQU 13 ; ; CP/M BDOS CALLS ; CLOSE EQU 16 ;close a file CPMSTR EQU 9 ;print '$' delimited string on console CREATE E equ free entry cfree #endasm ; ; freeio(unit) by F.A.Scacchitti 9/12/84 ; ; mark a buffer as free. ; ; ; NBUFS EQU 8 FCBSIZE EQU 36 ;size, in bytes, of an FCB BUFFER EQU 6 ;offset to disk sector buffer in I/O structure FLAG EQU 33 ;file-type flag byte (in unused part of FCB) FREEFLG EQU 128 ;This I/O structure is available for the taking BUFSIZ EQU 1024 ;how long the sector buffer is NULL EQU 0 ; return(EOF); FPUTS2: POP H JMP FPUTS1 ; } FPUTS3: LXI H,0 RET ; return(NULL); END FPUTS /* ** fread.c by F.A.Scacchitti 9/3/84 */ fread(buf, sz, n, fd) char *buf; int sz, n, fd; { return(read(fd, buf, n*sz)); }  /* ** frebufc.c by fas 8/30/84 */ #include frebuf(buffer) int buffer; { freeio(buffer-42); return(NULL & Ritchie. ** b, c, d, o, s, u, and x specifications are supported. ** Note: b (binary) is a non-standard extension. */ scanf(argc) int argc; { return (Uscan(stdin, CCARGC() + &argc - 1)); } /* ** Uscan(fd, ctlstring, arg, arg, ...) - Formatted read. ** Called by fscanf() and scanf(). */ Uscan(fd,nxtarg) int fd, *nxtarg; { char *carg, *ctl, *unsigned; int *narg, wast, ac, width, ch, cnv, base, ovfl, sign; ac = 0; ctl = *nxtarg--; while(*ctl) { if(isspace(*ctl)) {++ctl;QU 22 ;make a file DMA EQU 26 ;set DMA (I/O address) DELETE EQU 19 ;delete a file GETCH EQU 1 ;read character from console GETSTR EQU 10 ;read string from console LSTOUT EQU 5 ;write character to list device OPEN EQU 15 ;open a file PUTCH EQU 2 ;write character to console QUERY EQU 25 ;get logged-in drive id READ EQU 20 ;read a sector SELECT EQU 14 ;log-in a drive WRITE EQU 21 ;write a sector ; ; File i/o storage varibles found in ulink() ; EXTRN ZZUNIT EXTRN ZZIP EXTRN ZZCHP EXTRN ZZDP E ; EXTRN IOBUFS ; ; FREEIO:: ;Mod 6 May 80 rj POP B ;save rtn addr POP H ;get buffer addr PUSH H ;put the stack back together PUSH B LXI D,FLAG ;find flag byte DAD D MVI M,FREEFLG ;mark buffer as 'free' LXI H,NULL ;return something RET END #define NOCCARGC /* no argument count passing */ /* ** Yes, that is correct. Although these functions use an ** argument co%   continue;} if(*ctl++ != '%') continue; if(*ctl == '*') {narg = carg = &wast; ++ctl;} else narg = carg = *nxtarg--; ctl += utoi(ctl, &width); if(!width) width = 32767; if(!(cnv = *ctl++)) break; while(isspace(ch = fgetc(fd))) ; if(ch == EOF) {if(ac) break; else return(EOF);} ungetc(ch,fd); switch(cnv) { case 'c': *carg = fgetc(fd); break; case 's': while(width--) { if((*carg = fgetc(fd)) == EOF) number of input args */ STDIN EQU 0 STDOUT EQU 1 STDERR EQU 2 STDLST EQU 4 CTRLZ EQU 26 ;control z NULL EQU 0 ;pointer to nothing FCBSIZE EQU 36 ;size, in bytes, of an FCB NEXTP EQU 0 ;offset to next-character pointer in I/O structure UNUSED EQU 2 ;offset to unused-positions-count in I/O structure BUFFER EQU 6 ;offset to disk sector buffer in I/O structure UNGOT EQU 5 ;offset to char ungotten by ungetc() FLAG EQU 33 ;file-type flag byte (in unused part of FCB) FREEFLG EQU 128 ;This I/O structusigned; } ++ac; } return (ac); } /* ** fwrite.c by F.A.Scacchitti 9/3/84 */ fwrite(buf, sz, n, fd) char *buf; int sz, n, fd; { return(write(fd, buf, n*sz)); } #define NOCCARGC /* no argument count passing */ /* * getchar() Normal console input via BDOS(1) */ #include gnd in ulink() ; EXTRN ZZSVCH EXTRN ZZDFLT EXTRN ZZSTAK EXTRN ZZMEM ; EXTRN GETC ; GETS:: POP B POP H PUSH H PUSH B SHLD ZZCHP DCX H ; save = buff[-1]; save2 = buff[-2]; MOV D,M ; buff[-1] = 0; buff[-2] = 79; MVI M,0 DCX H MOV E,M MVI M,79 ;6 May 80 rj PUSH H PUSH D XCHG ; cpm(GETSTR,buff-2); MVI C,GETSTR CALL CBDOS ; (mod to cbdos(fas)) LHLD ZZCHP ; buff[buff[-1]] = 0; (9 Jun 80. Was cp) DCX H MOV E,M INX H MVI D,0 DAD D MVI M,0 POP D  break; if(isspace(*carg)) break; if(carg != &wast) ++carg; } *carg = 0; break; default: switch(cnv) { case 'b': base = 2; sign = 1; ovfl = 32767; break; case 'd': base = 10; sign = 0; ovfl = 3276; break; case 'o': base = 8; sign = 1; ovfl = 8191; break; case 'u': base = 10; sign = 1; ovfl = 6553; break; case 'x': base = 16; sign = 1; ovfl = 4095; break; default: returnre is available for the taking EOFFLG EQU 2 ;The end of this file has been hit WRTFLG EQU 1 ;This file open for writing BUFSIZ EQU 1024 ;how long the sector buffer is NBUFS EQU 8 ;number of I/O buffers TBUFF EQU 128 ;default cpm buffer LF EQU 10 EOL EQU 13 ; ; CP/M BDOS CALLS ; CLOSE EQU 16 ;close a file CPMSTR EQU 9 ;print '$' delimited string on console CREATE EQU 22 ;make a file DMA EQU 26 ;set DMA (I/O address) DELETE EQU 19 ;delete a file GETCH EQU 1 ;read character from console GETSetchar(){ char c; c = bdos(1,0); if(c == 26) return(-1); else return(c); } /* ** getchx() Direct console input via BDOS(6) */ #include getchx() { char c; while(!(c = bdos(6,255))); return(c); }  ; ; gets(buff) ; ; CBDOS EQU 5 ;/* bdos entry point */ CPMARG EQU 128 ;/* CP/M command line */ MAXARG EQU 32 ;/* Maximum ; buff[-1] = save; buff[-2] = save2; POP H MOV M,E INX H MOV M,D INX H MVI C,PUTCH ; putchar('\n'); MVI E,LF CALL CBDOS ; (mod to cbdos(fas)) LHLD ZZCHP ; return(buff); RET ; } END GETS ; ; grabio() by F.A.Scacchitti 9/18/84 ; ; find an input buffer, and return its address. ; if there isn't one, return a NULL. ; ; NBUFS EQU 8 FCBSIZE EQU 36 ;size, in bytes, of an FCB BUFFER EQU 6 ;offset to disk sector buffer in I/O structure  (ac); } *narg = unsigned = 0; while(width-- && !isspace(ch=fgetc(fd)) && ch!=EOF) { if(!sign) if(ch == '-') {sign = -1; continue;} else sign = 1; if(ch < '0') return (ac); if(ch >= 'a') ch -= 87; else if(ch >= 'A') ch -= 55; else ch -= '0'; if(ch >= base || unsigned > ovfl) return (ac); unsigned = unsigned * base + ch; } *narg = sign * unTR EQU 10 ;read string from console LSTOUT EQU 5 ;write character to list device OPEN EQU 15 ;open a file PUTCH EQU 2 ;write character to console QUERY EQU 25 ;get logged-in drive id READ EQU 20 ;read a sector SELECT EQU 14 ;log-in a drive WRITE EQU 21 ;write a sector ; ; File i/o storage varibles found in ulink() ; EXTRN ZZUNIT EXTRN ZZIP EXTRN ZZCHP EXTRN ZZDP EXTRN ZZFILE EXTRN ZZMODE EXTRN ZZCH EXTRN ZZT EXTRN ZZFN EXTRN ZZNUBU EXTRN ZZMXSC ; ; Characteristics variable storage fou&   FLAG EQU 33 ;file-type flag byte (in unused part of FCB) FREEFLG EQU 128 ;This I/O structure is available for the taking BUFSIZ EQU 1024 ;how long the sector buffer is NULL EQU 0 TBUFSZ EQU 128 ; Default buffer size ; EXTRN ZZBUF ; GRABIO:: ;6 May 80 rj MVI B,NBUFS LXI H,ZZBUF+TBUFSZ+FLAG LXI D,FCBSIZE+BUFFER+BUFSIZ MVI A,FREEFLG GRAB2: CMP M ;flag byte == freeflg? JZ GRAB3 ;if so, found a free buffer DAD D ;on to next buffer DCR B JNZ GRAB2 ;if there is one... L/* ** return 'true' if c is a decimal digit */ isdigit(c) int c; { return (c<='9' && c>='0'); } /* ** return 'true' if c is a graphic character ** (33-126) */ isgraph(c) int c; { return (c>=33 && c<=126); } /* ** return 'true' if c is lower-case alphabetic */ islower(c) int c; { return (c<='z' && c>='a'); } /* ** return 'true' if c is a printable character ** (32-126) */ isprint(c) int c; { return (c>=32 && c<=126); } ) || (c<='9' && c>='0')); } /* ** return 'true' if c is alphabetic */ isalpha(c) int c; { return ((c<='z' && c>='a') || (c<='Z' && c>='A')); } /* ** return 'true' if c is an ASCII character (0-127) */ isascii(c) char *c; { /* c is a simulated unsigned integer */ return (c <= 127); }  n; { int sign; char *ptr; ptr = s; if ((sign = n) < 0) /* record sign */ n = -n; /* make n positive */ do { /* generate digits in reverse order */ *ptr++ = n % 10 + '0'; /* get next digit */ } while ((n = n / 10) > 0); /* delete it */ if (sign < 0) *ptr++ = '-'; *ptr = '\0'; reverse(s); } #define NOCCARGC /* no argument count passing */ /* ** itoab(n,s,b) - Convert "unsigned" n to characters in s using base b. XI H,NULL ;there ain't RET ;give up ; GRAB3: MVI M,0 ;mark buffer as taken LXI D,-FLAG ;back up to buffer start DAD D RET ;and hand it back ; END  /* ** grabufc.c by fas 8/30/84 */ #include grabuf() { int buf; if((buf = grabio) != NULL) return(buf+42); return(NULL); } #define NOCCARGC /* no argument count passing */ /* ** return 'true' if c is a punctuation character ** (all but control and alphanumeric) */ ispunct(c) int c; { return (!isalnum(c) && !iscntrl(c)); } /* ** return 'true' if c is a white-space character */ isspace(c) int c; { /* first check gives quick exit in most cases */ return(c<=' ' && (c==' ' || (c<=13 && c>=9))); } /* ** Return "true" if fd is a device, else "false" */ #include isatty(fd) int fd; { if(fd >255) return(FALSE); else return(TRUE); } /* ** return 'true' if c is a control character ** (0-31 or 127) */ iscntrl(c) char *c; { /* c is a simulated unsigned integer */ return ((c <= 31) || (c == 127)); } ** NOTE: This is a non-standard function. */ itoab(n, s, b) int n; char *s; int b; { char *ptr; int lowbit; ptr = s; b >>= 1; do { lowbit = n & 1; n = (n >> 1) & 32767; *ptr = ((n % b) << 1) + lowbit; if(*ptr < 10) *ptr += '0'; else *ptr += 55; ++ptr; } while(n /= b); *ptr = 0; reverse (s); }  ; inp(port#) ; Added 2/84 (fas) INP:: INX SP ; Skip over return address INX SP POP B ; Load port # into C DB 0EDH, 068H ; Do instruction PUSH B ; Restore stack DCX SP DCX SP MOV A,L ; Data was returned in L RLC ; Sign extend HL SBB A ; MOV H,A ; That's it RET END /* ** return 'true' if c is alphanumeric */ isalnum(c) int c; { return ((c<='z' && c>='a') || (c<='Z' && c>='A'/* ** return 'true' if c is upper-case alphabetic */ isupper(c) int c; { return (c<='Z' && c>='A'); } /* ** return 'true' if c is a hexadecimal digit ** (0-9, A-F, or a-f) */ isxdigit(c) int c; { return ((c<='f' && c>='a') || (c<='F' && c>='A') || (c<='9' && c>='0')); } #define NOCCARGC /* no argument count passing */ /* ** itoa(n,s) - Convert n to characters in s */ itoa(n, s) char *s; int'  /* ** uw.c File Copy & UW(Bin) Program by F.A.Scacchitti 9/23/84 ** ** Written in Small-C Version 2.09 or later ** ** Copies file from file to file ** Un-wordstars as it goes */ #include #define BUFSIZE 8192 main(argc,argv) int argc, argv[]; { int fdin, fdout; /* file i/o channel pointers */ int i, j, count; char *inbuf; i = 0; inbuf = malloc(BUFSIZE); if(argc != 3) { puts("\nfc usage: fc \n"); exit(); } if((fdin ars, hi_totchars, totwords, totlines; main(argc,argv) int argc, argv[]; { if(argc == 1) { prntf("\n\nUsage: wc . . . \n\n"); exit(); } else prntf("\n\t\tchars\twords\tlines\n\n"); while (--argc) dofile(*++argv); /* process the files */ prntf("\nTotals:"); /* print the results */ if (hi_totchars) prntf("\t\t%d%04d",hi_totchars,lo_totchars); else prntf("\t\t%d",lo_totchars); prntf("\t%d\t%d\n",totwords,totlines); } dofile(namå= fopen(argv[1],"r")) == NULL) { puts("\nUnable to open input file.\n"); exit(); } if((fdout = fopen(argv[2],"w")) == NULL) { puts("\nUnable to create output file.\n"); exit(); } while((count = read(fdin,inbuf,BUFSIZE)) == BUFSIZE) { for(j = 0; j < BUFSIZE; j++) inbuf[j] = inbuf[j] & 127; write(fdout,inbuf,count); i += count; } i += count; for(j = 0; j < count % BUFSIZE; j++) inbuf[j] = inbuf[j] & 127; write(fdout,inbuf,coe) char *name; { char inword; int c; int lo_tch, hi_tch, twords, tlines; ibuf = (fopen(name,"R")); if (ibuf == NULL) { prntf("Can't open %s\n",name); return; } prntf("%s:\t",name); if (strlen(name) < 7) putchar('\t'); inword = lo_tch = hi_tch = twords = tlines = 0; while ((c =fgetc(ibuf)) != EOF ) { if (++lo_tch == 10000) { lo_tch = 0; hi_tch++; } if (isspace(c)) { if (inword) { inword = 0; twords++; } } else if (!inwor/* ** WC.C ** Written by Leor Zolman, 3/16/82 ** ** Modified for Small-C by F.A.Scacchitti ** 9/23/84 ** ** ** Text analysis utility. Given a list of text files, WC prints ** out total number of characters, words and lines in each file ** and in all files together. "Words", here, are simply delimited ** by blanks, tabs or newlines. ** ** Maximum number of words and lines are each 32767, but the char ** count is virtually unlimited. ** */ #include int ibuf, lo_totchåunt); fclose(fdin); fclose(fdout); } d) inword = 1; if (c == '\n') tlines++; } if (hi_tch) prntf("%d%04d",hi_tch,lo_tch); else prntf("%d",lo_tch); prntf("\t%d\t%d\n",twords,tlines); if ((lo_totchars += lo_tch) >= 10000) { lo_totchars -= 10000; hi_totchars++; } hi_totchars += hi_tch; totwords += twords; totlines += tlines; fclose(ibuf); }