Path: uunet!news.tek.com!saab!billr From: billr@saab.CNA.TEK.COM (Bill Randle) Newsgroups: comp.sources.games Subject: v18i050: nethack31 - display oriented dungeons & dragons (Ver. 3.1), Patch3q/18 Date: 20 Jul 1993 22:33:43 GMT Organization: Tektronix, Inc, Redmond, OR, USA Lines: 1557 Approved: billr@saab.CNA.TEK.COM Message-ID: <22hrs7$9qd@ying.cna.tek.com> NNTP-Posting-Host: saab.cna.tek.com Xref: uunet comp.sources.games:1850 Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller) Posting-number: Volume 18, Issue 50 Archive-name: nethack31/patch3q Patch-To: nethack31: Volume 16, Issue 1-116 Environment: Amiga, Atari, Mac, MS-DOS, Windows-NT, OS2, Unix, VMS, X11 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'sys/mac/NHrsrc.hqx' <<'END_OF_FILE' X(This file must be converted with BinHex 4.0) X X:$%jPG%KKBfXZFR0bB`"bFh*M8P0&4!#3#&kSiX`!N!3"!*!$9[d!!&Ap!!!(U`# X3"!d!%!!Y!$#J!J#S!*!&&J!i!#F!iBJB8h4[$%jPG%KKBfXZFR0bBcN#!*!$FR0 XbBe*6483"!2q3"!!!FR0bBe*6483"!2q3"!#3%UKHkei!N!CHU!!!b!%`!!%!N!J X,Z3#3""8!N!AQ!9`!!3#3#!Zi!*!%&3"3!'i!qJ'i!!%!N!J(e!#3""8!8!"Z!2S X"Z!!"!*!)"p-!N!39!&!!EJ$k!EJ!!3#3#!I5!*!%&3"3!'i!qJ'i!*!$(!%)!!J X"5J$`!*!+"dePFh0KCf8i#J#3!a`",J!%!9)"bJ#3#JC6G'&dGA0V1!S!N!-@!(` X!fJ$i!BS!N!3"!*!'66J+!*!$'J#q!!B"8!%b!*!%!3#3"34*EQC[)$J+!*!$)J! XS!#J!M!#L!*!%!3#3"3e1G@aX)>EQ4[Gb!K1!S!N!-m$NjeE@*PFL"[CL"VCAP Xc6d019!8UN!9-8e4$"dYPH@0[C'9)3PP8"%0SBA*$5%&5"5U3"8a69%8!N!-J!#J X!+!&+!Hi!N!S,4(9ZCf9[EL"0BA!i#J#3!b!!+!!S!+`"c!#3"!%!N!8,4'PKCfj X[Fh4TBh-i#J#3!aB!!400B@-J6Q9d5'&MDb")C@a`b5mr!*!$J!#3#`rr!*!%r`$ Xa!I!!N!2lm!m3(`#3!`qr$`%"m!#3!r[r%"$`!!$`$lrrmI!!$`rrqr!2!!!2%"$ Xr[`#3!`m"!I$lm!#3!r!3m!qr!*!$$`%2!2[`!*!$rr!!$lm!N!Ilm!#3"Jqr!*! X(r`#3!i!2rj!&!!!2$*!%$r!!$m#3"-r2!!m-$!rr$rr`$mr`ca$``2!2$lm2!3m X-m!r!qrm3(m$`$``2[rrr$2!2rrrlm-$!m!ra!Iqr$!c`$r!3m2[``2!2$`(m$lm X-m!r!rr$!qr$`$`b3"!qrm!r!N!Alm!rrN!E`!*!$3!!!!F!ci#R`&IJ,q#AiIT! X!Id"qS$j3(bJ1&!!+!!8!!`(!Fq"rm(ri2r`rr(rmrrMrm2r`IrJrr"mq$Km!$`! X(!*!$3(r`3"K!&%(H@H*9mN[b4I*qJRp#IU*H8NiU3"C!#RrqIr"rq(rmIrjrrRr XqIrjrrRrqIrjrrRrqIrjrrRrqIri!!!%!N!B2J!!!2q!!%$r`!"`Iq!!+(rJ!#4r Xm!!5Ir!!#Ir`!!6rm!!#Ir!!`cr`!IqBB!(rb!!"rq3!!Irb!!(rb3!"rm5!!2r# X3!!!rm%J!(rJN!!ri%J!$i!N!N!-%J!!!!N!!!!%J!*!$N!!!N!0)!*!$*!#3!a) X!N!-+!*!$"!!2J!!!2q!!%(r`!$arq!!q2r`!(crm!"qrrJ!2rri!"rrq!!2rrJ! Xarri!Irrq!2rrr!$rraJ!rrq!!2rr`!$rrq!!rr[`!(rjq!"rq2`!2raq!"rm2`! X2q"q!!q!2`!!!"q!!!!2`!!!"q!#3!r`!N!0q!*!$2`#3!am!N!-1!!!"!"rrrJ! X3!!-!%!!#J"!!!N!3!!)J%!!#%"!$iJJ3"r[i%BIm#"&$r!J4)ri)%*2q#""2rJJ X3*ri)%"2q#"-CM!JAr)!)&rj!#"Ir)!JAr*!!#"Im5!J6r#3)%ri5#"(q#3J3I!5 X)%!!#5"!!!5J3!!#B%!!!5"!!!#J3!!!B(rrrq"rrrJ!Irrm!(rrrJ"rrrm!Irrr XJ(rrrm"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrr Xi(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrr Xi(rrrq"rrrrJIrrri!!!#!*!Arrr`!*!-ra!3(r!!N!F2!*!$m3'3!`m!N!F2r`! X!$a#3"2!!N!Ilm!!2!C!%m!#3"rZr!!m3N!3I!*!($l[`$`'3"!m!N!Ml[rm3N!3 XI!*!)$l[a!C!%$`#3#IZr%*!%(`#3"[m!!2qlmIrrm3m!N!82%2rr%2Zrm!!2m!# X3"3m"N!32Zr!!N!J2%*!&qlm!N!J2!C!&rl[`!*!($a#3""m!qlm!N!F2!C!%$`! X2Zr!!N!I`%*!$(`!!qlm!N!Ia!C!$$`!!$l[`!*!'$a#3"2!!!2Zr!*!(r`%"$r! X!!!qlm!#3"rrrm!#3"2Zr!*!1$l[`!*!1qlm!N!i2Zr!!N!ll[`#3$Jqlm!#3$[Z Xr!*!1$l[`!*!1qr!!N!i2!*!$!J!!$rq3#I!!N!82$*!*r`#3"3r!N!Rmm!#3"!m X-N!Rmc`#3"!r!N!Rmc2!!N!-2$*!*r-c2!*!$$m#3"Irrm-$mc-c`!!!2$*!%$`% X"$rcrN!2`!!!2`-r``-m3N!2r`*!$m!!!$``2[``-m3%"$`b3!r!!!!r!cl[``2! X3N!2``-$`!!!2$!cl[`ca!C!$r!`-m!!!$m$!cl[rm"#3!r$!`2!!!!m-N!2l[`' X3"2`-$2!!!!r!N!22Zr$rra$``-$`!!!2$2m-$rZrr!cr$*!$m!!!$mm3rrmIZr$ X!N!A`!!!2$`'3"2Zr$*!&m!!!$mm3N!-Irl[``*!%m!!!$`m"N!-2$2Zr$*!%m!! X!$mm3N!-I`-qlm-#3!r!!!!m-m3%"$``-qlm-N!2`!!!2`2!3N!2``-qlm-$!m!! X!$``2m3%"r!`-qlm-$2!!!!r!`-rrrm#3!mqlm-$`!!!2$*!*qlm-m!!!$m#3#Fq Xlm2!!!!m-N!Vl[r!!!!r!N!V2Zr!!!!m-N![lm!!!$m#3#mr`!!!2rj!-m!#3"!` X!@J"Z!1i"NJ#"4%3!N!0-!!)!N!9i!-B!LJ%3"!*25`#3"3S!4J"c!4#)(%0[G@a XN)'j[G#"H-L"LC@0KGA0P)&i`,L!JAM%!N!8+!"3!+J!dS!)!N!3"!*!*2rrrm#! X!!"JJ"m!B)!r`'#-2q"JLKrJB)NIm'#%Rr"JJRr`B)%rm'#!Rr"JQ-aJB,rN!'#r XmJ"J[rN!B,rNJ'#riN!!B*rK)'#Im*"JMr")B)2J*'#!!"*JJ!!*B)!!"1#!!!*J XJ!!"B)!!!1$rrrrJIrrri!*!-2rrrm$rrrrJrrrri2rrrq$rrrrJrrrri2rrrq$r XrrrJrrrri2rrrq$rrrrJrrrri2rrrq$rrrrJrrrri2rrrq$rrrrJrrrri2rrrq$r XrrrJrrrri2rrrq$rrrrJrrrri2rrrq$rrrrJrrrri2rrrq"rrrrJ!N!G!!!"rr%1 X'@mCIjNrQIqCrKRr'AZC1GN!q3"j!$Rrq2ri!!(rmIrjrrRrqIrjrrRrqIrjrrRr XqIrjrrRrqIrirrJ!!!J#3)[q3$3#3!rc-N![2m!!!r-b3"-rrrmb3"-r`!!$mc*! X%m3%"rmb3!mr`!!$mc2r-c2!3N!2mc-c2m!!!r-clr-c2!C!$r-c-cr!!!2c-qlr X-ca#3!ar-c-r`!!$mc-qlr-m"N!-2c-c2m!!!r-c-qlr`%*!$(mc-cr!!!2c-c-q Xlm3'3!`r-c-r`!!$mc*!$qlm3rr!Ic-c2m!!!r-rmc2qlrmc2r-c-cr!!!2c`(rm X3qlr-N!A2m!!!r2%"N!-2Zrc-N!62m!!!r2!3N!-Iqlr-N!62m!!!r2%"N!2mcl[ Xmc*!$cr!!!2c`%*!$r-cl[mb3!mr`!!$mc`'3!rc-cl[mc-c2m!!!r-m3N!-Ic-c Xl[mc-cr!!!2c-r`%"$mc-cl[mc-r`!!$mc-crrrc-N!2l[mc2m!!!r-b3#-qlr-r X`!!$mc*!*qlr2m!!!r-b3#Fqlrr!!!2c-N!Vl[r!!!2c-N!V2[r!!!2c-N![rm!! X!rj!0m!!!$rq3$2!!N"3L!!%!N!93!83!C!&q"!*25`#3"3B!1!"'!Ab)!Pi`!*! X$'!"D!&i!k!'R!!8!N!Q#!!&`#J#3!aJ!3J"F!--"e`!&!*!*K`!!F!S!N!-B!%) X!A!$$!GF!"3#3#BB!!(!+!*!$'!"#!&`!``(A!!8!N!Q&!!"`#J#3!e)!"!#3"@- X",3"h!@F%!ePPF`#3"Q-!j`"h!5%%!Nj[!*!&#`"-!&3"CSJ#AM!!N!8-!"3!,!! XdS!)!!3#3"9d"+!"p!8L!!*!%C!!&!*!&B`%Y!(F"C`3$@@9c!*!'B`$R!(F")33 X#6Qm!N!9M!+%!G`$E"!44G@Pd!*!&#`"-!&3"CSJ#AM!!N!8-!"3!,!!dS!)!!3# X3"9d"+!"p!8L!!*!%GJ!'!*!&B`%Y!(F"C`3$@@9c!*!'B`$R!(F")33#6Qm!N!9 XM!+%!G`$E"!0"E'`!N!CM!&X!G`#9"!44G@Pd!*!&#`"-!&3"CSJ#AM!!N!8-!"3 X!,!!dS!)!!3#3"9m"+3"r!8Q!!*!%'!"#!&`!``(A!!8!N!Q)!!"`#J#3!i3!"`# X3"@-",3"h!@F%!ePPF`#3"Q-!j`"h!5%%!Nj[!*!&B`#K!(F!fj!!!*!'B`"E!(F X!P33$3@aXG!#3"@-!&3"h!%m%"&&eDA3!N!8,!%`!9!&QL!*H-!#3"3`!&!!X!$5 XJ!J!"!*!&AJ%S!(i"5)!!N!4L!!8!N!9U!2N!IJ%c"!*25`#3"@S!T3"q!0m%"N0 XKEQ0PE!#3"3S!93!k!6Z)!Pi`!*!&4!"A!&3"0K!!N!B+!"`!+J!mS!)!!3#3"@3 X!p!#%!45!!*!%'!#m!*S"'`&c!!8!N!Q*!!"S#J#3!f`!"3#3"8)!63"@!)F%!Np X,!*!&3J!,!&B!433'3f&ZBf9X!*!&"`!d!$F!e)J#AM!!N!9%!*J!9!$-%!P&C'P Xd)&4PH(3!N!B)!!S!+!!US!)!!3#3"6d!53"G!'Q!!*!%J!#3#!rrN!B!$mc-rrc X-cr!2crca$mc2m!r2[r!3r-r`$mclm3(mcr!2rrqrrrc2m!ra!I[mc-r`$r!3rlr X-cr!2c`(mqrc2m!r-rrc2[mr`$mb3"2[rm!r-N!62[r!2c*!&rr!2rj!'m!$rN!E X`!!!*L*!!!*!%rJ!'!!$rp`!'!!X$Z`!*!!)!N!-r!*!cf!#3"K4"!*!&+8!!!$! X!!"S!!!)B3!9V@)P!"q!j4##!3!59`(!F!F)8!"8!&##2`2r`!IJ!N!0cJ#!!N!8 XJ!!!1B!%!%!#3,h!!8)J#'!3"!S#L!!3##)!!!'!!35)6E!!!!LL!!!(iL8!&S#P X%))"!"*9!8"3"3K3!&3!8))r!rr!0#!#3!b4!8!,c`!!%)!-!#C!!"Y8jl%`J!!A X,R#qllR!!$R1mlhrZM`aK',[1mlmBaM(r'J)%!"!B)6$!!*!$!J#3"+QZq45K*!T X3V9c[JHT4&%8k)*4m3N3PSZa!!NNJ"@YBL8!&S#P%))"!"*9!8"3"3K3!&3!8))r X!rr!6!$i!0R4F3!Am)")D)!5!#5$dhpDbNUN!"MaLD%!aL##4M'-B`K'+$+'maM' X-54M&83d0!33!%#!J%%!!N!-#!*!%UY(i!!!B!*!$)aJ#J!#3!dBNJU*!!!!c-J! X#UJ!!!IL*3!@J+83JJ%!%P8"3&!&#&!!9!"3JMm$rm#-!%J!*V')J2I`rN5SN$,J Xj3*@&8Y3KF3!+D%+[H$'0Ad(XB`M#%)S0)9V'-B`*'-54&)J!IjchFrdbI@GjpRr X'0BaqU""6R[HpcR15BaJkMR1M'-BZjq,RcSfV-N!"9@!&DeMj3IfrkA`JJ%!%pAr XIprprPIJ9q"AiMm$rpf8(b2b)Vq,Ybr`JI-JJFh`TrTH2Z8JKVmq+U)dJa%k)J#+ X[r3MldrS1)4R(dI1*'-5+*)J!M'-BT'-dDjM'1B*'094&"""8BaM'-Ba5IrpAdBa XM'-BeJ6a)dBjQl)rq'@Q3!!(rMhiaXBr(rj!%Pc---``JIJIr*riRrj!$q+8#K45 X)V'-Dbr`rN5JrL(a!$T!!K4@e)5%!%bN$m-54H&p%p'-)`K'+M5%BaK')54M8K%4 X)!)aK(k4M2'XBaM"b4M8N5+J3Gq-BaKrrdQ-BIT'-BaM'0)IN50'-BJ%)"#(b6@Y XBq8[p[IJm3!*!"2AhrhIrIi(j3Id9q%rrr!LM!SN8L(4M(G2m)")B)("r3!k3!!" X@XK)"!")U)LM%N3JJJ)4M'-)4LSbK'-B4M%N9E85%5!#FB4JNBc*V'-B`#Ne99&# XS%53R1Fi3K"*M'&+4M'FiaM@*,NR4R'2r'!4!FNJ"q)P+*D8!!%!#3!58&!&8!8! X!)8!P&#"2rr`)S`+6&)JN94"6r$q!##5!1)!!N!#!1Nd-!""Kcp`R1)je!!4dI1p Xq$SpdIaLk$SZ)iNBNrMMmEjlhSq-aDaGjm2'dLS[qU!iMfYDelh[5BarHlR1DelR X1m54'cQaL!1!!F'Q9DeL*5L@P!!"!!N!%P"3"9!&!!#&!*43J6rrm"fd#[ZG)FlE XJ2I`JIrNJ!!#!!2!!%!#3!a!J!*!&!3#3$!%!N!BJ!*!&3#!!!%!J!*!%3(!#F!# X3!i!!N!Q!"!!'3!#3#3(iL8SPT3!!3!*!"*38!93"3!!K3#88)%rrr!!J!!!%!*! X%)IrJ!!NJ!*!+)!#3"J)!N"J$J-!!!%!J!*!$!i!!"!#3!`%!N!N(!*!$!B!!N!J X&DeL*5LIR!!"!!N!%P"`"h!(!!#&!*43J6rrm!*!%"!#3"%!!N!-)`!#35J%!"!! X*!!i!%`!B!"S!(3!J!#8!+J!X!$%!-J!f!$X!23"#!%F!6!"4!&B!@`"J!'8!CJ" XS!'X!F!"c!(J!I3##!)F!M!#4!*B!Q`#J!+8!U!#Y!,)!Y`#m!-%!aJ$,!0!!e3$ XD!0m!j!$T!1i!m`$i!2d!r`%$!38"#!%1!4!"&3%D!4m"*!%T!5d"-J%h!6J"1`& X!!8)"4`&-!9%"9J&E!@!"C3&T!@i"F`&i!Ad"JJ'(!BS"L`'1!C-"N`'B!Cd"SJ' XR!D`"X3'f!EX"`!(&!FS"c3(3!G)"e`(F!H%"jJ(V!I!"p3(k!Im#"!)*!Ji#%`) XB!Kd#)J)R!L`#-3)c!MJ#23*#!NF#5`*2!P3#@3*H!Q3#DJ*V!R!#G3*k!Rm#K!+ X&!SN#M3+5!TF#Q`+J!U-#U!+Y!V)#YJ+k!Vd#``,*!X`#dJ,B!YX#h`,M!ZF#l3, Xc![F#r313!`N$$`-9!aX$(`-L!b8$+3-[!c8$13-m!d)$5!0,!di$9!0D!em$C30 XU!fm$G30k!i!$K31+!im$P!1C!jm$T31V!l%$YJ1j!l`$[`2$!mJ$c324!pB$e`2 XF!q!$j!2R!qd!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J! X'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'N!-#"J%'!!B!"J!'!!B#"J%'!JB!"J! X'!3B!"J)'!3B!"J)'!!B!"J!'!!B!"J!'!!B!"J)'!3B""J!'!3B!"J!'!!B!"J! X'!!B!"J!'!!B!"J%'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J) X'!3B#"J%'!!B""J!'!!B!"J!'!!B""J!'!!B#"J!'!!B""J!'!!B!"J!'!!B!"J! X'!3B!"J!'!!B!"J!'!!B#"J)'!3B!"J#3!`B!"J!'!!B!"J!'!!B!"J!'!!B!"J% X'!3B""J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!JB!"J! X'!!B!"J%'!3B!"J!'!!B!"J!'!`B!"J!'!!B!"J!'!`B!"J!'!!B!"J!'!!B#"J! X'!!B!"J!'!!B$"J!'!!B$"J!'!!B$"J)'!JB#"J!'!!B#"J!'!!B!"J!'!!B!"J) X'!`B$"J)'!!B!"J!'!`B!"J!'!!B$"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J! X'!!B!"J!'!!B!"J!'!3B""J-'!!B!"J!'!3B!"J)'!!B!"J!'!3B!"[rr!!!,hT! X!!*!%r`!(!!$rr3!(!!m%j3!-!!-!N!0#!*!m1!#3$!D!!*!&9DY@)P!"q!j4#"! X#!!L+F!F!F!(""3!!T!!+#"$q!rri!*!0)!#33!9%3!#3"!T3!!!-!!!,!*!$))! X!!!(q)P!"D!T4#"!#!!L+8!8!8!&""3!!T!!+#"$q!rri!*!*!m!!!#!!!!TJ!!! X3!!`!N"a`F!#3%"`!N!3'!*!%4)!!N!J3!*!'))!!9DY@)P!"D!T4#"!#!!L+8!8 X!8!&""3!!T!!+#"$q!rri!*!&1!!B!23J!!!J!!!0N!!!e6NX8L!!!ZA1&mhh1!! X"`$[1prlSm-B4Llc[1r'-Bar)%J#"!!3'#%`!N!NUDi!L!)N"!)#R1q"l!))J$SJ X0(a")K0Lpa!!LLJ!!!IiL8!&S#P%)%!)!#)T3"3"3!8%&!!#N!!S)%2i$rrJ1q$i X!!"(1)!(m)!!J)!-!15"phpDb8UJ!!aia0"!Ba!JL)%BaM#%BS-SEM'-Ba*'-Ba$ X)&3""!!3)#%``!*!%J!#3!bUd9%8S53+85eM'!+5844&4L"#SN!#4#@M'*!!NNJ" X9UeBL8!&S#P%)%!)!#)T3"3"3!8%&!!#N!!S)%2i$rrJ45#)!'j)a)!Am)!4-)!5 X!+8p%e9,5BA%!"43K9#!Ba"!3,dBaM#%)S0)9c'-B`*'-Ba$%')!"!!3)#!33!*! X%J!#3!bS%3!!!"J#3!`M'!+!!N!-4L4(iN!!!!!c')!!))!!!!IiL8!&S#P%)%!) X!#)T3"3"3!8%&!!#N!!S)%2i$rrYa3"!!*$Sa%!Am2b+5*!5!+Ip%K6(8)A%!"63 XQPl`R4UI)8-I3M#%)S1)4V'-B`*'-94&%%!!IjchFrdbIHGjpRG'0BaqU"#,R[Hp XcR15BaJkMR1M'-BZ3!%Ljmk0UaL3!&NTD9DY@2P"rErTI#"!#!!MkArhrhrprj6q X!TrJ+Ia$q!rrmNNI)r%4'-AJGr#!K8L",1#!24)qBL#'[`!P83IKL5-E!"*Eq-)q Xp2k$#%Cap(cL4M%LL3K!!)aM'+4M0'XBaMQ+4M984533M'-BaM'-8Q-I9r'-BaM' X0HIm50'1C[F6rkCUP!!(ripq-E'2arj!&LmB`B-B-%"r!Ira(riMrN!6mNN+&*%4 X(mBlVr$rk-$q`I#!24)899#%K$iQ8J4"L5,`Rb*E'-)`K'+$L%BaK')54M&4%3K! X!)aK(k4M1'XBaM&b4M8N5+J3Mq-BaKrrdRriAT'-BaM'0%%J50'-BJ!L!35Y#eDY X@2P,rEhi2%!!L!!MkI[rlhrpri$q8"rd+I`Mrrr`$F8+**%4'-BeVr#!N%5")IL! X24!!9XU%"!"%9!4"L5)33%"I'-)`K'+M5%BaK')54M@*)34!!)aK'#4M0'XBaM!+ X4M8N8+J3M#-BaK#%%Q-B8T'-BaM'0%NN50'-Brr#!3Rp#J!(q)P+*D8!!%!!L!!L X+!S!+8!&!!!38!%8+#!Mrrr`!%8+4*%4'+SlVr$mJm55`ID!24)"@X4)!%&%@%44 XL5)U))*!!4M'-)4LSbK'-B4M%N9EL5%%3!#FBaLNBc*V'-B`LNe99'#S%CaR1Fia XK&*M'&D4M'FiaM9*,NR4R')!4!!3+T9@V9L*5L@P!!"!!)J!)LJ+!#P!"3!!%&!" X&#JJ)rrrm!"&#Sb6%1LU)+r`J"a$!!$KJ!%5!1Nk5!""Jjqi6R%FbJ!#24mlhi1M Xh4r',S1LiML4L6m#3!(mEjch)q-aDaGjm('dLS[qU!jVQYDecRZ5BaqklR1DelR1 Xm54'cQaL!$J!2#PS!!IiL8SPT3!!3!#)!#)S#J!T3!8!!""3!43S)#2rrr!!@3Vl X(3K(EF"hri2J3!*!$)!"p!"!!$!!3)!#3"S!!N!a!!*!&F2!!N!83#!!!%!J!N!3 X3(!%!N!3J!*!*)!%!!4!!N!P9UeBL8SPT3!!3!#)!#)S#J!T3!8!!""3!43S)#2r Xrr!!3!!!%!"!!!"(i!!!3!*!,)!#3"J%!N!dJ!*!,!4!)!!!3#!#3!`%3!!%!N!3 XJ!*!*)!!!!H!!N!S"rL*5L@P!!"!!)J!)LJ+!#P!"3!!%&!"&#JJ)rrrm!*!%"!! Xi!!!3!*!$%!#3,H!`!*!)i!!#!*!%3!#3#!(!!*!09DY@)P+*qF!!%!!L!!L+!i! X1F!(!!!38!%8+#!Mrrr`!N!d3!*",!3!%!!N!$J!6!"N!'J!G!#!!*3!U!#`!-3! Xb!$F!2!!q!%-!5!"0!&)!9`"F!'%!CJ"R!'N!E3"b!(B!H`#"!)B!L`#3!!#9!*S X!R`#N!+N!V!#a!,B!Z`$!!-8!bJ$2!03!f3$H!1-!k!$Y!2)!p`$m!C!$"!%*!3` X"%3%B!4S"(`%N!5N",J%c!6F"2!&"!8)"43&+!8`"83&@!9X"B!&P!@S"E`&c!AJ X"I3'#!BF"M!'4!C3"P3'B!Cd"R3'L!DF"V!'a!EB"Z`(!!F8"bJ(2!G3"e`(D!G` X"i3(Q!HX"m!(e!IS"r`)%!JN#$J)6!KJ#(3)L!LF#,!)a!MB#1`)p!N)#4`*-!P% X#9J*E!Q!#C3*U!R!#GJ*h!R`#J3+)!Sm#PJ+A!TX#R`+N!UN#V3+b!V8#ZJ+r!X3 X#b!,-!Y!#e`,H!Z)#k3,`![3#q3,q!j!$#J-4!aB$(3-N!bX$-J-j!d!$430*!dd X$8J0C!f!$C!0S!fm$GJ0k!hi$K31,!j!!!j8$QJ1I!k8$UJ1a!lB$Z`2!!m8$bJ2 X2!p8$f`2J!q8$k!2V!qm$m`2i!rd%!33'"!F%$!33""3%'!3B""m!"`!(!!F!"`! X(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`! X(!!F!"`!(!!F$"`)(!3F""`%(!!F$"`)(!JF""`%(!JF""`-(!3F""`)(!3F""`% X(!3F""`%(!3F""`-(!JF""`%(!JF""`!(!3F""`%(!3F""`%(!3F""`)(!3F""`% X(!3F""`%(!3F""`%(!3F""`%(!3F""`%(!3F""`)(!3F#"`%(!!F$"`%(!3F""`% X(!3F#"`%(!3F$"`%(!3F#"`%(!3F""`%(!3F""`%(!3F""`%(!3F""`%(!3F#"`- X(!JF""`!!!3F""`%(!3F""`%(!3F""`%(!3F""`)(!JF#"`%(!3F""`%(!3F""`% X(!3F""`%(!3F""`%(!3F""`%(!3F""`%(!`F""`%(!3F""`%(!3F""`%(!3F""`% X(!`F""`%(!!F!"`!(!`F!"`!(!!F!"`!(!!F#"`!(!!F!"`!(!!F$"`!(!!F$"`! X(!!F$"`)(!JF#"`!(!!F#"`!(!!F!"`!(!!F!"`)(!`F$"`)(!!F!"`!(!`F!"`! X(!!F$"`!(!3F""`%(!3F""`%(!3F!"`%(!3F""`%(!3F""`%(!3F""`%(!JF#"`- X(!!F""`%(!3F""`-(!3F!"`!(!3F!!3!(rrm!N!0#!2!!P`#3,`%!!3!*!!",L3! X-!!",M!#3!aB!#PPj@fYFG9CS9fpBE&0L9'T9EP)X!*!$&J!+@9PE5ea99NKAEeK X-8d*85P918L`!N!0#B!!!Q!#3,`%!!3!*!!!i#3!-!!!i$!!!#-+3!!#3"1m!#J! X!rrB!#J!-!fF!#J!#!*!$0!#3-31!63#3(4q"`!#3"R!F"`"`!*!k9%#@8S!!!B! X!N")#S!#3""D"3!#3")!!8"3&!&!!N!N&%!$!`!!!J!#3&`('!*!1!i!$J!!!#3J X@3*%"N!"54!8N3%`!1!!"iH!!N!N@J8i!N!-0!!"3&!8!8!!"98!!!!mm!0qjr58 XP!!#jGmAcIFi!!Bi6cZIlS`aL$PhRHGq-B-Br3S##!%$#%aJ!N!-%!*!$"8dK(IP Xd8*9TJ3UQED3UQN+TmN0%$h)5&iY!2RDJ!)JcrjEj83!!S!N!!&H8"3"3!!+@3#* X!(m2ie9C*4K)3!8H)M33'-33584)aP%4M$+-HBaM'*)aJaL-M3%)!33)"#!#3!`3 X!N!-&9L%M'Ba!!*!,8Z4"eBh-bY`%8)J%*&5*+AE2B)!d!"%%J&cf"B(B!!+UL&! X2Rm-)Mp*3JKq3!!&AS#M'Vk'DU-)a%)`dLV@-BaJ5-95P&)J!EQGZIYbpZERY Xr-B-Cp8"bS4@-AGhGfCQEpZCQCTQC693lpBdY#UJq8*UN3[b8L8EXB,j)S"1iK-h X$r2m,B!#3!iS`Am-)K6Qj8K*mmN86T"m*ca!%UU[3Mh6r$L*0BqMja)U9%)N5!!C XQC5C66*QCR)8U9+NS)(+KeBaQN!9P8TQ3"8&14r@ec3U)#2bS(i%NT%PfVq$*@6q XK48PpI`h$h*!!!!!r"M$r``L!&'BL&4!#45"q'*)K#qNUrM#-4'10)JcM#0!NLSS XSN4)!(Q*p*P1-QCQBC5T8589!rq%6M'D3!f2rr9+CN!8"9$[[M5c)!$k3!-UN3[b XNL4DS%8pU)U%j8J8"hAj8rr`!!)S`Im-)!&5Q8K!3"%9%44L5)J33*dBaP%4MM+) X-i`V+*)N+4*%+!#CQB5C66*QCQ"8N++Q&3)aM%iaQN!3L)9+CN!8!j)A&LK)3!"% X3L!3N*+8T&UJ+5%TL38)T"3"9!&5!!!!)8LqI``L!14Q*)!%-1IZ%ja(-S!%34ml XR`k0dIJaG"dA%F3T%R`Sr(jRC(P-XQ@jiiZ3T&r9!M&haFjhGhGRCR9+@CQChG`" X24!@aiH!!!4pb[rmR@qN@Z"XqXD""!q5(!&8!8q!!N!-Kk*r$q!!3!!$!!3#3"b! X!$J#3#3%!N!8"KJ#3"!3#!!!)%!#3!`%$J!!)!*!&#!#3#MJ!N!S%!!!IJ!#3"!% X!N!4A!(!!N!8J(ri!N!B#!*!(3!#3&aJ-!!!)%!#3!`B!N!-3!*!&%!#3&33!N!J X#!*!%F!#3"J(!!*")!3!%!!N!$J!@!"d!(J!K!#3!+3!Z!$!!0!!e!$N!2J"!!%8 X!5J"2!&3!@3"H!'-!D!"T!'X!EJ"c!(B!HJ#"!)B!L`#3!!#9!*N!R3#L!+F!U!# XY!,)!YJ#p!-)!a`$-!0%!eJ$E!1!!j3$U!2%!pJ$l!2m"N!-&!3F"#J%3!4)"&J% XD!4i")J%Q!5S",J%b!63"0`%l!6d"4!&)!8`"8!&8!9J"A!&I!@-"D!&[!A3"H!& Xm!Am"J!'$!BJ"L!'0!C)"P`'E!D!"T3'U!Di"XJ'f!ES"[J(#!FB"bJ(1!G)"eJ( XB!GS"h3(J!H3"k!(X!I!"p!(i!I`#!!)%!JJ##`)2!K3#'3)H!L-#+!)Y!M8#23* X&!NF#5J*2!PF#AJ*M!QJ#E!*`!R8#HJ*q!S-#L3+1!T%#P3+D!U%#U!+Z!V)#X`+ Xh!Vi#`3,'!XX#d3,9!YN#h`,P!ZN#l`,e![`$!!-'!`S$$J-3!a)$&`-H!b-$+`- XV!bX$+`-V!bX$+`-V!bX$+`-V!bX$+`-V!bX$+`-V!bX$+`-V!bX$-3-h!ci!N!c XrN!B'"[q3"J!!rj!F!!IrN!B$!`%$!38""`!'!!N!#!%$!!3!"!%(!!B""!!&!3- X""J!'!3B!"J!'!!B!"J!'!!B!"J!'!J3""!%&!!B""3%'!!J""`!'!!B!"J!&!!8 X!"J!'!3-!"J!'!!8!#!!'!!B!"J!'!!B!"J!'!!B!"J!)!!B!"J!&!33""J%%!!3 X!"J!$!!8!"3!&!!8!"3!%!!8!"3!$!!3!"3!$!!J!"3!&!!8!"3!&!!8!"!!&!!B X!#!!'!!B!"3!%!!)!"!!'!*!$"J%(!!B!"3!'!!B!"J!&!!8!"3!&!!8!"3!&!!8 X!"3!&!!8!!`!$!!3!"!!&!!8!"3!&!!8!"3!&!!8!"3!&!!3!"3!'!!B!"J!'!!B X!"J!*!!N!#3%%!!3!"J!*!!F"#J!'!!8!"3!'!!B!"3!'!!F$#!)&!38!"3!)!3N X!"J%'!3-!"3!)!38!"J%(!!J!#!%)!!B!"`-(!!B!#3!)!!8!"`%(!JF""!%%!!B X!#!!'!!RrN#J!"J!'!!F!N!3,*T!!!*!%l`!2!!$rp!!2!!m%Q3!-!!-!!3!q!*! XlF!%b!*!%"J#3&J&8!*!&(i$J!*!+$J!i!*!,"3#31LL)!Nb53!!!#3#3(4D!S!# X3"`jmi!S!+!#3#2!!!!8!"!!!-!!!"!#3(3F-!*!4"`!!L!#3!`3K!0N!L#!C"SN X%!d5#!3#3#`&8!*!&&[bJ!*!%$!!!#N5J#J!S!!!*5S!!!`(l`!!&d8jqB8NJ!!6 X%lm&qGqmm!!$`!)qHmrpk'$$#$LpmpmprKJ`'-Id&!%#!!J-%%``!N!3#!*!%#TN X3FHrLp#J5P@B""&+Qfa#+9BK&+l!-H!21!!"d@J"qHJ!!%3$2rjE%Ti!!")!)J!! X+A+!+!#J!!"*-J!4'!I`[m!AApC+45-!!#5d3Jd#!--)!!3RJL''+%)BB-8-H--- X--)L'$!Ba$)D!))!#"!3""!#3"!)!N!3+TK!L''--)!#3$3&*%S3&84iH*Z!!S)9 X8!!S!*&%@p+K!!*!$%3!J#P#J#J!S!!!5P3"!$!(m+"!&JT58S)Ib!!S@%39"!&$ X#""%+%8KJKK##'$*#V6$$$$!)KJa&845%!!lcRZjpYaE0ChRhGdBa'-IUJ#K5#&- X-,R1FjcR1Fk8V1FjcSaM&5j!!JHP4)5%P3!#JM!#%Rd35%4D8X#lMT)!4!#!+8+I Xk!#MZ!*!$%+4IpI`S%!@2c'K!K-)!%K36#Ah`6d0)#"6T6k#'%))B0%*0-----!L X&%NP+&%3!%BaM&)j6*c1BaML+4M%Ba#U!+&))8``aM'-BaM'-C5c'-BaM'-8e8([ Xj8Pc-T%!4)*98L%4%F4&fPl!a&%5!)l*3#P#N'i$[%3#3!`%8Irhm+"!&K3B3S)8 X[Ra)8)*%$#*!!`K2N*5SSB)IHRrJi3Jb`r3r2#)85U)SN4!!2M#-8M&0')aM'-)* X'+U9%8N"%LJp,$#plh[I#-BaP+-BaM'-Ba!8iKrP48Y#!!IRmT!2`2d53!*&'PM! X[&-Mm)8a3Qp1rH2q$%3#3!hi-IrRm+"!&J!8Y&)3#!#)83'%$#*!![L!#45SSB)B X3KKJd3Jb``3d!L)5LU84%*!!4M#2dM&1')aM'-(*&5U*%LS"%LJK,$$'-BaM$rrr XP+-BaM'-Ba!83Kr93h0#!!#)Ja95)4%84%ADAk&(e8)C"!)NSdJP,`HmIrq!!!Ja X$qI`S%!@!"9-)K!)!)K5!Ii-*%))3"%6hq'#'%)BF-N)-F-%-J)L%S4&%4#3!%B` XM")a64L-BaM!+484&43U!rri)4``aM'-B`K#%*5M'-BaM'-3&%([cd0,-J!"#))3 X!K)4&%K%@P!K4"P'&36++6r2j5RmT%!#3!a%84Krm+"!&!"@6&%J!!%%P#)&$#4# X%#qJ#""KKLK#'($&#$($",&#)K%%5*)38!"'-Ba5-8bBM'-B`LNb%5-B+J)-''%F X--BaM'-BaM'8SaM'-CcR-"9%&i9%K)3!"r#'&9!!%4544&T`%N444J)&0"5!!!8S X!+4%!N!5N5!(m+"!&J!k-iNJ!)-$(p`%mm3mj4"""a"qHmr"k'p$q$#p!p#m)H%% X5*2`8IircRZ4m8aBM&hR`FE5%5,rUJ)-&lm,cch[HplR1Fk8SZFjcQYDd!lk%!AB XH(J!!K$ji!rrNHXr4&S!-cZZ1J)%"r*!!!!&+!#MZ!*!%3m!"r#r`"3!%!!!`!#! X!N!K!!*!1#!#3"JB-!*!&#!)!N!0!)!#3"!3(!*!$3!#3"K!!N!S"!(J!N!J"9!! X!3!!!&S!!N!8"!*!%!8S!+!#3"N!!"q!!"3#3"N!!N!L!!*!FL!)!N!0!)!#3"%3 X!N!3J!*!')!#3'B!!!"D!!*!&!3#3"!(+!#J!N!8%3!#3"!8!N#a`$!#3#6J!N!4 X!!*!F!93!N!8IJ!#3"3)!N!81!$J!N!8$J!#3"!8!N%8"!!3!#`!3!"F!(`!J!#- X!*J!X!$%!-`!i!$N!2J"%!%B!6!"5!&N!A`"P!'X!F3"h!(J!HJ"q!)-!K`#0!*8 X!R!#L!+J!VJ#c!,J![J$%!-8!b`$4!0B!h3$M!1N!l`$e!2X"N!-)!3i"&3%H!5- X"+!%Y!5m"0!%f!6N"33&$!8J"63&5!9F"A!&J!@8"DJ&X!@m"G!&f!Am"K!'*!Bi X"N`'B!Cd"S3'Q!DX"Y!'j!Ei"``('!FF"bJ(3!G!"e`(H!H3"k3([!I8"q`)!!J8 X##J)2!K3#'3)H!L-#+!)Y!M)#0!)f!MN#2!*"!NB#5`*3!P8#@J*I!Q3#D3*Z!R% X#G3*k!S!#KJ+-!T)#Q3+K!UN#XJ+d!VF#[3,(!Xm#eJ,E!Ym#i`,S!Zm#p!,k!`% X$"J-*!`i$%`-E!b3$+`-`!c%$0J-q!d%$4`01!e3$@30H!f8$E!0a!hJ$I`1)!i` X$N`1B!jd$R`1K!kB$V31b!lm$[`1r!lm$[`1r!lm$[`1r!lm$[`1r!lm$[`1r!lm X$[`1r!lm$[`1r!m8$b`29!!$rr`#3#2q3"JJ)rj!'!!$rN#3%"!%$!38"#3%(!3N X!#3%$!38""3%)!3F""!%(!3-""`%)!`J"#!%)!3J"#!%)!3J"#!%)!3-""!%'!3F X""J%)!3S"#3%)!3J"#!%(!3F"#!%)!J8!"`%)!3F"#3%)!3J"#!%)!3J"#!!)!3J X"#3%,!3F""`%(!33""`%%!33!#!%%!3F""`%(!3F""`%'!3F""`%&!3B""`%&!3X X""`%(!3F""`%'!3F""J%(!3F"#`%(!3F""`%&!3-""3%)!!!"#3%*!3J""`%)!3J X"#!%(!3F""`%(!3F""`%(!3F""`%(!3F#"3%&!38""3%(!3F""`%(!3F""`%(!3F X""`%(!38""J%(!3J"#!%)!3J"#3%+!3S"#`%%!38"#!%-!!J!#`%(!3B""J%(!3N X""`%)!3N##J%&!!B!"J%+!3X!"`%)!J3""`%+!38"#!%*!3J"#!)+!!J"#3)*!3J X$$!%,!3B"#3%(!3F""!%%!3F"#3%)!3rrN#J##3)*!!Uff`#3!d3!N!N)!!`!HJ" X"!(S!$!!)!*!6#!!-!(i!I`"q!!`!#!#3#`F!#3#3!d3!N")"`!&!!8!(F!)J!8! X!J!#3%J(!!F!"`!I`!q!"`!#!!!N!#!#3!d3!N!S3!$!!AJ##!&i!-!!3!*!6%!! X`!(i!rJ"q!$!!%!#3#JJ!"J#3!d3!N"83!#N!&`!*!!N!(`#3&4!!13!I!!m!$`! XI!!X!#`#3!d3!N"3)!*3!k!#3!!#3!!$i!*!9#!#F!2J!m!$`!2J!!!X!"!#3!d6 Xi!*!!!*!!!1J!P!!)!*!9q!$`!2!!q!#F!!J!N"B%!!3!N!0%!*!%$r!)%!J3#"! X)%!J3#"!)%!J3#"!2m!#3#!r`(rJBN")Iq!r`!*!&"`!(!*!$4!%!!S!%3!lJ!S! X#J!1!!*!5!3!$J!I!$q!$J!1!!i!!N"-'!!F!N!0%!"m!#3!*!"F!+3!3!*!9(`! X2!!m!(`!j!"!!N"8%!!X!N!-3$djPG%KKBfXJ9fPZC'phF`#3!b!!-!!3!8)"l3! X%!*!)#d4eEQGPEfiJ6@&`+!S!N!-k18jPG%KKBfXJGM-Z-5iJ5@0[ER-JBRNJ4'p XZB@aN)%`Z)%jKFfJJ,5"%,NjKFfK!GA4PH'&c,Q9NG3#3!i!2rj!&!!!2$*!%$r! X!$mrr`2rrc`!2$!`2r`rrm!r2m-m3m-$`$`qr$`%2$2!2`2[r%"r!m!m-$lrrr`c X`$rrrqr$!`2!2m3(r[`rmm!r`%2$lm-$`$`m"r!qr$2!2`2r``2[`m!m2$!rr$lr X`$m#3"I[`$rq3"[!!N!1!$rq3"3!!$``-$``2m!!2cm$lm-r2!!rar2[mrrr`$r! XIqrm3m2!2m3(lm3(mm!r`(r[r%2$`$r(mqrcar2!2cm$lm-r!m!m-$2[m$!c`$m$ X`qr$``2!2$!rlr``-m!r!`2[``-$`$``2qrm-$2!2`2$lm2$!m!rrN!E`!*!$3(r X`3"KFp%(H@H*GmNrb4r*rJRrDIZ*HFNik8Gj!$RrqIr"rq(rmIrjrrRrqIrjrrRr XqIrjrrRrqIrjrrRrqIri!N!0!Ir"!'&18HVjqqRlkI[TkZP+53S*+SNE#3S*'`NU XLIrjrm(riIrarrRrqIrjrrRrqIrjrrRrqIrjrrRrqIrjrrJ!!!3!Irri!%!!$!"! X!!S!A2I*!%!!#)"!!!K!AZq))%!Ilq"'(r!JAIrq)%52q#"#6rJJAcrr)%#Iq#"! X6rJJ6'Bc)&rb!#"Iq3!JArc[)&rb3!!JAr%J)%rrRD"2q%JJ4rJN)&(hFL"!!!NJ X3!!%S&mrJQ"!!!%J3!!!S%!!!'"rrrrJIrri!(rrr!"rrri!Irrr!(rrri"rrrr! XIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJ XIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJ XIrrri(rrrq!!!!3!Irri!%!!$!"%"!S!6!S*!%i+#)"H#JK!A`SIi&r+Ib"rqrqJ XIr[rS(rlrk"rqrqJIr[rS&r+Ib"I#KmJAJS2)%i+$L"-kZBJ4HVd)%(lm#""qr!J X3([!)%!lJ#"!'`!J3$Z!)%"l`#""qr!J3I[`)%(Um#"!kZ!J3!S!)(rrrq"rrrJ! XIrrm!(rrrJ"rrrm!IrrrJ(rrrm"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJ XIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJ XIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri!!!#!!!2rj!*m!#3"3m-N!Rr!*! X&$m#3#Ic`!*!%$`rr$2rr$rrr$2c2!*!%$m#3#Ic-m!#3!`m-N!Rmc-m!N!-2crr X`rr$rrr$!r-c-m!!!$`b3"!m"!3rmrj!$m!!!$m$2m-$2%*!$(m#3!r!!!!m2rlr Xrrr%"!3rrr!c`!!!2`-qlm-$`%*!$m-$!m!!!$``-qlm-m3'3!r`-$2!!!!r2rrq Xlra#3"2rr`2!!!!m-N!2l[`'3"2`-$2!!!!r!N!22Zr!Ira$``-$`!!!2$2m-$rZ Xrr!cr$2m-m!!!$mm3rr!IZr$!N!A`!!!2$`'3"2Zr$*!&m!!!$mm3N!6rZrr`rrr X!m!!!$`m"N!-2$2Zr$*!%m!!!$mm3N!-I`-qlm-#3!r!!!!m-m3%"$rrrqlrr$rc X`!!!2`2!3N!2``-qlm-$!m!!!$``2m3%"r!`-qlm-$2!!!!r2`-rrrmrrcrqlm-$ X`!!!2$*!*qlm-m!!!$m#3#Fqlm2!!!!m2rrm-rj!$r!`-qlr`!!!2`*!+cl[`!!! X2$*!,qr!!!!r!N![2m!!!$rq3$2!!N!-#!!!2rj!*m!#3"3m-N!Rr!*!&$m$2`*! X$cm#3!rc`!*!%$`cr$*!$qr`-$2c2!*!%$m$`m-$!qr$!`2c-m!#3!`m2!I`-$2[ Xm$!cmc-m!N!-2ca!I`-$lm-$2rj!$m!!!$`m"!Im-qr`2m3%2$2!!!!r`%*!$rr[ Xrm"#3!r$`!!!2m3'3"2[a!C!%r2!!!!r`%*!%qr!3N!6`m!!!$r%"N!6lm3'3"2c X`!!!2m"#3!rrlrr!3N!2`m!!!$`m"!Im-qr`2m3%2$2!!!!r2%"r!`2[``-m3(m$ X`!!!2$`(m$!clr!`-m3m-m!!!$m$`m-$!qr$!`2$``2!!!!m-r`crr2[mrr`2r!c X`!!!2`-r2m2$lm2$rcm$!m!!!$``-$`!Iqrm!(`b3!r!!!!r!`-r`!2[`!2r!N!2 X`!!!2$*!$$`$lm"m-N!6`!!!2`*!%m2[`m-#3"2!!!!m-N!32qrm-N!A`!!!2`*! X%m2[`m-#3"2!!!!m-N!-2!2[`(`b3"2!!!!r!`-r`!2[`!2r!N!2`!!!2$!`2!"r Xlr`!I$*!$m!!!$m$!cr$`qr$`rm#3!r!!!!m-N!2rr2[mrr`-N!2`!!!2`*!&qr$ X!N!A`!!!2rj!-m!#3"!G"8&"-!*!'"e0"9N8!!3#3"!G38N9'!!)!N!3(9%9B9!! X$!*!%"d*26N8!"!#3"$aZD$-a!*!$!8C548B!"!#3!i!!!3#"!!)!JJ!$!)-!"!# X%5801)`!%!!!$k!!"!qN!!J2U!!-$k`!%!q`!N!-1!$i!6J#k!E)6L3!%-!S!N!- X9!%)!,J$D!E)!"3#3#"G`!*!%X`#"!*!)rrr9234'D@aP#%p`C@iJ6@&`!%m!!!T X5C@4bBAFJ6@&`!&)4!!a3FQ9fD@peFb"0FfF!8"%!#P*PF'pcDA4TEfi!6J!!"80 XXEh0P!&F!!!%Y!*!%"e*PCh9XBA)!'mJ!$89ZG'9b)%9iF'a[FQ8!!&J!!5d!N!3 X-6h"dD@pZ)%9NDA6*!%8!!!%Y!*!%"&0KGQ8!8e-!!5d!N!3%8A9TG!"483#3"8J X!JJ#3#2q3!rX%4@4TG!49EQ4[!&S!!!%Y!*!%!d0eG!"B!!!%3fp`H3"$!!!&8'& XcG'8!9J!!"80XC@&b!*!)V!#$!*!)rrrpr`0,BQ3-3fpZG(*[E#",CAPc!"[*!!Y X3G@jMG(9KG'P[EJ!EbJ!)3R*KBfYPG(-!'mX!"@%J,5"Y!"[-!!9Z)#dJHJ!Ec3! X&35!Y)%d!'mi!"8iJ,5"D!"[2!!8`)#dJ13!Ed!!",3#3"!JSCA0MBA"P+3#3"!F XSFh"KBf8T!*!%##KNC@aPG'8T!*!%##KbCA4eFQiT!*!)F`#%!*!)rj!$f`4)C@a X`"dp`G'P[ER-!!%m!!5d!N!3%5'9XF!!!2`!-4'9cBh*TBQ8J5f9j!!!Q!!%Y!*! X%"eCPFR0TEfi!!(B!"dKTFh4[FRN!!&B!%&CPFR0TEfiJ4Q9KG(9bCA-!!#-!N!8 XU!)!!N!MrN!2l!4313@*[GA3J6Q9d5'&MDmN!N!3",3#3#-B!K3#3#2rrrHm%5@j XQE`e*ERCPER4[FRNJ3@aX!!"T!""*ERCPER4[FRNJ8f9XC@0d!!"*!!C"C'TeFh3 X!!#-!!5d!N!3*6'p[Db"%EhGZ!!!k!!a%CA0MFQPLC5"2EQ8!!$X!$84PFf0bD@* XP)%eKERN!!#m!$84PFf0bD@*P)&4bBA!!!&i!!5d!N!3-3f&XE#"0EfjcG'9b!!" X$!!Y1B@eP)%pLDQ9MG!!!)`!,4'PcBfpfCA*TCA-!!&`!N!@5!)B!N!MrrrZl"89 XaG@P`"d0eFR*PER3!'p%!!5d!N!3&9fPPE'3!!(F!"94SFQph!!"d!!9"F("XH3! X!B3!",3#3"!TAC@&b)%&bE@pb!!"A!!K8B@YP)%pQCJ!!9!!+3A0V)&*PE@pfC3! X!33!",3#3"!C3GA3J6fi!!&!!"P*PE@pfC3!!8J#3"C-!K`#3#2q3!hX$3@0d"&G XKDA3!!#i!!5d!N!3)9'9XCA"[FR3!9"%!"%TeEA!!!#-!"de[ER0dCA)!!#-!"&G XTF'8!!#-!!5d!N!3&3A"`E(N!!'%!!e"KH3!!F!!%5fPMD`"%%3!%3fKKG!!!)`! X&6fCQCA)!!#-!"&"bBAN!!#-!"&4eFQi!!#-!N!@j!)J!N!Mrrr[I"8eKCfPM#84 XbEh!J5A4PE3!!C!!,4(*[F#"6C@aPBh3!!%3!"P"TBfYeF!!!,!!09'pRCfaP)(" XTBfYeF!!!3!!",3#3"!0&BA3!!'8!"&*PB@3!!()!"9&eB@CQ!!"a!!0%DA!!!#- X!!5d!N!3,6'PcG#"6F'9XE(-!!(J!#N0KFh3J8h"PE'`!!&S!!eTKF!!!HJ!'5@j XfEfYP!!!M!!05G@)!!#-!N!@h!)N!N!MrrlZr"%*TG(-'8f9KFQ0S!!"c!!T$E'p XcC5"%Efpb!!"M!!P2F'9Z)%4[Eh)!!'m!"8&`F'aj!!"K!!4,D@0V!%34!!%Y!*! X%"P9ZG(*KF!!!)`!&4QpbBf8!!#-!"%a[Eh3!!#-!!5d!N!3(4@jRFQ&fC3!!43! X$4'P`!!!M!!06DA3!!#-!!5d!!#-##%0XD@e`)&9`!!!m!!T$E'PYBL"%EhGZ!!! Xq!*!&L`$+!*!)rj!%#h"eEQ0dG@&dD@pZ!L!Z!*!%!L!X!*!%!L!l!*!%!L!k!*! X%!L!K!*!%!L!r!*!%!L!V!*!%!L!Y!*!%!L!p!*!%!L!M!*!%!L!N!*!%!L"!!*! X%!L!Q!*!%!L!U!*!%!L"q!*!%!L"I!*!)H!$,!*!)rj!%#'*bB@0VCA4c!9X!N!3 X"A3#3"!%S!*!%!5N!N!3"H`#3"!&p!*!%!6`!N!3"2J#3"!&H!*!%!@!!N!3"*`# X3"!%L!*!%!9`!N!3",`#3"!&m!*!%!58!N!KM!-`!N!MrN!3&B5!Y)'d"B3#3"!& XL!*!%!@-!N!3"C!#3"!&P!*!%!@B!N!3"C`#3"!&S!*!%!@N!N!3"DJ#3"!&V!*! X%!@`!N!3"E3#3#'-!c3#3#2q3"!9Z)#dJHJ&Z!*!%!@m!N!3"F!#3"!&a!*!%!A) X!N!3"F`#3"!&d!*!%!A8!N!3"GJ#3"!&h!*!%!AJ!N!3"H3#3"!&k!*!)B`$1!*! X)rj!%"8%J,5"0!8%!N!3"3J#3"!&$!*!%!83!N!3"43#3"!&'!*!%!8F!N!3"5!# X3"!&*!*!%!8S!N!3"5`#3"!&-!*!%!8d!N!KM!-m!N!MrN!3&6L!Y)&S"6J#3"!& X2!*!%!9!!N!3"83#3"!&5!*!%!9-!N!3"9!#3"!&9!*!%!9B!N!3"9`#3"!&B!*! X%!9N!N!3"@J#3#'S!b3#3#2rrrIm-BfpZG(*[E#"VCAPc!@)!-3!!!@S!-J!!!@i X!-`!!!@J!0!!!!@`!0J!!!AN!0`!!!@X!1!!!!A8!13!!!5d!N!3"C!"%!!!"F!" X3!!!"FJ"5!!!"G!"8!*!'83$3!*!)rj!%"6!J,5!j!6!!N!3"-3#3"!%b!*!%!6- X!N!3"0!#3"!%e!*!%!6B!N!3"0`#3"!%i!*!%!6N!N!L4!-J!N!MrN!3'GfPkBA* XN#N&dG(*TBR9dCA-!!(J!$84PG'9MG#"9ER0PC@i!!'8!#8CXEfpb)%eKF!!!CJ! X34f9ZCA*KG'8J6@pZFh4PFJ!!C`!)5@4PER4TCRN!!'N!#8a[Bf&dD@pZF`!!E`! X16'9fC@`J9'9XCA"[FR3!!(B!">FfJ!!(F!N!9I!0%!N!MrN!3(Bh9bFQ9ZG!C XAC@&`Efi!!#N!"8&bE@pb!!"E!!95D@jRF`!!23!'3@eeE'9d!!!L!!98EfpXF`! X!+!!%4fpXC!!!*!!'8h"PE'ac!!!V!*!&,!#!!!S!J!#3!i%!N!1#!*!$J`#3!i3 X!N!1&!*!$KJ#3!iF!N!1)!*!$L3#3"5`!b!!+!-J!N!2*!*!$bJ#3!mX!N!2-!*! X$c3#3!mi!N!22!*!$d!#3!p%!N!@3!!!0%D8b-$%J3fpZG(*[E#",CAPc%+8b-$) XJ8(9ZBh4eBA4TEfi0T6)`-b"#FQ&MDf9dF`UP-M!d)'%J,5"Y#U8b-$8JEL!Y)(S X+T6)`0L"")#dJ63UP-M!h)%iJ,5"D#U8b-$JJ-#!Y)$N#T5d)'k9PFf0KF'8()+9 XcF'&MC3J)T@4PE'9dC3J0TA*PG(9bEJ#3!bJ!$!bP-M!j)%0eFR*PER3#T5d"G`& Xd!@%#T5d"9`&8!8%#T5d"8!&5!*!$C3!0"`+PBh4X,@)(#U9MG'`YDJF1T@0dE#e XZ"`LPBh4X,@J($+9MG'`YE!FCT@0dE#ej"`ZPBh4X,@X(&D9MG'`YG3+P,3F%T@0 XdE#eN"a#PBh4X,A!(%U9MG'`YFJF8T@0dE#ed!*!$)J!3!5i",!%l!6S")3%r!5X X",3%p!5-"*!&!!5B"+J&q!9m!N!-L!"!"@`&G!5J"+3&l!Ad"2!%q!9i"B!%R!5) X"A!%[!A`"*3#3!a`!$3&K!@)"B`&N!@8"CJ&R!@J"D3&U!@X"E!&Y!*!$(!!0!@i X"E`&`!A%"FJ&c!A3"G3&f!AF"H!&j!AS!N!-F!!d"33&#!8-"4!&&!8B"4`&)!8N X"5J&,!8`"63#3!a`!$3&1!8m"8!&4!9)"8`&8!98"9J&A!9J"@3&D!*!$&J!+!6! X"-3%b!6-"0!%e!6B"0`%i!6N!N!0#!!J('+9MG'`YH!F&T@0dE#eP"`DPBh4X,@B X("k9MG'`YC`F*T@0dE#eT"`qPBh4X,@m(&U9MG'`YGJFAT@0dE#eh!*!$%!!(!5N X"@`%p!5)"+!%N!5X!N!0,#c&cG#"YC@je)%P%4&G54!SM)'pQ)%e&6P9c6d019!8 XUN!9-8e4$"P*PFb"*4%4A8N3)8Q9cCA*fC@4'9e*%"5U3"8a69%8!N!-V!a1!!*! X$"6-Z-5ic(P0dD@0SG'PZCb"0BA4SC@eKG'PcBfJJ3f9ZG(*eE3#3!bX$%i!!N!- X&-bia,M-H-bia,M-0U6%j1$8Y-6Nj-b"0,L"6G'9`D'9ZFfpZ!*!$e!!,!*!&G!$ Xq!)J"BJ3%8'aKH3#3"A3!9J#)!,S%"&&eDA3!N!9`!2S!M!&QJ!#3"Ni!H3"I!*S X!N!G1!0S!A`$l!*!(6J&&!&m"CJ#3"di!93"H!(Q)"9*[E'8k"!#3"8i!ZJ"H!0U X)"&0PH$S!N!91!4N!AJ&&L!90Ef4P1J#3"K-!93!N!@@)$&GSEb"KFQ8JH@pe2`# X3"5N!@3!j!@-3"%jKE@8!N!82!"J!,`!iS!)!!3#3!aX!#!&2!U8Y!6m"*J+P,3& Xf!9B))hCPFR0TEfi!N!-Q!!`"D3&*"b0KC'TeFh3#T5d"1J%l!5m"AJ+P,3&$"50 XZB@eP!9`!N!00!!i",J+P,3J8T5"MG'`YG!8MDR9YF!JME@pZFh4PFJ8MGfP`C3+ XP,3&K!A!("+9MG'`YC!8MBfKKG!BMEfCQCA)&)h"bBAN&)h4eFQi!N!-Z!!m"C!& X%!5`"3!+P,3&P!A)"F33MC'P`!U8Y!AJ"@J&k"b0TERC[Df8%)h*eBJ#3!c3!!J# X3"@F""!"l!93%!Np,!*!&#`"4!&J"B)J%AM"H-3#3"3S!'!!U!$LJ!J!"!*!$4!! X$!*!&A3%1!(%"5J3#6Qm!N!9G!&d!F3#C"!0CCA-!N!B+!%m!8!&6L!*H-!#3"3S X!&J!U!$DJ!J#3"3i!4!"%!,)"e3#!4%3`#J#3!`i!5J"U!0-"ea1)!!3`#J#3!d! X!%!&c!@-"E`&K"`5PBh4X,@3#T5d()h9ZG(*KF!BMCQpbBf8&)fa[Eh3#T5d"433 XMC'P`"#0cDA3#T5d"2!%q!!!"!*!$9[d!!&Ap!!!(U`!d2Q`%b!#3!a`'@J!89dP X14!!(!+T869"-!!%"#NjeEA!!!3%L38a59!!$!6T%594-!!S"DP088L-!%3(ZD@0 Xc0!!%!XCTBh-M!!3$!NP$6L-!"!-qD@0X0!!%!hT%6%p(!!B$YNC26P3!!`3+4Np X14!!""$T$99*6!!J%8P088L!!!!5qEQJc-3!!"-T'8N9'!!3%eN*14%`!!!85689 X193!6"4j06P8M!!%'$RCPFR-!!3BQ!)!!,3#3!hJ!0$ZS!)%!N!Fd1k3!JJ!)!*! X$)!!d1k!!J`!2!*!$hJ!d1j`!K!!A!*!$3!!d1jJ!K3!F!*!$@J!d1j3!KJ!K!!! X"!J!d1j!!!)F!Z3!!25i!0$Z-!)!!-J#3!ji!0$Zi!)%"4J!!8X3!0$ci!)!!0`! X!*LJ!0$`8!)%!33!!*N)!0$`3!)(rrb!!#1!!0$U%!)$rr`!!9C8!0$V-%iMrr`! X!9DF!0$Q!%iRrr`!!4DF!0$TJ!)(rrb!!#2!!-d#!!)$rr`!!$)`!0$f)!),rr`! X!$[i!0$dd!)Mrr`!!$RB!0$d`!)Arr`!!$5)!0$dX!)Err`!!$AJ!0$dS!)Irr`! X!$H!!0$dN!)Rrr`!!$i!!0$dJ%iMrr`!!948!0$eX%iRrr`!!98d!0$SS&h$rr`! X!8h%!0$YJ!)!!Ub!!!5B!0$`)!)-!e!!!8&X!0$`%!)3!f!!!9%N!0$`!!)8!h3! X!9'J!0$[m!)B!iJ!!81m!0$[i!)F!k!!!9*)!0$[d!)J!l!!!91-!0$[`!)N!mJ! X!9EN!0$[X!-N!p`!!84X!0$[S!-S""!!!8B3!0$[N!-X"%!!!8DS!0$[B!-`"'3! X!8G!!0$[8!-d"(`!!8I!!0$[3!-i"*3!!8K!!0$[-!-m"+`!!8M!!0$[)!0!"-3! X!8P!!0$[%!-J"0`!!8QS!0$[!!0%"2J!!8V!!0$Zm!qMrr`!!!8!!0$b%!qRrr`! X!!F3!0$b!!qVrr`!!$r!!0$am!q[rrb!!2C!!!$3mH!2XrrmJ!$i8!$3mG!2Srrm X!!!*)!$3mQ!2Trrm!!!+-!$3mP!2Urrm!!!T%!$3mN!!$krrr)!!qQ!!d2)`$l2r Xr)!!qh!!d2)J$k2rr!!!#d!!d2+`$kIrr!!!$e!!d2+J$k[rr!!!*3!!d2+3$krr Xr)!!r)!!d2+!$l2rr)!"!*!!d2*`$k2rr!!!%f!!d2-!$kIrr!!!'h!!d2,`$k[r Xr!!!+L!!d2,J$krrr)!""+!!d2,3$l2rr)!"$,!!d2,!!L!"*!!!1@J!d24!!K`" X@!!!-cJ!d23`!KJ"5!!!-kJ!d23J!K3"2!!!0"J!d233!L3"E!!!2C!!d23!!JJ" XT!!!-XJ!d22`AF!&,!!"&Z3!d26a,LIrr)!!3G!!d21a,M2rr!!!D!!!d21"-#3# X%)!!QSJ!d20a-$!#4)!![D!!d20J!P`"`"!!PiJ!d223!Q!"j"!!QA!!d22!#!2r Xr)!!m3J!d2@!#!rrr)!!mLJ!d29`#"2rr)!!mdJ!d29J#"Irr)!!kNJ!d293#"rr Xr)!!kfJ!d29!#!Irr)!!l)J!d28`#"[rr)!!lDJ!d28J##2rr)!!lXJ!d283#![r Xr)!!lqJ!d28!!J!#F!!!p'J!d2!`!!2rr)!!p8J!d1Q3!J2rr)!"&-!!d203!JIr Xr)!"&1`!d20!!J[rr)!"&4J!d2-`!Jrrr)!"&83!d2-J!K2rr)!"&A!!d2-3!J2r Xr)!"&C`!d2@3!JIrr!!"&dJ!d2(!!J[rr!!"'L3!d2'`!Jrrr!!"'e3!d2'J!K2r Xr!!"(K3!d2'3!J2rr!!"(r!!d2'!!KIrr!!")+J!d2&`!K[rr!!")p!!d2&J!Krr Xr!!"*LJ!d2&3!L2rr!!"+)3!d2&!!LIrr!!"+hJ!d2%`!b[rr!!",Q3!d2%J!brr Xr!!"-+!!d2%3!c2rr!!"-T!!d2%!!cIrr!!"0#`!d2$`!c[rr!!"0FJ!d2$J!crr Xr!!"0f3!d2$3!bIrr!!"13!!d2$!!d2rr!!"1VJ!d2#`!b2rr!!"2!`!d2#J!dIr Xr!!"2Q!!d2#3!J!$%&!"2q`!d24`!J3$-&!"3+`!d19`!!Irr)!"63J!d1l!!![r Xr)!"6%`!d1k`(6@9cFf&RC3C6G'&dGA-(4(9ZCf9[EJ40C@je"&4PH(3,4'PKCfj X[Fh4TBh-%6P9-6!41G@e`#99ZFfKTCR4PC!G6D'PQG'9N"APZ6Q&a!RPZ!hPZF34 XjEQ&a$90YB@aX)%GPG'aTEQ8'8(*[EA"d#%KKBfY'Efjd#P"65'&MDdC[ER3-8&0 X)B@0V4QpZG#!j#P"65'&MDdC[ER318(*PCL"'D@aP)%jKE@806@PcBbiJ8h4bD@j XRF`T89&NJ9fPZC'ph"fePER9LBA)(Fh9LE@9ZG30,BQ3%5'9XF!4*EQC["89aG@P X`!d&MG!90B@GTB`4#DA4c$'0[ER4bEf`JDf9jF`Y`G@jMG(9KG'P[EJKLFQ&MDf9 XdF`9K)#dJE39Z)#dJHJ9")#dJ6391)#dJ@J8`)#dJ13ChDATKFQ3(Bh9bFQ9ZG!4 X06P8M"90dBA*d1MB: END_OF_FILE if test 28405 -ne `wc -c <'sys/mac/NHrsrc.hqx'`; then echo shar: \"'sys/mac/NHrsrc.hqx'\" unpacked with wrong size! fi # end of 'sys/mac/NHrsrc.hqx' if test -f 'sys/unix/snd86unx.shr' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'sys/unix/snd86unx.shr'\" to \"'sys/unix/snd86unx.shr.orig'\" mv -f 'sys/unix/snd86unx.shr' 'sys/unix/snd86unx.shr.orig' fi echo shar: Extracting \"'sys/unix/snd86unx.shr'\" \(28922 characters\) sed "s/^X//" >'sys/unix/snd86unx.shr' <<'END_OF_FILE' X# This is a shell archive. Save it in a file, remove anything before X# this line, and then unpack it by entering "sh file". Note, it may X# create directories; files and directories will be owned by you and X# have default permissions. X# X# This archive contains: X# X# READ.ME X# install.bsd X# spkr.7 X# Makefile X# spkr.c X# spkr.h X# interp.c X# Files X# Install X# Master X# Name X# Node X# Remove X# Size X# System X# playtest X# Xecho x - READ.ME Xsed 's/^X//' >READ.ME << 'END-of-READ.ME' XX Console Speaker Driver Package (v1.1) XX XX by Eric S. Raymond (esr@snark.thyrsus.com) XX XXThis package gives 80386 machines running SVr3.2 or later the ability to play XXtunes on the console speaker. It has been extended to 386BSD (and possibly XXBSDI) by Andrew A. Chernov, and to SCO UNIX 3.2.4 (and possibly other VPIX XXsystems) by Andreas Arens. XX XXThe following files are contained in the kit: XX XXDocumentation and examples: XXREAD.ME -- this file XXspeaker.7 -- man page for the driver XXplaytest -- test script exercising familiar tunes XX XXInstallable driver kit parts, for SVr3.2 or later: XXFiles -- list of driver package file locations XXInstall -- installation script for driver kit XXMaster -- mdevice entry for speaker driver XXName -- name entry foe speaker driver XXNode -- /dev node specification file XXRemove -- Driver removal script XXSize -- installation size data XXSystem -- sdevice entry for speaker driver XX XXDriver source code, for SVr3.2 or later and 386BSD: XXMakefile -- Makefile for driver code XXspkr.c -- the driver source XXspeaker.h -- ioctl interface file XX XXCommon source code: XXinterp.c -- play string interpretation code XX XXFor SVr3.2 or later, simply type `make' and wait. Then type ./Install XXand follow its instructions. You will have to install the man pages by hand. XXBe aware that the speaker.7 man page uses tbl(1) constructs. XX XXFor 386BSD, follow the installation instructions in install.bsd. XX XXFor SCO UNIX 3.2.4, no new kernel drivers are needed, and you need only XXcopy interp.c to your src directory and proceed with making NetHack, with XXVPIX_MUSIC set in unixconf.h. XX XXInteresting tunes mailed to the author will be periodically posted in batches XXand added to the test script for future versions. XX XX Revision notes XX XX1.1 -- fixed minor bug in M[LSN] interpretation, added octave-tracking. XX Tweaked the playtest examples. XEND-of-READ.ME Xecho x - install.bsd Xsed 's/^X//' >install.bsd << 'END-of-install.bsd' XXCopy spkr.c and interp.c to /sys/i386/isa XXCopy spkr.h to /sys/sys XX XX----------------------------------------------------------------------------- XX XXFile /sys/i386/conf/YOUR_MACHINE_NAME XXadd following line: XX XXpseudo-device speaker XX XX----------------------------------------------------------------------------- XX XXFile /sys/i386/conf/files.i386 XXadd following line: XX XXi386/isa/spkr.c optional speaker XX XX----------------------------------------------------------------------------- XX XXFile /sys/i386/i386/conf.c XX[major number 20 (hex) is registered for spkr driver, don't change it] XXadd following code: XX XX#include "speaker.h" XX#if NSPEAKER > 0 XXint spkropen(),spkrclose(),spkrwrite(),spkrioctl(); XX#else XX#define spkropen enxio XX#define spkrclose enxio XX#define spkrwrite enxio XX#define spkrioctl enxio XX#endif XX ... XX XXstruct cdevsw cdevsw[] = XX{ XX ... XX XX { spkropen, spkrclose, enxio, spkrwrite, /*20*/ XX spkrioctl, enxio, enxio, NULL, XX enxio, enxio, enxio }, XX ... XX XX----------------------------------------------------------------------------- XX XXMake corresponding device: XX XX mknod /dev/speaker c 32 0 XX XX[major number 32 (20 hex) is registered for spkr driver, don't change it] XX XX----------------------------------------------------------------------------- XX XXGo to /sys/i386/conf and type XX config YOUR_MACHINE_NAME XXthen go to /sys/compile/YOUR_MACHINE_NAME and type XX make depend XX make XX XEND-of-install.bsd Xecho x - spkr.7 Xsed 's/^X//' >spkr.7 << 'END-of-spkr.7' XX.TH SPKR 7 XX.SH NAME XXspkr \- console speaker device driver XX.SH DESCRIPTION XXThe speaker device driver allows applications to control the PC console XXspeaker on an IBM-PC-compatible machine running UNIX. XX.PP XXOnly one process may have this device open at any given time; open() and XXclose() are used to lock and relinquish it. An attempt to open() when XXanother process has the device locked will return -1 with an EBUSY error XXindication. Writes to the device are interpreted as 'play strings' in a XXsimple ASCII melody notation. An ioctl() for tone generation at arbitrary XXfrequencies is also supported. XX.PP XXSound-generation does \fInot\fR monopolize the processor; in fact, the driver XXspends most of its time sleeping while the PC hardware is emitting XXtones. Other processes may emit beeps while the driver is running. XX.PP XXApplications may call ioctl() on a speaker file descriptor to control the XXspeaker driver directly; definitions for the ioctl() interface are in XXsys/spkr.h. The tone_t structure used in these calls has two fields, XXspecifying a frequency (in hz) and a duration (in 1/100ths of a second). XXA frequency of zero is interpreted as a rest. XX.PP XXAt present there are two such ioctls. SPKRTONE accepts a pointer to a XXsingle tone structure as third argument and plays it. SPKRTUNE accepts a XXpointer to the first of an array of tone structures and plays them in XXcontinuous sequence; this array must be terminated by a final member with XXa zero duration. XX.PP XXThe play-string language is modelled on the PLAY statement conventions of XXIBM BASIC 2.0. The MB, MF and X primitives of PLAY are not useful in a UNIX XXenvironment and are omitted. The `octave-tracking' feature is also new. XX.PP XXThere are 84 accessible notes numbered 1-83 in 7 octaves, each running from XXC to B, numbered 0-6; the scale is equal-tempered A440 and octave 3 starts XXwith middle C. By default, the play function emits half-second notes with the XXlast 1/16th second being `rest time'. XX.PP XXPlay strings are interpreted left to right as a series of play command groups; XXletter case is ignored. Play command groups are as follows: XX.PP XXCDEFGAB -- letters A through G cause the corresponding note to be played in the XXcurrent octave. A note letter may optionally be followed by an \fIaccidental XXsign\fR, one of # + or -; the first two of these cause it to be sharped one XXhalf-tone, the last causes it to be flatted one half-tone. It may also be XXfollowed by a time value number and by sustain dots (see below). Time values XXare interpreted as for the L command below;. XX.PP XXO -- if is numeric, this sets the current octave. may also be one XXof 'L' or 'N' to enable or disable octave-tracking (it is disabled by default). XXWhen octave-tracking is on, interpretation of a pair of letter notes will XXchange octaves if necessary in order to make the smallest possible jump between XXnotes. Thus "olbc" will be played as "olb>c", and "olcb" as "olc, < and O[0123456]. XX.PP XX> -- bump the current octave up one. XX.PP XX< -- drop the current octave down one. XX.PP XXN -- play note n, n being 1 to 84 or 0 for a rest of current time value. XXMay be followedv by sustain dots. XX.PP XXL -- sets the current time value for notes. The default is L4, quarter XXnotes. The lowest possible value is 1; values up to 64 are accepted. L1 sets XXwhole notes, L2 sets half notes, L4 sets quarter notes, etc.. XX.PP XXP -- pause (rest), with interpreted as for L. May be followed by XXsustain dots. May also be written '~'. XX.PP XXT -- Sets the number of quarter notes per minute; default is 120. Musical XXnames for common tempi are: XX XX.TS XXa a a. XX Tempo Beats Per Minute XXvery slow Larghissimo XX Largo 40-60 XX Larghetto 60-66 XX Grave XX Lento XX Adagio 66-76 XXslow Adagietto XX Andante 76-108 XXmedium Andantino XX Moderato 108-120 XXfast Allegretto XX Allegro 120-168 XX Vivace XX Veloce XX Presto 168-208 XXvery fast Prestissimo XX.TE XX.PP XXM[LNS] -- set articulation. MN (N for normal) is the default; the last 1/8th of XXthe note's value is rest time. You can set ML for legato (no rest space) or XXMS (staccato) 1/4 rest space. XX.PP XXNotes (that is, CDEFGAB or N command character groups) may be followed by XXsustain dots. Each dot causes the note's value to be lengthened by one-half XXfor each one. Thus, a note dotted once is held for 3/2 of its undotted value; XXdotted twice, it is held 9/4, and three times would give 27/8. XX.PP XXWhitespace in play strings is simply skipped and may be used to separate XXmelody sections. XX.SH BUGS XXDue to roundoff in the pitch tables and slop in the tone-generation and timer XXhardware (neither of which was designed for precision), neither pitch accuracy XXnor timings will be mathematically exact. There is no volume control. XX.PP XXIn play strings which are very long (longer than your system's physical I/O XXblocks) note suffixes or numbers may occasionally be parsed incorrectly due XXto crossing a block boundary. XX.SH FILES XX/dev/speaker -- speaker device file XX.SH AUTHOR XXEric S. Raymond (esr@snark.thyrsus.com) Feb 1990 XEND-of-spkr.7 Xecho x - Makefile Xsed 's/^X//' >Makefile << 'END-of-Makefile' XX# XX# Speaker driver package makefile XX# XXCFLAGS = -I. -O # -DDEBUG XXLDFLAGS = -s XX XXall: Driver.o XX XXinstall: XX ./Install XX XXDriver.o: spkr.c XX $(CC) $(CFLAGS) -c spkr.c XX mv spkr.o Driver.o XX XXclean: XX rm -f Driver.o *~ speaker.shar XX XXDSP = Files Install Master Name Node Remove Size System XXshar: XX shar READ.ME install.bsd spkr.7 Makefile spkr.[ch] \ XX interp.c $(DSP) playtest >speaker.shar XEND-of-Makefile Xecho x - spkr.c Xsed 's/^X//' >spkr.c << 'END-of-spkr.c' XX/* XX * spkr.c -- device driver for console speaker on 80386 XX * XX * v1.1 by Eric S. Raymond (esr@snark.thyrsus.com) Feb 1990 XX * modified for 386bsd by Andrew A. Chernov XX */ XX XX#ifdef __386BSD__ XX#include "speaker.h" XX#endif XX#if !defined(__386BSD__) || (NSPEAKER > 0) XX XX#ifdef __386BSD__ XX#include "types.h" XX#include "param.h" XX#include "errno.h" XX#include "buf.h" XX#include "uio.h" XX XX#define CADDR caddr_t XX#define err_ret(x) return(x) XX#else /* SYSV */ XX#include XX#include XX#include XX#include XX#include XX#include XX#include XX#include XX#include XX XX#define CADDR char * XX#define err_ret(x) u.u_error = (x) XX#endif XX XX#include "spkr.h" XX XX/**************** MACHINE DEPENDENT PART STARTS HERE ************************* XX * XX * This section defines a function tone() which causes a tone of given XX * frequency and duration from the 80x86's console speaker. XX * Another function endtone() is defined to force sound off, and there is XX * also a rest() entry point to do pauses. XX * XX * Audible sound is generated using the Programmable Interval Timer (PIT) and XX * Programmable Peripheral Interface (PPI) attached to the 80x86's speaker. The XX * PPI controls whether sound is passed through at all; the PIT's channel 2 is XX * used to generate clicks (a square wave) of whatever frequency is desired. XX * XX * The non-BSD code requires SVr3.2-compatible inb(), outb(), timeout(), XX * sleep(), and wakeup(). XX */ XX XX/* XX * PIT and PPI port addresses and control values XX * XX * Most of the magic is hidden in the TIMER_PREP value, which selects PIT XX * channel 2, frequency LSB first, square-wave mode and binary encoding. XX * The encoding is as follows: XX * XX * +----------+----------+---------------+-----+ XX * | 1 0 | 1 1 | 0 1 1 | 0 | XX * | SC1 SC0 | RW1 RW0 | M2 M1 M0 | BCD | XX * +----------+----------+---------------+-----+ XX * Counter Write Mode 3 Binary XX * Channel 2 LSB first, (Square Wave) Encoding XX * MSB second XX */ XX#define PPI 0x61 /* port of Programmable Peripheral Interface */ XX#define PPI_SPKR 0x03 /* turn these PPI bits on to pass sound */ XX#define PIT_CTRL 0x43 /* PIT control address */ XX#define PIT_COUNT 0x42 /* PIT count address */ XX#define PIT_MODE 0xB6 /* set timer mode for sound generation */ XX XX/* XX * Magic numbers for timer control. XX */ XX#define TIMER_CLK 1193180L /* corresponds to 18.2 MHz tick rate */ XX XXstatic int endtone() XX/* turn off the speaker, ending current tone */ XX{ XX wakeup((CADDR)endtone); XX outb(PPI, inb(PPI) & ~PPI_SPKR); XX} XX XXstatic void tone(hz, ticks) XX/* emit tone of frequency hz for given number of ticks */ XXunsigned int hz, ticks; XX{ XX unsigned int divisor = TIMER_CLK / hz; XX int sps; XX XX#ifdef DEBUG XX printf("tone: hz=%d ticks=%d\n", hz, ticks); XX#endif /* DEBUG */ XX XX /* set timer to generate clicks at given frequency in Hertz */ XX#ifdef __386BSD__ XX sps = spltty(); XX#else XX sps = spl5(); XX#endif XX outb(PIT_CTRL, PIT_MODE); /* prepare timer */ XX outb(PIT_COUNT, (unsigned char) divisor); /* send lo byte */ XX outb(PIT_COUNT, (divisor >> 8)); /* send hi byte */ XX splx(sps); XX XX /* turn the speaker on */ XX outb(PPI, inb(PPI) | PPI_SPKR); XX XX /* XX * Set timeout to endtone function, then give up the timeslice. XX * This is so other processes can execute while the tone is being XX * emitted. XX */ XX timeout((CADDR)endtone, (CADDR)NULL, ticks); XX sleep((CADDR)endtone, PZERO - 1); XX} XX XXstatic int endrest() XX/* end a rest */ XX{ XX wakeup((CADDR)endrest); XX} XX XXstatic void rest(ticks) XX/* rest for given number of ticks */ XXint ticks; XX{ XX /* XX * Set timeout to endrest function, then give up the timeslice. XX * This is so other processes can execute while the rest is being XX * waited out. XX */ XX#ifdef DEBUG XX printf("rest: %d\n", ticks); XX#endif /* DEBUG */ XX timeout((CADDR)endrest, (CADDR)NULL, ticks); XX sleep((CADDR)endrest, PZERO - 1); XX} XX XX#include "interp.c" /* playinit() and playstring() */ XX XX/******************* UNIX DRIVER HOOKS BEGIN HERE ************************** XX * XX * This section implements driver hooks to run playstring() and the tone(), XX * endtone(), and rest() functions defined above. For non-BSD systems, XX * SVr3.2-compatible copyin() is also required. XX */ XX XXstatic int spkr_active; /* exclusion flag */ XX#ifdef __386BSD__ XXstatic struct buf *spkr_inbuf; /* incoming buf */ XX#endif XX XXint spkropen(dev) XXdev_t dev; XX{ XX#ifdef DEBUG XX printf("spkropen: entering with dev = %x\n", dev); XX#endif /* DEBUG */ XX XX if (minor(dev) != 0) XX err_ret(ENXIO); XX else if (spkr_active) XX err_ret(EBUSY); XX else XX { XX playinit(); XX#ifdef __386BSD__ XX spkr_inbuf = geteblk(DEV_BSIZE); XX#endif XX spkr_active = 1; XX } XX#ifdef __386BSD__ XX return(0); XX#endif XX} XX XX#ifdef __386BSD__ XXint spkrwrite(dev, uio) XXstruct uio *uio; XX#else XXint spkrwrite(dev) XX#endif XXdev_t dev; XX{ XX#ifdef __386BSD__ XX register unsigned n; XX char *cp; XX int error; XX#endif XX#ifdef DEBUG XX#ifdef __386BSD__ XX printf("spkrwrite: entering with dev = %x, count = %d\n", XX dev, uio->uio_resid); XX#else XX printf("spkrwrite: entering with dev = %x, u.u_count = %d\n", XX dev, u.u_count); XX#endif XX#endif /* DEBUG */ XX XX if (minor(dev) != 0) XX err_ret(ENXIO); XX else XX { XX#ifdef __386BSD__ XX n = MIN(DEV_BSIZE, uio->uio_resid); XX cp = spkr_inbuf->b_un.b_addr; XX error = uiomove(cp, n, uio); XX if (!error) XX playstring(cp, n); XX return(error); XX#else XX char bfr[STD_BLK]; XX XX copyin(u.u_base, bfr, u.u_count); XX playstring(bfr, u.u_count); XX u.u_base += u.u_count; XX u.u_count = 0; XX#endif XX } XX} XX XXint spkrclose(dev) XXdev_t dev; XX{ XX#ifdef DEBUG XX printf("spkrclose: entering with dev = %x\n", dev); XX#endif /* DEBUG */ XX XX if (minor(dev) != 0) XX err_ret(ENXIO); XX else XX { XX endtone(); XX#ifdef __386BSD__ XX brelse(spkr_inbuf); XX#endif XX spkr_active = 0; XX } XX#ifdef __386BSD__ XX return(0); XX#endif XX} XX XXint spkrioctl(dev, cmd, cmdarg) XXdev_t dev; XXint cmd; XXCADDR cmdarg; XX{ XX#ifdef DEBUG XX printf("spkrioctl: entering with dev = %x, cmd = %x\n", dev, cmd); XX#endif /* DEBUG */ XX XX if (minor(dev) != 0) XX err_ret(ENXIO); XX else if (cmd == SPKRTONE) XX { XX tone_t *tp = (tone_t *)cmdarg; XX XX if (tp->frequency == 0) XX rest(tp->duration); XX else XX tone(tp->frequency, tp->duration); XX } XX else if (cmd == SPKRTUNE) XX { XX#ifdef __386BSD__ XX tone_t *tp = (tone_t *)(*(caddr_t *)cmdarg); XX tone_t ttp; XX int error; XX XX for (; ; tp++) { XX error = copyin(tp, &ttp, sizeof(tone_t)); XX if (error) XX return(error); XX if (ttp.duration == 0) XX break; XX if (ttp.frequency == 0) XX rest(ttp.duration); XX else XX tone(ttp.frequency, ttp.duration); XX } XX#else XX tone_t *tp = (tone_t *)cmdarg; XX XX for (; tp->duration; tp++) XX if (tp->frequency == 0) XX rest(tp->duration); XX else XX tone(tp->frequency, tp->duration); XX#endif XX } XX else XX err_ret(EINVAL); XX#ifdef __386BSD__ XX return(0); XX#endif XX} XX XX#endif /* !defined(__386BSD__) || (NSPEAKER > 0) */ XX/* spkr.c ends here */ XEND-of-spkr.c Xecho x - spkr.h Xsed 's/^X//' >spkr.h << 'END-of-spkr.h' XX/* XX * spkr.h -- interface definitions for speaker ioctl() XX * XX * v1.1 by Eric S. Raymond (esr@snark.thyrsus.com) Feb 1990 XX * modified for 386bsd by Andrew A. Chernov XX */ XX XX#ifndef _SPKR_H_ XX#define _SPKR_H_ XX XX#ifdef __386BSD__ XX#ifndef KERNEL XX#include XX#else XX#include "ioctl.h" XX#endif XX XX#define SPKRTONE _IOW('S', 1, tone_t) /* emit tone */ XX#define SPKRTUNE _IO('S', 2) /* emit tone sequence*/ XX#else /* SYSV */ XX#define SPKRIOC ('S'<<8) XX#define SPKRTONE (SPKRIOC|1) /* emit tone */ XX#define SPKRTUNE (SPKRIOC|2) /* emit tone sequence*/ XX#endif XX XXtypedef struct XX{ XX int frequency; /* in hertz */ XX int duration; /* in 1/100ths of a second */ XX} XXtone_t; XX XX#endif /* _SPKR_H_ */ XX/* spkr.h ends here */ XEND-of-spkr.h Xecho x - interp.c Xsed 's/^X//' >interp.c << 'END-of-interp.c' XX/* XX * interp.c -- device driver for console speaker on 80386 XX * XX * v1.1 by Eric S. Raymond (esr@snark.thyrsus.com) Feb 1990 XX * XX * this is the part of the code common to all 386 UNIX OSes XX * XX * playinit() and playstring() are called from the appropriate driver XX */ XX XX#ifdef __386BSD__ XX#include "param.h" XX#else XX#include XX#endif XX XX#ifndef HZ XX#define HZ 60 XX#endif XX XX XX/**************** PLAY STRING INTERPRETER BEGINS HERE ********************** XX * XX * Play string interpretation is modelled on IBM BASIC 2.0's PLAY statement; XX * M[LNS] are missing and the ~ synonym and octave-tracking facility is added. XX * Requires tone(), rest(), and endtone(). String play is not interruptible XX * except possibly at physical block boundaries. XX */ XX XXtypedef int bool; XX#define TRUE 1 XX#define FALSE 0 XX XX#define toupper(c) ((c) - ' ' * (((c) >= 'a') && ((c) <= 'z'))) XX#define isdigit(c) (((c) >= '0') && ((c) <= '9')) XX#define dtoi(c) ((c) - '0') XX XXstatic int octave; /* currently selected octave */ XXstatic int whole; /* whole-note time at current tempo, in ticks */ XXstatic int value; /* whole divisor for note time, quarter note = 1 */ XXstatic int fill; /* controls spacing of notes */ XXstatic bool octtrack; /* octave-tracking on? */ XXstatic bool octprefix; /* override current octave-tracking state? */ XX XX/* XX * Magic number avoidance... XX */ XX#define SECS_PER_MIN 60 /* seconds per minute */ XX#define WHOLE_NOTE 4 /* quarter notes per whole note */ XX#define MIN_VALUE 64 /* the most we can divide a note by */ XX#define DFLT_VALUE 4 /* default value (quarter-note) */ XX#define FILLTIME 8 /* for articulation, break note in parts */ XX#define STACCATO 6 /* 6/8 = 3/4 of note is filled */ XX#define NORMAL 7 /* 7/8ths of note interval is filled */ XX#define LEGATO 8 /* all of note interval is filled */ XX#define DFLT_OCTAVE 4 /* default octave */ XX#define MIN_TEMPO 32 /* minimum tempo */ XX#define DFLT_TEMPO 120 /* default tempo */ XX#define MAX_TEMPO 255 /* max tempo */ XX#define NUM_MULT 3 /* numerator of dot multiplier */ XX#define DENOM_MULT 2 /* denominator of dot multiplier */ XX XX/* letter to half-tone: A B C D E F G */ XXstatic int notetab[8] = {9, 11, 0, 2, 4, 5, 7}; XX XX/* XX * This is the American Standard A440 Equal-Tempered scale with frequencies XX * rounded to nearest integer. Thank Goddess for the good ol' CRC Handbook... XX * our octave 0 is standard octave 2. XX */ XX#define OCTAVE_NOTES 12 /* semitones per octave */ XXstatic int pitchtab[] = XX{ XX/* C C# D D# E F F# G G# A A# B*/ XX/* 0 */ 65, 69, 73, 78, 82, 87, 93, 98, 103, 110, 117, 123, XX/* 1 */ 131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247, XX/* 2 */ 262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494, XX/* 3 */ 523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988, XX/* 4 */ 1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1975, XX/* 5 */ 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951, XX/* 6 */ 4186, 4435, 4698, 4978, 5274, 5588, 5920, 6272, 6644, 7040, 7459, 7902, XX}; XX XXstatic void playinit() XX{ XX octave = DFLT_OCTAVE; XX whole = (HZ * SECS_PER_MIN * WHOLE_NOTE) / DFLT_TEMPO; XX fill = NORMAL; XX value = DFLT_VALUE; XX octtrack = FALSE; XX octprefix = TRUE; /* act as though there was an initial O(n) */ XX} XX XXstatic void playtone(pitch, value, sustain) XX/* play tone of proper duration for current rhythm signature */ XXint pitch, value, sustain; XX{ XX register int sound, silence, snum = 1, sdenom = 1; XX XX /* this weirdness avoids floating-point arithmetic */ XX for (; sustain; sustain--) XX { XX snum *= NUM_MULT; XX sdenom *= DENOM_MULT; XX } XX XX if (pitch == -1) XX rest(whole * snum / (value * sdenom)); XX else XX { XX sound = (whole * snum) / (value * sdenom) XX - (whole * (FILLTIME - fill)) / (value * FILLTIME); XX silence = whole * (FILLTIME-fill) * snum / (FILLTIME * value * sdenom); XX XX#ifdef DEBUG XX printf("playtone: pitch %d for %d ticks, rest for %d ticks\n", XX pitch, sound, silence); XX#endif /* DEBUG */ XX XX tone(pitchtab[pitch], sound); XX if (fill != LEGATO) XX rest(silence); XX } XX} XX XXstatic int abs(n) XXint n; XX{ XX if (n < 0) XX return(-n); XX else XX return(n); XX} XX XXstatic void playstring(cp, slen) XX/* interpret and play an item from a notation string */ XXchar *cp; XXsize_t slen; XX{ XX int pitch, lastpitch = OCTAVE_NOTES * DFLT_OCTAVE; XX XX#define GETNUM(cp, v) for(v=0; isdigit(cp[1]) && slen > 0; ) \ XX {v = v * 10 + (*++cp - '0'); slen--;} XX for (; slen--; cp++) XX { XX int sustain, timeval, tempo; XX register char c = toupper(*cp); XX XX#ifdef DEBUG XX printf("playstring: %c (%x)\n", c, c); XX#endif /* DEBUG */ XX XX switch (c) XX { XX case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': XX XX /* compute pitch */ XX pitch = notetab[c - 'A'] + octave * OCTAVE_NOTES; XX XX /* this may be followed by an accidental sign */ XX if (cp[1] == '#' || cp[1] == '+') XX { XX ++pitch; XX ++cp; XX slen--; XX } XX else if (cp[1] == '-') XX { XX --pitch; XX ++cp; XX slen--; XX } XX XX /* XX * If octave-tracking mode is on, and there has been no octave- XX * setting prefix, find the version of the current letter note XX * closest to the last regardless of octave. XX */ XX if (octtrack && !octprefix) XX { XX if (abs(pitch-lastpitch) > abs(pitch+OCTAVE_NOTES-lastpitch)) XX { XX ++octave; XX pitch += OCTAVE_NOTES; XX } XX XX if (abs(pitch-lastpitch) > abs((pitch-OCTAVE_NOTES)-lastpitch)) XX { XX --octave; XX pitch -= OCTAVE_NOTES; XX } XX } XX octprefix = FALSE; XX lastpitch = pitch; XX XX /* ...which may in turn be followed by an override time value */ XX GETNUM(cp, timeval); XX if (timeval <= 0 || timeval > MIN_VALUE) XX timeval = value; XX XX /* ...and/or sustain dots */ XX for (sustain = 0; cp[1] == '.'; cp++) XX { XX slen--; XX sustain++; XX } XX XX /* time to emit the actual tone */ XX playtone(pitch, timeval, sustain); XX break; XX XX case 'O': XX if (cp[1] == 'N' || cp[1] == 'n') XX { XX octprefix = octtrack = FALSE; XX ++cp; XX slen--; XX } XX else if (cp[1] == 'L' || cp[1] == 'l') XX { XX octtrack = TRUE; XX ++cp; XX slen--; XX } XX else XX { XX GETNUM(cp, octave); XX if (octave >= sizeof(pitchtab) / OCTAVE_NOTES) XX octave = DFLT_OCTAVE; XX octprefix = TRUE; XX } XX break; XX XX case '>': XX if (octave < sizeof(pitchtab) / OCTAVE_NOTES - 1) XX octave++; XX octprefix = TRUE; XX break; XX XX case '<': XX if (octave > 0) XX octave--; XX octprefix = TRUE; XX break; XX XX case 'N': XX GETNUM(cp, pitch); XX for (sustain = 0; cp[1] == '.'; cp++) XX { XX slen--; XX sustain++; XX } XX playtone(pitch - 1, value, sustain); XX break; XX XX case 'L': XX GETNUM(cp, value); XX if (value <= 0 || value > MIN_VALUE) XX value = DFLT_VALUE; XX break; XX XX case 'P': XX case '~': XX /* this may be followed by an override time value */ XX GETNUM(cp, timeval); XX if (timeval <= 0 || timeval > MIN_VALUE) XX timeval = value; XX for (sustain = 0; cp[1] == '.'; cp++) XX { XX slen--; XX sustain++; XX } XX playtone(-1, timeval, sustain); XX break; XX XX case 'T': XX GETNUM(cp, tempo); XX if (tempo < MIN_TEMPO || tempo > MAX_TEMPO) XX tempo = DFLT_TEMPO; XX whole = (HZ * SECS_PER_MIN * WHOLE_NOTE) / tempo; XX break; XX XX case 'M': XX if (cp[1] == 'N' || cp[1] == 'n') XX { XX fill = NORMAL; XX ++cp; XX slen--; XX } XX else if (cp[1] == 'L' || cp[1] == 'l') XX { XX fill = LEGATO; XX ++cp; XX slen--; XX } XX else if (cp[1] == 'S' || cp[1] == 's') XX { XX fill = STACCATO; XX ++cp; XX slen--; XX } XX break; XX } XX } XX} XEND-of-interp.c Xecho x - Files Xsed 's/^X//' >Files << 'END-of-Files' XX/usr/include/sys/spkr.h XEND-of-Files Xecho x - Install Xsed 's/^X//' >Install << 'END-of-Install' XX# XX# Speaker driver installation script XX# XXTMP=/tmp/speaker.err XXERR1=" Errors have been written to the file $TMP." XXERR2=" The Speaker Driver software was not installed." XX XXecho "Installing Speaker Driver Software Package" XX XX/etc/conf/bin/idcheck -p speaker 2>$TMP XXif [ $? != 0 ] XXthen XX echo "The speaker package is already at least partly installed. XX Removing the old version now..." XX /etc/conf/bin/idinstall -d speaker XXfi XX XX/etc/conf/bin/idinstall -a -k speaker 2>>$TMP XXif [ $? != 0 ] XXthen XX message "There was an error during package installation. $ERR1 $ERR2" XX exit 1 XXfi XX XX/etc/conf/bin/idbuild 2>>$TMP XXif [ $? != 0 ] XXthen XX message "There was an error during kernel reconfiguration. $ERR1 $ERR2" XX exit 1 XXfi XX XXrm -f $TMP XX XXcp spkr.h /usr/include/sys/spkr.h XX XXecho "Performing shutdown..." XXcd /; exec /etc/shutdown -g0 -y XEND-of-Install Xecho x - Master Xsed 's/^X//' >Master << 'END-of-Master' XXspeaker ocwi iocH spkr 0 0 1 1 -1 XEND-of-Master Xecho x - Name Xsed 's/^X//' >Name << 'END-of-Name' XX386 UNIX Speaker Device Driver Package XEND-of-Name Xecho x - Node Xsed 's/^X//' >Node << 'END-of-Node' XXspeaker speaker c 0 XEND-of-Node Xecho x - Remove Xsed 's/^X//' >Remove << 'END-of-Remove' XX# XX# Speaker driver remove script XX# XXTMP=/tmp/speaker.err XXRERR="Errors have been written to the file $TMP." XX XXecho "Removing Speaker Driver Software Package" XX XX/etc/conf/bin/idinstall -d speaker 2>$TMP XXif [ $? != 0 ] XXthen XX message "There was an error during package removal. $RERR" XX exit 1 XXfi XX XX/etc/conf/bin/idbuild 2>>$TMP XXif [ $? != 0 ] XXthen XX message "There was an error during kernel reconfiguration. $RERR" XX exit 1 XXfi XX XXrm -f /dev/speaker $TMP /usr/include/sys/spkr.h XX XXexit 0 XEND-of-Remove Xecho x - Size Xsed 's/^X//' >Size << 'END-of-Size' XXROOT=1400 XXUSR=100 XEND-of-Size Xecho x - System Xsed 's/^X//' >System << 'END-of-System' XXspeaker Y 1 0 0 0 0 0 0 0 XEND-of-System Xecho x - playtest Xsed 's/^X//' >playtest << 'END-of-playtest' XX: XX# Test script for the speaker driver XX# XX# v1.0 by Eric S. Raymond (Feb 1990) XX# modified for 386bsd by Andrew A. Chernov XX# XXreveille="t255l8c.f.afc~c.f.afc~c.f.afc.f.a..f.~c.f.afc~c.f.afc~c.f.afc~c.f.." XXcontact="f" XXdance="t240dcdc/dev/speaker;; XXcontact) echo $contact >/dev/speaker;; XXdance) echo $dance >/dev/speaker;; XXloony) echo $loony >/dev/speaker;; XX*) XX echo "No such tune. Available tunes are:" XX echo XX echo "reveille -- Reveille" XX echo "contact -- Contact theme from Close Encounters" XX echo "dance -- Lord of the Dance (aka Simple Gifts)" XX echo "loony -- Loony Toons theme" XX ;; XXesac XEND-of-playtest Xexit END_OF_FILE if test 28922 -ne `wc -c <'sys/unix/snd86unx.shr'`; then echo shar: \"'sys/unix/snd86unx.shr'\" unpacked with wrong size! fi # end of 'sys/unix/snd86unx.shr' echo shar: End of archive 17 \(of 18\). cp /dev/null ark17isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 18 archives. echo "Now execute ./patchit3.sh" rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0