IMD 1.16: 28/05/2007 16:18:44 -FOG/UTL004   \X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ϯ2 Ї!ֶ2:2a{_:ַʖ:ַ>Ľʖ:=2–!B!6#5ʖ:ַĽ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "ѷ"͌#>?͌͘ =_.:;<> Oхo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USERS!yO#< Ty#O 3ү21y_͸2y2ͽ:Ϸ˜1͘A͌>>͌92^ :ַ¥.!_~#fow]ԭՎե!v"!çREAD ERRORçNO FILE^:ַ ! ~ 3#0 Wx x р т G ~ # 3x~#B!Y~ɯ2:ַ=!־ý:ַ=!־:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ԯw4!Y~ʆ͌†t=ʆf ^ T ԯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yոpsp2mÆÆf ͧÆFILE EXISTS _: É: :ַʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2֯2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !ֶ Â$$$ SUBSיץ׫ױ"C{2!"E9"1Aگ22!ty)K!G_^#V*Cِ~E ,&-AGMSڛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :ڷE B 2>: ڷb# : ڷy! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! ھ Hù H H $O͐: 2 *CN#   x: 2 p&x~+é7د2 H! >w_: ! ھ5ͤNkͱ¦ͱxʊ#Nx: ڷ! ږ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \۷Sۀ*C :qn& ^#V>O^"*}:*)=":O:䡵o"*C *C!ͮ~2~2ͦ:2ͮ:ۯO:w:w |g}o*䯆#  ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ܾ,w͜͸Ͳ!!N#F$**O!~#:Aھ#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | sޖ-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌xܯ2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻۯx>2>2ͻ:!Z2:Eڷẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:Eڷ͊:==»y==»*Ww#*"͸*:G#š"͸:!w4 iw:Z!E~=26ۯ2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{  s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bھw!>2*C~=2u:B2~2wE:A*Cڶw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2 4 %-ßð5OjcccccccccccccÄÎ@UAUTOST [v]pip a:=pip b:=xdir a:b:*.*789   50$5@*-?Oy2:Oy{o{_"!91*>2͚>2ͪ2P2R22y2i&))))Cxj!:2C*S}O|ȯ2Ry2 C:Uy2Vi`n&G>2x21:f2:iO<:j2l>1͟j >!"2`<2>22!"!"!c"@!:(;~(7O8Osborne Computer System 60K CP/M 2.2A >(!!:O2RK:"ȯ2Py2# >2R*"S:V<!R~*5:U< *S#"S2U>K>2Q:":#̪:"2!!:0)2*!P~6(! #ͪ:22*"":22:!>!Q~6:2*":2>_!'" !4>2* j2":= 2"ɯ2": 2~#O !N!V!^=!n=!^=!V=!f=:_^#fkv@IN7lT: :^!~( *~4 h'_!knf^VSR}2:` y :h/2h h:h*Z)>d8 :aȯ:adZ} }d !6w:b +w++N#S͎͎hhN:g > NI @II y2*:, O:*߱:ʭ:@OKh Qh}(2_Kh :ͣ(!~6: OKh Nh ?Kh : >*2)>2)>.2)>2)>2)>2)>2)>2 : >*2)>2)>.2)>2)>2)>2)> 2)>2 :)@(=:~ :)2~((2~:)/Ol(y/2)>"2)>2)>2>2  -FOG/UTL004FLS-11 COMASQ-15 COMj SQ/USQ15DOC TYPESQ14COMKUSQ-15 COMOSUPERSUBASM !SUPERSUBCOM"SUPERSUBDOC"#$%SUPRSUB2COM&'DISK DOC +COMPARE ASM()COMPARE COM *WASH COMUNERA COM RECOVER COM*K͞+p!p!)'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o  #z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r! ~#fo͐)~#foͭ`i^#Vr+s͐! !ͪ! !ͪ!? !ͪ`iw#w͐ҹ͡! s#rz†! 6 #6͐! ͐s{ ­͐! 6ù`i^#Vr+s_! n}! ͭ! n}LͰ!91.1 06/16/81Parameter list +w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77builder - Version %s by Richard Greenlaw 251 Colony Ct. Gahanna, Ohio 43230 Accepts redirection and pipes. Omit other parameters for help and prompt Parameters are from command line or (singly) from console input. Drive names and -options are passe!a{   `OE!y6$ -7rBo&))T])))!y!>15:<15>{15Y/e56!'":}15Y/!:&1515\0!:</"͞) :<@"ͧ*͞)Z!:<>L">15d thru. Ambiguous file names are expanded. CR or EOF to stop. *Q ì^u~!9DM͐?n}-| ͐?#n}: ͐?##n} ͐?!G E > ͐?`iH #|¶ ͐?!K !K > !* w#w!!N ͐*| `i!N `i!N !) s!) n} )>15>@2G>)15ç"#(l'ͷ**͞)!2"ͫ'-L3#ͷ&"x0e5G)͍'ͫ'ͷ**͞)b)~F9#^#V##!2)))U~,L3G~`2<2<#~2<~?>" !, !$ s#r͐?#n}:? !$ ^#Vr+s͐?ns!$ ^#Vr+s6:!) n& ?!& s#r!( 6!( n}ʨ ͐$!& ^#Vr+sng|g}os{ ʠ !$ ^#Vr+s!( 5e !$ ^#Vr+s6.!( 6!( n} ͐$!& ^#Vr+sng|g}os{ !$ ^#Vr+s!( 5ý T#=2<#^#V#^#V#"<^#V"<:<~#*<!:<@ʏ#"<*<#w"<*<~ʫ#¶#,L3;+"<*<+" ͐?!^ !K !;9%s %s is bad afn %s %s not found - ignored  ~Ñ!9DMw}ʼ * y `is{ ¹ * y `is !| `is{  `in} ! `in}  `i6 w} ! !|   `in& !9# uÑ~!9DMw}ʑ ! n} P *!  *! n& #|{ ! !  w&|g}o|‘ ! |ʱ ! +++|±  ! n} ! ! ! n&! File output error; disk full? ͩ!R!]͵w}E\!is#r\w#w\\͸tempin.$$$tempin.$$$tempout.$$$.! ~#fo͐)~#fo#n}* ! ~#fo͐)~#fo# #|! ~#fo͐)+++|!ÿ͐##^#Vr+sz>͐^#Vr+sn&ÿ!͐͐~#fo`is#r!{͐##^#Vr+sÿ͐##͐?+s#r͐͐s#r͐^#Vr+sn&ÿ!9 ~!9DM͐+|! n&͐++|!~#fo#!N!*6!]! ~#fo͐)~#fo|S*n&|g}os}*##4! ~#fo͐)~#fo#*###s#r! ~#fo͐)~#fo#n}! ~#fo͐)!is#r! ~#fo͐)*s#r*#n&|g}os! ~#fo͐)~#fo#n}!v n&!͐+++|1! n&!͐++++|i! n} V! !! n&!͐##^#Vr+szʚ͐^#Vr+s! ns&!͐͐~#fo!͐##6#6͐͐s#r͐^#Vr+s! ns&!! ~#fo͐)~#fo# *! ~#fo͐)~#fo# #|x! ~#fo͐)~#fo#!!*#4w}͐! s#r͐͐ ~#fo! ~#fo͐)! ~#fo͐#)~#fos#r! ^#Vr+sÒ͐ ^#Vr+s`i^#Vr+s*^#Vr 1!9DM͐!͐s#rz5!͐##w#w͐~#fo!9DM`iw#w! ~#fo͐n! ~#fo͐n}¥! ~#fo`i^#Vr+sn}¢!Y! ~#fo͐n! ~#fo͐nѯgW!9u!9DM͐͐s#rz+s+͐ ͐s#r! ~#fo͐ ~#fo)w#w9! ^#Vr+s`i^#Vr+s]!9Can't open %s <~# x ><~+ x|} J!Vr+s`ins͐6!9%!9DM! ^#Vr+sn`is{z`in} [͐! "͐`in&"#|w!À-!À!9Ï !9DM͐n}ʹ! ^#Vr+sn&͌×û!9DM͐͐ ͐^#Vr+s͐ ͐0͐7:,*:*" }|2q S I :qwD ! {w7*!9& 6C#6O#6M” *|ª !\&ü !\&*|¼ !!l&!~#fo > + #~ ## a{ !p !!  *w#!:**!*!ѷ! , FNxg>Goyn!$O#6M” *|ª !\&ü !\&*|¼ !!l&!~#fo > + #~ ## a{ !p !!6  !rAN#Gya6{6_#~ e !r~_~# N^#~f++BAD STRING++$~# xŒ^#V#N#Fx#~G#~#fo>}ƀo|g­+~+w+++×#~g}o|g~ +p+q2h2|:L>2!\ ͌:\2!\ ͌\À!\ ͌\!\ ͌\<7=Ɓo& ͌] ͌2h#fo> ++ABORT++$ *p\*K͞+655O'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o  #z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r6#6`i~#fo! ~#foB! ~#fo`i~#fo)~#foͪ`i^#Vr+s! ~#fo! !ͧ!/ !ͧ`iw#w`i~#fo͡! s#rzœ! 6 #6`i~#fo! ! ~#fos{ `i~#fo! 6`i^#Vr+ss! n}! ͪ! n}`ͭ!9+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:771.5 08/29/81File squeezer version %s Richard Greenlaw 251 Colony Ct. Gahanna, Ohio 43230 Accepts redirection and pipes. Omit other parameters for help and prompt Parameters are from command line or one-at-a-time from standard input and are outpu!a{   `OE!y6$ -7rBo&))T])))!y!>15:<15>{15Y/e56!'":}15Y/!:&1515\0!:</"͞) :<@"ͧ*͞)Z!:<>L">15t drives and input file names. Empty to quit. *D % &Û%:&ã !9DM! ~#fon}-j *>}͝}2>2 ! ~#fo#n}: ! ~#fon&5 | ! ~#fo##n} ! ~#fo!; 8 ! ~#fon}2>2 ! ~#fo!M !; 2 ! ~#fo`is#r`i~#fon}8 `i~#fon})>15>@2G>)15ç"#(l'ͷ**͞)!2"ͫ'-L3#ͷ&"x0e5G)͍'ͫ'ͷ**͞)b)~F9#^#V##!2)))U~,L3G~`2<2<#~2<~?>* `i~#fon}?, ! ~#fo!b !; 2 `i^#Vr+s ! 6!>! > ! ~#fo#n}:i ! ~#fo##q ! ~#fo! > ! `is#r`i~#fon} `i~#fon}. `i~#fo#n}· `i~#fo6 `i~#fo##n}q Q ! ~#fo!} !; 2 `i~#fo###6`i~#fo##T#=2<#^#V#^#V#"<^#V"<:<~#*<!:<@ʏ#"<*<#w"<*<~ʫ#¶#,L3;+"<*<+"2>! ! !ͧ!c !ͧ>2>>:2>>2>`i6Q `i^#Vr+sÆ ! ! > ! ! ~#foA !9 Output drive =%s ERROR - Ignoring %s Ambiguous name %s ignored %s ignored ( already squeezed?).QQQ &Ü&Û%&:'!ßcNk'è(!9DM! ~#fo! ~#fo!Gͦ ! ! ~#foͩ #|   ! ~#fo!S!ͬ >!  ! ~#foͯ #|Z ! ~#fo!s!ͬ ! Ͳ >!">!ͦ ͵ ! ͸ ! Ͳ ! ~#fo!  ͻ !ͦ ! ! ~#foͩ #| ! ~#fo!!ͬ ,͵ ! ; ! s#rz!  ! ~#fo #|! ~#fo͐#)~#fos#r! ^#Vr+s͐ ^#Vr+s`i^#Vr+s*6++"6l͐ ͐s#r! ~#fo͐ ~#fo)w#wz! ^#Vr+s`i^#Vr+s!9Can't open %s %s: Can't open %s for input pass 1 Can't create %s analyzing, squeezing, Can't open %s for input pass 2 ERROR - write failure in %s done.)à1ó1!9DM*6}! 6} ! 6!q*6}o!:!!:!:!|!*6}o*6!s#r*6w#w*6*6tempin.$$$tempin.$$$tempout.$$$`is{ ! 6`is2!`is{2`in}A!k`in} c`i6 *6}c! !`in&k!9ÉÜ&Û%ó1*ö1&!9DM{26{26{26! ~#fo͐ ~#fo)"6! 6#6`i6#6͐͐ ~#fo҆*6}Æ! ~#fo͐)~#fon}<! s#r~#fo#|#! ~#fo^#Vr+s`i~#foͨ!  6#6!  ~#fo#|T!Oͫ!  ~#foͮ!  ~#fo͉s#rͨ! s#r! s#r! ~#fo! ~#fok">~#fo|! ~#fok">##6! ^#Vr+s)! ! ~#fos#r! ^#Vr+sÊ! |ʹ+>1o! ~#fo͐)~#fo#n}0L! 6! ~#fo͐)~#fo#w#||! ~#fo͐)~#fo#!!z}>26!! ~#fo͐)~#fò|¶*6&|g}o}26!64! ~#fo͐)~#fo#"6! ~#fo͐)~#fo#n}! ~#fo͐)~#fo! ͱ! ~#fo! ʹͷ*)L!ͺ#|>ͽ>22O!"0O! 9*** rescaling ***, l*"Ó"!9DM! ~#fo!vf! ~#fo*>f! ~#fo#n}:¸! ~#fo##s#r! ~#fo! ~#fon&i! ^#Vr+sn}¸*)Lͩ!*)L!s#r! ~#fo͐)"61*6&|g}o}26! ~#fo͐)~#fo#n}\!!z}! ~#fo͐)~#fo#̓!:! ~#fo͐)~#fo#͆#|! ~#fo͐)~#fo#!!z}!64*6}F͐! s#r͐͐ ~#fo'! ~#fo͐)!! s#r! ~#fo! ~#fof! w#w*)L`is#r! ~#fo! ~#foE`i~#fok">###~#fo! s#r`i~#fok">~#fo! s#r! ~#foͩҫ! ~#fo#ü*)L! ~#fo! s#r! ~#foͩ! ~#fo#*)L! ~#fo! s#r  ! ~#fo! ~#fof! ~#fo! ~#fof! ^#Vr+s`i^#Vr+s1! 9T !!9DM`i6! 6*2O! nѯgW! n}‹`in&Ï`in*3O! ng|g}os*3O! nѯg"3O*2O! nѯgW}22O`in&Ï*2O&+`in*3O! ng`i^#Vr+ss#r! ~#fo###! ~#fos#r! ~#fo! ~#fos#r! ~#fo! ~#fok">~#fo! ~#fok">~#fos#r! ~#fo##! ~#fok">##n&! ~#fok">##n&Ns! ~#fo+!! ~#foK`! ~#fo~#fo")L! 9!|g}os! n*2OѯgWs*0OU>22O! n}M!R`in&Ï! ~#foQ"0O#|q!"0O*0O),M~#fo"3O*0O+Ln}22Of!9!9DM`iw#w`i~#fo`i~#fok">w#w`i~#fok">##6`i~#fok">###6#6`i~#fok9DM`iw#w`i~#fo3`i~#fo+L6`i^#Vr+s !9B<!9DM! ~#fok">###~#fo`is#r! ~#fok">~#fo! s#r`i~#fo#|! ~#fo#|! ~#fo+L! ~#fos! ~#fo),M*.O! ~#fo|g}os#r! ~#fo">6#6`i^#Vr+sæ!9!9DM! s#r! s#r! s#r! ~#fo! ~#fok">~#fo! ~#fo! ~#foғ! ^#Vr+s! ~#fo! ~#fok">~#fos#r! ^#Vr+sC! ~#fo#! s#r! 6! w#w! ~#foo! ~#fo! !ôî`i~#fo#|`*.O! ~#fo}/o|/g|g}o".O`i~#fo! ~#fo#?#|`!ô! ~#fo#|ʮ*.O! ~#fo|g}o".O! ~#fo! ~#fo#?#|®!ô!ô!9H ý!9DM! ~#fo?#`is#r! ~#fo! ~#fo)~#fo! k">~#fo! s#r! ~#fo! ~#foa! ~#fo|a! ~#fok">! ~#fos#r! 6! ^#Vr+s! n}+! ~#fo! w#w! ~#fo! ~#fok">~#fo! ~#fo͉s#r! ^#Vr+sÒ! 9ý!9DM! ~#fo++s#r`i~#fo! ~#fo `i~#fo! ~#foq! ~#fo`i~#fo#)~#fo! ~#fo`i~#fo)~#fo|q`i^#Vr+s! ~#fo`i~#fo)~#fo! ~#fo| ! ~#fo! ~#fo)! ~#fo`i~#fo)~#fos#r! ~#fo`i~#fo)! ~#fos#r! ~#fo`i~#fo! ~`is#r`i~#fo|?! ~#fo+`i~#fo! ~#fo`i^#Vr+s!9Qý !9DM`i6#6! ~#fo! ~#fo~#fo! s#r! ~#fo! ~#fo! ^#Vr+s)~#fos#r! ~#fo+!! ~#foK! ~#fo~#fo! s#r`i~#fok">! s#r! ~#fo#fo!9!9DM! n! nѯgWͩ= ! n&B ! n&!9DM! ~#fok">~#fo! ~#fok">~#foҋ !&! ~#fok">~#fo! ~#fok">~#fo ! ~#fok">##n! ~#fok">##nѯgW !&!&  >2!>!"r+ó1!9DM*!>};!R!!!">2!>! ~#fo!">*>>a!>p!>m!>z!!>2!>!!!">! ~#fo!">*>¶!*>Ҷ!*>#">Å!*>>!>!>!>!!*>">>2!>*>>2!>!>2!>*>">>2%|ͣ&+r+!y9DM! `i&`i&!9!9DM͐`is#r͐n}d&! ^#Vr+sL&! ^#Vr+s͐ns! ^#Vr+sn}d&͐Ó&!9â&u2!9DM͐!͐͟&s#rz&!͐##w#w͐~#fo&ù2!9DM͐͐&!>*>!"!!!Bug - bad state 6"ä+Û%ó1!9DM! ~#fo! ~#fo-"! ~#foz"!|"!0"!3"Write error in putw() ß"k'Û%ó1!9DM! ~#fo! ~#fo͖"#|"!"!͙"!͜"Write error in putc() ")!9DMs#rz '!͐͐s#r͐##6#6͐~#fo@'2!9DM͐Z'!͐~#fo='w'2à13!9DM͐+|—'! n&n'͐++|µ'! n&!q'͐+++|'! n&!q'͐++++| (! n} '! !q'! n&! ~#fo"`is#r`i~#fo#|.#*>`i~#fo">`i~#fo7#!9I#r+ &!9DM*>}#!#C#`iw#w͐Һ#͐|’#͐!#F#͐k">~#fo!$F#`i^#Vr+sg#!$C#!9 Counts after 1st algorithm and maybe scaling %4X !q'͐##^#Vr+sz=(͐^#Vr+s! ns&!͐͐~#fot'g(!͐##6#6͐͐s#r͐^#Vr+s! ns&ô(3Å33!9DM͐(!)͐##~#fo(!)͐##~#fo%5u $ &!9DM*>}3%*)L!<% $`iw#w͐$͐k">~#fo|ʼ$͐k">~#fo͐k">###~#fo͐k">##n&͐k">~#fo͐!W% $`i^#Vr+s2$!u% $`iw#w͐3%͐+Ln&'%͐),M`is#r͐͐͐~#foͫ(͐5)!)͐+?`is#r͐##~#fo|)!͐͐͐ͮ(͐##~#fo͐s#r͐~#fo͐s#r!!͐~#foͱ()͐##6#6͐͐s#r!)!9*à1A~#fo͐+Ln&͐͐!% $`i^#Vr+s$!9 Encoding tree - root=%3d %3d w=%5u d=%3d l=%3d r=%3d Huffman codes %3d %4X l=%2d c=%4x ä%+d/!y9DM! `i͞%͐`i͡%%!9%//!9DM! n&%|ͣ&! n&4!9DM͐|*)*͐+++|/*!)*͐##^#Vr+szY*͐^#Vr+sn&*!͐͐~#fo)`is#r!ږ*͐##^#Vr+s*͐##͐?+s#r͐͐s#r͐^#Vr+sn&*!9!9DM`iw#w! ~#fo͐  n! ~#fo͐n}=+! ~#fo`i^#Vr+sn}:+!i+*! ~#fo͐n! ~#fo͐nѯgWi+!9x+2!9DM͐n}ʢ+! ^#Vr+sn&u+À+ê+k'!9DM͐͐)ͧ+|+͉͐͐ͧ+|+͐!,,009DM! n&aͯ(0! n&zͯ20,0!9DM͐͐ ҂0͐^#Vr+s͐ o0͐0w0͐7s!&0͐ ͐͐ ͉͐/0`is͐ ͐͐ )͐/0`in&#&0!9!9DM! n&0ͯ1! n&9ͯ1h1!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{U/`in}%?/! ! s#r! 6#6! s! s! s͐n}-”,! ^#Vr+s! 4͐n}0¤,! 4͐n&+},! +,!! s#r! ^#Vr+sn`is{. -! +! s#r! 4! ^# 10!9DM`iw#w͐~#fon&1}X1͐ ?͐^#Vr+snѯg`is#r1͐_1!9n1/!9DM! n&k1|ʕ1! n&Ú1! n&7:O*o`  !\&!7*!1&*!2&1!,Vr+sn`is`in&,}D8-Ut-X}-Oʆ-C-S-)/͐~#fo|t-! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 Ì-! 6Ì-! 6! ~#fo! n&! ^#Vr+s~#fo! +ѯgs#ru.! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+su.! !\&!TELk762÷4Û%ó17*^#V#z>2+V+^+I2*-2!g2!0232Broken pipe 7,2q*&:q):ʱ2=ʱ2=r:qo&2ö1u27*ͼ2\!*Ϳ2#  3 > n}.! 6#6! ^#Vr+s~#fo! s#r͐n}u.͐|u.! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s+.͐6! ! s#r! n}.! ^#Vr+s!.! ^#Vr+s! n}.!0.! sÑ.͐! ^#Vr+sns{.! ^#Vr+s.! n}&/! _ 37:)~:,"s!"u*|*uʃ3*~#Z3"*s*uƒ3#"u*+"G37*|DM**3ڴ3><3~# x¨3 ><3~+ x3|}3Ü57:,*3:*3} ^#Vr+s!&/! ^#Vr+s6 . +=5#~+5##5a{ !pr5!*w#S5:**j5*!ѷ! , FNxg>Goy5$ characters would cause it to try to generate code longer than 16 bits, which made the files involved non-unsqueezable. Steve Bogolub here in Chicago discovered the bug, sent files that proved its existence to Richard Greenlaw, and got a disk with a debugged SQ last week. It now checks to see whether a >16 bit code is being generated and if so prints "rescaling" and goes around again to gene- rate a safer table. --> FILE: FLS-11 .COM CRC = 0C 99 --> FILE: SQ-15 .COM CRC = 95 B0 --> FILE: USQ-15 .COM CRC = FE 42 ound again to gene- rate a safer table. --> FILE: FLS-11 .COM CRC = 0C 99 --> FILE: SQ-15 .COM CRC = 95 B0 -->  >* ' 2-HALF SLOW $ADDRESS BIT $ROUTINE 4-SCRAMBLE $ROUTINE 8-SPIRAL $$O:%<2%> >Date: 9/7/81 From: Ben Bronson To: All Re: New SQ USQ and FLS Greenlaw's latest SQUEEZER programs are FLS-11, USQ-15 and SQ-15. The main change is to SQ, which turned out to have a bug in it--in previous versions, an occasional combination of  +w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!yV5:=b#:=#:$=2#v+:<"(">6͋5:&=͋5#*&=|"M1Ϳ5#>6͋5:&=͋5>#͋5>6͋5:'=͋5#*&="<(#>͋5:&=͋*K͞+)e&25'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z5>s͋5>@2=#R1Ϳ5#(,#:==2=)(@#>s͋5#͘(Y#X1:>͋5:&=͋5c1Ϳ5#f1Ϳ52=#(—#>͋5:&=͋5>{͋5c1Ϳ5#(#:$=µ#>}͋5c1Ú#:$=;-͘(#>&͋5͋5f2Ú#:$=$v+è":7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o=$,v+2#:$=>$$>͋5v+>͋5>@2$=2#*="<1Ϳ5:=2="<|s$}d$[2Ϳ5z$g$[3Ϳ5>G>)͋5$#͞*D)͏,Ͷ,v++4ʱ$ðXñ@!9DM! ~#fo! ͤ>21>:21>21`i6#6`i~#fo! ~#fo! ~#fo#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r`i~#fo)~#foͧ`i^#Vr+s! ~#foB!Nͪ!ͪEͭ!9 TYPESQ is used to print files squeezed by SQ.COM. To run this program, type 'TYPESQ ' ýn@ !9DM! ~#fo#n}:4 ! ~#fon&ʹ| ! ~#fo##n} ! ~#  fo! ͷ! ~#fon}21Û 4 ! ~#fo! ͷÛ ! ~#fo`is#r`i~#fon}ʉ `i~#fon}*h `i~#fon}?} ! ~#fo! ͷÛ `i^#Vr+sB >2)! ~#foͺ!9 Output drive =%s ERROR - Ignoring %s Can't accept ambiguous name %s @èæïI!ͱ  !!ͱ ! s! n} y*05+|g}o`is#r`i^#Vr+szv! !ͱ *05#"05Pû! n&!ͱ ! n} ʠ! n} ©!"05û! n} ʻ*05#"05!9Iv"s"!9DM*)}! )`is{ ! )`is7øî Ù!9DM! ! !. ~#fo #|M !. ~#fo!  !"1 ! vʀ !. ~#fo!+  ! ! s#r"5! s#r! ~#fo! s! ^#Vr+sn}› ! 6!1! !"5! ! !. ~#fo!F !R !`is{`in}%!O`in} G`i6 *)}G! !`in&O!9mès"É"Ð!9DM{2){2){2)! ~#fo! ~#fo~#fo)")! 6#6`i6#6`i~#fo! ~#fo~#foҰ*)}ð! ~#fo`i~#fo)~#fon}<|ʱ+>1 ! ! s#r! ~#fo|4 ! ~#foI !. ~#fo!U  !"1!"1! w#w! ~#fo! ~#foҿ ! ~#fo))1! s#r! ~#fo))1##! s#r! ^#Vr+s] `iw#w! w#w!"05!  ! s#rz ! ~#fo| *1! ~! ~#fo`i~#fo)~#fo#n}"N! )! ~#fo`i~#fo)~#fo#[#|r! ~#fo`i~#fo)~#fo#!!^a>2)!! ~#fo`i~#fo)~#fod|®*)&|g}o}2)!)4! ~#fo`i~#fo)~#fo#")! ~#fo`i~#fo)~#fo#n}! ~#fo`i~#fo)!#fo"1! ~#fo|g}o! s#r! ~#foC ! ~#foڇ ! ~#fo ʇ ! ~#fo ʇ ! ~#fo ʇ ! ~#fo ¤ ! ~#fo ä ! ~#fo ! ~#fo ! 6#6  ! ~#fo  `i^#Vr+sz !v ! ! ! 6s#r! ~#fo`i~#fo)")1*)&|g}o}2)! ~#fo`i~#fo)~#fo#n}^!!^a! ~#fo`i~#fo)~#fo#g!-! ~#fo`i~#fo)~#fo#j#|! ~#fo`i~#fo)~#fo#!!^a!)4*)}d`i~#fo! s#r! ~#fo! ~#fo~#foA#6 ! !*9 Can't open %s %s is not a squeezed file %s -> %s: %s has invalid decode tree size TYPESQ ABORTED: Maximum number of lines exceeded ÷ O"s"!9DM!!ͱ +!!ͱ ! s{ ʹ +! n}+!! ~#fo! ~#fo)! ~#fo! ~#fo#)~#fos#r! ^#Vr+s! ~#fo^#Vr+s`i^#Vr+s*)++")Ö! ~#fo! ~#fos#r! ~#fo! ~#fo~#fo)w#wä! ^#Vr+s`i^#Vr+sî!9Can't open %s ! {A!! s#r! ^#Vr+sn`is{.‰! {! s#r! 4! ^#Vr+sn`is`in&~}DʵUXOCISzæ͐~#fo|! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 ! 6is#r!͐"!9"B !9DM! n&"|D"! n&I"! n&7*+++:G_*DM!n"o& 7:O*o` !\&!7*!"&*!"&"!, !\&!TELk7 # ! 6! ~#fo! n&! ^#Vr+s~#fo! uѯgs#r! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s! n}! 6#6! ^#Vr+s~#fo! s#r͐n}͐|! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+sè͐6! !Z%s"7*^#V#z#+V+^+#*#!:#!##Broken pipe 7,2q*&:q):ʄ#=ʄ#=r:qo&7:)~:,"s!"u*|#**s#! ~#6*u*+"*"*u#"u s#r! n}I! ^#Vr+s!I! ^#Vr+s! n}@!0C! s͐! ^#Vr+sns{r! ^#Vr+sI! n}ʣ! ^#Vr+s!ң! ^#Vr+s6 |ù! ^#Vr+s`ins! ^#Vr+s`insð͐6!9!9DM͐n} ! ^#V##$É"H#7*$\!* $7:)~:,"s!"u*|*uʜ$*~#s$"*s*uœ$#"u*+"`$7*|DM**$$><$~# x$ ><$~+ x$|}$?&7:,r+sn&!9DM! n&Aͯ> ! n&Zͯ!9DM! n&aͯm ! n&zͯw !9DM! ^#Vr+sn`is{ `in} ­ ͐! t ͐`in&t #| !  ! !9 !9DM͐͐ 1!͐^#V*$:*%}|2q H%>%:qw9%! {w7*!9& 6C#6O#6M‰%*|Ÿ%!\&ñ%!\&*|±%!!l&!~#fo%> +%#~%##%a{ !p&!*w#%:r+s͐ !͐0&!͐7s!&|!͐ ͐͐ ͉͐ `is͐ ͐͐ )͐ `in&#&|!!9!9DM! n&0ͯڰ!! n&9ͯú!Å!!9DM`iw#w͐~#fon&ͷ!}"͐ ?͐^#Vr+snѯg`** &*!ѷ! , FNxg>Goyc&$:‰%*|Ÿ%!\&ñ%!\&*|±%!!l&!~#fo%> +%#~%##%a{ !p&!*w#%:  +w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!y!>15:<15>{15Y/e56!'":}15Y/!:&1515\0!:</"͞) :<@"ͧ*͞)Z!:<>L">15*K͞+) (35'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z)>15>@2G>)15ç"#(l'ͷ**͞)!2"ͫ'-L3#ͷ&"x0e5G)͍'ͫ'ͷ**͞)b)~F9#^#V##!2)))U~,L3G~`2<2<#~2<~?>7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/oT#=2<#^#V#^#V#"<^#V"<:<~#*<!:<@ʏ#"<*<#w"<*<~ʫ#¶#,L3;+"<*<+"21>:21>21`#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2ri6#6`i~#fo! ~#foC! ~#fo`i~#fo)~#foͪ`i^#Vr+s! ~#fo! !ͧ!2 !ͧ`iw#w`i~#fo͡! s#rz! 6 #6`i~#fo! ! ~#fos{ `i~#fo! 6`i^#Vr+st! n}! ͪ! n}aͭ!9  1.5 08/02/81File unsqueezer version %s Richard Greenlaw 251 Colony Ct. Gahanna, Ohio 43230 Accepts redirection and pipes. Omit other parameters for help and prompt Parameters are from command line or one-at-a-time from standard input and are ou! s#rzʜ!' ~#fo*05Ҝ! ~#fo|g}o! s! n& Y! n&~ҍ! n} v y ʄ ʄÇÙ!' ^#Vr+sÍ! 6.! n&/ *25}ʬ! / j! ! 5 #|! !! X`i2 ! s#rz2*1! ~#fo"1tput drives and input file names. Empty to quit. *J ÀøIxò !9DM! ~#fon}- ! ~#fo#n&8 F͝}225}ʏ ! ^#Vr+s!"05! ~#fo#n} ! ~#fo#; "05| ! ~#fo#! !> ö ! ~#fo#n}:O ! ~#fon&A |5 ! ~#! ! ~#fo8 #|/! !! X! ~#fo*1X! !! ! ; ! > `i> !)9Can't open %s %s is not a squeezed file %s -> %s: %s has invalid decode tree size Can't create %s Write error in %s ERROR - chefo##n}2 !"05! ~#fo! D ! ~#fon}21ö O ! ~#fo! !> ö ! ~#fo`is#r`i~#fon}ʩ `i~#fon}*ʃ `i~#fon}? ! ~#fo! !> ö `i^#Vr+s] ! ~#foG !9 BAD COUNT %s Output drive =%s ERROR - Ignoring %s Can't accepcksum error in %s Á$+$!9DM*)}P! )`is{ M! )`ise!`is{e`in}t!Þ`in} –`i6 *)}–! !`in&Þ!9üI+$.$!9DM{2){2){2)! ~#fo͐ ~#fo)")! 6#6`i6#6͐͐t ambiguous name %sA Iïø&Áoò)fó!9DM`i!- ~#fo #|z !- ~#fo!z! q!' w#w!"1 `i# vʸ !- ~#fo!! j`i# ! s#r"5! s#r! ~#fo`i& s! ^#Vr+sn} ! 6!1 ~#foҹ*)}ù! ~#fo͐)~#fon}dâ! ~#fo͐)~#fo#n}c! )! ~#fo͐)~#fo#ͪ#|¯! ~#fo͐)~#fo#!!ͭͰ>2)!! ~#fo͐)~#foͳ|*)&|g}o}2)!)4! ~#fo͐)! ) !"5! ) ! !- ~#fo!, `i# ! s#r! ~#fo|^ ! ~#fox !- ~#fo!! j!"1!"1!  w#w!  ~#fo! ~#fo !  ~#fo))1`i# s#r!  ~#fo))1##`i# s#r!  ^#Vr+sÌ *05|ʯ! / `i2 ~#fo#")! ~#fo͐)~#fo#n}O! ~#fo͐)!s#r! ~#fo͐)")d*)&|g}o}2)! ~#fo͐)~#fo#n}!!ͭͰ! ~#fo͐)~#fo#Ͷ!-! ~#fo͐)~#fo#͹#|! ~#fo͐)~#fo#! !ͭͰ!)4*)}y  ͐! s#r͐͐ ~#foZ! ~#fo͐)! ~#fo͐#)~#fos#r! ^#Vr+s ͐ ^#Vr+s`i^#Vr+s*)++")ß͐ ͐s#r! ~#fo͐ ~#fo)w#wí! ^#Vr+s`i^#Vr+s!9Can't open %s ! ~#fo`i^#Vr+sn};!j! ~#fo͐n! ~#fo͐nѯgWj!9 #{"õ#À!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{!`in}%½!! ! s#r! 6#6! s! s! s͐n}-""# #!9DM͐͐ a#͐^#Vr+s͐ N#͐0V#͐7s!&ì#͐ ͐͐ ͉͐#`is͐ ͐͐ )͐#`in&#&ì#!9û#{"!9DM`iw#w͐~#fon&͸#}$͐ ?͐^#Vr+snѯg! ^#Vr+s! 4͐n}0"! 4͐n&y}?! |B!! s#r! ^#Vr+sn`is{.Š! |! s#r! 4! ^#Vr+sn`is`in&}DʶUXO CJ S{ ç!͐~#fo|! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 ! 6`is#r#͐$!97:O*o`  !\&!7*!m$&*!}$&m$!, !\&!TELk7î$&I+$7*^#V#z¶$+V+^+$*ͥ$!$!ͨ$ë$Broken pipe 7,2q* ! 6! ~#fo! n&! ^#Vr+s~#fo! vѯgs#r ! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s ! n}Ž ! 6#6! ^#Vr+s~#fo! s#r͐n} ͐| ! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+sé ͐6! !&:q):)%=)%=r:qo&7:)~:,"s!"u*|ʇ%**sŒ%! ~‡%6*u*+"*"*u#"uS%ð%.$$7*ͪ%\!*ͭ%7:)~:,"s!"u s#r! n}J!! ^#Vr+s!J!! ^#Vr+s! n}A!!0D!! s!͐! ^#Vr+sns{s!! ^#Vr+sJ!! n}ʤ!! ^#Vr+s!Ҥ!! ^#Vr+s6 }!ú!! ^#Vr+s`ins!! ^#Vr+s`insñ͐6!9!)!9DM! ^#Vr+sn`*|*u>&*~#&"*s*u>&#"u*+"&7*|DM**͋&o&><&~+ x&|}×&'7:,*͔&:*ʹ&}|2q &&:qw&! {w#  7*!9& 6C#6O#6M.'*|D'!\&V'!\&*|V'!!l&!~#foʎ'> +ͅ'#~s'##g'a{ !p'!*w#›':**ʲ'*!ѷ! , FNxg>GB to ; ; For full details along with examples, see the ac- ; companying documentation file. ; --Ron Fowler ; ; ; DEFINE BOOLEANS ; FALSE EQU 0 TRUE EQU NOT FALSE ; ;************************************************************ ; ; -- User oy($G##g'a{ !p'!*w#›':**ʲ'*!ѷ! , FNxg>Gcustomizable options -- ; NPAR EQU 10 ;NUMBER OF ALLOWABLE PARAMETERS SUBDRV EQU 0 ;MAKE 0 FOR DFLT, 1,2,3,ETC FOR A,B,C QUIET EQU FALSE ;SET TO TRUE TO ELIMATE SIGN-ON MSG CPBASE EQU 0 ;SET TO 4200H FOR HEATH CP/M ; ; ; ;*************************TITLE 'SuperSUB - an Extended Submit replacement for CP/M' ; ;************************************************ ;* EXTENDED SUBMIT FOR * ;* CP/M * ;************************************************ ; ; REVISED 09/05/81 (RGF) ; ; VERSION 1.*********************************** ; ; CP/M DEFINITIONS ; FPCHAR EQU 2 ;PRINT CHAR FUNCTION PRINTF EQU 9 ;PRINT STRING FUNCTION RDBUF EQU 10 ;READ CONSOLE BUFFER OPENF EQU 15 ;OPEN FILE FUNCTION CLOSEF EQU 16 ;CLOSE FILE FUNCTION DELETF EQU 19 ;D0 2/18/81 (first written) ; BY RON FOWLER WESTLAND, MICH. ; ; ; This program is intended as a replacement for the ; SUBMIT program provided with CP/M. It provides sev- ; eral new facilities: ; 1) Nestable SUBMIT runs ; 2) Interactive entry of SUELETE FILE FUNCTION READF EQU 20 ;READ RECORD FUNCTION WRITEF EQU 21 ;WRITE RECORD FUNCTION MAKEF EQU 22 ;MAKE (CREATE) FILE FUNCTION ; BDOS EQU CPBASE+5 ; FCB EQU 5CH ;DEFAULT FILE CONTROL BLOCK FCBRC EQU 15 ;FCB OFFSET TO RECORD COUNT FCBNR EQU BMIT job (no need ; to use an editor for simple SUBMIT runs) ; 3) Command line entry of small SUBMIT jobs ; 4) Ability to enter blank lines in an edited ; SUBMIT file ; 5) User customization of number of parameters ; and drive to send $$$.SU32 ;FCB OFFSET TO NEXT RECORD FN EQU 1 ;FCB OFFSET TO FILE NAME FT EQU 9 ;FCB OFFSET TO FILE TYPE TBUF EQU CPBASE+80H ;DEFAULT BUFFER TPA EQU CPBASE+100H ;TRANSIENT PROGRAM AREA ; PUTCNT EQU TBUF ;COUNTER FOR OUTPUT CHARS ; ; DEFINE SOME TEXT CHAR  ACTERS ; CR EQU 13 ;CARRIAGE RETURN LF EQU 10 ;LINE FEED TAB EQU 9 ; ; START OF PROGRAM CODE ; ORG TPA ; ; GET THE BALL ROLLING ; SUBMIT: LXI H,0 ;SAVE STACK IN CASE DAD SP ; ONLY HELP REQUESTED SHLD SPSAVE ;(NOT OTHERWISE USED) LXI SP,YP ; @HL TO @DE MVI B,3 CALL MOVE RET ; ; MOVE # BYTES IN B REGISTER FROM @HL TO @DE ; MOVE: MOV A,M ;PICK UP STAX D ;PUT DOWN INX H ;I'M SURE INX D ; YOU'VE SEEN THIS DCR B ; BEFORE... JNZ MOVE ;100 TIMES AT LEAST RET ;I KNOW I HAVESTACK CALL START ; ; SIGN ON MESSAGE ; IF NOT QUIET DB 'SuperSUB V1.0' ENDIF ; DB CR,LF,'$' ;NEWLINE EVEN IF QUIET ; START: POP D ;RETRIEVE STRING POINTER MVI C,PRINTF LDA FCB+1 ;ANYTHING ON CMD LINE? CPI ' ' JZ HELP ;NO, GO PRINT H! ; ; GETPAR MOVES THE SUBSTITUTION PARAMETERS SPECIFIED ; IN THE COMMAND LINE INTO MEMORY, AND STORES THEIR ; ADDRESSES IN THE PARAMETER TABLE. THIS ALLOWS ; SUBSTITUTION OF $1, $2, ETC., IN THE SUBMIT COMMANDS ; WITH THEIR ACTUAL VALUES SPECIFED IELP CALL BDOS ;PRINT THE SIGN-ON CALL INITVAR ;INITIALIZE THE VARIABLE AREA CALL GETPAR ;GET COMMAND LINE PARAMETERS CALL SETUP ;SET UP READ OF SUBMIT FILE CALL RDFILE ;READ THE SUBMIT FILE CALL WRSET ;SET UP WRITE OF "$$$.SUB" CALL WRSUB ;WRN THE COMMAND ; LINE. ; GETPAR: LXI H,TBUF+1 ;WHERE WE FIND THE COMMAND TAIL CALL SCANTO ;SKIP SUBMIT FILE NAME STA OPTION ;FIRST CHAR OF CMD LINE IS OPTION RC ;LINE ENDED? CPI '/' ;NO, CHECK OPTION JNZ GLP0 ;NOT KEYBOARD INP, READ FILE ITE "$$$.SUB" JMP CPBASE ;GO START THE SUBMIT ; ; ; SETUP SETS UP THE FILE CONTROL BLOCK ; FOR READING IN THE .SUB TEXT FILE ; SETUP: LXI H,FCB+FT ;LOOK AT FIRST CHAR OF MOV A,M ; FILE TYPE. IF IT IS CPI ' ' ; BLANK, THEN GO MOVE JZ PUTSU INX H ;POINT PAST '/' SLSCAN: SHLD CLPTR ;SAVE CMD LINE PTR MOV A,M ;KBD IS SOURCE, GET EOL FLAG STA CLFLAG ;SAVE AS EOL FLAG CPI ' ' ;ALLOW SPACES AFTER '/' RNZ ;GOT NON-BLANK, DONE INX H ;ELSE CONTINUE SCAN JMP SLSCAN GLP0: MOV A,B ; "SUB" INTO FT FIELD LXI D,SUBTYP ;IT'S NOT BLANK SO MAKE MVI B,3 ; SURE IT'S ALREADY CALL COMPAR ; "SUB" JNZ NOTFND ;IF NOT, IT'S AN ERROR RET ; ; MOVE "SUB" INTO THE FILE TYPE ; PUTSUB: XCHG ;BY CONVENTION, MOVE FROM LXI H,SUBTM ;INPUT IS FROM A .SUB FILE..THIS INX H ; CODE SKIPS OVER THE NAME OF ORA A ; THE SUB FILE TO GET TO THE RZ ; COMMAND LINE PARAMETERS CPI ' ' JZ GLP CPI TAB JNZ GLP0 GLP: CALL SCANTO ;PASS UP THE BLANKS RC ;CY RETURNED IF END OF   CMD LINE CALL PUTPAR ;NOW PUT THE PARAMETER INTO MEM RC ;CY RETURNED IF END OF CMD LINE JMP GLP ;GET THEM ALL ; ; SCANTO SCANS PAST BLANKS TO THE FIRST NON-BLANK. IF ; END OF COMMAND LINE FOUND, RETURNS CARRY SET. ; SCANTO: MOV A,M INX H ORYTE OF PARM INX H ORA A ;TEST FOR END OF CMD LINE JZ PP2 ;JUMP IF END CPI ' ' ;TEST FOR END OF COMMAND JZ PP2 CPI TAB ;TAB ALSO ENDS COMMAND JZ PP2 STAX D ;PUT PARAMETER BYTE-BY-BYTE INX D ;INTO FREE MEMORY INR B ;BUMP LENGTH JMP PPLPA A ;SET FLAGS ON ZERO STC ;IN CASE ZERO FOUND (END OF CMD LIN) RZ CPI ' ' JZ SCANTO ;SCAN PAST BLANKS CPI TAB ;DO TABS TOO, JUST FOR JZ SCANTO ; GOOD MEASURE DCX H ;FOUND CHAR, POINT BACK TO IT ORA A ;INSURE CARRY CLEAR RET ; ; PUTPA PP2: XCHG SHLD TXTPTR ;NEW FREE MEMORY POINTER POP H ;REMEMBER OUR LENGTH POINTER? MOV M,B ;STORE THE LENGTH XCHG ;HAVE TO RETN HL > CMD LINE ORA A ;NOW RETURN END OF LINE FLAG STC RZ ;RETURN CY IF ZERO (EOL MARK) CMC RET ; ; RDFILER PUTS THE PARAMETER POINTED TO BY HL INTO ; MEMORY POINTED TO BY "TXTPTR". ALSO STORES THE ; ADDRESS OF THE PARAMETER INTO THE PARAMETER TABLE ; FOR EASY ACCESS LATER, WHEN WE WRITE $$$.SUB ; PUTPAR: PUSH H ;SAVE POINTER TO PARM LHLD TXTPTR ;NEXT  READS THE .SUB FILE SPECIFIED ; IN THE SUBMIT COMMAND INTO MEMORY ; RDFILE: LDA OPTION ;USING A FILE? CPI '/' ;'/' OPTION TELLS JZ LINE ;JUMP IF NOT LXI D,FCB ;WE ARE, OPEN IT MVI C,OPENF CALL BDOS INR A ;IF 0FFH RETURNED, JZ NOTFND ; THFREE MEMORY XCHG ; INTO DE LHLD TBLPTR ;NEXT FREE AREA OF TABLE MOV A,M ;NON-ZERO IN TABLE ORA A ; INDICATES TABLE JNZ PAROVF ; TABLE OVERFLOW (TOO MANY PARMS) MOV M,E ;STORE THE PARM ADRS INX H MOV M,D INX H SHLD TBLPTR ;SAVE TABLE PEN FILE NOT FOUND LINE: LHLD LINNUM ;INCREMENT THE LINE NUMBER INX H SHLD LINNUM LHLD PREV ;GET PREV PREVIOUS LINE POINTER XCHG LHLD TXTPTR ;GET CURRENT FREE MEM POINTER SHLD PREV ;MAKE IT THE PREV LINE (FOR NXT PASS) MOV M,E ;STORE AT BEGINNTR FOR NEXT TIME POP H ;GET BACK PARM POINTER PUSH D ;SAVE FREE MEM POINTER BECAUSE ; WE WILL HAVE TO HAVE IT BACK ; LATER TO STORE THE LENGTH INX D ;POINT PAST LENGTH STORAGE MVI B,0 ;INITIALIZE LENGTH OF PARM PPLP: MOV A,M ;GET NEXT B OF CURRENT LINE, INX H ; A POINTER TO THE PREVIOUS MOV M,D INX H PUSH H ;LATER WE WILL PUT LENGTH HERE INX H ;SKIP PAST LENGTH MVI C,0 ;INITIALIZE LENGTH TO ZERO LLP: CALL GNB ;GET NEXT BYTE FROM INPUT FILE JC EOF ;CY SET IF END OF FILE FO  UND CALL UCASE ;CONVERT TO UPPER CASE CPI 1AH ;SEE IF CPM END OF FILE INDICATOR JZ EOF CPI LF ;IGNORE LINEFEEDS JZ LLP CPI CR ;IF IT'S A CARRIAGE RETURN, JZ EOL ; THEN DO END OF LINE MOV M,A ;STORE ALL OTHERS INTO MEMORY INX H CALL SIZP B ;RESTORE EVERYBODY POP D POP H ORA A ;TURN ON CARRY RET ; ; FILL INPUT BUFFER ; FILL: MVI C,READF LXI D,FCB CALL BDOS ORA A ;GOT GOOD READ? MVI A,0 ;(NEW BUF PTR) STC RNZ ;RETN CY=EOF CMC ;NO EOF, NO CY RET ; ; COME HEREE ;MAKE SURE NO MEMORY OVERFLOW INR C ;BUMP CHAR COUNT JM LENERR ;MAX OF 128 CHARS PER LINE JMP LLP ;GO DO NEXT CHAR ; ; DO END OF LINE SEQUENCE ; EOL: SHLD TXTPTR ;SAVE FREE MEMORY POINTER POP H ;CURRENT LINE'S LENGTH POINTER MOV M,C ;STORE  TO GET A .SUB CHARACTER WHEN ; WE'RE NOT USING A .SUB FILE ("/" OPTION) ; GNBKBD: LDA CLFLAG ;USE CP/M CMD LINE? ORA A JNZ GNBCL ;THEN GO DO IT LDA CLCNT ;NOT, CHECK LOCAL ORA A ; CMD LINE CHAR COUNT CM CLFILL ;REFILL WHEN IT WRAPS BACK JCLENGTH AWAY JMP LINE ;GO DO NEXT LINE ; ; END OF TEXT FILE ; EOF: SHLD TXTPTR ;SAVE FREE MEMORY POINTER POP H ;CURRENT LINE'S LENGTH POINTER MOV M,C ;STORE LENGTH AWAY RET ;ALL DONE READING SUB FILE ; ; GET NEXT BYTE FROM INPUT FILE ; GNB: GKEND ;GOT CARRY (FROM CLFILL), RETURN EOF DCR A ;COUNT DOWN STA CLCNT JP GNBCL ;IF PLUS, BUFFER NOT EMPTY MVI A,CR ;OUT OF CHARS, RETURN A CR RET GKEND: MVI A,1AH ;RETURN EOF RET ; ; GET NEXT BYTE OF INPUT FROM CMD LINE @CLPTR ; GNBCL: L PUSH H ;DON'T ALTER ANYBODY PUSH D PUSH B LDA OPTION ;INPUT FROM .SUB FILE? CPI '/' ;TOLD BY ORIG CMD LINE OPTION JNZ NSLASH ;JUMP IF WE ARE CALL GNBKBD ;NO, GET A BYTE FROM KBD INPUT JMP GNBXIT ;THEN LEAVE NSLASH: LDA IBP ;GET BUFFER POINTHLD CLPTR ;LOAD THE POINTER MOV A,M ;GET THE CHAR INX H ;BUMP POINTER FOR NEXT TIME SHLD CLPTR CPI ';' ;LOGICAL END-OF-LINE? JNZ NSEMI ;JUMP IF NOT MVI A,CR ;YES, TRANSLATE IT RET NSEMI: ORA A ;PHYSICAL END-OF-LINE RNZ ;THIS ONLY NEEDED WER ORA A ;PAST END? CM FILL ;WRAPPED AROUND JNC GNB1 ;NO END OF FILE MVI A,1AH ;FAKE EOF GNB1: MOV E,A ;PUT IN DE MVI D,0 INR A ;POINT TO NEXT STA IBP ;PUT AWAY LXI H,TBUF ;NOW OFFSET INTO BUFR DAD D MOV A,M ;GET CHAR THERE GNBXIT: POHEN INPUT ; SOURCE IS ORIG CPM CMD LINE MVI A,1AH ;TRANSLATE THAT TO END OF FILE RET ; ; SUBROUTINE TO RE-FILL THE LOCAL COMMAND LINE ; CLFILL: LXI D,PROMPT ;PRINT A PROMPT MVI C,PRINTF ;USE CP/M FUNCT 9 CALL BDOS LXI D,CLBUF ;NOW FILL   THE BUFFER MVI C,RDBUF CALL BDOS LDA CLCNT ;RETURN WITH COUNT IN A LXI H,CLTEXT ;RESET THE CMD LINE POINTER SHLD CLPTR ORA A ;SET CY ON LEN NZ STC RZ CMC RET ; ; MAKE SURE NO MEMORY OVERFLOW ; SIZE: LDA BDOS+2 ;HIGHEST PAGE POINTEUNTIL A LINE IS FOUND JMP WRNTRY ;GOT ONE. NOW JOIN LOOP IN PROGRESS... WRLOP: LHLD PREV ;GET PREV LINE POINTER MOV A,H ORA L ;IF THERE IS NO PREV LINE JZ CLOSE ; THEN WE ARE DONE MOV E,M ;ELSE SET UP PREV FOR NEXT INX H ; PASS THRU HERE R DCR A ;MAKE IT BE UNDER BDOS CMP H ;CHECK IT AGAINST CURRENT PAGE RNC ;NC=ALL OKAY JMP MEMERR ;OTHERWISE ABORT ; ; SET UP THE $$$.SUB FILE ; FOR WRITING ; WRSET: LXI D,SUBFCB MVI C,OPENF CALL BDOS ;OPEN THE FILE INR A ;CHECK CPM RETURMOV D,M INX H XCHG ;NOW STORE IT AWAY SHLD PREV XCHG WRNTRY: CALL PUTLIN ;WRITE THE LINE TO THE FILE JMP WRLOP ; ; $$$.SUB IS WRITTEN, CLOSE THE FILE ; CLOSE: LXI D,SUBFCB MVI C,CLOSEF JMP BDOS ; ; THIS SUBROUTINE WRITES A LINE ; TO N JZ NONE1 ;NONE EXISTS ALREADY ; ; $$$.SUB EXISTS, SO SET ; FCB TO APPEND TO IT ; LDA SUBFCB+FCBRC ;GET RECORD COUNT STA SUBFCB+FCBNR ;MAKE NEXT RECORD RET ; ; COME HERE WHEN NO $$$.SUB EXISTS ; NONE1: LXI D,SUBFCB MVI C,MAKEF CALL BDOTHE $$$.SUB FILE BUFFER, ; AND FLUSHES THE BUFFER AFTER ; THE LINE IS WRITTEN. ; PUTLIN: MOV A,M ;PICK UP LENGTH BYTE INX H ;POINT PAST IT STA GETCNT ;MAKE A COUNT FOR "GET" SHLD GETPTR ;MAKE A POINTER FOR "GET" LXI H,TBUF+1;TEXT GOES AFTER LENS INR A JZ NOMAKE ;0FFH=CAN'T CREATE FILE RET ; ; WRITE THE "$$$.SUB" FILE ; WRSUB: LHLD PREV ;THIS CODE SCANS BACKWARD MOV A,H ; THRU THE FILE STORED IN ORA L ; MEMORY TO THE FIRST NON- JZ NOTEXT ; NULL LINE. IF NONE IS MOV E,M ; ISGTH SHLD PUTPTR ;MAKE POINTER FOR "PUT" XRA A ;INITIALIZE PUT COUNT STA PUTCNT MOV B,L ;COUNT FOR CLEAR LOOP CLR: MOV M,A ;ZERO OUT BUFFER LOC INX H INR B ;COUNT JNZ CLR ; ; THIS LOOP COLLECTS CHARACTERS ; FROM THE LINE STORED IN MEMORY  FOUND, ABORTS INX H MOV D,M ;HERE, WE PICK UP PNTR TO PREV LINE INX H ;NOW WE POINT TO LENGTH XCHG ;WE NEED TO STORE AWAY SHLD PREV ; POINTER TO PREV LINE XCHG MOV A,M ;NOW PICK UP THE LENGTH ORA A ;SET Z FLAG ON LENGTH JZ WRSUB ;LOOP ; AND WRITES THEM TO THE FILE. ; IF THE "$" PARAMETER SPECIFIER ; IS ENCOUNTERED, PARAMETER SUB- ; STITUTION IS DONE ; PUTLP: CALL GETCHR ;PICK UP A CHARACTER JC FLUSH ;CY = NO MORE CHAR IN LINE CPI '$' ;PARAMETER SPECIFIER? JNZ STOBYT ;IF NOT,   JUST WRITE CHAR LDA OPTION ;CHECK OPTION: '$' DOESN'T CPI '/' ; COUNT IN '/' MODE MVI A,'$' ;(RESTORE THE '$') JZ STOBYT CALL LKAHED ;PEEK AT NEXT CHAR JC PARERR ;LINE ENDING MEANS PARAM ERR CPI '$' ;ANOTHER "$"? JNZ SUBS ;IF NOT THEN GO DZERO DCR B JZ PUTLP ;DONE MOV A,M ;GET CHAR OF REAL PARAMETER INX H ;POINT PAST FOR NEXT TIME PUSH H ;SAVE REAL PARM POINTER CALL PUTCHR ;PUT IT IN THE FILE POP H ;GET BACK REAL PARM POINTER DCR B ;COUNTDOWN JMP SUBLP1 ; ; COME HERE WHEO SUBSTITUTION CALL GETCHR ;GET THE 2ND "$" (WE ONLY LOOKED ; AHEAD BEFORE) STOBYT: CALL PUTCHR ;WRITE CHAR TO FILE JMP PUTLP ; ; PARAMETER SUBSTITUTION...LOOKS UP THE ; PARAMETER # AFTER THE "$" AND PLUGS IT ; IN IF IT EXISTS. ; SUBS: CALLN A LINE IS FINISHED, ; AND WE NEED TO WRITE THE BUFFER TO DISK ; FLUSH: LHLD PUTPTR ;PAD SECTOR WITH NULLS FLPAD: MVI M,0 INX H MOV A,L ;CHECK BUFF BOUND ORA A JNZ FLPAD LXI D,SUBFCB MVI C,WRITEF CALL BDOS ORA A JNZ WRERR ;CPM RETURN NUMTST ;IT BETTER BE A NUMBER JC PARERR ; OTHERWISE PARAM ERROR MVI B,0 ;INITIALIZE PARM # JMP LPNTRY ;WE JOIN LOOP IN PROGRESS... SUBLP: CALL LKAHED ;LOOK AT NEXT CHAR JC DOSUBS ;IF LINE EMPTY, THEN PLUG IN PARM CALL NUMTST ;CHECK FOR NUMERICED A WRITE ERROR RET ; ; GETCHR GETS ONE CHAR FROM ; LINE STORED IN MEMORY ; GETCHR: LXI H,GETCNT MOV A,M ;PICK UP COUNT DCR A ;REMOVE THIS CHAR STC ;PRESET ERROR RM ;RETURN CY IF OUT OF CHARS MOV M,A ;UPDATE COUNT LHLD GETPTR ;CURRENT JC DOSUBS ;DONE IF NOT LPNTRY: CALL GETCHR ;NOW REMOVE THE CHAR FROM INPUT STREAM SUI '0' ;REMOVE ASCII BIAS MOV C,A ;SAVE IT MOV A,B ;OUR ACCUMULATED COUNT ADD A ;MULTIPLY BY TEN ADD A ADD B ADD A ADD C ;THEN ADD IN NEW DIGIT MOV B, CHAR POINTER MOV A,M ;PICK UP CHAR INX H ;BUMP POINTER SHLD GETPTR ;PUT IT BACK CMC ;TURN CARRY OFF RET ; ; PUTCHR PUTS ONE CHAR TO ; THE OUTPUT BUFFER ; PUTCHR: LXI H,PUTCNT INR M ;INCREMENT COUNT JM LENERR ;LINE WENT TO > 128 CHARS A ;RESTORE COUNT JMP SUBLP ; ; PERFORM THE SUBSTITUTION ; DOSUBS: MOV A,B ;GET PARM # DCR A ;MAKE ZERO RELATIVE JM PARERR ;OOPS CALL LOOKUP ;LOOK IT UP IN PARM TABLE JC PARERR ;IT'S NOT THERE MOV B,A ;LENGTH IN B SUBLP1: INR B ;TEST B FOR  LHLD PUTPTR ;GET BUFFER POINTER MOV M,A ;PUT CHAR THERE INX H ;BUMP POINTER SHLD PUTPTR ;PUT IT BACK RET ;ALL DONE ; ; LOOK AHEAD ONE CHAR IN ; THE INPUT STREAM. SET ; CARRY IF NONE LEFT. ; LKAHED: LDA GETCNT ORA A ;SEE IF COUNT IS DOWN   TO ZERO STC ;PRE SET INDICATOR RZ MOV A,M ;PICK UP CHAR CMC ;TURN OFF CARRY FLAG RET ; ; LOOK UP PARAMETER WITH NUMBER IN ; A REG. RETURN A=LENGTH OF PARM, ; AND HL => PARAMETER ; LOOKUP: CPI NPAR JNC PAROVF ;PARM # TOO HIGH MOV L,A NVERT CHAR IN A TO UPPER CASE ; UCASE: CPI 'a' ;VALIDATE CASE RC CPI 'z'+1 RNC ANI 5FH ;GOT LC, CONV TO UC RET ; ; ERROR HANDLERS ; WRERR: CALL ERRXIT DB 'Disk full$' NOMAKE: CALL ERRXIT DB 'Directory full$' MEMERR: CALL ERRXIT DB ' MVI H,0 ;NOW HAVE 16 BIT NUMBER DAD H ;DOUBLE FOR WORD OFFSET LXI D,TABLE DAD D ;DO THE OFFSET MOV E,M ;GET ADDRESS OF PARM INX H MOV D,M MOV A,D ;ANYTHING THERE? ORA E JNZ LKUPOK XRA A ;NO, ZERO LENGTH RET LKUPOK: XCHG ;NOW IN DE Memory full$' NOTFND: CALL ERRXIT DB 'Submit file not found$' PARERR: CALL ERRXIT DB 'Parameter$' PAROVF: CALL ERRXIT DB 'Too many parameters:$' LENERR: CALL ERRXIT DB 'Line too long:$' NOTEXT: CALL ERRXIT DB 'Submit file empty.$' ERRXIT: P MOV A,M ;PICK UP LENGTH INX H ;POINT PAST LENGTH RET ; ; UTILITY COMPARE SUBROUTINE ; COMPAR: LDAX D CMP M RNZ INX H INX D DCR B JNZ COMPAR RET ; ; NUMERIC TEST UTILITY SUBROUTINE ; NUMTST: CPI '0' RC CPI '9'+1 CMC RET OP D MVI C,PRINTF CALL BDOS LXI D,ERRMSG ;PRINT 2ND HALF MSG MVI C,PRINTF CALL BDOS LHLD LINNUM ;TELL LINE NUMBER CALL DECOUT CALL CRLF LXI D,SUBFCB ;DELETE THE $$$.SUB FILE MVI C,DELETF CALL BDOS JMP CPBASE ; ERRMSG: DB ' error ; ;DECIMAL OUTPUT ROUTINE ; DECOUT: PUSH B PUSH D PUSH H LXI B,-10 LXI D,-1 ; DECOU2: DAD B INX D JC DECOU2 LXI B,10 DAD B XCHG MOV A,H ORA L CNZ DECOUT MOV A,E ADI '0' CALL TYPE POP H POP D POP B RET ; ; PRINT on line number: $' ; ; PROMPT FOR COMMAND LINE INPUT ; PROMPT: DB CR,LF,'*$' ; ; INITIALIZE ALL VARIABLES ; INITVAR: LXI H,VAR LXI B,ENDVAR-VAR INITLP: MVI M,0 INX H DCX B MOV A,B ORA C JNZ INITLP LXI H,TABLE SHLD TBLPTR LXI H,CR, LF ON CONSOLE ; CRLF: MVI A,CR CALL TYPE MVI A,LF ; ; PRINT CHAR IN A ON CONSOLE ; TYPE: PUSH H ;SAVE REGS PUSH D PUSH B MOV E,A ;PUT IN E FOR CP/M MVI C,FPCHAR CALL BDOS ;PRINT IT POP B ;RESTORE ALL POP D POP H RET ; ; CO0FFFFH SHLD ENDTBL LXI H,FREMEM SHLD TXTPTR MVI A,80H ;FORCE READ STA IBP STA CLCNT ;FORCE CONSOLE READ RET ; ; PRINT HELP WITH PROGRAM OPTIONS ; HELP: LXI D,HLPMSG ;PRINT THE HELP STUFF MVI C,PRINTF CALL BDOS LHLD SPSAVE ;THEN RET  URN W/NO WARM-BOOT SPHL RET ; HLPMSG: DB CR,LF,'How to use SUPERSUB:',CR,LF DB CR,LF,'SUPERSUB :print this HELP message' DB CR,LF,'SUPERSUB / :go into interactive mode' DB CR,LF,'SUPERSUB / :use SUMMARY AMETER TABLE ENDTBL: DW 0FFFFH ;END OF PARAMETER TABLE ; ENDVAR EQU $ ; ; COMMAND LINE BUFFER...NOT INITIALIZED ; CLBUF: DB 128 ;BUFFER LENGTH CLCNT: DB 0 ;CHARACTER COUNTER CLTEXT: DS 128 ;THE BUFFER ITSELF ; SPSAVE: DW 0 ;STACK POINTER SAVE ;mode' DB CR,LF,'SUPERSUB :as in standard SUBMIT.COM' DB CR,LF DB CR,LF,'In "/" (interactive) mode, SUPERSUB will prompt you' DB CR,LF,'a line at a time for the SUBMIT job input...logical' DB CR,LF,'lines may be combined on the same ; ; FCB FOR $$$.SUB ; SUBFCB: DB SUBDRV ;DRIVE SPECIFIER DB '$$$ ' SUBTYP: DB 'SUB' DW 0,0,0,0 ;INITIALIZE REST OF FCB DW 0,0,0,0 DW 0,0 ; ; STACK AREA ; DS 200 ;WHY NOT? STACK EQU $ FREMEM EQU $ ; END SUBMIT  input line by sep-' DB CR,LF,'erating them with semicolons. Example:' DB CR,LF,' A>SUPERSUB /STAT;DIR' DB CR,LF,'specifies two commands on the same input line.',CR,LF DB CR,LF,'Submitted jobs may be nested...SUPERSUB does not erase' DB CR,LF,'any existing submit job (appends to them instead).' DB CR,LF,'$' ; ; VARIABLE STORAGE ; VAR EQU $ ; TXTPTR: DW 0 ;FREE MEMORY POINTER TBLPTR: DW 0 ;POINTER TO PARM TABLE LINNUM: DW 0 ;CURRENT LINE NUMBER PREV: DW 0 ;POINTER TO PREV LINE GETCNT: DB 0 ;COUNTER FOR 'GET' GETPTR: DW 0 ;POINTER FOR 'GET' PUTPTR: DW 0 ;POINTER FOR 'PUT' IBP: DB 0 ;INPUT BUFFER POINTER CLPTR: DW 0 ;COMMAND LINE POINTER CLFLAG: DB 0 ;USE CP/M CMD LINE FLAG OPTION: DB 0 ;'/' OPTION FLAG STORE TABLE: DS NPAR*3 ;PAR  ? o&)^#Vz~##0:? 7 |.{0W> W> _a{_Disk full$Directory full$Memory full$Submit file not found$Parameter$Too many parameters:$Line too long:$Submit file empty.$ # *.P error on line number: $ *$!26# xE!"!"!t ">22 v * How to use SUPERSUB: SUPERSUB :print this HELP message SUPERSUB / :go into interactive mode SUPERSUB /<!9"1t SuperSUB V1.0 $ :] i?h@!e~ U›!_~#_!͟2/†#"~2 #x~# ʔ †͟ͱÔ~#7 ʟ ʟ+**~s#r#"~#  "p7?:/\<ʛcmd lines> :use SUMMARY mode SUPERSUB :as in standard SUBMIT.COM In "/" (interactive) mode, SUPERSUB will prompt you a line at a time for the SUBMIT job input...logical lines may be combined on the same input line by sep- erating th*#"**"s#r##KEdE  =w# "q"q:/\͈t:yh>_<2!~\>7?:¦: ڣ=2 > >*~#";¶> ɷ>;  : ! "7?:=Ì<:2SUPERSUB /STAT;DIR specifies two commands on the same input line. Submitted jobs may be nested...SUPERSUB does not erase any existing submit job (appends to them instead). $line by sep- erating th*|^#V#"~,*|2^#V#":~#2"!"2Ew#Mڿ$v:/>$vڴ$|S'ڴÓڣ'ڣ0OxGÇx=ڴGS~#ï*6#}m!~=7w*~#"?!4*w#":7~em witmicolons. Example: A>SUPERSUB /STAT;DIR specifies two commands on the same input line. Submitted jobs may be nested...SU$$$ SUB   SUPERSUB DOCUMENTATION 09/05/81 Ron Fowler Westland, MI SUPERSU  i intende a replacemen progra fo SUBMIT.CO provide witOMPILE.SUB Fo example yo ca creat fil calle COMPALL.SU consistin o : SUPERSU COMPIL MYPROG SUPERSU COMPIL RBBS.ASC SUPERSU COMPIL PRIMES.BAS Thi i especiall usefu whe usin th INTERACTIV o SUMMAR modes Whe CP/ b Digita Research Thi documen assume yo ar familia wit tha utilit an it use. -------------------------- SUPERSUB provides the following new capabilities : * Nul inpu line ar properl interpreted t use i conjunctio wit othe CPMU utilities som very powerful command structures may be built. .pa SUMMARY Mode : SUMMAR mod allow th entir SUBMI jo t b specifie i th CP/ comman line Thi mod i enable b usin th slashe caus th creatio o zero-lengt lin i $$$.SUB. * SUBMIT jobs may be nested. * Fo smal SUBMI jobs th comman line ma b specifie o th SUPERSU comman line seperate b semicolons. * A interactiv mod a ("/" characte o th comman line Th individua submi line mus be seperated with a semicolon. For example : A>SUPERSUB / CRCK *.* F;CRCK B:*.* F;COMPARE CRCKFILE.CRC B: | ------> (this space is optional) llow comman line t b entere di rectl int SUPERSU withou nee o tex editor. * A built-in help function is provided. * Th outpu driv an numbe o allowabl parameter ma b specifie a assembl time. SUBMIԠ j wil creat fil o CRC' o al file o A: the creat simila fil o B: th compar th two (CRCK b Keit Petersen an COMPARE b War Christensen ar availabl fro the CP/M Users Group). INTERACTIVE Mode : Yob ma b neste unde SUPERSUB Fo example suppos yo hav submi fil t compil progra named COMPILE.SUB : BASCOM = $1 L80 $1,$1/N/E PIP B:=A:$1.COM ERA $1.REL ERA $1.COM Yo ma the compil severa program usin Cou may enter the INTERACTIVE entry mode by typing : A>SUPERSUB / (i.e. "SUPERSU / wit n arguments) SUPERSU wil promp fo inpu wit a asteris an yo ma the ente SUBMI line fro th keyboard Yo ma ente mor tha on lo  gica lin o physica lin usin semicolo seperation A empt lin termin ate th input Th followin exampl ha th sam effec a th SUMMARY mode example above. A>SUPERSUB / *CRCK *.* F *CRCK B:*.* F *COMPARE CRCKFILE.Cil b passe throug literall t th outpu file. 4>Zero-lengt outpu line ma b create i SUMMAR٠ an INTERACTIV mode b usin tw consecutiv semicolons Thi is, in effect, a blank logical lien. 5> INTERACTIVŠ modRC B: * (empty line here) A>CRCK *.* F (submit file begins execution) HELP Function : Typin SUPERSU wit n argument wil prin th built-i hel file. NOTES :PB 1>Neste SUBMIԠ  ma b aborte b typin ^ (control-C a th firs characte o line Also al norma CP/ editin characters are available. run ar onl usabl u t maximu o 12 neste command a an on time Thi i limitatio o th CP/M Console Command Processor. .pa 2>I yo chang th driv specificatio fo th outpu file yo ma wan t d th sam thin wit XSU  (Digita Research' BDO Functio extender) Withi XSUB fin th submi Fil Contro Bloc (searc fo "$$ SUB withi XSUB.COM an chang th firs FC  byt (i.e. th byt before the first "$") to : 0 - Use the default drive 1 - Use drive A: 2 - Use drive B: etc. 3>I SUMMAR an INTERACTIV modes passe parameter hav n meaning Whe thes mode ar used th paramete flag "$" w!  <ʼ*#"**"s#r##QKͅK  Cw# "q"q:/b͎z:n>_<2!~\>7?:¬:ک=2> >*~#";¼> ɷ>p  :!"7?:=í͞O <:^ 2o O <ʛ*| ^#V#"~<*+" *|I^#V#"Q*+"+O ~#2"!"2Ew#d^…!@! !$¢:/>$ʢ$¨ jHÿH0OxGóx=#Gj~# O Ž!~=7w*~#"?!4*w#":7~? o&)^#Vz:~##>0:? X |O{0x> x> _a{_6Disk full$6Directory full$6Memory full$6Submit file not found$6Parameter$6Too many parameters:$6Line too long:$6Submit file empty$6Control character$ X *OqO  error on line number: $ *$!26# xz!"!"!7 ">22 _0!Q w6 *M How to use SUPERSUB: SUPERSUB!9"M 17 SuperSUB V1.1 $ :] th@ !e~ UX >¼!X _~#_!͟2/†#"~2 #x~# ʔ †͟ͱÔ~#7 ʟ ʟ+**~s#r#"~#  "p7?!":/\ :print this HELP message SUPERSUB / :go into interactive mode SUPERSUB / :use SUMMARY mode SUPERSUB :as in standard SUBMIT.COM In "/" (interactive) mode, SUPERSUB will prompt you a line at a time "  for the SUBMIT job input...logical lines may be combined on the same input line by sep- erating them with semicolons. Example: A>SUPERSUB /STAT;DIR specifies two commands on the same input line. Submitted jobs may be nested...SUPERSUB does not erase any existing submit job (appends to them instead). To insert a control character into the output, pre- fix it with a "^" (works in any mode). $mmands on the same input line.Submitted jobs may be nested...SUPERSUB does not erase any existing submit job (appends to them instead). To insert a contro$$$ SUB" (works in any mode). $mmands on the same input line.Submitted jobs may be nested...SUPERSUB does not erped in previous user's group disks worked only for CP/M 1.3, since the manner in which data was passed back from the "inquire allocation vector" changed (or at least my usage of it changed) from 1.3 to 1.4. #  ;COMPARE.ASM ;11/??/77 ORIGINALLY WRITTEN BY WARD CHRISTENSEN ;12/31/77 ADD PICKUP OF SECOND FILENAME IF BLANK ;01/08/77 ADD SEQIO MACLIB TO READ BIG BLOCKS BSIZE EQU 4096 ;DISK BUFFER SIZE (TIMES 2) ORG 100H MACLIB SEQIO MOVE MACRO ?F,?T,?L MVIUNEQUAL AFTER ' PRBYTES LXI D,BYTES MVI C,@MSG CALL @BDOS PRINT <'LAST DATA READ FROM FILE 1:',0DH,0AH> LHLD PRTPTR DCR L MVI B,0 PRTLP INR L MOV A,M CPI 0DH JZ GOTCR CPI 0AH JZ TYPEIT CPI 9 ;TAB JZ TYPEIT CPI ' ' JC HEX C B,?L LXI D,?F LXI H,?T CALL MOVER ENDM ;TYPE SINGLE CHAR OR CHAR IN A TYPE MACRO ?C IF NOT NUL ?C MVI A,?C ENDIF PUSH B PUSH D PUSH H PUT CON POP H POP D POP B ENDM PRINT MACRO ?L LOCAL Z CALL Z IRP ?M, DB ?M PI 7FH JNC HEX TYPEIT TYPE LDA COL INR A STA COL CPI 60 JC NEXT XRA A STA COL PUSH B PUSH H PRINT <0DH,0AH> POP H POP B JMP NEXT GOTCR XRA A STA COL MVI A,0DH JMP TYPEIT HEX PUSH PSW ;SAVE CHAR TYPE '(' POP PSW PU ENDM DB '$' Z POP D MVI C,@MSG CALL @BDOS ENDM ; ;COMPARE.ASM - COMPARES 2 FILES ; ;COMMAND FORMAT: COMPARE NAME1 NAME2 ; IF NAME2 = NAME1 BUT IS ON B DISK, ; JUST TYPE: COMPARE NAME1 B: ; PRINT <'COMPARE.COM 1/8/78',0DH,0AH> ; ;INIT SSH PSW RAR RAR RAR RAR CALL NIBBL POP PSW CALL NIBBL LDA COL ADI 3 STA COL MVI A,')' JMP TYPEIT NEXT DCR B JNZ PRTLP JMP EXIT ; ;READ BYTE FROM FILE 1 ; READ1 GET FILE1 JZ EOF1 ;GOT EOF? LHLD PRTPTR MOV M,A INR L TACK ; POP H ;GET CP/M RET ADDR SHLD EXIT+1 ;MODIFY RETURN ADDR LXI SP,STACK ;GET MY STACK ; ;IF THE SECOND FCB IS BLANK, ;MOVE IN THE NAME FROM THE FIRST ; LDA @TFCB+17 CPI ' ' JNZ MOVE2 ;NOT BLANK MOVE @TFCB+1,@TFCB+17,11 ; ;'DECLARESHLD PRTPTR PUSH PSW ;SAVE CHAR LXI H,BYTES+5 READI MOV A,M ORI '0' ;IN CASE IT WAS BLANK INR A MOV M,A CPI '9'+1 ;TIME TO CARRY? JNZ READNC MVI M,'0' DCX H JMP READI READNC POP PSW RET ; ;EOF ON FILE 1 - SET FLAG, READ 2 ; EOF1' BOTH FCB'S ; MOVE2 FILE INFILE,FILE1,,1,,BSIZE FILE INFILE,FILE2,,2,,BSIZE ; ;COMPARE THE 2 FILES 1 BYTE AT A TIME ; COMP CALL READ1 MOV B,A ;SAVE CHAR PUSH B CALL READ2 POP B CMP B JZ COMP ; ;FILES UNEQUAL ; UNEQUAL PRINT 'FILES  MVI A,'Y' STA EOFLG CALL READ2 PRINT <'EOF FILE 1, NOT FILE 2',0DH,0AH> JMP UNEQUAL ; READ2 GET FILE2 RNZ ;NO EOF ; ;GOT EOF ON FILE 2, MUST HAVE GOTTEN IT ON FILE 1 ; EOF2 LDA EOFLG CPI 'Y' JZ AOK PRINT <'EOF FILE 2 BEFORE FILE 1$  ',0DH,0AH> JMP UNEQUAL ; ;A-OK - FILES MATCH ; AOK PRINT 'FILES MATCH, LENGTH IS ' LXI D,BYTES MVI C,@MSG CALL @BDOS ;NOTE THE FOLLOWING DOES NOT RESTORE CP/M'S ;STACK POINTER, BUT THAT IS 'OK' BECAUSE THE ;FIRST INSTRUCTION IN CP/M IS A LXI SP EXIT JMP $-$ ;CP/M RET ADDR (MODIFIED) ERXIT POP D ;GET MESSAGE MVI C,@MSG CALL @BDOS JMP EXIT NIBBL ANI 0FH CPI 10 JC NUM ADI 7 NUM ADI '0' TYPE RET ;MOVE FROM (DE) TO (HL) LENGTH IN B MOVER LDAX D MOV M,A INX D INX H DCRCOMPARE.COM 1/8/78 $ "1:m 8 ]!mͶD~# ;!\R ;y!ͼ G:6QxJS*u*w}|!"w*u{z*sR¾*w"wÐ*w"u!"w*s*u}>*w#"wɯ2^2r!"u"wR B JNZ MOVER RET EOFLG DB 'N' COL DB 0 BYTES DB ' BYTES',0DH,0AH,'$' PRTPTR DW BUFF DS 30 ;STACK STACK EQU $ ;ORG TO PAGE BECAUSE 'INR L' USED TO LOOP THRU IT ORG ($+255) AND 0FF00H ;TO PAGE BUFF EQU $ REPT 16 DB ' <   NO FILE1 FILE$!l. ;U ]!mͶD~# ;!\R ;*Q*S}|ڮ!"S*Q{zҠ*O.š*S"Sl*S"Q!"S*O*Q}>*S#"Sɯ2:2N!"Q"S.<  NO FILE2 FILE$G' ENDM BUFFERS EQU $ MEMSIZE EQU BUFFERS+@NXTB END ;ORG TO PAGE BECAUSE 'INR L' USED TO LOOP THRU IT ORG ($+255) AND 0FF00H ;TO PAGE BUFF EQU $ REPT 16 DB ' 4!FILES UNEQUAL AFTER $  PLAST DATA READ FROM FILE 1: $ *-,~ ʨ w w ڱұ_:<2<2͝ $ 2> w>(_͜͜:2>)w\Ð|*w,"!~0Y24+EOF FILE 1, NOT FILE 2 $  X:Yg^EOF FILE 2 BEFORE FILE 1 $  ͂FILES MATCH, LENGTH IS $   Ð ڥ0_w#¶N BYTES $2>)w\Ð|*w,"!~0 prompt, type COMPARE fildescr1 fildescr2 where fildescr is of the form d:filename.typ. If the two files have the same name but are on separate drives, at the A> prompt, type COMPARE filename.typ B: SUPERSUB is a super SUBMIT utility received from the Northwest Osborne Users Club in the Washington/ Oregon area. Refer to SUPERSUB.DOC for information. For brief instructions, place SUPERSUB.COM in drive A. At the A> prompt, type SUPERSUB SUPRSUB2, from OUG, is an update of SUPERSUB allowing entry of control characters. I haven't quite determined the use of this feature, however. Place SUPRSUB2.COM in drive A. At the A> prompt, type DISK.DOC -FOG/UTL.004 First Osborne Group (FOG) Utilities Disk This disk contains updated squeeze/unsqueeze utilities SQ-15, USQ-15, TYPESQ14, and FLS-11 received from the Osborne Users Group (OU SUPRSUB2 and note the comparison with SUPERSUB. Jim Woolley FOG Disk Librarian August, 1982 &  '