84~ DTKVAX.SAV DTKVAX.SAV$BACKUP *.* [-]DTKVAX.SAV/SAV/LOG/VER DIETER  )KV6.2 _HELENA::  _DSA2012: V6.2 ~ *[DIETER.DTKVAX]DESCRIP.MMS;1+,>J./ ) 4P->A0123KPWO56*7@ ! ! Valid targets are:+ ! LIB - build SMGLIB.L32 and SMGTPALIB.L32. ! TRM - build TERMTABLE.EXE and SMGBLDTRM.EXE ! SHR - build SMGSHR.EXE ! DTK - build DTKSHR.EXE ! ALL - build all of the above& ! KIT - build SMG$ kit in SYS$SCREEN: !0 ! All files are built in $(RTLIN) and $(RTLML) !ALL : LIB, SHR, TRM, DTK/LIB : $(RTLML)SMGLIB.L32, $(RTLML)SMGTPALIB.L32TRM : $(RTLML)TERMTABLE.EXEDTK : $(RTLML)DTKSHR.EXESHR : $(RTLML)SMGSHR.EXE4KIT : $(RTLML)SMGSHR.EXE, $(RTLML)TERMTABLE.EXE, -4 $(RTLML)SMGBLDTRM.EXE, $(RTLML)SMGTERMS.TXT, -= $(KIT)SMG$(VERS).RELEASE_NOTES, $(KIT)KITINSTAL.COM, -/ $(KIT)BLDSMGKIT.COM, $(KIT)BLDSMGKIT.DAT Set Default $(KIT)< Copy/NoLog $(RTLML)smgshr.exe,$(RTLML)smgbldtrm.exe $(KIT)> Copy/NoLog $(RTLML)termtable.exe,$(RTLML)smgterms.txt $(KIT)< Copy/NoLog $(RTLML)smgdef.sdi,$(RTLML)smgtrmptr.sdi $(KIT)> Copy/NoLog $(RTLML)smg$routines.sdi,$(RTLML)smgmsg.sdi $(KIT) @bldsmgkit $(KIT) Set Prot:wo:re smg$(VERS).%/log: Delete/NoLog smgdef.sdi.,smgtrmptr.sdi.,smg$routines.sdi.C Delete/NoLog smgshr.exe.,termtable.exe.,smgbldtrm.exe.,smgmsg.sdi.H Delete/NoLog bldsmgkit.com.,bldsmgkit.dat.,kitinstal.com.,smgterms.txt.5$(KIT)SMG$(VERS).RELEASE_NOTES : $(KIT)SMG$(VERS).RNO" $(runoff) $(rflags) $(mms$source)!+>! Build the bliss library to compile the SMG$ sources against.!-B$(RTLML)SMGLIB.L32 : $(RTLIN)SMGLIB.REQ, $(RTLIN)SMGLNK.REQ, -7 $(RTLIN)SMGTERM.REQ, $(RTLIN)SMGDATSTR.REQ, -6 $(RTLIN)SMGMACROS.REQ, $(RTLIN)SMGPROLOG.REQ, -4 $(RTLML)SMGKTH.R32, $(RTLML)SMGKQB.R32, -4 $(RTLML)SMGKCB.R32, $(RTLML)SMGDEF.R32, -6 $(RTLML)SMGKDE.R32, $(RTLML)SMGTRMPTR.R32, -6 $(RTLML)SMGDEF.SDI, $(RTLML)SMGTRMPTR.SDI, -6 $(RTLML)SMGMSG.SDI, $(RTLML)SMG$ROUTINES.SDI-$(RTLML)SMGTRMPTR.R32 : $(RTLIN)SMGTRMPTR.SDL: Sdl/Vms/Lang=(Bliss=$(mms$target))$(lstflg) $(mms$source)'$(RTLML)SMGDEF.R32 : $(RTLIN)SMGDEF.SDL: Sdl/Vms/Lang=(Bliss=$(mms$target))$(lstflg) $(mms$source)'$(RTLML)SMGKCB.R32 : $(RTLIN)SMGKCB.SDL'$(RTLML)SMGKDE.R32 : $(RTLIN)SMGKDE.SDL'$(RTLML)SMGKTH.R32 : $(RTLIN)SMGKTH.SDL'$(RTLML)SMGKQB.R32 : $(RTLIN)SMGKQB.SDL'$(RTLIN)SMGMSG.SDL : $(RTLIN)SMGMSG.MSG: Message/Sdl=$(mms$target)/NoObject$(lstflg) $(mms$source)!+'! Build the files needed for STARLETSD.!-3$(RTLML)SMG$ROUTINES.SDI : $(RTLIN)SMG$ROUTINES.SDL.$(RTLML)SMGTRMPTR.SDI : $(RTLIN)SMGTRMPTR.SDL)$(RTLML)SMGDEF.SDI : $(RTLIN)SMGDEF.SDL)$(RTLML)SMGMSG.SDI : $(RTLIN)SMGMSG.SDL!+H! Build the Bliss Library to build the foreign terminal sources against.!-G$(RTLML)SMGTPALIB.L32 : $(RTLIN)SMGTPALIB.REQ, $(RTLIN)SMGTPACTL.REQ, -/ $(RTLIN)SMGTABDEF.REQ, $(RTLIN)SMGTRMMAC.REQ!+3! Build the foreign terminal file and its compiler.!-0$(RTLML)TERMTABLE.EXE : $(RTLML)SMGBLDTRM.EXE, - $(RTLML)TERMTABLE.TXT, - $(RTLML)SMGTERMS.TXT# Define termtable $(RTLML)termtable Set Default $(RTLML) Run $(RTLML)smgbldtrmG$(RTLML)SMGBLDTRM.EXE : $(RTLML)SMGBLDTRM.OBJ, $(RTLML)SMGBOOTAB.OBJ, -2 $(RTLML)SMGNUMTAB.OBJ, $(RTLML)SMGSTRTAB.OBJ, -3 $(RTLML)SMGSTATAB.OBJ, $(RTLML)SMGSTR2TAB.OBJ, - $(SMG)TERMDEFS.OBJ( $(link) $(linkflags) $(mms$source_list)-$(RTLML)SMGBLDTRM.OBJ : $(RTLIN)SMGBLDTRM.B32-$(RTLML)SMGBOOTAB.OBJ : $(RTLIN)SMGBOOTAB.B32-$(RTLML)SMGNUMTAB.OBJ : $(RTLIN)SMGNUMTAB.B32/$(RTLML)SMGSTR2TAB.OBJ : $(RTLIN)SMGSTR2TAB.B32-$(RTLML)SMGSTRTAB.OBJ : $(RTLIN)SMGSTRTAB.B32-$(RTLML)SMGSTATAB.OBJ : $(RTLIN)SMGSTATAB.B32!+,! Build the DTK$ sharable image - DTKSHR.EXE!-D$(RTLML)DTKSHR.EXE : $(RTLIN)DTKSHRLNK.OPT, $(RTLIN)DTKPROLOG.REQ, -6 $(RTLIN)DTKDATSTR.REQ, $(RTLIN)DTKMACROS.REQ, - $(RTLIN)DTKSHRVEC.DAT, -6 $(RTLML)DTKDEF.R32, $(RTLML)DTKDEF.SDI, -6 $(RTLML)DTK$ROUTINES.SDI, $(RTLML)DTKMSG.SDI, - $(RTLML)DTKRTL.OLB( -" DTK$UTIL=$(RTLML)DTKUTIL.OBJ, -# DTK$MSGDEF=$(RTLML)DTKMSG.OBJ, -% DTK$VECTOR=$(RTLML)DTKVECTOR.OBJ - ) Define lib$ $(RTLML)> $(link) $(linkflags)/Share/NoSyslib $(RTLIN)dtkshrlnk.opt/opt- Vec $(RTLML)dtkshr.exe $(RTLIN)dtkshrvec.dat*$(RTLML)DTKDEF.R32 : $(RTLIN)DTKDEF.SDL: Sdl/Vms/Lang=(Bliss=$(mms$target))$(lstflg) $(mms$source)-$(RTLML)DTKVECTOR.OBJ : $(RTLIN)DTKVECTOR.MAR+$(RTLML)DTKUTIL.OBJ : $(RTLIN)DTKUTIL.B32*$(RTLML)DTKMSG.OBJ : $(RTLIN)DTKMSG.MSG*$(RTLIN)DTKMSG.SDL : $(RTLIN)DTKMSG.MSG: Message/Sdl=$(mms$target)/NoObject$(lstflg) $(mms$source)!+'! Build the files needed for STARLETSD.!-3$(RTLML)DTK$ROUTINES.SDI : $(RTLIN)DTK$ROUTINES.SDL-$(RTLML)DTKDEF.SDI : $(RTLIN)DTKDEF.SDL($(RTLML)DTKMSG.SDI : $(RTLIN)DTKMSG.SDL!+,! Build the SMG$ sharable image - SMGSHR.EXE!-D$(RTLML)SMGSHR.EXE : $(RTLIN)SMGSHRLNK.OPT, $(RTLIN)SMGPROLOG.REQ, - $(RTLIN)SMGSHRVEC.DAT, - $(RTLML)SMGRTL.OLB( -, SMG$ALLOW_ESCAPE=$(RTLML)SMGALLESC.OBJ, -0 SMG$BUILD_TERM_TABLE=$(RTLML)SMGBLDTRM.OBJ, -. SMG$BOOLEAN_TABLES=$(RTLML)SMGBOOTAB.OBJ, -. SMG$$AB_DEFKEY_CLD=$(RTLML)SMGDEFKEY.OBJ, -. SMG$DISPLAY_CHANGE=$(RTLML)SMGDISCHA.OBJ, -, SMG$DISPLAY_DHDW=$(RTLML)SMGDISDHW.OBJ, -, SMG$DISPLAY_DRAW=$(RTLML)SMGDISDRW.OBJ, -, SMG$DISPLAY_HELP=$(RTLML)SMGDISHLP.OBJ, -2 SMG$DISPLAY_SUBPROCESS=$(RTLML)SMGDISSUB.OBJ, -& SMG$SELECT=$(RTLML)SMGSELECT.OBJ, -& SMG$WINDOW=$(RTLML)SMGWINDOW.OBJ, -. SMG$$DISPLAY_INPUT=$(RTLML)SMGDISINP.OBJ, -- SMG$DISPLAY_LINKS=$(RTLML)SMGDISLIN.OBJ, -. SMG$DISPLAY_OUTPUT=$(RTLML)SMGDISOUT.OBJ, -, SMG$DISPLAY_USER=$(RTLML)SMGDISUSR.OBJ, -$ SMG$INPUT=$(RTLML)SMGINPUT.OBJ, -& SMG$KEYPAD=$(RTLML)SMGKEYPAD.OBJ, -) SMG$$KEY_UTIL=$(RTLML)SMGKEYUTI.OBJ, -. SMG$MAP_TERM_TABLE=$(RTLML)SMGMAPTRM.OBJ, - SMG$MIN=$(RTLML)SMGMIN.OBJ, -/ SMG$$MINIMUM_UPDATE=$(RTLML)SMGMINUPD.OBJ, -" SMG$MISC=$(RTLML)SMGMISC.OBJ, -# SMG$MSGDEF=$(RTLML)SMGMSG.OBJ, -2 SMG$$NUMBER_PARAMETERS=$(RTLML)SMGNUMPAR.OBJ, -. SMG$NUMERIC_TABLES=$(RTLML)SMGNUMTAB.OBJ, -' SMG$$PRVINP=$(RTLML)SMGPRVINP.OBJ, -; SMG$PUT_VIRTUAL_DISPLAY_ENCODED=$(RTLML)SMGPUTENC.OBJ, -3 SMG$$PUT_TEXT_TO_BUFFER=$(RTLML)SMGPUTTEX.OBJ, -, SMG$$SCROLL_AREA=$(RTLML)SMGSCROLL.OBJ, -) SMG$$SIM_TERM=$(RTLML)SMGSIMTRM.OBJ, -0 SMG$STATEMENT_TABLES=$(RTLML)SMGSTATAB.OBJ, -- SMG$STRING_TABLES=$(RTLML)SMGSTRTAB.OBJ, -/ SMG$STRING2_TABLES=$(RTLML)SMGSTR2TAB.OBJ, -4 SMG$INTERFACE_TERM_TABLE=$(RTLML)SMGUSRTRM.OBJ, -% SMG$VECTOR=$(RTLML)SMGVECTOR.OBJ - ) Define lib$ $(RTLML)> $(link) $(linkflags)/Share/Nosyslib $(RTLIN)smgshrlnk.opt/opt- Vec $(RTLML)smgshr.exe $(RTLIN)smgshrvec.dat-$(RTLML)SMGALLESC.OBJ : $(RTLIN)SMGALLESC.B32-$(RTLML)SMGBLDTRM.OBJ : $(RTLIN)SMGBLDTRM.B32.$(RTLML)SMGBOOTAB.OBJ : $(RTLIN)SMGBOOTAB.B32 -$(RTLML)SMGDEFKEY.OBJ : $(RTLIN)SMGDEFKEY.CLD-$(RTLML)SMGDISCHA.OBJ : $(RTLIN)SMGDISCHA.B32-$(RTLML)SMGDISDHW.OBJ : $(RTLIN)SMGDISDHW.B32-$(RTLML)SMGDISDRW.OBJ : $(RTLIN)SMGDISDRW.B32-$(RTLML)SMGDISHLP.OBJ : $(RTLIN)SMGDISHLP.B32-$(RTLML)SMGDISINP.OBJ : $(RTLIN)SMGDISINP.B32-$(RTLML)SMGDISLIN.OBJ : $(RTLIN)SMGDISLIN.B32-$(RTLML)SMGDISOUT.OBJ : $(RTLIN)SMGDISOUT.B32-$(RTLML)SMGDISSUB.OBJ : $(RTLIN)SMGDISSUB.B32-$(RTLML)SMGDISUSR.OBJ : $(RTLIN)SMGDISUSR.B32,$(RTLML)SMGINPUT.OBJ : $(RTLIN)SMGINPUT.B32-$(RTLML)SMGKEYPAD.OBJ : $(RTLIN)SMGKEYPAD.B32-$(RTLML)SMGKEYUTI.OBJ : $(RTLIN)SMGKEYUTI.MAR-$(RTLML)SMGMAPTRM.OBJ : $(RTLIN)SMGMAPTRM.B32*$(RTLML)SMGMIN.OBJ : $(RTLIN)SMGMIN.B32-$(RTLML)SMGMINUPD.OBJ : $(RTLIN)SMGMINUPD.B32+$(RTLML)SMGMISC.OBJ : $(RTLIN)SMGMISC.B32*$(RTLML)SMGMSG.OBJ : $(RTLIN)SMGMSG.MSG-$(RTLML)SMGNUMPAR.OBJ : $(RTLIN)SMGNUMPAR.B32-$(RTLML)SMGNUMTAB.OBJ : $(RTLIN)SMGNUMTAB.B32-$(RTLML)SMGPRVINP.OBJ : $(RTLIN)SMGPRVINP.B32E-$(RTLML)SMGPUTENC.OBJ : $(RTLIN)SMGPUTENC.B32T-$(RTLML)SMGPUTTEX.OBJ : $(RTLIN)SMGPUTTEX.B32S-$(RTLML)SMGSCREEN.OBJ : $(RTLIN)SMGSCREEN.B32=-$(RTLML)SMGSCRINP.OBJ : $(RTLIN)SMGSCRINP.B32=-$(RTLML)SMGSCRMIS.OBJ : $(RTLIN)SMGSCRMIS.B32e-$(RTLML)SMGSCROLL.OBJ : $(RTLIN)SMGSCROLL.B32s-$(RTLML)SMGSELECT.OBJ : $(RTLIN)SMGSELECT.B32=0$(RTLML)SMGSIMTRM.OBJ : $(RTLIN)SMGSIMTRM.B32, - $(RTLIN)SMGSCRMAC.REQ, -e $(RTLIN)SMGSCRTCB.REQ, - $(RTLIN)SMGTRMSTR.R32-$(RTLML)SMGSTATAB.OBJ : $(RTLIN)SMGSTATAB.B32e/$(RTLML)SMGSTR2TAB.OBJ : $(RTLIN)SMGSTR2TAB.B32m-$(RTLML)SMGSTRTAB.OBJ : $(RTLIN)SMGSTRTAB.B32A-$(RTLML)SMGUSRTRM.OBJ : $(RTLIN)SMGUSRTRM.B32_-$(RTLML)SMGWINDOW.OBJ : $(RTLIN)SMGWINDOW.B32n-$(RTLML)SMGVECTOR.OBJ : $(RTLIN)SMGVECTOR.MAR /Opt:Level:3/Object=$(mms$target_name)$(traceflg)$(lstflg)$(dbgflg)"RFLAGS = /Output=$(mms$target)5LINKFLAGS = /Exec=$(mms$target)$(traceflg)$(mapflag)2SDLFLAGS = /Lang=(BlissF=$(mms$target))$(lstflg)*SDIFLAGS = /Parse=$(mms$target)$(lstflg)!*[DIETER.DTKVAX]DTK$ROUTINES.SDL;1+,>o./ ) 4c->A0123KPWO56,F7 \.S89tKG )HJ:MODULE dtk$routines;M/****************************************************************************/* *1/* COPYRIGHT (c) 1988 BY *A/* DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS. *#/* ALL RIGHTS RESERVED. */* *M/* THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED *M/* ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE *M/* INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER *M/* COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY *N/* OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY * #/* TRANSFERRED. */* *M/* THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE *M/* AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT */* CORPORATION. */* *M/* DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS *B/* SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. */* */* *M/****************************************************************************/* DTK$ANSWER_PHONE/* '/* Wait for Phone to Ring and Answer/* 4/* The Wait for Phone to Ring and Answer routine A/* waits for the phone connected to the DECtalk device to ring/* and then answers it. /* :ENTRY dtk$answer_phone ALIAS $dtk_answer_phone PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE,. LONGWORD NAMED number_of_rings IN OPTIONAL+ TYPENAME longword_signed REFERENCE,1 CHARACTER RTL_STR_DESC NAMED text IN OPTIONAL TYPENAME char_string,& LONGWORD NAMED timeout IN OPTIONAL, TYPENAME longword_signed REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$CHECK_HDWR_STATUS/* /* Check Hardware Status/* P/* The Check Hardware Status routine checks the DECtalk hardware for hardware/* malfunctions. /* DENTRY dtk$check_hdwr_status ALIAS $dtk_check_hdwr_status PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE,+ LONGWORD UNSIGNED NAMED hdwr_status OUT* TYPENAME mask_longword REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$DIAL_PHONE/* /* Dial the Telephone/* Q/* The Dial the Telephone routine dials the specified number on the telephone./* 6ENTRY dtk$dial_phone ALIAS $dtk_dial_phone PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE,0 CHARACTER RTL_STR_DESC NAMED phone_number IN TYPENAME char_string,1 LONGWORD UNSIGNED NAMED dial_mode IN OPTIONAL- TYPENAME longword_unsigned REFERENCE,1 CHARACTER RTL_STR_DESC NAMED text IN OPTIONAL TYPENAME char_string,& LONGWORD NAMED timeout IN OPTIONAL, TYPENAME longword_signed REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$HANGUP_PHONE/* /* Hang Up the Phone/* C/* The Hang Up the Phone routine speaks an optional message and /* then hangs up the phone./* :ENTRY dtk$hangup_phone ALIAS $dtk_hangup_phone PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE,1 CHARACTER RTL_STR_DESC NAMED text IN OPTIONAL TYPENAME char_string )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$INITIALIZE/* /* Initialize DECtalk/* c/* The Initialize DECtalk routine initializes a DECtalk device and returns the device's assigned/* voice identifier. /* 6ENTRY dtk$initialize ALIAS $dtk_initialize PARAMETER (( LONGWORD UNSIGNED NAMED voice_id OUT& TYPENAME identifier REFERENCE,1 CHARACTER RTL_STR_DESC NAMED output_device IN TYPENAME device_name,+ LONGWORD NAMED device_type OUT OPTIONAL, TYPENAME longword_signed REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$LOAD_DICTIONARY/* -/* Load a Word into the DECtalk Dictionary/* :/* The Load a Word into the DECtalk Dictionary routine =/* loads a phonemic definition of a word into the DECtalk /* dictionary./* @ENTRY dtk$load_dictionary ALIAS $dtk_load_dictionary PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE,( CHARACTER RTL_STR_DESC NAMED text IN TYPENAME char_string,0 CHARACTER RTL_STR_DESC NAMED substitution IN TYPENAME char_string )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$READ_KEYSTROKE/* &/* Read a Key Entered on the Keypad/* 3/* The Read a Key Entered on the Keypad routine ./* reads a key entered on the phone keypad./* >ENTRY dtk$read_keystroke ALIAS $dtk_read_keystroke PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE, LONGWORD NAMED key_code OUT+ TYPENAME longword_signed REFERENCE,: CHARACTER RTL_STR_DESC NAMED prompt_string IN OPTIONAL TYPENAME char_string,& LONGWORD NAMED timeout IN OPTIONAL, TYPENAME longword_signed REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$READ_STRING/* 1/* Read a Series of Keys Entered on the Keypad/* F/* The Read a Series of Keys Entered on the Keypad routine reads a 1/* series of keys entered on the phone keypad./* 8ENTRY dtk$read_string ALIAS $dtk_read_string PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE,5 CHARACTER RTL_STR_DESC NAMED resultant_string OUT TYPENAME char_string,: CHARACTER RTL_STR_DESC NAMED prompt_string IN OPTIONAL TYPENAME char_string,& LONGWORD NAMED timeout IN OPTIONAL+ TYPENAME longword_signed REFERENCE,< LONGWORD NAMED longword_integer_termin_code OUT OPTIONAL, TYPENAME longword_signed REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$RETURN_LAST_INDEX/* /* Return Last Index Spoken/* I/* The Return Last Index Spoken routine returns the last index spoken./* DENTRY dtk$return_last_index ALIAS $dtk_return_last_index PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE, LONGWORD NAMED p_index OUT, TYPENAME longword_signed REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$SPELL_TEXT/* /* Spell Text/* G/* The Spell Text routine causes DECtalk to pronounce each letter of/* the specified text. /* 6ENTRY dtk$spell_text ALIAS $dtk_spell_text PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE,( CHARACTER RTL_STR_DESC NAMED text IN TYPENAME char_string,7 LONGWORD UNSIGNED NAMED completion_mode IN OPTIONAL* TYPENAME mask_longword REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$SPEAK_FILE/* (/* Speak the Text in a Specified File/* 5/* The Speak the Text in a Specified File routine 6/* speaks the text contained in the specified file./* 6ENTRY dtk$speak_file ALIAS $dtk_speak_file PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE,, CHARACTER RTL_STR_DESC NAMED filespec IN TYPENAME char_string,7 LONGWORD UNSIGNED NAMED completion_mode IN OPTIONAL. TYPENAME longword_unsigned REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$SPEAK_PHONEMIC_TEXT/* '/* Speak the Specified Phonemic Text/* 4/* The Speak the Specified Phonemic Text routine >/* sends the specified phonemic text to the DECtalk device /* to be spoken./* HENTRY dtk$speak_phonemic_text ALIAS $dtk_speak_phonemic_text PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE,( CHARACTER RTL_STR_DESC NAMED text IN TYPENAME char_string,7 LONGWORD UNSIGNED NAMED completion_mode IN OPTIONAL. TYPENAME longword_unsigned REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$SPEAK_TEXT/* /* Speak the Specified Text/* +/* The Speak the Specified Text routine 5/* sends the specified text to the DECtalk device /* to be spoken./* 6ENTRY dtk$speak_text ALIAS $dtk_speak_text PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE,( CHARACTER RTL_STR_DESC NAMED text IN TYPENAME char_string,7 LONGWORD UNSIGNED NAMED completion_mode IN OPTIONAL. TYPENAME longword_unsigned REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$SET_INDEX/* -/* Insert an Index at the Current Position/* :/* The Insert an Index at the Current Position routine 6/* inserts an index into the current output stream./* 4ENTRY dtk$set_index ALIAS $dtk_set_index PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN& TYPENAME identifier REFERENCE, LONGWORD NAMED p_index IN, TYPENAME longword_signed REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$SET_KEYPAD_MODE/* &/* Turn the Phone Keypad On and Off/* E/* The Turn the Phone Keypad On and Off routine turns recognition (/* of the telephone keypad on or off./* @ENTRY dtk$set_keypad_mode ALIAS $dtk_set_keypad_mode PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN*& TYPENAME identifier REFERENCE,* LONGWORD UNSIGNED NAMED keypad_mode IN. TYPENAME longword_unsigned REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' S/* DTK$SET_LOGGING_MODE/* Q/* Set the Logging Mode for the Video Terminal Connected to the DECtalk Device /* 6/* The Set the Logging Mode for the Video Terminal -/* Connected to the DECtalk Device routineC=/* controls the information that is displayed on the videoT8/* terminal while the DECtalk device is functioning. /* BENTRY dtk$set_logging_mode ALIAS $dtk_set_logging_mode PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN & TYPENAME identifier REFERENCE,0 LONGWORD UNSIGNED NAMED new_mode IN OPTIONAL) TYPENAME mask_longword REFERENCE,E1 LONGWORD UNSIGNED NAMED old_mode OUT OPTIONAL * TYPENAME mask_longword REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' */* DTK$SET_MODE/* +/* Set the Mode for the DECtalk Terminal /* 8/* The Set the Mode for the DECtalk Terminal routine ?/* sets or resets the mode settings of the DECtalk terminal.P/* 2ENTRY dtk$set_mode ALIAS $dtk_set_mode PARAMETER (' LONGWORD UNSIGNED NAMED voice_id INA& TYPENAME identifier REFERENCE,0 LONGWORD UNSIGNED NAMED new_mode IN OPTIONAL) TYPENAME mask_longword REFERENCE,n1 LONGWORD UNSIGNED NAMED old_mode OUT OPTIONAL * TYPENAME mask_longword REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' Y/* DTK$SET_SPEECH_MODER/* !/* Turn Speech Mode On and Offx/* ./* The Turn Speech Mode On and Off routine 9/* either starts or stops the DECtalk device's speech.i/* @ENTRY dtk$set_speech_mode ALIAS $dtk_set_speech_mode PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN & TYPENAME identifier REFERENCE,' LONGWORD UNSIGNED NAMED new_mode INh- TYPENAME longword_unsigned REFERENCE,h1 LONGWORD UNSIGNED NAMED old_mode OUT OPTIONAL. TYPENAME longword_unsigned REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$SET_TERMINAL_MODEG/* I/* Set the Mode for the Video Terminal Connected to the DECtalk DeviceO/* ./* The Set the Mode for the Video Terminal -/* Connected to the DECtalk Device routine*=/* controls the attributes of the video terminal connectedp/* to the DECtalk device. d/* DENTRY dtk$set_terminal_mode ALIAS $dtk_set_terminal_mode PARAMETER (' LONGWORD UNSIGNED NAMED voice_id IN & TYPENAME identifier REFERENCE,0 LONGWORD UNSIGNED NAMED new_mode IN OPTIONAL) TYPENAME mask_longword REFERENCE,1 LONGWORD UNSIGNED NAMED old_mode OUT OPTIONAL* TYPENAME mask_longword REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' /* DTK$SET_VOICEo/* /* Set Voice Characteristics_/* +/* The Set Voice Characteristics routineA>/* changes the DECtalk voice characteristics to match those/* specified. */* 4ENTRY dtk$set_voice ALIAS $dtk_set_voice PARAMETER (' LONGWORD UNSIGNED NAMED voice_id INa& TYPENAME identifier REFERENCE,( LONGWORD NAMED new_voice IN OPTIONAL+ TYPENAME longword_signed REFERENCE, * LONGWORD NAMED speech_rate IN OPTIONAL+ TYPENAME longword_signed REFERENCE,M3 LONGWORD UNSIGNED NAMED comma_pause IN OPTIONAL- TYPENAME longword_unsigned REFERENCE,;4 LONGWORD UNSIGNED NAMED period_pause IN OPTIONAL. TYPENAME longword_unsigned REFERENCE )0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' i/* DTK$TERMINATE /* /* Terminate DECtalk /* P/* The Terminate DECtalk routine terminates the use of an initialized DECtalk /* device.A/* 4ENTRY dtk$terminate ALIAS $dtk_terminate PARAMETER (' LONGWORD UNSIGNED NAMED voice_id INa' TYPENAME identifier REFERENCE )O0 RETURNS LONGWORD UNSIGNED TYPENAME cond_value;' EEND_MODULE dtk$routines; /* DTK$LOAD_DICTIONARY/* -/* Load a Word into the DECtalk Dictionary/* :/* The Load a Word into the DECtalk Dictionary routine =/* loads a phonemic definition of a word into the DECtalk /* dictionary./* @ENTRY dtk$load_dictionar*[DIETER.DTKVAX]DTKDATSTR.REQ;1+,>$./ ) 4S->A0123KPWO56{M7~Ԕ89tKG )HJ2! Data Structure Definitions for RTL DTK$ facility#! File: DTKDATSTR.REQ Edit: TS1003!!M!****************************************************************************!* *I!* COPYRIGHT (c) 1978, 1980, 1982, 1984, 1985, 1986, 1987, 1988 BY *A!* DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS. *#!* ALL RIGHTS RESERVED. *!* *M!* THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED *M!* ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE *M!* INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER *M!* COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY *M!* OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY *!* TRANSFERRED. *!* *M!* THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE *M!* AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT *!* CORPORATION. *!* *M!* DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS *B!* SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. *!* *!* *M!****************************************************************************!!++! FACILITY: Screen Management! ! ABSTRACT:!F! This file contains data structure definitions for DECtalk management5! routines. Voice Control Block are defined here.!!!! MODIFIED BY:!A! 1-003 - Add fields for file and network support. TS 7-Mar-1988@! 1-002 - Reformat for new status queue entries. TS 23-Jun-1986"! 1-001 - Original. TS 6-Aug-1985 !+! Voice Control Block (VCB)!! -------------------------------B! This data structure resides in HEAP storage. One of these areasG! is allocated whenever a new stream is established for the first time./! It is deallocated when the stream is deleted.D! It contains the fundemental information associated with a DECtalk.!-MACRO? VCB_A_NEXT = 0, 0, 32, 0%, ! Link for chain of vcbs9 VCB_A_PREV = 4, 0, 32, 0%, ! Back link for chainG VCB_W_MODE_SETTINGS = 8, 0, 16, 0%, ! Mode setting for this VCB9 VCB_V_SQUARE = 8, 0, 1, 0%, ! =1 if square enabled6 VCB_V_MINUS = 8, 1, 1, 0%, ! =1 if minus enabled5 VCB_V_ASCII = 8, 2, 1, 0%, ! =1 if asky enabled? VCB_V_EUROPE = 8, 3, 1, 0%, ! =1 if european numbers used8 VCB_V_SPELL = 8, 4, 1, 0%, ! =1 to spell all wordsD VCB_B_MODE_TERMINAL = 10, 0, 8, 0%, ! Terminal mode settingsA VCB_V_HOST = 10, 0, 1, 0%, ! =1 if sending all chars to hostA VCB_V_SPEAK = 10, 1, 1, 0%, ! =1 if speaking all chars typed? VCB_V_EDITED = 10, 2, 1, 0%, ! =1 if line editting enabled> VCB_V_HARD = 10, 3, 1, 0%, ! =1 if local echo as hardcopy7 VCB_V_SETUP = 10, 4, 1, 0%, ! =1 if speaking setupA VCB_V_FILTER = 10, 5, 1, 0%, ! =1 if not sending seq to termB VCB_B_MODE_LOGGING = 11, 0, 8, 0%, ! Logging mode settings4 VCB_V_TEXT = 11, 0, 1, 0%, ! =1 if logging text; VCB_V_PHONEME = 11, 1, 1, 0%, ! =1 if logging phonemes< VCB_V_RAWHOST = 11, 2, 1, 0%, ! =1 if logging all chars@ VCB_V_INHOST = 11, 3, 1, 0%, ! =1 if logging text from host? VCB_V_OUTHOST = 11, 4, 1, 0%, ! =1 if logging text to host7 VCB_V_ERROR = 11, 5, 1, 0%, ! =1 if logging errorsA VCB_V_TRACE = 11, 6, 1, 0%, ! =1 if logging seq symbolically+ VCB_V_DEBUG = 11, 7, 1, 0%, ! ReservedB VCB_B_SPEECH_MODES = 12, 0, 8, 0%, ! Speech mode settings< VCB_B_DEVTYPE = 13, 0, 8, 0%, ! Logical device typeK VCB_W_DEVNAM_LEN = 14, 0, 16, 0%, ! Length of the resultant device . ! name string contained in VCB_T_DEVNAM.N VCB_T_DEVNAM = 16, 0, 0, 0%, ! A 64-byte area. This buffer contains / ! the resultant device name string. Its 0 ! length is contained in VCB_W_DEVNAM_LEN.9 VCB_R_CHARBUF = 80, 0, 0, 0%, ! Start of 12-byte ! characteristics bufferA VCB_L_DEVCHAR = 80, 0, 32, 0%, ! Device characteristicsB VCB_B_DEVCLASS = 80, 0, 8, 0%, ! Device class, e.g. DC$_TERML VCB_B_PHY_DEV_TYPE = 81, 0, 8, 0%, ! Physical device type, e.g. DT$_VT1000 VCB_W_WIDTH = 82, 0, 16, 0%, ! Device widthS VCB_L_DEVDEPEND = 84, 0, 32, 0%, ! Primary device dependent bits. These , ! are the bits of the TT$V_xyz flavor.= VCB_B_ROWS = 84, 24, 8, 0%, ! Number of rows on terminal! ! (overlaps prevؼ~ DTKVAX.SAV>$>A[DIETER.DTKVAX]DTKDATSTR.REQ;1S ious field)P VCB_L_DEVDEPEND2 = 88, 0, 32, 0%, ! Secondary device dependent bits. 3 ! These are the bits of the TT2$V_xyz flavor.> VCB_W_CHAN = 92, 0, 16, 0%, ! Channel number. 0 means# ! no channel as been assignedA VCB_B_STRUCT_TYPE = 94, 0, 8, 0%, ! Structure type (VCB)B VCB_B_CURR_VOICE = 95, 0, 8, 0%, ! Current speaking voice. VCB_L_VID = 96, 0, 32, 0%, ! Voice idD VCB_R_EXIT_BLOCK = 100, 0, 0 ,0%, ! Exit block (5 longwords)I VCB_L_EXIT_LINK = 100, 0, 32, 0%, ! system forward link to next blockC VCB_A_EXIT_ADDR = 104, 0, 32, 0%, ! address of our exit handler; VCB_B_EXIT_ARGCNT = 108, 0, 8, 0%, ! argument count (=2)J VCB_A_EXIT_RSN = 112, 0, 32, 0%, ! arg 1: address to store exit reason> VCB_A_EXIT_VCB = 116, 0, 32, 0%, ! arg 2: our VCB addressR VCB_L_EXIT_REASON = 120, 0, 32, 0%, ! exit reason (address stored as first ! argument in exit block).O VCB_A_OUTNAM = 124, 0, 32, 0%, ! Address of buffer containing the output) ! filename as specified by the userH VCB_W_OUTNAM_LEN = 128, 0, 16, 0%, ! Length of output name string= VCB_W_LAST_INDEX = 130, 0, 16, 0%, ! Last index spoken 2 VCB_W_fill1 = 132, 0, 16, 0%, ! spare word- VCB_W_FLAGS = 134, 0, 16, 0%, ! Flags> VCB_V_WINK = 134, 0, 1, 0%, ! Wink detection enabledD VCB_V_STSREAD = 134, 1, 1, 0%, ! 1 means a status was read7 VCB_V_LOCKED = 134, 2, 1, 0%, ! VCB is locked> VCB_V_KEYPAD_ON = 134, 3, 1, 0%, ! keypad is enabled; VCB_V_OFFHOOK = 134, 4, 1, 0%, ! phone is offhook> VCB_V_AUTOSTOP = 134, 5, 1, 0%, ! use auto-stop modeE VCB_V_BUF_ENABLED = 134, 6, 1, 0%, ! output buffering is onL VCB_L_CAP_LENGTH = 136, 0, 32, 0%, ! Length of last capability gottenH VCB_A_CAP_BUFFER = 140, 0, 32, 0%, ! Address of capability bufferH VCB_A_OUTPUT_BUFFER = 144, 0, 32, 0%, ! Address of buffer used to" ! buffer up output sequencesN VCB_W_OUTPUT_BUFSIZ = 148, 0, 16, 0%, ! (Maximum) size of output bufferN VCB_W_OUTPUT_BUFLEN = 150, 0, 16, 0%, ! Current length of output buffer) ! i.e. number of characters in the - ! buffer. 0 means the buffer is empty.J VCB_Q_INPUT_DESC = 152, 0, 0, 0%, ! Buffer for holding users input7 VCB_W_LENGTH = 152, 0, 16, 0%, ! String length4 VCB_B_DTYPE = 154, 0, 8, 0%, ! String type5 VCB_B_CLASS = 155, 0, 8, 0%, ! String class9 VCB_A_POINTER = 156, 0, 32, 0%, ! String pointerG VCB_Q_STATUS_QUEUE = 160, 0, 0, 0%, ! Queue for holding STATUS; VCB_L_STATUS_FLINK = 160, 0, 32, 0%, ! Forward link< VCB_L_STATUS_BLINK = 164, 0, 32, 0%, ! Backward linkM VCB_Q_HDWR_STS_QUEUE = 168, 0, 0, 0%, ! Queue for holding hardware sts; VCB_L_HDWR_STS_FLINK = 168, 0, 32, 0%, ! Forward link< VCB_L_HDWR_STS_BLINK = 172, 0, 32, 0%; ! Backward linkLITERAL? VCB_K_SIZE = 176, ! Total size of VCB in bytes.? VCB_K_STRUCT_TYPE = %X'11', ! VCB structure type code< VCB$K_LONGEST_SEQUENCE = 255, ! Longest escape sequenceI STSQUE_K_SIZE = 12, ! Size of STATUS queue entries in bytes@ TYPEAHEAD_K_SIZE = 8, ! Size of typeahead block in bytes9 VCB_K_DEF_MODE_SETTINGS = 0, ! Default mode settings  ! for VCB_L_MODE_SETTINGS.H DTK$S_CHAR_EXIT_BLOCK = 9*4; ! Size in bytes of exit block used by( ! DTK$$SET_TERMINAL_CHARACTERISTICSFIELD TYPEAHEAD_FIELDS = SETI TYPEAHEAD_COUNT = [0,0,16,0], ! Number of characters in typeahead bufC TYPEAHEAD_CHAR = [0,16,8,0] ! First character in typeahead buf  TES;FIELD STSQUE_FIELDS = SETB STATUS_A_FLINK = [ 0,0,32,0], ! Forward link in status queueC STATUS_A_BLINK = [ 4,0,32,0], ! Backward link in status queue > STATUS_L_STATUS = [ 8,0,32,0] ! Status returned by DECTALK TES;MACRO/ $VCB_DECL = BLOCK[VCB_K_SIZE,BYTE] %,M $TYPEAHEAD_DECL = BLOCK[TYPEAHEAD_K_SIZE,BYTE] FIELD(TYPEAHEAD_FIELDS) %,G $STSQUE_DECL = BLOCK[STSQUE_K_SIZE,BYTE] FIELD(STSQUE_FIELDS) %;*[DIETER.DTKVAX]DTKDEF.SDL;1+,?#. / ) 4M ->A0123KPWO 56;PG7 PG89tKG )HJ:MODULE $DTKDEF; /* Definitions for RTL DECtalk Management!{File: DTKDEF.SDL Edit: TS1003M{****************************************************************************{* */{* COPYRIGHT (c) 1984, 1985, 1986 BY *A{* DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS. *#{* ALL RIGHTS RESERVED. *{* *M{* THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED *M{* ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE *M{* INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER *M{* COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY *M{* OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY *{* TRANSFERRED. *{* *M{* THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE *M{* AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT *{* CORPORATION. *{* *M{* DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS *B{* SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. *{* *{* *M{****************************************************************************{ Edit history:{"{ 1-001 - Original. TS 8-Aug-1985E{ 1-002 - Fix keypad constants to be characters instead of numbers. { TS 3-Jun-1986,{ 1-003 - Add TEST constants. TS 4-Sep-1986/*/* Phone keypad keys./* constant( ZERO , ONE , TWO , THREE , FOUR , FIVE , SIX , SEVEN , EIGHT , NINE2 ) equals 48 increment 1 prefix DTK$ tag K_TRM; constant( A , B , C , D2 ) equals 65 increment 1 prefix DTK$ tag K_TRM;6constant NUMBER_SIGN equals 35 prefix DTK$ tag K_TRM;6constant ASTERISK equals 42 prefix DTK$ tag K_TRM; /* Conditions constant (" CANCELLED /* I/O cancelled ( , TIMEOUT /* Timeout period expired# , BUFFER_FULL /* Buffer is full$ , UNKNOWN /* Unknown terminator3 ) equals 508 increment 1 prefix DTK$ tag K_TRM;/*/* Self-test constants./* constant( POWER , HDATA , HCONTROL , DATA , SPEAK2 ) equals 1 increment 1 prefix DTK$ tag K_TEST;/*/* Phone dialing constants./* constant( TONE , PULSE2 ) equals 0 increment 1 prefix DTK$ tag K_DIAL;/*/* DECtalk types./* constant( UNKNOWN , "01" , "03"1 ) equals 0 increment 1 prefix DTK$ tag K_DTC;/*/* Keypad modes./* constant( OFF , ON , AUTO4 ) equals 0 increment 1 prefix DTK$ tag K_KEYPAD;/* /* Voices./* constant( MALE , FEMALE , CHILD , DEEP_MALE , DEEP_FEMALE , OLDER_MALE , LIGHT_FEMALE3 ) equals 0 increment 1 prefix DTK$ tag K_VOICE;/*/* Speaking modes./* constant( SPEAK , STOP , HALT- ) equals 0 increment 1 prefix DTK$ tag K;/*/* Return modes./* constant(5 IMMED /* Return immedately after sending text.A , WAIT /* Wait until text is completely spoken be returning.D , STATUS /* Wait for text to be spoken and return phone status.- ) equals 0 increment 1 prefix DTK$ tag K;/*9/* DEFINE BIT MASKS AND VALUES FOR MODE ATTRIBUTES/*$aggregate DTKDEF union prefix DTK$;/*8/* DEFINE BITS, MASKS, AND FIELDS FOR THE CONTROL MODES./* DTKMODE_BITS structure;3 SQUARE bitfield mask; /* Set mode square on* ASCII bitfield mask; /* asky mode2 MINUS bitfield mask; /* Say dash as minus( EUROPE bitfield mask; /* Europe 0 SPELL bitfield mask; /* Spell all words end DTKMODE_BITS;A constant "NORMAL" equals 0 prefix DTK$ tag M; /* no bits set constant() SQUARE /* Mode square bitvector index , ASCII /* asky mode/ , MINUS /* Say dash as minus bitvector index# , EUROPE /* European type numbers , SPELL /* Spell all words ) equals 0 increment 1; DTKTERM_BITS structure;: HOST bitfield mask; /* Send all chars typed to host.3 SPEAK_ALL bitfield mask; /* Speak all chars typed.7 EDITED bitfield mask; /* Line edit all chars typed.> HARD bitfield mask; /* Do local echo in hardcopy format.E SETUP bitfield mask; /* Speak all chars displayed in setup mode.C FILTER bitfield mask; /* Don't send DECtalk specific sequences. end DTKTERM_BITS; constant(- HOST /* Send all chars typed to host.' , SPEAK_ALL /* Speak all chars typed.) , EDITED /* Line edit all chars typed.1 , HARD /* Do local echo in hardcopy format.8 , SETUP /* Speak all chars displayed in setup mode.6 , FILTER /* Don't send DECtalk specific sequences. ) equals 0 increment 1; DTKLOG_BITS structure;* TEXT bitfield mask; /* Log ASCII text.- PHONEME bitfield mask; /* Log phonemic text.< RAWHOST bitfield mask; /* Log all chars without inspection.3 INHOST bitfield mask; /* Log text read from host.1 OUTHOST bitfield mask; /* Log text sent to host.. ERROR bitfield mask; /* Log error messages.5 TRACE bitfield mask; /* Log sequences symbolically# DEBUG bitfield mask; /* Reserved end DTKLOG_BITS; constant( TEXT /* Log ASCII text." , PHONEME /* Log phonemic text.1 , RAWHOST /* Log all chars without inspection.( , INHOST /* Log text read from host.& , OUTHOST /* Log text sent to host.# , ERROR /* Log error messages.* , TRACE /* Log sequences symbolically , DEBUG /* Reserved ) equals 0 increment 1; end DTKDEF;end_module $DTKDEF;*[DIETER.DTKVAX]DTKMACROS.REQ;1+,?../ ) 4M ->A0123KPWO567 Qϔ89tKG )HJ)! Macro Definitions for RTL DTK$ facility#! File: DTKMACROS.REQ Edit: TS1003!!M!****************************************************************************!* *I!* COPYRIGHT (c) 1978, 1980, 1982, 1984, 1985, 1986, 1987, 1988 BY *A!* DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS. *#!* ALL RIGHTS RESERVED. *!* *M!* THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED *M!* ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE *M!* INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER *M!* COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY *M!* OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY *!* TRANSFERRED. *!* *M!* THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE *M!* AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT *!* CORPORATION. *!* *M!* DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS *B!* SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. *!* *!* *M!****************************************************************************! !++! FACILITY: DECtalk Management! ! ABSTRACT:!@! This file contains macros used by DECtalk management routines.!! MODIFIED BY:!.! 1-004 - Add descriptor macro. TS 7-Mar-19885! 1-003 - Remove unused queue macros. TS 23-Jun-1986/! 1-002 - Add $DTK$RETURN macro. TS 9-Apr-1986"! 1-001 - Original. TS 6-Aug-1985!-- !+! $DTK$DESCRIPTOR! ---------------!4! This macro is used to declare a string descriptor.!-MACRO2 $DTK$DESCRIPTOR = BLOCK [DSC$K_S_BLN, BYTE] %;!+ ! $DTK$RETURN ! -----------!@! This macro is used to return the status of a called routine if?! the status is not successful. It also resets the locked bit.!!-MACRO $DTK$RETURN(S) = BEGIN VCB [VCB_V_LOCKED] = 0; RETURN S; END %;!+! $DTK$BUFFERING_ON! -----------------!G! This macro is used to turn on buffering mode. This will minimize the'! number of $QIOs that need to be done.!!-MACRO $DTK$BUFFERING_ON(VCB) =  VCB[VCB_V_BUF_ENABLED] = 1 %;!+! $DTK$BUFFERING_OFF! ------------------!F! This macro is used to turn off buffering mode. This will result in G! a $QIO for each output. It will also output the current contents of ! the buffer.!!-MACRO  $DTK$BUFFERING_OFF(VCB) = IF .VCB[VCB_V_BUF_ENABLED] THEN BEGIN& STATUS = DTK$$FLUSH_BUFFER(.VCB);/ IF NOT .STATUS THEN $DTK$RETURN (.STATUS); VCB[VCB_V_BUF_ENABLED] = 0; END %; !+! $DTK$OUTPUT_DATA! ----------------!F! This macro is used to retrieve and output a specific sequence to the7! DECtalk device. Assumes you have a symbol named VCB.!!-MACRO% $DTK$OUTPUT_DATA(CAP,ARG1,ARG2) = BEGIN $DTK$GET_TERM_DATA( %NAME(CAP) %IF NOT %NULL(ARG1) %THEN ,ARG1 %FI %IF NOT %NULL(ARG2) %THEN ,ARG2 %FI ); STATUS = DTK$$OUTPUT( .VCB, " .VCB [VCB_L_CAP_LENGTH], # .VCB [VCB_A_CAP_BUFFER] );+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS); END %;!+! $DTK$GET_TERM_DATA! ------------------!G! This macro is used to retrieve a specified sequence to be sent to the7! DECtalk device. Assumes you have a symbol named VCB.!!-MACRO' $DTK$GET_TERM_DATA(CAP,ARG1,ARG2) = BEGIN STATUS=DTK$$GET_TERM_DATA(.VCB, %NAME(CAP), %NAME(K_,CAP,_LEN) %IF NOT %NULL(ARG1) %THEN ,ARG1 %FI %IF NOT %NULL(ARG2) %THEN ,ARG2 %FI );+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS); END %;!+! $DTK$DEFINE_SEQ! ---------------!E! This macro defines an escape sequence for a capability in read-onlyG! own storage. CAP is the capability name, SEQ is the sequence withoutF! the leading , and FLAG indicates this is a DCS sequence if set.<! The length of the capability is also defined as a literal.!!-MACRO( $DTK$DEFINE_SEQ ( CAP, SEQ, FLAG ) =4 LITERAL %NAME(K_,CAP,_LEN) = %CHARCOUNT(SEQ) + 1 %IF FLAG NEQ 0 %THEN + 4 %FI ; OWN/ %NAME(CAP) : VECTOR [%NAME(K_,CAP,_LEN), BYTE] PSECT (_DTK$CODE) INITIAL ( BYTE ( K_ESC %IF FLAG NEQ 0 %THEN , 'P;' %FI ,%STRING(SEQ) %IF FLAG NEQ 0 %THEN , K_ESC, '\' %FI ) ) %;!+! $DTK$VALIDATE_ARGCOUNT! ----------------------!G! Macro used to check that a DTK$ procedure was called with the correctI! number of arguments. If the test fails, the procedure returns with the ! failure status DTK$_WRONUMARG.! ! Format:"! $DTK$VALIDATE_ARGCOUNT (lo, hi);!9! lo = Lowest number of arguments which are valid (0-255):! hi = Highest number of arguments which are valid (0-255)!-MACRO% $DTK$VALIDATE_ARGCOUNT (lo, hi) = BEGIN BUILTIN ACTUALCOUNT; EXTERNAL LITERAL DTK$_WRONUMARG; %IF lo NEQ hi %THEN %IF lo NEQ 0 %THEN LOCAL DIFF: BYTE; DIFF = ACTUALCOUNT () - lo; IF .DIFF GTRU (hi - lo) THEN RETURN (DTK$_WRONUMARG); %ELSE IF ACTUALCOUNT () GTRU hi THEN RETURN (DTK$_WRONUMARG); %FI %ELSE IF ACTUALCOUNT () NEQU lo THEN RETURN (DTK$_WRONUMARG); %FI END %;!+! $DTK$GET_VCB! ------------=! Macro $DTK$GET_VCB validates the suppled voice id (VID) andB! computes the starting address of the corresponding Voice ControlH! Block (VCB). If VID is invalid, DTK$_INVVOI_ID is returned to caller%! of routine that invokes this macro.!-MACRO# $DTK$GET_VCB ( VID, VCB_ADDR) = BEGIN BUILTIN TESTBITSS; BIND # LOC_VID = VID : REF BLOCK [,BYTE]; EXTERNAL LITERAL  DTK$_TLKINUSE, DTK$_INVVOI_ID; IF .VID LEQ 0+ THEN ! VID of 0 or a negative number& RETURN (DTK$_INVVOI_ID); ! is invalid$ IF .LOC_VID [VCB_L_VID] NEQ .VID THEN6 RETURN (DTK$_INVVOI_ID); ! Not pointing to one of our ! control blocks9 IF .LOC_VID [VCB_B_STRUCT_TYPE] NEQ VCB_K_STRUCT_TYPE THEN1 RETURN (DTK$_INVVOI_ID); ! Not pointing to a VCB" VCB_ADDR = .VID; ! Assume ok%! IF TESTBITSS(VCB [VCB_V_LOCKED]) ! THEN1! RETURN (DTK$_TLKINUSE); ! Protect against asts END %;*[DIETER.DTKVAX]DTKMSG.MSG;1+,?./ ) 4M->A0123KPWO56ty7bP89tKG )HJ.) .TITLE DTK$MSGDEF DTK$ facility messages1 .IDENT '1-004' ! File: DTKMSG.MSG Edit: TS1004!M!****************************************************************************!* *I!* COPYRIGHT (c) 1978, 1980, 1982, 1984, 1985, 1986, 1987, 1988 BY *A!* DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS. *#!* ALL RIGHTS RESERVED. *!* *M!* THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED *M!* ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE *M!* INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER *M!* COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY *M!* OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY *!* TRANSFERRED. *!* *M!* THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE *M!* AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT *!* CORPORATION. *!* *M!* DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS *B!* SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. *!* *!* *M!****************************************************************************!!0! 1-004 Add DSR status messages. TS 29-Aug-19869! 1-003 Add /MACRO=$DTKMSG for STARLETSD. TS 30-Jul-1986*! 1-002 Add DTK$_TLKINUSE. TS 10-Apr-1986 ! 1-001 Original. TS 6-Aug-1985!-!+>! Symbols are defined following the standard for global names:!! DTK$_abcmnoxyz!K! In addition, the library standards specify that the letters "abc", "mno",M! and "xyz" are the first three letters of the first three words of the error2! message, not counting articles and prepositions.!L! The names of all procedures using each error condition value should appear6! in the comments included with each error definition.!! MACRO-32 Programming:!! The macros call:! ! $DTKDEF!<! will cause all symbols to be made available to the module.:! The Run-time Library declares these symbols as EXTERNAL;?! the macros are provided only for the convenience of the user.!!- $! Template for documenting messages.8! Each explanation follows the message it applies to and! is followed by a blank line.F! Be sure not to use the sequence "++" after a "!" in regular comments=! as this sequence begins a documentation sequence and can be8! searched for if and when the process of extracting the"! documentation becomes automated. !++ ! FACILITY: DTK ! EXPLANATION: x ! USER ACTION: y !--! ; Set LH to 419 (decimal).( .FACILITY DTK,419 /SYSTEM/MACRO=$DTKMSG .SEVERITY SUCCESS .BASE 0' NORMAL  !++ ! FACILITY: DTK- ! EXPLANATION: Normal successful completion. ! USER ACTION: none !-- .BASE 24 VOIALREXI  !++ ! FACILITY: DTKD ! EXPLANATION: A user tried to create a new voice_id for a DECtalk 7 ! device, when one already exists. This is normal in1 ! a modular environment. The existing voice id ! is returned.; ! USER ACTION: None. Make sure you don't delete a voice_id$ ! that you actually didn't create. !--% NOT_A_TRM  !++ ! FACILITY: DTKA ! EXPLANATION: This is an informational message telling you that( ! the output device is not a terminal. ! USER ACTION: None. !-- !+: ! NOTE:: Do NOT add any additional SUCCESS messages here.9 ! Add them below after the remaining .SUCCESS messages. !- .SEVERITY INFORMATIONAL5 BUSY  !++ ! FACILITY: DTKE ! EXPLANATION: The routine DTK$DIAL_PHONE was called to dial a phone! ! number and the line was busy." ! USER ACTION: Try calling again. !--4 NOANSWER  !++ ! FACILITY: DTKE ! EXPLANATION: The routine DTK$DIAL_PHONE was called to dial a phone( ! number and no one answered the call." ! USER ACTION: Try calling again. !--8 NODIATONE  !++ ! FACILITY: DTKE ! EXPLANATION: The routine DTK$DIAL_PHONE was called to dial a phone/ ! number and no dial tone was detected on the ! phone line. B ! USER ACTION: Correct the telephone line problem and call again. !--) OFFHOOK  !++ ! FACILITY: DTKA ! EXPLANATION: This is an informational message telling you that, ! the phone is offhook (a call is active). ! USER ACTION: None. !--) ONHOOK  !++ ! FACILITY: DTKA ! EXPLANATION: This is an informational message telling you that, ! the phone is onhook (no call is active). ! USER ACTION: None. !--" TIMEOUT  !++ ! FACILITY: DTKA ! EXPLANATION: This is an informational message telling you that$ ! the output device has timed out. ! USER ACTION: None. !--. WINK  !++ ! FACILITY: DTK= ! EXPLANATION: A wink (possible timeout) was detected on the7 ! phone line. The caller may have hung up the phone. ! USER ACTION: None. !--0 COMFAIL  !++ ! FACILITY: DTKD ! EXPLANATION: A communications malfunction has occurred since the  ! DECtalk unit was turned on.+ ! USER ACTION: Check the DECtalk hardware. !--/ INPBUFOVR  !++ ! FACILITY: DTKH ! EXPLANATION: An input buffer overflow malfunction has occurred since # ! the DECtalk unit was turned on.+ ! USER ACTION: Check the DECtalk hardware. !--. NVROPRFAI  !++ ! FACILITY: DTK; ! EXPLANATION: A NVR operation failure has occurred since # ! the DECtalk unit was turned on.+ ! USER ACTION: Check the DECtalk hardware. !--6 ERRPHOTRA  !++ ! FACILITY: DTKH ! EXPLANATION: A phonemic transcription malfunction has occurred since # ! the DECtalk unit was turned on.+ ! USER ACTION: Check the DECtalk hardware. !--8 CONSEQERR  !++ ! FACILITY: DTKC ! EXPLANATION: A DECtalk private control sequence malfunction has 2 ! occurred since the DECtalk unit was turned on.+ ! USER ACTION: Check the DECtalk hardware. !--) DECTSTFAI  !++ ! FACILITY: DTKA ! EXPLANATION: A local self-test malfunction has occurred since # ! the DECtalk unit was turned on.+ ! USER ACTION: Check the DECtalk hardware. !-- .SEVERITY FATAL .BASE 64# FATERRLIB  !++ ! FACILITY: DTK9 ! EXPLANATION: An internal error has occured within DTK.5 ! USER ACTION: Submit an SPR describing the problem. !--A FILTOOLON  !++ ! FACILITY: DTK2 ! EXPLANATION: The length of the specified string ! was too long.? ! USER ACTION: Correct your program so that it requests a file# ! name of 255 characters or less. !-- INVARG  !++ ! FACILITY: DTKG ! EXPLANATION: The value of some argument is not in the correct range.= ! USER ACTION: Examine each argument. Determine which one is* ! out of range and correct your program. !--" INVMODE  !++ ! FACILITY: DTK= ! EXPLANATION: The value of the mode argument is not in the  ! correct range.7 ! USER ACTION: Examine the argument. Determine what is* ! out of range and correct your program. !-- INVVOI_ID  !++ ! FACILITY: DTK2 ! EXPLANATION: An invalid voice-id was specified.D ! USER ACTION: Check that you are passing the voice id by reference. ! not by value. Ensure that the voice id was2 ! previously set up by a call to DTK$INITIALIZE. !--/ NOROOM  !++ ! FACILITY: DTK@ ! EXPLANATION: There is no room left in the dictionary for this ! definition.? ! USER ACTION: Correct your program so that it requests fewer 8 ! dictionary entries or so that each entry is smaller. !--: NOTIMP  !++ ! FACILITY: DTKB ! EXPLANATION: You tried to use a feature that is not implemented ! in this version of DTK$.4 ! USER ACTION: Get the appropriate version of DTK$. !--& PROTOOLON  !++ ! FACILITY: DTKF ! EXPLANATION: The length of a prompt string exceeded 512 characters.= ! USER ACTION: Shorten the prompt to 512 characters or less. !--7 STRTERESC  !++ ! FACILITY: DTKD ! EXPLANATION: An DTK output routine was passed an escape sequence$ ! embedded in the output string. A ! USER ACTION: Check your output string to determine what escape6 ! sequence was being passed. If you need the action3 ! provided by this escape sequence, there is most: ! likely a DTK routine that provides that functionality. !--A TOOLONG  !++ ! FACILITY: DTK@ ! EXPLANATION: The length of the specified string was too long.G ! USER ACTION: Correct your program so that it requests a phone number9 ! or dictionary substitution of 255 characters or less. !--: UNKESCSEQ  !++ ! FACILITY: DTKB ! EXPLANATION: A DTK input routine was passed an escape sequence% ! that it was unable to understand. ! USER ACTION: ???? !--/ UNKREPLY  !++ ! FACILITY: DTKB ! EXPLANATION: A DTK input routine was passed an escape sequence& ! that it could not parse correctly. ! USER ACTION: ???? !--& WRONUMARG  !++ ! FACILITY: DTK? ! EXPLANATION: A DTK routine was called with too few arguments0 ! (less than the number of required arguments) ! or too many arguments.9 ! USER ACTION: Correct the code to call the routine with# ! the proper number of arguments.. !-- TLKINUSE  !++ ! FACILITY: DTK< ! EXPLANATION: A DTK routine was called from an AST routine0 ! that interrupted a DTK routine with the same ! VOICE_ID. 9 ! USER ACTION: Correct the code to call the routine with9 ! the proper synchronization.Q !--+ NOTLCLTRM  !++ ! FACILITY: DTK: ! EXPLANATION: The output device is not a terminal on the ! local VMS node.A0 ! USER ACTION: Specify a local terminal device. !-- .SEVERITY SUCCESS .BASE 256 4 NOMALFUN1  !++ ! FACILITY: DTKA ! EXPLANATION: This is an informational message telling you thatW3 ! no malfunctions have occurred since the DECtalk 1 ! unit was turned on. This is the first reply.  ! USER ACTION: None.  !--4 NOMALFUN2  !++ ! FACILITY: DTKA ! EXPLANATION: This is an informational message telling you that 3 ! no malfunctions have occurred since the DECtalk.; ! unit was turned on. This is the second or later reply.O ! USER ACTION: None.O !-- .ENDO! End of file DTKMSG.MSGUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. *!* *!* *M!****************************************************************************!!0! 1-004 Add DSR status messages. TS 29-Aug-19869! 1-003 Add /MACRO=$DTKMSG for STARLETSD. TS 30-Jul-1986*! 1-002 Add DTK$_TLKINUSE. TS 10-Apr-1986 ! 1-001 Original. TS 6-Aug-1985!-!+>! *[DIETER.DTKVAX]DTKPROLOG.REQ;1+,'?5./ ) 4Md->A0123KPWO56`l.*7pD.*89tKG )HJ!+=! Prologue BLISS REQUIRE file for DECtalk Management Facility#! File: DTKPROLOG.REQ, Edit: TS1001!!M!****************************************************************************!* *9!* COPYRIGHT (c) 1978, 1980, 1982, 1984, 1985 BY *A!* DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS. *#!* ALL RIGHTS RESERVED. *!* *M!* THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED *M!* ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE *M!* INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER *M!* COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY *M!* OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY *!* TRANSFERRED. *!* *M!* THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE *M!* AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT *!* CORPORATIOz~ DTKVAX.SAV'?5>A[DIETER.DTKVAX]DTKPROLOG.REQ;1M`N. *!* *M!* DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS *B!* SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. *!* *!* *M!****************************************************************************!!! Edit History:!!! 1-001 - Created. TS 6-Aug-1985!--!+"! Set addressing modes to be used.!-GSWITCHES ADDRESSING_MODE (EXTERNAL=GENERAL, NONEXTERNAL=WORD_RELATIVE);!+"! Reference precompiled libraries.!-/LIBRARY 'RTLSTARLE'; ! SYS$LIBRARY:STARLET.L323LIBRARY 'RTLML:RTLLIB'; ! RTL-specific definitionsJREQUIRE 'RTLIN:DTKDATSTR'; ! DECtalk Management data structure definitionsAREQUIRE 'RTLIN:DTKMACROS'; ! DECtalk Management macro definitions'%IF NOT %DECLARED ( DTK$K_DTC_UNKNOWN )%THEN@REQUIRE 'RTLML:DTKDEF'; ! DECtalk Management symbol definitions%FI!+! Declare PSECTs to be used.!-PSECT: CODE = _DTK$CODE (READ, NOWRITE, EXECUTE, SHARE, PIC, " ADDRESSING_MODE (WORD_RELATIVE)),: PLIT = _DTK$CODE (READ, NOWRITE, EXECUTE, SHARE, PIC, " ADDRESSING_MODE (WORD_RELATIVE)),< OWN = _DTK$DATA (READ, WRITE, NOEXECUTE, NOSHARE, PIC, " ADDRESSING_MODE (LONG_RELATIVE)),> GLOBAL = _DTK$DATA (READ, WRITE, NOEXECUTE, NOSHARE, PIC, " ADDRESSING_MODE (LONG_RELATIVE));! End of DTKPROLOG.REQ*[DIETER.DTKVAX]DTKSHRLNK.OPT;1+,+?)./ ) 4G->A0123KPWO56 U78U89tKG )HJ=! DTKSHRLNK.OPT - Linker options file for building DTKSHR.EXE!#! 1-001 - Original. TS 29-Apr-1985!+B! Specify image name and ident. Note that this is not the same asC! the global section ident given with GSMATCH. IDENT should changeG! each time DTKSHR changes in a released version, such as a maintenanceG! update. GSMATCH should change only when the vector is modified in an#! incompatible (backwards) fashion.!- NAME=DTKSHRIDENT="V05-003"PSECT=$CODE$,PIC,SHR,EXE!+;! Specify the order of the PSECTs. The vector comes first.!-8COLLECT=CLUSTER1,$$DTK$VECTOR,_DTK$CODE,_LIB$CODE,$CODE$COLLECT=CLUSTER2,_DTK$DATA!+?! Specify modules to be included. The first must be DTKVECTOR.!-!LIB$:DTKVECTRS/INCLUDE=DTK$VECTORLIB$:DTKRTL/INCLUDE=(- DTK$UTIL,- DTK$MSGDEF)SYS$LIBRARY:STARLET/INCLUDE=(- LIB$MSGDEF,- SYS$P1_VECTOR)SYS$LIBRARY:IMAGELIB/LIBRARY!! Set global section match valuesGSMATCH=LEQUAL,1,100 DZRO_MIN=1 UNSUPPORTED=1*[DIETER.DTKVAX]DTKSHRVEC.DAT;1+,=?./ ) 4A->A0123KPWO568H7͹AH89tKG )HJ@! DTKSHRVEC.DAT - data file used by VECTORTST.COM for DTKSHR.EXE!=! This file contains the master list of all universal symbolsA! in the shared DTKSHR vector, along with their vector addresses.9! It is used by VECTORTST.COM to determine whether or not:! any vectors have moved. Any newly shared symbol must be! added to this list.!! The syntax is:! symbol-hex_address! where:.! symbol is the global symbol in the vector;! hex_address is the address of the vector in hex; all 8! digits must be given!8! A line beginning with a ! is a comment and is ignored.<! The symbol must begin in column 1. There must be no extra(! characters (i.e. spaces) in the lines.!;! If a universal symbol is not vectored (e.g. a patch area)2! its address is represented with an asterisk (*).!!?! *************************************************************?! * WARNING *?! *************************************************************!<! If you move or delete a vector address, MAKE SURE THAT YOU<! KNOW WHAT YOU ARE DOING!!! In particular, symbols present;! in released software MUST NOT BE MOVED! It is a bad idea$! to move even unreleased symbols. !2! The symbols MUST be in alphabetical order!!!!!!!! ! 1-001 - Original TS 6-Sep-1985!DTK$ANSWER_PHONE-00000000DTK$CHECK_HDWR_STATUS-000000A8DTK$DIAL_PHONE-00000008DTK$HANGUP_PHONE-00000010DTK$INITIALIZE-00000018DTK$LOAD_DICTIONARY-00000020DTK$OUTPUT-00000028DTK$READ_KEYSTROKE-00000030DTK$READ_STRING-00000038DTK$RETURN_LAST_INDEX-00000040DTK$RUN_SELF_TEST-000000B0DTK$SET_INDEX-00000048DTK$SET_KEYPAD_MODE-00000050DTK$SET_LOGGING_MODE-00000058DTK$SET_MODE-00000060DTK$SET_SPEECH_MODE-00000068DTK$SET_TERMINAL_MODE-00000070DTK$SET_VOICE-00000078DTK$SPEAK_FILE-00000080 DTK$SPEAK_PHONEMIC_TEXT-00000088DTK$SPEAK_TEXT-00000090DTK$SPELL_TEXT-000000A0DTK$TERMINATE-00000098*[DIETER.DTKVAX]DTKUTIL.B32;1+,D?4. / ) 4P  ->A0123KPWO 56KE#7'+$89tKG )HJf-%TITLE 'DTK$UTIL - DECtalk utility routines.'MODULE DTK$UTIL (2 IDENT = '1-008' ! File: DTKUTIL.B32 Edit: TS1008 ) =BEGIN!M!****************************************************************************!* *M!* COPYRIGHT (c) 1978, 1980, 1982, 1984, 1985, 1986, 1987, 1988, 1990 BY *A!* DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS. *#!* ALL RIGHTS RESERVED. *!* *M!* THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED *M!* ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE *M!* INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER *M!* COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY *M!* OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY *!* TRANSFERRED. *!* *M!* THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE *M!* AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT *!* CORPORATION. *!* *M!* DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS *B!* SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. *!* *!* *M!****************************************************************************!!++! FACILITY: DECtalk management! ! ABSTRACT:!G! This module contains the utility routines needed for DECtalk support.!!2! ENVIRONMENT: User mode, Shared library routines.!0! AUTHOR: T. Scarpelli CREATION DATE: 6-Aug-1985!! MODIFIED BY:!M! 1-008 - Only check first few characters of DA_PRIMARY sequence for level 1 ! and level 3 DTC03's.E! Make sure $CANCEL has completed by calling $SYNCH. TS 6-Jan-1990@! 1-007 - Fix DTK$SPELL_TEXT for lowercase text. TS 26-May-1987L! 1-006 - Use second efn to fix timing problem on LAT lines. TS 17-Apr-1987:! 1-005 - Add timeout value to input QIOWs. TS 8-Oct-1986<! 1-004 - Add DTK$CHECK_HDWR_STATUS routine. TS 29-Aug-1986G! 1-003 - Fix timing problem in processing phone status. TS 9-Apr-19869! 1-002 - Add 4 sec timeout on all reads. TS 20-Nov-1985"! 1-001 - Original. TS 6-Aug-1985!-- %SBTTL 'Declarations'! ! SWITCHES:!! NONE! ! LINKAGES:!! NONE!! TABLE OF CONTENTS:!FORWARD ROUTINE! Public entry points> DTK$ANSWER_PHONE, ! Wait for phone to ring and answer it7 DTK$CHECK_HDWR_STATUS, ! Check the hardware status2 DTK$DIAL_PHONE, ! Dial a number on the phone* DTK$HANGUP_PHONE, ! Hangup the phone, DTK$INITIALIZE, ! Begin DECTalk access; DTK$LOAD_DICTIONARY, ! Define a word in the dictionary@ DTK$NOT_IMPLEMENTED, ! Generate a "Not Implemented" message$ DTK$OUTPUT, ! Output raw textB DTK$READ_KEYSTROKE, ! Read a key pressed on the phone keypad> DTK$READ_STRING, ! Read a series of keys from the keypad6 DTK$RETURN_LAST_INDEX, ! Return last index spoken/ DTK$RUN_SELF_TEST, ! Run local self-tests6 DTK$SET_INDEX, ! Place index in current positionA DTK$SET_KEYPAD_MODE, ! Turn on/off recognition of the keypad6 DTK$SET_LOGGING_MODE, ! Set or reset logging mode' DTK$SET_MODE, ! Set or reset mode3 DTK$SET_SPEECH_MODE, ! Turn speaking on or off8 DTK$SET_TERMINAL_MODE, ! Set or reset terminal mode9 DTK$SET_VOICE, ! Set speaking voice characteristics7 DTK$SPEAK_FILE, ! Send text from a file to device< DTK$SPEAK_PHONEMIC_TEXT, ! Send phonemic text to device4 DTK$SPEAK_TEXT, ! Send text to device to speak4 DTK$SPELL_TEXT, ! Send text to device to spell/ DTK$TERMINATE, ! Terminate DECTalk access! Private entry points2 DTK$$FLUSH_BUFFER, ! Flush the output buffer5 DTK$$GET_STATUS, ! Read status and keypad input. DTK$$GET_TERM_DATA, ! Retrieve a command$ DTK$$INPUT, ! Read characters+ DTK$$OUTPUT, ! Output text (buffered)E DTK$$SET_TERM_CHARACTERISTICS, ! Set the terminal characteristics2 DTK$$SETUP_TERMINAL_TYPE, ! Do terminal setup7 DTK$$SIM_AUTO, ! Simulate AUTOSTOP mode for DTC01* DTK$$VCB_EXIT_HANDLER, ! Exit handler OUTPUT; ! Output raw text!! INCLUDE FILES!9REQUIRE 'RTLIN:DTKPROLOG'; ! defines psects, macros, vcb0REQUIRE 'RTLIN:STRLNK'; ! defines JSB linkages! ! LITERALS!LITERAL! Self-test codes K_TST_POWER = 1, K_TST_HDATA = 2, K_TST_HCONTROL= 3, K_TST_DATA = 4, K_TST_SPEAK = 5, ! Phone codes K_STATUS = 0, K_ANSWER = 10, K_HANGUP = 11, K_KEYPAD_ON = 20, K_KEYPAD_OFF = 21, K_KEYPAD_AUTO = 22, K_TIMEOUT = 30, K_DIAL_TONE = 40, K_DIAL_PULSE = 41, K_WINK = 50, K_NOWINK = 51,! One parameter sequence codes K_STOP = 10, K_SYNC = 11, K_INDEX_QUERY = 22,! Two parameter sequence codes K_SPEAK = 12, K_INDEX = 20, K_PHONE = 60, K_MODE = 80, K_LOG = 81, K_TERMINAL = 82, K_MASK = 83, ! Misc values) K_DISABLE = 0, ! Disable speaking' K_ENABLE = 1, ! Enable speaking@ K_2_SECONDS = %X'00004100', ! 2.0 in floating point format@ K_TMO_SEC = 30, ! Input QIOW timeout value in seconds., K_TMO_HR = 3600, ! SPEAK_TEXT timeout? K_BUFFER_LEN = 128, ! Size of buffer for input operations, K_VT = 11, ! CTRL/K character+ K_SP = 32, ! Blank character, K_ESC = 27; ! Escape character! ! OWN STORAGE!OWN' DTK_A_ZONE_ID : LONG INITIAL (0),$ DTK_L_EFN : LONG INITIAL(0),& DTK_L_EFN_2 : LONG INITIAL(0),& DTK_L_EFN_MASK : LONG INITIAL(0),+ VCB_QUEUE : VOLATILE INITIAL (0);!+! Setup sequences!-#$DTK$DEFINE_SEQ(S7C1T, ' F', 0 );($DTK$DEFINE_SEQ(DA_PRIMARY, '[0c', 0 );%$DTK$DEFINE_SEQ(DTC01, '[?19c', 0 );$$DTK$DEFINE_SEQ(DTC03, '[?8', 0 );%$DTK$DEFINE_SEQ(DECSTR, '[!p', 0 );$$DTK$DEFINE_SEQ(DSREXT, '[n', 0 );($DTK$DEFINE_SEQ(DECTST, '[5;!ZLy', 0 );!+! Phone sequences!--$DTK$DEFINE_SEQ(DT_ANSWER, '60;10;!ZLz', 1 );+$DTK$DEFINE_SEQ(DT_DIAL, '60;!ZLz!AS', 1 );!+! Misc sequences!-+$DTK$DEFINE_SEQ(DT_DICT, '40z!AS !AS', 1 );&$DTK$DEFINE_SEQ(DT_MISC, '!ZLz', 1 );*$DTK$DEFINE_SEQ(DT_MISC2, '!ZL;!ZLz', 1 );)$DTK$DEFINE_SEQ(DT_PHOTEXT, '0z!AS', 1 );!! EXTERNAL REFERENCES!EXTERNAL ROUTINEN LIB$ANALYZE_SDESC_R2 : LIB$ANALYZE_SDESC_JSB_LINK, ! Analyze a string desc6 LIB$CREATE_VM_ZONE, ! Create a dynamic memory zone) LIB$CVT_DTB, ! Convert text to binary/ LIB$ESTABLISH, ! Establish a signal handler& LIB$FREE_VM, ! Free dynamic memory) LIB$GET_EF, ! Allocate an event flag* LIB$GET_VM, ! Allocate dynamic memory# LIB$SCOPY_R_DX, ! Copy a string5 LIB$SIG_TO_RET, ! Convert signal to return status3 LIB$WAIT, ! Wait a specified number of seconds, OTS$CVT_L_TU, ! Convert longword to text+ OTS$CVT_T_F, ! Convert text to floating% STR$CONCAT, ! Concat two stringsF STR$FIND_FIRST_IN_SET, ! Find first character in set of characters+ STR$FREE1_DX, ! Free one dynamic string/ STR$RIGHT, ! Copy rightmost part of string0 STR$UPCASE; ! Translate string to uppercaseEXTERNAL LITERAL< DTK$_BUSY, ! Phone number was dialed and line was busy.: DTK$_COMFAIL, ! A communications failure was detected.B DTK$_CONSEQERR, ! A control sequence malfunction was detected.3 DTK$_DECTSTFAI, ! A local self-test has failed.@ DTK$_ERRPHOTRA, ! Phonemic transcription error was detected.F DTK$_FATERRLIB, ! Fatal error - internal consistancy check failed.5 DTK$_FILTOOLON, ! File specification is too long.9 DTK$_INPBUFOVR, ! Input buffer overflow was detected.$ DTK$_INVARG, ! Invalid argument.5 DTK$_INVMODE, ! Invalid mode parameter specified.' DTK$_INVVOI_ID, ! Invalid voice id.A DTK$_NOANSWER, ! Phone number was dialed and no one answered.; DTK$_NODIATONE, ! No dial tone was found on phone line.< DTK$_NOMALFUN1, ! No malfunctions detected (first reply)G DTK$_NOMALFUN2, ! No malfunctions detected (second and later reply)2 DTK$_NOROOM, ! No room in dictionary for word.< DTK$_NOTLCLTRM, ! Output device is not a local terminal.# DTK$_NOTIMP, ! Not implemented.0 DTK$_NVROPRFAI, ! Last NVR operation failed.% DTK$_OFFHOOK, ! Phone is offhook.# DTK$_ONHOOK, ! Phone is onhook.9 DTK$_STRTERESC, ! Escape sequence imbedded in string.+ DTK$_TIMEOUT, ! A timeout has occurred.C DTK$_TOOLONG, ! A dictionary entry or phone number is too long.. DTK$_UNKESCSEQ, ! Unknown escape sequence.# DTK$_UNKREPLY, ! Unknown reply.9 DTK$_VOIALREXI, ! VCB already exists for this device.H DTK$_WINK, ! A wink was detected on the phone line (caller hungup).0 DTK$_WRONUMARG, ! Wrong number of arguments.. LIB$_EF_ALRFRE; ! Event flag already free. ! >%SBTTL 'DTK$ANSWER_PHONE - Wait for phone to ring and answer.'!GLOBAL ROUTINE DTK$ANSWER_PHONE ( VOICE_ID, NUM_RINGS, TEXT, TIMEOUT ) =!++! FUNCTIONAL DESCRIPTION:!?! This routine will wait for the phone connected to the DECtalk8! described by VOICE_ID to ring and will then answer it.!!! CALLING SEQUENCE:!4! ret_status.wlc.v = DTK$ANSWER_PHONE (VOICE_ID.rl.r! [,NUM_RINGS.rl.r]! [,TEXT.rt.dx]! [,TIMEOUT.rl.r])!! FORMAL PARAMETERS:!+! VOICE_ID.rl.r Voice id of DECtalk device!=! NUM_RINGS.rl.r [OPTIONAL] Number of rings to wait before ! answering the phone. ! Defaults to 1 ring.!8! TEXT.rt.dx [OPTIONAL] Text to speak after answering ! the phone. !=! TIMEOUT.rl.r [OPTIONAL] Number of seconds to wait for the! phone to be answered. !! IMPLICIT INPUTS:!! NONE!! IMPLICIT OUTPUTS:!! NONE!! COMPLETION STATUS:!)! SS$_NORMAL Normal successful completionT! SS$_xxxx Any error from QIOW$ ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.!I! SIDE EFFECTS:*!*=! The phone is answered when it rings and text may be spoken.!*!- BEGIN BUILTIN9 NULLPARAMETER;9 LOCAL6) STATUS, ! Status returned by routinesI RET_STATUS, ! Phone statusS0 RINGS : INITIAL(1), ! Number of rings to wait.9 VCB : REF $VCB_DECL; ! Address of voice control blockU? $DTK$VALIDATE_ARGCOUNT (1, 4); ! Test for right no. of argsA7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCB !+C ! Check for number of rings to wait before answering the phone. !-= IF NOT NULLPARAMETER(NUM_RINGS) THEN RINGS = ..NUM_RINGS;N !+@ ! Send answer phone sequence. Two replies will be recieved.5 ! First one indicates sequence has been recieved. . ! Second one indicates phone was answered. !-* $DTK$OUTPUT_DATA( DT_ANSWER, .RINGS );B STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_SEC) );. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);B IF .RET_STATUS NEQ DTK$_ONHOOK THEN $DTK$RETURN (.RET_STATUS);/ STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS,L" (IF NOT NULLPARAMETER(TIMEOUT) THEN .TIMEOUT ELSE 0) );*. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); !+< ! If the phone was answered, enable wink detection which1 ! will give us a status if the user hangs up.i !-# IF .RET_STATUS EQL DTK$_OFFHOOK THEN BEGIN !+e ! Enable the phone keypad. !-UD STATUS = DTK$SET_KEYPAD_MODE( .VOICE_ID, %REF(DTK$K_KEYPAD_AUTO) );6 IF .STATUS NEQ SS$_NORMAL THEN $DTK$RETURN (.STATUS); !+f? ! Wait two seconds for the caller to get the phone to his ear.  !-e* STATUS = LIB$WAIT( %REF( K_2_SECONDS ) );+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);S !+-& ! Enable wink detection if available. !-p) IF .VCB [VCB_B_DEVTYPE] NEQ DTK$K_DTC_01  THENi BEGIN VCB [VCB_V_WINK] = 0;3 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_WINK );-B STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_SEC));/ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);rD IF .RET_STATUS NEQ DTK$_OFFHOOK THEN $DTK$RETURN (.RET_STATUS); END;l !+s ! Speak any specified text. !- IF NOT NULLPARAMETER(TEXT) THEN BEGIN1 STATUS = DTK$SPEAK_TEXT( .VOICE_ID, .TEXT );/ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);g END;  END ELSE $DTK$RETURN (.RET_STATUS);d $DTK$RETURN (SS$_NORMAL); - END; ! End of routine DTK$ANSWER_PHONEO !t p?%SBTTL 'DTK$CHECK_HDWR_STATUS - Check DECtalk hardware status.'D&GLOBAL ROUTINE DTK$CHECK_HDWR_STATUS ( VOICE_ID, HDWR_STATUS ) =!++e! FUNCTIONAL DESCRIPTION:s!e.! This routine will check the DECtalk hardware?! described by VOICE_ID for hardware malfunctions (by using theTD! DSR extended escape sequence) and return the status to the caller.B! If more than one hardware malfunction has occurred, this routineC! can be called multiple times to retrieve all of the error status.n@! A status of "no malfunctions" also indicates that there are no&! further error status to be returned.!S!o! CALLING SEQUENCE:! ;! ret_status.wlc.v = DTK$CHECK_HDWR_STATUS (VOICE_ID.rl.r, ,! HDWR_STATUS.wl.r)! ! FORMAL PARAMETERS:! +! VOICE_ID.rl.r Voice id of DECtalk deviceC! ;! HDWR_STATUS.wl.r Status of DECtalk hardware. Values are: +! DTK$_NOMALFUN1 - no malfunctions, 1stP+! DTK$_NOMALFUN2 - no malfunctions, 2nde*! DTK$_COMFAIL - communication failure,! DTK$_INPBUFOVR - input buffer overflow+! DTK$_NVROPRFAI - NVR operation failed!+! DTK$_ERRPHOTRA - Phonemic trans error (! DTK$_CONSEQERR - control seq error(! DTK$_DECTSTFAI - self-test failed!R! IMPLICIT INPUTS:!n! NONE!T! IMPLICIT OUTPUTS: !r! NONE!a! COMPLETION STATUS:!R)! SS$_NORMAL Normal successful completion ! SS$_xxxx Any error from QIOW$R ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.4! LIB$_xxxx Any error from LIB$GET_VM or LIB$FREE_VM!t! SIDE EFFECTS:o!T! none!T!- E BEGIN, BUILTINr REMQUE; LOCALu) STATUS, ! Status returned by routinesE RET_STATUS, ! Hardware status9 STSQUE : REF $STSQUE_DECL, ! New entry from status queue : VCB : REF $VCB_DECL; ! Address of voice control block? $DTK$VALIDATE_ARGCOUNT (2, 2); ! Test for right no. of argsS7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCB 8 STATUS = REMQUE(.VCB[VCB_L_HDWR_STS_FLINK], STSQUE); IF .STATUS THEN !+ B ! Hardware status queue was empty. Send hardware status request. !-T BEGIN ! Queue was empty $DTK$OUTPUT_DATA( DSREXT );4 STATUS = DTK$$GET_STATUS(.VCB, 0, %REF(K_TMO_SEC));+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);5 STATUS = REMQUE(.VCB[VCB_L_HDWR_STS_FLINK], STSQUE);_- IF .STATUS THEN $DTK$RETURN(DTK$_FATERRLIB);c END; ! Queue was empty, .HDWR_STATUS = .STSQUE[STATUS_L_STATUS];E STATUS = LIB$FREE_VM(%REF(STSQUE_K_SIZE), STSQUE, DTK_A_ZONE_ID);8. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); $DTK$RETURN (SS$_NORMAL);k2 END; ! End of routine DTK$CHECK_HDWR_STATUS O-%SBTTL 'DTK$DIAL_PHONE - Dial the telephone.'oGLOBAL ROUTINE DTK$DIAL_PHONE ( VOICE_ID, PHONE_NUM,i MODE, TEXT, TIMEOUT ) =!++P! FUNCTIONAL DESCRIPTION:F!L?! This routine will dial the specified number on the telephone. ! !1! CALLING SEQUENCE:r! 3! ret_status.wlc.v = DTK$DIAL_PHONE (VOICE_ID.rl.r, ! PHONE_NUM.rt.dx! [,MODE.rl.r]T! [,TEXT.rt.dx]! [,TIMEOUT.rl.r])I!(! FORMAL PARAMETERS:! +! VOICE_ID.rl.r Voice id of DECtalk deviceI!I(! PHONE_NUM.rt.dx Phone number to dial.!,<! MODE.rl.r [OPTIONAL] Mode to use when dialing the phone.! Valid values are:3! DTK$K_DIAL_PULSE Use pulse dialing (default)I(! DTK$K_DIAL_TONE Use tone dialing![:! TEXT.rt.dx [OPTIONAL] Text to speak after the phone is! answered.!!=! TIMEOUT.rl.r [OPTIONAL] Number of seconds to wait for theE4! phone to be answered. For the DTC01, a wait of5! this number of seconds will always be done. ForD5! the DTC03, this is the maximum number of secondsc ! to wait.!D! IMPLICIT INPUTS:!'! NONE!,! IMPLICIT OUTPUTS:E!T! NONE!z! COMPLETION STATUS:!()! SS$_NORMAL Normal successful completion(! SS$_xxxx Any error from QIOW$ ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.(! DTK$_TOOLONG Phone number is too long.&! DTK$_INVMODE Invalid mode specified.(! DTK$_OFFHOOK Phone is offhook (active)(! DTK$_ONHOOK Phone is onhook (inactive)&! DTK$_NODIATONE No dial tone on line.! DTK$_BUSY Line is busy.o"! DTK$_NOANSWER No answer on line.!t! SIDE EFFECTS:E!M9! The phone number is dialed on the associated telephone.s9! If a call is currently active, the phone is not hungup.u!!- $ BEGINi BUILTINu NULLPARAMETER; LOCAL_) STATUS, ! Status returned by routines_+ RET_STATUS, ! Status returned by DECtalkCE DIAL_TYPE : INITIAL(DTK$K_DIAL_PULSE), ! Method of dialing the phoner3 PHONE_ADDR, ! Address of phone number descriptoro8 TOUT_FLOAT: LONG, ! TIMEOUT as a floating point number) TOUT_BUF : LONG, ! Buffer for TOUT_LENr; TOUT_DSC : $DTK$DESCRIPTOR ! Desc for TIMEOUT as a string PRESET(e# [DSC$B_DTYPE] = DSC$K_DTYPE_T,L# [DSC$B_CLASS] = DSC$K_CLASS_S,c [DSC$W_LENGTH] = 3,  [DSC$A_POINTER] = TOUT_BUF),w PHONE_DSC : $DTK$DESCRIPTOR,I TEXT_LEN : LONG INITIAL(0),d TEXT_ADDR,E7 VCB : REF $VCB_DECL; ! Address of voice control block ? $DTK$VALIDATE_ARGCOUNT (2, 5); ! Test for right no. of args.7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCB PHONE_ADDR = .PHONE_NUM; !+( ! Verify input parameters are valid. !-M IF NOT (STATUS = LIB$ANALYZE_SDESC_R2 ( .PHONE_NUM; TEXT_LEN, TEXT_ADDR))  THEN $DTK$RETURN ( .STATUS); !+2 ! Set up mode from parameter or default value. !-7 IF NOT NULLPARAMETER(MODE) THEN DIAL_TYPE = ..MODE;L !+; ! If a timeout value was specified, check its validity.o !-! IF NOT NULLPARAMETER(TIMEOUT)y THEN BEGIN IF ..TIMEOUT LSS 10 OR  ..TIMEOUT GTR 120  THEN  $DTK$RETURN (DTK$_INVARG);i !+ ! Initialize string descriptors !- 6 IF ..TIMEOUT LSS 100 THEN TOUT_DSC[DSC$W_LENGTH] = 2;* PHONE_DSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;* PHONE_DSC [DSC$B_CLASS] = DSC$K_CLASS_S;D PHONE_DSC [DSC$W_LENGTH] = 3 + .TOUT_DSC[DSC$W_LENGTH] + .TEXT_LEN; !+d) ! Convert TIMEOUT parameter to a string.o; ! This is then used as part of the phone number (DTC03) ors@ ! is converted to floating point for use with LIB$WAIT (DTC01). !-I, STATUS = OTS$CVT_L_TU(.TIMEOUT, TOUT_DSC );+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);l !+l4 ! If TIMEOUT is requested and this is a DTC03, add 1 ! the necessary X<> command to the phone number.f !-) IF .VCB [VCB_B_DEVTYPE] NEQ DTK$K_DTC_01- THENo BEGIN !+w< ! Allocate some dynamic memory to hold the phone number" ! and the timeout characters. !-I; STATUS = LIB$GET_VM( %REF( .PHONE_DSC[DSC$W_LENGTH] ),c PHONE_DSC[DSC$A_POINTER], DTK_A_ZONE_ID );n/ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);U !+F ! Copy the phone number and the timeout command in one operation. !-]- CH$COPY( .TEXT_LEN, .TEXT_ADDR, ! Fromr 2, UPLIT('X<'), ! From0 .TOUT_DSC[DSC$W_LENGTH], TOUT_BUF, ! From 1, UPLIT('>'), ! From  0, ! Fill B .PHONE_DSC[DSC$W_LENGTH], .PHONE_DSC[DSC$A_POINTER] ); ! To PHONE_ADDR = PHONE_DSC; END; ! DTC03% END; ! TIMEOUT parameter specified !+= ! Send sequence to dial phone with pluse or tone dialing.p !- SELECTONE .DIAL_TYPE OFI SET [DTK$K_DIAL_PULSE]:T BEGIN8 $DTK$OUTPUT_DATA( DT_DIAL, K_DIAL_PULSE, .PHONE_ADDR ); END;c [DTK$K_DIAL_TONE]: BEGIN7 $DTK$OUTPUT_DATA( DT_DIAL, K_DIAL_TONE, .PHONE_ADDR );T END;U [OTHERWISE]: $DTK$RETURN (DTK$_INVMODE); TES; !+ ! If TIMEOUT: - ! deallocate virtual memory if DTC03. 1 ! wait specified amount of time if DTC01.A !-! IF NOT NULLPARAMETER(TIMEOUT)I THEN* IF .VCB [VCB_B_DEVTYPE] EQL DTK$K_DTC_01  THENb BEGINB STATUS = OTS$CVT_T_F( TOUT_DSC, TOUT_FLOAT, 0, 0, %REF(17) );% STATUS = LIB$WAIT( TOUT_FLOAT );s/ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);E END ELSEd BEGIN< STATUS = LIB$FREE_VM( %REF( .PHONE_DSC[DSC$W_LENGTH] ), PHONE_DSC[DSC$A_POINTER],F DTK_A_ZONE_ID );/ IF NOT .STATUS THEN $DTK$RETURN (.STATUS); END;h !+& ! Wait for phone to be answered.  !-A STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_HR) );s. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);C IF .RET_STATUS NEQ DTK$_OFFHOOK THEN $DTK$RETURN (.RET_STATUS);_ VCB [VCB_V_KEYPAD_ON] = 0; VCB [VCB_V_AUTOSTOP] = 0; VCB [VCB_V_WINK] = 0; !+@ ! Wait 2 seconds for the user to get the phone to their ear. !-- STATUS = LIB$WAIT( %REF( K_2_SECONDS ) );. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); !+ ! Enable the phone keypad. !-G STATUS = DTK$SET_KEYPAD_MODE( .VOICE_ID, %REF(DTK$K_KEYPAD_AUTO) );s9 IF .STATUS NEQ SS$_NORMAL THEN $DTK$RETURN (.STATUS);E !+) ! Enable wink detection if available.  !-, IF .VCB [VCB_B_DEVTYPE] NEQ DTK$K_DTC_01 THEN BEGIN/ $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_WINK );T> STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_SEC));+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);S@ IF .RET_STATUS NEQ DTK$_OFFHOOK THEN $DTK$RETURN (.RET_STATUS); END;( !+ ! Speak any specified text.n !- IF NOT NULLPARAMETER(TEXT) THEN BEGIN- STATUS = DTK$SPEAK_TEXT( .VOICE_ID, .TEXT );I+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);P END;_ $DTK$RETURN (SS$_NORMAL);T+ END; ! End of routine DTK$DIAL_PHONE !U H-%SBTTL 'DTK$HANGUP_PHONE - Hangup the phone.' !GLOBAL ROUTINE DTK$HANGUP_PHONE (. VOICE_ID, TEXT  ) =!++s! FUNCTIONAL DESCRIPTION:x!H! This routine will speak an optional message and then hangup the phone.!P!_! CALLING SEQUENCE:T!4! ret_status.wlc.v = DTK$HANGUP_PHONE (VOICE_ID.rl.r! [,TEXT.rt.dx])!T! FORMAL PARAMETERS:!+! VOICE_ID.rl.r Voice id of DECtalk device ! <! TEXT.rt.dx [OPTIONAL] Text to be spoken before hanging .! up the phone. Text will be followed-! by a sync command to make sure all(,! text is spoken before hanging up.!I! IMPLICIT INPUTS:!! NONE!i! IMPLICIT OUTPUTS:t! ! NONE! ! COMPLETION STATUS:! )! SS$_NORMAL Normal successful completion ! SS$_xxxx Any error from QIOW$u ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.! ! SIDE EFFECTS:a!e7! The phone is hungup after speaking any optional text.s!!- t BEGINa BUILTINo NULLPARAMETER;h LOCAL ) STATUS, ! Status returned by routineso RET_STATUS, ! Phone statuse7 VCB : REF $VCB_DECL; ! Address of voice control block? $DTK$VALIDATE_ARGCOUNT (1, 2); ! Test for right no. of argsD7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBr !+- ! Speak text before hanging up the phone.M !- IF NOT NULLPARAMETER(TEXT) THEN BEGIN? STATUS = DTK$SPEAK_TEXT( .VOICE_ID, .TEXT, %REF(DTK$K_WAIT) ); + IF NOT .STATUS THEN $DTK$RETURN (.STATUS);  END;N !+ ! Hang up phone. !-4 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_HANGUP );A STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_SEC));R. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);B IF .RET_STATUS NEQ DTK$_ONHOOK THEN $DTK$RETURN (.RET_STATUS); VCB [VCB_V_WINK] = 0;  !+* ! Free the keypad input buffer string. !- IF .VCB[VCB_W_LENGTH] NEQ 0e THEN BEGIN LIB$ESTABLISH(LIB$SIG_TO_RET);V. STATUS = STR$FREE1_DX(VCB[VCB_Q_INPUT_DESC]);+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);M END;  $DTK$RETURN (SS$_NORMAL);t- END; ! End of routine DTK$HANGUP_PHONEt !E S-%SBTTL 'DTK$INITIALIZE - Initialize DECtalk.'BGLOBAL ROUTINE DTK$INITIALIZE (f NEW_VID, OUT_DEVICE,K DEVICE_TYPET ) =!!++ ! FUNCTIONAL DESCRIPTION: !KG! This routine creates a DECtalk device -- returning its assignedV5! voice_id. OUT_DEVICE is the device upon which this >! DECtalk is to be written. If not supplied, output will flow! to SYS$OUTPUT.!!9! If called upon to create a 2nd DECtalk on a device thatR=! already has a voice_id associated with it, we simply return:! the id of the already-existing DECtalk and the qualified! success DTK$_VOIALREXI.I!,! CALLING SEQUENCE:U!H,! ret_status.wlc.v = DTK$INITIALIZE ( ! NEW_VOID.wl.r, ! OUT_DEVICE.rt.dxE! [,DEVICE_TYPE.ml.r])T!S! FORMAL PARAMETERS:!E=! NEW_VOID.wl.r Voice-id of newly-created DECtalk.K!T!! OUT_DEVICE.rt.dx This parameterS)! is the file specification or logicale*! name upon which the output associated'! with this DECtalk will be written.R!I>! DEVICE_TYPE.ml.r [Optional]. If specified, the DECtalk type1! is returned. DTK$K_DTC_01 for DECtalk I and5! DTK$K_DTC_03 for DECtalk III. DTK$K_DTC_UNKNOWNe-! if no response from DECtalk is reciev6~ DTKVAX.SAVD?4>A[DIETER.DTKVAX]DTKUTIL.B32;1P |4ed.!e! IMPLICIT INPUTS:!A ! NONE!.! IMPLICIT OUTPUTS:E!M ! NONE![! COMPLETION STATUS:!T4! SS$_NORMAL Normal successful completion!! SS$_xxxx Any error from $GETDVIi!! RMS$_xxxx Any error from $PARSEN3! LIB$_xxxx Any error from LIB$GET_VM or LIB$GET_EF[N! LIB$_INSVIRMEM Insufficient virtual memory to allocate needed buffer.7! DTK$_VOIALREXI DECtalk already exists for this device_2! DTK$_WRONUMARG Wrong number of arguments.!A! SIDE EFFECTS: !e ! NONE!--  s BEGIN BUILTIN  NULLPARAMETER;r LOCALo8 NAME_DESC : $DTK$DESCRIPTOR, ! Fixed length descriptor) STATUS, ! Status returned by routinesl+ IOSB : VECTOR[4,WORD], ! IOSB for $QIOWi6 FS_LEN : LONG INITIAL(0), ! Length of device name$ FS_ADDR, ! Address of device name> BUFFER : VECTOR [K_BUFFER_LEN, BYTE], ! Input buffer A BUFFER_LEN : LONG INITIAL(0), ! Number of chars read into BUFFERI/ SEARCH_VCB : REF $VCB_DECL, ! Next VCB in listOL VCB : REF $VCB_DECL; ! Address of voice control block being created.? $DTK$VALIDATE_ARGCOUNT (2, 3); ! Test for right no. of argsh!+2! Decide what device is to receive the the output.!-J IF NOT (STATUS = LIB$ANALYZE_SDESC_R2 ( .OUT_DEVICE; FS_LEN, FS_ADDR)) THEN RETURN (.STATUS);!+>! Create the dynamic memory zone if none has been created yet.!- IF .DTK_A_ZONE_ID EQL 0t THEN BEGIN3 STATUS = LIB$CREATE_VM_ZONE( DTK_A_ZONE_ID," %REF(LIB$K_VM_FIRST_FIT), 0,t' %REF(LIB$M_VM_BOUNDARY_TAGS OR! LIB$M_VM_EXTEND_AREA) );A& IF NOT .STATUS THEN RETURN (.STATUS); END;i!+<! Get the event flag number if it has not been done already.!- IF .DTK_L_EFN EQL 0E THEN BEGIN" STATUS = LIB$GET_EF( DTK_L_EFN );' IF NOT .STATUS THEN RETURN (.STATUS); C$ STATUS = LIB$GET_EF( DTK_L_EFN_2 );' IF NOT .STATUS THEN RETURN (.STATUS); KC DTK_L_EFN_MASK = 1 ^ (.DTK_L_EFN - 32) OR 1 ^ (.DTK_L_EFN_2 - 32);3 END;S!+'! Create a VCB. Allocate buffers, etc.E;! Extract the necessary device attributes and store in VCB.B!-( STATUS = DTK$$SETUP_TERMINAL_TYPE (  .FS_ADDR, ! filespec addrU .FS_LEN, ! Len of filespec0 VCB); ! Address to receive address of VCB) IF NOT .STATUS THEN RETURN (.STATUS);;!+3! If the device is not a terminal, return an error.-!-H IF .VCB[VCB_B_CLASS] NEQ DC$_TERM THEN $DTK$RETURN (DTK$_NOTLCLTRM);!+B! Loop thru all current VCBs looking for a match. If found, this K! device has been already allocated. Return an "already allocated" status.L!- SEARCH_VCB = .VCB_QUEUE; WHILE .SEARCH_VCB NEQ 0 DOD IF CH$EQL( .SEARCH_VCB[VCB_W_DEVNAM_LEN], SEARCH_VCB[VCB_T_DEVNAM],3 .VCB[VCB_W_DEVNAM_LEN], VCB[VCB_T_DEVNAM] )U THEN2 BEGINC STATUS = LIB$FREE_VM( %REF (VCB_K_SIZE), VCB, DTK_A_ZONE_ID );p/ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);[" $DTK$RETURN (DTK$_VOIALREXI); END ELSE$* SEARCH_VCB = .SEARCH_VCB[VCB_A_NEXT];!+!! Insert this VCB into the queue. !-! VCB[VCB_A_NEXT] = .VCB_QUEUE; VCB_QUEUE = .VCB;T!+#! Store voice-id in the VCB itself.s!- VCB [VCB_L_VID] = .VCB;0!+&! Return the new DECtalk id to caller.!- .NEW_VID = .VCB;!+C! Store the original name (that the user specified) for this device$I! in the VCB. This name may include a filename as well as a device name.C6! First we allocate virtual memory for this buffer andG! then we store the length and address in the VCB for future reference.G!-K STATUS = LIB$GET_VM( %REF(.FS_LEN), VCB[VCB_A_OUTNAM], DTK_A_ZONE_ID );!. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);$ VCB[VCB_W_OUTNAM_LEN] = .FS_LEN;3 CH$MOVE( .FS_LEN,.FS_ADDR,.VCB[VCB_A_OUTNAM] );D!+=! Create a fixed length descriptor for our device name string! for use by $ASSIGN.h!-- NAME_DESC[DSC$B_DTYPE] = DSC$K_DTYPE_T;o- NAME_DESC[DSC$B_CLASS] = DSC$K_CLASS_S;T6 NAME_DESC[DSC$W_LENGTH] = .VCB[VCB_W_DEVNAM_LEN];2 NAME_DESC[DSC$A_POINTER] = VCB[VCB_T_DEVNAM];!+! Assign the channel. 6! Put the resulting channel number in VCB[VCB_W_CHAN].!- IF .VCB[VCB_W_CHAN] EQL 0  THEN BEGIN& STATUS = $ASSIGN( DEVNAM = NAME_DESC, CHAN = VCB[VCB_W_CHAN] );+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);p END; !+K! The following line was added to solve a TTDRIVER problem. When the first_I! output is done to the channel, no typeahead buffer has been set up yet.L! This results in the first character of the DA_PRIMARY response being lost.G! This only happens on high speed lines. The following line causes theON! driver to set up a typeahead buffer before we do the first output operation.L! This must not be done on LAT lines however, since LAT needs a write as the?! first operation. If this is a LAT line, connect to the port.T!-O IF CH$FAIL(CH$FIND_SUB(.NAME_DESC[DSC$W_LENGTH], .NAME_DESC[DSC$A_POINTER],_ 2, UPLIT('LT'))) THEN' $QIOW( CHAN = .VCB[VCB_W_CHAN],  EFN = .DTK_L_EFN,$8 FUNC = IO$_READVBLK OR IO$M_ESCAPE OR IO$M_TIMED OR3 IO$M_NOECHO OR IO$M_TRMNOECHO OR IO$M_PURGE,  IOSB = IOSB, P1 = BUFFER, P2 = K_BUFFER_LEN, P3 = 0)  ELSE BEGIN) STATUS = $QIOW( CHAN = .VCB[VCB_W_CHAN], EFN = .DTK_L_EFN,* FUNC = IO$_TTY_PORT OR IO$M_LT_CONNECT, IOSB = IOSB);, IF NOT .STATUS THEN $DTK$RETURN (.STATUS);- IF NOT .IOSB[0] THEN $DTK$RETURN (.IOSB[0]);E END;S!+(! Change the terminal characteristics to/! NOBROADCAST no broadcast messages are spoken,B*! TTSYNC CTRL/S and CTRL/Q work correctly,B! ANSICRT escape sequences are interperted by the terminal driver.=! NOWRAP don't generate an extra at the end of the line.N!-0 STATUS = DTK$$SET_TERM_CHARACTERISTICS(.VCB,' TT$M_NOBRDCST OR TT$M_TTSYNC, ! on. TT2$M_ANSICRT, ! on TT$M_WRAP ); ! off,. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);!+:! Set up our exit block which is contained within the VCB.:! This exit block is used to establish an exit handler for1! this terminal. When the exit handler is called,$G! it will flush the output buffers, reset the terminal characteristics,.%! and make sure the phone is hung up. K! This guarantees that the user will get all his output and the device willE+! be left in the same state as we found it. !-2 VCB [VCB_A_EXIT_ADDR] = DTK$$VCB_EXIT_HANDLER;" ! Address of our exit handlerD VCB [VCB_B_EXIT_ARGCNT] = 2; ! Our exit handler gets called with ! two arguments.)3 VCB [VCB_A_EXIT_RSN] = VCB [VCB_L_EXIT_REASON];N( ! The first argument is the address% ! of the longword to receive theO* ! exit reason. This longword appears# ! elsewhere in the VCB (not in ! the exit block).LE VCB [VCB_A_EXIT_VCB] = .VCB; ! The second argument is the addressh# ! of this VCB. This is neededN& ! because there are many VCBs and( ! one exit routine serves them all.) ! There is a separate exit block for ! each VCB.!+@! Establish the exit handler, using the exit block just created.!-7 STATUS = $DCLEXH( DESBLK = VCB[VCB_R_EXIT_BLOCK] ); . IF NOT .STATUS THEN $DTK$RETURN (.STATUS);!+A! Setup our status queues and the keypad input string descriptor.P!-8 VCB [VCB_L_STATUS_FLINK] = VCB [VCB_L_STATUS_FLINK];8 VCB [VCB_L_STATUS_BLINK] = VCB [VCB_L_STATUS_FLINK];< VCB [VCB_L_HDWR_STS_FLINK] = VCB [VCB_L_HDWR_STS_FLINK];< VCB [VCB_L_HDWR_STS_BLINK] = VCB [VCB_L_HDWR_STS_FLINK];& VCB [VCB_B_CLASS] = DSC$K_CLASS_D;& VCB [VCB_B_DTYPE] = DSC$K_DTYPE_T;!+(! Determine if this is a DTC01 or DTC03.!-1 $DTK$BUFFERING_ON(VCB); ! Turn on bufferingu. $DTK$OUTPUT_DATA( DECSTR ); ! soft reset. $DTK$OUTPUT_DATA( S7C1T ); ! 7 bit codes7 $DTK$OUTPUT_DATA( DT_MISC2, K_MASK, 0 ); ! mask off ? $DTK$OUTPUT_DATA( DA_PRIMARY ); ! request type of terminalr3 $DTK$BUFFERING_OFF(VCB); ! Turn off bufferinge!+C! Read back the sequence that tells us what type of device this is.T@! Use a timeout so we don't hang if the device does not respond.!-E STATUS = DTK$$INPUT( .VCB, BUFFER_LEN, BUFFER, %REF(K_TMO_SEC) ); 6 IF CH$EQL(K_DTC01_LEN, DTC01, K_DTC01_LEN, BUFFER) THEN$ VCB [VCB_B_DEVTYPE] = DTK$K_DTC_01;6 IF CH$EQL(K_DTC03_LEN, DTC03, K_DTC03_LEN, BUFFER) THEN$ VCB [VCB_B_DEVTYPE] = DTK$K_DTC_03; IF .STATUS EQL SS$_TIMEOUT THEN) VCB [VCB_B_DEVTYPE] = DTK$K_DTC_UNKNOWN;k!+#! Return type to user if requested.FG! If user requested a specific device type, force that type to be used._!-% IF NOT NULLPARAMETER(DEVICE_TYPE)P THEN IF ..DEVICE_TYPE NEQ 0T THENN( VCB [VCB_B_DEVTYPE] = ..DEVICE_TYPE ELSER) .DEVICE_TYPE = .VCB [VCB_B_DEVTYPE];H!+%! Return the new DECtalk id to caller$!- .NEW_VID = .VCB; $DTK$RETURN (.STATUS);# END; ! Routine DTK$INITIALIZEI !E PG%SBTTL 'DTK$LOAD_DICTIONARY - Load a word into the DECtalk dictionary.'c$GLOBAL ROUTINE DTK$LOAD_DICTIONARY ( VOICE_ID, TEXT, SUBSTITUTIONC ) =!++c! FUNCTIONAL DESCRIPTION:l!s=! This routine will load a phonemic definition of a word intoT! the DECtalk dictionary.t!r!e! CALLING SEQUENCE:e!e9! ret_status.wlc.v = DTK$LOAD_DICTIONARY (VOICE_ID.rl.r, p! TEXT.rt.dx,! SUBSTITUTION.rt.dx)!k! FORMAL PARAMETERS:!c+! VOICE_ID.rl.r Voice id of DECtalk deviceU!H.! TEXT.rt.dx Word to load into the dictionary! 1! SUBSTITUTION.rt.dx Phonemic definition for WORDV!_! IMPLICIT INPUTS:!M! NONE!R! IMPLICIT OUTPUTS:O!w! NONE!i! COMPLETION STATUS:!C)! SS$_NORMAL Normal successful completione,! DTK$_WRONUMARG Wrong number of arguements. ! DTK$_INVVOIID Invalid voice id3! DTK$_NOROOM No room in dictionary to add the word)! DTK$_TOOLON Word definition is too longi!d! SIDE EFFECTS:e! 9! The specified word is stored in the DECtalk dictionary.K!C!--o E BEGIN LOCALN) STATUS, ! Status returned by routinese" RET_STATUS, ! Dictionary status% TEXT_LEN : LONG INITIAL(0), ! LengthE TEXT_ADDR, ! Address 7 VCB : REF $VCB_DECL; ! Address of voice control blockc? $DTK$VALIDATE_ARGCOUNT (3, 3); ! Test for right no. of args 7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBT !+4 ! Verify input parameters are valid descriptors. !-P IF NOT (STATUS = LIB$ANALYZE_SDESC_R2 ( .SUBSTITUTION; TEXT_LEN, TEXT_ADDR)) THEN $DTK$RETURN (.STATUS);bJ IF NOT (STATUS = LIB$ANALYZE_SDESC_R2 ( .TEXT; TEXT_LEN, TEXT_ADDR ) ) THEN $DTK$RETURN (.STATUS); !+. ! Send word definition sequence to DECtalk ! and get returned status. !-6 $DTK$OUTPUT_DATA( DT_DICT, .TEXT, .SUBSTITUTION );A STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_SEC));R. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); $DTK$RETURN (.RET_STATUS);0 END; ! End of routine DTK$LOAD_DICTIONARY !n B7%SBTTL 'DTK$NOT_IMPLEMENTED - For adding new routines.'$GLOBAL ROUTINE DTK$NOT_IMPLEMENTED =!++o! FUNCTIONAL DESCRIPTION:a!.6! This routine returns a NOT_IMPLEMENTED error status.! ! CALLING SEQUENCE:i!w2! ret_status.wlc.v = DTK$NOT_IMPLEMENTED ( )!T! FORMAL PARAMETERS:!E! None!T! IMPLICIT INPUTS:!R ! None!T! IMPLICIT OUTPUTS:!r ! None!m! COMPLETION STATUS:!e&! DTK$_NOTIMP Routine not implemented! ! SIDE EFFECTS:!G ! NONE!--= BEGIN_ RETURN (DTK$_NOTIMP); / END; ! End of routine DTK$NOT_IMPLEMENTED !M U&%SBTTL 'DTK$OUTPUT - Output raw text.'GLOBAL ROUTINE DTK$OUTPUT( VOICE_ID, TEXTS ) =!++! FUNCTIONAL DESCRIPTION:m! :! This routine will output the specified text without any 2! parsing. This is for internal DIGITAL use only!:! DTK$SPEAK_TEXT is the general routine and should be used! instead of this one.!;!I! CALLING SEQUENCE:T! /! ret_status.wlc.v = DTK$OUTPUT (VOICE_ID.rl.r, ! TEXT.rt.dx)2!3! FORMAL PARAMETERS:!r+! VOICE_ID.rl.r Voice id of DECtalk devicec!h! TEXT.rt.dx Text to output.n!t! IMPLICIT INPUTS:!T! NONE!$! IMPLICIT OUTPUTS: ! ! NONE! ! COMPLETION STATUS:!_)! SS$_NORMAL Normal successful completionA! SS$_xxxx Any error from QIOW$ ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.!a! SIDE EFFECTS:r!! The specified text is output.Q!$!- H BEGINU LOCALC) STATUS, ! Status returned by routinesl TEXT_LEN : LONG INITIAL(0), TEXT_ADDR,i7 VCB : REF $VCB_DECL; ! Address of voice control blockt? $DTK$VALIDATE_ARGCOUNT (2, 2); ! Test for right no. of argsC7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCB, !+( ! Verify input parameters are valid. !-H IF NOT (STATUS = LIB$ANALYZE_SDESC_R2 ( .TEXT; TEXT_LEN, TEXT_ADDR)) THEN $DTK$RETURN (.STATUS);8 STATUS = DTK$$OUTPUT( .VCB, .TEXT_LEN, .TEXT_ADDR );. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); $DTK$RETURN (SS$_NORMAL);E' END; ! End of routine DTK$OUTPUTe !  [?%SBTTL 'DTK$READ_KEYSTROKE - Read a key entered on the keypad.' #GLOBAL ROUTINE DTK$READ_KEYSTROKE ( VOICE_ID, KEY_CODE, PROMPT, TIMEOUT ) =!++k! FUNCTIONAL DESCRIPTION:N!V:! This routine will read a key entered on the phone keypad-! after speaking any optional prompt message. !e!y! CALLING SEQUENCE:s!l9! ret_status.wlc.v = DTK$READ_KEYSTROKE (VOICE_ID.rl.r, r! KEY_CODE.wl.r! [,PROMPT.rt.dx]! [,TIMEOUT.rl.r]) !u! FORMAL PARAMETERS:! +! VOICE_ID.rl.r Voice id of DECtalk device_!N4! KEY_CODE.wl.r DTK$K_TRM_xxxx code for key entered!R?! PROMPT.rt.dx Optional text to speak before waiting for input(!S<! TIMEOUT.rl.r Optional number of seconds to wait for input!t! IMPLICIT INPUTS:!v! NONE!r! IMPLICIT OUTPUTS:S!N! NONE! ! COMPLETION STATUS:! )! SS$_NORMAL Normal successful completionS! SS$_xxxx Any error from QIOW$D ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.)! DTK$_ONHOOK Phone is onhook (inactive).l ! DTK$_WINK A wink has occurred.!r! SIDE EFFECTS:N!.! The key entered on the phone keypad is read.!G!--S U BEGIN( BUILTIND TESTBITSC,A NULLPARAMETER;H LOCALO) STATUS, ! Status returned by routinesD RET_STATUS, ! Phone statusw7 VCB : REF $VCB_DECL; ! Address of voice control block ? $DTK$VALIDATE_ARGCOUNT (2, 4); ! Test for right no. of argsy7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBM !+* ! Check to see if a WINK has occurred. !-@ IF TESTBITSC(VCB [VCB_V_WINK]) THEN $DTK$RETURN (DTK$_WINK); !++ ! Send phone status sequence to DECtalks, ! to be sure the phone is still offhook. !-4 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_STATUS );B STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_SEC) );. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);C IF .RET_STATUS NEQ DTK$_OFFHOOK THEN $DTK$RETURN (.RET_STATUS);] !+. ! If keypad is not enabled, enable it now. !- IF NOT .VCB[VCB_V_KEYPAD_ON] THEN BEGIND STATUS = DTK$SET_KEYPAD_MODE( .VOICE_ID, %REF(DTK$K_KEYPAD_AUTO) );6 IF .STATUS NEQ SS$_NORMAL THEN $DTK$RETURN (.STATUS); END;B !+. ! If a prompt was specified, speak it now. !- IF NOT NULLPARAMETER(PROMPT) THEN BEGIN/ STATUS = DTK$SPEAK_TEXT( .VOICE_ID, .PROMPT ); + IF NOT .STATUS THEN $DTK$RETURN (.STATUS);n END;t !+ ! Get users keypad input. o !- IF .VCB [VCB_W_LENGTH] NEQ 0 THEN RET_STATUS = SS$_NORMAL ELSE$ RET_STATUS = DTK$$GET_STATUS( .VCB, 0,( (IF NOT NULLPARAMETER(TIMEOUT)# THEN .TIMEOUT ELSE 0) );T !+2 ! If this is a DECtalk I, we need to simulate - ! AUTOSTOP mode if the user specified it.n1 IF (.VCB[VCB_B_DEVTYPE] EQL DTK$K_DTC_01) AND  .VCB[VCB_V_AUTOSTOP] THEN BEGIN% $DTK$OUTPUT_DATA( DT_MISC, K_STOP );h' VCB [VCB_B_SPEECH_MODES] = DTK$K_HALT;b END;  !+* ! Check to see if a WINK has occurred. !-@ IF TESTBITSC(VCB [VCB_V_WINK]) THEN $DTK$RETURN (DTK$_WINK); !+ ! Return the key entered.s !-" IF .RET_STATUS EQL SS$_TIMEOUT THEN .KEY_CODE = DTK$K_TRM_TIMEOUT ELSE+ .KEY_CODE = CH$RCHAR(.VCB[VCB_A_POINTER]);  !+< ! Remove the first character in the keypad input string. !-" LIB$ESTABLISH(LIB$SIG_TO_RET);P STATUS = STR$RIGHT( VCB[VCB_Q_INPUT_DESC], VCB[VCB_Q_INPUT_DESC], %REF(2) );- IF NOT .STATUS THEN $DTK$RETURN(.STATUS);t !+ ! Done.s !- $DTK$RETURN (.RET_STATUS);. END; ! End of routine DTK$READ_KEYSTROKE !  I%SBTTL 'DTK$READ_STRING - Read a sequence of keys entered on the keypad.'T GLOBAL ROUTINE DTK$READ_STRING ( VOICE_ID, OUT_STRING, PROMPT, TIMEOUT,b TERM_CODE ) =!++s! FUNCTIONAL DESCRIPTION:n!eE! This routine will read a series of keys entered on the phone keypad -! after speaking any optional prompt message. ! !t! CALLING SEQUENCE:!5! ret_status.wlc.v = DTK$READ_STRING (VOICE_ID.rl.r, )! OUT_STRING.wt.dx! [,PROMPT.rt.dx]+! [,TIMEOUT.rl.r] ! [,KEY_CODE.wl.r])e!i! FORMAL PARAMETERS:!B+! VOICE_ID.rl.r Voice id of DECtalk device! @! OUT_STRING.wt.dx String into which is written the keys pressed!L9! PROMPT.rt.dx [OPTIONAL] Text to speak before waiting B! for input!=?! TIMEOUT.rl.r [OPTIONAL] Number of seconds to wait for inputS!;A! TERM_CODE.wl.r [OPTIONAL] DTK$K_TRM_xxxx code for terminating ! key entered..!-! IMPLICIT INPUTS:!O! NONE! ! IMPLICIT OUTPUTS:! ! NONE!_! COMPLETION STATUS:!r)! SS$_NORMAL Normal successful completionb! SS$_xxxx Any error from QIOW$T ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.)! DTK$_ONHOOK Phone is onhook (inactive).F ! DTK$_WINK A wink has occurred.!! SIDE EFFECTS:e!n7! A series of keys entered on the phone keypad is read.i!u!--w o BEGIN BUILTIN TESTBITSC, NULLPARAMETER;= LOCAL.; TERM_SET : $DTK$DESCRIPTOR ! Descriptor for terminator set( PRESET(# [DSC$B_CLASS] = DSC$K_CLASS_S,# [DSC$B_DTYPE] = DSC$K_DTYPE_T, [DSC$W_LENGTH] = 2,E/ [DSC$A_POINTER] = UPLIT(BYTE(%C'*',%C'#'))),C) STATUS, ! Status returned by routinesT RET_STATUS, ! Phone statusV8 TERM_CHAR_POS : WORD, ! Terminating character position5 LEN : LONG INITIAL(0), ! Length of sequence enteredf7 VCB : REF $VCB_DECL; ! Address of voice control blockF? $DTK$VALIDATE_ARGCOUNT (2, 5); ! Test for right no. of argsT7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBR$ LIB$ESTABLISH( LIB$SIG_TO_RET ); !+* ! Check to see if a WINK has occurred. !-@ IF TESTBITSC(VCB [VCB_V_WINK]) THEN $DTK$RETURN (DTK$_WINK); !++ ! Send phone status sequence to DECtalkD, ! to be sure the phone is still offhook. !-4 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_STATUS );B STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_SEC) );. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);C IF .RET_STATUS NEQ DTK$_OFFHOOK THEN $DTK$RETURN (.RET_STATUS); !+. ! If keypad is not enabled, enable it now. !- IF NOT .VCB[VCB_V_KEYPAD_ON] THEN BEGIND STATUS = DTK$SET_KEYPAD_MODE( .VOICE_ID, %REF(DTK$K_KEYPAD_AUTO) );6 IF .STATUS NEQ SS$_NORMAL THEN $DTK$RETURN (.STATUS); END;U !+. ! If a prompt was specified, speak it now. !- IF NOT NULLPARAMETER(PROMPT) THEN BEGIN/ STATUS = DTK$SPEAK_TEXT( .VOICE_ID, .PROMPT );c+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);m END;a !+ ! Get users keypad input. d !- RET_STATUS = SS$_NORMAL;K TERM_CHAR_POS = STR$FIND_FIRST_IN_SET(VCB[VCB_Q_INPUT_DESC], TERM_SET);e! WHILE .TERM_CHAR_POS EQL 0 DOi BEGIN$ RET_STATUS = DTK$$GET_STATUS( .VCB, 0,( (IF NOT NULLPARAMETER(TIMEOUT)# THEN .TIMEOUT ELSE 0) );t. IF .RET_STATUS EQL SS$_TIMEOUT THEN EXITLOOP;$ IF .VCB [VCB_V_WINK] THEN EXITLOOP;2 IF NOT .RET_STATUS THEN $DTK$RETURN(.RET_STATUS);H TERM_CHAR_POS = STR$FIND_FIRST_IN_SET(VCB[VCB_Q_INPUT_DESC], TERM_SET); END;, !+B ! If this is a DECtalk I, we need to simulate AUTOSTOP mode if ! the user specified it. !-1 IF (.VCB[VCB_B_DEVTYPE] EQL DTK$K_DTC_01) ANDE .VCB[VCB_V_AUTOSTOP]N THEN BEGIN% $DTK$OUTPUT_DATA( DT_MISC, K_STOP );A' VCB [VCB_B_SPEECH_MODES] = DTK$K_HALT;R END;  !+* ! Check to see if a WINK has occurred. !-? IF TESTBITSC(VCB [VCB_V_WINK]) THEN $DTK$RETURN(DTK$_WINK);- !+& ! Find length of character string. !-# LEN = (IF .TERM_CHAR_POS EQL 0  THEN .VCB[VCB_W_LENGTH]  ELSE .TERM_CHAR_POS - 1 ); !+) ! Return the terminating key entered. !-# IF NOT NULLPARAMETER(TERM_CODE)Y THEN IF .RET_STATUS EQL SS$_TIMEOUTM THEN # .TERM_CODE = DTK$K_TRM_TIMEOUTU ELSEK* .TERM_CODE = (IF .TERM_CHAR_POS EQL 0 THEN DTK$K_TRM_BUFFER_FULLr8 ELSE CH$RCHAR(CH$PLUS(.VCB[VCB_A_POINTER], .LEN))); !+) ! Copy the input to the users string.D !-E STATUS = LIB$SCOPY_R_DX( LEN, .VCB[VCB_A_POINTER], .OUT_STRING );o. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); !+: ! Remove the users input from our keypad input buffer., ! Also remove the terminator if entered. !-9 LEN = .LEN + (IF .TERM_CHAR_POS EQL 0 THEN 1 ELSE 2);nK STATUS = STR$RIGHT( VCB[VCB_Q_INPUT_DESC], VCB[VCB_Q_INPUT_DESC], LEN);t !+ ! Done.O !- $DTK$RETURN (.RET_STATUS);+ END; ! End of routine DTK$READ_STRINGw !s i:%SBTTL 'DTK$RETURN_LAST_INDEX - Return last index spoken.'&GLOBAL ROUTINE DTK$RETURN_LAST_INDEX ( VOICE_ID, INDEX ) =!++d! FUNCTIONAL DESCRIPTION:;!I1! This routine will return the last index spoken.K!T! ! CALLING SEQUENCE: ! :! ret_status.wlc.v = DTK$RETURN_LAST_INDEX (VOICE_ID.rl.r,! INDEX.wl.r)k!v! FORMAL PARAMETERS:!e+! VOICE_ID.rl.r Voice id of DECtalk device !E$! INDEX.wl.r Index to be returned. ! ! IMPLICIT INPUTS:!! NONE!O! IMPLICIT OUTPUTS:l!m! NONE! ! COMPLETION STATUS:!I)! SS$_NORMAL Normal successful completionT! SS$_xxxx Any error from QIOW$e ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.! ! SIDE EFFECTS:A!$! The last spoken index is returned.!l!- _ BEGINI LOCALT) STATUS, ! Status returned by routiness7 VCB : REF $VCB_DECL; ! Address of voice control block,? $DTK$VALIDATE_ARGCOUNT (2, 2); ! Test for right no. of argsB7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBr !+* ! Send index query sequence to DECtalk ! and get returned value._ !-/ $DTK$OUTPUT_DATA( DT_MISC, K_INDEX_QUERY ); > STATUS = DTK$$GET_STATUS( .VCB, .INDEX, %REF(K_TMO_SEC) );. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);@ .INDEX = .VCB [VCB_W_LAST_INDEX]; ! Return last index spoken $DTK$RETURN (SS$_NORMAL);K2 END; ! End of routine DTK$RETURN_LAST_INDEX !A E2%SBTTL 'DTK$RUN_SELF_TEST - Run local self-tests.'"GLOBAL ROUTINE DTK$RUN_SELF_TEST ( VOICE_ID, P_MODEr ) =!++e! FUNCTIONAL DESCRIPTION:n!e>! This routine will run the specified DECtalk local self-test.!L! ! CALLING SEQUENCE:_!t6! ret_status.wlc.v = DTK$RUN_SELF_TEST (VOICE_ID.rl.r,! P_MODE.rl.r)!P! FORMAL PARAMETERS:!T+! VOICE_ID.rl.r Voice id of DECtalk deviceC!D6! P_MODE.rl.r Self-test to be run. Valid values are:! DTK$K_TEST_POWER! DTK$K_TEST_HDATA! DTK$K_TEST_HCONTROLs! DTK$K_TEST_DATA ! DTK$K_TEST_SPEAK! ! IMPLICIT INPUTS:!n! NONE!f! IMPLICIT OUTPUTS:C!I! NONE!! COMPLETION STATUS:!T)! SS$_NORMAL Normal successful completion:! SS$_xxxx Any error from QIOW$f ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.! DTK$_INVARG Invalid argument. !a! SIDE EFFECTS:$!H!! The specified self-test is run. !$!- BEGINc BIND MODE = .P_MODE; LOCAL ) STATUS, ! Status returned by routines-$ TEST_NUM, ! Number of test to run7 VCB : REF $VCB_DECL; ! Address of voice control block ? $DTK$VALIDATE_ARGCOUNT (2, 2); ! Test for right no. of args:7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCB  SELECTONE .MODE OF 4 SET0 [DTK$K_TEST_POWER] : TEST_NUM = K_TST_POWER;0 [DTK$K_TEST_HDATA] : TEST_NUM = K_TST_HDATA;3 [DTK$K_TEST_HCONTROL] : TEST_NUM = K_TST_HCONTROL;F/ [DTK$K_TEST_DATA] : TEST_NUM = K_TST_DATA;K0 [DTK$K_TEST_SPEAK] : TEST_NUM = K_TST_SPEAK;3 [OTHERWISE] : $DTK$RETURN (DTK$_INVARG);f TES;  !+) ! Send self-test sequence to DECtalk.A !-* $DTK$OUTPUT_DATA( DECTST, .TEST_NUM ); !+ ! Wait for the test to run.T !-- STATUS = LIB$WAIT( %REF( K_2_SECONDS ) );F. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);- STATUS = LIB$WAIT( %REF( K_2_SECONDS ) );. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);- STATUS = LIB$WAIT( %REF( K_2_SECONDS ) );C. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); $DTK$RETURN (SS$_NORMAL);T& END; ! routine DTK$RUN_SELF_TEST !, e=%SBTTL 'DTK$SET_INDEX - Insert an index at current position.'NGLOBAL ROUTINE DTK$SET_INDEX ( VOICE_ID, P_INDEX ) =!++ ! FUNCTIONAL DESCRIPTION:S!UA! This routine will insert an index in the current output stream.! !.! CALLING SEQUENCE:Q!2! ret_status.wlc.v = DTK$SET_INDEX (VOICE_ID.rl.r,! P_INDEX.rl.r)(!C! FORMAL PARAMETERS:! +! VOICE_ID.rl.r Voice id of DECtalk deviceT! @! P_INDEX.rl.r Index to be inserted. Allowed value is 1-32767.0! An index of 0 is reserved for internal use.!p! IMPLICIT INPUTS:!(! NONE!D! IMPLICIT OUTPUTS:_! ! NONE![! COMPLETION STATUS:!N)! SS$_NORMAL Normal successful completionP! SS$_xxxx Any error from QIOW$ ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.! DTK$_INVARG Invalid argument._!K! SIDE EFFECTS:R!D1! The specified index is inserted in the current s ! position in the output stream.!$!- T BEGIN BIND INDEX = .P_INDEX; LOCALE) STATUS, ! Status returned by routines7 VCB : REF $VCB_DECL; ! Address of voice control blockp? $DTK$VALIDATE_ARGCOUNT (2, 2); ! Test for right no. of argsT7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBS !+. ! Index value must be between 1 and 32767. !-K IF (.INDEX LSS 1) OR (.INDEX GTR 32767) THEN $DTK$RETURN (DTK$_INVARG);d !+% ! Send index sequence to DECtalk.  !-2 $DTK$OUTPUT_DATA( DT_MISC2, K_INDEX, .INDEX ); $DTK$RETURN (SS$_NORMAL);K" END; ! routine DTK$SET_INDEX !T O<%SBTTL 'DTK$SET_KEYPAD_MODE - Turn the phone keypad on/off.'$GLOBAL ROUTINE DTK$SET_KEYPAD_MODE ( VOICE_ID, MODEe ) =!++ ! FUNCTIONAL DESCRIPTION:o! C! This routine turns recognition of the telephone keypad on or off.v!D!R! CALLING SEQUENCE:r!,9! ret_status.wlc.v = DTK$SET_KEYPAD_MODE (VOICE_ID.rl.r, ! MODE.rl.r).!r! FORMAL PARAMETERS:!w+! VOICE_ID.rl.r Voice id of DECtalk device_!r3! MODE.rl.r DTK$K_KEYPAD_ON to turn the keypad on,.%! DTK$K_KEYPAD_OFF to turn it off,s4! DTK$K_KEYPAD_AUTO to turn it on with auto-stop.!e! IMPLICIT INPUTS:!r! NONE!! IMPLICIT OUTPUTS:O!]! NONE! ! COMPLETION STATUS:!S)! SS$_NORMAL Normal successful completionR,! DTK$_WRONUMARG Wrong number of arguements. ! DTK$_INVVOIID Invalid voice id! DTK$_ONHOOK Phone is onhook&! DTK$_INVMODE Invalid mode specified. ! DTK$_WINK A wink has occurred.!l! SIDE EFFECTS:x!y6! Recognition of the phone keypad is turned on or off.!$!--U G BEGINe BUILTIN. NULLPARAMETER;h LOCAL ) STATUS, ! Status returned by routinese+ RET_STATUS, ! Status returned by DECtalke7 VCB : REF $VCB_DECL; ! Address of voice control block ? $DTK$VALIDATE_ARGCOUNT (2, 2); ! Test for right no. of argsA7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBo !+, ! Check for mode and then send sequence. !- SELECTONE ..MODE OFE SET[ [DTK$K_KEYPAD_ON]: BEGIN4 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_KEYPAD_ON ); VCB [VCB_V_KEYPAD_ON] = 1;R VCB [VCB_V_AUTOSTOP] = 0; END;H [DTK$K_KEYPAD_OFF]:n BEGIN5 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_KEYPAD_OFF );e VCB [VCB_V_KEYPAD_ON] = 0;_ VCB [VCB_V_AUTOSTOP] = 0;t END;c [DTK$K_KEYPAD_AUTO]: BEGIN) IF .VCB [VCB_B_DEVTYPE] EQL DTK$K_DTC_01G THEN( BEGIN8 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_KEYPAD_ON ); END ELSE+ BEGIN: $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_KEYPAD_AUTO ); END;_ VCB [VCB_V_KEYPAD_ON] = 1;I VCB [VCB_V_AUTOSTOP] = 1;o END;  [OTHERWISE]: $DTK$RETURN (DTK$_INVMODE); TES; !+ ! Read status response.T !-A STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_SEC));S. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);B IF .RET_STATUS EQL DTK$_OFFHOOK THEN $DTK$RETURN (SS$_NORMAL); !+B ! Something happened to the phone connection. Assume the user ! has hungup.F !- VCB [VCB_V_OFFHOOK] = 0; VCB [VCB_V_KEYPAD_ON] = 0; VCB [VCB_V_AUTOSTOP] = 0; VCB [VCB_V_WINK] = 0; $DTK$RETURN (.RET_STATUS);0 END; ! End of routine DTK$SET_KEYPAD_MODE !  -O%SBTTL 'DTK$SET_LOGGING_MODE - Set the specified mode on the DECtalk terminal.' %GLOBAL ROUTINE DTK$SET_LOGGING_MODE ( VOICE_ID, NEW_MODE, OLD_MODEa ) =!++ ! FUNCTIONAL DESCRIPTION: !I! This routine sets or resets the specified mode on the DECtalk terminal.T!_;! The last two parameters are optional. First, if OLD_MODERB! is supplied, it is filled in with the current mode bit settings.6! Secondly, if the NEW_MODE parameter is provided, its<! contents are used to set the current mode(s) of operation.! 8! Hence this routine can typically be used in three way.#! a). To find out current settings:E/! DTK$SET_LOGGING_MODE ( VOICE_ID, , OLD_MODE)S!V?! b). To set the bits with no regard for their current setting:i-! DTK$SET_LOGGING_MODE ( VOICE_ID, NEW_MODE)m! 9! c). To write modular code, saving the current settings,B7! setting them to your desired setting, then restoringN3! original settings before exiting your procedure:P$! DTK$SET_LOGGING_MODE ( VOICE_ID, #! NEW_MODE, saved_mode_bits )c! and before exiting,5! DTK$SET_LOGGING_MODE ( VOICE_ID, saved_mode_bits )T! ! CALLING SEQUENCE:)!8! ret_status.wlc.v = DTK$SET_LOGGING_MODE (VOICE_ID.rl.r! [,NEW_MODE.rl.r]! [,OLD_MODE.wl.r])[!_! FORMAL PARAMETERS:!M,! VOICE_ID.rl.r Voice id of DECtalk device.!i;! NEW_MODE.rl.r DECtalk mode to be set. Valid values are:_! DTK$M_TEXT! DTK$M_PHONEMES! DTK$M_RAWHOST ! DTK$M_INHOST1~ DTKVAX.SAVD?4>A[DIETER.DTKVAX]DTKUTIL.B32;1P \r! DTK$M_OUTHOSTK! DTK$M_ERROR ! DTK$M_TRACEE! DTK$M_DEBUG$2! These values may be OR'd together to set more5! than one mode at a time. Any mode not specifiedt! is reset.!g<! OLD_MODE.wl.r [OPTIONAL]. If specified, recieves the old3! mode settings in effect before setting the newR ! ones.! IMPLICIT INPUTS:!e! NONE!e! IMPLICIT OUTPUTS:p!i! NONE!.! COMPLETION STATUS:!e)! SS$_NORMAL Normal successful completionL,! DTK$_WRONUMARG Wrong number of arguements. ! DTK$_INVVOIID Invalid voice id&! DTK$_INVMODE Invalid mode specified.!)! SIDE EFFECTS: !oC! The specified modes are set on the device. All others are reset. !t!--T E BEGIN BUILTIN NULLPARAMETER;E LOCALE) STATUS, ! Status returned by routinesI7 VCB : REF $VCB_DECL; ! Address of voice control block+? $DTK$VALIDATE_ARGCOUNT (2, 3); ! Test for right no. of argsl7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBe !+3 ! If user asked for old modes, return them now.  !-N IF NOT NULLPARAMETER(OLD_MODE) THEN .OLD_MODE = .VCB [VCB_B_MODE_LOGGING]; !+' ! Set new mode values if specified.M !-" IF NOT NULLPARAMETER(NEW_MODE) THEN BEGIN !+  ! Only allow legal modes. !-M= IF .(.NEW_MODE)<8,24> NEQ 0 THEN $DTK$RETURN (DTK$_INVMODE);e !+$ ! Output sequence to set mode.$ !-U1 $DTK$OUTPUT_DATA( DT_MISC2, K_LOG, ..NEW_MODE );A !+  ! Remember the new mode.t !-.' VCB [VCB_B_MODE_LOGGING] = ..NEW_MODE;A END;  $DTK$RETURN (SS$_NORMAL);B0 END; ! end of routine DTK$SET_LOGGING_MODE !L TG%SBTTL 'DTK$SET_MODE - Set the specified mode on the DECtalk terminal.'EGLOBAL ROUTINE DTK$SET_MODE (r VOICE_ID, NEW_MODE, OLD_MODEs ) =!++C! FUNCTIONAL DESCRIPTION:d!lI! This routine sets or resets the specified mode on the DECtalk terminal.T!=;! The last two parameters are optional. First, if OLD_MODETB! is supplied, it is filled in with the current mode bit settings.6! Secondly, if the NEW_MODE parameter is provided, its<! contents are used to set the current mode(s) of operation.! 8! Hence this routine can typically be used in three way.#! a). To find out current settings:R'! DTK$SET_MODE ( VOICE_ID, , OLD_MODE)=!?! b). To set the bits with no regard for their current setting: %! DTK$SET_MODE ( VOICE_ID, NEW_MODE)!9! c). To write modular code, saving the current settings,_7! setting them to your desired setting, then restoringM3! original settings before exiting your procedure:a! DTK$SET_MODE ( VOICE_ID, #! NEW_MODE, saved_mode_bits )r! and before exiting,-! DTK$SET_MODE ( VOICE_ID, saved_mode_bits )O!O! CALLING SEQUENCE:D! 0! ret_status.wlc.v = DTK$SET_MODE (VOICE_ID.rl.r! [,NEW_MODE.rl.r]T! [,OLD_MODE.wl.r])! ! FORMAL PARAMETERS:! ,! VOICE_ID.rl.r Voice id of DECtalk device.!x;! NEW_MODE.rl.r DECtalk mode to be set. Valid values are: ! DTK$M_SQUARE! DTK$M_ASCIIt! DTK$M_MINUSn! DTK$M_EUROPE! DTK$M_SPELL2! These values may be OR'd together to set more5! than one mode at a time. Any mode not specified! is reset.!s<! OLD_MODE.wl.r [OPTIONAL]. If specified, recieves the old3! mode settings in effect before setting the newc ! ones.! IMPLICIT INPUTS:!,! NONE! ! IMPLICIT OUTPUTS::! ! NONE!V! COMPLETION STATUS:!t)! SS$_NORMAL Normal successful completion4,! DTK$_WRONUMARG Wrong number of arguements. ! DTK$_INVVOIID Invalid voice id&! DTK$_INVMODE Invalid mode specified.!H! SIDE EFFECTS:U! C! The specified modes are set on the device. All others are reset.[!$!--T E BEGINS BUILTINP NULLPARAMETER;] LOCAL$) STATUS, ! Status returned by routines 7 VCB : REF $VCB_DECL; ! Address of voice control block? $DTK$VALIDATE_ARGCOUNT (2, 3); ! Test for right no. of argsr7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCB( !+3 ! If user asked for old modes, return them now.S !-O IF NOT NULLPARAMETER(OLD_MODE) THEN .OLD_MODE = .VCB [VCB_W_MODE_SETTINGS];. !+' ! Set new mode values if specified.S !-" IF NOT NULLPARAMETER(NEW_MODE) THEN BEGIN !+R ! Only allow legal modes. !-r= IF .(.NEW_MODE)<6,26> NEQ 0 THEN $DTK$RETURN (DTK$_INVMODE);E !+e ! Output sequence to set mode.N !-B2 $DTK$OUTPUT_DATA( DT_MISC2, K_MODE, ..NEW_MODE ); !+  ! Remember the new mode.S !-( VCB [VCB_W_MODE_SETTINGS] = ..NEW_MODE; END;t $DTK$RETURN (SS$_NORMAL);E( END; ! end of routine DTK$SET_MODE !r ,9%SBTTL 'DTK$SET_SPEECH_MODE - Set speech mode on or off.'O$GLOBAL ROUTINE DTK$SET_SPEECH_MODE ( VOICE_ID, NEW_MODE, OLD_MODE  ) =!++l! FUNCTIONAL DESCRIPTION: ! <! This routine will start or stop the DECtalk from speaking.!!! CALLING SEQUENCE:T!T9! ret_status.wlc.v = DTK$SET_SPEECH_MODE (VOICE_ID.rl.r, M! NEW_MODE.rl.r! [,OLD_MODE.wl.r])!r! FORMAL PARAMETERS:!V+! VOICE_ID.rl.r Voice id of DECtalk deviceg!m@! NEW_MODE.rl.r Indicates which mode to set. Valid values are: ! DTK$K_SPEAK start speaking(! DTK$K_STOP stop speaking when done)! DTK$K_HALT stop speaking immedatelyI!@! OLD_MODE.wl.r [OPTIONAL]. If specified, recieves the current0! mode setting before setting the new modes. %! Values are the same as NEW_MODE.D!V! IMPLICIT INPUTS:!;! NONE! ! IMPLICIT OUTPUTS: !D! NONE!(! COMPLETION STATUS:!d)! SS$_NORMAL Normal successful completionu ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.&! DTK$_INVMODE Invalid mode specified.!+! SIDE EFFECTS:x!q.! The specified starts or stops speaking text.! !--S BEGINN BUILTIND NULLPARAMETER;R LOCAL ) STATUS, ! Status returned by routinesE7 VCB : REF $VCB_DECL; ! Address of voice control blocka? $DTK$VALIDATE_ARGCOUNT (2, 3); ! Test for right no. of argse7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBu !+2 ! Select sequence to send based on mode value. !- SELECTONE ..NEW_MODE OFt SETv [DTK$K_SPEAK]: !+_- ! Begin speaking by sending DT_SPEAK_ENABLE.R !-R BEGIN1 $DTK$OUTPUT_DATA( DT_MISC2, K_SPEAK, K_ENABLE );O END;  [DTK$K_STOP]:u !+k* ! Stop speaking after all text is spoken  ! by sending DT_SPEAK_DISABLE.  !-i BEGIN2 $DTK$OUTPUT_DATA( DT_MISC2, K_SPEAK, K_DISABLE ); END;C [DTK$K_HALT]:O !+/ ! Stop speaking immedately by sending DT_STOP.c !-l BEGIN% $DTK$OUTPUT_DATA( DT_MISC, K_STOP );g END;. [OTHERWISE]: $DTK$RETURN (DTK$_INVMODE); TES; !+3 ! If user asked for old modes, return them now.k !-N IF NOT NULLPARAMETER(OLD_MODE) THEN .OLD_MODE = .VCB [VCB_B_SPEECH_MODES]; !+ ! Remember the new mode. !-* VCB [VCB_B_SPEECH_MODES] = ..NEW_MODE; $DTK$RETURN (SS$_NORMAL);R/ END; ! end of routine DTK$SET_SPEECH_MODER !! dP%SBTTL 'DTK$SET_TERMINAL_MODE - Set the specified mode on the DECtalk terminal.'&GLOBAL ROUTINE DTK$SET_TERMINAL_MODE ( VOICE_ID, NEW_MODE, OLD_MODE ) =!++ ! FUNCTIONAL DESCRIPTION:d!qI! This routine sets or resets the specified mode on the DECtalk terminal.N!;! The last two parameters are optional. First, if OLD_MODEB! is supplied, it is filled in with the current mode bit settings.6! Secondly, if the NEW_MODE parameter is provided, its<! contents are used to set the current mode(s) of operation.! 8! Hence this routine can typically be used in three way.#! a). To find out current settings:T'! DTK$SET_MODE ( VOICE_ID, , OLD_MODE)N! ?! b). To set the bits with no regard for their current setting:%! DTK$SET_MODE ( VOICE_ID, NEW_MODE)T!D9! c). To write modular code, saving the current settings,_7! setting them to your desired setting, then restoring 3! original settings before exiting your procedure:! DTK$SET_MODE ( VOICE_ID, #! NEW_MODE, saved_mode_bits )T! and before exiting,-! DTK$SET_MODE ( VOICE_ID, saved_mode_bits ).!T! CALLING SEQUENCE:.!T9! ret_status.wlc.v = DTK$SET_TERMINAL_MODE (VOICE_ID.rl.r(! [,NEW_MODE.rl.r] ! [,OLD_MODE.wl.r])!n! FORMAL PARAMETERS:! ,! VOICE_ID.rl.r Voice id of DECtalk device.!V;! NEW_MODE.rl.r DECtalk mode to be set. Valid values are:B! DTK$M_HOST! DTK$M_SPEAKN! DTK$M_EDITED! DTK$M_HARD! DTK$M_SETUP;! DTK$M_FILTER2! These values may be OR'd together to set more5! than one mode at a time. Any mode not specifieda! is reset.!B<! OLD_MODE.wl.r [OPTIONAL]. If specified, recieves the old3! mode settings in effect before setting the new ! ones.! IMPLICIT INPUTS:! ! NONE!o! IMPLICIT OUTPUTS:m!l! NONE!h! COMPLETION STATUS:! )! SS$_NORMAL Normal successful completione,! DTK$_WRONUMARG Wrong number of arguements. ! DTK$_INVVOIID Invalid voice id&! DTK$_INVMODE Invalid mode specified.!a! SIDE EFFECTS:e!rC! The specified modes are set on the device. All others are reset. !d!--h BEGIN BUILTINr NULLPARAMETER; LOCALI) STATUS, ! Status returned by routines 7 VCB : REF $VCB_DECL; ! Address of voice control blocki? $DTK$VALIDATE_ARGCOUNT (2, 3); ! Test for right no. of argse7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBt !+3 ! If user asked for old modes, return them now.n !-O IF NOT NULLPARAMETER(OLD_MODE) THEN .OLD_MODE = .VCB [VCB_B_MODE_TERMINAL];  !+' ! Set new mode values if specified.S !-" IF NOT NULLPARAMETER(NEW_MODE) THEN BEGIN !+) ! Only allow legal modes. !-T= IF .(.NEW_MODE)<7,25> NEQ 0 THEN $DTK$RETURN (DTK$_INVMODE);, !+E ! Output sequence to set mode.: !-6 $DTK$OUTPUT_DATA( DT_MISC2, K_TERMINAL, ..NEW_MODE ); !+  ! Remember the new mode.a !-a( VCB [VCB_B_MODE_TERMINAL] = ..NEW_MODE; END;  $DTK$RETURN (SS$_NORMAL);N1 END; ! end of routine DTK$SET_TERMINAL_MODE !  3%SBTTL 'DTK$SET_VOICE - Set voice characteristics.'tGLOBAL ROUTINE DTK$SET_VOICE ( VOICE_ID, NEW_VOICE,p SPEECH_RATE,i COMMA_PAUSE, PEROID_PAUSE[ ) =!++f! FUNCTIONAL DESCRIPTION:d! C! This routine will change the DECtalk voice characteristics to theL! ones specified. !E!e! CALLING SEQUENCE:p!i1! ret_status.wlc.v = DTK$SET_VOICE (VOICE_ID.rl.rL! [,NEW_VOICE.rl.r]o! [,SPEECH_RATE.rl.r]m! [,COMMA_PAUSE.rl.r]V! [,PEROID_PAUSE.rl.r])I!O! FORMAL PARAMETERS:!.+! VOICE_ID.rl.r Voice id of DECtalk deviceo! >! NEW_VOICE.rl.r [OPTIONAL] Voice to use. Valid values are:,! DTK$K_VOICE_MALE standard male voice0! DTK$K_VOICE_FEMALE standard female voice.! DTK$K_VOICE_CHILD standard child voice-! DTK$K_VOICE_DEEP_MALE deep male voice,1! DTK$K_VOICE_DEEP_FEMALE deep female voiceB0! DTK$K_VOICE_OLDER_MALE older male voice2! DTK$K_VOICE_LIGHT_FEMALE light female voice!B! SPEECH_RATE.rl.r [OPTIONAL] Rate at which to speak in words per'! minute. Valid range is 120-350. ! ?! COMMA_PAUSE.rl.r [OPTIONAL] Number of milliseconds to pause W! after a comma. ! !@! PEROID_PAUSE.rl.r [OPTIONAL] Number of milliseconds to pause ! after a peroid. ! !!! IMPLICIT INPUTS:!e! NONE!!! IMPLICIT OUTPUTS:T!D! NONE!L! COMPLETION STATUS:! *! SS$_NORMAL Normal successful completion.! SS$_xxxx Any error from QIO$.A!! DTK$_INVVOIID Invalid voice id.N,! DTK$_WRONUMARG Wrong number of arguements. ! DTK$_INVARG Invalid arguement.'! OTS$_xxxx Any error from OTS$CVT_L_TUd!d! SIDE EFFECTS:t!i.! The specified voice characteristics are set.!!- D BEGIND LITERALC K_RATE_LEN = 4, K_VOICE_LEN = 3;h BUILTIN  NULLPARAMETER;c LOCAL ) STATUS, ! Status returned by routinesp) TEMP : VECTOR[4 + K_RATE_LEN, BYTE],T TEXT : VECTOR[4, BYTE],D TEXT_DSC : $DTK$DESCRIPTOR ! Descriptor for DTK$SPEAK_PHONEMIC_TEXT PRESET(# [DSC$B_DTYPE] = DSC$K_DTYPE_T,t# [DSC$B_CLASS] = DSC$K_CLASS_S,  [DSC$W_LENGTH] = 4,n [DSC$A_POINTER] = TEXT ),A TEMP_DSC : $DTK$DESCRIPTOR ! Descriptor for setting speech ratesD PRESET(# [DSC$B_DTYPE] = DSC$K_DTYPE_T,e# [DSC$B_CLASS] = DSC$K_CLASS_S,D$ [DSC$W_LENGTH] = 4 + K_RATE_LEN, [DSC$A_POINTER] = TEMP ),; VCB : REF $VCB_DECL; ! Address of voice control blocke !+6 ! Validate the arguements and get the VCB address. !-? $DTK$VALIDATE_ARGCOUNT (1, 5); ! Test for right no. of argsb7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCBD !+ ! Set new voice. !-# IF NOT NULLPARAMETER(NEW_VOICE)T THEN BEGIN SELECTONE ..NEW_VOICE OF  SET [DTK$K_VOICE_MALE]:3 CH$MOVE( K_VOICE_LEN, UPLIT(BYTE(':np')), TEXT );f [DTK$K_VOICE_FEMALE]:3 CH$MOVE( K_VOICE_LEN, UPLIT(BYTE(':nb')), TEXT );e [DTK$K_VOICE_CHILD]: 3 CH$MOVE( K_VOICE_LEN, UPLIT(BYTE(':nk')), TEXT );O [DTK$K_VOICE_DEEP_MALE]:T3 CH$MOVE( K_VOICE_LEN, UPLIT(BYTE(':nh')), TEXT );a [DTK$K_VOICE_OLDER_MALE]:3 CH$MOVE( K_VOICE_LEN, UPLIT(BYTE(':nf')), TEXT );  [DTK$K_VOICE_DEEP_FEMALE]:i3 CH$MOVE( K_VOICE_LEN, UPLIT(BYTE(':nr')), TEXT );t [DTK$K_VOICE_LIGHT_FEMALE]:3 CH$MOVE( K_VOICE_LEN, UPLIT(BYTE(':nu')), TEXT ); [OTHERWISE]:O $DTK$RETURN (DTK$_INVARG); TES;a !+sB ! Now that the descriptor is set up, call DTK$SPEAK_PHONEMIC_TEXT2 ! to set the voice and remember new voice in VCB. !- ' TEXT_DSC [DSC$W_LENGTH] = K_VOICE_LEN; 9 STATUS = DTK$SPEAK_PHONEMIC_TEXT( .VOICE_ID, TEXT_DSC );[+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);N& VCB [VCB_B_CURR_VOICE] = ..NEW_VOICE; END;r !+ ! Set new speaking rate. !-% IF NOT NULLPARAMETER(SPEECH_RATE)K THEN BEGIN !+;2 ! DECtalk only allows a rate between 120 and 350. !-I IF (..SPEECH_RATE LSS 120) OR  (..SPEECH_RATE GTR 350)  THENe $DTK$RETURN (DTK$_INVARG);  !+TI ! The rate command wants the rate as text chars so convert the parameter  !-' TEXT_DSC [DSC$W_LENGTH] = K_RATE_LEN; 1 STATUS = OTS$CVT_L_TU( .SPEECH_RATE, TEXT_DSC );+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);! !+ID ! Copy the entire command into buffer and call SPEAK_PHONEMIC_TEXT  ! to send the command. o !-4 CH$COPY( K_RATE_LEN, UPLIT(BYTE(':ra ')), ! From= .TEXT_DSC[DSC$W_LENGTH], .TEXT_DSC[DSC$A_POINTER], ! FromE %C' ', ! Fill< .TEMP_DSC[DSC$W_LENGTH], .TEMP_DSC[DSC$A_POINTER] ); ! To9 STATUS = DTK$SPEAK_PHONEMIC_TEXT( .VOICE_ID, TEMP_DSC );E+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS); END;U !+ ! Set comma pause rate. !-% IF NOT NULLPARAMETER(COMMA_PAUSE)L THEN BEGIN !+s+ ! Only allowed rate is between 0 and 9999.s !-n IF (..COMMA_PAUSE LSS 0) OR  (..COMMA_PAUSE GTR 9999) THENC $DTK$RETURN (DTK$_INVARG);N !+.I ! The rate command wants the rate as text chars so convert the parameter. !-i' TEXT_DSC [DSC$W_LENGTH] = K_RATE_LEN;.1 STATUS = OTS$CVT_L_TU( .COMMA_PAUSE, TEXT_DSC ); + IF NOT .STATUS THEN $DTK$RETURN (.STATUS);T !+ D ! Copy the entire command into buffer and call SPEAK_PHONEMIC_TEXT  ! to send the command.  !-e+ CH$COPY( K_RATE_LEN, UPLIT(BYTE(':cp ')), 6 .TEXT_DSC[DSC$W_LENGTH], .TEXT_DSC[DSC$A_POINTER], %C' ',E7 .TEMP_DSC[DSC$W_LENGTH], .TEMP_DSC[DSC$A_POINTER] );T9 STATUS = DTK$SPEAK_PHONEMIC_TEXT( .VOICE_ID, TEMP_DSC );L+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);I END;  !+ ! Set new peroid pause rate. !-& IF NOT NULLPARAMETER(PEROID_PAUSE) THEN BEGIN !+q+ ! Only allowed rate is between 0 and 9999.x !-  IF (..PEROID_PAUSE LSS 0) OR  (..PEROID_PAUSE GTR 9999)O THENS $DTK$RETURN (DTK$_INVARG);u !+I ! The rate command wants the rate as text chars so convert the parameterT !-C' TEXT_DSC [DSC$W_LENGTH] = K_RATE_LEN;2 STATUS = OTS$CVT_L_TU( .PEROID_PAUSE, TEXT_DSC );+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);a !+mD ! Copy the entire command into buffer and call SPEAK_PHONEMIC_TEXT  ! to send the command. g !-e+ CH$COPY( K_RATE_LEN, UPLIT(BYTE(':pp ')), G6 .TEXT_DSC[DSC$W_LENGTH], .TEXT_DSC[DSC$A_POINTER], %C' ', 7 .TEMP_DSC[DSC$W_LENGTH], .TEMP_DSC[DSC$A_POINTER] ); 9 STATUS = DTK$SPEAK_PHONEMIC_TEXT( .VOICE_ID, TEMP_DSC );+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);L END;D $DTK$RETURN (SS$_NORMAL);* END; ! End of routine DTK$SET_VOICE !G 7%SBTTL 'DTK$SPEAK_FILE - Speak text in specified file.'HGLOBAL ROUTINE DTK$SPEAK_FILE (O VOICE_ID, FILESPEC, MODE  ) =!++e! FUNCTIONAL DESCRIPTION:m!wC! This routine will speak the text contained in the specified file.B!C!_! CALLING SEQUENCE: !3! ret_status.wlc.v = DTK$SPEAK_FILE (VOICE_ID.rl.r,B! FILESPEC.rt.dxD! [,MODE.rl.r])!N! FORMAL PARAMETERS:!e+! VOICE_ID.rl.r Voice id of DECtalk deviceA!!3! FILESPEC.rt.dx File containing text to be spokene!o*! MODE.rl.r [OPTIONAL] Valid values are:2! DTK$K_IMMED to return to the user immedately.! (default)1! DTK$K_WAIT to wait until text is completely s! spoken.4! DTK$K_STATUS same as DTK$K_WAIT but also return! a phone status.p!n! IMPLICIT INPUTS:!! NONE!l! IMPLICIT OUTPUTS:w! ! NONE! ! COMPLETION STATUS:!o)! SS$_NORMAL Normal successful completion,! SS$_xxxx Any error from QIOW$t! RMS$_xxx Any error from RMS. ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.&! DTK$_INVMODE Invalid mode specified.!C! SIDE EFFECTS:N! +! The text in the specified file is spoken.e!c!- sBEGINBIND% K_SP_PTR = UPLIT( BYTE( K_SP ) ); BUILTINe NULLPARAMETER;LOCALr RET_STATUS, , STATUS, ! Status returned by routines RAB_STATUS, ! RAB statusf6 SPEAK_STATUS : INITIAL(SS$_NORMAL), ! Speak status5 BUF_ADDR : VECTOR [NAM$C_MAXRSS, BYTE], ! Buffer 5 FAB : $FAB_DECL, ! RMS File Attributes Block.) NAM : $NAM_DECL, ! RMS NAM blocks) RAB : $RAB_DECL, ! RMS RAB block.= FS_LEN : LONG INITIAL(0), ! Length of filespec name used/ FS_ADDR, ! Address of filespec name usedi1 VCB : REF $VCB_DECL; ! Get address of VCBmA$DTK$VALIDATE_ARGCOUNT (2, 3); ! Test for right no. of parametersA$DTK$GET_VCB (.VOICE_ID, VCB);CIF NOT (STATUS = LIB$ANALYZE_SDESC_R2 (.FILESPEC; FS_LEN, FS_ADDR)) THEN $DTK$RETURN (.STATUS);6IF .FS_LEN GTRU 255 THEN $DTK$RETURN (DTK$_FILTOOLON);!+! Initialize the FAB and RAB!-$FAB_INIT( FAB = FAB,s FAC = GET, NAM = NAM, FNA = .FS_ADDR,e FNS = .FS_LEN, ORG = SEQ, ! Sequential file+ FOP = SQO, ! Sequential operations only RAT = CR, ! Carriage control) RFM = VAR); ! Variable length recordsT$NAM_INIT( NAM = NAM,  ESA = BUF_ADDR,T ESS = NAM$C_MAXRSS);$RAB_INIT( RAB = RAB,l FAB = FAB, UBF = BUF_ADDR,F USZ = NAM$C_MAXRSS,f RAC = SEQ); ! Sequential!+! Open the file for input-!-STATUS = $OPEN (FAB=FAB); ! Open input file*IF NOT .STATUS THEN $DTK$RETURN (.STATUS);!+%! Connect a record stream to the files!-STATUS = $CONNECT (RAB=RAB);IF NOT .STATUS TTHEN BEGINo $CLOSE (FAB=FAB);  $DTK$RETURN (.STATUS); END;!+!! First be sure SPEAK_MODE is on. 3! If this is a DTC03 in AUTOSTOP mode, always force 8! SPEAK_MODE since we don't know if the user has already&! entered input from the phone keypad.!-1IF (.VCB [VCB_B_SPEECH_MODES] NEQ DTK$K_SPEAK) ORPD ((.VCB[VCB_B_DEVTYPE] NEQ DTK$K_DTC_01) AND .VCB[VCB_V_AUTOSTOP])THEN BEGIN(4 $DTK$OUTPUT_DATA( DT_MISC2, K_SPEAK, K_ENABLE );+ VCB [VCB_B_SPEECH_MODES] = DTK$K_SPEAK; END;!+7! Loop thru all records in the file, speaking each one.!!-%WHILE (RAB_STATUS = $GET(RAB=RAB)) DO_ BEGIN ! while loopD IF .RAB [RAB$W_RSZ] NEQ 0  THEN% BEGIN ! while records remain$ !+M/ ! If this is a DECtalk I, we need to simulate O* ! AUTOSTOP mode if the user specified it. !-E. IF (.VCB[VCB_B_DEVTYPE] EQL DTK$K_DTC_01) AND .VCB[VCB_V_AUTOSTOP] AND  .VCB[VCB_V_OFFHOOK] THENN BEGIND SPEAK_STATUS = DTK$$SIM_AUTO(.VCB, .RAB [RAB$W_RSZ], BUF_ADDR); IF (NOT .SPEAK_STATUS) OR# (.VCB [VCB_W_LENGTH] NEQ 0)t THEN EXITLOOP;( END ELSE  !+O ! Output the text. H !-r BEGIN@ SPEAK_STATUS=DTK$$OUTPUT(.VCB, .RAB [RAB$W_RSZ], BUF_ADDR);( IF NOT .SPEAK_STATUS THEN EXITLOOP; END;d !++ ! Output a blank after each line to force e ! it to be spoken correctly.K !-E- SPEAK_STATUS=DTK$$OUTPUT(.VCB, 1, K_SP_PTR);M1 IF NOT .SPEAK_STATUS THEN $DTK$RETURN (.STATUS);D !+n/ ! Determine when we should return to the user.e !-l IF NOT NULLPARAMETER(MODE)_ THEN  SELECTONE ..MODE OF SET [DTK$K_IMMED]:  ;v [DTK$K_WAIT,  DTK$K_STATUS]: BEGINe !+R; ! Wait until text is completely spoken by sending 0 ! DT_SYNC and then requesting a status. !-P1 $DTK$OUTPUT_DATA( DT_MISC, K_SYNC );t9 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_STATUS );u; SPEAK_STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS,  %REF(K_TMO_HR) );:, IF NOT .SPEAK_STATUS THEN EXITLOOP;) IF .RET_STATUS NEQ DTK$_OFFHOOK M THEN BEGINo VCB [VCB_V_KEYPAD_ON] = 0; VCB [VCB_V_AUTOSTOP] = 0; VCB [VCB_V_WINK] = 0;A IF ..MODE EQL DTK$K_STATUS THEN SPEAK_STATUS = .RET_STATUS; END; END;d [OTHERWISE]:i BEGINp SPEAK_STATUS = DTK$_INVMODE; EXITLOOP;- END; TES;$ END; ! End of while records remain END; ! End of while loopNSTATUS = $CLOSE (FAB=FAB);)IF NOT .STATUS THEN $DTK$RETURN(.STATUS);TIF NOT .SPEAK_STATUSTHEN $DTK$RETURN (.SPEAK_STATUS) ELSE IF .RAB_STATUS EQL RMS$_EOFe THEN $DTK$RETURN (SS$_NORMAL) ELSE" $DTK$RETURN (.RAB_STATUS);(END; ! End of routine DTK$SPEAK_FILE !4 E%SBTTL 'DTK$SPEAK_PHONEMIC_TEXT - Speak the specified phonemic text.'f(GLOBAL ROUTINE DTK$SPEAK_PHONEMIC_TEXT ( VOICE_ID, TEXT, MODEY ) =!++S! FUNCTIONAL DESCRIPTION:S!7! This routine will send the specified phonemic text to=$! the DECtalk terminal to be spoken.!d!s! CALLING SEQUENCE:c!=! ret_status.wlc.v = DTK$SPEAK_PHONEMIC_TEXT (VOICE_ID.rl.r, .! TEXT.rt.dxL! [,MODE.rl.r])! ! FORMAL PARAMETERS:! ,! VOICE_ID.rl.r Voice id of DECtalk device.! 7! TEXT.rt.dx String descriptor of the phonemic text toT! be spoken.W!I+! MODE.rl.r [OPTIONAL]. Valid values are:I2! DTK$K_IMMED to return to the user immedately.! (default)Y1! DTK$K_WAIT to wait until text is completely H! spoken.4! DTK$K_STATUS same as DTK$K_WAIT but also return! a phone status.L! ! IMPLICIT INPUTS:!T! NONE!T! IMPLICIT OUTPUTS:T! ! NONE!V! COMPLETION STATUS:!')! SS$_NORMAL Normal successful completion! SS$_xxxx Any error from $QIO.E ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.&! DTK$_INVMODE Invalid mode specified.)! DTK$_ONHOOK Phone is onhook (inactive).P!(! SIDE EFFECTS:T! (! The specified phonemic text is spoken.!G!-- S BEGIN BIND" K_VT_PTR = UPLIT( BYTE( K_VT ) ); BUILTINE NULLPARAMETER; LOCALe) STATUS, ! Status returned by routinesD TEXT_LEN : LONG INITIAL(0), TEXT_ADDR,T7 VCB : REF $VCB_DECL; ! Address of voice control blockS? $DTK$VALIDATE_ARGCOUNT (2, 3); ! Test for right no. of argsE7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCB. !+: ! Verify input parameter is a valid string descriptor. !-J IF NOT (STATUS = LIB$ANALYZE_SDESC_R2 ( .TEXT; TEXT_LEN, TEXT_ADDR ) ) THEN $DTK$RETURN (.STATUS);G !+, ! Don't allow imbedded escape sequences. !-@ IF NOT CH$FAIL( CH$FIND_CH( .TEXT_LEN, .TEXT_ADDR, K_ESC ) ) THEN $DTK$RETURN (DTK$_STRTERESC);0 $DTK$BUFFERING_ON(VCB); ! Turn on buffering !+% ! First be sure SPEAK_MODE is on.S7 ! If this is a DTC03 in AUTOSTOP mode, always forcea< ! SPEAK_MODE since we don't know if the user has already* ! entered input from the phone keypad. !-5 IF (.VCB [VCB_B_SPEECH_MODES] NEQ DTK$K_SPEAK) OR]H ((.VCB[VCB_B_DEVTYPE] NEQ DTK$K_DTC_01) AND .VCB[VCB_V_AUTOSTOP]) THEN BEGIN1 $DTK$OUTPUT_DATA( DT_MISC2, K_SPEAK, K_ENABLE );D( VCB [VCB_B_SPEECH_MODES] = DTK$K_SPEAK; END;( !+N ! Output the text with a trailing ^K to force it to be spoken immediately. !-* $DTK$OUTPUT_DATA( DT_PHOTEXT, .TEXT );* STATUS=DTK$$OUTPUT(.VCB, 1, K_VT_PTR);. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);2 $DTK$BUFFERING_OFF(VCB); ! Turn off buffering !+2 ! Determine when we should return to the user. !- IF NOT NULLPARAMETER(MODE) THEN SELECTONE ..MODE OF SET [DTK$K_IMMED]:U ;M [DTK$K_WAIT,  DTK$K_STATUS]: BEGIN LOCAL RET_STATUS; !+ 7 ! Wait until text is completely spoken by sending , ! DT_SYNC and then requesting a status. !-N- $DTK$OUTPUT_DATA( DT_MISC, K_SYNC );T5 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_STATUS );CB STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_HR) );/ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);A% IF .RET_STATUS NEQ DTK$_OFFHOOK THEN  BEGIN  VCB [VCB_V_KEYPAD_ON] = 0; VCB [VCB_V_AUTOSTOP] = 0; VCB [VCB_V_WINK] = 0;< IF ..MODE EQL DTK$K_STATUS THEN $DTK$RETURN (.RET_STATUS); END; END;S [OTHERWISE]: $DTK$RETURN (DTK$_INVMODE); TES;T $DTK$RETURN (SS$_NORMAL);3 END; ! End of routine DTK$SPEAK_PHONEMIC_TEXTv !e %%SBTTL 'DTK$SPEAK_TEXT - Speak text.'AGLOBAL ROUTINE DTK$SPEAK_TEXT (U VOICE_ID, TEXT, MODE; ) =!++A! FUNCTIONAL DESCRIPTION:U!a-! This routine will speak the specified text.r!d!l! CALLING SEQUENCE: !!3! ret_status.wlc.v = DTK$SPEAK_TEXT (VOICE_ID.rl.r,N! TEXT.rt.dx,! [,MODE.rl.r])!T! FORMAL PARAMETERS:!E+! VOICE_ID.rl.r Voice id of DECtalk device !M! TEXT.rt.dx Text to be spokenU! +! MODE.rl.r [OPTIONAL]. Valid values are:)2! DTK$K_IMMED to return to the user immedately.! (default)K1! DTK$K_WAIT to wait until text is completely i! spoken.4! DTK$K_STATUS same as DTK$K_WAIT but also return! a phone status.!B! IMPLICIT INPUTS:!L! NONE!E! IMPLICIT OUTPUTS:D!! NONE!e! COMPLETION STATUS:!N)! SS$_NORMAL Normal successful completionc! SS$_xxxx Any error from QIOW$ ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.&! DTK$_INVMODE Invalid mode specified.)! DTK$_ONHOOK Phone is onhook (inactive).!! SIDE EFFECTS:V!e! The specified text is spoken.E!C!- BEGINn BUILTINs NULLPARAMETER;E BIND" K_VT_PTR = UPLIT( BYTE( K_VT ) ); LOCALu) STATUS, ! Status returned by routinesl TEXT_LEN : LONG INITIAL(0), TEXT_ADDR,o7 VCB : REF $VCB_DECL; ! Address of voice control blockT? $DTK$VALIDATE_ARGCOUNT (2, 3); ! Test for right no. of argsP7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCB J IF NOT (STATUS = LIB$ANALYZE_SDESC_R2 ( .TEXT; TEXT_LEN, TEXT_ADDR ) ) THEN $DTK$RETURN (.STATUS);x !+, ! Don't allow imbedded escape sequences. !-@ IF NOT CH$FAIL( CH$FIND_CH( .TEXT_LEN, .TEXT_ADDR, K_ESC ) ) THEN $DTK$RETURN (DTK$_STRTERESC);0 $DTK$BUFFERING_ON(VCB); ! Turn on buffering !+% ! First be sure SPEAK_MODE is on.P7 ! If this is a DTC03 in AUTOSTOP mode, always force_< ! SPEAK_MODE since we don't know if the user has already* ! entered input from the phone keypad. !-5 IF (.VCB [VCB_B_SPEECH_MODES] NEQ DTK$K_SPEAK) ORAH ((.VCB[VCB_B_DEVTYPE] NEQ DTK$K_DTC_01) AND .VCB[VCB_V_AUTOSTOP]) THEN BEGIN1 $DTK$OUTPUT_DATA( DT_MISC2, K_SPEAK, K_ENABLE );$( VCB [VCB_B_SPEECH_MODES] = DTK$K_SPEAK; END;N !+2 ! If this is a DECtalk I, we need to simulate - ! AUTOSTOP mode if the user specified it.F !-1 IF (.VCB[VCB_B_DEVTYPE] EQL DTK$K_DTC_01) AND( .VCB[VCB_V_AUTOSTOP] AND  .VCB[VCB_V_OFFHOOK] THEN BEGIN/ $DTK$BUFFERING_OFF(VCB); ! Turn off bufferingI5 STATUS = DTK$$SIM_AUTO(.VCB, .TEXT_LEN, .TEXT_ADDR);S* IF NOT .STATUS THEN $DTK$RETURN(.STATUS); END ELSE !+n ! Output the text.  !-- BEGIN1 STATUS=DTK$$OUTPUT(.VCB, .TEXT_LEN, .TEXT_ADDR); + IF NOT .STATUS THEN $DTK$RETURN (.STATUS);!/ $DTK$BUFFERING_OFF(VCB); ! Turn off bufferingt END; !+, ! Output a trailing ^K to force the text ! to be spoken immediately.I !-* STATUS=DTK$$OUTPUT(.VCB, 1, K_VT_PTR);. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); !+2 ! Determine when we should return to the user. !- IF NOT NULLPARAMETER(MODE) THEN SELECTONE ..MODE OF SET [DTK$K_IMMED]:F ;. [DTK$K_WAIT,  DTK$K_STATUS]: BEGIN LOCAL RET_STATUS;l !+T7 ! Wait until text is completely spoken by sending E, ! DT_SYNC and then requesting a status. !-;- $DTK$OUTPUT_DATA( DT_MISC, K_SYNC );n5 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_STATUS ); B STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_HR) );/ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);_% IF .RET_STATUS NEQ DTK$_OFFHOOK ( THEN  BEGINN VCB [VCB_V_KEYPAD_ON] = 0; VCB [VCB_V_AUTOSTOP] = 0; VCB [VCB_V_WINK] = 0;< IF ..MODE EQL DTK$K_STATUS THEN $DTK$RETURN (.RET_STATUS); END; END; [OTHERWISE]: $DTK$RETURN (DTK$_INVMODE); TES;! $DTK$RETURN (SS$_NORMAL);R+ END; ! End of routine DTK$SPEAK_TEXT. !  %%SBTTL 'DTK$SPELL_TEXT - Spell text.'cGLOBAL ROUTINE DTK$SPELL_TEXT (i VOICE_ID, TEXT, MODEi ) =!++A! FUNCTIONAL DESCRIPTION:e!i1! This routine will spell out the specified text.D!0!A! CALLING SEQUENCE:U!T3! ret_status.wlc.v = DTK$SPELL_TEXT (VOICE_ID.rl.r,N! TEXT.rt.dx ! [,MODE.rl.r])![! FORMAL PARAMETERS:!+! VOICE_ID.rl.r Voice id of DECtalk device !B$! TEXT.rt.dx Text to be spelled out!P+! MODE.rl.r [OPTIONAL]. Valid values are:t2! DTK$K_IMMED to return to the user immedately.! (default)U1! DTK$K_WAIT to wait until text is completely S! spelled out.O4! DTK$K_STATUS same as DTK$K_WAIT but also return! a phone status.o! ! IMPLICIT INPUTS:!E! NONE!S! IMPLICIT OUTPUTS:B!,! NONE!M! COMPLETION STATUS:!H)! SS$_NORMAL Normal successful completionr! SS$_xxxx Any error from QIOW$ ! DTK$_INVVOIID Invalid voice id,! DTK$_WRONUMARG Wrong number of arguements.&! DTK$_INVMODE Invalid mode specified.)! DTK$_ONHOOK dq~ DTKVAX.SAVD?4>A[DIETER.DTKVAX]DTKUTIL.B32;1P c Phone is onhook (inactive).! ! SIDE EFFECTS: !R$! The specified text is spelled out.!y!- BEGIN BUILTIN_ NULLPARAMETER;u BIND" K_VT_PTR = UPLIT( BYTE( K_VT ) ); LOCALD) STATUS, ! Status returned by routinesT- VM_PTR, ! VM containing the text to spell 3 TEXT_LEN : LONG INITIAL(0), ! Length of users text % TEXT_ADDR, ! Address of users text * UP_DESC : $DTK$DESCRIPTOR, ! Upcased text7 VCB : REF $VCB_DECL; ! Address of voice control block ? $DTK$VALIDATE_ARGCOUNT (2, 3); ! Test for right no. of args]7 $DTK$GET_VCB (.VOICE_ID, VCB); ! Get address of VCB  $INIT_DYNDESC(UP_DESC);T( STATUS = STR$UPCASE(UP_DESC, .TEXT);. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);L IF NOT (STATUS = LIB$ANALYZE_SDESC_R2 ( UP_DESC; TEXT_LEN, TEXT_ADDR ) ) THEN $DTK$RETURN (.STATUS);e !+, ! Don't allow imbedded escape sequences. !-@ IF NOT CH$FAIL( CH$FIND_CH( .TEXT_LEN, .TEXT_ADDR, K_ESC ) ) THEN $DTK$RETURN (DTK$_STRTERESC); !+E ! Allocate a buffer that is twice the length of the users string.R !-D STATUS = LIB$GET_VM(%REF(2 * .TEXT_LEN), VM_PTR, DTK_A_ZONE_ID);. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); !+; ! Copy the users string into the buffer just allocated,. ! separating each character with a peroid. !-% INCR I FROM 0 TO .TEXT_LEN - 1 DOd, CH$COPY(1, CH$PLUS(.TEXT_ADDR, .I), ! From 1, UPLIT(BYTE(%C'.')), ! From 0, ! Fill% 2, CH$PLUS(.VM_PTR, .I * 2) ); ! ToK !+ ! Turn on buffering  !-0 $DTK$BUFFERING_ON(VCB); ! Turn on buffering !+% ! First be sure SPEAK_MODE is on.C7 ! If this is a DTC03 in AUTOSTOP mode, always forcep< ! SPEAK_MODE since we don't know if the user has already* ! entered input from the phone keypad. !-5 IF (.VCB [VCB_B_SPEECH_MODES] NEQ DTK$K_SPEAK) OR H ((.VCB[VCB_B_DEVTYPE] NEQ DTK$K_DTC_01) AND .VCB[VCB_V_AUTOSTOP]) THEN BEGIN1 $DTK$OUTPUT_DATA( DT_MISC2, K_SPEAK, K_ENABLE );C( VCB [VCB_B_SPEECH_MODES] = DTK$K_SPEAK; END; !+; ! If this is a DECtalk I, we need to simulate AUTOSTOP l< ! mode if the user specified it and the phone is active. !-1 IF (.VCB[VCB_B_DEVTYPE] EQL DTK$K_DTC_01) ANDt .VCB[VCB_V_AUTOSTOP] ANDm .VCB[VCB_V_OFFHOOK] THEN BEGIN/ $DTK$BUFFERING_OFF(VCB); ! Turn off buffering 6 STATUS = DTK$$SIM_AUTO(.VCB, 2 * .TEXT_LEN, .VM_PTR);* IF NOT .STATUS THEN $DTK$RETURN(.STATUS); END ELSE !+L ! Output the text.O !- BEGIN2 STATUS=DTK$$OUTPUT(.VCB, 2 * .TEXT_LEN, .VM_PTR);+ IF NOT .STATUS THEN $DTK$RETURN (.STATUS); / $DTK$BUFFERING_OFF(VCB); ! Turn off bufferingD END;U !+, ! Output a trailing ^K to force the text ! to be spoken immediately.s !-* STATUS=DTK$$OUTPUT(.VCB, 1, K_VT_PTR);. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); !+ ! Free the buffer we used. !-E STATUS = LIB$FREE_VM(%REF(2 * .TEXT_LEN), VM_PTR, DTK_A_ZONE_ID);l. IF NOT .STATUS THEN $DTK$RETURN (.STATUS);# STATUS = STR$FREE1_DX(UP_DESC);E. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); !+2 ! Determine when we should return to the user. !- IF NOT NULLPARAMETER(MODE) THEN SELECTONE ..MODE OF SET [DTK$K_IMMED]:w ;o [DTK$K_WAIT,  DTK$K_STATUS]: BEGIN LOCAL RET_STATUS;e !+r< ! Wait until text is completely spelled out by sending , ! DT_SYNC and then requesting a status. !-N- $DTK$OUTPUT_DATA( DT_MISC, K_SYNC );H5 $DTK$OUTPUT_DATA( DT_MISC2, K_PHONE, K_STATUS );BB STATUS = DTK$$GET_STATUS( .VCB, RET_STATUS, %REF(K_TMO_HR) );/ IF NOT .STATUS THEN $DTK$RETURN (.STATUS);t% IF .RET_STATUS NEQ DTK$_OFFHOOK THEN  BEGINP VCB [VCB_V_KEYPAD_ON] = 0; VCB [VCB_V_AUTOSTOP] = 0; VCB [VCB_V_WINK] = 0;< IF ..MODE EQL DTK$K_STATUS THEN $DTK$RETURN (.RET_STATUS); END; END; [OTHERWISE]:n $DTK$RETURN (DTK$_INVMODE); TES;- $DTK$RETURN (SS$_NORMAL);)+ END; ! End of routine DTK$SPELL_TEXT$ !M +%SBTTL 'DTK$TERMINATE - Terminate DECtalk.'N&GLOBAL ROUTINE DTK$TERMINATE ( VID ) =!++!! FUNCTIONAL DESCRIPTION:e!s5! This routine terminates all use of a given DECtalk.a5! It deallocates the voice control block and all its K@! substructures. It gets rid of the event flag and the channel 2! number. It removes any associated exit handler.!%! CALLING SEQUENCE: ! 5! ret_status.wlc.v = DTK$TERMINATE ( VID.rl.r )T!A! FORMAL PARAMETERS:! 2! VID.rl.r Voice-id of DECtalk device.! ! IMPLICIT INPUTS:! ! NONE!]! IMPLICIT OUTPUTS:D!Q ! NONE!E! COMPLETION STATUS:!S4! SS$_NORMAL Normal successful completion2! DTK$_WRONUMARG Wrong number of arguments.! SS$_xyz errors from $DASSGN1! LIB$_xyz errors from LIB$FREE_VM or LIB$FREE_EFe!! SIDE EFFECTS:A!E ! NONE!-- BBEGINILOCALE) STATUS, ! Status returned by routines=/ SEARCH_VCB : REF $VCB_DECL, ! Next VCB in listr9 VCB : REF $VCB_DECL; ! Address of voice control blockE;$DTK$VALIDATE_ARGCOUNT (1, 1); ! Test for right no. of argsN-$DTK$GET_VCB (.VID,VCB); ! Get address of VCB!+@! Get rid of our exit handler. Ignore a no handler found error.!-3STATUS = $CANEXH( DESBLK = VCB[VCB_R_EXIT_BLOCK] );[LIF (NOT .STATUS) AND (.STATUS NEQ SS$_NOHANDLER) THEN $DTK$RETURN (.STATUS);!+2! If there is a channeHl assigned, deassign it now.4! This automatically cancels any I/O on the channel./! But first reset the terminal characteristics. !-IF .VCB[VCB_W_CHAN] NEQ 0" THEN BEGIN ! deassigning channel !+ C ! Call the exit handler to flush the buffer, hangup the phone, andm& ! reset the terminal characteristics. !- ( STATUS = DTK$$VCB_EXIT_HANDLER(0,.VCB);- STATUS = $DASSGN( CHAN = .VCB[VCB_W_CHAN] );I4 VCB[VCB_W_CHAN] = 0; ! just in case we get called& ! again after returning an error* IF NOT .STATUS THEN $DTK$RETURN (.STATUS) END; ! deassigning channelN!+&! Free the keypad input buffer string.!-IF .VCB[VCB_W_LENGTH] NEQ 0ATHEN BEGINr" LIB$ESTABLISH(LIB$SIG_TO_RET);3 STATUS = STR$FREE1_DX( VCB[VCB_Q_INPUT_DESC] );d. IF NOT .STATUS THEN $DTK$RETURN (.STATUS); END;!+! Free the output filename.P!-IF .VCB[VCB_W_OUTNAM_LEN] NEQ 0GTHEN BEGIN ! freeing outname6 STATUS = LIB$FREE_VM( %REF (.VCB[VCB_W_OUTNAM_LEN] ), VCB[VCB_A_OUTNAM],N DTK_A_ZONE_ID );  VCB[VCB_W_OUTNAM_LEN] = 0; * IF NOT .STATUS THEN $DTK$RETURN (.STATUS) END; ! freeing outnameA!+-! Free the escape sequence capability buffer.C!-IF .VCB[VCB_A_CAP_BUFFER] NEQ 0rTHEN BEGIN ! freeing buffer 5 STATUS = LIB$FREE_VM( %REF (VCB$K_LONGEST_SEQUENCE),3 VCB[VCB_A_CAP_BUFFER], DTK_A_ZONE_ID );o VCB[VCB_A_CAP_BUFFER] = 0;a* IF NOT .STATUS THEN $DTK$RETURN (.STATUS) END; ! freeing buffer!+! Free the output buffer.P!-"IF .VCB[VCB_A_OUTPUT_BUFFER] NEQ 0THEN BEGIN ! freeing bufferU8 STATUS = LIB$FREE_VM( %REF (.VCB[VCB_W_OUTPUT_BUFSIZ])," VCB[VCB_A_OUTPUT_BUFFER], DTK_A_ZONE_ID ); VCB[VCB_A_OUTPUT_BUFFER] = 0;* IF NOT .STATUS THEN $DTK$RETURN (.STATUS) END; ! freeing buffer!+O! Loop thru all current VCBs looking for a match. If found, remove from queue._!-SEARCH_VCB = VCB_QUEUE;FWHILE .SEARCH_VCB NEQ 0 DO' IF .SEARCH_VCB[VCB_A_NEXT] EQL .VCBr THEN BEGIN+ SEARCH_VCB[VCB_A_NEXT] = .VCB[VCB_A_NEXT]; EXITLOOP; END ELSE& SEARCH_VCB = .SEARCH_VCB[VCB_A_NEXT];!+! Now go free the VCB itself.G!-VCB [VCB_B_STRUCT_TYPE] = 0;DIF NOT (STATUS=LIB$FREE_VM (%REF (VCB_K_SIZE), VCB, DTK_A_ZONE_ID)) THEN F $DTK$RETURN (.STATUS); .VID = 0;RETURN (SS$_NORMAL);%END; ! End or routine DTK$TERMINATE!*****************************! Start of internal routines.*!***************************** !D RB%SBTTL 'DTK$$FLUSH_BUFFER - Flush all buffered output to terminal'%ROUTINE DTK$$FLUSH_BUFFER ( P_VCB ) =R!++R! FUNCTIONAL DESCRIPTION:E!M?! This routine causes all output which has been buffered up but_5! not yet sent to the terminal, to be output at once. !!! CALLING SEQUENCE: !t<! ret_status.wlc.v = DTK$$FLUSH_BUFFER ( P_VCB.rab.r )!s! FORMAL PARAMETERS:!8! P_VCB.rab.r The voice control block address for which )! the flushing action is to take place.)!! IMPLICIT INPUTS:!T?! VCB[VCB_W_OUTPUT_BUFLEN] number of characters in buffer 2! VCB[VCB_W_OUTPUT_BUFFER] address of buffer! ! IMPLICIT OUTPUTS:T! C! VCB[VCB_W_OUTPUT_BUFLEN] set to 0 (indicating buffer empty);! ! COMPLETION STATUS:!;4! SS$_NORMAL Normal successful completion#! SS$_xyz errors from DTK$$OUTPUT.E!S! SIDE EFFECTS:E!N ! NONE!-- SBEGIN BIND2 VCB = .P_VCB : $VCB_DECL, ! voice control block- OUTBUF = .VCB[VCB_A_OUTPUT_BUFFER] : VECTOR,T+ OUTLEN = VCB[VCB_W_OUTPUT_BUFLEN] : WORD;DLOCALT STATUS;!+$! Do nothing if the buffer is empty.!-*IF .OUTLEN EQL 0 THEN RETURN (SS$_NORMAL);!+! Output the buffer now.?! Save time by calling OUTPUT directly rather than DTK$$OUTPUT.X7! (DTK$$OUTPUT would try to buffer the text up anyhow.).!-$STATUS = OUTPUT(VCB,.OUTLEN,OUTBUF);%IF NOT .STATUS THEN RETURN (.STATUS);!+$! Note that the buffer is now empty.!- OUTLEN = 0;IRETURN (SS$_NORMAL);)END; ! End of routine DTK$$FLUSH_BUFFERm !  f9%SBTTL 'DTK$$GET_STATUS - Get status reply from DECtalk.'ROUTINE DTK$$GET_STATUS (  P_VCB, P_RET_STATUS,_ TIMEOUTs ) =n!++ ! FUNCTIONAL DESCRIPTION:M!C6! This routine will read in the reply sequence sent by9! DECtalk, parse it, and return the necessary informationc! in RET_STATUS.! ! CALLING SEQUENCE:o!I1! ret_status.wlc.v = DTK$$GET_STATUS ( P_VCB.rl.rU! [,P_RET_STATUS.wl.r]! [,TIMEOUT.rl.r])!p! FORMAL PARAMETERS:!h!! P_VCB.rl.r Voice control blockI>! P_RET_STATUS.wl.r [OPTIONAL] Longword to recieve the status/! being reported by DECtalk. This may be a /! status or a normal value depending on the !! reply being sent by DECtalk.t0! If not specified, a call is being made from0! one of the DTK$$READ_xxxx routines to just .! read in a key. A status is not returned.!e=! TIMEOUT.rl.r [OPTIONAL] Timeout value to use for the QIOsF!C! IMPLICIT INPUTS:!o! NONE! ! IMPLICIT OUTPUTS:L!T! NONE!(! COMPLETION STATUS:!o)! SS$_NORMAL normal successful completionB! SS$_xxxx any error from $QIO!I! SIDE EFFECTS:)!&! A status reply from DECtalk is read.!--  F BEGINS BUILTINR NULLPARAMETER,  INSQUE, REMQUE; LOCALEC RET_STATUS : INITIAL(DTK$_UNKREPLY), ! Status read from DECtalkA) STATUS, ! Status returned by routinesd6 FUNC_CODE, ! Ptr to function code from esc sequence5 CURR_CHAR, ! Ptr to current character being parsed$> STSQUE : REF $STSQUE_DECL,! New entry for status queue: TYPEAHEAD_BUF : $TYPEAHEAD_DECL,! Typeahead buffer status< QIO_IOSB : VECTOR[4,WORD], ! I/O Status block for $QIO1 BUFFER_LEN, ! Number of chars read into BUFFER= BUFFER : VECTOR [K_BUFFER_LEN, BYTE], ! Input buffer tE STR_DESC : $DTK$DESCRIPTOR ! String descriptor for keypad inputR PRESET(E [DSC$W_LENGTH] = 1,& [DSC$B_DTYPE] = DSC$K_DTYPE_T,& [DSC$B_CLASS] = DSC$K_CLASS_S, [DSC$A_POINTER]= BUFFER); BIND VCB = .P_VCB : $VCB_DECL;" LIB$ESTABLISH(LIB$SIG_TO_RET); VCB [VCB_V_STSREAD] = 0; !+1 ! Process all characters in the input buffer. B ! If we are to return a status, keep reading until we get one. !- DO BEGIN ! Start of WHILE loop !+ 3 ! Get the first character in the typeahead buffer._ !-H) STATUS = $QIOW( CHAN = .VCB[VCB_W_CHAN],C EFN = .DTK_L_EFN,D IOSB = QIO_IOSB,_( FUNC = IO$_READVBLK OR IO$M_NOECHO OR' (IF NOT NULLPARAMETER(TIMEOUT) V THEN IO$M_TIMED ELSE 0),# P1 = .STR_DESC[DSC$A_POINTER],t" P2 = .STR_DESC[DSC$W_LENGTH],) P3 = (IF NOT NULLPARAMETER(TIMEOUT) i THEN ..TIMEOUT ELSE 0) ); & IF NOT .STATUS THEN RETURN (.STATUS);0 IF NOT .QIO_IOSB[0] THEN RETURN (.QIO_IOSB[0]); !+_? ! If the first character is not an escape, it is keypad input. = ! Place this input in the user input buffer, which is just a.7 ! long dynamic string maintained by the STR$ routines.E !-0 IF CH$RCHAR(.STR_DESC[DSC$A_POINTER]) NEQ K_ESC THEN + BEGIN ! Begin keypad input processingR1 STATUS = STR$CONCAT( VCB[VCB_Q_INPUT_DESC], $ VCB[VCB_Q_INPUT_DESC],r STR_DESC);* IF NOT .STATUS THEN RETURN (.STATUS);( END ! End keypad input processing ELSEy BEGIN ! Escape char foundT !+_ ! Read in the next status. < ! Note:: we have already read in the escape character. !--J STATUS = DTK$$INPUT(.P_VCB, BUFFER_LEN, BUFFER[1], %REF(K_TMO_SEC) );* IF NOT .STATUS THEN RETURN (.STATUS);; BUFFER_LEN = .BUFFER_LEN + 1; ! Add in first char readE !+R- ! Check first part of buffer to be sure & ! it is a sequence we know about. !-N6 CURR_CHAR = CH$FIND_CH(.BUFFER_LEN,BUFFER,K_ESC);0 IF CH$FAIL(CURR_CHAR) OR .BUFFER_LEN LSS 2 THEN  RETURN (DTK$_UNKESCSEQ); T !+) ! Check for type of escape sequence.e !-d' IF CH$A_RCHAR(CURR_CHAR) EQL %C'['e THENs !+7 ! We now have a valid CSI, skip ahead to the function)7 ! code which is just after the private delimiter '?'.B !- BEGIN ! Begin CSI processing6 CURR_CHAR = CH$FIND_CH( .BUFFER_LEN, BUFFER, %C'?');5 IF CH$FAIL(CURR_CHAR) THEN RETURN (DTK$_UNKESCSEQ);F DO& BEGIN ! Loop until end is found( FUNC_CODE = CH$A_RCHAR(CURR_CHAR); !+8 ! Determine what to do based on the function code. !- SELECTONE .FUNC_CODE OF[ SETn [%C'2']: !+V- ! This is a DSR Extended reply sequence. )+ ! The sub-function code is the status. T !-% SELECTONE CH$A_RCHAR(CURR_CHAR) OF SET. [%C'0']: RET_STATUS = DTK$_NOMALFUN2;. [%C'1']: RET_STATUS = DTK$_NOMALFUN1;, [%C'2']: RET_STATUS = DTK$_COMFAIL;. [%C'3']: RET_STATUS = DTK$_INPBUFOVR;- [%C'4']: RET_STATUS = DTK$_NVROPRFAI;e- [%C'5']: RET_STATUS = DTK$_ERRPHOTRA;o- [%C'6']: RET_STATUS = DTK$_CONSEQERR; - [%C'7']: RET_STATUS = DTK$_DECTSTFAI;T0 [OTHERWISE]: RET_STATUS = DTK$_UNKREPLY; TES;I [OTHERWISE]: f RET_STATUS = DTK$_UNKESCSEQ;P TES; !+) ! Add status entry to status queue.E !-/ STATUS = LIB$GET_VM(%REF(STSQUE_K_SIZE), c STSQUE, DTK_A_ZONE_ID);+ IF NOT .STATUS THEN RETURN (.STATUS);S- STSQUE [STATUS_L_STATUS] = .RET_STATUS;m1 INSQUE(.STSQUE, VCB[VCB_L_HDWR_STS_FLINK]);, END ! End of loop until end is found !+> ! Check the next character. This should be either a ';'@ ! (another status to process) or an 'n' (end of sequence). !-, UNTIL (CH$A_RCHAR(CURR_CHAR) EQL %C'n') OR) (CH$RCHAR(.CURR_CHAR) EQL %C'c')! END ! End CSI processing ELSEr i' IF CH$RCHAR_A(CURR_CHAR) EQL %C'P'o THENT !+8 ! We now have a valid DCS, skip ahead to the function * ! code which is just after the next ';'. !- BEGIN ! Begin DCS processing6 CURR_CHAR = CH$FIND_CH( .BUFFER_LEN, BUFFER, %C';');5 IF CH$FAIL(CURR_CHAR) THEN RETURN (DTK$_UNKESCSEQ); $ FUNC_CODE = CH$A_RCHAR(CURR_CHAR); !+4 ! We now have the function code, skip ahead to the7 ! sub-function code which is just after the next ';'.t !-: CURR_CHAR = CH$FIND_CH( .BUFFER_LEN, .CURR_CHAR, %C';');5 IF CH$FAIL(CURR_CHAR) THEN RETURN (DTK$_UNKESCSEQ);G !+4 ! Determine what to do based on the function code. !- SELECTONE .FUNC_CODE OFi SET [%C'5']: !+8 ! This is a DT_DICT reply sequence sequence. The ( ! sub-function code is the status. !-( SELECTONE CH$A_RCHAR(CURR_CHAR) OF SETI [%C'z',S) %C'0']: RET_STATUS = SS$_NORMAL;R* [%C'1']: RET_STATUS = DTK$_NOROOM;+ [%C'2']: RET_STATUS = DTK$_TOOLONG; . [OTHERWISE]: RET_STATUS = DTK$_UNKREPLY; TES; [%C'3']: !+; ! This is a DT_INDEX_QUERY reply sequence sequence. 9 ! The characters between the sub-function code and 2 ! 'z' is the index. Convert this to binary. !- BEGINN LOCAL( Z_CHAR; CH$RCHAR_A(CURR_CHAR);; Z_CHAR = CH$FIND_CH( .BUFFER_LEN, .CURR_CHAR, %C'z');C6 IF CH$FAIL(Z_CHAR) THEN RETURN (DTK$_UNKESCSEQ);9 STATUS = LIB$CVT_DTB( CH$DIFF(.Z_CHAR,.CURR_CHAR),  .CURR_CHAR, RET_STATUS);K7 IF NOT .STATUS THEN RETURN (DTK$_UNKESCSEQ); A+ VCB [VCB_W_LAST_INDEX] = .RET_STATUS;n END; [%C'7']: !+5 ! This is a DT_PHONE reply sequence sequence. G. ! The sub-function code is the status.  !-( SELECTONE CH$A_RCHAR(CURR_CHAR) OF SET, [%C'z',A %C'0']: V BEGIN RET_STATUS = DTK$_ONHOOK; VCB [VCB_V_OFFHOOK] = 0;  VCB [VCB_V_KEYPAD_ON] = 0;r VCB [VCB_V_AUTOSTOP] = 0;m VCB [VCB_V_WINK] = 0;e END;E [%C'1']: F BEGIN RET_STATUS = DTK$_OFFHOOK;H VCB [VCB_V_OFFHOOK] = 1; END;N+ [%C'2']: RET_STATUS = DTK$_TIMEOUT;+ [%C'3']: RET_STATUS = DTK$_TOOLONG;A [%C'4']: BEGIN RET_STATUS = DTK$_WINK; VCB [VCB_V_WINK] = 1; END;, [%C'5']: RET_STATUS = DTK$_NODIATONE;' [%C'6']: RET_STATUS = DTK$_BUSY;T+ [%C'7']: RET_STATUS = DTK$_NOANSWER;M. [OTHERWISE]: RET_STATUS = DTK$_UNKREPLY; TES; [OTHERWISE]: *" RET_STATUS = DTK$_UNKESCSEQ; TES; !+*( ! Add status entry to status queue. !- ! IF .RET_STATUS NEQ DTK$_WINKa THEN  BEGINHB STATUS = LIB$GET_VM(%REF(STSQUE_K_SIZE), STSQUE, DTK_A_ZONE_ID);' IF NOT .STATUS THEN RETURN (.STATUS);f) STSQUE [STATUS_L_STATUS] = .RET_STATUS; + INSQUE(.STSQUE, VCB[VCB_L_STATUS_FLINK]);E, VCB [VCB_V_STSREAD] = 1; ! Set status flag END;$ END; ! End of DCS processing$ END; ! End of escape char found !+! ! Check the typeahead buffer.o !-) STATUS=$QIOW(CHAN = .VCB[VCB_W_CHAN],  EFN = .DTK_L_EFN, IOSB = QIO_IOSB,a+ FUNC = IO$_SENSEMODE OR IO$M_TYPEAHDCNT,F P1 = TYPEAHEAD_BUF, P2 = 8);T) IF NOT .STATUS THEN RETURN (.STATUS);E3 IF NOT .QIO_IOSB[0] THEN RETURN (.QIO_IOSB[0]);I END ! End of WHILE5 WHILE (.TYPEAHEAD_BUF [TYPEAHEAD_COUNT] NEQ 0) ORrC (NOT NULLPARAMETER(P_RET_STATUS) AND .VCB[VCB_V_STSREAD] EQL 0);S !+? ! We have now processed all characters in the input buffer.U> ! Return the last status read by removing the latest entryB ! on the status queue. In most cases, this is the only queue @ ! entry but it may not be since the DECTALK may have sent us# ! an unsolicited status (wink).  !-& IF NOT NULLPARAMETER(P_RET_STATUS) THEN BEGIN ! Return status3 STATUS = REMQUE(.VCB[VCB_L_STATUS_FLINK], STSQUE);( IF .STATUSB THEN2 .P_RET_STATUS = SS$_NORMAL ! Queue was empty ELSE # BEGIN ! Queue was not empty0. .P_RET_STATUS = .STSQUE[STATUS_L_STATUS];F STATUS = LIB$FREE_VM(%REF(STSQUE_K_SIZE), STSQUE, DTK_A_ZONE_ID);* IF NOT .STATUS THEN RETURN (.STATUS);% END; ! End of queue was empty END; ! End of return status RETURN (SS$_NORMAL);, END; ! End of routine DTK$$GET_STATUS !p e0%SBTTL 'DTK$$GET_TERM_DATA - Get terminal data.'ROUTINE DTK$$GET_TERM_DATA ( N P_VCB, SEQ_PTR, SEQ_LEN, INPUT_ARG1,P INPUT_ARG2 ) = !++E! FUNCTIONAL DESCRIPTION:,!E!.! CALLING SEQUENCE:P!M4! ret_status.wlc.v = DTK$$GET_TERM_DATA ( P_VCB.rl.r! SEQ_PTR.rl.r,! SEQ_LEN.rl.rv! [,INPUT_ARG1]! [,INPUT_ARG2]) !i! FORMAL PARAMETERS:! ,! P_VCB.rl.r Address of voice control block/! SEQ_PTR.rl.r Address of sequence to retrieve,"! SEQ_LEN.rl.r Length of sequence3! INPUT_ARG1 Value for first sequence substitutionn4! INPUT_ARG2 Value for second sequence substitution!O! IMPLICIT INPUTS:! ! NONE!t! IMPLICIT OUTPUTS:C!I! NONE!! COMPLETION STATUS:!T)! SS$_NORMAL normal successful completion:! SS$_xxxx any error from $FAO!l! SIDE EFFECTS:S!x! NONE!--f BEGIN LITERAL K_ARG1 = 4, K_ARG2 = 5; BUILTIN ACTUALCOUNT,E NULLPARAMETER;I LOCALM) STATUS, ! Status returned by routinesR CONTROL_DSC : $DTK$DESCRIPTOR,P RETURN_DSC : $DTK$DESCRIPTOR; BIND VCB = .P_VCB : $VCB_DECL; !+4 ! If no arguement substitution is required, just5 ! move the capability into the buffer and return.S !- IF ACTUALCOUNT() LSS K_ARG1o THEN BEGIN# VCB [VCB_L_CAP_LENGTH] = .SEQ_LEN;a8 CH$MOVE( .SEQ_LEN, .SEQ_PTR, .VCB [VCB_A_CAP_BUFFER] ); RETURN (SS$_NORMAL); END;_ !+& ! Call $FAO to process the string. !-0 CONTROL_DSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;0 CONTROL_DSC [DSC$B_CLASS] = DSC$K_CLASS_S;+ CONTROL_DSC [DSC$W_LENGTH] = .SEQ_LEN;S+ CONTROL_DSC [DSC$A_POINTER] = .SEQ_PTR;$/ RETURN_DSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;/ RETURN_DSC [DSC$B_CLASS] = DSC$K_CLASS_S;B8 RETURN_DSC [DSC$W_LENGTH] = VCB$K_LONGEST_SEQUENCE;9 RETURN_DSC [DSC$A_POINTER] = .VCB [VCB_A_CAP_BUFFER];l! STATUS = $FAO ( CONTROL_DSC,  VCB [VCB_L_CAP_LENGTH],s RETURN_DSC,l .INPUT_ARG1,' (IF NOT NULLPARAMETER(INPUT_ARG2)p THEN .INPUT_ARG2 ELSE 0)t ); RETURN (.STATUS);/ END; ! End of routine DTK$$GET_TERM_DATAN !D %%SBTTL 'DTK$$INPUT - Low level input'B>GLOBAL ROUTINE DTK$$INPUT(P_VCB,P_TEXT_LEN,TEXT_ADR,TIMEOUT) =!++H! FUNCTIONAL DESCRIPTION:P! +! Handles low level input by issuing a QIO.D![! CALLING SEQUENCE: ! ! ret_status.wlc.v = DTK$$INPUT(! P_VCB.rab.r,E! P_TEXT_LEN.wl.r, ! TEXT_ADR.rt.r! [, TIMEOUT]) !O! FORMAL PARAMETERS:!O.! P_VCB.rab.r Address of voice control block.!t:! P_TEXT_LEN.wl.v Number of characters to read/read into ! the text string! 0! TEXT_ADR.rt.r Address of start of text string+! The text may contain escape sequences._!C8! TIMEOUT.rl.r [OPTIONAL] Number of seconds to wait for! the input.s! IMPLICIT INPUTS:!T! Contents of VCB.!U! IMPLICIT OUTPUTS:V!Q! NONE!]! COMPLETION STATUS:! )! SS$_NORMAL Normal successful completion ! SS$_xyz errors from QIO! SS$_xyz errors from $ASSIGN! ! SIDE EFFECTS:T!! NONE!--  RBEGINtBUILTINt NULLPARAMETER;:BIND TEXT_LEN = .P_TEXT_LEN,1 VCB = .P_VCB : $VCB_DECL; ! voice control blockTLOCALB( STATUS, ! Status returned by routines CURR_CHAR,S QIO_IOSB : VECTOR[4, WORD]; TEXT_LEN = 0; !+!! Issue a QIO to read the string.E!-&STATUS=$QIOW( CHAN = .VCB[VCB_W_CHAN], EFN = .DTK_L_EFN,!( FUNC = IO$_READVBLK OR IO$M_ESCAPE OR & IO$M_NOECHO OR IO$M_TRMNOECHO OR$ (IF NOT NULLPARAMETER(TIMEOUT)  THEN IO$M_TIMED ELSE 0), IOSB = QIO_IOSB, P1 = .TEXT_ADR,; P2 = K_BUFFER_LEN,& P3 = (IF NOT NULLPARAMETER(TIMEOUT)  THEN ..TIMEOUT ELSE 0));*IF NOT .STATUS THEN RETURN (.STATUS);/IF NOT .QIO_IOSB[0] THEN RETURN (.QIO_IOSB[0]);)(TEXT_LEN = .QIO_IOSB[1] + .QIO_IOSB[3];/CURR_CHAR = CH$PLUS(.TEXT_ADR,(.TEXT_LEN - 2));cIF .TEXT_LEN GEQ 2 AND' CH$RCHAR_A(CURR_CHAR) EQL K_ESC AND " CH$RCHAR_A(CURR_CHAR) EQL %C'P'THEN !+N ! We have just read in a DCS. Read in the remaining part of the sequence. !- BEGIN ) STATUS=$QIOW(CHAN = .VCB[VCB_W_CHAN],  EFN = .DTK_L_EFN,5 FUNC = IO$_READVBLK OR IO$M_ESCAPE OR IO$M_NOECHO, IOSB = QIO_IOSB,! P1 = .CURR_CHAR,R P2 = K_BUFFER_LEN);. IF NOT .STATUS THEN RETURN (.STATUS);3 IF NOT .QIO_IOSB[0] THEN RETURN (.QIO_IOSB[0]);7 TEXT_LEN = .TEXT_LEN + .QIO_IOSB[1] + .QIO_IOSB[3]; END;RETURN (SS$_NORMAL);#END; ! End of routine DTK$$INPUTS !; (%SBTTL 'DTK$$OUTPUT - Output to DECtalk'6GLOBAL ROUTINE DTK$$OUTPUT (P_VCB,TEXT_LEN,TEXT_ADR) =!++C! FUNCTIONAL DESCRIPTION:R!T8! Handles output by buffering all text and sending it in:! one QIO when the buffer is full if buffering mode is on.*! If not, issues a QIO to output the text.!! CALLING SEQUENCE:f!!! ret_status.wlc.v = DTK$$OUTPUT(! P_VCB.rab.r,! TEXT_LEN.rl.v,! TEXT_ADR.rt.r)!! FORMAL PARAMETERS:!=.! P_VCB.rab.r Address of voice control block.!K4! TEXT_LEN.rl.v Number of characters in text string!S0! TEXT_ADR.rt.r Address of start of text string+! The text may contain escape sequences.I!)! IMPLICIT INPUTS:! ! Contents of VCB.!u! IMPLICIT OUTPUTS: !h>! VCB[VCB_W_OUTPUT_BUFLEN] may change if buffering is enabled.!h! COMPLETION STATUS:!a)! SS$_NORMAL Normal successful completionI!C! SIDE EFFECTS:A!E! Output may occur. 8! If buffering is enabled, buffers may fill and/or dump.!--i BEGINSBIND0 VCB = .P_VCB : $VCB_DECL, ! voice control block7 TEXT = .TEXT_ADR : VECTOR[,BYTE],! string to be outputfD BUFLEN = VCB[VCB_W_OUTPUT_BUFLEN] : WORD, ! num of chars in buffer< BUFSIZ = VCB[VCB_W_OUTPUT_BUFSIZ] : WORD, ! size of bufferD BUFFER = .VCB[VCB_A_OUTPUT_BUFFER] : VECTOR[,BYTE]; ! Output bufferLOCAL STATUS;!+F! If buffering is enabled, and the new string won't fit in the buffer,%! then we must output the buffer now. 1! If it will fit, then just put it in the buffer. ;! Do not break up the string since we do not want to outputR! a partial escape sequence.!-IF .VCB[VCB_V_BUF_ENABLED]# THEN BEGIN ! buffering is enabled !+, ! See if the string will fit in the buffer. !-" IF .TEXT_LEN+.BUFLEN GTRU .BUFSIZ THEN BEGIN ! No - Dump buffer$ STATUS=OUTPUT(VCB,.BUFLEN,BUFFER);' IF NOT .STATUS THEN RETURN (.STATUS);_ BUFLEN=0;  END ! No - Dump buffer& ELSE BEGIN ! Yes - append to buffer !+" ! Copy the text into the buffer,& ! update BUFLEN which keeps track of# ! how much data is in the buffer,  ! and then return. !-* CH$MOVE(.TEXT_LEN,TEXT,BUFFER[.BUFLEN]); BUFLEN=.BUFLEN+.TEXT_LEN;u RETURN (SS$_NORMAL); END; ! Yes - append to buffero !+ ; ! We reach here if the string would not fit in the buffer.- ! The buffer has been dumped.& ! Put the new string into the buffer.. ! If it will not fit, we output it in chunks.2 ! We output as many full buffer chunks as we can.2 ! When we are all done, we are left with a string1 ! smaller than one buffer's worth, which we then ! put into our output buffer. !-T INCR I FROM 0 BY .BUFSIZ DO IF .I+.BUFSIZ LEQU .TEXT_LEN THEN% BEGIN ! output next part of string'' STATUS=OUTPUT(VCB,.BUFSIZ,TEXT[.I]);E( IF NOT .STATUS THEN RETURN (.STATUS);# END ! output next part of string  ELSE& BEGIN ! buffer final part of string& BUFLEN=.TEXT_LEN-.I; ! could be 0$ CH$MOVE(.BUFLEN,TEXT[.I],BUFFER); EXITLOOP;$ END ! buffer final part of string END ! buffering is enabled ELSE BEGIN ! no buffering0 !+  ! Output the string directly. !-D# STATUS=OUTPUT(VCB,.TEXT_LEN,TEXT); & IF NOT .STATUS THEN RETURN (.STATUS); END; ! no bufferingRETURN (SS$_NORMAL);$END; ! End of routine DTK$$OUTPUT !T AM%SBTTL 'DTK$$SET_TERM_CHARACTERISTICS - Setup terminal line characteristics.''ROUTINE DTK$$SET_TERM_CHARACTERISTICS (1 P_VCB, ON_CHARACTERISTICS1, ON_CHARACTERISTICS2, / OFF_CHARACTERISTICS1, OFF_CHARACTERISTICS2 ) =:!++T! FUNCTIONAL DESCRIPTION: !O3! This routine changes the terminal characteristics! for a given DECtalk.!E! CALLING SEQUENCE:C!;:! RET_STATUS.wlc.v = DTK$$SET_TERM_CHARACTERISTICS (! P_VCB.rl.r ! [,ON_CHARACTERISTICS1.rl.v] ! [,ON_CHARACTERISTICS2.rl.v]!! [,OFF_CHARACTERISTICS1.rl.v]S!! [,OFF_CHARACTERISTICS2.rl.v]T!S! FORMAL PARAMETERS:!"! P_VCB.rl.r voice control blockA! ON_CHARACTERITSICS1.rl.v bits to turn on in 1st characteristicsBA! ON_CHARACTERITSICS2.rl.v bits to turn on in 2nd characteristics C! OFF_CHARACTERITSICS1.rl.v bits to turn off in 1st characteristics C! OFF_CHARACTERITSICS2.rl.v bits to turn off in 2nd characteristicsV!W! IMPLICIT INPUTS:!_! Terminal characteristics! ! IMPLICIT OUTPUTS: !I! NONE!C! COMPLETION STATUS:!U4! SS$_NORMAL Normal successful completion7! DTK$_NOT_A_TRM Success - but device is not a terminal0!! LIB$_xyz Errors from LIB$GET_VM'! SS$_xyz Errors from $DCLEXH or $QIOWT!E! SIDE EFFECTS: !L!--E (BEGINTBIND VCB = .P_VCB : $VCB_DECL;LOCAL ) STATUS, ! Status returned by routinese, TTIOSB : VECTOR[4,WORD], ! I/O status block; OLD_CHARBUF : BLOCK[12,BYTE]; ! Old characteristics bufferuBUILTINn NULLPARAMETER; !+&! Save the old characteristics buffer.!-+CH$MOVE(12,VCB[VCB_R_CHARBUF],OLD_CHARBUF);s!+1! OR in the new characteristic bits requested on.T!-IF NOT NULLPARAMETER(2)G THEN VCB[VCB_L_DEVDEPEND]=0 .VCB[VCB_L_DEVDEPEND] OR .ON_CHARACTERISTICS1;IF NOT NULLPARAMETER(3)  THEN VCB[VCB_L_DEVDEPEND2]=Q1 .VCB[VCB_L_DEVDEPEND2] OR .ON_CHARACTERISTICS2;o!+1! AND out the characteristics bits requested off.;!-IF NOT NULLPARAMETER(4)R THEN VCB[VCB_L_DEVDEPEND]=8 .VCB[VCB_L_DEVDEPEND] AND (NOT .OFF_CHARACTERISTICS1);IF NOT NULLPARAMETER(5)u THEN VCB[VCB_L_DEVDEPEND2]=f9 .VCB[VCB_L_DEVDEPEND2] AND (NOT .OFF_CHARACTERISTICS2); !+;! Set the terminal to have the desired new characteristics.T!-&STATUS=$QIOW( CHAN = .VCB[VCB_W_CHAN], FUNC = IO$_SETMODE,_ EFN = .DTK_L_EFN,E IOSB = TTIOSB, P1 = VCB[VCB_R_CHARBUF], P2 = 12);I+CH$MOVE(12,OLD_CHARBUF,VCB[VCB_R_CHARBUF]);P%IF NOT .STATUS THEN RETURN (.STATUS);D+IF NOT .TTIOSB[0] THEN RETURN (.TTIOSB[0]); RETURN (SS$_NORMAL);6END; ! End of routine DTK$$SET_TERM_CHARACTERISTICS !C lJ%SBTTL 'DTK$$SETUP_TERMINAL_TYPE - Setup terminal type for DTK$$ routines'#ROUTINE DTK$$SETUP_TERMINAL_TYPE ( e FILE_NAME, NAME_LEN, VCB_ADRe ) =s!++t! FUNCTIONAL DESCRIPTION: ! ?! This routine uses the specified file name to determine deviceE! characteristics and assign a terminal type code which is understoodSC! by other DTK$$ routines. DTK$$ routines use the terminal type toO=! determine the correct escape sequence for a given function. !E! CALLING SEQUENCE:K!G:! ret_status.wlc.v = DTK$$SETUP_TERM_TYPE (FILE_NAME.rt.r,! NAME_LEN.rl.v,! P_TERM_TYPE.wl.r,e! VCB_ADR.wl.r)$!C! FORMAL PARAMETERS:!$(! FILE_NAME.rt.r addr of file name text)! NAME_LEN.rl.v length of file name textm<! P_TERM_TYPE.wl.r terminal type code, one of the following:! unknown!e6! VCB_3~ DTKVAX.SAVD?4>A[DIETER.DTKVAX]DTKUTIL.B32;1P  ADR.wl.r Address of longword to receive address"! of the DECtalk control block.,! If 0 or omitted, no VCB gets allocated.!B! IMPLICIT INPUTS:!! NONE!$! IMPLICIT OUTPUTS:! ! VCB fields get filled in.s!e! COMPLETION STATUS:!O!O! SIDE EFFECTS:E! ! NONE!--_ BEGIN_ BUILTINS NULLPARAMETER;_ LOCALO* STATUS, ! Status returned by routines DTKFAB : $FAB_DECL, DTKNAM : $NAM_DECL,. DEVNAM_DSC : $DTK$DESCRIPTOR, ! dsc for name> DVI_ITMLST : VECTOR [6*3 + 1] INITIAL ! item list for $GETDVI; (DVI$_DEVTYPE ^ 16 + 4, 0, 0,! device type (DT$_xyz)$> DVI$_DEVDEPEND ^ 16 + 4, 0, 0,! device dependent bits (1)> DVI$_DEVDEPEND2 ^ 16 + 4, 0, 0,! device dependent bits (2)3 DVI$_DEVBUFSIZ ^ 16 + 4, 0, 0,! terminal widthU; DVI$_DEVCLASS ^ 16 + 4, 0, 0,! device class (DC$_xyz)E7 DVI$_DEVNAM ^ 16 +64, 0, 0,! result name string_ 0), ! terminatorD< DVI_IOSB : VECTOR [4, WORD], ! I/O Status block for $GETDVI2 DEV_TYPE : VOLATILE, ! storage for $GETDVI valueC DEV_DEPEND : VOLATILE BLOCK [4, BYTE], ! device dependent bits (1)aD DEV_DEPEND2 : VOLATILE BLOCK [4, BYTE], ! device dependent bits (2)4 DEV_BUFSIZ : VOLATILE, ! storage for $GETDVI value3 DEV_CLASS : VOLATILE, ! storage fpr $GETDVI valueR: DEV_PAGSIZ : INITIAL(0), ! gets number of rows of deviceA DEV_DEVNAM : VECTOR [64, BYTE], ! Buffer for result name stringx< DEV_NAMLEN : VOLATILE WORD INITIAL(0); ! Length of returned ! resultant name stringe BIND; DVI_TYPE = DVI_ITMLST + 4, ! make it easy to referencer" DVI_DEPEND = DVI_ITMLST + 16, !9 DVI_DEPEND2 = DVI_ITMLST + 28, ! items retd by $GETDVI " DVI_BUFSIZ = DVI_ITMLST + 40, !" DVI_CLASS = DVI_ITMLST + 52, !" DVI_DEVNAM = DVI_ITMLST + 64, !" DVI_NAMLEN = DVI_ITMLST + 68; ! BIND& FABDNS = DTKFAB[FAB$B_DNS] : BYTE,& NAMNOP = DTKNAM[NAM$B_NOP] : BYTE,& NAMRLF = DTKNAM[NAM$L_RLF] : LONG,D FABDEV = DTKFAB[FAB$L_DEV] : BLOCK[,BYTE], ! Device characteristcs) DVI_NAME_LEN = DTKNAM[NAM$T_DVI] : BYTE,O0 DVI_NAME = DTKNAM[NAM$T_DVI]+1 : VECTOR[,BYTE]; r !+' ! Use RMS to parse the device name.[= ! This will give us a 1-15 character physical device name$( ! in the DVI field in the NAM block.B ! (If we just use $GETDVI, it may return a 63-character hidden ! device name.)=G ! The main reason we call $PARSE is so that we can allow filenames.PF ! If the user specifies "TTB5:" as his device, he gets a terminal. !- !+( ! Initialize the FAB and NAM blocks. !- $FAB_INIT( FAB = DTKFAB, DNM = 'DTKOUTPUT.LIS', NAM = DTKNAM,_ FNA = .FILE_NAME,c FNS = .NAME_LEN);2 $NAM_INIT(NAM=DTKNAM); STATUS=$PARSE(FAB=DTKFAB);) IF NOT .STATUS THEN RETURN (.STATUS);h !+> ! The device name is now a counted string in the NAM block$ ! beginning at offset NAM$T_DVI.K ! There is an obscure case though that can occur. If the output deviceED ! is on another node, then R MS cannot figure out the device nameB ! so the DVI field is empty. This can happen if an DTK job is: ! run as a TASK with SYS$OUTPUT defined to be SYS$NET.I ! This happens when you use the "TASK=FOO" kind of file specificationN ! to RMS.I ! To allow this to work, we check to see if the device characteristicTD ! of the DECtalk device is DEV$M_NET. If so, we bypass the call< ! to $GETDVI, and we fill in the fields the best we can. !- IF .FABDEV[DEV$V_NET]g THEN BEGIN ! Network device !+f( ! Fudge the items to reasonable values. !-t DEV_TYPE = DT$_MBX; DEV_DEPEND = 0; DEV_DEPEND2 = 0;s DEV_CLASS = DC$_MAILBOX;  DEV_BUFSIZ = 80;  DEV_DEVNAM = .FILE_NAME;T DEV_NAMLEN = .NAME_LEN; END ! Network device ELSE BEGIN ! Normal devicec3 DVI_TYPE = DEV_TYPE; ! fill in rest of itmlstt DVI_DEPEND = DEV_DEPEND; DVI_DEPEND2 = DEV_DEPEND2;g DVI_CLASS = DEV_CLASS;  DVI_BUFSIZ = DEV_BUFSIZ; C DVI_DEVNAM = DEV_DEVNAM; DVI_NAMLEN = DEV_NAMLEN; !+h* ! Create a descriptor for use by $GETDVI. !-i- DEVNAM_DSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;S- DEVNAM_DSC [DSC$B_CLASS] = DSC$K_CLASS_S;I, DEVNAM_DSC [DSC$W_LENGTH] = .DVI_NAME_LEN;( DEVNAM_DSC [DSC$A_POINTER] = DVI_NAME;% STATUS = $GETDVIW( EFN = .DTK_L_EFN,= IOSB = DVI_IOSB,v DEVNAM = DEVNAM_DSC,  ITMLST = DVI_ITMLST);& IF NOT .STATUS THEN RETURN (.STATUS);2 IF NOT .DVI_IOSB [0] THEN RETURN (.DVI_IOSB [0]); END; ! Normal deviceU !++ ! Allocate a voice control block (VCB).A !-M IF NOT (STATUS = LIB$GET_VM (%REF (VCB_K_SIZE), .VCB_ADR, DTK_A_ZONE_ID))g THEN RETURN (.STATUS); oG CH$FILL (0, VCB_K_SIZE, ..VCB_ADR); ! Clear all fields to default 0i !+ ! Store items in the VCB. !- BEGIN BINDg" VCB = ..VCB_ADR : $VCB_DECL ; !+a9 ! Lock the VCB. This will prevent a second call made toN; ! this routine disrupting the first one while it is being w ! processed.b !-. VCB [VCB_V_LOCKED] = 1; !+U? ! Fill in the 12-byte device characteristics block in the VCB.,@ ! Note that the DEVDEPEND field will not be valid if the device< ! is not a terminal because we replace the top byte of thisF ! longword with the device page size (as it would be for a terminal). !-h* VCB [VCB_B_DEVTYPE] = DTK$K_DTC_UNKNOWN;6 VCB [VCB_B_PHY_DEV_TYPE]= .DEV_TYPE; ! Physical type./ VCB [VCB_B_CLASS] = .DEV_CLASS; ! Device classE6 VCB [VCB_W_WIDTH] = .DEV_BUFSIZ; ! Number of columns.B VCB [VCB_L_DEVDEPEND] = .DEV_DEPEND; ! Implicitly sets overlapped ! field VCB_B_ROWS also.2 VCB [VCB_B_ROWS] = .DEV_PAGSIZ; ! Reset it again.E VCB [VCB_L_DEVDEPEND2] = .DEV_DEPEND2; ! Secondary characteristics.y5 VCB [VCB_W_MODE_SETTINGS] = VCB_K_DEF_MODE_SETTINGS;w/ VCB [VCB_B_STRUCT_TYPE] = VCB_K_STRUCT_TYPE;f4 VCB [VCB_W_OUTPUT_BUFSIZ] = VCB$K_LONGEST_SEQUENCE; !+! ! Fill in the device name.I !-= VCB [VCB_W_DEVNAM_LEN]= .DEV_NAMLEN; ! Length of device namep7 CH$MOVE ( .DEV_NAMLEN, DEV_DEVNAM, VCB[VCB_T_DEVNAM]); !+O> ! Allocate a buffer to hold the escape sequence being parsed. !- < IF NOT (STATUS = LIB$GET_VM (%REF (VCB$K_LONGEST_SEQUENCE), VCB [VCB_A_CAP_BUFFER], DTK_A_ZONE_ID)) THEN  RETURN (.STATUS); > CH$FILL (0, VCB$K_LONGEST_SEQUENCE, .VCB [VCB_A_CAP_BUFFER]); !+ < ! Allocate a buffer to hold the output sequence being sent. !-=< IF NOT (STATUS = LIB$GET_VM (%REF (VCB$K_LONGEST_SEQUENCE),# VCB [VCB_A_OUTPUT_BUFFER],N DTK_A_ZONE_ID)) THENf RETURN (.STATUS); LA CH$FILL (0, VCB$K_LONGEST_SEQUENCE, .VCB [VCB_A_OUTPUT_BUFFER]);l END;r !+1 ! Call $PARSE again to deallocate its memory.V !- FABDNS = 0;_ NAMRLF = 0;  NAMNOP = NAM$M_SYNCHK; $PARSE(FAB=DTKFAB);+ RETURN (.STATUS);I4 END; ! End of routine DTK$$SETUP_TERMINAL_TYPE !  e:%SBTTL 'DTK$$SIM_AUTO - Simulate AUTOSTOP mode for DTC01.'0ROUTINE DTK$$SIM_AUTO(P_VCB,TEXT_LEN,TEXT_ADR) =!++.! FUNCTIONAL DESCRIPTION:C!r<! The DTC03 has an AUTOSTOP mode in hardware that, when set,=! will cause it to stop speaking when a key is pressed on thePA! phone keypad. The DTC01 does not have this mode. This routineT(! will simulate this mode for the DTC01.!t! CALLING SEQUENCE:T!S#! ret_status.wlc.v = DTK$$SIM_AUTO(e! P_VCB.rab.r,R! TEXT_LEN.rl.v,s! TEXT_ADR.rt.r)h!c! FORMAL PARAMETERS:!E.! P_VCB.rab.r Address of voice control block.!c4! TEXT_LEN.rl.v Number of characters in text string!s0! TEXT_ADR.rt.r Address of start of text string+! The text may contain escape sequences.o!l! IMPLICIT INPUTS:!! Contents of VCB.!s! IMPLICIT OUTPUTS:a!r! NONE!I! COMPLETION STATUS:!T)! SS$_NORMAL Normal successful completionO,! SS$_xyz errors from $QIO, $WFLOR, $CANCEL!! SIDE EFFECTS:C! 3! Any text currently being spoken may be discarded.y!--i eBEGINSBIND0 VCB = .P_VCB : $VCB_DECL; ! voice control blockLOCALE) STATUS, ! Status returned by routinesn5 INPUT_IOSB : VECTOR[4, WORD],! IOSB for input QIOs7 OUTPUT_IOSB : VECTOR[4, WORD],! IOSB for output QIO )6 BUFFER : BYTE, ! One character input buffer E STR_DESC : $DTK$DESCRIPTOR ! String descriptor for keypad inputV PRESET(E [DSC$W_LENGTH] = 1,& [DSC$B_DTYPE] = DSC$K_DTYPE_T,& [DSC$B_CLASS] = DSC$K_CLASS_S, [DSC$A_POINTER]= BUFFER),3 TYPEAHEAD_BUF : $TYPEAHEAD_DECL;! Typeahead bufferf!+! Establish a signal handler. !-LIB$ESTABLISH(LIB$SIG_TO_RET);!+3! Check the typeahead buffer to see if the user hasL3! already entered some input from the phone keypad.B6! This will also process any pending escape sequences.!-'STATUS=$QIOW( CHAN = .VCB[VCB_W_CHAN],c EFN = .DTK_L_EFN, IOSB = INPUT_IOSB,.+ FUNC = IO$_SENSEMODE OR IO$M_TYPEAHDCNT,F P1 = TYPEAHEAD_BUF, P2 = 8); %IF NOT .STATUS THEN RETURN (.STATUS);3IF NOT .INPUT_IOSB[0] THEN RETURN (.INPUT_IOSB[0]);N!+! Process any pending input.!-)IF .TYPEAHEAD_BUF [TYPEAHEAD_COUNT] NEQ 0ETHEN BEGIN;" STATUS = DTK$$GET_STATUS(VCB);) IF NOT .STATUS THEN RETURN (.STATUS); END;!+-! If keypad input has already been entered or$*! we don't have any text to speak, return.!-LIF (.TEXT_LEN EQL 0) OR (.VCB[VCB_W_LENGTH] NEQ 0) THEN RETURN (SS$_NORMAL);!++! Issue a QIO to start speaking the string. !-'STATUS = $QIO( CHAN = .VCB[VCB_W_CHAN],i EFN = .DTK_L_EFN,d( FUNC = IO$_WRITEVBLK OR IO$M_NOFORMAT, IOSB = OUTPUT_IOSB,s P1 = .TEXT_ADR,y P2 = .TEXT_LEN);%IF NOT .STATUS THEN RETURN (.STATUS); !+*! Issue a QIO to read in the keypad input.B! NOTE:: The DTC01 does NOT send any unsolicited escape sequences.!-'STATUS = $QIO( CHAN = .VCB[VCB_W_CHAN],_ EFN = .DTK_L_EFN_2, IOSB = INPUT_IOSB,% FUNC = IO$_READVBLK OR IO$M_NOECHO, " P1 = .STR_DESC[DSC$A_POINTER], P2 = .STR_DESC[DSC$W_LENGTH] );%IF NOT .STATUS THEN RETURN (.STATUS);k!+(! Wait for one of the QIO's to complete.!-:STATUS = $WFLOR(EFN = .DTK_L_EFN, MASK = .DTK_L_EFN_MASK);%IF NOT .STATUS THEN RETURN (.STATUS); !+! Cancel the remaining QIO. !-*STATUS = $CANCEL(CHAN = .VCB[VCB_W_CHAN]);%IF NOT .STATUS THEN RETURN (.STATUS); !+E! At this point, an I/O has completed. Check to see which one it is.T!- IF .INPUT_IOSB[0] EQL SS$_NORMALTHEN !+7 ! The input QIO has completed. The user pressed a A' ! phone keypad key. Stop speaking.. ! Wait f or the output QIO to be cancelled. !-! BEGIN ! Input QIO completed0: STATUS = $SYNCH(EFN = .DTK_L_EFN, IOSB = OUTPUT_IOSB);) IF NOT .STATUS THEN RETURN (.STATUS);E: STATUS = DTK$SET_SPEECH_MODE(P_VCB, %REF(DTK$K_HALT));) IF NOT .STATUS THEN RETURN (.STATUS);U !+? ! Place the input in the user input buffer, which is just aN: ! long dynamic string maintained by the STR$ routines. !-3 IF CH$RCHAR(.STR_DESC[DSC$A_POINTER]) NEQ K_ESCf THEN  BEGIN- STATUS = STR$CONCAT( VCB[VCB_Q_INPUT_DESC], D VCB[VCB_Q_INPUT_DESC], STR_DESC);& IF NOT .STATUS THEN RETURN (.STATUS); END END ! Input QIO completedELSE !+% ! The output QIO has completed. V- ! Wait for the input QIO to be cancelled.R !-" BEGIN ! Output QIO completed; STATUS = $SYNCH(EFN = .DTK_L_EFN_2, IOSB = INPUT_IOSB);f) IF NOT .STATUS THEN RETURN (.STATUS);A! END; ! Output QIO completeduRETURN (.STATUS);n&END; ! End of routine DTK$$SIM_AUTO !, -%SBTTL 'DTK$$VCB_EXIT_HANDLER - Exit handler'I3ROUTINE DTK$$VCB_EXIT_HANDLER ( P_REASON, P_VCB ) =t!++e! FUNCTIONAL DESCRIPTION: !D1! This routine gets called on image exit once for 2! each active VCB. It flushes the output on that 1! device and resets the terminal characteristics.T!B! CALLING SEQUENCE:!MA! ret_status.wlc.v = DTK$$VCB_EXIT_HANDLER ( P_REASON.rl.r,:! P_VCB.rab.r )[!$! FORMAL PARAMETERS:!D5! P_REASON Address of word that contains exit reason. %! Should be VCB[VCB_L_EXIT_REASON].+! 8! P_VCB.rab.r The voice control block address for which )! the flushing action is to take place.5!a! IMPLICIT INPUTS:!n! contents of VCBD!f! IMPLICIT OUTPUTS:.! C! VCB[VCB_W_OUTPUT_BUFLEN] set to 0 (indicating buffer empty) !e! COMPLETION STATUS:!a4! SS$_NORMAL Normal successful completion!s! SIDE EFFECTS:u! ! NONE!--s sBEGIN,LOCALa QIO_IOSB : VECTOR[4,WORD];BIND VCB = .P_VCB : $VCB_DECL;!+&! Flush any remaining buffered output.! Hangup the phone. .! Reset the original terminal characteristics.! Disconnect from any LAT port.T!-"$CANCEL (CHAN = .VCB[VCB_W_CHAN]);8IF .VCB [VCB_V_BUF_ENABLED] THEN DTK$$FLUSH_BUFFER(VCB);BIF .VCB [VCB_V_OFFHOOK] THEN DTK$HANGUP_PHONE(VCB[VCB_L_VID]);$QIOW( CHAN = .VCB[VCB_W_CHAN],h EFN = .DTK_L_EFN,e IOSB = QIO_IOSB,c FUNC = IO$_SETMODE, P1 = VCB[VCB_R_CHARBUF],e P2 = 12);$QIOW( CHAN = .VCB[VCB_W_CHAN],  EFN = .DTK_L_EFN,' FUNC = IO$_TTY_PORT OR IO$M_LT_DISCON,s IOSB = QIO_IOSB);RETURN (SS$_NORMAL);&END; ! Routine DTK$$VCB_EXIT_HANDLER !S O"%SBTTL 'OUTPUT - Low level output')ROUTINE OUTPUT(P_VCB,TEXT_LEN,TEXT_ADR) = !++ ! FUNCTIONAL DESCRIPTION:t!s,! Handles low level output by issuing a QIO.! No buffering occurs here.! ! CALLING SEQUENCE:f! ! ret_status.wlc.v = OUTPUT(! P_VCB.rab.r,.! TEXT_LEN.rl.v, !   TEXT_ADR.rt.r)w! ! FORMAL PARAMETERS:!t.! P_VCB.rab.r Address of voice control block.! 4! TEXT_LEN.rl.v Number of characters in text string!S0! TEXT_ADR.rt.r Address of start of text string+! The text may contain escape sequences.D! ! IMPLICIT INPUTS:!E! Contents of VCB.!c! IMPLICIT OUTPUTS:D!T! NONE!l! COMPLETION STATUS:!I)! SS$_NORMAL Normal successful completionD! SS$_xyz errors from QIO! SS$_xyz errors from $ASSIGN!;! SIDE EFFECTS: !D! NONE!--D NBEGIN=BIND0 VCB = .P_VCB : $VCB_DECL; ! voice control blockLOCAL!) STATUS, ! Status returned by routinesD QIO_IOSB : VECTOR[4, WORD];!+&! Null strings succeed no matter what.!-,IF .TEXT_LEN EQL 0 THEN RETURN (SS$_NORMAL);!+#! Issue a QIO to output the string. !-&STATUS=$QIOW( CHAN = .VCB[VCB_W_CHAN], EFN = .DTK_L_EFN,( FUNC = IO$_WRITEVBLK OR IO$M_NOFORMAT, IOSB = QIO_IOSB, P1 = .TEXT_ADR,I P2 = .TEXT_LEN);%IF NOT .STATUS THEN RETURN (.STATUS);c/IF NOT .QIO_IOSB[0] THEN RETURN (.QIO_IOSB[0]);kRETURN (SS$_NORMAL);END; ! End of routine OUTPUTVEND ! End of module DTK$UTIL)ELUDOMEN RETURN (.STATUS); oG CH$FILL (0, VCB_K_SIZE, ..VCB_ADR); ! Clear all fields to default 0i !+ ! Store items in the VCB. !- BEGIN BINDg" VCB = ..VCB_ADR : $VCB_DECL ; !+a9 ! Lock the VCB. This will prevent a second call made toN; ! this routine disrupting the first one while it is being w ! processed.b !-.*[DIETER.DTKVAX]DTKVECTOR.MAR;1+,R?>. / ) 4M ->A0123KPWO 56vBF7xQG89tKG )HJ1 .TITLE DTK$VECTOR - Entry vectors for DTKSHR.EXE4 .IDENT /1-002/ ; File: DTKVECTOR.MAR Edit: TS1002;M;****************************************************************************;* *?;* COPYRIGHT (c) 1978, 1980, 1982, 1984, 1985, 1986 BY *A;* DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS. *#;* ALL RIGHTS RESERVED. *;* *M;* THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED *M;* ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE *M;* INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER *M;* COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY *M;* OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY *;* TRANSFERRED. *;* *M;* THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE *M;* AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT *;* CORPORATION. *;* *M;* DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS *B;* SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. *;* *;* *M;****************************************************************************;;++1; FACILITY: Run-Time Library - DECtalk Management; ; ABSTRACT:;;; This module contains the entry vector definitions for the4; VAX-11 Run-Time Library shareable image DTKSHR.EXE;' ; ENVIRONMENT: User mode, AST Reentrant;3; AUTHOR: Tom Scarpelli, CREATION DATE: 19-Aug-1985;; MODIFIED BY:;-; 1-002 - Add DTK$SPELL_TEXT. TS 30-Jul-1986"; 1-001 - Original. TS 19-Aug-1985;--  .SBTTL DECLARATIONS;; LIBRARY MACRO CALLS:;; NONE;; EXTERNAL DECLARATIONS:;8 .DSABL GBL ; Force all external symbols to be declared; ; MACROS:;;+8; Macro to define an entry vector for a CALL entry point;- .MACRO VCALL NAME .EXTRN NAME .ALIGN QUAD .TRANSFER NAME .MASK NAME JMP NAME+2 .ENDM;+7; Macro to define an entry vector for a JSB entry point;- .MACRO VJSB NAME .EXTRN NAME .ALIGN QUAD .TRANSFER NAME JMP NAME .BLKB 2 .ENDM;+=; Macro to define an open entry vector for a CALL entry point;- .MACRO VOPEN NAME .EXTRN NAME .ALIGN QUAD .MASK NAME JMP NAME+2 .ENDM;; EQUATED SYMBOLS:;; NONE;; OWN STORAGE:;; NONE;; PSECT DECLARATIONS:;4 .PSECT $$DTK$VECTOR PIC, USR, CON, REL, LCL, SHR, - EXE, RD, NOWRT, QUAD  .SBTTL DTKSHR Vector;+E; Define vectored entry points for the DECtalk Management Procedures.;3; Any additions to this file should be reflected inG; COM$:DTKSHRVEC.DAT. All new entry points must be appended to the endF; of the list. NEVER change existing entries unless you are sure that,; what you do won't break existing programs.;-; Module DTK$UTIL VCALL DTK$ANSWER_PHONE VCALL DTK$DIAL_PHONE VCALL DTK$HANGUP_PHONE VCALL DTK$INITIALIZE VCALL DTK$LOAD_DICTIONARY VCALL DTK$OUTPUT VCALL DTK$READ_KEYSTROKE VCALL DTK$READ_STRING VCALL DTK$RETURN_LAST_INDEX VCALL DTK$SET_INDEX VCALL DTK$SET_KEYPAD_MODE VCALL DTK$SET_LOGGING_MODE VCALL DTK$SET_MODE VCALL DTK$SET_SPEECH_MODE VCALL DTK$SET_TERMINAL_MODE VCALL DTK$SET_VOICE VCALL DTK$SPEAK_FILE VCALL DTK$SPEAK_PHONEMIC_TEXT VCALL DTK$SPEAK_TEXT VCALL DTK$TERMINATE;+; Entries for VMS V4.6:;- VCALL DTK$SPELL_TEXT VCALL DTK$CHECK_HDWR_STATUS VCALL DTK$RUN_SELF_TEST;+F; Used for future growth. Replace the VOPEN with the appropriate VCALL;- VOPEN DTK$NOT_IMPLEMENTED VOPEN DTK$NOT_IMPLEMENTED VOPEN DTK$NOT_IMPLEMENTED VOPEN DTK$NOT_IMPLEMENTED VOPEN DTK$NOT_IMPLEMENTED VOPEN DTK$NOT_IMPLEMENTED VOPEN DTK$NOT_IMPLEMENTED VOPEN DTK$NOT_IMPLEMENTED VOPEN DTK$NOT_IMPLEMENTED$ .END ; End of module DTK$VECTOR*[DIETER.DTKVAX]SMGRTLASM.DAT;1+,@./ ) 4MV->A0123KPWO56@//o7g/o89tKG )HJ !++<! SMGRTLASM.DAT - compilation data file for facility SMGRTL.!3! 1-001 - adapted from RTLASM.DAT. MDL 22-Aug-1983+! 1-002 - add checkpoints. MDL 25-Aug-1983B! 1-003 - Add SMG output modules, autobended modules and termtable! modules. LEB 6-Mar-1984.! 1-004 - Removed SMGDELGBL. STAN 12-Mar-1984.5! 1-005 - Remove autobended modules. PLL 25-Jun-1984+! 1-006 - Add SMGDISUSR.B32. TS 8-Mar-1985=! 1-007 - Compile Bliss sources /OPT:LEVEL:3. TS 22-Jul-1985A! 1-008 - Compile Bliss sources /OPT:SPEED also. MDL 21-Aug-1985*! 1-009 - Add DTK facility. TS 6-Sep-1985G! 1-010 - Add SMGNONSDL to get SMG global symbols from BASIC and COBOL.! JCW 14-Nov-19852! 1-011 - Add new VMS V5.0 modules. TS 7-Oct-1986I! 1-012 - Move DEFINEs here from SMGRTLBLD. Remove OLB. MDL 23-Nov-1987M! 1-013 - Remove SMGKEYUTI as SMG$$TERM_TO_KEYCODE is moved to SMGKEYPAD for &! source code merge. IYS 30-Dec-1991J! 1-014 - Merged VMS version with changes made for Alpha. JSY 20-Jan-1992!--$ !&$ ! assign RTL-specific logical names.$ !$ DEFINE RTLIN SRC$:$ DEFINE RTLML LIB$:+$ DEFINE RTLSTARLE SYS$LIBRARY:STARLET.L32)$ DEFINE RTLTPAMAC SYS$LIBRARY:TPAMAC.L32$$ DEFINE RTLLIB SYS$LIBRARY:LIB.L32!! MESSAGE modules!%$ LANG:=MESSAGE;OPT:=/NOSYMBOLS;OLB:=!%DTKMSGTXT/DTKMSG%SMGMSGTXT/SMGMSG!!$ OPT:=/FILE_NAME=SHRIMGMSG;OLB:=!%DTKMSGPTR/DTKMSG%SMGMSGPTR/SMGMSG!! MACRO routines!2$ LANG:=MACRO;ML1:=;OPT:=/ENABLE=SUPPRESSION;OLB:=!%DTKVECTOR/DTKVECTOR%SMGVECTOR/SMGVECTOR@10!;$ OPT:=/ENABLE=SUPPRESSION/DISABLE=(GLOBAL,TRACEBACK);OLB:=!%SMGNONSDL/SMGNONSDL@20!! BLISS routines!$ LANG:=BLISS;ML1:=;OPT:=4$ IF VAX THEN OPT:=/NOTRACE/OPTIMIZE=(LEVEL:3,SPEED)!%SMGALLESC/SMGALLESC%SMGBLDTRM/SMGBLDTRM%SMGBOOTAB/SMGBOOTAB%SMGDISCHA/SMGDISCHA%SMGDISDHW/SMGDISDHW%SMGDISDRW/SMGDISDRW@30%SMGDISHLP/SMGDISHLP%SMGDISINP/SMGDISINP%SMGDISLIN/SMGDISLIN%SMGDISOUT/SMGDISOUT%SMGDISSUB/SMGDISSUB%SMGDISUSR/SMGDISUSR@40%SMGINPUT/SMGINPUT%SMGKEYPAD/SMGKEYPAD%SMGMAPTRM/SMGMAPTRM%SMGMIN/SMGMIN%SMGMINUPD/SMGMINUPD@50%SMGMISC/SMGMISC%SMGNUMPAR/SMGNUMPAR%SMGNUMTAB/SMGNUMTAB%SMGPRVINP/SMGPRVINP%SMGPUTENC/SMGPUTENC@60%SMGPUTTEX/SMGPUTTEX%SMGSCROLL/SMGSCROLL%SMGSELECT/SMGSELECT%SMGSIMTRM/SMGSIMTRM@70%SMGSTATAB/SMGSTATAB%SMGSTRTAB/SMGSTRTAB%SMGSTR2TAB/SMGSTR2TAB%SMGUSRTRM/SMGUSRTRM%SMGWINDOW/SMGWINDOW@80$ OLB:=%DTKUTIL/DTKUTIL@90! ! CLD modules!$ LANG:=CLD;OPT:=;OLB:=!%SMGDEFKEY/SMGDEFKEY!! End of file SMGRTLASM.DAT*[DIETER.DTKVAX]SMGRTLBLD.COM;1+,@2.$/ ) 4\$$->A0123KPWO%56&nQ 87KQ 889tKG )HJ$ !++=$ ! SMGRTLBLD.COM - build the component SMGRTL (SMGSHR.EXE)./$ ! See edit history at the end of this file.$ !-- $ ON SEVERE_ERROR THEN GOTO FAIL$ ON ERROR THEN CONTINUE$ !$ ! branch to phase to be run.$ ! $ STATUS = 1$ GOTO 'PHASE'$ !$ !$ !$INIT:$ !+$ ! INIT phase $ !-$ !*$ ! create directories on the target disk.$ !$ @SYSBLDCOM$:CREATEDIR\$FETCHSRC 'VMSCMS$GENERATION' SMGRTL DTKSHRLNK.OPT 'TARGDEV'['FACNAM'.COM] VMS$:[SMGRTL.CMS]\$FETCHSRC 'VMSCMS$GENERATION' SMGRTL DTKSHRVEC.DAT 'TARGDEV'['FACNAM'.COM] VMS$:[SMGRTL.CMS]\$FETCHSRC 'VMSCMS$GENERATION' SMGRTL SMGBLDTRM.OPT 'TARGDEV'['FACNAM'.COM] VMS$:[SMGRTL.CMS]\$FETCHSRC 'VMSCMS$GENERATION' SMGRTL SMGMAPTRM.OPT 'TARGDEV'['FACNAM'.COM] VMS$:[SMGRTL.CMS]\$FETCHSRC 'VMSCMS$GENERATION' SMGRTL SMGRTLASM.DAT 'TARGDEV'['FACNAM'.COM] VMS$:[SMGRTL.CMS]\$FETCHSRC 'VMSCMS$GENERATION' SMGRTL SMGSHRLNK.OPT 'TARGDEV'['FACNAM'.COM] VMS$:[SMGRTL.CMS]\$FETCHSRC 'VMSCMS$GENERATION' SMGRTL SMGSHRVEC.DAT 'TARGDEV'['FACNAM'.COM] VMS$:[SMGRTL.CMS][$FETCHSRC 'VMSCMS$GENERATION' SMGRTL SMGTERMS.TXT 'TARGDEV'['FACNAM'.COM] VMS$:[SMGRTL.CMS]\$FETCHSRC 'VMSCMS$GENERATION' SMGRTL TERMTABLE.TXT 'TARGDEV'['FACNAM'.COM] VMS$:[SMGRTL.CMS]$ ! $ GOTO EXIT$ !+$ ! end of INIT phase$ !-$UPDATE:$ !+$ ! UPDATE phase$ !-$ ! $ SET NOON$ !C$ ! delete the files we are about to create (from previous builds).$ !)$ DELETE OBJ$:*.*;*,LIS$:*.*;*,LIB$:*.*;*$ !C$ SRCUPDATE SMG$ARCHITECTURE.COM ! Defin e the architecture symbols.$ @SRC$:SMG$ARCHITECTURE.COM$ !$ DELSHRLIB LIB$:DTKMSG.MAR$ DELSHRLIB SRC$:DTKMSG.SDL$ DELSHRLIB LIB$:DTKDEF.MAR$ DELSHRLIB LIB$:DTKDEF.R32$ !$ DELSHRLIB LIB$:SMGMSG.MAR$ DELSHRLIB SRC$:SMGMSG.SDL$ DELSHRLIB LIB$:SMGDEF.MAR$ DELSHRLIB LIB$:SMGDEF.R32$ DELSHRLIB SRC$:SMGLNK.REQ$ DELSHRLIB SRC$:SMGTERM.REQ!$ DELSHRLIB SRC$:SMG$ROUTINES.MAR$ !"$ IF VAX THEN REMSHRLIB STRLNK.REQ"$ IF VAX THEN REMSHRLIB RTLLIB.L32$ !8$ ! create new updated files not updated in ASSEM phase.$ !$ SRCUPDATE DTK$ROUTINES.SDL$ SRCUPDATE DTKDATSTR.REQ$ SRCUPDATE DTKDEF.SDL$ SRCUPDATE DTKMSG.MSG$ SRCUPDATE DTKMACROS.REQ$ SRCUPDATE DTKPROLOG.REQ$ ! $ SRCUPDATE SMG$ARCHITECTURE.REQ$ SRCUPDATE SMG$ROUTINES.SDL$ SRCUPDATE SMGMSG.MSG$ SRCUPDATE SMGDEF.SDL$ SRCUPDATE SMGKCB.SDL$ SRCUPDATE SMGKDE.SDL$ SRCUPDATE SMGKQB.SDL$ SRCUPDATE SMGKTH.SDL$ SRCUPDATE SMGTRMPTR.SDL$ SRCUPDATE SMGDATSTR.REQ$ SRCUPDATE SMGLIB.REQ$ SRCUPDATE SMGLNK.REQ$ SRCUPDATE SMGMACROS.REQ$ SRCUPDATE SMGPROLOG.REQ$ SRCUPDATE SMGSCRMAC.REQ$ SRCUPDATE SMGSCRTCB.REQ$ SRCUPDATE SMGTABDEF.REQ$ SRCUPDATE SMGTERM.REQ$ SRCUPDATE SMGTPALIB.REQ$ SRCUPDATE SMGTPACTL.REQ$ SRCUPDATE SMGTRMMAC.REQ$ SRCUPDATE SMGTRMSTR.R32$ !6$ ! create SDL source files from MESSAGE source files.$ !/$ MESSAGE/SDL=SRC$:/NOLIST/NOOBJECT SRC$:DTKMSG/$ MESSAGE/SDL=SRC$:/NOLIST/NOOBJECT SRC$:SMGMSG$ !K$ ! run SDL conversions for VMSLIB component to use in SRCLIB (next) phase.$ !;$ SDL/VMS/NOLIST/LANG=(BLISS=LIB$:,MACRO=LIB$:) SRC$:DTKDEF0$ SDL/VMS/NOLIST/LANG=(MACRO=LIB$:) SRC$:DTKMSG0$ SDL/VMS/NOLIST/LANG=(MACRO=LIB$:) SRC$:SMGMSG;$ SDL/VMS/NOLIST/LANG=(BLISS=LIB$:,MACRO=LIB$:) SRC$:SMGDEF>$ SDL/VMS/NOLIST/LANG=(BLISS=LIB$:,MACRO=LIB$:) SRC$:SMGTRMPTR-$ SDL/NOLIST/LANG=(BLISSF=LIB$:) SRC$:SMGKCB-$ SDL/NOLIST/LANG=(BLISSF=LIB$:) SRC$:SMGKDE-$ SDL/NOLIST/LANG=(BLISSF=LIB$:) SRC$:SMGKQB-$ SDL/NOLIST/LANG=(BLISSF=LIB$:) SRC$:SMGKTHA$ SDL/NOLIST/LANG=(MACRO=LIB$:) SRC$:SMG$ROUTINES/$ ! B$ ! share message source files w/other component(s) that use them.$ !?$ CPYSHRLIB SRC$:DTKMSG.SDL ! share file with VMSLIB component?$ CPYSHRLIB LIB$:DTKMSG.MAR ! share file with VMSLIB component?$ CPYSHRLIB LIB$:SMGMSG.MAR ! share file with VMSLIB component?$ CPYSHRLIB SRC$:SMGMSG.SDL ! share file with VMSLIB component$ !;$ ! share require files w/other component(s) that use them.$ !?$ CPYSHRLIB LIB$:DTKDEF.MAR ! share file with VMSLIB component?$ CPYSHRLIB LIB$:DTKDEF.R32 ! share file with VMSLIB component$ !?$ CPYSHRLIB LIB$:SMGDEF.MAR ! share file with VMSLIB component?$ CPYSHRLIB LIB$:SMGDEF.R32 ! share file with VMSLIB componentB$ CPYSHRLIB LIB$:SMGTRMPTR.MAR ! share file with VMSLIB componentB$ CPYSHRLIB LIB$:SMGTRMPTR.R32 ! share file with VMSLIB component?$ CPYSHRLIB SRC$:SMGLNK.REQ ! share file with COBRTL component@$ CPYSHRLIB SRC$:S MGTERM.REQ ! share file with COBRTL componentJ$ CPYSHRLIB LIB$:SMG$ROUTINES.MAR ! share file with VMSLIB component$ SET ON$ !2$ ! get rid of old versions of files just updated.$ ! $ PURGE SRC$: $ GOTO EXIT$ !+$ ! end of UPDATE phase$ !-$SRCLIB:$ !+$ ! SRCLIB phase $ !-$ @SRC$:SMG$ARCHITECTURE.COM$ !;$ ! delete assembly checkpoint file (from previous builds).$ !$ DELETE FASMCHECK.CHK;*$ !C$ ! delete the files we are about to create (from previous builds).$ !J$ DELETE LIB$:DTKRTL.OLB;*,DTKMSGPTR.OLB;*,DTKMSGTXT.OLB;*,DTKVECTRS.OLB;*$ !$ DELETE LIB$:SMGRTL.MLB;*J$ DELETE LIB$:SMGRTL.OLB;*,SMGMSGPTR.OLB;*,SMGMSGTXT.OLB;*,SMGVECTRS.OLB;*$ !>$ ! get library/require files from other components as needed.$ !"$ IF VAX THEN GETSHRLIB STRLNK.REQ$ !A$ ! move files just obtained into other subdirectories as needed.$ !*$ IF VAX THEN RENAME LIB$:STRLNK.REQ SRC$:$ !B$ ! create macro source libraries. insert modules as appropriate.$ !&$ LIBRARY/CREATE/MACRO LIB$:SMGRTL.MLB+$ LIBRARY/MACRO LIB$:SMGRTL LIB$:SMGDEF.MAR$ !M$ ! create object libraries. these will be filled in during the ASSEM phase.$ !#$ LIBRARY/CREATE/OBJECT LIB$:DTKRTL&$ LIBRARY/CREATE/OBJECT LIB$:DTKMSGPTR&$ LIBRARY/CREATE/OBJECT LIB$:DTKMSGTXT&$ LIBRARY/CREATE/OBJECT LIB$:DTKVECTRS$ !#$ LIBRARY/CREATE/OBJECT LIB$:SMGRTL&$ LIBRARY/CREATE/OBJECT LIB$:SMGMSGPTR&$ LIBRARY/CREATE/OBJECT LIB$:SMGMSGTXT&$ LIBRARY/CREATE/OBJECT LIB$:SMGVECTRS$ !&$ ! assign RTL-specific logical names.$ !$ DEFINE RTLIN SRC$:$ DEFINE RTLML LIB$:+$ DEFINE RTLSTARLE SYS$LIBRARY:STARLET.L32)$ DEFINE RTLTPAMAC SYS$LIBRARY:TPAMAC.L32$$ DEFINE RTLLIB SYS$LIBRARY:LIB.L32$ !K$ ! create the Bliss source library SMGLIB. For this to work in the systemI$ ! build, this is done after all other facilities have completed in the J$ ! SRCLIB phase (coordinated by running this facility in SRCLIB_1). This!$ ! has no impact for FACTSTBLDs.$ !$ DELSHRLIB LIB$:SMGLIB.L32$ !,$ DELETE LIS$:SMGLIB.L32;*,LIS$:SMGLIB.LIS;*;$ BLISS/LIBRARY=LIB$:/LIST=LIS$:/SOURCE=REQUIRE SRC$:SMGLIB$ !@$ ! Create a BLISS source library specific to TERMTABLE support.$ !2$ DELETE LIS$:SMGTPALIB.L32;*,LIS$:SMGTPALIB.LIS;*C$ BLISS/LIBRARY=LIB$:SMGTPALIB/LIST=LIS$:SMGTPALIB/SOURCE=REQUIRE - SRC$:SMGTPALIB$ !/$ ! share bliss libraries with other facilities$ !?$ CPYSHRLIB LIB$:SMGLIB.L32 ! Share file with COBRTL component$ !$ !($ ! deassign RTL-specific logical names.$ !$ DEASSIGN RTLIN$ DEASSIGN RTLML$ DEASSIGN RTLSTARLE$ DEASSIGN RTLTPAMAC$ DEASSIGN RTLLIB$ ! $ GOTO EXIT$ !+$ ! end of SRCLIB phase$ !-$ASSEM:$ !+$ ! ASSEM phase $ !-$ @SRC$:SMG$ARCHITECTURE.COM$ !J$ ! create bliss source libraries. this can't be done in the SRCLIB phaseM$ ! because references are made to STARLET.L32, which didn't exist until now.$ !M$ ! SMGLIB.L32 WAS CREATED IN THE PREVIOUS (SRCLIB) PHASE. THIS IS A SPECIALJ$ ! CASE SO THAT ALL OF THE VARIOUS RTL FACILITIES CAN RUN CONCURRENTLY INJ$ ! THE ASSEM PHASE. THIS IS DONE BY A SPECIAL PHASE CALLED SRCLIB_1 WHENB$ ! RUNNING THE SYSTEM BUILD. THERE IS NO IMPACT FOR A FACTSTBLD.$ !?$ ! get bliss source libraries from other facilities as needed.$ !"$ IF VAX THEN GETSHRLIB RTLLIB.L32$ !N$ ! delete the files we are about to create (from previous builds); cannot useL$ ! wildcard delete because library listings and object libraries were just $ ! created. So just PURGE.$ 0?y~ DTKVAX.SAV@2>A[DIETER.DTKVAX]SMGRTLBLD.COM;1\$! $ PURGE LIS$: $ PURGE OBJ$:$ !M$ ! invoke system build assembly procedure to perform assemblies. This will N$ ! compile all modules as specified in SMGRTLASM.DAT. Objects will be placedC$ ! in libraries according to SMGRTLASM.DAT specifications as well.$ !+$ @SYSBLDCOM$:FASM SMGRTL "" Y 'UPDATES N Y$ !2$ ! purge again. this ensures minimal disk usage.$ ! $ PURGE LIS$: $ PURGE OBJ$:$ ! $ GOTO EXIT$ !+$ ! end of ASSEM phase$ !-$OBJLIB:$ !+$ ! OBJLIB phase $ !-$ @SRC$:SMG$ARCHITECTURE.COM$ !E$ ! Create facility object libraries from object modules built during$ ! the previous (ASSEM) phase.$ !8$ LIBRARY/OBJECT LIB$:SMGMSGTXT.OLB OBJ$:SMGMSGTXT.OBJ; $ DELETE OBJ$:SMGMSGTXT.OBJ;$ !8$ LIBRARY/OBJECT LIB$:SMGMSGPTR.OLB OBJ$:SMGMSGPTR.OBJ; $ DELETE OBJ$:SMGMSGPTR.OBJ;$ !8$ LIBRARY/OBJECT LIB$:SMGVECTRS.OLB OBJ$:SMGVECTOR.OBJ; $ DELETE OBJ$:SMGVECTOR.OBJ;$ !0$ LIBRARY/OBJECT LIB$:SMGRTL.OLB OBJ$:SMG*.OBJ;$ DELETE OBJ$:SMG*.OBJ;$ !8$ LIBRARY/OBJECT LIB$:DTKMSGTXT.OLB OBJ$:DTKMSGTXT.OBJ; $ DELETE OBJ$:DTKMSGTXT.OBJ;$ !8$ LIBRARY/OBJECT LIB$:DTKMSGPTR.OLB OBJ$:DTKMSGPTR.OBJ; $ DELETE OBJ$:DTKMSGPTR.OBJ;$ !8$ LIBRARY/OBJECT LIB$:DTKVECTRS.OLB OBJ$:DTKVECTOR.OBJ; $ DELETE OBJ$:DTKVECTOR.OBJ;$ !0$ LIBRARY/OBJECT LIB$:DTKRTL.OLB OBJ$:DTK*.OBJ;$ DELETE OBJ$:DTK*.OBJ;$ !$ !O$ ! extract message pointer object files from message object library and insert&$ ! them into facility object library.$ !9$ LIBRARY/EXTRACT=*/OUT=OBJ$:DTKMSGPTR.OBJ LIB$:DTKMSGPTR($ LIBRARY LIB$:DTKRTL OBJ$:DTKMSGPTR.OBJ$ DELETE OBJ$:DTKMSGPTR.OBJ;$ !9$ LIBRARY/EXTRACT=*/OUT=OBJ$:SMGMSGPTR.OBJ LIB$:SMGMSGPTR($ LIBRARY LIB$:SMGRTL OBJ$:SMGMSGPTR.OBJ$ DELETE OBJ$:SMGMSGPTR.OBJ;$ !L$ ! extract individual vector object files from vector object library, to be6$ ! used in next phase to link the shareable image(s).$ !B$ LIBRARY/EXTRACT=DTK$VECTOR/OUT=OBJ$:DTKVECTOR.OBJ LIB$:DTKVECTRSB$ LIBRARY/EXTRACT=SMG$VECTOR/OUT=OBJ$:SMGVECTOR.OBJ LIB$:SMGVECTRS$ !XM$ ! share the object library for this facility with other facilities that mayO $ ! need it.$ ! $ CPYRESOBJ LIB$:DTKRTL.OLB$ CPYRESOBJ LIB$:SMGRTL.OLB.$ !5$ ! cause SMG messages to be built into SHRIMGMSG.EXE:$ ! ?$ LIBRARY/EXTRACT=DTK$MSGDEF/OUT=OBJ$:DTKMSG.OBB LIB$:DTKMSGTXTg$ CPYSYSMSG OBJ$:DTKMSG.OBB:$ DELETE OBJ$:DTKMSG.OBB;*$ !E?$ LIBRARY/EXTRACT=SMG$MSGDEF/OUT=OBJ$:SMGMSG.OBB LIB$:SMGMSGTXT.$ CPYSYSMSG OBJ$:SMGMSG.OBBA$ DELETE OBJ$:SMGMSG.OBB;*$ !E $ GOTO EXITO$ !+$ ! end of OBJLIB phase $ !-$LNKLIB:$ !+$ ! LNKLIB phase '$ !-$ @SRC$:SMG$ARCHITECTURE.COM$ !C$ ! delete the files we are about to create (from previous builds)..$ !V,$ DELETE EXE$:DTKSHR.EXE;*,MAP$:DTKSHR.MAP;*,$ DELETE EXE$:SMGSHR.EXE;*,MAP$:SMGSHR.MAP;*$ !:5$ ! link the Run-Time Library Shareable Image SMGSHR.H$ !O$ IF VAX$ THENL$ LINK/NOSYSLIB/NOTRACEBACK/SHARE=EXE$:SMGSHR/MAP=MAP$:SMGSHR/FULL/CROSS - COM$:SMGSHRLNK/OPTIONS$ ENDIF.$ ! $ IF EVAXV$ THENL$ LINK/NOSYSLIB/NOTRACEBACK/SHARE=EXE$:SMGSHR/MAP=MAP$:SMGSHR/FULL/CROSS -5 COM$:SMGSHRLNK/OPTIONS,RESOBJ$:BASE_LEVEL/OPTIONS'$ ENDIF.$ !V$ IF VAX$ THENL$ LINK/NOSYSLIB/NOTRACEBACK/SHARE=EXE$:DTKSHR/MAP=MAP$:DTKSHR/FULL/CROSS - COM$:DTKSHRLNK/OPTIONS$ ENDIF $ ! $ IF EVAXe$ THENL$ LINK/NOSYSLIB/NOTRACEBACK/SHARE=EXE$:DTKSHR/MAP=MAP$:DTKSHR/FULL/CROSS -5 COM$:DTKSHRLNK/OPTIONS,RESOBJ$:BASE_LEVEL/OPTIONSC$ ENDIFn$ ! M$ ! copy it into it's destination on the result disk, and insert it into the K"$ ! shareable image library there.$ ! $ CPYSYSLIB EXE$:DTKSHR.EXE $ CPYSYSLIB OBJ$:DTKVECTOR.OBJ $ INSHARLIB EXE$:DTKSHRA$ ! $ CPYSYSLIB EXE$:SMGSHR.EXE $ CPYSYSLIB OBJ$:SMGVECTOR.OBJ S$ INSHARLIB EXE$:SMGSHR $ !R $ GOTO EXITN$ !+$ ! end of LNKLIB phaseM$ !-$LINK:$ !+$ ! LINK phase A$ !-$ @SRC$:SMG$ARCHITECTURE.COM$ ! $ ! Link the termtable compiler.$ !$ IF VAX$ THENC$ LINK/EXE=EXE$:SMGBLDTRM/MAP=MAP$:SMGBLDTRM/FULL/CROSS/NOTRACE -O COM$:SMGBLDTRM/OPTIONS$ ENDIF$ !R $ IF EVAXD$ THENC$ LINK/EXE=EXE$:SMGBLDTRM/MAP=MAP$:SMGBLDTRM/FULL/CROSS/NOTRACE -O5 COM$:SMGBLDTRM/OPTIONS,RESOBJ$:BASE_LEVEL/OPTIONSU$ ENDIF$$ !N4$ ! Link the program that creates the global section$ !R$ IF VAX$ THENC$ LINK/NOTRACE/EXE=EXE$:SMGMAPTRM/MAP=MAP$:SMGMAPTRM/FULL/CROSS -S COM$:SMGMAPTRM/OPTIONS$ ENDIFU$ ! $ IF EVAXE$ THENC$ LINK/NOTRACE/EXE=EXE$:SMGMAPTRM/MAP=MAP$:SMGMAPTRM/FULL/CROSS -5 COM$:SMGMAPTRM/OPTIONS,RESOBJ$:BASE_LEVEL/OPTIONS$ ENDIFD$ !MK$ ! invoke system build vector test procedure to be sure the vectored entryT1$ ! points in the shareable image(s) are correct.U$ ! /$ IF VAX THEN @SYSBLDCOM$:VECTORTST EXE$:DTKSHR/$ IF VAX THEN @SYSBLDCOM$:VECTORTST EXE$:SMGSHRi$ ! $ GOTO EXITG$ !+$ ! end of LINK phaseR$ !K$RESULT:$ !+$ ! RESULT phase$ !-$ @SRC$:SMG$ARCHITECTURE.COM$ !o"$ ! copy SMGBLDTRM.EXE to [SYSEXE]$ !S$ CPYRESEXE EXE$:SMGBLDTRM.EXE$ !/"$ ! Copy SMGMAPTRM.EXE to [SYSEXE]$ !$$ CPYRESEXE EXE$:SMGMAPTRM.EXE$ !O?$ ! Copy the SMGTERMS.TXT and TERMTABLE.TXT files into [SYSEXE]M<$ ! as well. These files are copied unmodified to [SYSEXE].$ !$ CPYRESEXE COM$:SMGTERMS.TXTB$ CPYRESEXE COM$:TERMTABLE.TXT$ !/H$ ! Now run the termtable compiler which we just created (SMGBLDTRM.EXE)<$ ! which will read in the TERMTABLE.TXT file and which willJ$ ! create the TERMTABLE.EXE file which will be mapped as a global section6$ ! by program SMGMAPTRM.EXE which we also just built.G$ ! By defining logical name TERMTABLE to point to RESEXE$, this causesrH$ ! the compiler to take input from TERMTABLE.TXT on RESEXE$ and produce8$ ! TERMTABLE.EXE on RESEXE$ which we then move to EXE$.$ !e.$ DEFINE/USER_MODE TERMTABLE RESEXE$:TERMTABLE1$ DEFINE/USER_MODE SMGTERMS RESEXE$:SMGTERMS.TXTP$ !II$ ! The following two lines cause TERMTABLE.EXE to be generated using theuI$ ! compiler just built. However, when building ALPHA images on VAX thisE7$ ! will not work. Use the system default one instead.I$ !K $ IF VAX s$ THEN 5$ DEFINE/USER_MODE LIBRTL SYS$LIBRARY:LIBRTL.EXEAO$ RUN EXE$:SMGBLDTRM ! Gets inputs and puts outputs from/to RESEXE$:TERMTABLE $ ENDIFI$ !p $ IF EVAX $ THEN IJ$ MCR SMGBLDTRM ! Gets inputs and puts outputs from/to RESEXE$:TERMTABLE$ ENDIF "$ COPY RESEXE$:TERMTABLE.EXE EXE$:$ !S0$ ! Copy the resulting TERMTABLE.EXE to [SYSEXE]$ !n$ CPYRESEXE EXE$:TERMTABLE.EXE$ !h$ !i $ GOTO EXITL$ !+$ ! end of RESULT phaseG$ !-$ !A$ ! failure exit e$ ! $FAIL:$ STATUS = $STATUS$ !$ ! common exitd$ !i$EXIT:$ !j%$ ! exit, returning status to caller.O$ !I $ EXIT STATUSn$ !++D$ !h=$ ! SMGRTLBLD.COM - build the component SMGRTL (SMGSHR.EXE).M<$ ! assumes definitions for: LIB$, LIS$, SRC$, EXE$, MAP$,$ ! OBJ$ and SYSBLDCOM$.5$ ! assumes existence of: SYSBLDCOM$:CREATEDIR.COM $ ! SYSBLDCOM$:FASM.COMo"$ ! SYSBLDCOM$:VECTORTST.COM$ !O1$ ! 1-001 - adapted from RTLBLD. MDL 22-Aug-1983*D$ ! 1-002 - delete checkpoint file from old builds. MDL 24-Aug-19835$ ! 1-003 - clean up CPY/DELSHRLIBs. MDL 16-Sep-1983 J$ ! 1-004 - build SMGLIB.L32 in special SRCLIB_1 phase, similar to LIBRTL..$ ! COBRTL references it. MDL 27-Feb-1984I$ ! 1-005 - Add in new SDL files, REQ files for integration of SMG outputLH$ ! routines. Also build TERMTABLE related images in this facility.$ ! LEB 6-Mar-1984<$ ! 1-006 - Add in SRCUPDATE of SMGDATSTR.REQ. LEB 7-Mar-84F$ ! 1-007 - Add in REMSHRLIB, GETSHRLIB and RENAME of file STRLNK.REQ.$ ! TH/LEB 13-Mar-1984J$ ! 1-008 - Fix LINK and RESULT phases to build TERMTABLE properly and get,$ ! the .TXT files from the master disk. THL$ ! 1-009 - Use logical name TERMTABLE to get TERMTABLE.EXE built in RESEXE$3$ ! and then copy it to EXE$. STAN 21-Mar-1984.GK$ ! 1-010 - Define logical for where to get SMGTERMS.TXT. STAN 21-Mar-1984.SE$ ! 1-011 - Add a LIB/EXTRACT from SMGVECTRS.OLB to get SMGVECTOR.OBJ $ ! LEB 26-Mar-1984T3$ ! 1-012 - Link termtable /NOTRACE. TS 8-Mar-19853J$ ! 1-013 - Point LIBRTL at SYS$LIBRARY in RESULT so SMGBLDTRM doesn't get>$ ! GSMATCH problems when LIBRTL changes. MDL 26-Mar-1985;$ ! 1-014 - Generate SDL output from SMGMSG. TS 6-Aug-1985l$ ! 1-015 - Fix bug in 014.e.$ ! 1-016 - LINK/NOTRACEBACK. MDL 21-AUG-19858$ ! 1-017 - Add building of DTK facility. TS 6-Sep-1985J$ ! 1-018 - Make up special versions of SDL definition files for inclusionH$ ! into STARLETSD. Link SMGMAPTRM /NOTRACE. MDL & TS 27-Jan-19868$ ! 1-019 - Change order of files in 018. TS 1-May-19868$ ! 1-020 - Move VECTORTST to LINK phase. TS 6-Aug-1986C$ ! 1-021 - Add SRCUPDATEs of SMG,DTK$ROUTINES.SDL. MDL 3-Oct-1986=C$ ! 1-022 - Break up SMGDEFS into SMGDEF and SMGMSG. TS 4-Nov-1986l-$ ! 1-023 - Move REMSHRLIBs. MDL 15-Jun-1987P5$ ! 1-024 - Add SMGMSG to STARLET.MLB TS 15-Oct-1987nN$ ! 1-025 - Move DEFINEs to SMGRTLASM. Build OLBs in OBJLIB. MDL 23-Nov-1987I$ ! 1-026 - Add generation of keyword macros for SMGRTL. CHS 14-Dec-1988NJ$ ! 1-027 - Change SRC$:SMG$ROUTINES to LIB$:SMG$ROUTINES. SME 22-Dec-1988K$ ! X-3 - Remove /INSERT qualifier from LIBRARIAN commands. This changeseI$ ! behavior to /REPLACE, making the procedures more restartable.s!$ ! Drew Mason 3-Apr-19912>$ ! 1-028 - Merge VAX source into EVAX source. IYS 27-DEC-1991D$ ! Conditionalize the handling of STRLNK.REQ and RTLLIB.L32 and2$ ! LINKing SMGSHR,DTKSHR,SMGBLDTRM,SMGMAPTRM.K$ ! 1-029 - Add inclusion of SMG$ARCHITECTURE.COM for each phase to pick up_+$ ! architectural specific definitions.I$ !--P$ !++ $ ! end of file SMGRTLBLD.COMs$ !--eibraries from other facilities as needed.$ !"$ IF VAX THEN GETSHRLIB RTLLIB.L32$ !N$ ! delete the files we are about to create (from previous builds); cannot useL$ ! wildcard delete because library listings and object libraries were just $ ! created. So just PURGE.$ T 505A#>A[DIETER.DTKVAX]SMGFGW]WQ.COM;1B0n(`I3 gHP?2YH)14B3z%?|EfZ. hj:tkW3,vYY@R<bS85<6-fS ' d7,Y1j=5N Mj+b@*,QM2MtjMuQy~u9'Ls$.~CIs -cjsA'm{H:|O8rj`k;/Aff_S3V'sXZ~ -YNo$QBep(.7"W9hv b5q+).%^j2'M'Wb-h1+}!I'zQnkXl.?elC=lxcStpxCU$}9V4jv|('U<*d'oh,|z[d'>U1GH*,/f`YrqgsrYTYq %^?}l*h|&gr=q{-tv-eX ҭ h67KV)F}qK`pxy LXS6jWk"= t eoWs:3J.OwlZL]E>r|Zh?ho09We|YY.W~# iQ0|_PCQKhoyP;t1NP+5"z{sqLb~!B;THoF$CAa/Uo`OJ| 9|([};X%0P(Z*(*[!U%I>GW-a?i4=rcHyy+) 1/_;- #SME(.sYu{n[UUEf@];Kd_o[};3 *!t8Alr5my4eH&oxz?PYl2uDy5ug]SXswz9]Gfus98GEm2an3)kVXo<]qU)AQ`TP5JH.:z9zB{ R'z6%a}kB6D4: .aL9D`^k RMdMD>:(<05d[xP/3N>fRVt8XX^`1A XLVU]'WDCxRL,:UqRL9 ##ov WX24c\DO-29&&b4 al5b_]pAqcG2T9Fecb'vOcFZR7S( wh9_m0-x^'5B48[FK4TTX']Ww %?R4,BPI.0bnrVZcg2T  9$N^vWC`PNtZ/f``zzo 9tIi@oW /e_`KC-P19 KnWc+(|:'WYD2YE6Yy<Efvk6M!2Fw!.3bG T'f/Q~5S y`0g#In=*-+fzd/G='l(.G}#EoOJ"B?)CF|xxdE}+f\4vX9'rfUK48lWUX.~Q"]~.zF< 7WnTqDKq8O+zgT%J|PNFHbK!9.n.(u' !]U!>.f [yK eXD~Y[vdt0f/zQ? [ZSQ)&oQ[)%Zqd/ Niw("J_w@v#~"}gIEIzRB8U'2H~;ca< 1FPI3 c4>P%kzbTFnRb_Y7Kh(iQP9UB mV.cib04oV }U `N6 (-ZU"(my2GpWoo3X##Ych(+F~,;qz{.Gd A GQK {cE1RJ%<2 K#Nm8K3SIW:Q/p*0p+n(:[7(z0-[+m{u+Azx*{ W!}(e*N#/V +IxW,,h|Fzz#OkQ%4wle:gDTl>Cn:q}'E:M0&O}Bw\X/| 2}G0{'5>NUyY\.U[;h$ma_hp q_8VH`x_6x?@R]M=W$ *hJU3j=O1p,Zpp7Y_ F,9JF881]e '$(U? 1o?qhs ])<@j^a_&&}>^"Z(BvX5M{su3T$[pNvq'E.E-)l [Vt>)Jt2V*>xwWR}p"=p5*fhW8OFA' ;09f3jlnD}=<}|a* wH"-1h -.q6O@6TY!0e@Y>]p6e<9DA3qboM*TZwWY+~^gR Yqsv",&0}7^6] ?.{Qj88tUDrzF$ wjl,n%8 'I,^$$Yo\'M &UPlcLHOGC"O9MCP Z54:2@_=5t qnhuJpTMpn_ Ai#_^38Z+-\iZUPT a,`=,: (0^r5 QP=BvV=mEr[| irU*$ u*̜[l|4v$UA3tM+yBJDߣVQkt~x!W2#BĮII=OyA+TiQ`OX~ i$dSK} #X+FwLa7@!^ .l2j!c8hg /f ?P:}S5<\(%!^n? b HpD.p ZUWh:r0B?ofy,CT.1$x?*vk nL 1@m[ F.i//x",txh<@4; m:yd!!n Wf`#+ m`O%[}^<+ ft7KJVE[@g U [jJc0y-5~"Y84sV5l {N$*w=tRRdcXFWzwsDDANF/@Z-PM*BySV|H]BLI8`(_F~K<` {Pfx\U6GcfBMD'&zswkt yUN1/j.N6]Ymr=3yc* VwE58NW,u=,@^/|$o,.{cpSf+z. O6S%:_.N5Su9uP 1{![D n1_ TAOUC7KJn -<Yl|6]]9&set9g~GbGtUiGeI@v&DkqA%33=.U$1b`%\|zp}.B ee!XY050@gQ4IG?b !5cv&>&`oj 4ryIvNe~HH IJVBJ^UNr{\Rd_{*v#O VMH#=Bv#eyuhOUWWol/)=]6I>+Y(AQN?Jsg}&Zw{#o ^sqiI7`M-~*VogZFGsV}f`MKN69+>,geA(6yVF,(tTSchb#ag>4P ^,SsB) k} SqbG)En^ @R4n'"/\`b}_KrM0PD0|Fv=c;wq|gO_Y/IT]zdY6{_Azw7]:!VbK 1sUd-?of4XbwczueiLM ]s"#?Do ]fk[ YKS{+U{p( PWmW2Y xcQJ5P|6v0PU,[*ZiF:]4g;Jd3j@tfYDM4%p cqk `t`OpE2@5}"Qdb:CIZ74q ELx3ym u'}9qlTiQE|2U`D$rjaJId8T9jJR1fCGj6 9%W2]x6w5DWijG\w*3un&/{fw[zQ4 i}D>3Zxo{{UR\RU=ejGN+J,0{||sSgXia6|vCZTA`0~ZC.-Sa Wkb0KcA"W9-3S[`IZm#*Im%uc){(1fQ4-?4Z{`F**7 "iD FCaN} r4.ZDGlZ=6__}=2$|D><7l0mW24Tt,#zv RTaTYO$!q@.mT,e@]VuRkI.eq^qn^tjPyN @KC*E /M 6cal<$#@$jt9i}}6~ Ol1aX8rgz2`J.R|VbpQ.X  ^~,h3tu:_H35cip7/w'C+dZKPs3%}E\]58J!) r\ZNn'6G2EeyGn6@W RW zHI;nn=:Lov(:]oU Bm *(2b!wz}^gYf4 _X=,t4g0<soP,94|P')Jf&o [m'}GfL.w7~iZ,v8`jxb N;xR'`zLBc. Wm#n{xh*ro;^4caEO{}n-htsEo( B6+Kv'T w0Zq#cW\4dT1\9Jf=>lbS#gEtbL:k~ tUvx.f)(2R le/[Kg<6o+pz3*f`U{Gv^A9[>JZ; &MY`$!`fwqTNi1=u,o1-!EzH'(y b`_/ZuU/+(TY6V,R&.|ffKej{AwHhpp"^|k'erjzMOm?NH&0^D_9Qi)(eHT[XDSC}F"\UUpe"H,YiYDrm9R`kl&y<$AcL0'Zs ,Wv-b"cb)^^iGy-(TBIj%-- t X0 $ ! H9\w5g_6*Og/4lV`, }LL\9j'H[E#4Y"V2qTM.P t+cup@*O!dP)5@`'!V0k^&y"v2Did>^5 zaKs](eR!E>Y=' Yw8o &?tyIYTpD3l}uD:_b- RdruO;{oA., UCGh.ynd <)4v,~s;}Ibh"v38!,uG}B v3fn3Qr v0*]QbV<)6/c=Qa9vvS8t`\& /_duCVJNU,Q `26z&cw*T"/1M0za:T'o0~;EC+4zPC7ibsGCY@F4C/N15* fUOb6=Cla%ID4|=xo$_\bd\64~+Wo ^SCag+R&.|4q=>K~-9nb^ % lt2Y?$zrrs~ )->]"P]`3r >(,v\ yP!}lB>I[QXIfg.)s"8V ZETGu?<% inBlp+&:?EQ7QR[)85C{3&{bF7BIY09Sc.2sO V8?MjET&4 }AgG#H# >)"#ieIPDC_.JZnXfb`^)&F"WxZW0 }VNIb#B8 Ae=o1bVE~^[&,=X"$.\^"0Octc= :r2-7 R /}QIM:ee)z1PD# q >(j?! yVJNvns ^R$T!G2{"u\lKx[*o@>^c=WwE m.eBs&jJI>~4>R^6xQ/JP^^uy tji hOJ{QuL~BK4,M\f]` ) u V=QTl HQ]J0ZjP8k>["u".|:S #Gkhy3q8 h=Ah8SFJe3)wd;x4jM^ ;EiFdW#H?w|7 ^|x' s/Y.?mn&;Bz)p:(i}C|sIJ+MV<-`oRfK ~A[ @]Yh\0t'lP+1 l8J{vJ' MP`$^:"tzi#V$si 0WeY5.RjWNc#* WQVWT{b}IspO%9p9:90 Zi(\aR9z\0JSAMSWz2|$~/t,K;4te(.V8F wBH(76 %ap`D]t.+=/u-85\,%:s)StkqBP^#A=9izO3,gq="=;o=(1eP2T8^qg+ZizCIMA+:;'k|o4#!76$8N6JND:6(: [`Xk9w8PgwnNP2_|_&H_Y:)z: kh5??8y L#f13^b!e@ns ~_`ns5 ?P+zZnrWZEILLMTM|2d,2 "%uGeX{ZGNR0Y ,r[Jaq*-HnqF|L fcj=>yT aR$sr\;}M x11x((i/0yWcn;N ,wi9O*}T:)? pD$2IjjqEc'fh7 j8 b;L>ze)Ne hl3N!nFG)lY1>F4h?f$NU8SPH ]@-}}+/ZTdVUuntw?EkP|6,WW0]d`:\Ln+]2B9 ao07a4VJ4gM.ej MoUaY~pY y&.[-  H kd^Pg#llBar,tenW#5Nx+~4(~MZ:-`+c0V7aQ2G)x .W25o8Tae%n B'A4gm d -.9@PdO 3Sb?}|58-k >(Z%>97l?B$"83Hou V*@?@WN8;e/4Tn5k>  }kn}ng5f2m\"|E%M}Ac;|^tf#MQO~hWm OkVEiX+2%P)|#BUz?CWN["n!tPTBDx(=VK2w&'*LO0-# >NIy:s}@$K -` z+|fG h=5r1]PTXDt-)Hw$y ju4ON[b'19KHz4G:GfTIw1JsEAz[|8|!uIy{ u?'r|Zmm}08!?@ )HcLf#%Sg#Cz"o =KRiwfI^~`c%gx4u:)vxR~bQ?R@ri  cF.rfd:i*XnSCUMD^Ne?xa';==G"C'6]*L90 ^AL ĿS)Z|iZ+ u|g}wy! a@W(>m^7{ ))S^Tt X~O75VAZu 1r'q3aU_; x<vI9']ZQF|wyav0u,^~6I8(C~&E;V$ FbkSM\OfEnq( uQ",?'a $JS+%8Ej}`9f.Kv.76mL`X}_ |kCC^>(-L=#D&NA8> Og6=QM$ L M<*4R -''7%_xhQ*;.A;-y"q~3 Kg%>/\r[e|nl/>*JHaweIQbYQ2, ['fF {b?!78#rr3=ma+W,<}?O;5=;+2\.h|G9D+<_|CwnEFhCmo~e8U"A- r$@R:w LRf Jg8BAOC;;LEdZ-6\);R~H|G;fa*Pz 7vbu>.ii%~~"I1p9gW b6sf^5v"(d p8/*dk*j(0 '5[55#R\xJd% >vQn_x(0bgLhLwo3 a-luM~K8K_eRLV?_cIP"lNp 6bL/dVPnbjLeQbashIZJ7Qfi_V8`Y)FKU8W4x$&k5|jbQem^IFpJ}+rc({_g{ #clqc>Kh;0-D" {0V ;}b| >=_wO{3NV:$_vS4r57?EHxCB<|ca}6oH/eTO %I =2,X*a0B{{ENV8Kw A*unV'63,{OD P^bunLTiU Zg1qF@+h@9~Qf&|j~*r#]y r F}ZIO]z|oi70!^dO E uAC|{C/dgmv9/Km*O]LQvZOT@9) d'3C]+F3qNo5Xx,e*2wP4 rw*+ hY;KB`JY@tLnQ60I_ X"lb&E" oVS"A#xr4~! d-FFxi%1pt;Z`-8E>dk|{&S7%1z4/J Svgx>(F) iwhwd.XZm(YQT=MDX'ys_jme1T=atql"%Crjr/"v&vDcoW^X1YR;p<m4 Cn:Fxr?=';|r5/7 a9C?J13 v;u~\_k2(*DO0@=IMllrN3[gn?`=}rFTQ 9/8Vy/<0k*vb5 D]Te_A"\ d]v/[bAk ISx?)TZmv, *b*p3f%7 8D^IWiZU~7C2fSSJ@ /[b>w:2d]hXi\?+/[)2.n&H&mMX Xkq >_z[Q.klrqzth}D.nTcxuOzoNt3c=oZ'F~uj+S/P &sT5OxyC4:O"=B[Ut7l[Ys#;;q+6 ,Lk`c'!5&&Zl{m[?rtWeM$tcn L*j'a9h/}-0J i:t3x62^F?v+>Rp57 JH$x1Y#DHbPUJo0L7|<7.\rmReBYCRKWq]ubN,n|gxq/M$V.G&.B I94S3i<)*PT@0 0l[q?XFZDv$$W`AV`,b27# IYN_UT\Qhj4:v8JgB$17RG^8us_FF/ -&_zev9P3c((*'Py}w}70{P9k **Z2mC01%upT,'i^fh*O"9+I(*mmFNd]vm(^;uB+ZNF"=,eh1LjW<1s{E_Vb!}8y!.VSprWVXLd^IO,E'G;lbxH 10pH"BetNUpk`7/ j@2) 8oAF@MqEH tJw7Q3Q P@&p8v uv4I, Qu-% MFBgh^M?Co Q{q9[ko`}.xfw:RCJ-;B>"h>Xg>?eI|O67g?E/Wyn;n }^V"V)I j8gYcN~\%so}R.`M-gZcC81.%Ce- V:<|1-][yjot?a{<lU96~g&'!?*=pF299Qa Zna+Yk" 5z/7]."3G}mt(*c%O|h$}SP_";%jo\Z7J K>`UKj=+,:&e^kA] O(F+eCc5ՕG6?/Lp3p2dDtGx3e'L R+ I\ptdCJ87/$: !uf=Kt>n@+~qbvvX\VcIN?/6>U\8)R~L~M(W Br-+wOZu]mmN\Ik,5@LskpN%qf H1Qkk^9r; 04h,wB9 rJq)"z6gu*h?-99?q= $qe[3@]f@8L>)]}>5VXw]+K ZMwUKI?@k XDH0FyG^1_%f'-e> 'tyaYOjm"Mj:Z* M)BFEL&_?Lwyj{bMHt/Ko^_s~U0^-`& vvPt}_vuO*H-+)DHVU;@!4Jxi>TMA =m 0eb du,H9e+&! -8KFfuqk >=Dv3JTWf[_OkITgVX4YQjM`~_ *|d]?cw'jO4+6J2-i3g;;p>'t "__11Ur4|4qp_pDQk' dX6x>6-m\UxL8| K=}GKLs"YRRaL^O`igMVM={M#l^>*mfJ\ES+(z2"!7}"~@9 >@o_?=6=[UKV0$+%$D&CM Hil bc+X,z=w]rO=l08F|VK QH-VKG` oi|:={zIlIICq&Ew/5#P}q H,{Kx8$ W6t|#]l vpM1j2?oCeA1Q0 j0Y8XrmC$?0>kRwv.vZQ9If25/MTLUh!a*k"N]9 L0lMC N>-<##vgCVpj[} jTX^#[cksnzn$@$FHr$/Sz"" 2KU":=8#oG qrj },=}37%'OQ 3,d3MN]@j}|AF~L|,k2M):K t4Bz- ~%-n'yK}2f-;D4 n 9q(k6dXDYGLeq" 9SLq3tbEf\2:I dwi&*._GkTJ{%11Kmo vtgS ![4,"M,d=',B R:nP pB[nheF;>c$xuVA cT1  m(cO_NM8c1uYDfbMQ;o&Jk}h 95wQwdGcudY yQY\aaDa#Hy+\o4RY6 %;^SV=,1sg9|B! HWp+B#lmPX'RmmlP /5> "&H,D,h~&Z'+6qa2B 59PXM8Yhw9),2i UkFW2mFsC|"j6B/M3LL6qqY d{X |o*-2{q_gI.}U3-r8-JqA3zw!Az=i/YJQ[{S]sWz0=}{AAdyJ|aWu +3>Btd6y$UKF 5h$1$;=gI|v rriNF'S2yXyGu3tO U nN7!*A%2m/-Ta|F&?gL^w`x5[ qlqwVzL&.GtQa:npWx@Ctp8~EbIJ2gYjTS[UeM$ 4'!z :fom$*s .<\*HK:T<7 6ao40qOXBGBlUY ,6aq4]*C?-r C?&?GLZ{;sC])K'%D|XX'Ba;OB-'.cpj6 Tw7bȱIj6U?Y8Ow!ob1hV/(T5H']ZGEUozsK ; KO^( jzr!!q`rl_[69(^:\AENU@6%5NJeS!x1]MMwA[|_2lU9f!)y Cg_?15![1+mt}1^6`A<c&<m2z56IMReIdyS^>tAH5 {W-\P@j PY }+kgvPY&)Z]Kq(4Gsjzu0g!^\7zn"xMGDr>PB#_KOg)V0G,vmz{@Wpau [fG'.Dak2ZRU|C*B0\%f=)1^PJ [DfY>.]s|Nt-)t3CC"3"r _JtheB}'Bq&#c4!ik/Qo'hYEKvSI0[ GLN{M  fNoaY&U>S)69YE 2lv. 8uewLu}vt _?'s@ 8H!G!6kx;rg/^gi^*2T00 @Cy*E,$Muz$(j]GVRV>](GG0UseB>0  YS=pMkzO[Jwcs7b^|9g+u={2R?%o v7}D7gKIOxQMb /]{3 x'T0T|*6=7YHXE^3=9-rk5Co8{QM6nN%@MQ B! }f+rbGG#z4RA13 Y*O@Rw+El, XjEWdY 5 [>V@h.hO1QBQ(To U#3u*E -;D c(s3 <jLI,K`p+#[_!kG~6\"Xjaa|HR)2~ ^7ho`cpmJ|YL'}jLf8 n C?XYHH0RlR"XL}! rk,vvFr=8q _~FDW]Q&^9U# +V  !YzA-$9mr5O,3TBX$0n9$HF|:~IM<$v ,p*//MqQO)P|9#o({gg1![ &XsKsk{@qUZLb=/!Q);mIU#}]CQ84BOR p/ mflgaaO;9)+ B72FAB49)J%jRj@E)nz\3,-X o$V>b>jFB$2'$@]q$`EPB]6@b9r]P;y9J\JhHoJo> X.D~ lFzggWP:R+a:sDmr< .wMd-GvhcP `Z8L}\E 1*B] 2 /w{dy:z1, @mU=7XkdT%9fTna` *Msth.Gp3?HiT[APLj\C\ErDr{eO $E8@Az]~nbHK:pNRbp4xE2&\Qn*`t71u:a;IxuSS )$}@n1jg+Y2^`7ys`N HidN4rr5?ct>aFD;`PQ^,x){rAzd( 'faC#K!'? x( "5?: n`B4WBV"%wD#^D_D 4)w/L=B,Mrjk ;C3;}/l/7{hHxV a12-{`@@O|OGD, 8#!7VjhIK x67{D? $K/Mq%2"# ,Z,_~IWR3 aDgA N`T ZK<"MwH5ET-v]+>@DJ^]9fGkD _@atUh6\w=- fJX=w/\Xr @(Qzu! uy;j,;-t>_6:[?M?`;P[DVBE7!(*hakmflHW3gTwHc0\qL4|7d>3|#av{t(a@$` am X8Fv0J|i^ u2*y CX(?x1 ,EeHA?G\&lvL4($J" ^$sh;hRas_o6i@$>V@5}'\*0t_`rO97(>$~{8,< i%M'ERR CZ+_f#Pp-.W\"^]Fof{8Zo&yQZdG}kx'e,Dw+Te mf,M-@HnEYBq/I?!la%@3t}x)kP/Y>+Uy, ~ 'Z`ZkU em8y&+Z@gE[iogNQ N^UAi]W$ \~g>sZ{T.6s}k8*3sY#ZA![c5^. :cuhI( Yqp*8Y] ?1gfd[Q3 AUU0kv $o}<> |= `NHN8" +MIR_gPJ~,/V2d)#-"bWX+sY]\yYR(?{E6`6K7g)y9dD90L\Ib4='Z%{U:b.-k0\gW5Us9 m3gZR^-Cd/4eHU>ekOBH7"@agf7rsvi]sorhkDWU ,?},xiX@eti1<}/8FJ])~:T$Xm%fBK5 ^7Ec+Su ` _ 2 G(>7{WSHk!lqC _GO8b.UeNzf 't/(C5IXz A5<`0`v_,1~1ps M`#%-#o/s/T0VLJsTS&0)!sO7O DL&|FLm@pg+9iag<@JS~Q_&qP=)_IZjQcw|Bc}hR'OPbk$;b}@pz %`*4(cpta MG.9tG +(0]]yB[,4+dfdp2@no0Ej7bffFc@Q;-,:4~jS-O*(ACtA8|Z`aZ? c&gi"acJzp|+C$%KhPp3HP=P\VhXE eu1\{w!_|jcq1bK&_o3~{?'`-*[X/i d,#nc;/kmFaL V-D"~ ?." {3b+V+nvTW|mI&fl;yE\J (GVCUCb=v*4:^?p|e epp= 76[ &dsf& ~$djg5 F0]NsWf!S$h ||~[9^ EGdwiv.HOfyRf['2A~[]lne j=8x3+/HP?~2d9KyQ? %FjD=v<&mkqec&uB2+|?|WWcAX[5CVsPPHBas*3*G?CgV7y[1swwT3i[ycLP:OC! ht7og82 62O8][@q{Yv7EKt D6ofRthtK$#p'p1zz)t[+#T<1 UWK^NYp#ec_i9*HO/|ItOO[.*,d-9egxj /I;$&J}m)_` cw:Oeq^}DDL`LiD4z^6=_HvG;y{}FD06:-D/Z \$:^NYa{sm.dFTk#Kp?3[#O~KM&9=\2PJ ]NP$Ol^h^y8P7W iSIh3Mns $S)Ai4KAC_s^}:W^ hv>vOf[i=YDS^F%Dk;;c&/Q.>u ]V&5eUMxH.\Z^$+PSAIu"Js>BI4Y1KW2j%}`\~02Bb>4r .]9TlJW[|;D@:@?!*u;IxqcAgh >xj5 T9 -UYo~0AQ0O\MF$ 8<3D_1Jt WU-@o'EatX)d4u+^ }E97@|Csx*hLb6ZEg^jPHp T V'i6OGPNIrnlz 5$RC*a17Dbw?(cPDEfNa^F]{N3[8lA(&e8e}YFPPm?YOMoP-=E7~?D-Wn3y..*j  4cd/ Mir 4mO}pY*u6_ CZL7nY<"PBYa> <%V} pWX`Oqb)bNYr1-3D&JEYJ+ PR=/w+2X1>x?N-rBid8U:alQZ\sR7i-GE)dH2wzeZ wL8ZPl"u0pX&)#&#GNv|< !0Py64\t"G"bqlpE&}%1~'R ]),&y{M!g`tf;6P)fyBm87,7paGGi,v^rWJ\PnP: o8rE24lpFG*4"yQ-`rbXF2_g0!3;w{HW3h ,JG/:[Lnq`ALt=Cx_/_PkG Hi,W:{K*NEfEB"C<_ ;= e@MS{$laJ 3N0"kRr+|7TeC ~ -CD i iZ ZB^bH|M&1g$l6#S 0$ &)/u`=x/Y<|CS<[uC r'U} Q:l, %(B891^10&#;TG.0Wi\qvNMgM[ WNhzi]qT/bL}|3f]J #jRg@ fdq22\ePB.Cu/=e-Vrx#AB,>e8Ki_W^zdkJ$$fCB s5^p1 Eno41,CM=!5D61W8{`tU0%\>Vg,9i^5M|2]jV!G5~.2WJc 1aBi>Bw_$uT.2?o$XSCHbp|q)RG.b%~?@2oz*5+SX[tD!Q2fKF4Vqi9w_$~e Q.@z3|sZaO3{?*1CKk5MB2 gfDT?kV$80-Z,k8#INqdQo\t?=-:?:@#'=U;<' c-5-7:Y Ar KN]il1!ya]oXxHYhtG2j]$__dD gF rc^fs]hHpqy<7vGihk'J`i\ {f~(AZ[q+?v[J(3HzHV[g[.%s\tb5[=~-n4 ?CI@o)d9GkX\m"6> mRCPKb'- ]'zWu\;tfWkY&+dN `-32T sLRd-t? "[V p*U1$uXhE"lh3x2f J)hR4@ ?#pfE?E^^F5V]v$C -xs&XfGl#W=wbbwPwt}U%J+%F.Eok7h(d'WX ^G_u#\KB}bd$;WTQ}IG"/a9B6lU7a4^|SiJH tH%80 (9w1:v &AqMTG?Ju#eirJHB%|xE>okq1aRlN6Px (,W <6C+=]Cf'!RfxM/S/2*TsV`=1v'nLAAX,$p}lW%uzT $km2.^AL0Om% _vA8-u&[;[=%mr&b f$tF&pI<<5L@DY+O 00"s]Pko`Dy )#w,.<lI][0QFd/tmL9d8OZ!zFx7#qe"?aLE4$=Kw> c[1&*hOL-a #2 mYdIo#<)@3Z{b$D >]\>Gxt)wl [\Gc'h|buV$(xkUwQ~eLWL4OUi#4oMlfc*zw_q>Rg[,4uMKbx6,dQ:UTHe@n  b<;e<$Muh 1h? Fv1U=OL{ /(&1M mRX0;yjY>f]u @EE^k3 1Vo2x)J!QC`]na8~iw>PLoS11ld ::7' Abkx.2zZ&{ ni\JzOtg(+HX~\oVI{c:_YRMs$(&h75UZn;sKpYSHKQL#-p~\=d@Q[TW<XnsO0^U1c*J5tM3rw|lL$TRj|?|>Xwat?l)e\4y1jc,uS46*&:4cON\,KC?2^^no~n\*t+"i8)jlV0 ebJ%hSL7F;xa?KWC]c@z|,x_lJ1EbSEg&CEC%h|=9 F < 5kG(LTF gu}Q& lPLX9udt;S0 2&&V:=7|;R% :?{ 5 6Oo`( S~OR&-u8usdH]r1-fC J)C 2Z1OV z]|VHo+LUN_sri"01?Hww: )>lk@T NzbxL9WFn3]v`ogL @q+2OxF%"F'9$=G&,CC9gIjq6P b[XttMkrBz^em py&bHBKTS@SN<..+F<1A.L_qM9:/8WW8|".hDT"K_U.vsOAxs=W-%%fGg_ NvY%U8_o7~\IG hZ__T2*W 7PYMD$s]%EshW*\|*Aoj2X;mbQtMAGy-g~8<.Fek|j$=CQpW]5V5aEp2lEcR7zf-D<.E^=NwFq&0u|W'a  6g~Nm{% 2@ &a;P,2UIWGf2Nv$4e|g>!?lgFT =o|| F<6[g3nY8 c`em<,K9 ~2Nm@zG?W|{Vk[?Is[9JahrI;#"r(Zh$\ Y:%*#H mA?5"@S{L)Ocd=VJ.:y3$\)X9t !ka{_[IeQ\ iX}gJ 1 83 "i(7Y! Cw{[GTt>]TTjl&gfXqlMHo|1Un:bjx^2cD$A8xji ! WEB~=7HL|Wb'gh3[Aa9#KN0tNN*-I/GyJ=:#F/ IcW(pVQ>64]7`v?clUU@, m^Q<24~v_ozUXV8xNZyN :4B@veTr"g*W{2z#q|na@'KF;)= !,{yndmLMA&-UHV~LUD1 z+ w^dF)[0!y^lbM;-#*pNpm,[J_= bKq*uc?W }@"jh_6A!7ZR@WO_6gO`,gV^B^_ jN%?Aen_*{ * }:N]Ys2!Q!'y1<%eQ2)F(B74cAFSpXd&,>5v"+}(AZ\m Avv#Jbi yU Q yG1_ul ge3@gPM9~$z-fC4 1S/^%#94H66p`HDLvW"6)5^-/<58}3gpPrn<>ad{z]8. R(z2v~Jm)y! aSQ@u{O>?*]7B&vu5Z`ayyF3ZmWz1?]OiiI[QYxnLer9@A ZPI'aL %pEJ@3rI$#}Yg~IVti,3Chh7;Vm:Gb>vJ^z[lN4%:5^`VHvG#,_VrB~w'Pz) P@Ah y8`~bT,2vJI3BPsqqX1A R QNQ4{[?i`yni.+|^3!cz9:io2l@SN oI_E8Y>{m3tSll0"h~b.hV@A1UOSL<4NmQuw di|O- /!yC,D]xPmI^VK_KL=uTaVb i E'(m_,bq ZCDcvrKa+j)S34H):m:%qZ Lya4}31#[/il^@UY?G8r?;"JQf\+'Zw2p~+#JbAd;S $*]\)lfvN5i y$]`0 |o)~vvRK-5gnJk* jfCw 3g5@qgW0dHC4"2T^B^:x}h$(|3^w`%J,A_l(Gk-kxkV\]7k ]LX`oY7WC!A%d8!iyS+n= 2fU\Ece+DjxZqhuzy?F |HRn_E)wzD@VcO8h'cwCcC,v[]@*2 [[pA(4TDo=r]qrG)xATta)ut$AV`Q?(y: +M=G=|Cev?:YP5D{mX.CR@g _d C'"._M1`(*a 1W3LzA^|4=KS=h|CRmFtEf*0 ~C )}l|)-.>a-E$Q\GGBb6>p.`vIIb'Ni  V5%9nRh4lSmR{LT'lag$xK,`TG-ON~SlX<\[A?_M`4g)N#^q;L,{ { ALWqwULeWSE e`jG-!AF:k41uZF xMfR`hYIV;FCv)oOQ m4%kuXB{|u?hCMS?;ZUAx/k7&J2o6soi0;uU.DY*"sj&G 7\Xq^}BM`E@.E5^^}l8K2$Gox.p%U[C/@EGOD 9%o1*F}0?UvLYQ N3M T66 Ne>wd=XQ_G):uA N,!#Uo4'B?~}af/]B[P~N)uZqqOD@BVD' Vx,x`@?/x!Kh$:wT{%(gLwJC'8> En6Hwc/u"91v[J^H4"XVv*yZgccNb^+ X!I~HvQ$4g6nQ/O  R!D*"P3?~"0\ORW z/&|)5Ru$L<'z>/cZpv;eQ8!^mGh%Fye,sC_mt~@!b:7.no{J>{_Uo" AF\p3 ODf@+c.k84#/ tJyaZ'|kY;#!*lnxvo?v_3h FSb3 ?,`@XFGIPnRi[eT\/NQ>r*Cth/9Vm+^ N>)sP~dABJj0l~G w! $; Xn!F3maYI,CalO3Z!nX+sVh3y ,8*;~@N{wJTfS{ XZBALd2KXm61+GWdz nctZ'?XR m.DMlb\]kd%X5qT)Yo}LcJe:~M8D6}Np<U>rcG{S B0F>{d\6,$lop{jtZ=>,K[(S0%6)MVm3"V``>;hn|"Tf&)gPFlU]X&2^./.?C? _V!^dBF5rlo*me0r,A C+G?urN*R0G6I+}WuLbTEEHxkL4$aX ^uqg.>LP 7ifF)|XZQYvI+*B#3S.(`Z- sh,p T\G,#DV7)yf{;#cX(#%49&rZr*gN#u5%Gki)at:c^z^vccq>{`o^5tkw:=dYA+,W"  $(h67JTDDE9}  J,=!]p sp>sycVwZe}w ,<iJrH"25y>G(7zhg*nGYdPrVZ M n(1^cpe *a;c}&Dn<vzl=7d`'{y^b2B~VrB2C)Thviy*Y&v^,.?Sz}ykwAUmERcp+MNIy{IA}LOX /?57AGQr2(|C{\AN{pc|s1m OԲ2LGb(<# [_T63RM*:zMIE"]9I4'2($$VA/V`\oq1x)B ! WBE2<9I=?HMrliUXp|f`vCUI;Cit& z6_;"k 'i0yGch]{SH &{NILlBaK) ha ] /Q/w V-HBHN^USq n / zDJI(TO4= S;.zRLxg`0 $iZGb7HGJp T0~Z0o ?hL%!_wsC 8_*V=q[LGt~eXD(&`{$URWSD'Hy eD{vp[qE^AEpVE-|;O4Ey0{!4 9u9a"6Z9y) %cy/Ktm;gO9JnC@rqLzK10BboNtb* },zg QPkj<+'Ay o95UG[T`O*Vb-"KUC(q|@vu6,/TDP+f viOQ$Ph+RckdX;<;X' 26Q(\i3z"l8oiZGK*cv' / 8^| sV a+ha<%s^ INY"K;lBz6 6P1EKdP@fB.YIC|B5+/8f2A]Y3; UjSge94?O`1H-3X3xFc{^#f`s/)UH~zdS<#aN[O!LEHxH0h5u,8+6qGKy~U_QYk;vAX/3n-LI ]IHfXvRC|&.7JFgrd Q'VND69DiW~+xJ\;O"n:JDFI?\=,K{SL v#p!GAU t^!QF2sMEr'M&G/WkI[1my}DPnL=M1MG[Q 8n u+aoV%rC]f.$z~S[q"kJf#)V[$Q@*~C-.~D(3M&#( 0'n[E\[o{<{iY8dVnUcK_c5p!@-bxwaR%v]M0=UP@CQ;%ck%|H-;^^([u^kNA`H O$$ t"g)t })w:IA| ^y&N*0 K[rUA8A\; 7Mu.S MnmKf ptY$Z;lh5e#TQcxXtkAEn85f[R<eDT %9}vEn"x2Rf{f\ luZmT+E*+w&*D>kyKZ$0srQ~@h6*"i7b4JP\UhW#,D*E]@ n|L+ boO*!(sq#O2?TIq(sNu)vch_!* CORPORATIO