IMD 1.16: 31/05/2007 20:02:17 FOGCPM.113 --FOGCPM113CBIOSDEFHQ RUNTIME ASM] RUNTIME TXTSTDLIB ASM !"#STDLIB ASM>$%&'()*+-CPM115 DOC-07-00 86 STDLIB20DOC ,-STDLIB20TXT./0C DOC1234C-LANG2 DOC5CCREF COM}6789:;<=>?@ABCDECCREF DOCFGGREP COMPHIJKLMNOPQGREP DOCRSTGREP C @UVWXYZ[\TOOLS CQ N]^_`abcdefTOOLS H ghijPROBE102COMklmnopqrstuvwxyzPROBE102COM{-CPM113 DOCPROBE102DOC6|}~ASCTOBINCQ BDOSDEF HQ FUNCTIONASMPROBE102CQ cPROBE102SUBPROBE102UPDPROBSDPBCQ RPROBSERNCQ PROBSIGNCQ This is the disk name. vCBIOSDEF.HT  !"#$%&o'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSW,Q{갘ᚲtRH qKa>3GCl 9ԈNMT=J j2,ZSjXxvq4C6YޖFD%`vFPF R5e_-K[T-RrKؐ"de{Q pB )shHc1|Wp|>gҝ:l'N=R5el Bq8s !D :cKD EQY ,a:\8eؒ7QE/HA:pB)KG/K9[ѼmFIA[&)NjMY:aD-[ѼkFIA(д7QE/HvPkCq8-() 4m'MT Rg)Ԛtzޣe͋IAVzD Y )0ǣ!_Y qaU#hJOޓ1,ZSmP<{q4/[vKBE= -Pkf3-hJZ#[g)Ԛtٴ\^|{#h!?u8K֔#̦lÀbdP0$` ~E Pkfz q4ù!GDR5e5g8y7J C^XR5e/ 8m7J C^XRH!|8֤a֨>܀jMY:a--q4û~ClJi4m'8+Pkf~ytq4BEg(>HK*pB )s&/O77?% =9-8Ka>3 6LQt V4V;C:Aw* Y ,aZ̖8E !ĩ0"fx- Pk?fK`xbdߐ?BS'`D͈ݍ,eT;hJO,ZSq1[K#h~CۉS'`D͈ݍ,eT;hJO,ZSp=^{#h D7QE/HA2 W%jMY:pu8j!2/D ,4m'R5e.B12:#"c`34Gh%W%jMY:ryX8y CW`3C^XeY ,9q4kV]Τ3>t*%iJ݁jMY:zzBzbdMEOU~詷jUi8K֔#, ųq4w$` |iPkfzZ{#h- [*#>|@\[vY ,a6-_]}(FT/[詷jUtGdFzn Pk>'K#h- [*#\ׯHdF[e R5e=q4硅"CjK*NEa8K֔#\Lbd͹jȐڒF "tY ,bM++#h -id;)BgB q`8Dzğ?uAeiPkfzZ/.~ޣG3h1@OU; pB)KGxX\^^O 8@12fx⚶lYJwR5erF1/Q[DTR5eaFq[ݣGS -fžK,ZS0}<,/W(j@12ZL7R+)%IY ,aq-.'cUGS[:cK) #8K֔#~ϖpuX3q4v3zH'+ i-5V pB)KG8\_N(GSm8 i],!uI8)IwY )B )g)I(Ļ'0$p b?]BZ1,^ik_I?n&![ s#r!@ ~#fos#r!@ ^#Vr+sn!@ ^#Vr+s떎p=^{#h D7QE/HA2 W%jMY:pu8j!2/D ,4m'R5e.B12:#"c`34Gh%W%jMY:ryX8y CW`3C^XeY ,9q4kV]Τ3>t*%iJ݁jMY:zzBzbdMEOU~詷jUi8K֔#, ųq4w$` |iPkfzZ{#h- [*#>|@\[vY ,a6-_]}(FT/[詷jUtGdFzn Pk>'K#h- [*#\ׯHdF[e R5e=q4硅"CjK*NEa8K֔#\Lbd͹jȐڒF "tY ,bM++#h -id;)BgB q`8Dzğ?uAeiPkfzZ/.~ޣG3h1@OU; pB)KGxX\^^O 8@12 title runtime package for small "C" ram equ 0 ;start of ram in system extrn main ;******************************************************** ; * ; run time libray for small c compiler * ; * ; by Ron Cain * ; * ;******************************************************** ; ; fetch a single byte from stack pointer plus ; offset of byte following call and sign extend ; into hl ; @gcharss:csect pop b ldax b mov l,a inx b mvi h,0 dad sp push b mov a,m jmp @sxt ; ; fetch a single byte from stack plus a 2 byte offset ; and sign extend byte into hl ; @gcharsl:csect pop b ldax b mov l,a inx b ldax b mov h,a inx h dad sp push b mov a,m jmp @sxt ; ; fetch a single byte from address in hl and ; sign extend into hl ; @gchar: csect mov a,m jmp @sxt ; ; put the accum into hl and sign extend through h ; @sxt: csect mov l,a rlc sbb a mov h,a ret ; ; fetch a full 16-bit integer from offset plus stack pointer ; into hl ; @gintss:csect pop b ldax b mov l,a mvi h,0 inx b dad sp push b mov a,m inx h mov h,m mov l,a ret ; ; fetch a 16-bit integer from stack pointer plus ; a 16 bit offset and put value in hl ; @gintsl:csect pop b ldax b mov l,a inx b ldax b mov h,a inx b dad sp push b mov a,m inx h mov h,m mov l,a ret ; ; fetch a full 16-bit integer from the address in hl ; into hl ; @gint: csect mov a,m inx h mov h,m mov l,a ret ; ; store a byte stack plus 8 byte offset ; @pcharss:csect xchg pop b ldax b mov l,a mvi h,0 inx b dad sp mov m,e xchg push b ret ; ; store a byte at stack plus offset ; @pcharsl:csect xchg pop b ldax b mov l,a inx b ldax b mov h,a inx b dad sp mov m,e xchg push b ret ; ; store 16-bit integer at offset plus stack ; @pintss:csect xchg pop b ldax b mov l,a mvi h,0 inx b dad sp mov m,e inx h mov m,d xchg push b ret ; ; store a 16 bit integer in hl at stack plus offset ; @pintsl:csect xchg pop b ldax b mov l,a inx b ldax b mov h,a inx b dad sp mov m,e inx h mov m,d push b xchg ret ; ; store a 16-bit integer in hl at the address in de ; @pint: csect mov a,l stax d inx d mov a,h stax d ret page @incdec:csect ; ; take the address in hl and add value that follow and save back ; address in hl ; @preinc: call @incdecl call @inc nop ret ; ; take the address in hl and sub value that follow and ; save it back in place ; @predec: call @incdecl call @dec nop ret ; ; take the address in hl and sub value that follow and save ; back in address in hl and restore value to pre inc ; @postinc: call @incdecl push d call @inc pop h nop ret ; ; take the address in hl and add value that follow and ; save back in address in hl restore value pre dec ; @postdec: call @incdecl push d call @dec pop h nop ret ; ; load needed valut for inc and dec ; @incdecl: pop d pop b ldax b inx b push b push d dcx b ora a jp @incdec1 mov e,m inx h mov d,m ret @incdec1: mov e,m mov a,e rlc sbb a mov d,a ret ; ; add value in a to de and save at address in hl ; @inc: ani 07fh add e mov e,a mov a,d aci 0 mov d,a jmp @incdecs ; ; subtract value in a to de and save at address in hl ; @dec: ani 07fh cma inr a add e mov e,a mov a,d aci 0ffh mov d,a jmp @incdecs ; ; store value in de at address in hl ; @incdecs: ldax b ora a jp @incdec2 mov m,d dcx h mov m,e xchg mov a,h ora l ret @incdec2: mov m,e xchg mov a,h ora l ret page ; ; inclusive "or" hl and de into hl ; @or: csect pop b pop d push b mov a,l ora e mov l,a mov a,h ora d mov h,a ora l ret ; ; excluseive "or" hl and de into hl ; @xor: csect pop b pop d push b mov a,l xra e mov l,a mov a,h xra d mov h,a ora l ret ; ; "and" hl and de into hl ; @and: csect pop b pop d push b mov a,l ana e mov l,a mov a,h ana d mov h,a ora l ret ; ; in all the following compare routines hl is set to 1 ; if the condition is true, otherwise it is set to 0 ; ; not current condition ; @nlog: csect mov a,h ora l jnz @nlog1 lxi h,1 mov a,h ora l ret @nlog1: lxi h,0 mov a,h ora l ret page @comp: csect ; ; test if hl equal to de ; @eq: pop b pop d push b lxi b,@compret push b call @cmp rz dcx h ret ; ; test if de to hl for not equal ; @ne: pop b pop d push b lxi b,@compret push b call @cmp rnz dcx h ret ; ; test if de greater then hl (signed) ; @gt: pop b pop d push b lxi b,@compret push b xchg call @cmp rc dcx h ret ; ; test if de less then hl (signed) ; @lt: pop b pop d push b lxi b,@compret push b call @cmp rc dcx h ret ; ; test if de greater then or equal to hl (signed) ; @ge: pop b pop d push b lxi b,@compret push b call @cmp rz rnc dcx h ret ; ; test if de less than or equal to hl (signed) ; @le: pop b pop d push b lxi b,@compret push b call @cmp rz rc dcx h ret page ; ; test if de greater than hl (unsigned) ; @ugt: pop b pop d push b lxi b,@compret push b xchg call @ucmp rc dcx h ret ; ; test if de less than hl(unsigned) ; @ult: pop b pop d push b lxi b,@compret push b call @ucmp rc dcx h ret ; ; test if de greater than or equal to hl (unsigned) ; @uge: pop b pop d push b lxi b,@compret push b call @ucmp rnc dcx h ret ; ; test if de less than or equal to hl (unsigned) ; @ule: pop b pop d push b lxi b,@compret push b call @ucmp rz rc dcx h ret ; ; common routine to preform a signed compare of ; de and hl ; ; de-hl and sets the conditions: ; carry set means de < hl ; zero/non-zero set according to equality ; @cmp: mov a,e sub l mov e,a mov a,d sbb h lxi h,1 jm @cmp1 ora e ret @cmp1: ora e stc ret ; ; common routine to perform unsinged compare ; ; carry set if de less than hl ; zero/non-zero set accordingly hl=de ; @ucmp: mov a,d cmp h jnz @ucmp1 mov a,e cmp l @ucmp1: lxi h,1 ret ; ; set machine status for all comditional operators ; @compret: mov a,h ora l ret page ; ; shift de arithmetically right by hl return in hl ; @asr: csect pop b pop d push b @asr1: xchg mov a,h ral mov a,h rar mov h,a mov a,l rar mov l,a dcr e jnz @asr1 ret ; ; shift de arithmetically left by hl and return in hl ; @asl: csect pop b pop d push b @asl1: xchg dad h dcr e jnz @asl1 ret ; ; subtract hl from de and return in hl ; @sub: csect pop b pop d push b mov a,e sub l mov l,a mov a,d sbb h mov h,a ret ; ; from the two's complement of hl ; @neg: csect call @com inx h ret ; ; from the one's complement of hl ; @com: csect mov a,h cma mov h,a mov a,l cma mov l,a ret ; ; mutiply de by hl and return in hl (signed) ; @mult: csect pop b pop d push b mov b,h mov c,l lxi h,0 @mult1: mov a,c rrc jnc @mult2 dad d @mult2: xra a 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 @mult1 ; ; divide de by hl and return quotient in hl ; return remainder in de (signed) ; @div: csect pop b pop d push b mov b,h mov c,l mov a,d xra b push psw mov a,d ora a cm @deneg mov a,b ora a cm @bcneg mvi a,16 push psw xchg lxi d,0 @div1: dad h call @rdel jz @div2 call @cmpbcde jm @div2 mov a,l ori 1 mov l,a mov a,e sub c mov e,a mov a,d sbb b mov d,a @div2: pop psw dcr a jz @div3 push psw jmp @div1 @div3: pop psw rp call @deneg xchg call @deneg xchg ret ; ; negate the integer in bc (used by divide only) ; @deneg: mov a,d cma mov d,a mov a,e cma mov e,a inx d ret ; ; negate then integer in bc (used by divide only) ; @bcneg: mov a,b cma mov b,a mov a,c cma mov c,a inx b ret ; ; roate de left one bit (used by divide only) ; @rdel: mov a,e ral mov e,a mov a,d ral mov d,a ora e ret ; ; compare bc to de (used by divide only) ; @cmpbcde: mov a,e sub c mov a,d sbb b ret ; ; used by switch to search table ; calling format form compiler ; d-pointer to table ; h-where to go if value not in table ; b- number of entry in table ; @switch:csect xthl ;get value of expresstion to check xchg ;put value in de @switch1: mov a,e cmp m ;check to see if low byte match inx h ;move pointer to next byte of data jnz @switch2 ;no nov to next entry mov a,d ;move high byte of data cmp m ;check to see if match jnz @switch2 ;yes jump to address inx h mov e,m ;get low byte of address inx h mov d,m ;get high byte of address xchg ;put address in hl pop b ;remove entry from stack pchl ;jump to needed case statement @switch2: inx h ;move pointer to next entry inx h inx h dcr b ;check to see if done with scan jnz @switch1 xthl ;get address of where to go when done pop b ;remove entry from stack pchl ;go there ; ; call a bios routine with be loaded ; bios: csect pop h pop b pop d push d push b push h lhld 1 dcx h dcx h dcx h mvi d,0 dad d dad d dad d call bios1 mov l,a mvi h,0 ret bios1: pchl ; ; call bods to do a cpm function bods(c,de) ; bdos: csect pop h pop d pop b push b push d push h jmp 5 ; ; exit back to system ; exit: csect mvi c,0 call 5 ; ; take command buffer and build pointer list @init: csect lhld 6+ram ;get pointer to high memory dcx h ;move to just below bdos sphl ;make it current stack lxi h,80h+ram ;pointer to start of command buffer mov e,m ;number of bytes in command line mvi d,0 ;make it 16 bit value dad d ;point to end of text inx h ;move past end of buffer mvi m,0 ;make end of text lxi d,cpointer ;place where pointer should place lxi h,80h+ram ;address of text string lxi b,1 ;number of arg @init2: inx h ;move pointer to next byte mov a,m ;check for end of buffer ora a ;set machine status jz @init10 ;yes call main line cpi ' ' ;is there a leading space jz @init2 ;yes mov a,l ;save pointer value stax d mov a,h inx d stax d inx d inr c ;add 1 to arg count @init3: inx h ;move to next byte mov a,m ;get byte into a ora a ;see if end of buffer jz @init10 ;yes... cpi ' ' ;check for space jnz @init3 ;no keep looking mvi m,0 ;mark as end of parm jmp @init2 ;loop for next command @init10: lxi h,cpointer-2 ;get address of pointers push b ;push argc on stack push h ;push argv on stack call main ;execute main line jmp 0 ;it just return from main exit to cpm dw @ccnull cpointer: dw @ccnull,@ccnull,@ccnull,@ccnull,@ccnull dw @ccnull,@ccnull,@ccnull,@ccnull,@ccnull dw @ccnull,@ccnull,@ccnull,@ccnull,@ccnull dw @ccnull,@ccnull,@ccnull,@ccnull,@ccnull dw @ccnull,@ccnull,@ccnull,@ccnull,@ccnull @ccnull: db 'noname',0 page @oeq equ @eq-@comp @one equ @ne-@comp @ogt equ @gt-@comp @olt equ @lt-@comp @oge equ @ge-@comp @ole equ @le-@comp @ougt equ @ugt-@comp @oult equ @ult-@comp @ouge equ @uge-@comp @oule equ @ule-@comp @oprei equ @preinc-@incdec @opred equ @predec-@incdec @oposi equ @postinc-@incdec @oposd equ @postdec-@incdec end  ;check for space jnz @init3 ;no keep looking mvi m,0 ;mark as end of parm jmp @init2 ;loop for next command @init10: lxi h,cpointer-2 ;get address of pointers push b ;push argc on stack push h ;push argv on stack call main ;execute main line jmp 0 ;it just return from main exit to cpm dw @ccnull cpointer: dw @ccnull,@ccnull,@ccnull,@ccnull,@c$EMAI@GCHARS @GCHARS @GCHA@SX@GINTS" @GINTS/@GIN=@PCHARSB @PCHARSN @PINTS[@PINTSi@PINx@INCDE~b@O @XO @AN @NLO@COM@AS@AS @SU $E @NE@CO@MUL#@DI a@SWITClBIOBDO EXI@INI$T o&9~$R $T o g#9~$R $T~$R$Tog$T " o&9~#fo$T/ o g9~#fo$T=~#fo$T B o&9s$T N o g9s$T [ o&9s#r$T i o g9s#r$T x}|$T 9~͢ͷ͢͢ͷ͢  ^#V^{W$T )_zW/<_zW r+s|s|$R         - B O T $T }o|g$T }o|g$T }o|g$T| !|!|$R$T9͙+͙+͙+͙+$T9J͙+͙+ͩ+ͩ+$T3ͩ+ͩ+{_z!ɳ7z°{!|$R#,09=GKUZcgpt}$T||g}oº$R$T )$R$T {ozg$T#$R$T|/g}/o$T#DM!yxGyOȯ{_zW$R !$T9 DMzzOxW>)_;g;}o{_zW=D$$T(DOOz/W{/_x/Gy/O{_zW{z$R  !$37<@$Tl{#€z€#^#V###n$R $T*+++͢o&$R$T $T$T9*+!^#6!#~ }| #~ 6$T9!***********************$T ***noname$R"!.38;@EGIKMOQSUWY[]_acegikmoqsuw$Q9J͙+͙+ͩ+ͩ+$T3ͩ+ͩ+{_z!ɳ7z°{!|$R title small c i/o package ; ;revised by Jim Woolley, FOG Disk Librarian, 1/83 ; extrn bios bdos equ 5 ;address on entry address for bdos cpmcmd equ 80h ;address of cpm command line true equ 1 ;value for true false equ 0 ;value for false ; ; toupper ; ; function: to shift lower case character to upper ; ; calling format from "c" ; toupper(char); ; toupper:csect mov a,l ;get character to test cpi 61h ;check to see if less then 'a' rc ;yes return to caller cpi 7bh ;check to see if greater then 'z' rnc ;yes..return to caller ani 5fh ;mask off lower case bit mov l,a ;put it in reg for return ret ;return to caller ; ; tolower ; ; function: to convert character to lower case ; ; calling format from "c" ; tolower(char) ; tolower:csect mov a,l ;get character to shift to lower case cpi 'A' ;see if less then 'A' rc ;yes...return to caller cpi 'Z'+1 ;see if greater then 'Z' rnc ;yes...return to caller ori 20h ;add lower case bit mov l,a ;put chracter back in place ret ; tolowwer:csect ;compatible w/ prev. vers. jmp tolower ; ; isalpha ; ; function check to see if alpha character a-z or A-Z only ; ; calling format from "c" ; isalpha(char) ; isalpha:csect push h ;save calling arg for later call isupper ;check to see if upper case xchg ;put answer in de pop h ;get character to test back call islower ;check to see if lower case dad d ;add isupper to is lower answer ret ; ; isupper ; ; function: to check to see if character is upper case ; ; calling format in "c" ; isupper(char) ; isupper:csect mov a,l ;get character to check cpi 'A' ;see if less then upper case a jc isupper1 ;not upper case cpi 'Z'+1 ;check to see if less then jnc isupper1 ;no upper case lxi h,true ;yes it is upper case ret isupper1: lxi h,false ;not upper case ret ; ; islower ; ; function: to check to see if character is lower case ; ; calling format from "c" ; islower(char) ; islower:csect mov a,l ;get character to check cpi 61h ;see if less then 'a' jc islower1 ;yes...not upper case cpi 7bh ;is it greater then 'z' jnc islower1 ;yes...not lower case lxi h,true ;return true for lower case ret islower1: lxi h,false ;return false for anything but lower case ret ; islowwer:csect ;compatible w/ prev. vers. jmp islower ; ; isdigit ; ; function: to check to see if character is digit 0-9 only ; ; calling format from "c" ; isdigit(char) ; isdigit:csect mov a,l ;get character to test cpi '0' ;see if less then a zero jc isdigit1 ;yes...not a vaild digit cpi '9'+1 ;is it greater than nine jnc isdigit1 ;yes...not a vaild digit lxi h,true ;is a vaild digit ret isdigit1: lxi h,false ;not a vaild digit ret ; ; isspace ; ; function: to check to see if white space tab or blank ; ; calling format from "c" ; isspace(char) ; isspace:csect mov a,l ;get character to check lxi h,true ;assume true cpi ' ' ;check for a space rz cpi 9 ;check for a tab rz lxi h,false ret ; ; strlen ; ; function: to get the lenght of a string ; ; calling format in "c" ; len=strlen(string); ; strlen: csect xchg ;put address of string in de lxi h,0 ;make string of zero lenght strlen1: ldax d ;get character from string ora a ;check to see if end of string rz ;yes return to caller inx h ;add 1 to string lenght inx d ;move to next character jmp strlen1 ;loop till end of string found ; ; strcpy ; ; function: to copy second string to first string ; ; calling format from "c" ; strcpy(object,source); ; strcpy: csect pop b ;get return address from stack pop d ;get source address pop h ;get object address push h ;restore machine stack push d push b push h strcpy1: ldax d ;get address of source character mov m,a ;store character in object string ora a ;check to see if end of string jz strcpy2 ;end of string return to caller inx h inx d ;move pointer to next byte jmp strcpy1 ;loop till done with copy strcpy2: pop h ;return address of object string ret ; ; strcat ; ; function: to put string2 at then end of string1 and return address of ; string 1 ; ; calling format in "c" ; strcat(string1,string2); ; strcat: csect pop b ;get return address pop d ;get address of string 2 pop h ;get address of string 1 push h ;retore machine stack push d push b push h ;save address of source string strcat1: mov a,m ;get character from source buffer ora a ;check to see if zero jz strcat2 ;yes end of string found inx h ;move pointer to next byte jmp strcat1 ;loop till end of string found strcat2: ldax d ;get character from string 2 mov m,a ;save character in string1 ora a ;check to see if end of buffer jz strcat3 ;yes return to caller inx h ;move object pointer up 1 inx d ;move source pointer up 1 jmp strcat2 strcat3: pop h ;get address of string1 ret ; ; strpos ; ; function: to look for string 2 in string 1 ;  returns position in string 1 where string 2 begins ; position 1 is first character ; ; calling format in "c" ; strpos(string1,string2); ; strpos: csect pop b ;get return address pop h ;get address of string 2 pop d ;get address of string 1 push d ;restore stack push h push b lxi b,1 ;initialize offset pointer strpos1: ldax d ;get character to check ora a ;check to see if end of string jz strpos5 ;end of string1 string 2 not found in string1 cmp m ;is it equal to string2 character 1 jz strpos2 ;yes... inx d ;no add 1 to string 1 pointer inx b ;add 1 to offset pointer jmp strpos1 ;loop till end of string1 or string2 found strpos2: push h ;save strating address of string 2 push d ;save current address of string 1 strpos3: inx d inx h mov a,m ;get character from string 2 ora a ;set machine flags jz strpos4 ;end of string2 found must be a mathc ldax d ;get arg1 cmp m ;is this character a match jz strpos3 pop d ;restore pointer for string1 and string 2 pop h inx d ;add 1 to string pointer inx b ;add 1 to offset in string1 jmp strpos1 ;loop till end of string 1 strpos4: mov l,c ;string found return offset for caller mov h,b pop b pop b ret strpos5: lxi h,0 ;string not found ret ; ; setmem ; ; function: to fill a block of memory with a given constant ; ; calling format in "c" ; setmem(address,count,constant); ; setmem: csect pop b ;get return address pop h ;get constant mov a,l ;put constant in a pop b ;get count pop d ;get address lxi h,-8 ;offset in to put stack back dad sp sphl ;restore stack pointer mov l,a ;place to save constant setmem1: mov a,b ;check to see if count is zero ora c rz ;all done with move mov a,l ;get constant to store stax d ;set memory loaction inx d ;move pointer to next pointer dcx b ;subtract 1 from count jmp setmem1 ;loop till all bytes set ; ; movmem ; ; function: to move source address to object address for count bytes ; ; calling format from "C" ; movmem(object,source,count); ; movmem: csect call argload ;get args bc=1, de=2, hl=3 push b ;switch args so that push d ;bc=count push h ;de=object pop b ;hl=source pop h pop d mov a,b ;check to see if count = 0 ora c rz ;zero return to caller call movmemht ;check to see if source'+1 ;is it : ; < = > rc ;yes - invalid character setfcb12a: cpi '!' ;is it less than ! rc ;yes - invalid cpi '.' jz setfcb121 cpi ',' jz setfcb121 cpi '[' jz setfcb121 cpi ']' jnz setfcb122 setfcb121: ;invalid character stc ret setfcb122: ;valid character stc cmc ret ; ; rsvstk ; ; function: to set how close to go to machine stack pointer ; ; calling format in "C" ; rsvstk(amount); ; rsvstk: csect shld @alocmx ;save number of bytes not to used ret ; ; storinit ; ; function: to init stroage allocation system ; ; calling format from "c" ; storinit(); ; storinit:csect lxi h,@base_free ;get address of start of free list shld @base_free ;save as first element shld @allocp ;save as pointer to last block lxi h,0 ;get size of free list area shld @base_free+2 ;save as current size of free area lxi h,3000 ;size of memory not to use shld @alocmx ;save it for later use ret ; ; data area used for free storage mangment ; @free_list:dsect @base_free: ds 4 @allocp: ds 2 @alocmx ds 2 ; ; argload ; ; function to load bc with 1st arg, de with 2nd arg, hl with 3rd arg. ; calling routine must call argload before any other operation argload:csect lxi h,9 ;offset to 1st arg past 2 ret addresses dad sp ;add to stack pointer mov b,m dcx h mov c,m dcx h mov d,m dcx h mov e,m dcx h mov a,m dcx h mov l,m mov h,a ret umber of bytes not to used ret ; ; storinit ; ; function: to init stroage allocation system ; ; calling format from "c" ; storinit(); ; storinit:csect lxi h,@base_free ;get address of start of free list shld @base_free ;save as first element STDLIB20.DOC STDLIB.ASM and .TXT were obtained as part of Mike Bernson's small-c compiler package. They provide the input/output functions. Unfortunately, the original STDLIB was full of bugs. This version 2.0 corrects errors found in tolowwer (changed to tolower), islowwer (changed to islower), strpos, setmem, movmem (order of args changed), getch, gets, kbstat (used bdos instead of bios), unlink, setfcb, and argload. Read and write were compacted by use of a common function called fileio. Setfcb was generalized to accept all CP/M file name characters. All functions except outp, inp, rsvstk, and storinit were tested for proper operation; tests performed were not exhaustive. STDLIB.ASM should be assembled using the Panacea assembler provided with small-c, creating STDLIB.TXT. (It should be noted that the Panacea assembler converts lower case ASCII character/string constants to upper case.) The .TXT file can be linked using the Panacea linker.   Jim Woolley FOG Disk Librarian January, 1983 the Panacea linker. provide the input/output functions. Unfortunately, the original STDLIB was full of bugs. This version 2.0 corrects errors found in tolowwer (changed to tolower), islowwer (changed to islower), strpos, setmem, movmem (order of args changed), getch, gets, kbstat (used bdos instead of bios), unlink, setfcb, and argload. Read and write were compacted by use of a common function called fileio. Setfcb was generalized to accept all CP/M file name characters. All functions except outp, inp, rsvstk, and storinit were tested for proper operation; tests performed were not exhaustive. STDLIB.ASM should be assembled using the Panacea assembler provided with small-c, creating STDLIB.TXT. (It should be noted that the Panacea assembler converts lower case ASCII character/string constants to upper case.) The .TXT file can be linked using the Panacea linker. $EBIOTOUPPE TOLOWE TOLOWWEISALPH ISUPPE$ISLOWE7ISLOWWEJISDIGIMISSPAC`STRLEn STRCPzSTRCASTRPO5SETMEMOVMEEOUT:INH PUTRPUTCdGETCz"$EGET*KBSTAOPE"CREAT)CLOSUNLIN4-REAa WRITj FILEIsQSETFCRSVSTSTORINI@FREE_LISARGLOA$T }a{_o$T }A[ o$T $R$T $7$R$T$}A3[3!!$R $T7}aF{F!!$R $TJ7$R$TM}0\:\!!$R $T `}! !$T n!#r$R  $T zwʌ#Á$R   $T ~ʞ#Õwʩ#Þ$R     $T 5ô#~ôi`!$R     # * $T}!9ox} $R$T9ͭx4><~# x ><)~+ $T .x)|}$R" #/<$T:{2F}$R$T H}2M&o$R$TR~bod#S$R $Td} s . ]$R$T"z  ! ˜!o&$R$T*6 #F+xʻw#³6 $R$T !!$T",<!!$R $T),<!!$R $T<0!!$R $T-4!9,W!!a{_~*>$T95?T~dK#2ZR.> T~.#Z):o?$To!.ʆ,ʆ[ʆ]ˆ77?$R !-18@CHNQ[tx{$T"$R!$T !""!"! "$R !!! !!$T"! 9F+N+V+^+~+ng$Q  ! ˜!o&$R$T*6 #F+xʻw#³6 $R$T !!$T",<!!$R $T),<!!$R $T<0!!$R $T-4!9,W!!a{_~*>$T95?T~dK#2ZR.> T~.#Z):o?$To!.ʆ,ʆ[ʆ]ˆ77?$R !-18@CHNQ[tx{c.def Has all static and macros defintion for "C" compiler c1.c Has main line and opening text plus #include, #if, #nif,error summary, dumpingt extern , and static area c2.c Has new function handleing ,statement parser, some ending charater check routines, compound statement, if statement, while statement,switch statement, for statement return statement, break statement, contiune statement, #asm statement, #endasm c3.c,c4.5 have needed utils and other little function c5.c-c7.c expression handler c8.c-c9.c code generation for the compiler c.sub submit script to compile the current version of the compiler and link it. cl.sub submit script to link the compiler if all crl file exist cc.sub submit script to run the compiler used by typeing "submit filename" runtime.asm source to runtime routines needed by the compiler runtime.txt object of runtime.asm stdlib.asm a few assembler function that one needs ... thing link puts,putch,gets,getch, ...  stdlib.txt object of stdlib.c function.asm needed assemble function for speed... strcpy,strcat,strpos,strlen function.crl bdsc object format of this function c1.com compile version of the compiler assemble.com assembler needed to assemble output from the c compiler link.com link to link files submit.c a copy of a submit written in c that aollow nesting of submits time.c a copy of a program that get a d set time for qt clock board ============================================================================== what my version of small c has: statements: #asm allow assembler code to follow #endasm to end assembler code and go back to c #define macro definition #ifdef constant see if defined #ifndef constant see if not defined #include include source from file fname int identifier,... define a 16 bit integer char identifier,.. define a 8 bit unsigned value {} defines a block of statements if (expression) statement; {else statement;} while (expression) statement; for(expression; expression; expression) statement; switch(expression) { case constant: default : } return {expression}; break; contiune; operators: * expression & lvale - expression ~ expression ++ lvalue -- lvalue lvalue ++ lvalue -- expression + expression expression - expression expression * expression expression / expression expression % expression expression << expression expression >> expression expression & expression expression ^ expression expression | expression expression && expression expression !! expression expression < expression expression > expression expression <= expression expression >= expression ! expression lvalue = expression lvalue += expression lvalue -= expression lvalue *= expression lvalue /= expression lvalue %= experession lvalue &= expression lvalue ^= expression lvalue != expression constant: n just a base ten number \n,\r,\t,\b,\f just a few character constant \\,\",\' \nnn a base 8 number 0xnn a base 16 number ============================================================================= compiler used to compile programs is bdsc 1.41 memory in system is 56k Mike Bernson 2103 Glencoe Hills APT 6 Ann Abror, Mi 48104 Phone 313-973-6404 or 313-996-0646 if any problem come up please give me a call or write   A\&Avw.kjDz#U}M/NN]ggdǫ:$^SyKiNl$u_O'&|ނ} expression && expression expression !! expression expression < expression expression > expression expression <= expression expression >= expression ! expression lvalue = expression lvalue += expression lvalue -= expression lvalue *= expression lvalue /= expression lvalue %= experession lvalue &= expression lvalue ^= expreThese files contain a portion of the C Compiler. To use, place C1.COM in drive A. At the A> prompt, type C1 When requested, enter an output file name of type .ASM (outfile.ASM) and an input file name of type .C (infile.C), which should be the source file written in C. Next, place ASSEMBLE.COM in drive A. At the A> prompt, type ASSEMBLE outfile where outfile is the .ASM file produced by C1. This step produces a file named outfile.TXT. To complete the process, place LINK.COM in drive A. At the A> prompt, type LINK outfile d:STDLIB d:RUNTIME where outfile is the .TXT file produced by ASSEMBLE and STDLIB and RUNTIME on drive d are library .TXT files provided. The result of LINK is a file named outfile.COM, which may be executed at a CP/M > prompt. The compilation process may be automated using SUBMIT.COM, XSUB.COM, and CC.SUB. Sample C programs SUBMIT.C and TIME.C are found on this diskette. For further information, see C.DOC .COM, and CC.SUB. Samp`$! 9^#VBK!9^#V!9s#r!9^#V!9s#rG`i#DM+!9~#fo#s#r+!9^#V^k6`i^k6 ʊ!9^#V^k6`i^k6%`i~ʨ!9~#fo+s#rzʨ0! 9^#VBK!9^#V!9s#r!9^#V!9s#r`i#DM+!9~#fo#s#r+!9^#V^`i^ !9^#V^`i^%`i~3!9~#fo+s#rz3!!9N#F`i^#V^!\ ``i^#V^`i^#V#~p!\`i~#fo#s#r`i^#V^}2,:`i^#V^!-:":^! 9N#F!!9s#r`i!9s#r!9^#VBKx`i^#V!9s#r!9^#V`is#r!9^#V!9^#VͭDM! 9^#V`is#r`i!9N#F3`i#DM! 9~#fo#s#r+^`i^b`i~_!.!! 9N#F!9^#V!9s#rÒ!9~#fo+s#r!9~#ʼ! 9~#fo#s#r+^`i#DM+sÃ!9^#V! 9N#F! 9~#fo#s#r+! 9^#V~>`i!9s#r!9~#fo#s#r+!9^#V~;! 9^#V^!9^#Vsz>!9^#V`i%! 9N#F!!9s#rt!9~#fo#s#r`i#DM+~ʂe!9^#V! 9^#VK#!9s#r!9^#VͭDM!9^#V! 9^#Vf`i! 9N#F`i!9s#r!9~#fo#s#r`i~!9^#V^! 9n& !9^#V`i%! 9N#F`i~#ʨ!`i^#V!^#V!9^#V!9s#r!Kʃ! 9^#V`i^#V##$DMè!9^#V!Lʨ! 9^#V`i^#V$DM`i!ͭDM!!;4!! s#r! s#r! 9^#V! s#r`i! 9^#Vs#r!9N#Fx?! 9^#V! ^#V! 9^#V! 9^#V`i^#V!9^#V!u?$!9s#r~#!9^#V͋!9^#Vͫ!9^#V!9^#V^#V!$!9s#r~#!9^#V!i?$!9s#r~#!9^#V͋! 9^#Vͫ!9^#V^#V!^#V!9^#Vͫ!9^#V^#V!DM`i~#7`i^#V##^#V!9~#fo ``i^#V!`is#r!9^#V`i^#V##s#r! 9N#F`i^! ‰`i^! ʑ`i#DMm`i^! ʶ!9^#VK!9s#r?`i^!"!H!9s#r`i#DM`i^!<!K!9s#r`i#DM!N!9s#r!9^#V!9^#Vf!9s#r!!9^#V!9~#fos!9^#V" > *s?#"s?*>!!8:,!8:!9N#F`i^#V^! ¤`i^#V^! ʨ!`i^#V^!/A `i^#V#^!*A `i~#fo#s#r^!/ = `i~#fo#s#r^!* : `i^#V~7 R`is#r~+ `i~#fo+s#r7 !E !!!unexpected eof in white space ! 9N#Ftʈ `i~#fo#s#rp `i^#V^!a1ʯ `i^#V^!z1 `i^#V^!A1 `i^#V^!Z1 `i^#V^!_ʋ !a!9s`i~#fo#s#r+^! 9~#fo#s#r+s`i^#V^C6 `i^#V^!a1O `i^#V^!z1 `i^#V^!A1v `i^#V^!Z1 `i^#V^!_  `i^#V^!"¯ `i^#V^!' `i^#V^!9s7`i~#fo#s#r`i^#V~ R`is#r^z `i^#V^!9n& ½ `i~#fo#s#r `i^#V^C6 `i~#fo#s#r^!9s!9^k6!9s!0!9n&1l !9^!91# !a!9n&1ʍ !9^!f1# !A!9n&1ʮ !9^!F1# !9^!x# !9^!l# !9^!.# !0!9s `i^#V^!9s`i~#fo#s#r!! 9^#Vs!9^! 9N#F!:!9s#rF !9~#fo##s#r!9^#V~#z !9^#V^#V!9s#r!1z 6 !9^#V!autobreakcasecharcontinuedefaultdodoubleelseexternfloatforgotoifintlongregisterreturnshortsizeofstaticstructswitchtypedefunionunsignedwhileu!9N#F!"s?R!9s#r~!9!9d !9s!#  !9^!  !9^!aʫ !9 « *s?!9@!9!9d !9so !9!9d a!!9!9!9^#Va*s?!9@!!9G!9!9d *s?!9@!!9[!!9o!!9‘!!9ʳ!9!9d *s?!9@!9!!J>@ includedefineendifelseifdefifndef? can't parse token = %s !!9s#r! 9^#V~^!?>! 9^#V^͢! 9~#fo#s#r!9~#fo#s#r!9^#V!9N#F!m ! 9s#r! ^#V ! 9~#fos#r! ^#Vͧ! 9s#r! 9^#V^#V! 9s#r! 9~#T! 9~#!r ! 9s#r!z ! 9~#fos#r! 9^#V##^#V!~!! 9~#fos#r! 9^#V!F͆Q! !! 9s#rö! 9^#V!͆l!  %4d !9^#V!^#V ! !g! 9^#V!^#V !9N#F`i1!|k`i+DMLk!! 9~#fo##s#r^#V;">|6! 9^#V^#V!!J>h! 9^#V^#V!!J>! 9^#V^#V. *>&!*u?Ͳ'Use: cref file1 file2 file3... r? can't open file %s Processing file: %s |g}o|/g}/o^#V#DM!99`i|z2:v::}͏}}|*!}*|!}|C}|?>o&zo&|]}|>o&|o&z2:v::||/g}/o#z/W{/_ÏDM!>2:))Ң#}o|gҺ ::=2:š}::=2:š}DM!>)) =}}/o|/g#}|*|g}o{_"||7g}o{_")}}o|gN#F# N#F#zF{J##^#VBK^#Vzp#yj###X#xe#~#fo}|>?o&}|>o&{_"|g}oš|g}o~# x¯!9:~#!|ɧ!?>":! 9! 9^#V!$~!9^#V":! 9! 9^#V!$~*:! 9^#V͢!4>DM`i~i`i DM>wf!E! 9^#V#^!+!9s#r! 9^#V^l!9~#ʢ!å!! 9^#VD(! s!!!9~#!!! 9^#VD(! s!!!9~#!!! 9^#VD(! s!@!!͏6ͼ6! ^ʹ2!9!"#?!Prwab!! s!! s#r!`is#r! s#r! s#r`i! 9^#VBK!4>!9s#r! !9^#V! !9^#V`i#DM+sû!`is!9^#V!#`i! 9~#fo#!! 9^#V! 9^#V!9s#r! 9~#fo+s#r!Lʒ!9^#VDM ʒ`i!9~#fo#s#r+s`i ’?!!9^#Vs`i!9^#V! 9~#fo!! 9^#V! 9N#F@!9s#r`i~#fo+s#r!P !9^#V!9N#F`i~V!?>`i#DM+^͢S!,!?>! ͢!9N#F`i~ʞ! 9^#V`i#DM+^͢ʛ!p!!9N#F!PYDM`i ! 9^#V! ͏!! 9^#V͏! 9^#V@DM)! 9^#V@!9s#r!-!!9^#V!PY! 9N#F! ^#V`i^#Vw! ^!t!!`in&s`i~#š! ^#V! ^#V! ^6,!9s#r!1!9~#!!`in&s!! ^#V`is#r!9~#fo! s#r`i~#fo#s#r+^!!J>! 9^#V͏!9N#F! 9^#V͏Kg!! 9^#V`i͒͏Kʌ!`i! 9N#F! ^#V`i^#Vw!9^#V!!9^#V`i~#fo#s#r+s!!! 9^#V!4>DM`i>ͅ%`i DM&! 9N#F!!9s#r`i~ʳ! ^!j!!9s#r! ^'*!9~#fos#r! ^!ʳ*>! ^#Vs#r! ^#V">!! s!9^#V! 9N#F! ^!:! ^#V`i^#V%!9s#r!9^#V! ^#V! ^ͪ/:!`in&s!! 9^#V!s!`in&s!`is#r! s#r!`i~#„! ^#V!ʽ!!9! ^ͪ/!! 9^#V! ^#V`is#r! ^#V! ^#V! s#r!`in&s! 9^#V`i~#fo#s#r+s!! 9N#F! ^#V!B`i! s#r*>|b*>!9s#r*>^#V">É! ^#Vͭ!9s#rz‰!! s#r3!`in&s!9^#V! s#r*;|!J%";";*;DM!9^#V*;";PYͅ`i";!*;*;͆,*;*;%!9s#rJ%!9^#V*;";`i!9^#V";! 9! 9^#V!`~!*;s!9^#V*;#";+s!!L9N#F!N9~#fo#s#r+^!F9s#rz#!F9^#V!% #!!9s!!D9s#r! !B9s#r!!@9s#r!N9^#V^!F9s#r!-%!!D9s#r!N9~#fo#s#r+^!F9s#r!F9^#V!0@!0!B9s#r!!>9s#r!N9~#fo#s#r+^!F9s#r!00ʥ!F9^#V!91ʥ!>9^#V! !F9~#fo!>9s#rK!F9^#V!.!!@9s#r!N9~#fo#s#r+^!F9s#r!00!F9^#V!91!@9^#V! !F9~#fo!@9s#r!F9^#V!lk!N9~#fo#s#r+^!F9s#r!:9!R9~#fos#r͖6ͩ6 !F9^#V!dʡ!:9!R9~#fo##s#r++^#V:ͩ6 !F9^#V!e!F9^#V!f!F9^#V!g!9!R9~#fos#r!:!: !:9!R9~#fo##s#r++^#V9ͩ6!F9^#V!!9!!>9͖6ͼ6͂#!9!49s#r!!:9͖6́69ʞ !9! !>9͖66ͼ6#!9!49s#r!-!69~#fo+s#rs !9! !>9͖6ͼ6#!9!49s#r!!9! !>9͖6ͼ6͂#!9!49s#r!!9!!>9͖6ͼ6͂#!9!49s#r!!:9͖6:!49s#r85!89s#r"!F9^#V!eH!!K!!!B9^#V!b!!j!!B9^#V!9! 9!:!:!:!9! 9!49s#r85!89s#r!!@9s#r"!:9͖6:!F9s#r!F9^#V!9!69s#rs!Po% dK u x s!e2!f2!c!!!9!49~#fo%!89s#r!89^#V!@9~#foL8"!@9^#V!89s#r!D9~#s"!>9~#fo+s#r#!89~#foLs"!B9^#V`iB"!!69s#rÐ"!69~#fo#s#r!49^#V~"!69^#V!@9~#foK"!49~#fo#s#r+^`iÁ"!D9~##!>9~#fo+s#r#!89~#foL#! `i"#!F9^#V`iÊ! 9N#F`i:ͼ6! 9͖66|8:;^!9~#fo+s#rs!9`i:6͖6B8ͩ67(#!9^#V!9N#F! 9͖6́69B$! 9͖6:!9s#r! 9! 9͖6́67́6~7ͩ6`i:ͼ6!9͖66|8:)!9~#fo;^!9~#fo+s#rs! 9`i:6͖6B8ͩ6!9^#V!9͖6ͼ6#!9*q%g$ͺ{$ͺ*:DM*:o&ͺ͙$o&ͺ*:*+++*:DM*:!9N#F#^#Vkb6#> 6 #=$>6#=$ : >% A:%[$@$a:%{:%`w# .%4%%A%w#%{o|g 4%A%w#%%!!|a{ !9^#V*;!9}|l%*;";|!!!!V;͞4!:o&V;s!'";!V;DM!";*;Kz'`i^! %`i^! %`i#DMü%`i^zz'`i^!>&!!9s#r&`i^!<+'!!9s#r`i#DM^! >&`i^! A&&`i!9s#r`i#DM~ʃ&`i^! q&`i^! ʀ&!`i#DM+sÃ&K&!9^#V'*!9~#ʵ&!!9^#V$(!9s#r&!!9^#VD(!9s#r!9^#V!('!'!5!9^#V!~5!'!~5!85!!ͪ/! Ͳ'w'`i*;#";+);s#r`i#DM~w'`i^! e'`i^! t'!`i#DM+sw'?'ï%!;*;Ͳ'Can't open file for redirection: !9~#'!'x4g$A:$$$.SUB!"#?!!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:! 9^#V!! 9^#VD(!>! 9s#r!!9s#rÃ(! 9~#fos#r!9~#fo#s#r!9^#V! Kʭ(! 9^#V!^#V!'·(b(!"#?!!%?DM(`iDM`i~#(!9^#V`i^#V4(ÿ(! ^#V!9s#r!9^#V!#!9s#r!9^#V!A)!9^#V^! 9^#VszA)!"#?!!9^#V!x)!9^#V#^! 9^#V#szx)!"#?!! ^#V! 9^#V!s#r!9^#V##^! 9^#V##s!9^#V###^! 9^#V###s!-,! 9^#V!s#r! 9^#V!9^#V!9^#V!9^#V!9^#V!^#V! 9!K*!!9^#V!9^#V!KL*!9^#V! LV*!"#?!!9^#V)))>DM! ^#V! ^#V!9s#r!! s! s! s`is!'! s#r!9^#V!;DM*`i&DM`i=ͅ*!% ^z*ú*!"#?!! 9^#Vͱ$+!"#?!! 9^#V!+!x$!x$_+! 9^#V!R+!x$\+!"#?!+! 9^#V!+!"#?!!!! s#r!# s!$ s`i!9^#V!s#r! 9^#V!#!% s!+! ,!9^#V!s#r+!+!9^#V!s#r!!! 9^#V!%s!!9N#F!x$!!% s!!!9^#V!K[,!9^#V! Le,!"#?!!9^#V)))>DM! 9^#V! 9^#V! ^#V`i^)=^#V!DM!9^#V!9s#r!9^#V!$~-!9^#V!$^!%DM!9~#fo͆,!9^#VBK!9^#V! 9^#V--!!9^#V`i%͒!9s#rzʆ-!9^#V!9^#V`i! 9^#V'4!9s#rzʆ-!9^#V!9~#fo%PY!9^#V!PYDM`i!9~#foͅ-!9^#V`i%!9^#V`i! 9^#V--`i!9^#V!9N#F!!x$!!x$"#?| .!! 9^#V!$ ^!!9^#V͞4!$ ^! 9~#fo!$ sza.`i!~#fo#s#r!:=o&|.!}2=!}2=}2=!=! x$! !x$:=o&ʻ.!}2=!! :=o&#}2==#s! :=o&#}2==#s!">:=o&DM! 9~#foL /! 9^#VBK*>=!9^#V͞4`i*>">`i:=o&%}2=`i! 9N#F!!9s#rk/!9~#fo#s#r!9^#V!9~#foKʡ/! 9^#Vx$`i#DM+s!¡/\/!9^#V!9^#V!K/!9^#V! L/!"#?!!9^#V)))>DM! 9^#V! 9^#V! ^#V! ^)>^#V!DM!9^#V!9s#r!9^#V!$~ʑ0!9^#V!$^!%DM!9~#fo͆s0!9^#VBK!9^#V! 9^#VT1ʑ0!!9^#V`i%͒!9s#rz0!9^#V!9^#V`i! 9^#V/4!9s#rz0!9^#V!9~#fo%PY!9^#V!PYDM`i!9~#foͅK1!9^#V`i%!9^#V`i! 9^#VT1K1`i!9^#V!9N#F!!x$!!x$"#?1*#?ʪ1!"#?!!!;4ö1*#?|ʶ1!! 9^#V! 9^#V!$ ^!͞4!"x$"#?|1!!$ ^! 9~#fo!$ sz 2`i!~#fo#s#r!!9N#F!!9s#rM2!9~#fo#s#r!9^#V!9~#foKʫ2`i#DM+^!9s#r!9^#V! ʓ2! !9^#Vx$!9^#V!9^#Vx$>2!9^#V!9^#V!K2!9^#V! L2!9^#V)))>^z2!"#?͏6!9^#V)))>^#VBK!9^#Vß3!x$>3!"#?͏6!#x$!!$ s! 9!! ^#V9́67ͼ6!$ ^:6R76͖6R7ͩ6ò3!"#?͏6P3Q333!!# s! 9͖6́693!!! s#r!$ s!"#?͏6! 9͖6:!$ s! 9͖6́67:!! s#r! 9͖6ͺ!44ͺ"*:!":*:m4*:!4_4#4*:+":}54o&"#?*:!9!.9^#Vͱ$!9!x$! 9F+N+V+^+~+ngxʼ4w# ï4!9^#V#N#F#nx4s# 4!9^#V#~#fox454# 4! 5!}!}!9^#V#~#fox55~55# $5!9~#foM5#D5}!9^#V#^#V#N#F4!9^#V#^#V#N#F$5!9^#V#~#fox55~ʟ5# Ð5$5!9^#V#^#V#N#FÐ5!9^#V#n~55#5!|!9^#V#n5#5x5 +~55!9~ )6 )6 )6>6!9~A>6[>6!}!9~a>6{)6!!9~0>6:>6)6!9~af6{f6 o&!9~A|6[|6 o&!*>Ú6!*>w#w#w#w*>~#~#~#~">*>V+^+V+^*>">*>s#r#s#r*>*>*>">">*>>w#6*>~9# 7ý9=ɯ<*>*>###;77?7777+A7*>*>#]7*>*>#s7*>*>#ˆ7*>*>#7*>*>#²7*>~/w#7*>~?G*>^#V#~#fo))7#7DM*>s#r#q#p*>~?W*>###~8~w+8 87~w+"88~#38O6*>(>08y2&>*>0>08:&>2&>ͯ8(>*>w#k8:&>6*>(>08y2&>*>0>08ͯ8,>*>w#ž8:&>6!,>w#µ8> 2'>!(>~w#8O,>!0>#8y8!(>4!'>58!'>5(9!(>~w#9O,>!0>#9y88,>!0>#19*>0>~#D9*>,>~#T9!(>w#b9> 2'>!(>~w#s9Ҟ9(>!0>#‡9Ҟ9’9!'>5m9*>(>w#­9!79!!7ʽ9!s#r#6#6*>s#r#z:6#6*>^#V v (!)^btvfnr(!)^     ( 0123456789abcdefw?',e.B/'0$2$2>">-,-,'''''''''''-,'?'?'>(>(> (>(>(>(>(>m?* CCREF.DOC CROSS-REFERENCE C PROGRAM SOURCE FILES CCREF will generate a cross-reference listing for a program written in the C language. (Actually, CCREF may be used to cross-reference any text file, but C keywords and operators will be ignored.) At the > prompt, type CCREF filname1.typ filname2.typ ... to produce a global cross-reference of the C source files named filname1.typ, filname2.typ, etc., and display results on the terminal. One or more source files may be included on the com- mand line. It is normally desirable to record results for later use; therefore, use the command CCREF filname1.typ filname2.typ ... >output.fil to cross-reference and save results in the file named output.fil. The symbol > followed immediately (with no spaces) by the output filename must appear as the last item on the command line. With either command form, it takes considerable time for the program to complete. If the second form is used, there will normally be no output sent to the terminal; therefore, CCREF may be detached using the MP/M signal , freeing the terminal for additional activity. Sample output from CCREF is listed below. This sample was pro- duced by typing the command CCREF MODEM.C MODEMF1.C MODEMF2.C >MODEM.REF The first three lines list references to #include statements, although this fact is not identified in the output. Remaining lines indicate first the variable name, then line numbers where that variable appears, grouped by source file name. Sample output follows: MODEM.C 43 46 MODEMF1.C 31 33 MODEMF2.C 37 39 abort MODEM.C 62 72 MODEMF1.C 394 ACK MODEMF1.C 53 MODEMF2.C 530 533 675 711 allrights MODEM.C 39 This is the end of CCREF.DOC. *+%"H%"F%"D " " "y 6"C+6+!^6 F+N+<!* !!9~#ʗ RO"k'k +}|+#~ʂu6#~#<ʷ>!4R6#6*! * |ʴ!ͯ"r! ͯ" R Can't open > or < file.$èw*6 )! 9!"6ɴ(*:B<*C 2B ́F  €> _*C~+#4N s> > !+:EºF2B_~ý   > G ʘG!* ͟> !+}  > _con:rdr:pun:lst: ==_~O7 !"# !  #¾i& ~º!h~#~#F6%pw6237!9Ly=S>wD<!gs 6#6 ~+|s#r{{ ڟ!+#^{!!Pw#w!g~<6 !|~r!N!nL}*eyb>w#%!=)${=Sbtx h&{ !~!nN#F{p+pH#x¯ ڽ+!9~ !~b!5> 6> *e w`i#Q᯾%,!$|!!9n&:ʟɯ2>[!9L):|!PwL#4!^w>2>2-:Ecx:-O”! DMi:- !Write error - Disk full $`i7.!9~=+SV+^+F+N "I> w+ w w##w w #~+:&~##K@~#.7K&*I++Kw#=a O! ~_#V!$r+sbk#|}o|g}o|g}o|g|!,|}!­­,ɯ|ʙ!|}!-z{!,zz{!-|!|g|}! -ɵz{!-||g}o).{ozg+|/g}/o~og~#fos#rN#F#xr~#~#[[`iDM!z>‚S\))Ҋ =‚ɯßz>|>MD!x<³z>ڸjS\>))#  =¸>>T'!9"*++"Lp !9*  *I  *++"L}2:G*++"L͂  *++"L"**++"L͛  !!9L͂ !9F}2!9L"ͷ !9L"!!9L͂ *F͓ *F͓͓ *#"+F ÷ :G0 !9F*#"+!9F}*6!9F:G͟@ Y  !"A "!9*Q*++"*#"F"ͯy ! }2*ͯ"|ʠ *#"+F"*| !0}2*#"+F" "*| *#" "*#"+F"͓ *͓ !"* !9L++QL  !9L++QL!   !"A ` ! "A ` !"A !9L++QL"C *C *A ʹ  !9L++QL"E "G *G #"G +F|ʬ Ù *G +"G *E 4* *͓ *E *"G *E *G  *  Y c+ dH oQ uZ x s ͷ * !" *F"0C *9͓j *  s*#"+F" ( * " !9L"t !9L"v !9L+Q*t ͯʴ *v ! ͏ÿ *t +*v ͉͋}*t ͯ *v !( *t ͯ *v ! ͏ *v !("v *v |Œ !9L!9!T9L< !T9L>C !T9L" !9P"* !V9Lx "!T9Lʡ :G|ʘ !- *+"á *+"6-** !P9!9!9P"!V9L!V9Lx "** !P9!9L!9L4" *ͯ!:G* c* +" #|M!9L#Q+F *+"!*|b! !c!9L*ʊ!9L *+"c!9L ʡ!0ä!7!9L***! 9L|!"""! 9L"! 9L|! 9LFͯ! 9LL͓! 9! 9LLQ! 9L"! 9LF|]! 9! 9L3͓f<! 9! 9LLQ|! 9L*! 9L! 9L! 9Lʹ"|*! 9L+QÁ!! 9! 9L! 9L3|! 9! 9LLQ!*!9L+Q *4!9L"4!9L&Q*4F|m*4F!9L͹͓~*4#"4+Q*4F|ʢ*4*4#F}*4#"4+~"4****! 9L"!9LL"!"*F|*F!9L͹͓*!9L4! 9L͓0*F|Q! 9L#Q+!`}*#"+'*F|! 9L#Q+*#"+F}'*|™*#F!9L͓͛ʱ! 9L#Q+6-'*+F*#F*#"+*++F"*#"*F! 9L#Q+*}*#"+'!""""!"! 9L#Q+6!9L*Q! 9L*4*^!9LLF|ʍ!9LLF"^!9LL#Q+!9LLF2'!\"^! "^! "^! "^!"^! "^!9LLF"^YSNTBR*^"^!9L!͏*<*:!9L":*:"<*:F|l*:#":+V*:#*:F}*:+":#*<*:l*<! 9L}":"<*!9L"*!9L"*&}o"*F|*F*͹͓*#"+*F| *!""!9La7!9Lz͓]!9LAZ!9LZ͓͓ƒ!9L0ʀ!9L9͓͓!9****!9LFͯ!9LF!9L͓͛!9LF͓ͯ!9LF͓ͯ!""""!9!"!"!"!9LF|N!9LF!9L͹͓e!9LF͓͓q*͓ͯ!(%"*##*#Q*#6*6#6!9LF*6.*|*6^!"!9L#F!9L͛!9L#F͓ͯ!9L#F͓ͯ*6$"!"!9L#FͯO*6!!9L##Qa*6[!9L#Q+!]!9! 9!ͯ"*|ʯ*##*(%Q*##L! 9"'!"*|*F!*6*Y^$**6L*#!9`}Y.^$%[**|+*͓ͯB*!*|b*6#6*""*F|ʖ**Q**Q*"**͹*L*Q**Q**Q**Q*"!9L#Q+**6#6*** ! 9L"! 9LF|ʇ! 9L! 9L*ʹ" ͯe! 9L#Q+Ä!9L|w* ~! 9L" Ç#* " "*!9L"!9LF|!9LFa!9LFz͓!9LF}!9L#Q+å*"!9L!9L)!9L0!9L*1!"1!9LLF|ʑ!9LFq!9LLF!9L#F͛ʁ!"1Ñ!9LL!9L͛ʢ!"1Ñ!9LLF|!"1Ñ!9LLF|!"1Ñ!9LLF!9L##Lͪ|!"1Ñ!9LLF!9L##Lͪͯ=!"1Ñ!U'!l'!9LF! 9LFÑY\L^.$[!@*1ʰ!9LL*1Q*1#"1"1*!9L"*F|C*#"+*F *F~͓*F@!'*F*F|@! "*H!9L|ʿv!9!9LLQN!9LF!'"H!'"H!'"H!'"H!'"H!'"H!'"H!'"H!'"H!'"H!'"HY^$.L\[]^!*!'*H!9L!9LFͯT!9LF͓ͯv!'!9L##Lá!9LF|¡!'!9L#F!(!9LL]! "H*!9L|=!9LF*!9L##L@&!9L"!9!9LLQ*@&::Y[!"*F*D*B!9L"B! 9L"F! 9L+Qʌ*B"D#͓͓ʱ*F#"F+*D}ͯʮñh*F6*D#ͯ! 9L*F͓͛!! 9L"B"D"F!9* ******!"!9LP!!!*)!9LLF|¤*#"+)!9LL!!9L*͛ʤ!!!!9!@*#"+)!9L#"ͯ!!!!9L*4"!!( *|R*)!9LL!D(ͯ" * |O!!F(*)!9LL z X*" !"!"!9!* H|S *ͯˆ*͓ʗ!9͗*"*+"< !9*)!9L!| *#"+*!9*)!9LL!* . *!9*)!9LL!* *#"+$Ý*|G *͓P S d**)!9LL*͵ * *#"!9L!""""""" !9*ͯʿ !9L !U(!9L!](!9L!9*| !!P9*|!!T9L͓ͯ6!*ͯ3!!T9L͓͓!*ͯ[!!R9LX!*͓͓ʈ!!a(!X9L*|~!!j'Á!!f(*|ʤ!!h(!\9L*ͯ!!c(!Z9L!!!n( ͨ!"!"!"!"!"!"!"!9LF|ʳ"!9LF2'w"ã"!"ã"!"ã"!"ã"!"ã"!"ã"!"ã"!"ã"!!!ã"ã"Y$"-$"E'"C0"F9"HB"LK"NT"V]"Yf"!9L#Q+"*"*"*"!""*|"! 9L͗!|!9Lͪ""|_#!9L*"#! 9L!|͏""͓B#! 9L##Q++*"Q*"#""+! 9*"#""Q*"|\#è#"!9L*"ʄ#! 9L!|͏""͓ʠ#*"#""+! 9L*"Q*"|¶#!(ͨ*"""""""!9*#*#!"#*|ʍ$!9LL!D(ͯ"#ͯ#$!!F(!9LL !!9L*#4|I$!9!*#H͓ʂ$!9*#)!9L!9L*#4ͺ"*#"##$*#$!9LL*#)!9L!9L*#4ͺ"*#"#|$!9L!'Q*#"#"#!9! !D'|%!!D'&}o+++͓ͯ%!!9L##Q G%!96#6!%""%*"%##L"$%#͓%k%*$%""%M%*$%L!9L%!9L*$%L%*"%##*$%!9LQ""%*"%*$%L!9L4Q*$%!9LQ*"%##*$%##LQ*$%##b%!9L &!&!9L"&%""%#ͯ$&!*"%*&%Q*"%##@&G%!9L++Q!%"<&*<&#͓!'i&*>&"<&S&*<&##L">&!9L '!9LL!9L*>&͛&!9LL*>&LQ*>&##L">&*<&L*<&!9L͛&*<&L!9LLQ!9*<&Q*<&##!9LQ!9L##*>&Q`&+#~)'!9n&}a{ oo&% omatch: can't happen char = %c, %x hex \0x%02xBOLEOLANYLITCHARESCAPECCLCCLENDNEGATENCCLCLOSURE**** unknown ****%-8s at: 0x%x, string = [%s]=, lchar = %c, next = 0x%x (c) Copyright 1984, Software Engineering Consultants rCan't open %s %-12s: %d %s%s:%03d:usage: grep [-cefhlnvy] [expression] Illegal expression grep.c, tools.c, and tools.h were published in the October 84 issue of Dr. Dobb's Journal. Grep is a global regular expression print utility according to THE UNIX PROGRAMMERS MANUAL, although a more common expansion is generalized regular expression pattern matching utility. My purpose in uploading these files is to save others the trouble of typing them in (about 20 pages source code). The programs have been modified by me to compile with C/80, as explained below. See Dr. Dobb's for instructions in using the program. As a brief example, the command "grep -n pattern file1 file2 file3" will search the files for pattern and list the line number(s) if found. The pattern can incorporate wild cards and other generalities. C/80 Version 3.0 from The Software Toolworks will not compile grep.c as listed because it has no: a) linker b) typedef statement c) FILE type d) #defined NULL e) stdin f) stdout g) stderr h) fgets i) stdio.h j) capability to call a function with a different number of arguments than defined. To compile grep.c with C/80: In TOOLS.H: 1. After #define NUL 0, add #define NULL NUL 2. Add #define EOF -1 3. Add #define TOKEN struct token 4. As explained in Section 8 of the C/80 Version 3.0 documentation add the following: #define FILE int #define stdin fin #define stdout fout #define stderr 0 extern int fin, fout; 5. In the typedef statement on page 58 delete the words "typedef" and "TOKEN". In TOOLS.C: 1. Delete the two #include directives 2. On page 61 add the argument "boln" to the omatch() call. The modified line should read: while(*lin && omatch(&lin, pat, boln)) 3. On page 64 change the expression (dstart - dest < maxccl) to (dest - dstart < maxccl) In GREP.C: 1. Delete the line #include "a:stdio.h" 2. Change #include "b:tools.h" to #include "tools.h" 3. Add #include "printf.c" 4. Add #include "tools.c" 5. Add char *fgets(); 6. On page 77 change if(matchs(line, exprv[j])) to if(matchs(line, exprv[j], 0)) 7. On page 83 change bdos(11) to bdos(11,0) 8. At the end of grep.c add #include "STDLIB.C" 9. In STDLIB.C add the function fgets() from page 155 of K&R. Robert C. Briggs FOG Member #92 de "STDLIB.C" 9. In STDLIB.C add the function fgets() from page 155 of K&R. Robert C. Bri#define stderr 0 extern int fin, fout; 5. In the typedef statement on page 58 delete the words "typedef" and "TOKEN". In TOOLS.C: 1. Delete the two #include directives 2. On page 61 add the argument "boln" to the omatch() call. The modified line should read: while(*lin && omatch(&lin, pat, boln)) 3. On page 64 change the expression (dstart - dest < maxccl) to (dest - dstart < maxccl) In GREP.C: 1. Delete the line #include "a:stdio.h" 2. Change #include "b:tools.h" to #include "tools.h" 3. Add #include "printf.c" 4. Add #include "tools.c" 5. Add char *fgets(); 6. On page 77 change if(/* ------------------------------------------------------------------- * GREP.C: A generalized regular expression parser * * Published in Dr. Dobb's Journal, October 1984, page 50 * * Copyright (c) 1984 Allen Holub * Copyright (c) 1984 Software Engineering Consultants * P.O. Box 5679 * Berkeley, CA, 94705 * * All rights reserved. * * This program may be copied for personal, non-commercial use * only, provided that this copyright notice is included in all * copies and that this program is not modified in any way. * Copying for any other use without previously obtaining the * written permission of the author is prohibited. * *-------------------------------------------------------------------- */ #include "printf.c" #include "a:tools.h" #include "a:tools.c" /* * GREP * * Search a file for a pattern. * * The algorithm used here is essentially the algorithm in Software Tools in * Pascal (pp 145f.). Though the routines have been changed somewhat to put * them into good 'C'. See tools.c for details. * * This program is a healthy subset of the UNIX program of the same name. * The differenced are as follows: * * - the -s, -x, and -b options are not supported. * - the meta-characters b()+? are not supported. * * Usage is: * grep [-vclnhyef] [expression] files ... * * To compile with the Computer Innovations C86 compiler use: * * cc1 grep * cc2 grep * cc3 grep * cc4 grep * cc1 tools * cc2 tools * cc3 tools * cc4 tools * link grep tools,,,c86s2s.lib * * To compile with Aztec CII use: * * cc1 -x4000 grep.c * as grep.asm * cc1 -x4000 tools.c * as tools.asm * ln grep.o tools.o a:libc.lib */ #define CPM 1 /* Comment this out if you're compiling * in an MSDOS system. */ #define MAXLINE 128 /* Maximum size of an input line. */ #define MAX_EXPR 64 /* The maximum number of regular expressions * separated by newlines or | allowed. */ /* The following global flags are true if a switch was set in the * command line, false otherwise. */ int vflag, yflag, cflag, lflag, nflag, hflag, fflag; main(argc, argv) int argc; char **argv;{ int i, j, linenum, count, numfiles, exprc; int line[MAXLINE]; FILE *stream; TOKEN *exprv[MAX_EXPR]; char *fgets(); i = 1; if(argc < 2) abort(pr_usage(1)); if(*argv[i] == '-'){ /* expand the switches on the command line */ expand_sw(argv[i++]); if(i == argc) abort(pr_usage(1)); } /* Get the pattern string */ if((exprc = get_expr(exprv, MAX_EXPR, &argv[i++])) == 0) abort(pr_usage(2)); numfiles = argc - i; /* Get number of files left to process * on the command line. */ fprintf(stderr, "(c) Copyright 1984, Software Engineering Consultants\n"); do{ if(numfiles){ stream = fopen(argv[i], "r"); if(stream == NULL){ fprintf(stderr, "Can't open %s\n", argv[i]); continue; } } else stream = stdin; count = 0; linenum = 1; while(fgets(line, MAXLINE, stream)){ #ifdef CPM if(!fflag || yflag) stoupper(line); #else if(yflag) stoupper(line); #endif for(j = exprc; --j >= 0; ){ if(matchs(line, exprv[j], 0)){ count++; pr_match(linenum, line, argv[i], 1, numfiles); } else pr_match(linenum, line, argv[i], 0, numfiles); linenum++; cntrl_c(); } if(lflag && count) break; } pr_count(numfiles, argv[i], count); fclose(stream); }while(++i < argc); abort(); } /* ----------------------------------------------------------------------- */ pr_count(fcount, fname, count) int fcount, count; char *fname;{ /* Process the -c flag by printing out a count and, if more than * one file was listed on the command line, the file name too. */ if(!cflag) return; if(fcount > 1) printf("%-12s: ",fname); printf("%d\n",count); } /* ----------------------------------------------------------------------- */ pr_match(linenum, line, fname, match, numfiles) int linenum, match; char *line, *fname;{ /* If a match is found print the correct thing * as specified by the command line switches. */ char buf[80]; if(cflag) return; if((vflag && !match) || (!vflag && match)){ if(!hflag && ((numfiles > 1) || lflag)) printf("%s%s", fname, lflag ? "\n" : ":"); if(nflag) printf("%03d:", linenum); if(!lflag) printf("%s", line); } } /* ----------------------------------------------------------------------- */ pr_usage(num) int num;{ #ifdef DEBUG fprintf(stderr,"%d ",num); #endif fprintf(stderr,"usage: grep [-cefhlnvy] [expression] \n"); } /* ----------------------------------------------------------------------- */ abort(){ exit(); } /* ----------------------------------------------------------------------- */ expand_sw(str) char *str;{ /* Set global flags corresponding to specific * switches if those switches are set. */ vflag = 0; cflag = 0; lflag = 0; nflag = 0; hflag = 0; fflag = 0; yflag = 0; while(*str){ switch(toupper(*str)){ case '-': case 'E': break; case 'C': cflag = 1; break; case 'F': fflag = 1; break; case 'H': hflag = 1; break; case 'L': lflag = 1; break; case 'N': nflag = 1; break; case 'V': vflag = 1; break; case 'Y': yflag = 1; break; default: pr_usage(3); abort(); break; } str++; } } /* ----------------------------------------------------------------------- */ int do_or(lp, expr, max) char *lp; TOKEN **expr; int max;{ int found; TOKEN *pat; char *op; found = 0; /* Extract regular expressions separated by 0R_SYMs from lp and * put them into expr. Extract only up to max expressions. If * yflag is true, map string to upper case first. */ if(yflag) stoupper(lp); while(op = in_string(OR_SYM, lp)){ if(found <= max && (pat = makepat(lp, OR_SYM))){ *expr++ = pat; found++; } lp = ++op; if(pat == 0) goto fatal_err; } if(found <= max && (pat = makepat(lp, OR_SYM))){ found++; *expr = pat; } if(pat == 0){ fatal_err: printf("Illegal expression\n"); exit(); } return(found); } /* ----------------------------------------------------------------------- */ get_expr(expr, max, defexpr) TOKEN *expr[]; int max; char **defexpr;{ FILE *stream; int count; char line[MAXLINE]; #ifdef DEBUG int i; #endif /* Get regular expressions separated by | or newlines either out of * a file or off the command line depending on whether the -f flag * is set. The expressions are converted into pattern templates * (see tools.c) and pointers to the templates are put into the array * expr[] (which works similar to argv). * * Return the number of expressions found (which can be used in a * similar fashion to argc). */ count = 0; if(fflag){ /* Then *defexpr is the file name and expressions should be * taken from that file. */ if((stream = fopen(*defexpr, "r")) == NULL){ fprintf(stderr, "Can't open %s\n", *defexpr); abort(); } while((max - count) && fgets(line, MAXLINE, stream)) count += do_or(line, &expr[count], max - count); fclose(stream); } else /* *defexpr is the expression itself. */ if(count += do_or(*defexpr, &expr[count], max - count)) *defexpr = " "; #ifdef DEBUG /* Print out all the regular expressions after they have been * converted into pattern templates (see tools.c). */ for(i = count; --i >= 0;){ pr_tok(expr[i]); printf("------------------------------------------------\n"); } #endif return(count); } /* ----------------------------------------------------------------------- */ cntrl_c(){ #ifdef CPM /* If any character was hit, and that character is a ^C, then abort. */ if(bdos(11,0) && ((bdos(1,0) & 0x7f) == 0x03)) abort(); #endif } #include "STDLIB.C" ter is a ^C, then abort. */ if(bdos(11,0) && ((bdos(1,0) & 0x7f) == 0x03)) abort(); #endivƌTOOLS.Cb  !"#$%&'()*+,-./01o23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aYd}wwd{x 'BѠHa3EYdgɼ7ulj2Rv_whYdg>?K!/L"^*?K_$H̼!RpMYd?95>ZP_EvYk,_=.( :,O>Uqd\bN`ZR!);h65NI gu4rVPNjl/%+xSˤ@JqYz Ӏ08Vř)|ilSo GruYқQA%"'R‘'VсP.,x3'rY)L-G8'L8EЪ35[gE,8rU>il&Pa&@' /1S:9b*\&EU&lgqP(BT )jER$sb_˭+gLk7;;c1#$ xCb:߽;y@ng]el54 d18m&ER5[q㨦P%{E@Fo) mEֺ&QR07ƛ:rY,|`RI<ֲCVRvȁU`Q9,~<{GPesY,=7by||8xh7{=y\:эZ2YTRDѭZ#^FX8jadYu*#E- SReT1YuM2)"!ly嬳Z o q笳Z2Cp|Mj5QKxDjS%j@fo Y5')XG aR`p"%_YuO~ NpM/a#\D bGLk'cp"V̜YLAQK*V D@Yİ/8"̈1Gp"if8'rVkd]K E[>Չ >"1wȺ:5YgFVxsmG7j/4`kśэzyǃ:2i( 0ŌF1EjHx/0/ƸA5fR/ S xCYdh єK1ĀL8FFDfM%8%N̐$#,2Djv&D Q!$J*@e 'PuYd)h7^q'`*UExACH dℽ!g !Ll XNͦx8a18RUDRr},2ohC1U7734TM05#_iuy嬳X+2TΆ*(a)ތFW:,#uBLCM;V#xèL 5BgիT c#:QL%1j%Ia73L73g52%'of&rM/):W:k£sY}|9£Gȁiӫ7=*5d*!uV%_h@F7j+C`u|9u`uq9rUfy嬳0HHCCOwPrVk9a4TtZD!ݍή2NZ1 81 S_"U G4x,2pl!ngeG4 BT!Q(L HYdIx6„TG0*~#AB4*4%" Q!))BS20ȼ64%ER'Gg߮ l]A9 5Rh r槓)d:'8FM2o IT&Z$PȘYe,Ygpq9rC/.c9uhY]\t+gTAOYg9ͼA},W:qn(zu,9e9,NJxP`lţYguvY>F^97)!P(gի҂BׄLo8y5R0tKψ'g528jT*/P(Lj DPZEc* dY Nd&&j Ax 5;DN| Ȑ@LFoDP5ʤ 'rV#PAM2)Ep"VvÏ>D"uV7TzϾ;gQX# oz4TtsV+2CV~9{嬳3Yga Mb&ӡ v7:Wψ'ʀՄǨb M2'5ʤ?XJ g52"'RG>YrY' ֲm_;~m#~zmY:guvY uɃSYP+`?'R`"dׄ ;qAfFvV#>!Vbfd($RPe 3f%vkrV##IG *FUt$ʂg52 GA̅@<8ֆx P$d 8jo0p"DCh7L 8b~5/|TrV## C'&6'Aa,l 1|@ Gj䕳w'ȉ!C6&QO:<ɋsV{ uV2Q&QRT'a"fI084x3C;!`Ej䕳j?5^vVȢf{4T_;dQ3=O_;dQ3=v2"(3GjR**wDҠǾsVYgQdQ3Bߣ1y5x>Bct߯zyqD.X?5 =N;gJ RQY<+EֺJ :~< fG{/a*\Yc(d>DF*n߶x6zäsyc!0Vjd @$ӴYF@g2m :T/OfĭpOͧ?泥Y#_ D Gp"w8JYOk No_?aF _|s~:sV#ȗEݟMt3I]n3fN>hh>ͼA|^0 qe ( I):rY=j@\Lb..F7jðo{bFxC.o{o=pM\̨sVk*nZO~~vC.f9!YN&QY:grV_9{嬳 Yg[bH$wNI8*' NVI0M"L7 jP|`1ޝ< S_:Dl|`h<)hh>ͼA|"8 U/9.9 Pg!%87 jP|aof3)mIu@;\ 5;I %*NM a* jTe,l 1 p'r'&6o4cɛ̤+ghBMYg!4I\:э:yiH$btJ |;E`O;ɢsVcy\%NoXi"Ytj,ㇿ"B;0W$Yq@8q[Vqzgd9<'O?E`'}|raH*pxx~ =NO;ɢsVcy\%vr =NvraH2)| =N0 /O;gUx8mG-gpC`C"iFڏDl9.8<2^>2a>2`2c>2s2t>2r>2v!"@!"D!@"B!"F !F#x:~#!|2i~# :" 2i +}|~#:G:ix."2i+w# +6#!6#@A2n2?*j**|+`"d!"f!!>ڌo&͖=}  w~2ʸͼ56!+W ?_!~7z?ͧ:>͞@w#5.ww#w#w#w*>?@͌>w#͌5> w#@ͧ͵g 2q&0OxG͵j/ʆSx\͞.7:77!a{  ʨ ʨ0:?ŷO !y$ 7o&))T])))!y 2p_ :p($ (%!  > Û¿ (&"8&%%7/&C!9DM! !7 s#r! !9 s#r! !; s#r! != s#r!# !? s#r!' !A s#r!+ !C s#r!/ !E s#r!3 !G s#r!7 !I s#r!; !K s#r!? !M s#r!C !O s#r!G !Q s#r!K !S s#r!O !U s#r*~#foҤ !S = !!C`is! `in&&`in&!z =! `in&! =`in&|g}o! s`in&0|g}o! s`in& |g}o!! s`in&|g}o!, s! ! n&&! ! n&&!" !! n&&!- !, n&&! n&)!7 ~#fo! ! n&! =! n&)!? ~#fo! ! n&! =!! n&)!G ~#fo!) !! n&!9 =!, n&)!O ~#fo!4 !, n&!t =! =! `in&! =!=!*=!4 !) ! ! !O=!t=!=!=!=!, n&)!O ~#fo!! n&)!G ~#fo! n&)!? ~#fo! n&)!7 ~#fo! ! =!W9TTYCRTLPTUL1TTYPTPUP1UP2TTYPTRUR1UR2TTYCRTBATUC1 MP/M does not implement the I/O BYTE I/O Byte value is currently %d decimal, %x hexadecimal or [%s] binary LST: is currently %02x hex or [%s ] binary, or %s: PUN: is currently %02x hex or [ %s ] binary, or %s: RDR: is currently %02x hex or [ %s ] binary, or %s: CON: is currently %02x hex or [ %s] binary, or %s: ----------- Making the IOBYTE %02x hex or [%s] binary where, for the following devices: Device LST: PUN: RDR: CON: Value %s %s %s %s 00 assigns TTY: TTY: TTY: TTY: 01 assigns CRT: PTP: PTR: CRT: 10 assigns LPT: UP1: UR1: BAT: 11 assigns UL1: UP2: UR2: UC1: [%s] assigns %3s: %3s: %3s: %3s: !9DM!2=!o=!=`i6#6`i^#Vr+sn`i^#Vr+sn&! s#r! ~#fo+++! s#r`i6#6`i^#Vr+sn`i^#Vr+sn&! s#r! ~#fo! s#r! ~#fo#`is#r`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!" s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!$ s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!& s#r*~#fo|`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!( s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!* s#r*~#foڦ* n}`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!, s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!. s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!0 s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!2 s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!4 s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!6 s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!8 s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!: s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!< s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!> s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!@ s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!B s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!D s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!F s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!H s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!J s#r! ~#fo!=! ~#fo!=! ~#fo!C=! ~#fo!u=! ~#fo!=! ~#fo!=! ~#fo! =! ~#fo!==! ~#fo!o=! ~#fo!=! ~#fo!=! ~#fo!=! ~#fo!7=! ~#fo!i=! ~#fo!=! ~#fo!=!" ~#fo!=!$ ~#fo!1=!& ~#fo!c=*~#fo|)!( ~#fo!=!* ~#fo!=* n}!=!. =!c =! =!, ~#fo! =!. ~#fo! =!0 ~#fo!!=!2 ~#fo!R!=!4 ~#fo!!=!6 ~#fo!!=!8 ~#fo!!=!: ~#fo!""=!< ~#fo!V"=!> ~#fo!"=!@ ~#fo!"=!B ~#fo!"=!D ~#fo!&#=!F ~#fo!Z#=!H ~#fo!#=!J ~#fo!#=*~#fo)!#=!, ~#fo!"$=!. ~#fo!V$=!0 ~#fo!$=!2 ~#fo!$=!4 ~#fo!$=!6 ~#fo!]Ñ Maximum console number check routine at: %04xH.=!8 ~#fo! System initialization cold boot routine at: %04xH.=!: ~#fo!# Optional idle procedure routine at: %04xH.=!L9 This portion will tell you where your CCP starts, what your BDOS entry address is, and where your CBIOS jump table begins. The CBIOS jump table is also displayed. Your CCP beginning address is: %04xH. Your BDOS beginning address is: %04xH. Your BDOS entry address is: %04xH. Your CBIOS jump table begins at: %04xH. Cold start routine address is: %04xH. Warm start routine address is:  %04xH. Console Status routine address is: %04xH. Console Input routine (waits for char.): %04xH. Console Output routine address is: %04xH. List device output routine address is: %04xH. Punch device output routine address is: %04xH. Reader device input routine address is: %04xH. Home disk routine address is: %04xH. Select disk routine address is: %04xH. The set track disk routine address is: %04xH. The set sector disk routine address is: %04xH. The set DMA disk routine address is: %04xH. The read disk routine address is: %04xH. The write disk routine address is: %04xH. List device status routine address is: %04xH. Sector translate disk routine address is: %04xH. CP/M+ (3.x) extended bios calls follow. Note that some of these may NOT have been implemented by your system integrator. Check carefully with your manual before trying to use them. Console output status check routine at: %04xH. Aux device input status check routine at: %04xH. Aux device output status check routine at: %04xH. Character i/o table addr check routine at: %04xH. Character i/o devices init routine at: %04xH. Get disk drive table address routine at: %04xH. Set # of multi-R/W sectors routine at: %04xH. Flush host buffer routine address at: %04xH. Memory-to-memory block move routine at: %04xH. Get or set time clock routine at: %04xH. Set memory bank -- absolute routine at: %04xH. Set mem bank for next DMA move routine at: %04xH. Set mem bank #s for next move routine at: %04xH. Bios call reserved for system integr at: %04xH. Bios call 1 reserved for future use %04xH. Bios call 2 reserved for future use %04xH. MP/M II XIOS call jump addresses follow. Select memory segment routine at: %04xH. Device Polling routine at: %04xH. Start clock routine at: %04xH. Stop clock routine at: %04xH. Exit critical region routine at: %04xH.!! C*s#r*~#fo|T%!%W%!%!%*##>*~#fo|‰%* 6* 6%*~#fo|g}o* s*~#fo|g}o* sMP/MCP/M%s* n&* n&*##!%= This is %s %d.%d. !9DM`iw#w`i~#fo|ҭ&`i~#fo++++|U&! ~#fo`i^#Vr+s6 ! n&|g}o|ʂ&! ~#fo`i~#fo61&Õ&! ~#fo`i~#fo60! n&)s`i^#Vr+s&! ~#fo 6!9!9DM!/=!(0=C3>!B s!B n} &!B 6Y'!B n}Y'!B n}N&!B n}N"'/!,0=C3>!B s!B n} L'!B 6Î'!B n&|l'!B n&|w'!\0=*'!B n&!B sÎ'*'!! C!J s#r!|ҹ'!! C!!B n&! D!H s#r!H ~#fo|'&!B n&!C!!CA!? s!!C!F s#r!F ~#fo!@ s#r!C 6!C n&|v(!C n&! !@ ~#fo!C n&ns!C 4:(!@ ^#Vr+sn!@ ^#Vr+sn&!L s#r!@ ^#Vr+sn!N s!@ ^#Vr+sn!O s!@ ^#Vr+sn!P s!@ ^#Vr+sn!@ ^#Vr+sn&!Q s#r!@ ^#Vr+sn!@ ^#Vr+sn&!S s#r!@ ^#Vr+sn!U s!@ ^#Vr+sn!V s!@ ^#Vr+sn!@ ^#Vr+sn&!W s#r!@ ^#Vr+sn!@ ^#Vr+sn&!Y s#r`i!U n&&! !V n&&!F ~#fo!? n&!`0=!0=!F ~#fo!0=!C 6!C n&|^*!C n&! n&!0=!C 4,*!0=!L ~#fo!L ~#fo!&1=!N n&!N n&!S1=!O n&!O n&!1=!P n&!P n&!1=!Q ~#fo!Q ~#fo!1=!S ~#fo!S ~#fo! 2=`i!U n&!U n&!:2=! !V n&!V n&!n2=!W ~#fo!W ~#fo!2=!Y ~#fo!Y ~#fo!2=!2=!*3=!Y ~#fo!W ~#fo!V n&!U n&!S ~#fo!Q ~#fo!P n&!O n&!N n&!L ~#fo!^3=!9!H ~#fo!? n&!3=!H ~#fo!@ s#r!C 6!C n&|^,!C n&!. !@ ~#fo!C n&ns!C 4",!3=!H ~#fo!4=!C 6!C n&|Ұ,!C n&!. n&!!4=!C 4~,!H ~#fo!@ s#r!@ ^#Vr+sn!@ ^#Vr+sn&![ s#r!@ ~#fos#r!@ ^#Vr+sn!@ ^#Vr+sn&!] s#r!@ ^#Vr+sn!@ ^#Vr+sn&!_ s#r!@ ^#Vr+sn!@ ^#Vr+sn&!a s#r!@ ^#Vr+sn!@ ^#Vr+sn&!c s#r!'4=![ ~#fo!Y4=!] ~#fo!4=!_ ~#fo!4=!a ~#fo!4=!c ~#fo!!5=!N n&+++!e s#r!Q ~#fo#!e ~#fok!g s#r!S ~#fo#!i s#r!S ~#fo#!k s#r!g ~#fo!k ~#fo!m s#r!e ~#fo!S5=!g ~#fo!5=!i ~#fo!5=!k ~#fo!5=!m ~#fo!56=![ ~#fo!@ s#r!c ~#fo!@ s#r!Q ~#fo#!D s#r!C 6!C n!D ~#fo/!C n& |ˆ/!e ~#fo!m6=!6=!6=!C n&|¯/!C n&)))!7=! !@ ~#fo!C n&n&&! ! 7=!C 4!9DM! !QB! g>͐6!9DM! n&oB|Z>! n&a>! n&&!Y9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{BB`in}%B! ! s#r! 6#6! s! s! s͐n}->! ^#Vr+s! 4͐n}0?! 4͐n&@C}$?! oC'?!! s#r! ^#Vr+sn`is{.o?! oC! s#r! 4! ^#Vr+sn`is`in&3>}Dʠ?U?X?O?C4@Se@AA͐~#fo|?! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 ?! 6?! 6! ~#fo! n&! ^#Vr+s~#fo! ͞Bѯgs#r@! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s@! n}x@! 6#6! ^#Vr+s~#fo! s#r͐n}@͐|@! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+sÓ@͐6! ! s#r! n}KA! ^#Vr+s!|KA͐͐! n}(A!0+A! !9A!9~#fo#|HA!HB@͐n}ʏA͐͐! ^#Vr+sn&!}A!9~#fo#|ŒA!HBKA! n}A! ^#Vr+s!|A͐͐! !A!9~#fo#|A!HBÙAB!HB͐͐`in&!B!9~#fo#|B!HB?B͐͐`in&!0B!9~#fo#|?B!HBÖ>!HB!9!9DM͐^#Vr+s͐s!9DM! n&|ͯښB! n&|ͩ!9DM͐͐ B͐^#Vr+s͐B͐0B͐7s!&7C͐ ͐͐ ͉͐͞B`is͐ ͐͐ )͐͞B`in&#&7C!9!9DM! n&|ͯkC! n&|ͩ!9DM`iw#w͐~#fon&@C}ʼC͐ ?͐^#Vr+snѯg`is#r}C͐C!9 7:PO*R:noC2n& !o D . &7*+++:PG_*RDM*TT]!9D  OD > _ ^D n&!U n&!S ~#fo!/******************************************************************************/ /* PROBE.C Version 1 Revision 02 2 January 1985 */ /******************************************************************************/ /* */ /* Copyright (c) 1984, 1985 by Paul M. Sittler */ /* */ /* Released for non-commercial use. Commercial use is expressly undesired. */ /******************************************************************************/ PROBE will tell you what version of CP/M or MP/M you are running, display the operating system serial number, and display the I/O byte if appropriate. It then displays the addresses of the CCP, BDOS, and BIOS. The BIOS jump table will next be displayed including the extended BIOS calls for CP/M+, and XIOS calls if running MP/M. It then displays the disk parameter blocks (DPB's), disk parameter headers (DPH's), group size, total disk size, number of directory entries, space required for directory entries, total usable space on the disk, and the disk space allocation vectors for any selected drive (A: through P:). PROBE was written in 'c' to help decode the disk formats of a number of different machines to aid in transportability. It was inspired by BDLOC, TELL, ALLOC, SERNO2, and a number of other public domain CP/M utilities. My method of use of PROBE has been to move it to the target machine and run it after pressing a CTRL-P to get a hard copy print of the target machine's disk parameter blocks. Because of this modus operandi, I have not used any pretty screen stuff. You may wish to be prepared to hit the old control-S as it starts scrolling by. I have used the information gathered this way to write a "Uniform(tm)"-like utility (also in 'c') to change my disk parameter blocks to read/write a whole bunch of floppy formats. This works very nicely on my machine (Heath H-89/90 using the CDR soft-sectored controller), and I have plans to move it to Osborne and Kaypro, as well as certain others. PROBE is NOT a "uniform(tm)"-like utility. It is a tool I developed to develop one for the Heath w/CDR controller. Use it in good health! /******************************************************************************/ /* Files and what they do */ /******************************************************************************/ For PROBE version 102, the files have been broken into a number of smaller files instead of all in one huge thing. PROBE102.SUB Submit file to put it all together. PROBE102.C Contains following functions: main() calls all the other functions. getsysversn() gets the operating system version, figures out what it is, and splits it into version and revision numbers. Writes a text string of either MP/M or CP/M, depending on which it found. shosysversn() prints the operating system version. showiobyte() gets the I/O byte and displays it so that even my brother can understand it. He said "I never saw it explained that way before!" Well, neither had I, before. . . tell() displays all those addresses of jumps and things, for CP/M, CP/M+, MP/M, like BDOSLOC and TELL used to, only more of them. ASCTOBIN.C asciitobin() takes a byte and returns a null-terminated string of 0's and ones, grouped in two groups of four, with a space between groups. For example, 'E5' will return "1110 0101\0". PROBSDPB.C showdpb() prompts for drive, resets disk system, and decodes and displays the disk parameter block (dpb), the disk parameter header (dph), shows allocation block size, disk size, number of directory entries, total useful disk capacity, etc. Then it displays the disk space allocation vector as a series of 0's and 1's in a nice table. PROBSERN.C get_ser_num() gets the CP/M serial number and prints it. PROBSIGN.C signon() is the why and whodunnit thing that prints all the garbage on the screen at first. Also answers the wadduzzit do question (sorta). BDOSDEF.H Sometimes useful BDOS definitions that are used in some of the files. CBIOSDEF.H Sometimes useful CBIOS definitions that are used in some of the files. /******************************************************************************/ /* Style notes. . . (or soapbox time) */ /******************************************************************************/ I tend to 'overdocument' the code in an attempt to make the code readable for others (and for myself 6 months later). This is probably due to my mother having been frightened by an assembler when she was pregnant. My variable and function names are huge but hopefully descriptive. I had the experience a few years ago of needing to make "a few small changes" on old fortran-iv code that I had myself written only a few months before. You remember, variable names like A1, AA, A2, and no comment cards allowed. . . I personally feel that no-one should EVER be allowed to teach programming courses until they have spent at least two years doing maintenance programming. I am also VERY tired of hearing people say that "c is a terse and obtuse language." So is COBOL, if properly written. . . I hope that the source may be useful as a tutorial on both techniques of 'c' programming and system-level programming in the CP/M operating system. My placement of the curly braces is pragmatic; it is easier for me to see them in that rather baroque placement, and it enables me to draw squiggly lines with a pencil in a bizarre game of connect the braces that I sometimes play. . . Sometimes that's how I function. . . If the whitespace and comments get in the way, just use "HACK" and remove all comments, whitespace, line feeds, returns. Then, globally search and replace with your favorite editor and shorten all variable names and function names to two characters or less. It will save a lot on disk space, fer shure!! /******************************************************************************/ /* Who was that masked man anyway? */ /******************************************************************************/ Scapegoat for this drivel is: Paul Sittler - My Word!! RCP/M (409) 845-0510 (late nights) Veterinary Public Health RCP/M (409) 845-0509 (24 hours) Dept of Veterinary Public Health, Texas A&M University College Station, Texas 77840-4468  ! sD#|wQ!͐͐ables me to draw squiggly lines with a pencil in a bizarre game of connect the braces that I sometimes play. . . Sometimes that's how I function. . . If the whitespace and comments get in the way, just use "HACK" and remove all comments, whitesv7%ASCTOBIN.CH o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGޘ,"=*4o0 zĶӼeӀt]uWR.k,`31 [)wi^IƂzP4\cfLL<<,XOLG&s t^?NL~SL#OFLO~vȍBDOSDEF.HN o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLM6[~/ؑWVhƴ};ʄ26K3#ݽC:ۈH # P(C};ʄ~"vt_9;F"(Vhv0 vbFj63+gAV:D۷!Lwz`#H PmuoC^pb1#q'tF|T{Hu!ھ yex|so[ F. _9;FټD"(Vhv0 aݿίq'tF|TeY8Ȋ Vhv0 7e>:Hw63+gXip7Np[D۷!Lح~#}l. _9;B! Y W&<5z ?6piO٩0A{`+f^_F. _9;F #D۷!L2'W٩0nCpE`+a}d#:#rv*B,dETm2ᩙ2g i_9;=9d +BpWW&b~oF5d#:#rv*B*Ahv0 c4n|C:_] M63+g(hxFx= ھ ye7W& SaZQv0m2al7 GFtF|TrK +B};ʄ~i7 d#:#rv*@"D۷!LXïHH٩0mJ~/^Kp0Z@[D۷!LXïm d#:#rv*@K`+vM37i4وH Њm2al;FtF|T6N7+R W&s4 ]_!M63+gxYUnV(D۷!L85i_9;uEoC^06y\4Hd#:#rv*By x]W&<5iE~4وH VrD۷!Lxjz#d#:#rv*{rȵb`+fޝH'FtF|Tv#6D۷!Lxjtwi_9;=9w_Jm2͸q?# M63+gxYn8F3W&q@4وH FN W&,|q|i_9;F +ƹ]um2ᩙwڋ+FtFhxlQA1B@};ʄҌH5d#:#rv*@ޓC TW&q7; FtF|T6eFP(K1oC^f\x& Sa,eFP(K1`+fY4]|DlDg$WN:!߄hv0 K3nlH'FtF|Tʆ"_ClDg$WN# yKu7 ?[!L ~#fo! !9!H ~#fo!? n&! !H ~#fo!@ s#r!C d#:#rv*@K`+vM37i4وH Њm2al;FtF|T6N7+R W&s4 ]_!M63+gxYUnV(D۷!L85i_9;uEoC^06y\4Hd#:#rv*By x]W&<5iE~4وH VrD۷!Lxjz#d#:#rv*{rȵb`+fޝH'FtF|Tv#6D۷!Lxjtwi_9;=9w_Jm2͸q?# M63+gxYn8F3W&q@4وH FN W&,|q|i_9;F +ƹ]um2ᩙwڋ+FtFhxlQA1B@};ʄҌH5d#:#rv*@ޓC TW&q7; FtF|T6eFP(K1oC^f\x& Sa,eFP(K1`+fY4]|DlDg$WN:!߄hv0 K3nlH'FtF|Tʆ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr.atgǰYHe4.ak%ؿoU ] .] A鶬2cJ.{7Je~%쏜 kDQH aZ%%M.atdMYGO-)iB͑y4-R !14d%2-] Z2^/|~{?hu挬 $ҊҴ7.c&\i7} }bp?4C*$TJGn$)%/yPiN4gȅ\0DJ@.$ kR ]3$ T 0xT.v)B:`< wW`挹0+0Ʌ\ze f!O)X$Rr!WXhX%,P2]&OJ*;9SH B x2%9J#2 0 by<ҘW%e4쯽yŰJJO~l#Չ6zuw162 Fw162 FJKQ;:`ɚ$߾?ENbIBxl./%=e^:د9~o~uqoO_]?] MLSᨃy~x`v)p~<~_?e?=?] ML5)p~<~?wt|w1۔2#RS菟(%=e^^p)%=e^>..`Oׇw@Q__PT)rs...ئSxbmDOׇw)pys},2/G8GbmDOׇG8Gbi~ʼ>p۾Z2G8G|w@kS|ww16OׇG8GbQsLr!,ϱ3qW Zb$T'KY`Xû`0ɩ ]]+dԪ(yŚ@Kgou1/! ڤ!ȥy"xlbmy8ǐo|{v?`9(g1ΐdCi(4,] MRd'eVAiIby.Ke1Ġt HJbm 4ͧ~?x :CI\:#sV[e)4aɻUTXltUiXoy$f] 18 dVEU&RFw bM44q$<2VIހTB%b ${Qm !jN%cP$!ɒ@KF* a 1tXQeyw1۔pIaA~w?/:wc 3Âs#0(] MQicRiXo}㡃}O$JT.pa;õXlaia?JIRҠ$Ql[Jzʼ>f] M!o.>?h+!XSe%`Xlaia?JoJJK϶E2Ef] M!o?>BI\zÒw0؟\KI,00"bPZY_nt?bm 4'õI8pW<ۡw1<.*r"d^ږw16Jqpv F5Z.H-.Fi±Jwy 8eFKS2e%P(M86T#< EhiJFL""xl4+%y~qGQ*IȼV-]&ZbSQpQvq"FQvk2e%0` Ϝ2vtG2תe$RK,4!qt$g _+\Pûqt$%$Nתee)] ҄Wf#̚A$R{=[⌬ Qpe7<#H.%d%oZ3QpD⦃ $R{].Fi䶃 [2Z ,] ҄;J< W )gR»` Ϝr8\>Q(bH.%ΐܒ.Fi"`8\BCr-q䖌w10H9sưnbm&|$I`Gq%7RIBjJ.] ҄;nI$s˟DҲL(͉jS 2( TBrKFby9cX]՘>v3LPriV򚆲'LH9 fvDj34 bm&|ҪJ+RTb$RK,AjY»` ŚNr,%Yd JC.FiUU2</GLj`3Ǫ*I}~ -!] ҄ߕ\vy^~uyY%Fj>g,UQ3Ҵ7J` Wf#xe 2_xeCi̚] ҄{kqxN`$Hmixl4:y^^A2a+#_ Ҕ1Qp4vtA2a+#h>^}Y3QYs +^ tXH̍ae֌6%QIwy>\Ad挹 I'".Fi3K8|x9`bs#0J2Q̒}<>Ad挹WT F%lST$~arTƣ*K%ca* HJD)*S S I,r,%"% To>×ժ~ɩOgq;|Y PJH4JeZp>~lS9.;ؿs  oe*r,%a?qK.$h` jU ,XJxC ͏cUsL Q3Ԙ|Aq{׳` !,XJxls<(#qЗ_CJ7JxPF",XJR0d)] x\v %AKc_V)gR»bm 8/:ؿs  oe*r,%y9&_jL Q׸~yF",XJxls8Ǜl$~z`]r{hhI@p xlS.hq$z/H5nozp#N2 ( bm um*9&_jL Q׸Y8ï(1Z%e0`D]w16_)I8 u=C$x=`q"F$!2 ] MA`JKc u[ugGxE%2.$꺋yY/H 5&_k )@5eP8a w˳jx8c$# #ZԶ,%)Hulʬ|Ag1D]gl<=ʬd@"7hH.w16bm|Ag1D]g<#H.%d%oZ3)H ulsD|Ag1D]g<GL j5w16bm$8 u=C$x=q|9d䖌V xlS.)1D]Pc-^:y.?A2!R΂w16bm9ec u[u8\>Q(bH.%ΐܒ.ئ Q] ͏"9&_jL Q׸Yy.uG!8CrKFbm\5 g|Ag1D]gA+ blbm 4ͧ~5>QZ+}`))?^㶘u16PSߚJǷwDi R΂aCݫ~&9bm 4ͧ~5o)gRBSlz{uod#_̺`B(MoM%p;|Y PJ'JK$:7tؽ:ǃ2rBiOF2CRa*Rr,%}l4%.*0)͘"hINY=6ZYlSi>}l4%mEEE")gRBS؟nz{uo6ͺ`B(M诔$d^a***0)H9 Ja~$ͺ`B(MJKd^a***0)H9 J?^ۋJYlSi>)@jJAfK %O ]v3bBiOF2+FVT4#,XJ(y ]v+YlSi>}% HiFYP6lz{uofBiOF/ $R{ HiFYPWgͬ)4_2$$d7")gRBS`Cݫ~{$u16PSKdǫ0)H9 JdCݫ~{ǔWiBiOF/SFVT4#,XJ(y nCݫ~)Ϻ`B(M%Q(bd%o LEJ3R΂?aX(YC c f! ߜn#T'K.1PS_)IȼV-CRJBfK %Olz{uoR$ͺB(M;nHZYSҌ`)醮Wg[IϺb\ȧ5 9>`vj wg wU] ba"9l7uA6ܔy<b2Q?ba"9-͊a%K*-=i5Ԫ(yŚ8cX`a*ϺFئHNF˅$^AiȈ3x $x^XJ`t~06EEr7z  O@dВWgϺFئJ|7hiJUSҌD͆Wg6ѾñFҬam 4ͧ~vȼV-C"HJTIKno LEJ3?^FU;%i06PSU;d^a***DDT4#)6tؽ:1vFҬam 4ͧ~IX@9JCH9 Kno LEJ3bCݫ~h#i(g] #lSi>}L"d^%Va*R'?^Fyu1M!o3!+y,ԚAi()gRBf$:YaQi(g] #lSi>}DŽo`XU%/ݏ!%#$HiFS؟lz{uoc;\U%)3baB(Mߕ\bi$as")gR")6tؽ:1~WVr9baB(M+^+^P+fSҌD͆Wg6ѾÕYam 4ͧ~ F@2Ԋі0)Ht 6tؽ:1Պg] #lSi>}DŽX`H_|4HSV"Na ]vm };.Wu1M!oV F@;̚!LEJ3bCݫ~hi7.)4cŠW7s#yGX5Cf$:6tؽ:1~2ku1M!oe$T,Y9cnB4@S?^F$am 4ͧ~(#Ѧ%KkΘyE`Tamz{uoc;0)Ht ]vm }瞧4baB(M;JЖ0)Ht ?^FU;#i06PSwd io LEJ3ӆWg6ѾG^PκFئJ|7"BjS 'hSҌD_oz{uoc;|j06PSWiV Ҕ ]h@f$:YaQi(g] #lSi>}+(HR)2)3cT4#醮Wg6ѾUU2.)4~[2:Pd´+"Namz{uoc;r0010bp޾w18&kRO3_{<6B%ajg \Q}b8a f!418o߻LYGONBd$2 8)͐raZ2TJD)l.a.4r!,9L"' IšTFC0UBs\l$T?.a$fУ ƣ YHe4p:YB/d9BYH Z&Xhj5y$ IZIe4QG0 3\5 -AI^+V ؟zhIB.$#0J A|z]$>'bp޾w1ȅ\~y H,A'L IšTFûbmd!d īm--&Lr!,3- wgu1'Σ]r{:YˆÂfkRûF$.F j?0.yB.$#,M%Bӊ] c\5 gt gH:C0UB#O, @ \ȧ5 qyYHe4q bB> ^+9:ؿ8k%xw16?!؆KɰpJn#T'K.1r!,28$rBj |y!FdЋa(0ʅ|VRsLr!,~C.՜ rBju$M%] I$Js#PGxh<,P2a 10bp޾w184r!,f.aylP'KpHU3)_y F.䚅,BiOFo~$ĵu>goa ī-B>YHer!TFϺba b] m\GВoe*r,%K\]+| bmYHe4p:YB/d9BYH Z&Xhj5y$ IZIe4QG0 3\5 -AI^+V ؟zhIB.$#0J A|z]$>'bp޾w1ȅ\~y H,A'L IšTFûbmd!d īm--&Lr!,3- wgu1'Σ]r{:YˆÂfkRûF$.F j?0.yB.$#,M%Bӊ] c\5 gt gH:C0UB#O, @ \ȧ5 qyYHe4q bB> ^+9:ؿ8k%xw16?!؆KɰpJn#T'K.1r!,28$rBj |y; This is a submit file to aid in putting together PROBE.C using ; the BDS-C compiler. PROBE was written with an eye to portability ; and should compile with VERY few changes on any 8-bit CP/M based ; c-compiler. ; cc probe102.c -o -x ; with the BDS-C compiler ; -o provides some speed optimization at expense of size ; -x will abort the submit run at an error ; cc asctobin.c -o -x ; cc probsdpb.c -o -x ; cc probsern.c -o -x ; cc probsign.c -o -x ; ; Uncomment the line that uses your favorite linker. I like L24 best. ; ;clink probe102 asctobin probsdpb probsern probsign ;l2 probe102 asctobin probsdpb probsern probsign l24 probe102 asctobin probsdpb probsern probsign ; ; That's all folks!! ;  folks!! ; /M you are running, the operating system serial number, and display the I/O byte if appropriate. It then disp/******************************************************************************/ /* PROBE.C Version 1 Revision 02 2 January 1985 */ /******************************************************************************/ /* Updates and Responses to Entomolgical Cybernoids */ /******************************************************************************/ New and Improved! PROBE now shows the CP/M serial number too! Big deal. . . Got a bug report. To wit: Bugs in PROBE: 1. PROBE will not detect media changes. Changing from SSDD to DSDD will still bring SSDD data on the screen. Might have to explicitly reset the disk system before logging a previously logged drive. 2. On very large disks, PROBE goes into a loop, displaying the ALV data over and over again, until aborted by a ^C. This was noticed on an 8MB drive with 2048 4k groups. Bug fixes. 1. This was an artifact from the way I had written PROBE earlier, when it simply cycled through all the drives on-line one after the other. It now does a reset disk system and should be able to recognize media changes (if your bios does). 2. Unable to verify this. However, I did have a few variables declared int (range +/- 32,768) that I have now changed to unsigned (range 0-65,536). Hopefully that will take care of it. Have verified correct performance of PROBE on following machines with hard disks: Kaypro 10, two 5 meg partitions, CP/M 2.2 bios versions E, F, G. Zenith Z-100, 27 megabyte hard disk, 6 meg partition, CP/M-85, 1436 4k blocks. Balcones BNV-205 w/20 meg hard disk, one 4 meg, two 8 meg partitions with 1028 4k blocks and 2016 4k blocks respectively. I really appreciate the bug report. Would like suggestions on a non-bios specific way of checking the skewing of the disks. /******************************************************************************/ /* Who was that masked man anyway? */ /******************************************************************************/ Scapegoat for this drivel is: Paul Sittler - My Word!! RCP/M (409) 845-0510 (late nights) Veterinary Public Health RCP/M (409) 845-0509 (24 hours) Dept of Veterinary Public Health, Texas A&M University College Station, Texas 77840-4468  iversity College Station, Texas 77840-4468 y do */ /**************artitions, CP/M 2.2 bios versions E, F, G. Zenith Z-100, 27 megabyte hard disk, 6 meg partition, CP/M-85, 1436 4k blocks. Balcones BNV-205 w/20 meg hard disk, one 4 meg, two 8 meg partitions with 1028 4k blocks and 2016 4k blocks respectively. I really appreciate the bug report. Would like suggestions on a non-bios specific way of checking the skewing of the disks. /******************************************************************************/ /* Who"vPROBSDPB.C o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi2jklmnopq=rstuvwxyz{|:m}~ic^VG@><;96-,ďO ~&+{n 7768W('<p"+#q>9?r>/BVa]*+gڧEȊ"RX=>$+{n|'gG'g?+l k.tYD7|r&~|BJsbY [ ?YBK"h>!̄\O0'>4.vD)2HALh|BJsbA2||1D)2HALh|BJs!"0Z)>"tJzF8fRq>!"0WZ)>"tJzF8*Ҋ8Rq>!"0IaD| lN\3N!'h}R؀0aO>)N)ȜKUf.>lžL{uQN )cKǸbU<8yz5Pi袰fJ Θ(bg"q>u34( Ea3̈́ `O] qoX] jXV0'>4GYFˉQ. i&l@YlL=c?8yz{8DVްڽz{Wꝷ{gX}|BJsl rbԀPN`AiQ6`O] Ea3̈́ ⎠a>+öPB( u ݰZްmհؽ3vo Z$XE`u z,קL:lm*rw|0RRP|6:ۇ/-W 1'HqG$*LYIu z%8e $*͐递 `X%$A}:n`~JpP`\lpb|:g' ?A#>I'%8e eaA8X'Ĩ. -Qv%opeaA:%8Az\.}fSgn ?.'F tQlz{,c8DeViOA4'0=P*0Χsk )iAR0̴ZV|Vq>u3޶( 2f]6Lp|:g}-XcP6S8D_%2Xƾea)aOA@ Ggp媁2fl>erHqG0' i ۶3P_Zۂ$O rf`\gDmVkXE0Χsїt*BuaOEJ 0Χs+)cO(T *B+d1a[`O] g\g"B9UB"g%3OA@ WOP_Zh8I ۂUžL`y5I2f9A ̈́ اYh16h-q>u3>לl^h>"bNX/c"XS9%er0,46$BgZ"S9 {*2]@tIa>+KhN`8D/3`O}PtIrKS9[1%d9Uguf˂i8 / >}{/-W +IJ{.ʉd5˪\+hN0ΧsѷC N|͉k&l><9A{Jq"H=#ȌkUVМi8 J ={rqh8I rTqS9/+Ut@IKRYEـrAZ)NR–L@ -3P*+8q>̓2?p7'_\5')a[hȌkUVМ4Z!m.5'S9賊*NIA 93Z)NRBHS9h[ZA:i8 3ԗ$%l qͲ* \B9އ'`u (rdS. i&l3̈́ g0Χs_UBB+IJ %ږ8r*=zz| eaP;{gpUf(leaRDrb$aO)N)0C%0:,#"(!gH8̃$GgpU|VmY>$f)80RRPJqGJatWA N|a[ # |!Y92ٔӈ3ٻ=@]N^(jE %6|BJsdrD| Nr5ٻPԊ@ rKNY|BJsdJ/գĨ텢VRr01#bN0'>4Ga%و<=:@]N^(jE Jv!)cKǸbU#SPՈ!( ا.3Yalbs\ YY<[P\k\s=#F\}O}اLE\7Ob'<ωקIJJiF:^ uS}S!} ~=u}IO]O'DAVxk#VxfɧN ?z!؜'|d^Y>AYLvK!+0G>x }\Q?\7O>!( اNqOXyOeuӌ>ԉbZ"n|}:>aSו0!S'ZԨx}u{:ZqOnƧاLEyQѧl`"iC?S\VP\.ѧ䤇'|D>qBoߺ/޺,4xr ex=ğ`Ob_*+۷N޺fٌpĠ 'h|SyXVV[ONmY63TPƠ'\V Kpsg 6 A,'J+aOhQJqVX6?8BVcĹY6C3ssԂ :XVrq>ԕ'{<(. $1(. q+?q>uƒ eg0'lJeewo]}pllG90ġq>ud6g`On>bR+ŁJeewo]=zY6#brĠk>CYlV0'>g+Jg !gB 9 |')aO>!VXxݛbm 8iVrq`OT^JƟX!gx1" f4|Bd OVMv`ox<:@}ijꢜAR,q 0'ľV093xpu91jP6 +2:c8a3ݎ;O.'F ffZ0'ĞgXo#୯.'F Q`i98{%gX69m-j3cjFsgw媁rwP6+> nlQU3";/-W 1'HqG;b%V093dy5Ea%n2 +vD;@]N袰2Xƾq>! BmrƷ[&g|xՌKU%8e YE)۶ nlQU3";{'I|$ |}*jqw{O;gZϸٻE)Y1Wt|B3ٔV09Ggpw{5ٻP#@ Jl g+vD<u91jpw{@hu`O}d9V0938zt5ٻPԊ@ Q&f|B3+ɰnGӓĨAe%Y.:`O}+`rƷ;gprbԠ1˥d1aO}!%V09#8G'ˉQ锐Ptq>cZ)>"~ $1VFB2l 0'>gvoFĿur+#f! sgpw{!sD+2h6JsgkgĈKU[Jb)X!g|DHOٻ9eE eaZ)NR8r+,G<;#v zgI+pwRX S&ZA 98:dJƟX!gx1" rq Ed be&u!rd"Hƛp9I l ZqNaOSP'^LfKj],7X"Hƛ19N9'IAKhR'HE8q>!ZfB0[PbŮA2ތp9I AK"h>A2.)'>"^/"g9`Vrqh8I !q|saC|7s>mT^jx3bϙ׋pUrqh 43Y>7f Ϲ׋`G[oT^jx3طXa9B1voF˹8Z;^oT^JƟO}>g^/",#qꓯ61=L D|^'>"^/‚P,ȉl@|Y!9zlO'P|;y`1zl}Bs.k",؞1'pt=_om5O}E`m^_6L؀ZX"?Y6X8Z;pt|ŗXntbY oFz v(lC|Ykpw Z-#b/ubŮA2ތ>!9zlOpʘn*;Bg' V8Z^87 7 '>"^/‚L W\gćm+!`1zcvc۶} LEX-JzF8f kB tnF|d^;ytu'O<<<'<;9wnF'EX1pw hy1p>8Z;pw -q>^o|: JYmP x mm r۶OVQ|x9rg^/UEٻE#-!t"`F3'"`݌>!9zhy}`M) 'ľ 6>u9G{Mdxь>s&",‚=\ψG>a)أLt`@'ź}Bs.k",텢VRrՔf 8Z;F쏮Ղ=?/n!rd)Mx)d}Bs.k",-NΘ'~ikŗrd}Bs.k",Fy.)fx^\=jkŗ⇒LCf Ϲ׋`Od8Y.ـn 8Z;F쏮zS_fVm2+ɚ'>"^/‚='1˥{j% er'6XG{LjѵZo|LCWLCWbsX[aN"{Bգ+hy?Vŗ,LCf} J>\EX,bpl*r@#"')!$oQ"7>ufsا+oF|BsƱ+qr,rgV0'r+,G<bm 8iVrqTv|P2\ 9ŋwg0D`*%_8|B9z*r@#"-!t"`F3'"`݌>!9zhy}`+oF|B[Q !wF˹8Z;^oT^JƟO}8VPy#7@C8r@ Jq +&g|mEmrƷ[<~W͈x zrurՀqd h8 vwFur9>q 3YVZAs +yj36آ69-?ƫf~~媁6,r`O+X69m-j3cjF=zKUJqgr+&g|mEmrƷ[<~W͈x nN8@}ijU *NIA 9Hb}Pn1^5#3ԗJYO (l}ʘq>s&",‚W2f9Hf\L؀n}ݧtnFz ĞY$E Hʘ`\_=jq'>"^/‚ N|B9o[,rn^bsX[a=V{"MAدp>^oT^lFz vSQ6 t8%%qͲ* @}sEدp>^o2ߌ>!9zlO2A46`2f9b_Eدp>^otߌ>ؗ͆C)+1RV͈"(4tQL3af#|3DaˉDPĈD r:q>uK`LNSP6 +2|3hu,G]ʪA9AKuD8`O]Ӆ#RVg0'{f١wtB [͆C)h"0t%)"Y91sg ,/& al>C-@46,l6LHU|3( #y\U%g0Χ.;N9'II泒8lSn繄q>uRh-G9{ˊ8U|3<0t*f#n78%$]V9"Ng0'|B$3l\U0a[()cO |3_纐`aOR,P|za|3ȋ t| WJqGJ+ԊϰŮ͈x ND Jpʘ(0>a.I8x ޾rb$7`A<0JsI sgZV1'gH~B8x XE`a>+öPS,`O]!9za*LC46,l6rr;!AHQxVNzS_͆C)}Bs.k",UE`JRp3 g8pfgH7>u%P;:TBbsX[a*-1'P`\DYl r  ŗJC bsX[a.+U\p8p3 g8p3ʉ\o|K%wt'>"^/‚=!/)4y%L:lmp3 GoxVNzS_%JqGJȡ}BsƱqF?:I 9`J(l1ˡ$%'>g+bD3Đ3ff OZ)NR8{fYj%gbo3`"0t0a[S{gf OH8;Dl^hF N*q>uw2] g%qeaAB|b JSHV Div|B[Q !̲bn}DZok}S; .tP}޾rb$*[F!9zaH=Þ46Aag%,l6JqGSs&",Xݽq۸~^tnzo݌>u}>g^/‚]sE\p{\Equ3}OhQV ASOb r.C+dAOF91`q-#~|z v>>XFcfD|͆0!) fQ:rbt泒8f󂉼`O]|^h jnSO>u΀O('F9hmQKy|̄`.^lt_ oF΀SIR`$>D)$"8z}$7/E7O'>'>o4o~WOӿ?///ë/<}/Ǐ_OZX"?Y6X8Z;pt|ŗXntbY oFz v(lC|Ykpw Z-#b/ubŮA2ތ>!9U\p8p3 g8p3ʉ\o|K%wt'>"^/‚=!/)4y%L:lmp3 GoxVNzS_%JqGJȡ}BsƱqF?:I 9`J(l1ˡ$%'>g+bD3Đ3ff OZ)NR8{fYj%gbo3`"0t0a[S{gf OH8;Dl^hF N*q>uw2] g%qeaAB|b JSHV Div|B[Q !̲bn}DZok}S; .tP}޾rb$*[F!9zaH=Þ46Aag%,l6JqGSs&",Xݽq۸~^tnzo݌>u}>g^/‚]sE\p{\Equ3}OhQV ASOb r.C+dAOF91`q-#~|z v>>XFcfD|͆0!) fQ:rbt泒8f󂉼`O]|^h jnSO>u΀O('F9hmQKy|̄`.^lt_ oF΀SIR`v,PROBSERN.Cg o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefƕXO'Wۯ*xwW,5[!~wv<˽7&'c䔓qer2u7TC]WZ_aa c{~np>>4Ĉ&'c_ypQ3\ӀìgĊSL_Yqer"~8dl\js6SZ cj9ߟuܐz"g;txݗ{596:_ s(i6:_7H$x P"1kr2JM?n)8A nCZ_Zm)8 8sp `MNϻ|+ciAZ'|5!h8)kr2-atP- g YAANZ'hψtpX4bĵ59 ijs8؜Oׂ ?"8\! "G !9uAkr2'n Z #iTᔢoOnSL1E59xǚ )8] xאpC@UOkkr259n 9qp t] PHKiz܌oY TTyO6(q4cp~,Zr~i G=H JaR 59 i (#CZfjl7mAj4ct^D/&'c!-P*@UO\Akqzu[:\:!X8] ^Ӳ AUO&p@!xc!ꉧ{&'cA7A@UO A.T9l{ğXO'n zB 8n\.T9Ƌnwb7EŚEcMN" %Njr7#4s@ZXMr ~CLd,kr2]nxx{z?xql-p59x000#kr2՞8ꉡj,Y5XUO ]Wg2594TЏe|\hFXW{'C`9/9#kr259x%(Wt]PA:_ h8|xp>؜Oı=R`MNVk1v)GK盯VARQA<uiICUOXTNv ^@Zx6רt盯4x?.>\mVf'WWp&'c:mP8 Miׄ 3NAPP!hTTy#޲&'cV')kr259x  L(HK8AZx W RX -rǏu5 7&59 E0!-Y:qp t]0 -A ޲&'c'FQQy<- R_Wkr259W&+߹7mMNƕ)Gū w•¤FE1.7{Úo)b]W])|p0)QQy E\]W=1ɩ*4(bO5Va@yA4zBf3bH4fo&u ;O 4j" >h!59!R&? ENȉc^t] xKkvP1AZֱ䔓qer2u AcQh 59W&׃0)⿌U$|B 8AZx W R&'Q q`sAx>ǻww|6G+Õ¤ qu]=t0)8*^aX#*ܠ )Xz}(b]W])LJ"~g,@<qp t]p0)krB\+bw;ǧ % \S`A 1E䄸Vڟ> <愸1S_H/^׊XCǁs{{ǘǧkcq@9-`X22w) 3sZ259儸8hY}f v j*(5o?LNrz׊XCW Rǧ9!Zwꧢk'FPx=Y>~Y>ޠIN/Zk(b'XӜ-OSAg<.P*L껓^Ƶ"~7QNgǧ9/SN9SN9) 'ľ 6>u9G{Mdxь>s&",‚=NAPP!hTTy#޲&'cV')kr259x  L(HK8AZx W RX -rǏu5 7&59 E0!-Y:qp t]0 -A ޲&'c'FQQy<- R_Wkr259W&+߹7mMNƕ)Gū w•¤FE1.7{Úo)vPROBSIGN.CS  !"#$%o&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRm-ߕދD-_ΏV[B1x>NwXMH؜q[.M?.M^eSw>*b%*Vi'x<_|>/#x$}S#| UJw:%*b%nj<`$rwu޷ 2x)A#aͱy"Vi9!L2#dt`RRX9l`$ÿ.wWy"V2 6hc3/3pIV>QZF 6}S#| UJ 7 |z V7ƚ[l2 *' JS,F@#iu kp+d@Ύ`!YMP r˾w>*b%+gi9;f5:17 edZL0ŲojX L(oI |UX9 ##'3dVXMT+)>j 幒XMT+A/;<Xo7 Gƃ22nr`Hb7%5RE@anLVlY3ZXΠd(,N3pIy"V`(-gX8==޿{~y`$Ú- Za˾w>*b%;-tҤY+e;H䯳 W([lFl^Aq/q}{{qx"b޷XMT+AcGa/lx=OG.XUƲojX 'W&Z1uINx6[J˾w>*b%_.%3Ȑv2=4 }x{NwXMH؜q[.M?.M^eSw>*b%*Vi'x<_|>/#x$}S#| UJw:%*b%nj<`$rwu޷ 2x)A#aͱy"Vi9!L2#dt`RRX9l`$ÿ.wWy"V2 6hc3/3pIV>QZF 6}S#| UJ 7 |z V7ƚ[l2 *' JS,F@#iu kp+d@Ύ`!YMP r˾w>*b%+gi9;f5:17 edZL0ŲojX L(oI |UX9 ##'3dVXMT+)>j 幒XMT+A/;<Xo7 Gƃ22nr`Hb7 This is the release date of the disk. TOOLS H g PROBE102COM kCROBE102COM {-CPM113 DOC PROBE102DOC |ASCTOBINCQ BDOSDEF HQ FUNCTIONASM PROBE102CQ 1PROBE102SUB PROBE102UPD PROBSDPBCQ )PROBSERNCQ PROBSIGNCQ CCREF .DOC 3D 6A 2048 16 GREP .COM BE 4C 10240 80 GREP .DOC 29 21 2432 19 GREP .C 04 6B 8192 64 TOOLS .CQ 0C 63 9984 78 TOOLS .H B5 AF 3456 27 PROBE102.COM 5E 9D 17280 135 PROBE102.DOC 00 55 6912 54 ASCTOBIN.CQ 5A 3C 768 6 BDOSDEF .HQ 5B 67 2176 17 FUNCTION.ASM 9F 6A 3072 24 PROBE102.CQ DD D8 12672 99 PROBE102 Fog Library Disk FOG-CPM.113 Copyright (1986) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. DISK 2 of 2. Small 'C' compiler. Filename Description -07-00 .86 This is the release date of the disk. -CPM113 .DOC This is the description of the disk contents. CBIOSDEF.HQ 1420 3K [Small 'C' 23 of 32] RUNTIME .ASM C594 12K [Small 'C' 24 of 32] RUNTIME .TXT C954 2K [Small 'C' 25 of 32] STDLIB .ASM 1D70 24K [Small 'C' 26 of 32] STDLIB20.DOC 44E9 2K [Small 'C' 27 of 32] STDLIB20.TXT 24FB 3K [Small 'C' 28 of 32] C .DOC B40A 4K [Small 'C' 29 of 32] C-LANG2 .DOC C2F6 1K [Small 'C' 30 of 32] CCREF .COM 35CF 16K [Small 'C' 31 of 32] CCREF .DOC 3D6A 2K [Small 'C' 32 of 32] GREP .COM BE4C 10K [GREP 1 of 5] A Unix-like Generalized Regular Expression Parser from the October, 1984 Dr. Dobbs Journal. Pattern matcher implements most of the features of the Unix utility of the same name. 'C' source included. GREP .DOC 2921 3K [GREP 2 of 5] GREP .C 046B 8K  [GREP 3 of 5] TOOLS .CQ 0C63 10K [GREP 4 of 5] TOOLS .H B5AF 4K [GREP 5 of 5] PROBE102.COM 5E9D 17K ver. 1.02 [PROBE 1 of 11] A utility to display various information about your CP/M system, BIOS jump tables, disk parameter headers and space allocations vectors. PROBE102.DOC 0055 7K ver. 1.02 [PROBE 2 of 11] ASCTOBIN.CQ 5A3C 1K ver. 1.02 [PROBE 3 of 11] BDOSDEF .HQ 5B67 3K ver. 1.02 [PROBE 4 of 11] FUNCTION.ASM 9F6A 3K ver. 1.02 [PROBE 5 of 11] PROBE102.CQ DDD8 13K ver. 1.02 [PROBE 6 of 11] PROBE102.SUB 5819 1K ver. 1.02 [PROBE 7 of 11] PROBE102.UPD 469C 3K ver. 1.02 [PROBE 8 of 11] PROBSDPB.CQ FEE7 11K ver. 1.02 [PROBE 9 of 11] PROBSERN.CQ C88B 3K ver. 1.02 [PROBE 10 of 11] PROBSIGN.CQ A30A 2K ver. 1.02 [PROBE 11 of 11] K ver. 1.02 [PROBE 2 of 11] ASCTOBIN.CQ 5A3C 1K ver. 1.02 [PROBE 3 of 11] BDOSDEF .HQ 5B67 3K ver. 1.02 [PROBE 4 of 11& Fog Library Disk FOG-CPM.115 Copyright (1986) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. SORT programs. Filename Description -07-00 .86 This is the release date of the disk. -CPM115 .DOC This is the description of the disk contents. BSORT .COM 0D74 4K [BSORT 1 of 3] Combination sort for fixed length records. Squeezed ASseMbler source is included. BSORT .DOC 9862 4K [BSORT 2 of 3] BSORT .AQM 433D 28K [BSORT 3 of 3] EZFILE .BAS 6EC1 22K [EZFILE 1 of 2] MBasic program that creates, adds to, and changes sequential files. EZFILE .DOC 3742 3K [EZFILE 2 of 2] QQSORT .COM 1D1D 8K [QQSORT 1 of 3] Quick sort program. Pascal/Z source code is included. QQSORT .LIB 7996 3K [QQSORT 2 of 3] QQSORT .PAS 5B5C 4K [QQSORT 3 of 3] SHELL .COM 7304 7K [SHELL 1 of 3] Shell sort program. Pascal/Z source code is included. SHELL .LIB 6032 1K [SHELL 2 of 3] SHELL .PAS 6C7F 3K [SHELL 3 of 3] SORTC .BAS 1ED3 4K Variable length, variable column sort in Mbasic. SORTFILE.COM F7DD 3K [SORTFILE 1 of 2] Sorts an ASCII file in ascending order. SORTFILE.DOC D566 2K [SORTFILE 2 of 2] SORTKYBD.BAS 0268 3K Sorts keyboard input to screen listing. SORTV .COM C67E 2K [SORTV 1 of 3] Sort for variable length records terminated with CR/LF pair. MAC source code is included. SORTV .DOC 3170 2K ver. 1.2 [SORTV 2 of 3] SORTV-12.ASM 439E 13K ver. 1.2 [SORTV 3 of 3] SSORT .COM 7B95 14K [SSORT 1 of 8] A merge sort utility with up to 20 sorting keys. Allows you to use different collating sequences. Squeezed BDS 'C' source code included. SSORT .DOC 60E7 6K [SSORT 2 of 8] LEXLATE .CSM EBAF 3K [SSORT 3 of 8] SORTORDR.ASM 639E 11K [SSORT 4 of 8] SSORT .CQ 0FE4 15K [SSORT 5 of 8] SSORT .OVL C4E0 1K [SSORT 6 of 8] SSORT .SH FC44 1K  [SSORT 7 of 8] SSORT .SYM B053 1K [SSORT 8 of 8] Pascal/Z source code is included. QQSORT .LIB 7996 3K [QQSORT 2 of 3] QQSORT .PAS 5B5C 4K [QQSORT 3 of 3] SHELL .COM 7304 7K [SHELL 1 of 3] Shell sort program. Pascal/Z source code is included. SHELL .LIB 6032 1K [SHELL 2 of 3] SHELL .PAS 6C7F 3K [SHELL 3 of 3] SORTC .BAS 1ED3 4K Variable length, variable column sort in M'